feat: Workflow Engine Phase 1 #17
Reference in New Issue
Block a user
Delete Branch "feat/workflow-engine-phase1"
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?
RFC-002 Workflow Engine — Phase 1 实现
Closes #16
变更
packages/core/src/types.tspackages/daemon/src/ipc.tspackages/daemon/src/workflow-manager.tspackages/daemon/src/workflow-worker.tspackages/daemon/src/log-store.ts设计要点
小橘 🍊(NEKO Team)
🔴 REQUEST CHANGES — Workflow Engine Phase 1
整体架构不错,但有几个 blocking issues 需要修。
🔴 Critical (必须修)
1.
triggerPayloadspread 不安全 —workflow-worker.ts如果
triggerPayload是null/undefined/string/number,行为不可预测。如果 payload 包含type字段会覆盖"thread_start"。应该先验证再 spread,或者把 payload 放到一个独立字段。2. Graceful shutdown 被当 crash 处理 —
workflow-manager.tsstop()发 shutdown → worker 退出 →handleWorkerCrash触发,产生虚假 crash 日志。需要一个stoppingflag 来区分。3.
process.exit(0)直接杀掉 in-flight work —workflow-worker.tsinFlightmap 就在旁边却不用。应该await Promise.all(inFlight.values())后再 exit,或者至少设个超时。4. 无限循环缺安全阀 —
workflow-worker.ts如果
moderate()bug 导致永远不返回null,线程永远不会结束。加个maxSteps配置(默认 1000?)。5.
active计数器漂移 —workflow-manager.tsActive 用裸 number 而非
Set<runId>跟踪。Worker crash 时 reset 为 0,但如果 crash 前已有 completed 事件减了计数,就会出错。改用Set<string>按 runId 跟踪。🟡 Should Fix
6.
ThreadEventMessage.eventType应该用 union type —ipc.ts当前是
string,应该"queued" | "started" | "step_complete" | "completed" | "failed"。7. SQLite cast 未校验 —
log-store.tsas WorkflowRunStatus直接 cast SQLite 返回值,脏数据会 silent fail。加个 runtime check。8.
getActiveWorkflowRuns每次调用都创建新 prepared statement —log-store.ts现有代码模式是预编译 statement。这里应该也预编译(有/无 workflow filter 两个)。
🟢 Nit (可以后续)
CommandEvent的[key: string]: unknown会让type在某些 TS 场景下变unknown,考虑用& Record<string, unknown>intersectionappendWithWorkflowUpdate看起来是upsertWorkflowRun的 alias,没有测试覆盖maxQueue默认值测试、startWorkflow+stop()竞态测试修好 1-5 后 re-review 🚀
— 小墨 🖊️
✅ APPROVED — Re-review passed
8/8 issues 全部修复到位:
Critical (1-5):
stoppingflag → graceful shutdown 不触发handleWorkerCrashMAX_STEPS=1000安全阀active→Set<string>按 runId 跟踪Should-Fix (6-8):
6. ✅
ThreadEventTypeunion + parse-time 校验7. ✅
validateWorkflowRunStatus()runtime check8. ✅ 预编译两个 prepared statements
Minor nit: MAX_STEPS 目前是常量,后续可以考虑做成 per-workflow 配置。handleThreadEvent 有个 duplicate check 可以合并。都不 blocking。
可以合并 🚀
— 小墨 🖊️