[English](./README.en.md) · [简体中文](./README.md)
### DSH-native workflow automation platform
用拖拽和连线组织触发器、HTTP、子 Agent、代码、条件分支、循环与定时任务,直接在 DSH 中运行完整工作流。
[](./LICENSE)


从左侧节点面板添加节点,并在画布中完成拖拽编排
## 项目简介 DSH Workflow 是一个面向 [DeepSeek Harness(DSH)](https://github.com/deepseek-ai/deepseek-harness) 的原生工作流自动化平台。它把 Agent 调用、TypeScript / Python 代码、HTTP、触发器、条件判断、循环控制和持久化执行组合成一套可直接运行的流程系统。 仓库名是 `dsh-workflow`。为兼容已经安装的 DSH 实例、持久化数据和运行时 API,npm package、Cordis bundle ID 以及宿主 API 路径仍保留 `dsh-node-flow`;这只是兼容性标识,不影响项目作为独立仓库维护。 ## 核心能力 - **可视化编排**:拖拽节点、连接端口,在画布中直观看到数据和执行路径。 - **子 Agent 调用**:Agent 节点可继承当前模型,也可选择 DSH 已配置的模型路由。 - **代码节点**:支持 TypeScript 与 Python,并提供全屏代码编辑器。 - **HTTP 自动化**:HTTP 节点支持方法、请求头、请求体、响应解析、超时和 `{{result}}` 模板。 - **Webhook 触发**:已启用流程可通过独立 token 接收外部请求,支持 HMAC-SHA256 验签、自定义成功状态码、Headers 和响应模板,并始终运行最后一次发布快照。 - **持久等待**:Wait 节点支持延迟、外部回调和人工审批;进入等待后释放执行资源,宿主重启后继续调度,到期或审批后从下游恢复。 - **连接管理**:Bearer Token、API Key、Basic Auth、OAuth2 和 Webhook Secret 在 DSH 主机使用 AES-256-GCM 加密,工作流只保存引用 ID。 - **项目变量**:普通配置与 Secret 统一保存在主机变量库,通过 `{{vars.NAME}}` 或 `vars.NAME` 引用;Secret 不回传浏览器,并在运行记录、错误和 API 响应中自动脱敏。 - **Data Store**:在 DSH 主机使用 AES-256-GCM 加密保存小型工作流状态,按工作流和命名空间隔离,支持 get、set、delete、list。 - **OAuth2 授权**:支持 Authorization Code、PKCE S256、请求体/Basic/公开客户端认证、自动刷新、401 后单次重试、连接测试与健康状态。 - **应用连接器**:内置 GitHub、Slack、Notion、Airtable、Google Sheets、Gmail、OpenAI、DeepSeek、Anthropic、HubSpot、Jira、Todoist、Stripe、Discord、Microsoft Teams 与 Asana。 - **应用事件触发**:GitHub、Slack、Todoist、Stripe 与 Asana 支持持久轮询触发;首次轮询建立基线,后续新事件各自生成独立运行。 - **节点测试**:除持久 Wait 外,每个可执行节点都能使用指定输入单独测试,结果直接显示在输出页签。 - **字段映射**:从当前测试输入、上游节点样本或历史运行输出生成 JSON 字段树,点击或拖拽即可插入嵌套字段表达式。 - **流程控制**:内置 If、Switch、Loop 和 While,覆盖分支与循环场景。 - **执行反馈**:节点展示运行状态;实际经过的连接路径会高亮,方便定位流程走向。 - **错误分支**:Code、Agent、HTTP、连接器和子工作流在重试耗尽后可从红色 `error` 端口路由到补偿或通知分支;错误事件经过脱敏,运行记录会明确标记为“错误已处理”。 - **运行控制**:画布与主页运行可主动停止,取消信号会传递到 Code、Agent、HTTP 和循环节点。 - **失败重试**:Code、Agent、HTTP、应用连接器和子工作流调用支持 0–10 次重试,可选择固定间隔或指数退避。 - **检查点恢复**:服务端运行会在节点边界持久保存恢复点;失败或宿主中断后,可从运行记录继续执行失败节点及其下游。 - **执行预算**:在编辑器“更多操作 → 运行策略”中设置单次运行最长时间和最大执行步数;超限运行会标记原因并保留安全 checkpoint,可从运行记录恢复。预算随草稿和已发布快照隔离,排队运行使用提交时的快照。 - **可靠草稿**:自动保存使用递增版本校验,多页面编辑发生冲突时不会静默覆盖。 - **并发持久化**:工作流写入在宿主进程内串行提交,长运行结束时基于最新记录合并运行时间,避免覆盖同时创建或编辑的其他流程。 - **显式发布**:已启用流程继续运行已发布快照,草稿修改需要再次发布才会影响生产调度。 - **输入契约**:可为工作流声明文本、数字、布尔值、对象、数组或任意 JSON 输入;手动运行在浏览器和宿主双重校验后才会创建运行记录。 - **版本历史**:每次创建、保存、发布、停用和回滚都会保留完整快照,支持任意两版结构 Diff、恢复为草稿或恢复并发布。 - **文件夹组织**:在主页按扁平文件夹归类、筛选和移动工作流;文件夹只管理控制面归属,不改变草稿、已发布快照、运行或版本历史。 - **错误分支**:可执行节点可在重试耗尽后走独立的红色 `error` 端口;下游只接收脱敏错误事件,运行会标为“错误已处理”。 - **审计日志**:主机侧保留有界的控制面操作记录,可追踪工作流、连接、变量、运行和审批的管理动作,不保存输入、密钥、输出或审批备注。 - **定时任务**:通过 5 段 Cron 表达式保存工作流,在任务面板中查看、立即运行或取消。 - **导入与导出**:工作流可以保存为文件,便于备份、分享和复用。 - **内置文档**:顶部帮助入口包含节点字段、连线规则、结果语义和工作流示例。 ## 界面预览 ### 节点属性 选中节点后,可以在右侧属性面板配置名称、模型、提示词、超时和失败处理策略。  ### 定时任务 定时任务面板集中展示 Cron 计划、上次触发时间和最近运行状态,并支持查看、立即运行或取消任务。  ## 快速开始 ### 安装 项目尚未发布到 npm,请直接从公开 GitHub 仓库安装: ```sh dsh plugin --profile web add git+https://github.com/luxi233/dsh-workflow.git ``` 如果你是在 DeepSeek Harness 源码目录中运行 DSH,请使用: ```sh pnpm dsh plugin --profile web add git+https://github.com/luxi233/dsh-workflow.git ``` 安装完成后重启 Web UI: ```sh dsh web ``` 源码运行方式对应为 `pnpm dsh web`。 进入 DSH 后,从侧边栏打开 **节点模式** 即可使用。 ### 基本使用 1. 从节点模式主页创建、搜索、复制、启停或删除多个工作流,也可以直接从模板开始;使用左侧文件夹创建、筛选和整理流程。删除文件夹时必须选择迁移目标或“未分类”,不会改动流程图、草稿、已发布快照、运行记录或版本历史。 2. 打开工作流后,从左侧工具轨进入 **节点库**,搜索并添加节点。 3. 拖动节点端口建立连接,或点击连线中间的 `+` 插入步骤。 4. 在右侧检查器的 **配置 / 输出** 标签中编辑参数并查看节点结果。 5. 可先在检查器填写 JSON 测试输入,通过字段旁的 **映射** 打开字段树;点击或拖拽字段会插入到当前光标,再点击 **测试此节点** 验证。 6. 工作流草稿会自动保存到 DSH 数据目录;点击 **发布** 后才会更新实际运行与 Cron 调度使用的快照。 7. 已发布流程继续编辑时会显示 **发布更新**;若其他页面先保存,编辑器会要求加载服务器版本或将本地画布另存为副本。 8. HTTP 节点需要认证时,先从主页 **连接** 创建凭据,再回到节点中选择;OAuth2 连接保存后点击授权,并将界面显示的回调 URL 登记到服务商应用中。密钥与 Token 不会进入工作流 JSON。 9. 在主页 **变量** 中创建普通值或 Secret;在可映射字段中选择“项目变量”即可插入 `{{vars.NAME}}`,表达式字段使用 `vars.NAME`。 10. 对容易受网络影响的 Code、Agent、HTTP、连接器和子工作流调用,可设置失败重试次数、等待间隔和退避策略。 11. 在 **更多操作 → 运行策略** 中配置并发模式、最长运行时间(最多 86400 秒)和最大执行步数(最多 100000 次节点访问)。不填写时间表示不限制;不填写步数使用默认上限。 12. 需要显式补偿、告警或降级时,选择节点的“失败时行为 → 路由到错误分支”,再从右侧红色 `error` 端口连接处理节点。 13. **运行记录** 默认只加载摘要;点击“详情”按需查看节点输入、输出、日志和耗时。超限运行会显示“超过运行时限”或“超过执行步数”,只要 checkpoint 合法仍可从失败处恢复。安全输入的手动运行可显式“重放”,重放固定使用当时保存的工作流快照而不是当前草稿,并会再次执行所有外部写操作;恢复与重放都采用至少一次语义,请让有副作用的操作支持幂等键。 14. 在工作流行点击 **版本历史**,可以比较任意两个版本;“恢复为草稿”不会改变线上快照,“恢复并发布”会立即替换生产版本。回滚本身也会形成新版本。 15. 在主页 **审计日志** 中按对象筛选和搜索最近的管理操作;日志只记录操作摘要与安全元数据,不能用于读取运行详情或连接密钥。 ### 手动运行输入契约 通过编辑器“更多操作 → 输入 / 输出契约”声明输入字段后,主页和编辑器的手动运行都会显示类型化输入表单。浏览器会先解析文本、数字、布尔值、对象、数组和任意 JSON;宿主会在任何运行记录、持久队列或重放快照创建前再次验证必填字段和类型。未声明输入时,原有的一键运行行为保持不变。 已启用流程始终使用其不可变的已发布快照及对应输入契约,即使浏览器中存在未发布草稿。未启用流程使用当前草稿,适合调试和预览。运行输入不得承载密码、Token、Cookie、API Key 或项目 Secret;使用主页“连接”或项目变量的 Secret。含认证字段或 Secret 的输入不会保存为可重放数据。 ### 运行策略与执行预算 编辑器“更多操作 → 运行策略”同时管理根运行并发和单次执行预算。并发策略可以允许并行、超过上限时跳过,或把触发请求持久排队;排队项保存提交时的工作流快照,宿主重启后仍按 FIFO 处理。 最长运行时间按活动执行的墙钟时间计算,最大执行步数按节点访问次数计算,循环迭代也会计入。达到任一预算后,运行状态为失败并带有 `timedOut` 与 `limitReason`(`duration` 或 `steps`);运行中心会显示具体原因。服务端会保留当前节点的输入、冻结快照和 checkpoint,只有在恢复条件满足时才显示“从失败处恢复”。预算不会跨运行累计,恢复运行会重新使用快照中的预算。 侧栏中的 **当前空间 / 本地工作区** 是数据范围标识,不是切换按钮。当前版本只有一个本地空间,工作流统一保存在 `~/.dsh/workflow-canvas/workflows.json`;团队空间与多工作区尚未实现。 ### 文件夹组织 主页文件夹是扁平的控制面元数据,工作流通过 `folderId` 归类;工作流图、草稿修订、已发布快照、执行快照、恢复检查点和版本历史都不包含文件夹内容。移动工作流只更新它的列表归属和控制面 `revision`,不会重新发布或影响已经受理的运行。 删除文件夹会原子地把其中工作流迁移到指定目标文件夹或“未分类”。创建、重命名、删除迁移和工作流移动会写入主机侧审计日志。文件夹列表不进入浏览器本地缓存;在移动工作流或删除文件夹前,先处理未同步草稿,避免旧页面缓存反向覆盖服务端归属。 ## 配套 AI Skill 如果希望让 DSH 中的 AI 更准确地生成可直接导入本插件的 JSON 工作流,可以安装配套的 [`dsh-node-flow-skill`](https://github.com/luxi233/dsh-node-flow-skill)。 该 Skill 包含当前工作流文档结构、节点字段、连线端口、循环规则与完整示例,能够减少字段遗漏或端口名称错误。安装后,可以直接告诉 AI: ```text 使用 dsh-node-flow-skill,为我生成一个可导入 dsh-node-flow 的 JSON 工作流:…… ``` Skill 地址: