File size: 1,351 Bytes
fc93158 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import { Type } from "@sinclair/typebox";
import {
CHANNEL_TARGET_DESCRIPTION,
CHANNEL_TARGETS_DESCRIPTION,
} from "../../infra/outbound/channel-target.js";
type StringEnumOptions<T extends readonly string[]> = {
description?: string;
title?: string;
default?: T[number];
};
// NOTE: Avoid Type.Union([Type.Literal(...)]) which compiles to anyOf.
// Some providers reject anyOf in tool schemas; a flat string enum is safer.
export function stringEnum<T extends readonly string[]>(
values: T,
options: StringEnumOptions<T> = {},
) {
// Defensive check: ensure values is an iterable array to avoid TypeError during spread
const safeValues = Array.isArray(values) ? values : [];
return Type.Unsafe<T[number]>({
type: "string",
enum: [...safeValues],
...options,
});
}
export function optionalStringEnum<T extends readonly string[]>(
values: T,
options: StringEnumOptions<T> = {},
) {
return Type.Optional(stringEnum(values, options));
}
export function channelTargetSchema(options?: { description?: string }) {
return Type.String({
description: options?.description ?? CHANNEL_TARGET_DESCRIPTION,
});
}
export function channelTargetsSchema(options?: { description?: string }) {
return Type.Array(
channelTargetSchema({ description: options?.description ?? CHANNEL_TARGETS_DESCRIPTION }),
);
}
|