authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-04-29 17:09:00-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-04-30 00:09:00+00:00
log02903f2db870a8fba8e7d6eadc48cfccb68754da
tree6e976c4252386ffb798b71a76e6eba666088ccec
parent22b7d8c524b3841cd50c1bb0927cdc472dd7902e
signature Signed by PGP key B5690EEEBB952194

[codex] fix terminal dimension validation (#2411)

Co-authored-by: codex <codex@users.noreply.github.com>

2 files changed, 16 insertions(+), 5 deletions(-)

packages/contracts/src/terminal.test.ts+12-1
...@@ -38,13 +38,24 @@ describe("TerminalOpenInput", () => {...@@ -38,13 +38,24 @@ describe("TerminalOpenInput", () => {
38 ).toBe(true);38 ).toBe(true);
39 });39 });
4040
41 it("accepts ultrawide terminal dimensions from xterm fit", () => {
42 expect(
43 decodes(TerminalOpenInput, {
44 threadId: "thread-1",
45 cwd: "/tmp/project",
46 cols: 423,
47 rows: 40,
48 }),
49 ).toBe(true);
50 });
51
41 it("rejects invalid bounds", () => {52 it("rejects invalid bounds", () => {
42 expect(53 expect(
43 decodes(TerminalOpenInput, {54 decodes(TerminalOpenInput, {
44 threadId: "thread-1",55 threadId: "thread-1",
45 cwd: "/tmp/project",56 cwd: "/tmp/project",
46 cols: 10,57 cols: 10,
47 rows: 2,58 rows: 0,
48 }),59 }),
49 ).toBe(false);60 ).toBe(false);
50 });61 });
packages/contracts/src/terminal.ts+4-4
...@@ -4,11 +4,11 @@ import { TrimmedNonEmptyString } from "./baseSchemas.ts";...@@ -4,11 +4,11 @@ import { TrimmedNonEmptyString } from "./baseSchemas.ts";
4export const DEFAULT_TERMINAL_ID = "default";4export const DEFAULT_TERMINAL_ID = "default";
55
6const TrimmedNonEmptyStringSchema = TrimmedNonEmptyString;6const TrimmedNonEmptyStringSchema = TrimmedNonEmptyString;
7const TerminalColsSchema = Schema.Int.check(Schema.isGreaterThanOrEqualTo(20)).check(7const TerminalColsSchema = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)).check(
8 Schema.isLessThanOrEqualTo(400),8 Schema.isLessThanOrEqualTo(1000),
9);9);
10const TerminalRowsSchema = Schema.Int.check(Schema.isGreaterThanOrEqualTo(5)).check(10const TerminalRowsSchema = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)).check(
11 Schema.isLessThanOrEqualTo(200),11 Schema.isLessThanOrEqualTo(500),
12);12);
13const TerminalIdSchema = TrimmedNonEmptyStringSchema.check(Schema.isMaxLength(128));13const TerminalIdSchema = TrimmedNonEmptyStringSchema.check(Schema.isMaxLength(128));
14const TerminalEnvKeySchema = Schema.String.check(14const TerminalEnvKeySchema = Schema.String.check(