diff --git a/client/src/utils/__tests__/schemaUtils.test.ts b/client/src/utils/__tests__/schemaUtils.test.ts index 98bfcb0bd..2d1b686f9 100644 --- a/client/src/utils/__tests__/schemaUtils.test.ts +++ b/client/src/utils/__tests__/schemaUtils.test.ts @@ -43,8 +43,38 @@ describe("generateDefaultValue", () => { expect(generateDefaultValue({ type: "array" })).toBe(undefined); }); - test("generates undefined for optional object", () => { - expect(generateDefaultValue({ type: "object" })).toBe(undefined); + test("generates empty object for optional root object", () => { + expect(generateDefaultValue({ type: "object" })).toEqual({}); + }); + + test("generates undefined for nested optional object", () => { + // When called WITH propertyName and parentSchema, and the property is NOT required, + // nested optional objects should return undefined + const parentSchema = { + type: "object" as const, + required: ["otherField"], + properties: { + optionalObject: { type: "object" as const }, + otherField: { type: "string" as const }, + }, + }; + expect( + generateDefaultValue({ type: "object" }, "optionalObject", parentSchema), + ).toBe(undefined); + }); + + test("generates empty object for root-level object with all optional properties", () => { + // Root-level schema with properties but no required array + // This is the exact scenario from PR #926 - elicitation with all optional fields + const schema: JsonSchemaType = { + type: "object", + properties: { + optionalField1: { type: "string" }, + optionalField2: { type: "number" }, + }, + // No required array - all fields are optional + }; + expect(generateDefaultValue(schema)).toEqual({}); }); test("generates default null for unknown types", () => { diff --git a/client/src/utils/schemaUtils.ts b/client/src/utils/schemaUtils.ts index 42d77d439..7e584c1e5 100644 --- a/client/src/utils/schemaUtils.ts +++ b/client/src/utils/schemaUtils.ts @@ -100,6 +100,7 @@ export function generateDefaultValue( propertyName && parentSchema ? isPropertyRequired(propertyName, parentSchema) : false; + const isRootSchema = propertyName === undefined && parentSchema === undefined; switch (schema.type) { case "string": @@ -112,7 +113,9 @@ export function generateDefaultValue( case "array": return isRequired ? [] : undefined; case "object": { - if (!schema.properties) return isRequired ? {} : undefined; + if (!schema.properties) { + return isRequired || isRootSchema ? {} : undefined; + } const obj: JsonObject = {}; // Only include properties that are required according to the schema's required array @@ -124,7 +127,11 @@ export function generateDefaultValue( } } }); - return isRequired ? obj : Object.keys(obj).length > 0 ? obj : undefined; + + if (Object.keys(obj).length === 0) { + return isRequired || isRootSchema ? {} : undefined; + } + return obj; } case "null": return null;