refactor: redesign workflow trigger — signal 蕴含 workflow,不互斥 #204

Closed
opened 2026-04-27 12:50:30 +00:00 by xiaomo · 0 comments
Owner

问题

当前 sense compute 返回 { workflow: "name|rounds|prompt" } 时,不发 Signal,直接启动 workflow。Signal 和 Workflow 是互斥的。

这个设计有两个问题:

  1. Signal 和 Workflow 应该是蕴含关系,不是互斥 — 只有 signal 被触发时才可能 trigger workflow
  2. directive 格式用 pipe 分隔不优雅,参数应该结构化

目标设计

1. compute 返回值类型

// Sense<T> 的 compute 返回值
type ComputeResult<T> = null | {
  signal: T;                       // 必须:signal payload
  workflow: WorkflowTrigger | null; // 可选:同时触发 workflow
};

返回 null → 静默。返回对象时 必须有 signal,workflow 是附带的。

2. WorkflowTrigger 类型

type WorkflowTrigger = {
  name: string;        // workflow 名称
  maxRounds: number;   // 最大轮数
  prompt: string;      // 传递给 workflow 的 prompt
  dryRun: boolean;     // 是否 dry-run
};

3. 两种 trigger 方式统一参数

Signal trigger(sense compute 返回值):

return {
  signal: { cpu: 95, timestamp: Date.now() },
  workflow: { name: "alert", maxRounds: 5, prompt: "CPU 持续高负载", dryRun: false },
};

CLI trigger

nerve workflow trigger <name> --max-rounds 5 --prompt "手动触发分析" --dry-run

4. 变更范围

  • packages/core/src/sense-workflow-directive.ts — 重写,去掉 pipe 解析,改为结构化
  • packages/core/src/config.ts — 新增 WorkflowTrigger 类型
  • packages/daemon/src/sense-worker.ts — 适配新 compute 返回值
  • packages/daemon/src/kernel.ts — signal 和 workflow 不再互斥,先发 signal 再启动 workflow
  • packages/cli/src/commands/workflow.ts — trigger 命令参数调整(--max-rounds--prompt--dry-run
  • 测试更新
  • packages/skills/nerve-dev/SKILL.md — 更新 compute 返回值文档

关键约束

  • Signal 必须先于 Workflow 发出(保持因果链)
  • workflow: null 表示不触发 workflow,不是报错
  • CLI trigger 不经过 sense,直接启动 workflow(但参数结构一致)

小墨 🖊️

## 问题 当前 sense compute 返回 `{ workflow: "name|rounds|prompt" }` 时,**不发 Signal**,直接启动 workflow。Signal 和 Workflow 是互斥的。 这个设计有两个问题: 1. **Signal 和 Workflow 应该是蕴含关系**,不是互斥 — 只有 signal 被触发时才可能 trigger workflow 2. **directive 格式用 pipe 分隔不优雅**,参数应该结构化 ## 目标设计 ### 1. compute 返回值类型 ```typescript // Sense<T> 的 compute 返回值 type ComputeResult<T> = null | { signal: T; // 必须:signal payload workflow: WorkflowTrigger | null; // 可选:同时触发 workflow }; ``` 返回 `null` → 静默。返回对象时 **必须有 signal**,workflow 是附带的。 ### 2. WorkflowTrigger 类型 ```typescript type WorkflowTrigger = { name: string; // workflow 名称 maxRounds: number; // 最大轮数 prompt: string; // 传递给 workflow 的 prompt dryRun: boolean; // 是否 dry-run }; ``` ### 3. 两种 trigger 方式统一参数 **Signal trigger**(sense compute 返回值): ```typescript return { signal: { cpu: 95, timestamp: Date.now() }, workflow: { name: "alert", maxRounds: 5, prompt: "CPU 持续高负载", dryRun: false }, }; ``` **CLI trigger**: ```bash nerve workflow trigger <name> --max-rounds 5 --prompt "手动触发分析" --dry-run ``` ### 4. 变更范围 - [ ] `packages/core/src/sense-workflow-directive.ts` — 重写,去掉 pipe 解析,改为结构化 - [ ] `packages/core/src/config.ts` — 新增 `WorkflowTrigger` 类型 - [ ] `packages/daemon/src/sense-worker.ts` — 适配新 compute 返回值 - [ ] `packages/daemon/src/kernel.ts` — signal 和 workflow 不再互斥,先发 signal 再启动 workflow - [ ] `packages/cli/src/commands/workflow.ts` — trigger 命令参数调整(`--max-rounds`、`--prompt`、`--dry-run`) - [ ] 测试更新 - [ ] `packages/skills/nerve-dev/SKILL.md` — 更新 compute 返回值文档 ## 关键约束 - Signal **必须先于** Workflow 发出(保持因果链) - `workflow: null` 表示不触发 workflow,不是报错 - CLI trigger 不经过 sense,直接启动 workflow(但参数结构一致) 小墨 🖊️
This repo is archived. You cannot comment on issues.
No Label
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/nerve#204