From b9072f199134220698771032f65146c6f419ff43 Mon Sep 17 00:00:00 2001 From: can1357 Date: Wed, 22 Jul 2026 20:42:33 +0200 Subject: [PATCH] fix(extensibility): validate Type.Unsafe against the draft-2020-12 upgraded schema Aligns the shim's runtime safeParse/__validator with the wire/tool-call path, so legacy draft-07 documents (tuple items) accept the same values validateToolArguments does. Adds a regression test. --- packages/agent/node_modules | 1 + packages/ai/node_modules | 1 + packages/catalog/node_modules | 1 + packages/coding-agent/node_modules | 1 + packages/coding-agent/src/extensibility/typebox.ts | 8 ++++++-- .../test/extensibility/typebox-shim.test.ts | 12 ++++++++++++ packages/collab-web/node_modules | 1 + packages/hashline/node_modules | 1 + packages/metaharness/node_modules | 1 + packages/mnemopi/node_modules | 1 + packages/natives/node_modules | 1 + packages/snapcompact/node_modules | 1 + packages/stats/node_modules | 1 + packages/swarm-extension/node_modules | 1 + packages/tui/node_modules | 1 + packages/typescript-edit-benchmark/node_modules | 1 + packages/utils/node_modules | 1 + packages/wire/node_modules | 1 + 18 files changed, 34 insertions(+), 2 deletions(-) create mode 120000 packages/agent/node_modules create mode 120000 packages/ai/node_modules create mode 120000 packages/catalog/node_modules create mode 120000 packages/coding-agent/node_modules create mode 120000 packages/collab-web/node_modules create mode 120000 packages/hashline/node_modules create mode 120000 packages/metaharness/node_modules create mode 120000 packages/mnemopi/node_modules create mode 120000 packages/natives/node_modules create mode 120000 packages/snapcompact/node_modules create mode 120000 packages/stats/node_modules create mode 120000 packages/swarm-extension/node_modules create mode 120000 packages/tui/node_modules create mode 120000 packages/typescript-edit-benchmark/node_modules create mode 120000 packages/utils/node_modules create mode 120000 packages/wire/node_modules diff --git a/packages/agent/node_modules b/packages/agent/node_modules new file mode 120000 index 000000000..b85826a64 --- /dev/null +++ b/packages/agent/node_modules @@ -0,0 +1 @@ +/work/pi/packages/agent/node_modules \ No newline at end of file diff --git a/packages/ai/node_modules b/packages/ai/node_modules new file mode 120000 index 000000000..f0c231514 --- /dev/null +++ b/packages/ai/node_modules @@ -0,0 +1 @@ +/work/pi/packages/ai/node_modules \ No newline at end of file diff --git a/packages/catalog/node_modules b/packages/catalog/node_modules new file mode 120000 index 000000000..fe99b1f30 --- /dev/null +++ b/packages/catalog/node_modules @@ -0,0 +1 @@ +/work/pi/packages/catalog/node_modules \ No newline at end of file diff --git a/packages/coding-agent/node_modules b/packages/coding-agent/node_modules new file mode 120000 index 000000000..09e703e7b --- /dev/null +++ b/packages/coding-agent/node_modules @@ -0,0 +1 @@ +/work/pi/packages/coding-agent/node_modules \ No newline at end of file diff --git a/packages/coding-agent/src/extensibility/typebox.ts b/packages/coding-agent/src/extensibility/typebox.ts index fa8e5f1bf..fd047ef13 100644 --- a/packages/coding-agent/src/extensibility/typebox.ts +++ b/packages/coding-agent/src/extensibility/typebox.ts @@ -17,7 +17,7 @@ * like a small validator at runtime. */ -import { areJsonValuesEqual, validateJsonSchemaValue } from "@oh-my-pi/pi-ai/utils/schema"; +import { areJsonValuesEqual, upgradeJsonSchemaTo202012, validateJsonSchemaValue } from "@oh-my-pi/pi-ai/utils/schema"; // --------------------------------------------------------------------------- // Type aliases — exported so `import type { Static, TSchema } from "..."` @@ -919,8 +919,12 @@ export const Type = { Any: tAny, Unknown: tUnknown, Unsafe(jsonSchema: Record = {}): TUnsafe { + // Validate against the same draft-2020-12 upgrade the wire/tool-call + // path applies, so legacy draft-07 documents (tuple `items`, etc.) + // behave identically in `safeParse` and `validateToolArguments`. + const upgradedSchema = upgradeJsonSchemaTo202012(jsonSchema); const validator = (data: unknown): unknown => { - const result = validateJsonSchemaValue(jsonSchema, data); + const result = validateJsonSchemaValue(upgradedSchema, data); if (result.success) return data; const messages = result.issues.map(issue => issue.path.length > 0 ? `${issue.path.join(".")}: ${issue.message}` : issue.message, diff --git a/packages/coding-agent/test/extensibility/typebox-shim.test.ts b/packages/coding-agent/test/extensibility/typebox-shim.test.ts index 1a8ef9612..1e1a59c9f 100644 --- a/packages/coding-agent/test/extensibility/typebox-shim.test.ts +++ b/packages/coding-agent/test/extensibility/typebox-shim.test.ts @@ -62,6 +62,18 @@ describe("pi.typebox compatibility shim", () => { ).toThrow('Validation failed for tool "unsafe-schema"'); }); + it("validates Type.Unsafe draft-07 documents like the wire path", () => { + const schema = Type.Unsafe({ + type: "object", + properties: { xs: { type: "array", items: [{ type: "string" }] } }, + required: ["xs"], + }); + + expect(schema.safeParse({ xs: ["a"] }).success).toBe(true); + expect(schema.safeParse({ xs: [1] }).success).toBe(false); + expect(schema.safeParse({}).success).toBe(false); + }); + it("preserves numeric enum values from TypeScript enum objects", () => { const schema = Type.Enum({ 0: "Fast", 1: "Slow", Fast: 0, Slow: 1 }); diff --git a/packages/collab-web/node_modules b/packages/collab-web/node_modules new file mode 120000 index 000000000..1b240288a --- /dev/null +++ b/packages/collab-web/node_modules @@ -0,0 +1 @@ +/work/pi/packages/collab-web/node_modules \ No newline at end of file diff --git a/packages/hashline/node_modules b/packages/hashline/node_modules new file mode 120000 index 000000000..a1023ad79 --- /dev/null +++ b/packages/hashline/node_modules @@ -0,0 +1 @@ +/work/pi/packages/hashline/node_modules \ No newline at end of file diff --git a/packages/metaharness/node_modules b/packages/metaharness/node_modules new file mode 120000 index 000000000..51f5719cc --- /dev/null +++ b/packages/metaharness/node_modules @@ -0,0 +1 @@ +/work/pi/packages/metaharness/node_modules \ No newline at end of file diff --git a/packages/mnemopi/node_modules b/packages/mnemopi/node_modules new file mode 120000 index 000000000..29e225fe1 --- /dev/null +++ b/packages/mnemopi/node_modules @@ -0,0 +1 @@ +/work/pi/packages/mnemopi/node_modules \ No newline at end of file diff --git a/packages/natives/node_modules b/packages/natives/node_modules new file mode 120000 index 000000000..d13284be9 --- /dev/null +++ b/packages/natives/node_modules @@ -0,0 +1 @@ +/work/pi/packages/natives/node_modules \ No newline at end of file diff --git a/packages/snapcompact/node_modules b/packages/snapcompact/node_modules new file mode 120000 index 000000000..0405b97a0 --- /dev/null +++ b/packages/snapcompact/node_modules @@ -0,0 +1 @@ +/work/pi/packages/snapcompact/node_modules \ No newline at end of file diff --git a/packages/stats/node_modules b/packages/stats/node_modules new file mode 120000 index 000000000..f4a4cccdf --- /dev/null +++ b/packages/stats/node_modules @@ -0,0 +1 @@ +/work/pi/packages/stats/node_modules \ No newline at end of file diff --git a/packages/swarm-extension/node_modules b/packages/swarm-extension/node_modules new file mode 120000 index 000000000..f800b32f9 --- /dev/null +++ b/packages/swarm-extension/node_modules @@ -0,0 +1 @@ +/work/pi/packages/swarm-extension/node_modules \ No newline at end of file diff --git a/packages/tui/node_modules b/packages/tui/node_modules new file mode 120000 index 000000000..9f918da3d --- /dev/null +++ b/packages/tui/node_modules @@ -0,0 +1 @@ +/work/pi/packages/tui/node_modules \ No newline at end of file diff --git a/packages/typescript-edit-benchmark/node_modules b/packages/typescript-edit-benchmark/node_modules new file mode 120000 index 000000000..3ae87f538 --- /dev/null +++ b/packages/typescript-edit-benchmark/node_modules @@ -0,0 +1 @@ +/work/pi/packages/typescript-edit-benchmark/node_modules \ No newline at end of file diff --git a/packages/utils/node_modules b/packages/utils/node_modules new file mode 120000 index 000000000..2acf9bd77 --- /dev/null +++ b/packages/utils/node_modules @@ -0,0 +1 @@ +/work/pi/packages/utils/node_modules \ No newline at end of file diff --git a/packages/wire/node_modules b/packages/wire/node_modules new file mode 120000 index 000000000..8fe5b642f --- /dev/null +++ b/packages/wire/node_modules @@ -0,0 +1 @@ +/work/pi/packages/wire/node_modules \ No newline at end of file