From 747b11c83e3fdd3333995f69dee253bf8a522a46 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 14 Feb 2026 14:28:03 +0000 Subject: [PATCH] refactor(config): share allow/deny channel policy schema --- src/config/zod-schema.allowdeny.ts | 39 ++++++++++++++++++++++++++++++ src/config/zod-schema.core.ts | 33 ++----------------------- src/config/zod-schema.session.ts | 32 ++---------------------- 3 files changed, 43 insertions(+), 61 deletions(-) create mode 100644 src/config/zod-schema.allowdeny.ts diff --git a/src/config/zod-schema.allowdeny.ts b/src/config/zod-schema.allowdeny.ts new file mode 100644 index 0000000000..c2d9c5d683 --- /dev/null +++ b/src/config/zod-schema.allowdeny.ts @@ -0,0 +1,39 @@ +import { z } from "zod"; + +const AllowDenyActionSchema = z.union([z.literal("allow"), z.literal("deny")]); + +const AllowDenyChatTypeSchema = z + .union([ + z.literal("direct"), + z.literal("group"), + z.literal("channel"), + /** @deprecated Use `direct` instead. Kept for backward compatibility. */ + z.literal("dm"), + ]) + .optional(); + +export function createAllowDenyChannelRulesSchema() { + return z + .object({ + default: AllowDenyActionSchema.optional(), + rules: z + .array( + z + .object({ + action: AllowDenyActionSchema, + match: z + .object({ + channel: z.string().optional(), + chatType: AllowDenyChatTypeSchema, + keyPrefix: z.string().optional(), + }) + .strict() + .optional(), + }) + .strict(), + ) + .optional(), + }) + .strict() + .optional(); +} diff --git a/src/config/zod-schema.core.ts b/src/config/zod-schema.core.ts index b0562fee40..213ed9bedb 100644 --- a/src/config/zod-schema.core.ts +++ b/src/config/zod-schema.core.ts @@ -1,5 +1,6 @@ import { z } from "zod"; import { isSafeExecutableValue } from "../infra/exec-safety.js"; +import { createAllowDenyChannelRulesSchema } from "./zod-schema.allowdeny.js"; import { sensitive } from "./zod-schema.sensitive.js"; export const ModelApiSchema = z.union([ @@ -376,37 +377,7 @@ export const ExecutableTokenSchema = z .string() .refine(isSafeExecutableValue, "expected safe executable name or path"); -export const MediaUnderstandingScopeSchema = z - .object({ - default: z.union([z.literal("allow"), z.literal("deny")]).optional(), - rules: z - .array( - z - .object({ - action: z.union([z.literal("allow"), z.literal("deny")]), - match: z - .object({ - channel: z.string().optional(), - chatType: z - .union([ - z.literal("direct"), - z.literal("group"), - z.literal("channel"), - /** @deprecated Use `direct` instead. Kept for backward compatibility. */ - z.literal("dm"), - ]) - .optional(), - keyPrefix: z.string().optional(), - }) - .strict() - .optional(), - }) - .strict(), - ) - .optional(), - }) - .strict() - .optional(); +export const MediaUnderstandingScopeSchema = createAllowDenyChannelRulesSchema(); export const MediaUnderstandingCapabilitiesSchema = z .array(z.union([z.literal("image"), z.literal("audio"), z.literal("video")])) diff --git a/src/config/zod-schema.session.ts b/src/config/zod-schema.session.ts index a574733cc9..f2b2f3152a 100644 --- a/src/config/zod-schema.session.ts +++ b/src/config/zod-schema.session.ts @@ -2,6 +2,7 @@ import { z } from "zod"; import { parseByteSize } from "../cli/parse-bytes.js"; import { parseDurationMs } from "../cli/parse-duration.js"; import { ElevatedAllowFromSchema } from "./zod-schema.agent-runtime.js"; +import { createAllowDenyChannelRulesSchema } from "./zod-schema.allowdeny.js"; import { GroupChatSchema, InboundDebounceSchema, @@ -18,36 +19,7 @@ const SessionResetConfigSchema = z }) .strict(); -export const SessionSendPolicySchema = z - .object({ - default: z.union([z.literal("allow"), z.literal("deny")]).optional(), - rules: z - .array( - z - .object({ - action: z.union([z.literal("allow"), z.literal("deny")]), - match: z - .object({ - channel: z.string().optional(), - chatType: z - .union([ - z.literal("direct"), - z.literal("group"), - z.literal("channel"), - /** @deprecated Use `direct` instead. Kept for backward compatibility. */ - z.literal("dm"), - ]) - .optional(), - keyPrefix: z.string().optional(), - }) - .strict() - .optional(), - }) - .strict(), - ) - .optional(), - }) - .strict(); +export const SessionSendPolicySchema = createAllowDenyChannelRulesSchema(); export const SessionSchema = z .object({