refactor(core): restore type-safe workflow automaton from Pulse design #81
Reference in New Issue
Block a user
Delete Branch "refactor/workflow-type-safety"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Restore the type-safe workflow automaton model from Pulse, replacing the weakly-typed event loop.
Closes #80, supersedes #79.
Changes
@nerve/core (types.ts)
CommandEvent,ThreadState,ModerateResult,ModerateFn,RoleExecuteFn,WorkflowContextSTART/ENDconstants,WorkflowMessage,Role<Meta>,RoleResult<Meta>,RoleMeta,StartSignal,RoleSignal<M>,Moderator<M>,WorkflowDefinition<M>@nerve/daemon (workflow-worker.ts, ipc.ts)
WorkflowMessage[]chainmaxRoundspassed via IPC, no longer hardcodedthread-command-event→thread-workflow-messageTests
小橘 🍊(NEKO Team)
Self-Review: 设计改进建议
以下几点需要修改:
1. maxRounds 由 engine 统一控制
2. Workflow 启动参数 = prompt + maxRounds
messages[0]:{ role: "__start__", content: prompt, meta: { maxRounds }, timestamp }3. 去掉 Reflex 的 workflow kind
4. Sense 返回值增加
workflow?字段workflow字段workflow-name|maxRounds|prompt(用|分隔,prompt 可含任意字符)workflow非 null → 解析并启动对应 workflow threadworkflow为 null → 只发普通 Signal解析逻辑
链路简化
— 小橘 🍊(NEKO Team)
- Replace loose payload types with WorkflowLaunchParams { prompt, maxRounds } - Add SenseResult.workflow field with pipe-separated format (name|rounds|prompt) - Add parseWorkflowField utility and routeSenseComputeOutput in @nerve/core - Integrate sense→workflow routing in kernel - Remove deprecated workflow reflex kind from ReflexScheduler - Update all test files to use new type-safe interfaces 小橘 🍊(NEKO Team)Code Review — PR #81
整体评价
这个 PR 把旧的弱类型 event-loop workflow 引擎替换为 signal-driven automaton 模型。+382/-212 行,23 个文件,架构改动大但方向正确。核心收益:
WorkflowDefinition<M extends RoleMeta>泛型设计让 role 的 meta 类型可推导routeSenseComputeOutput()三路分发设计得很好✅ Looks Good
START/ENDsentinel 常量设计简洁有效parseSenseWorkflowDirectivepipe 解析对 prompt 含|处理正确parseRoundPayload能处理旧{type}和新{role, content, meta}格式)WorkflowReflexConfig+parseWorkflowReflex废弃代码清理彻底⚠️ Warnings
1.
parseWorkflowField与parseSenseWorkflowDirective重复core/index.ts新增parseWorkflowField(field)和sense-workflow-directive.ts的parseSenseWorkflowDirective(field)做同一件事,但前者不做任何校验,parseInt失败返回 NaN 也不报错。建议删掉parseWorkflowField,统一用parseSenseWorkflowDirective。2.
row.message as unknown as Record<string, unknown>双重 castworkflow.ts里formatThreadRoundBlock和buildThreadCommandOutput对row.message做双重转换。ThreadRoundRow.message类型完全可以直接读取,建议让partitionWorkflowMessage直接接受 message 类型,消除 unsafe cast。3.
getThreadRoundCountSQL 仍然只过滤旧格式的thread_start新格式用
role: "__start__"而非type: "thread_start",新的 START 消息会被计入 round count,导致编号偏移。需要同时过滤$.role = '__start__'。💡 Suggestions
WorkflowMessage.meta: unknown在重建 chain 时建议加 runtime validation(至少 assert meta 是 object)DEFAULT_ENGINE_MAX_ROUNDS = 100建议从config.ts挪到types.ts导出,方便其他模块引用Verdict: APPROVED ✅
核心架构改动方向正确,类型安全提升显著。Warning #3(round count SQL)建议尽快修,其余可后续 PR 处理。