diff --git a/packages/coding-agent/src/tools/yield.ts b/packages/coding-agent/src/tools/yield.ts index d0d821333..7deebb724 100644 --- a/packages/coding-agent/src/tools/yield.ts +++ b/packages/coding-agent/src/tools/yield.ts @@ -63,6 +63,7 @@ function hasUnresolvedRefs(schema: unknown): boolean { const record = schema as Record; if (typeof record.$ref === "string") return true; for (const key in record) { + if (key === "const" || key === "default" || key === "enum" || key === "examples") continue; if (hasUnresolvedRefs(record[key])) return true; } return false; diff --git a/packages/coding-agent/test/tools/yield.test.ts b/packages/coding-agent/test/tools/yield.test.ts index 3365ce5ad..53e0980ea 100644 --- a/packages/coding-agent/test/tools/yield.test.ts +++ b/packages/coding-agent/test/tools/yield.test.ts @@ -441,4 +441,25 @@ describe("YieldTool", () => { error: undefined, }); }); + + it("does not treat literal $ref fields inside enum values as unresolved schema references", async () => { + const tool = new YieldTool( + createSession({ + outputSchema: { + enum: [{ $ref: "literal" }], + }, + }), + ); + + expect(tool.strict).toBe(true); + const result = await tool.execute("call-literal-ref-enum", { + result: { data: { $ref: "literal" } }, + } as never); + expect(result.details?.data).toEqual({ $ref: "literal" }); + await expect( + tool.execute("call-invalid-literal-ref-enum", { + result: { data: { $ref: "different" } }, + } as never), + ).rejects.toThrow("Output does not match schema"); + }); });