From 7dcfd9422a68bbd60e7a01daa50f792c50796477 Mon Sep 17 00:00:00 2001 From: kimp Date: Fri, 7 Aug 2026 00:17:38 +0700 Subject: [PATCH] fix(coding-agent/tools): deduplicate JTD primitive detection --- .../src/tools/jtd-to-json-schema.ts | 31 +++++++++---------- .../test/tools/jtd-to-json-schema.test.ts | 4 ++- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/packages/coding-agent/src/tools/jtd-to-json-schema.ts b/packages/coding-agent/src/tools/jtd-to-json-schema.ts index fbf906fea..20225eded 100644 --- a/packages/coding-agent/src/tools/jtd-to-json-schema.ts +++ b/packages/coding-agent/src/tools/jtd-to-json-schema.ts @@ -135,6 +135,18 @@ function convertSchema(schema: unknown): unknown { return {}; } +const jtdOnlyPrimitiveTypes: Record = { + timestamp: true, + float32: true, + float64: true, + int8: true, + uint8: true, + int16: true, + uint16: true, + int32: true, + uint32: true, +}; + /** * Detect if a schema is JTD format (vs JSON Schema). * @@ -156,11 +168,8 @@ export function isJTDSchema(schema: unknown): boolean { if ("ref" in obj) return true; // JTD type primitives (JSON Schema doesn't have int32, float64, etc.) - if ("type" in obj) { - const jtdPrimitives = ["timestamp", "float32", "float64", "int8", "uint8", "int16", "uint16", "int32", "uint32"]; - if (jtdPrimitives.includes(obj.type as string)) { - return true; - } + if (typeof obj.type === "string" && Object.hasOwn(jtdOnlyPrimitiveTypes, obj.type)) { + return true; } // JTD properties form without type: "object" (JSON Schema requires it) @@ -171,18 +180,6 @@ export function isJTDSchema(schema: unknown): boolean { return false; } -const jtdOnlyPrimitiveTypes: Record = { - timestamp: true, - float32: true, - float64: true, - int8: true, - uint8: true, - int16: true, - uint16: true, - int32: true, - uint32: true, -}; - function isUnambiguousJTDSchema(schema: unknown): boolean { if (!isRecord(schema)) return false; diff --git a/packages/coding-agent/test/tools/jtd-to-json-schema.test.ts b/packages/coding-agent/test/tools/jtd-to-json-schema.test.ts index a0e418294..68bb30e7a 100644 --- a/packages/coding-agent/test/tools/jtd-to-json-schema.test.ts +++ b/packages/coding-agent/test/tools/jtd-to-json-schema.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "bun:test"; -import { jtdToJsonSchema } from "@oh-my-pi/pi-coding-agent/tools/jtd-to-json-schema"; +import { isJTDSchema, jtdToJsonSchema } from "@oh-my-pi/pi-coding-agent/tools/jtd-to-json-schema"; describe("jtdToJsonSchema", () => { it("converts JTD elements and int32 primitives into JSON Schema", () => { @@ -33,6 +33,8 @@ describe("jtdToJsonSchema", () => { required: ["results"], additionalProperties: false, }); + expect(jtdToJsonSchema({ type: "int32" })).toEqual({ type: "integer" }); + expect(isJTDSchema({ type: "int32" })).toBe(true); }); it("normalizes nested JTD fragments inside JSON Schema nodes", () => {