mirror of
https://github.com/anomalyco/opencode.git
synced 2026-05-31 13:31:39 +00:00
fix(opencode): allow pid 0 in Pty.Info for Windows ConPTY (#29828)
This commit is contained in:
parent
031f82adc8
commit
29d17b9055
2 changed files with 38 additions and 1 deletions
|
|
@ -60,7 +60,11 @@ export const Info = Schema.Struct({
|
|||
args: Schema.Array(Schema.String),
|
||||
cwd: Schema.String,
|
||||
status: Schema.Literals(["running", "exited"]),
|
||||
pid: PositiveInt,
|
||||
// Windows ConPTY (@lydell/node-pty >= 1.2.0-beta.12) assigns the child pid
|
||||
// asynchronously, so `proc.pid` is 0 at the synchronous spawn point and only
|
||||
// resolves a tick later. `create` snapshots it immediately, so 0 is a valid
|
||||
// "pid not yet assigned" value here.
|
||||
pid: NonNegativeInt,
|
||||
}).annotate({ identifier: "Pty" })
|
||||
|
||||
export type Info = Types.DeepMutable<Schema.Schema.Type<typeof Info>>
|
||||
|
|
|
|||
33
packages/opencode/test/pty/info-schema.test.ts
Normal file
33
packages/opencode/test/pty/info-schema.test.ts
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
import { describe, expect, test } from "bun:test"
|
||||
import { Schema } from "effect"
|
||||
import { Pty } from "../../src/pty"
|
||||
|
||||
// Windows ConPTY (via @lydell/node-pty >= 1.2.0-beta.12) assigns the child pid
|
||||
// asynchronously: `proc.pid` reads back as 0 at the synchronous spawn point and
|
||||
// only resolves to the real pid a tick later. `Pty.create` snapshots `proc.pid`
|
||||
// while building `Info`, so `Info.pid` legitimately carries 0 right after spawn.
|
||||
// `Pty.Info` must be able to represent that, otherwise every `pty.create` on
|
||||
// Windows fails to encode/decode and the terminal feature is unusable.
|
||||
const sample = (pid: number) => ({
|
||||
id: "pty_01J5Y5H0AH4Q4NXJ6P4C3P5V2K",
|
||||
title: "demo",
|
||||
command: "cmd.exe",
|
||||
args: [],
|
||||
cwd: "C:\\",
|
||||
status: "running",
|
||||
pid,
|
||||
})
|
||||
|
||||
describe("Pty.Info", () => {
|
||||
test("accepts pid 0 (Windows ConPTY assigns the pid asynchronously)", () => {
|
||||
expect(Schema.decodeUnknownSync(Pty.Info)(sample(0)).pid).toBe(0)
|
||||
})
|
||||
|
||||
test("accepts a positive pid", () => {
|
||||
expect(Schema.decodeUnknownSync(Pty.Info)(sample(48012)).pid).toBe(48012)
|
||||
})
|
||||
|
||||
test("rejects a negative pid", () => {
|
||||
expect(() => Schema.decodeUnknownSync(Pty.Info)(sample(-1))).toThrow()
|
||||
})
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue