fs: /cd and file pickers fail on FreeBSD/ZFS — `stat` throws "dev exceeds the safe integer range" (fixed in @effect/platform-node-shared 4.0.5)
维护者通常 1 天内回复
@argszero 已经在做这个了。
开始于 2026年10月21日。
评估
- 难度
- 2/5
- 预计耗时
- 1-3 小时
- 新手友好度
- 67/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- bun, typescript
- 领域
- backend
调研方向
从 package.json 中的 workspace 依赖目录开始,检查现有的 Effect 包版本固定信息。Issue 将修复方案确定为把 upstream 依赖更新到 4.0.5 或更高版本;检查 workspace lockfile 和依赖更新惯例,然后验证解析出的版本。受影响的 Effect 包解析到包含 BigInt dev 映射修复的版本后,即表示完成。
由索引模型根据 Issue 内容生成。
描述
Description
Summary
OpenCode's Node filesystem layer comes from @effect/platform-node-shared, whose stat calls fs.stat(path, { bigint: true }) and then converts the BigInt dev field to a Number, throwing a RangeError when the value is outside the safe-integer range. FreeBSD reports 64-bit st_dev values for ZFS datasets (e.g. 8599779474788709465), so stat fails for essentially every path on the host. The visible result is that GET /api/fs/list, /api/fs/find, and /api/fs/read return HTTP 500, POST /api/session/{id}/move answers "Directory does not exist" for directories that do exist, and the TUI /cd command is unusable.
Effect already fixed this upstream in @effect/platform-node-shared 4.0.5 (https://github.com/Effect-TS/effect/pull/9112), which keeps dev as a BigInt. OpenCode still pins 4.0.1 in its workspace catalog, in v2.0.32, in v2.1.1, and on dev.
Environment
- opencode version: 2.0.32 (channel: latest)
- OS: FreeBSD 15.1-RELEASE (freebsd x64), ZFS 2.4.2-1-FreeBSD_g6330a45b0 (root dataset
zroot/ROOT/15.1-RELEASE/usr/homeonzroot/usr/home`) - Bun (embedded in the opencode binary): v1.4.2 (744846f84) FreeBSD x64
- Terminal: TERM=xterm-256color, TERM_PROGRAM=tmux, COLORTERM=truecolor
- Shell: /usr/local/bin/bash
- Install/channel: release (
latest) - Active plugins: none found (
opencode plugin list→ "No plugins found"); noopencode.json/opencode.jsonc/cli.jsonpresent - Pinned dependency:
"@effect/platform-node": "4.0.1","@effect/platform-node-shared": "4.0.1","effect": "4.0.1"(workspace catalog inpackage.json)
Reproduction
- Run OpenCode on a FreeBSD host whose working directory is on a ZFS dataset.
- In the TUI, type
/cdand keep typing a path. - Observe:
Could not search directories. Keep typing to try again.The dropdown stays empty, and Enter is swallowed by the autocomplete handler, so the command cannot be submitted. - The same failure occurs server-side when the move is issued directly:
$ opencode api post /api/session/<id>/move --data '{"directory":"/usr/home/asomers/src/github"}'
{"_tag":"InvalidRequestError","message":"Directory does not exist: /usr/home/asomers/src/github"}
- The directory listing endpoints fail with HTTP 500:
$ opencode api get "/api/fs/list?path=/usr/home/asomers&location.directory=/usr/home/asomers"
HTTP 500 Internal Server Error
$ opencode api get "/api/fs/find?query=src&limit=5&location.directory=/usr/home/asomers"
HTTP 500 Internal Server Error
$ opencode api get "/api/fs/read//usr/home/asomers/.profile"
HTTP 500 Internal Server Error
/usr/home/asomers/src/github exists (drwxr-xr-x 28 asomers asomers 29 Aug 7 14:40), so the "Directory does not exist" response is a false negative.
Expected Behavior
GET /api/fs/listreturns the children of the requested directory.POST /api/session/{id}/movemoves the session to the requested directory.- In the TUI,
/cd <path>lists matching directories and changes the session's working directory.
Actual Behavior
The filesystem layer throws before producing a result:
PlatformError: FileSystem.stat: dev exceeds the safe integer range: 8599779474788709465
at Ec (/$bunfs/root/chunk-6xc3bwx4.js:2:980)
at <anonymous> (/$bunfs/root/chunk-79zk6hn4.js:18:6249)
at FileSystem.list (/$bunfs/root/chunk-26fat8ct.js:449:16850)
at ServerProcess.start (/$bunfs/root/chunk-sz35r0mr.js:2:7534)
Root Cause
The throwing code is not in the OpenCode repository and not in the Bun runtime. It comes from @effect/platform-node-shared, in packages/platform/node-shared/src/NodeFileSystem.ts of https://github.com/Effect-TS/effect (tag [email protected]):
// packages/platform/node-shared/src/NodeFileSystem.ts:37
const bigintToNumber = (value: bigint, field: string): number => {
const number = Number(value)
if (!Number.isSafeInteger(number)) {
throw new RangeError(`${field} exceeds the safe integer range: ${value}`)
}
return number
}
// packages/platform/node-shared/src/NodeFileSystem.ts:533
dev: bigintToNumber(stat.dev, "dev"),
rdev: bigintToNumberOption(stat.rdev),
ino: bigintToNumberOption(stat.ino),
mode: bigintToNumber(stat.mode, "mode"),
stat requests { bigint: true } and maps the fields back. dev and mode go through the strict bigintToNumber, which throws; the other fields use bigintToNumberOption, which returns undefined instead of throwing. dev is the field that breaks on FreeBSD/ZFS.
Relevant st_dev values on the affected host:
| Path | Filesystem | st_dev |
|---|---|---|
/usr/home |
zroot/usr/home | 8599779474788709465 (throws) |
/usr/local |
zroot/usr/local | 17163752400735175193 (throws) |
/tmp |
zroot/var/tmp | 10799770302823152918 (throws) |
/dev |
devfs | 1895890688 (works) |
/dev succeeds, which is consistent with the diagnosis: only filesystems whose device ID exceeds 2^53−1 are affected.
Already fixed upstream in Effect
Effect PR https://github.com/Effect-TS/effect/pull/9112 changed the mapping in @effect/platform-node-shared 4.0.5:
dev: toUint64(stat.dev),
rdev: toUint64Option(stat.rdev),
Verified against the standalone packages ([email protected], @effect/[email protected]) on the same host:
import { NodeFileSystem } from "@effect/platform-node"
import { Effect } from "effect"
import { FileSystem } from "effect/FileSystem"
const program = Effect.gen(function* () {
const fs = yield* FileSystem
console.log(yield* fs.stat("/usr/home/asomers"))
})
Effect.runPromise(program.pipe(Effect.provide(NodeFileSystem.layer)))
stat OK: { type: "Directory", ..., dev: 8599779474788709465n, ... }
stat succeeds and dev is returned as an exact BigInt. The same script against @effect/[email protected] throws RangeError: dev exceeds the safe integer range: 8599779474788709465.
Versions are affected as follows:
@effect/platform-node-shared |
dev mapping |
|---|---|
| 4.0.0 – 4.0.4 | bigintToNumber(stat.dev, "dev") (throws) |
| 4.0.5 | toUint64(stat.dev) (fixed) |
Additional Context
- Impact surface on the affected host:
- TUI
/cddirectory autocomplete: broken ("Could not search directories. Keep typing to try again.") - TUI
@file autocomplete: broken ("Could not search files. Keep typing to try again.") POST /api/session/{id}/move: broken with a misleading "Directory does not exist" errorGET /api/fs/readon an existing file: HTTP 500- Session creation in a ZFS directory still works (
POST /api/sessionwithlocation.directory), soopencode <dir>is unaffected - The agent's
read/grep/glob/shelltools still work; they do not use the affected endpoints
- TUI
- Suggested change: bump the workspace catalog to
@effect/platform-node/@effect/platform-node-shared/effect4.0.5or later, which picks up the upstream Effect fix. A dependency bump is sufficient; no OpenCode code change is needed. - Reproduces consistently on every request; it is not intermittent.
- Workaround used on this host: start OpenCode in the target directory (
opencode ~/src) or create a session there via the API (POST /api/sessionwithlocation.directory) instead of using/cd.
Plugins
None
OpenCode version
v2.0.32
Steps to reproduce
No response
Screenshot
No response
Operating System
FreeBSD 15.1 amd64
Terminal
Wezterm
- 主要语言
- TypeScript
- 星标
- 215k
- 派生
- 28.9k
- 平均合并
- 8 小时 11 分钟
- 30 天内合并 PR
- 365
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
anomalyco/opencode 的其他 Issue
-
reproduced
难度 2/5 1-3 小时 新手友好度 67/100
anomalyco/opencode#57711 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 75/100
anomalyco/opencode#57698 · 3 条评论 ·
维护者通常 1 天内回复
-
pending close triaging
难度 2/5 1-3 小时 新手友好度 66/100
anomalyco/opencode#57664 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 74/100
anomalyco/opencode#57579 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 68/100
anomalyco/opencode#57536 · 1 条评论 · 1 个 reaction ·
维护者通常 1 天内回复
查看 anomalyco/opencode 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 83/100
维护者通常 1 天内回复
-
难度 1/5 1-3 小时 新手友好度 72/100
zts212653/clowder-ai#1678 ·
维护者通常 1 天内回复
-
good first issue
难度 2/5 1-3 小时 新手友好度 64/100
Progressive-Victory/the-website#680 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 82/100
维护者通常 1 天内回复
-
bug
难度 2/5 1-3 小时 新手友好度 68/100