import type { ModeratorContext, RoleResult, StartStep, WorkflowDefinition, WorkflowMessage, } from "@uncaged/nerve-core"; import { END } from "@uncaged/nerve-core"; type WorkflowMeta = { greeter: { name: string; error: string | null; }; }; const DEFAULT_NAME = "friend"; function resolveNameFromContent(content: string): { name: string; error: string | null } { const trimmed = content.trim(); if (trimmed === "") { return { name: DEFAULT_NAME, error: "empty_input" }; } let jsonParsed: unknown; let parseOk: boolean; try { jsonParsed = JSON.parse(trimmed); parseOk = true; } catch { parseOk = false; } if (parseOk) { if (jsonParsed !== null && typeof jsonParsed === "object" && !Array.isArray(jsonParsed)) { const nameField = (jsonParsed as Record).name; if (typeof nameField === "string") { const n = nameField.trim(); if (n !== "") { return { name: n, error: null }; } return { name: DEFAULT_NAME, error: "name_empty" }; } return { name: DEFAULT_NAME, error: "missing_name" }; } return { name: DEFAULT_NAME, error: "invalid_json_shape" }; } return { name: trimmed, error: null }; } async function greeter( start: StartStep, _messages: WorkflowMessage[], ): Promise> { try { const { name, error } = resolveNameFromContent(start.content); return { content: `Hello, ${name}!`, meta: { name, error }, }; } catch (unhandled) { const msg = unhandled instanceof Error ? unhandled.message : String(unhandled); return { content: `Hello, ${DEFAULT_NAME}!`, meta: { name: DEFAULT_NAME, error: `internal_error: ${msg}` }, }; } } const workflow: WorkflowDefinition = { name: "hello-world", roles: { greeter }, moderator(context: ModeratorContext) { if (context.steps.length === 0) { return "greeter"; } const last = context.steps[context.steps.length - 1]; if (last.role === "greeter") { return END; } return END; }, }; export default workflow;