Merge pull request 'refactor: outputSchema only accepts inline JSON Schema' (#325) from fix/319-validate-schema-only-inline into main

This commit is contained in:
2026-05-18 13:18:17 +00:00
2 changed files with 9 additions and 21 deletions
+8 -18
View File
@@ -13,7 +13,7 @@ import {
saveWorkflowRegistry, saveWorkflowRegistry,
type UwfStore, type UwfStore,
} from "../store.js"; } from "../store.js";
import { isCasRef, parseWorkflowPayload } from "../validate.js"; import { parseWorkflowPayload } from "../validate.js";
export type WorkflowListEntry = { export type WorkflowListEntry = {
name: string; name: string;
@@ -45,25 +45,15 @@ function isJsonSchema(value: unknown): value is JSONSchema {
async function resolveOutputSchemaRef( async function resolveOutputSchemaRef(
uwf: UwfStore, uwf: UwfStore,
roleName: string, roleName: string,
outputSchema: string | JSONSchema, outputSchema: unknown,
): Promise<CasRef> { ): Promise<CasRef> {
if (typeof outputSchema === "string") {
if (!isCasRef(outputSchema)) {
fail(`invalid outputSchema cas_ref: ${outputSchema}`);
}
if (!uwf.store.has(outputSchema)) {
fail(`outputSchema not found in CAS: ${outputSchema}`);
}
return outputSchema;
}
if (!isJsonSchema(outputSchema)) { if (!isJsonSchema(outputSchema)) {
fail("outputSchema must be a cas_ref string or JSON Schema object"); fail(`role "${roleName}": outputSchema must be a JSON Schema object`);
} }
// Auto-set title from role name if not already present const schema: JSONSchema = outputSchema.title === undefined
if (outputSchema.title === undefined) { ? { ...outputSchema, title: roleName }
outputSchema = { ...outputSchema, title: roleName }; : outputSchema;
} return putSchema(uwf.store, schema);
return putSchema(uwf.store, outputSchema);
} }
async function materializeWorkflowPayload( async function materializeWorkflowPayload(
@@ -75,7 +65,7 @@ async function materializeWorkflowPayload(
const outputSchema = await resolveOutputSchemaRef( const outputSchema = await resolveOutputSchemaRef(
uwf, uwf,
`${raw.name}.${roleName}`, `${raw.name}.${roleName}`,
role.outputSchema as string | JSONSchema, role.outputSchema,
); );
roles[roleName] = { roles[roleName] = {
description: role.description, description: role.description,
+1 -3
View File
@@ -15,9 +15,7 @@ function isRoleDefinition(value: unknown): boolean {
return false; return false;
} }
const outputSchema = value.outputSchema; const outputSchema = value.outputSchema;
const schemaOk = const schemaOk = isRecord(outputSchema) && typeof outputSchema.type === "string";
typeof outputSchema === "string" ||
(isRecord(outputSchema) && typeof outputSchema.type === "string");
return ( return (
typeof value.description === "string" && typeof value.systemPrompt === "string" && schemaOk typeof value.description === "string" && typeof value.systemPrompt === "string" && schemaOk
); );