mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 00:31:24 +00:00
refactor(core): dedupe schema and command parsing helpers
This commit is contained in:
@@ -207,6 +207,36 @@ function simplifyUnionVariants(params: { obj: Record<string, unknown>; variants:
|
||||
return { variants: stripped ? nonNullVariants : variants };
|
||||
}
|
||||
|
||||
function flattenUnionFallback(
|
||||
obj: Record<string, unknown>,
|
||||
value: unknown,
|
||||
): Record<string, unknown> | undefined {
|
||||
if (!Array.isArray(value)) {
|
||||
return undefined;
|
||||
}
|
||||
const variants = (value as Record<string, unknown>[]).filter((v) => v && typeof v === "object");
|
||||
const types = new Set(variants.map((v) => v.type).filter(Boolean));
|
||||
if (variants.length === 1) {
|
||||
const merged: Record<string, unknown> = { ...variants[0] };
|
||||
copySchemaMeta(obj, merged);
|
||||
return merged;
|
||||
}
|
||||
if (types.size === 1) {
|
||||
const merged: Record<string, unknown> = { type: Array.from(types)[0] };
|
||||
copySchemaMeta(obj, merged);
|
||||
return merged;
|
||||
}
|
||||
const first = variants[0];
|
||||
if (first?.type) {
|
||||
const merged: Record<string, unknown> = { type: first.type };
|
||||
copySchemaMeta(obj, merged);
|
||||
return merged;
|
||||
}
|
||||
const merged: Record<string, unknown> = {};
|
||||
copySchemaMeta(obj, merged);
|
||||
return merged;
|
||||
}
|
||||
|
||||
function cleanSchemaForGeminiWithDefs(
|
||||
schema: unknown,
|
||||
defs: SchemaDefs | undefined,
|
||||
@@ -343,58 +373,14 @@ function cleanSchemaForGeminiWithDefs(
|
||||
// If simplifyUnionVariants couldn't reduce the union above, flatten it
|
||||
// here as a fallback: pick the first variant's type or use a permissive
|
||||
// schema so the tool declaration is accepted.
|
||||
if (cleaned.anyOf && Array.isArray(cleaned.anyOf)) {
|
||||
const variants = (cleaned.anyOf as Record<string, unknown>[]).filter(
|
||||
(v) => v && typeof v === "object",
|
||||
);
|
||||
const types = new Set(variants.map((v) => v.type).filter(Boolean));
|
||||
if (variants.length === 1) {
|
||||
const merged: Record<string, unknown> = { ...variants[0] };
|
||||
copySchemaMeta(cleaned, merged);
|
||||
return merged;
|
||||
}
|
||||
if (types.size === 1) {
|
||||
const merged: Record<string, unknown> = { type: Array.from(types)[0] };
|
||||
copySchemaMeta(cleaned, merged);
|
||||
return merged;
|
||||
}
|
||||
// Mixed types (e.g. string | array<string>): use first variant's type.
|
||||
// The execute function already handles type coercion at runtime.
|
||||
const first = variants[0];
|
||||
if (first?.type) {
|
||||
const merged: Record<string, unknown> = { type: first.type };
|
||||
copySchemaMeta(cleaned, merged);
|
||||
return merged;
|
||||
}
|
||||
const merged: Record<string, unknown> = {};
|
||||
copySchemaMeta(cleaned, merged);
|
||||
return merged;
|
||||
const flattenedAnyOf = flattenUnionFallback(cleaned, cleaned.anyOf);
|
||||
if (flattenedAnyOf) {
|
||||
return flattenedAnyOf;
|
||||
}
|
||||
|
||||
if (cleaned.oneOf && Array.isArray(cleaned.oneOf)) {
|
||||
const variants = (cleaned.oneOf as Record<string, unknown>[]).filter(
|
||||
(v) => v && typeof v === "object",
|
||||
);
|
||||
const types = new Set(variants.map((v) => v.type).filter(Boolean));
|
||||
if (variants.length === 1) {
|
||||
const merged: Record<string, unknown> = { ...variants[0] };
|
||||
copySchemaMeta(cleaned, merged);
|
||||
return merged;
|
||||
}
|
||||
if (types.size === 1) {
|
||||
const merged: Record<string, unknown> = { type: Array.from(types)[0] };
|
||||
copySchemaMeta(cleaned, merged);
|
||||
return merged;
|
||||
}
|
||||
const first = variants[0];
|
||||
if (first?.type) {
|
||||
const merged: Record<string, unknown> = { type: first.type };
|
||||
copySchemaMeta(cleaned, merged);
|
||||
return merged;
|
||||
}
|
||||
const merged: Record<string, unknown> = {};
|
||||
copySchemaMeta(cleaned, merged);
|
||||
return merged;
|
||||
const flattenedOneOf = flattenUnionFallback(cleaned, cleaned.oneOf);
|
||||
if (flattenedOneOf) {
|
||||
return flattenedOneOf;
|
||||
}
|
||||
|
||||
return cleaned;
|
||||
|
||||
Reference in New Issue
Block a user