- Add hello-world workflow generated by workflow-generator
- Add package.json/tsconfig.json to sense-generator
- Update nerve.yaml
小橘 🍊(NEKO Team)
87 lines
2.1 KiB
TypeScript
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;
|