From 87a540705dd124b4021c310c57695e79ad5b93c5 Mon Sep 17 00:00:00 2001 From: silence Date: Fri, 11 Sep 2026 12:36:31 +0800 Subject: [PATCH] fix(core): omit undefined permission metadata --- packages/core/src/permission.ts | 4 +++- packages/core/test/permission.test.ts | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/core/src/permission.ts b/packages/core/src/permission.ts index 3f28632a034d..314feb6d5a53 100644 --- a/packages/core/src/permission.ts +++ b/packages/core/src/permission.ts @@ -168,7 +168,9 @@ const layer = Layer.effect( action: input.action, resources: input.resources, save: input.save, - metadata: input.metadata, + metadata: input.metadata + ? Object.fromEntries(Object.entries(input.metadata).filter(([, value]) => value !== undefined)) + : undefined, source: input.source, } } diff --git a/packages/core/test/permission.test.ts b/packages/core/test/permission.test.ts index df87c1d0efd6..d9e002eb2107 100644 --- a/packages/core/test/permission.test.ts +++ b/packages/core/test/permission.test.ts @@ -118,6 +118,33 @@ describe("PermissionV2", () => { }), ) + it.effect("omits undefined permission metadata fields", () => + Effect.gen(function* () { + yield* setup() + const service = yield* PermissionV2.Service + yield* service.ask( + assertion({ + metadata: { + root: ".", + path: undefined, + limit: undefined, + enabled: false, + count: 0, + nullable: null, + }, + }), + ) + + const request = yield* service.get(PermissionV2.ID.create("per_test")) + expect(request?.metadata).toEqual({ + root: ".", + enabled: false, + count: 0, + nullable: null, + }) + }), + ) + it.effect("evaluates against an explicit provider-turn agent", () => Effect.gen(function* () { yield* setup([{ action: "read", resource: "*", effect: "allow" }])