小橘 714a320bdc feat: add hello-world workflow and update sense-generator config
- Add hello-world workflow generated by workflow-generator
- Add package.json/tsconfig.json to sense-generator
- Update nerve.yaml

小橘 🍊(NEKO Team)
2026-04-25 06:12:29 +00:00

87 lines
2.1 KiB
TypeScript

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<string, unknown>).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<RoleResult<WorkflowMeta["greeter"]>> {
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<WorkflowMeta> = {
name: "hello-world",
roles: { greeter },
moderator(context: ModeratorContext<WorkflowMeta>) {
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;