495c000356
Create packages/workflow-runtime with the minimal runtime subset: - Types (WorkflowFn, RoleOutput, AgentBinding, etc.) - createWorkflow (pure orchestration, zero I/O) - validateWorkflowDescriptor - Result/ok/err, START/END constants Zero external dependencies (zod as peer only). Zero node:fs/node:path imports. Engine (@uncaged/workflow) now depends on workflow-runtime and provides CAS/merkle/extract implementations via injection. Refs #121, relates #122
25 lines
893 B
TypeScript
25 lines
893 B
TypeScript
import type { RoleMeta, WorkflowDefinition } from "@uncaged/workflow-runtime";
|
|
import * as z from "zod/v4";
|
|
import type { WorkflowDescriptor, WorkflowRoleSchema } from "./types.js";
|
|
|
|
function stripJsonSchemaMeta(json: Record<string, unknown>): WorkflowRoleSchema {
|
|
const { $schema: _drop, ...rest } = json;
|
|
return rest as WorkflowRoleSchema;
|
|
}
|
|
|
|
export function buildDescriptor<M extends RoleMeta>(
|
|
def: WorkflowDefinition<M>,
|
|
): WorkflowDescriptor {
|
|
const roles: WorkflowDescriptor["roles"] = {};
|
|
for (const [key, roleDef] of Object.entries(def.roles) as Array<
|
|
[string, { description: string; schema: z.ZodType }]
|
|
>) {
|
|
const rawJsonSchema = z.toJSONSchema(roleDef.schema) as Record<string, unknown>;
|
|
roles[key] = {
|
|
description: roleDef.description,
|
|
schema: stripJsonSchemaMeta(rawJsonSchema),
|
|
};
|
|
}
|
|
return { description: def.description, roles };
|
|
}
|