From 16ddf5f559d8c52b23c6db7a046c3fda6a1d71f6 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Fri, 1 May 2026 07:57:03 -0400 Subject: [PATCH] fix(session): use finite archived timestamp schema (#25275) --- packages/opencode/src/session/session.ts | 6 +++--- packages/opencode/test/server/httpapi-bridge.test.ts | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/session/session.ts b/packages/opencode/src/session/session.ts index 5593efc971..e1d0c527aa 100644 --- a/packages/opencode/src/session/session.ts +++ b/packages/opencode/src/session/session.ts @@ -142,9 +142,9 @@ const Share = Schema.Struct({ url: Schema.String, }) -// Legacy HTTP accepted any number here, and persisted data may already contain -// negative values. Keep archive timestamps permissive while other clocks stay non-negative. -export const ArchivedTimestamp = Schema.Number +// Legacy HTTP accepted negative values here. Keep archive timestamps permissive +// while excluding non-finite values that cannot round-trip through JSON. +export const ArchivedTimestamp = Schema.Finite const Time = Schema.Struct({ created: NonNegativeInt, diff --git a/packages/opencode/test/server/httpapi-bridge.test.ts b/packages/opencode/test/server/httpapi-bridge.test.ts index 9343326738..a01b7330e2 100644 --- a/packages/opencode/test/server/httpapi-bridge.test.ts +++ b/packages/opencode/test/server/httpapi-bridge.test.ts @@ -258,6 +258,18 @@ describe("HttpApi server", () => { }) }) + test("matches SDK-affecting request schema details", () => { + const effect = effectOpenApi() + const sessionUpdate = effect.paths["/session/{sessionID}"]?.patch?.requestBody + const sessionUpdateSchema = + typeof sessionUpdate === "object" && sessionUpdate && "content" in sessionUpdate + ? sessionUpdate.content?.["application/json"]?.schema + : undefined + const sessionUpdateProperties = sessionUpdateSchema?.properties as Record | undefined + const time = sessionUpdateProperties?.time + expect(time?.properties?.archived).toEqual({ type: "number" }) + }) + test("documents event routes as server-sent events", () => { const effect = effectOpenApi()