From 8e97c53278fd77cf325eda8c771d4bcaa032c766 Mon Sep 17 00:00:00 2001 From: KerberosClaw Date: Sat, 21 Mar 2026 16:56:54 +0800 Subject: [PATCH 1/2] fix(wren-ui): normalize Instruction timestamp serialization (#2073) Add nested resolver for Instruction type to convert createdAt/updatedAt to ISO string, matching the pattern used by SqlPair and ApiHistoryResponse. Without this, PostgreSQL returns Date objects that graphql-js serializes via Date.valueOf() into epoch milliseconds strings, which dayjs misparses as historical dates (e.g., 1770-11-08 instead of 2025-12-04). Co-Authored-By: Claude Opus 4.6 (1M context) --- wren-ui/src/apollo/server/resolvers.ts | 3 +++ .../apollo/server/resolvers/instructionResolver.ts | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/wren-ui/src/apollo/server/resolvers.ts b/wren-ui/src/apollo/server/resolvers.ts index 4c4c9af187..39220e0d0b 100644 --- a/wren-ui/src/apollo/server/resolvers.ts +++ b/wren-ui/src/apollo/server/resolvers.ts @@ -196,6 +196,9 @@ const resolvers = { // Add ApiHistoryResponse nested resolvers ApiHistoryResponse: apiHistoryResolver.getApiHistoryNestedResolver(), + + // Add Instruction nested resolvers + Instruction: instructionResolver.getInstructionNestedResolver(), }; export default resolvers; diff --git a/wren-ui/src/apollo/server/resolvers/instructionResolver.ts b/wren-ui/src/apollo/server/resolvers/instructionResolver.ts index 140c2e2f65..5709bd58f1 100644 --- a/wren-ui/src/apollo/server/resolvers/instructionResolver.ts +++ b/wren-ui/src/apollo/server/resolvers/instructionResolver.ts @@ -89,4 +89,17 @@ export class InstructionResolver { await ctx.instructionService.deleteInstruction(id, project.id); return true; } + + public getInstructionNestedResolver = () => ({ + createdAt: (instruction: Instruction) => { + return instruction.createdAt + ? new Date(instruction.createdAt).toISOString() + : null; + }, + updatedAt: (instruction: Instruction) => { + return instruction.updatedAt + ? new Date(instruction.updatedAt).toISOString() + : null; + }, + }); } From dffa4938688e938dad407c0139716ae661a9275a Mon Sep 17 00:00:00 2001 From: KerberosClaw Date: Sat, 21 Mar 2026 17:26:06 +0800 Subject: [PATCH 2/2] fix(wren-ui): remove null fallback for non-nullable timestamp fields Instruction.createdAt and updatedAt are String! (non-nullable) in the GraphQL schema, so the resolver should not return null. Follow the SqlPairResolver pattern which also omits null checks. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/apollo/server/resolvers/instructionResolver.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/wren-ui/src/apollo/server/resolvers/instructionResolver.ts b/wren-ui/src/apollo/server/resolvers/instructionResolver.ts index 5709bd58f1..3f9b882a13 100644 --- a/wren-ui/src/apollo/server/resolvers/instructionResolver.ts +++ b/wren-ui/src/apollo/server/resolvers/instructionResolver.ts @@ -92,14 +92,10 @@ export class InstructionResolver { public getInstructionNestedResolver = () => ({ createdAt: (instruction: Instruction) => { - return instruction.createdAt - ? new Date(instruction.createdAt).toISOString() - : null; + return new Date(instruction.createdAt).toISOString(); }, updatedAt: (instruction: Instruction) => { - return instruction.updatedAt - ? new Date(instruction.updatedAt).toISOString() - : null; + return new Date(instruction.updatedAt).toISOString(); }, }); }