claude-flow 3.45.0 → 3.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/README.zh-CN.md +424 -0
- package/node_modules/@claude-flow/codex/dist/cli.js +0 -0
- package/node_modules/@claude-flow/codex/dist/worktrees/coordinator.d.ts.map +1 -1
- package/node_modules/@claude-flow/codex/dist/worktrees/coordinator.js +2 -6
- package/node_modules/@claude-flow/codex/dist/worktrees/coordinator.js.map +1 -1
- package/node_modules/@claude-flow/mcp/dist/transport/http.d.ts.map +1 -1
- package/node_modules/@claude-flow/mcp/dist/transport/http.js +14 -1
- package/node_modules/@claude-flow/mcp/dist/transport/http.js.map +1 -1
- package/node_modules/@claude-flow/plugin-agent-federation/dist/a2a/planner-descriptor.d.ts +40 -0
- package/node_modules/@claude-flow/plugin-agent-federation/dist/a2a/planner-descriptor.d.ts.map +1 -0
- package/node_modules/@claude-flow/plugin-agent-federation/dist/a2a/planner-descriptor.js +100 -0
- package/node_modules/@claude-flow/plugin-agent-federation/dist/a2a/planner-descriptor.js.map +1 -0
- package/node_modules/@claude-flow/plugin-agent-federation/dist/bin.js +0 -0
- package/node_modules/@claude-flow/plugin-agent-federation/dist/index.d.ts +1 -0
- package/node_modules/@claude-flow/plugin-agent-federation/dist/index.d.ts.map +1 -1
- package/node_modules/@claude-flow/plugin-agent-federation/dist/index.js +1 -0
- package/node_modules/@claude-flow/plugin-agent-federation/dist/index.js.map +1 -1
- package/node_modules/@claude-flow/plugin-agent-federation/package.json +1 -0
- package/node_modules/@claude-flow/security/dist/input-validator.d.ts +6 -6
- package/node_modules/@claude-flow/security/dist/safe-git.d.ts +22 -0
- package/node_modules/@claude-flow/security/dist/safe-git.d.ts.map +1 -0
- package/node_modules/@claude-flow/security/dist/safe-git.js +63 -0
- package/node_modules/@claude-flow/security/dist/safe-git.js.map +1 -0
- package/package.json +3 -3
- package/v3/@claude-flow/cli/README.md +2 -0
- package/v3/@claude-flow/cli/bin/cli.js +13 -0
- package/v3/@claude-flow/cli/bin/mcp-server.js +16 -0
- package/v3/@claude-flow/cli/catalog-manifest.json +2 -2
- package/v3/@claude-flow/cli/dist/src/commands/doctor.d.ts +3 -0
- package/v3/@claude-flow/cli/dist/src/commands/doctor.js +131 -2
- package/v3/@claude-flow/cli/dist/src/commands/embeddings.js +50 -7
- package/v3/@claude-flow/cli/dist/src/commands/init.js +5 -2
- package/v3/@claude-flow/cli/dist/src/commands/mcp.js +27 -4
- package/v3/@claude-flow/cli/dist/src/mcp-server.d.ts +50 -6
- package/v3/@claude-flow/cli/dist/src/mcp-server.js +267 -33
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agent-execute-core.js +7 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agentdb-tools.js +20 -8
- package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-tools.js +59 -48
- package/v3/@claude-flow/cli/dist/src/mcp-tools/memory-tools.js +9 -4
- package/v3/@claude-flow/cli/dist/src/mcp-tools/metaharness-tools.js +1 -1
- package/v3/@claude-flow/cli/dist/src/mcp-tools/policy-enforcer.d.ts +4 -4
- package/v3/@claude-flow/cli/dist/src/mcp-tools/policy-enforcer.js +4 -4
- package/v3/@claude-flow/cli/dist/src/mcp-tools/terminal-tools.js +11 -1
- package/v3/@claude-flow/cli/dist/src/mcp-tools/workflow-tools.js +1 -1
- package/v3/@claude-flow/cli/dist/src/memory/ewc-consolidation.d.ts +16 -1
- package/v3/@claude-flow/cli/dist/src/memory/ewc-consolidation.js +63 -13
- package/v3/@claude-flow/cli/dist/src/memory/intelligence.d.ts +6 -2
- package/v3/@claude-flow/cli/dist/src/memory/intelligence.js +18 -11
- package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.js +84 -0
- package/v3/@claude-flow/cli/dist/src/runtime/browser-command.d.ts +29 -0
- package/v3/@claude-flow/cli/dist/src/runtime/browser-command.js +101 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/model-router.js +19 -1
- package/v3/@claude-flow/cli/dist/src/services/distill-oracle.js +2 -1
- package/v3/@claude-flow/cli/dist/src/services/git-workspace-identity.js +5 -8
- package/v3/@claude-flow/cli/dist/src/services/policy-runtime.js +114 -4
- package/v3/@claude-flow/cli/dist/src/services/worker-daemon.js +8 -3
- package/v3/@claude-flow/cli/package.json +5 -5
- package/.claude/.proven-config-version +0 -1
- package/.claude/proven-config.json +0 -42
package/README.md
CHANGED
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
|
|
20
20
|
# Ruflo
|
|
21
21
|
|
|
22
|
+
[English](README.md) · [简体中文](README.zh-CN.md)
|
|
23
|
+
|
|
22
24
|
**An agent meta-harness for Claude Code and Codex.**
|
|
23
25
|
|
|
24
26
|
[](docs/ruflo-explained.md)
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
[](https://cognitum.one/agentic-engineering)
|
|
4
|
+
|
|
5
|
+
<!-- Try Ruflo — the 4 badges first-time visitors actually act on -->
|
|
6
|
+
[](https://flo.ruv.io/)
|
|
7
|
+
[](https://www.npmjs.com/package/ruflo)
|
|
8
|
+
[](https://opensource.org/licenses/MIT)
|
|
9
|
+
[](https://github.com/ruvnet/claude-flow)
|
|
10
|
+
|
|
11
|
+
<!-- Ecosystem strip (collapsed visually with flat-square) -->
|
|
12
|
+
[](https://goal.ruv.io/)
|
|
13
|
+
[](https://goal.ruv.io/agents)
|
|
14
|
+
[](https://github.com/ruvnet/ruvector)
|
|
15
|
+
[](https://github.com/ruvnet/ruflo/blob/main/data/clone-data.proof.json)
|
|
16
|
+
[](https://github.com/ruvnet/ruflo/blob/main/data/clone-data.ledger.json)
|
|
17
|
+
[](https://github.com/ruvnet/claude-flow)
|
|
18
|
+
[](https://www.npmjs.com/package/@claude-flow/codex)
|
|
19
|
+
|
|
20
|
+
# Ruflo
|
|
21
|
+
|
|
22
|
+
[English](README.md) · [简体中文](README.zh-CN.md)
|
|
23
|
+
|
|
24
|
+
**面向 Claude Code 与 Codex 的智能体元基座(meta-harness)。**
|
|
25
|
+
|
|
26
|
+
[](docs/ruflo-explained.md)
|
|
27
|
+
|
|
28
|
+
**[📖 RuFlo 详解——组建一支会规划、会记忆、会测试、会自我改进的 AI 团队](docs/ruflo-explained.md)**
|
|
29
|
+
一份 14 章的指南:从基本理念到第一个实用任务,再到记忆、智能体团队、插件、成本与验证。
|
|
30
|
+
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
> **智能体 = 模型 + 基座(Harness)。** 模型负责写作;基座为它提供工具、记忆、循环、沙箱与控制能力,让模型真正能干成事。**Ruflo 就是那个基座**——围绕 Claude Code 与 Codex 的执行层,它带来 100+ 专用智能体、协同蜂群、自学习记忆、跨机器联邦通信以及企业级安全护栏。智能体不再只是"跑起来",而是彼此协作。
|
|
34
|
+
|
|
35
|
+
一行 `npx ruflo init` 就能为 Claude Code 装上神经系统:智能体自行组织成蜂群,从每项任务中学习,跨会话保持记忆,并且——借助联邦能力——能在不泄露数据的前提下与其他机器上的智能体安全通信。你只管继续写代码,协调工作交给 Ruflo。
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
Self-Learning / Self-Optimizing Agent Architecture
|
|
39
|
+
|
|
40
|
+
User --> Ruflo (CLI/MCP) --> Router --> Swarm --> Agents --> Memory --> LLM Providers
|
|
41
|
+
^ |
|
|
42
|
+
+---- Learning Loop <-------+
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
> **第一次用 Ruflo?** 你不需要先学会 314 个 MCP 工具或 26 条 CLI 命令。执行完 `init` 之后,像平常一样使用 Claude Code 即可——钩子系统会自动路由任务、从成功模式中学习,并在后台协调智能体。
|
|
46
|
+
|
|
47
|
+
<details>
|
|
48
|
+
<summary><strong>📖 背景——名字的由来</strong></summary>
|
|
49
|
+
|
|
50
|
+
> Claude Flow 现已更名为 Ruflo——名字来自 [`rUv`](https://ruv.io),他热爱 Rust、心流状态,以及构建那些让人觉得"本该如此"的东西。"Ru" 来自 rUv,"flo" 是工作到凌晨三点的心流。底层由 [`Cognitum.One`](https://cognitum.one/?RuFlo) 的智能体架构驱动,运行着超强性能的 Rust AI 引擎、嵌入向量、记忆与插件系统。
|
|
51
|
+
|
|
52
|
+
</details>
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+

|
|
57
|
+
|
|
58
|
+
## 快速开始
|
|
59
|
+
|
|
60
|
+
有**两条完全不同的安装路径**,覆盖范围差异很大。请根据你的需要选择(#1744):
|
|
61
|
+
|
|
62
|
+
| | **Claude Code 插件** | **CLI 安装(`npx ruflo init`)** |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| 提供什么 | 斜杠命令 + 少量技能 + 每个插件各自的智能体定义 | 完整的 Ruflo 循环——98 个智能体、60+ 条命令、30 项技能、MCP 服务器、钩子、守护进程 |
|
|
65
|
+
| 工作区中的文件 | **零** | `.claude/`、`.claude-flow/`、`CLAUDE.md`、辅助文件、设置 |
|
|
66
|
+
| 是否注册 MCP 服务器 | 仅在安装了 `ruflo-core` 时(它自带 `.mcp.json`)——其他插件大多不会 | 是 |
|
|
67
|
+
| 是否安装钩子 | 否 | 是 |
|
|
68
|
+
| 适合场景 | 不全面安装,先试用单个插件的命令 | 生产环境使用——一切如文档所述般工作 |
|
|
69
|
+
|
|
70
|
+
### 路径 A——Claude Code 插件(轻量版,仅斜杠命令)
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# Add the marketplace
|
|
74
|
+
/plugin marketplace add ruvnet/ruflo
|
|
75
|
+
|
|
76
|
+
# Install core + any plugins you need
|
|
77
|
+
/plugin install ruflo-core@ruflo
|
|
78
|
+
/plugin install ruflo-swarm@ruflo
|
|
79
|
+
/plugin install ruflo-rag-memory@ruflo
|
|
80
|
+
/plugin install ruflo-neural-trader@ruflo
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
这会添加斜杠命令与智能体定义。上面安装的 `ruflo-core` 确实会在安装时注册它自己的 MCP 服务器——其工具以 `mcp__plugin_ruflo-core_ruflo__*` 形式调用(例如 `mcp__plugin_ruflo-core_ruflo__memory_store`),而不是 CLI 路线脚手架中使用的裸名 `memory_store`/`swarm_init`/`agent_spawn`。其他插件通常不自带 MCP 服务器。想要带 CLI 路线工具名的完整循环,请使用下方的路径 B。
|
|
84
|
+
|
|
85
|
+
<details>
|
|
86
|
+
<summary><strong>🔌 全部 35 个插件</strong></summary>
|
|
87
|
+
|
|
88
|
+
#### 核心与编排
|
|
89
|
+
|
|
90
|
+
| 插件 | 功能说明 |
|
|
91
|
+
|--------|-------------|
|
|
92
|
+
| [**ruflo-core**](plugins/ruflo-core/README.md) | 基础层——服务器、健康检查、插件发现 |
|
|
93
|
+
| [**ruflo-swarm**](plugins/ruflo-swarm/README.md) | 将多个智能体作为团队进行协调 |
|
|
94
|
+
| [**ruflo-autopilot**](plugins/ruflo-autopilot/README.md) | 让智能体在循环中自主运行 |
|
|
95
|
+
| [**ruflo-loop-workers**](plugins/ruflo-loop-workers/README.md) | 按定时器调度后台任务 |
|
|
96
|
+
| [**ruflo-workflows**](plugins/ruflo-workflows/README.md) | 可复用的多步骤任务模板 |
|
|
97
|
+
| [**ruflo-federation**](plugins/ruflo-federation/README.md) | 让不同机器上的智能体安全协作 |
|
|
98
|
+
|
|
99
|
+
#### 记忆与知识
|
|
100
|
+
|
|
101
|
+
| 插件 | 功能说明 |
|
|
102
|
+
|--------|-------------|
|
|
103
|
+
| [**ruflo-agentdb**](plugins/ruflo-agentdb/README.md) | 面向智能体记忆的快速向量数据库 |
|
|
104
|
+
| [**ruflo-rag-memory**](plugins/ruflo-rag-memory/README.md) | 智能检索——混合搜索、图谱跳转、多样性排序 |
|
|
105
|
+
| [**ruflo-rvf**](plugins/ruflo-rvf/README.md) | 跨会话保存与恢复智能体记忆 |
|
|
106
|
+
| [**ruflo-ruvector**](plugins/ruflo-ruvector/README.md) | [`ruvector`](https://npmjs.com/package/ruvector)——GPU 加速搜索、Graph RAG、103 个工具 |
|
|
107
|
+
| [**ruflo-knowledge-graph**](plugins/ruflo-knowledge-graph/README.md) | 构建并遍历实体关系图谱 |
|
|
108
|
+
|
|
109
|
+
#### 智能与学习
|
|
110
|
+
|
|
111
|
+
| 插件 | 功能说明 |
|
|
112
|
+
|--------|-------------|
|
|
113
|
+
| [**ruflo-intelligence**](plugins/ruflo-intelligence/README.md) | 智能体从过往成功中学习,变得越来越聪明 |
|
|
114
|
+
| [**ruflo-graph-intelligence**](plugins/ruflo-graph-intelligence/) | 亚线性图推理——PageRank、增量更新、复杂度感知执行(ADR-123) |
|
|
115
|
+
| [**ruflo-daa**](plugins/ruflo-daa/README.md) | 动态智能体行为与认知模式 |
|
|
116
|
+
| [**ruflo-ruvllm**](plugins/ruflo-ruvllm/README.md) | 通过智能路由运行本地 LLM(Ollama 等) |
|
|
117
|
+
| [**ruflo-goals**](plugins/ruflo-goals/README.md) | 将大目标拆解为计划并跟踪进度 |
|
|
118
|
+
|
|
119
|
+
#### 代码质量与测试
|
|
120
|
+
|
|
121
|
+
| 插件 | 功能说明 |
|
|
122
|
+
|--------|-------------|
|
|
123
|
+
| [**ruflo-testgen**](plugins/ruflo-testgen/README.md) | 找出缺失的测试并自动生成 |
|
|
124
|
+
| [**ruflo-browser**](plugins/ruflo-browser/README.md) | 使用 Playwright 自动化浏览器测试 |
|
|
125
|
+
| [**ruflo-jujutsu**](plugins/ruflo-jujutsu/README.md) | 分析 git diff、评估风险、推荐审查人 |
|
|
126
|
+
| [**ruflo-docs**](plugins/ruflo-docs/README.md) | 自动生成与维护文档 |
|
|
127
|
+
|
|
128
|
+
#### 安全与合规
|
|
129
|
+
|
|
130
|
+
| 插件 | 功能说明 |
|
|
131
|
+
|--------|-------------|
|
|
132
|
+
| [**ruflo-security-audit**](plugins/ruflo-security-audit/README.md) | 扫描漏洞与 CVE |
|
|
133
|
+
| [**ruflo-aidefence**](plugins/ruflo-aidefence/README.md) | 拦截提示词注入、检测 PII、安全扫描 |
|
|
134
|
+
|
|
135
|
+
#### 架构与方法论
|
|
136
|
+
|
|
137
|
+
| 插件 | 功能说明 |
|
|
138
|
+
|--------|-------------|
|
|
139
|
+
| [**ruflo-adr**](plugins/ruflo-adr/README.md) | 用持续更新的记录跟踪架构决策 |
|
|
140
|
+
| [**ruflo-ddd**](plugins/ruflo-ddd/README.md) | 脚手架式搭建领域驱动设计——上下文、聚合、事件 |
|
|
141
|
+
| [**ruflo-sparc**](plugins/ruflo-sparc/README.md) | 带质量门的 5 阶段引导式开发方法论 |
|
|
142
|
+
| [**ruflo-metaharness**](plugins/ruflo-metaharness/README.md) | 为你的智能体配置打分、扫描工具配置中的安全风险、跟踪长期变更([指南](docs/metaharness-user-guide.md)) |
|
|
143
|
+
| [**ruflo-arena**](plugins/ruflo-arena/README.md) | 竞争性 ruliology——在锦标赛中让智能体策略相互对决,对胜者进行爬山优化与共同进化(ADR-147/148) |
|
|
144
|
+
|
|
145
|
+
#### DevOps 与可观测性
|
|
146
|
+
|
|
147
|
+
| 插件 | 功能说明 |
|
|
148
|
+
|--------|-------------|
|
|
149
|
+
| [**ruflo-migrations**](plugins/ruflo-migrations/README.md) | 安全地管理数据库 schema 变更 |
|
|
150
|
+
| [**ruflo-observability**](plugins/ruflo-observability/README.md) | 一站式结构化日志、追踪与指标 |
|
|
151
|
+
| [**ruflo-cost-tracker**](plugins/ruflo-cost-tracker/README.md) | 跟踪 token 用量、设定预算、获取成本告警 |
|
|
152
|
+
|
|
153
|
+
#### 可扩展性
|
|
154
|
+
|
|
155
|
+
| 插件 | 功能说明 |
|
|
156
|
+
|--------|-------------|
|
|
157
|
+
| [**ruflo-agent**](plugins/ruflo-agent/README.md) | 运行智能体——本地 WASM 沙箱(rvagent)+ Anthropic Claude 托管智能体(云端) |
|
|
158
|
+
| [**ruflo-plugin-creator**](plugins/ruflo-plugin-creator/README.md) | 脚手架式创建、校验并发布你自己的插件 |
|
|
159
|
+
|
|
160
|
+
#### 领域专用
|
|
161
|
+
|
|
162
|
+
| 插件 | 功能说明 |
|
|
163
|
+
|--------|-------------|
|
|
164
|
+
| [**ruflo-iot-cognitum**](plugins/ruflo-iot-cognitum/README.md) | IoT 设备管理——信任评分、异常检测、设备群 |
|
|
165
|
+
| [**ruflo-neural-trader**](plugins/ruflo-neural-trader/README.md) | [`neural-trader`](https://npmjs.com/package/neural-trader)——AI 交易,含 4 个智能体、回测、112+ 工具 |
|
|
166
|
+
| [**ruflo-market-data**](plugins/ruflo-market-data/README.md) | 摄入市场数据、向量化 OHLCV、检测形态 |
|
|
167
|
+
|
|
168
|
+
</details>
|
|
169
|
+
|
|
170
|
+
### CLI 安装
|
|
171
|
+
|
|
172
|
+
**macOS / Linux / WSL / Git-Bash:**
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# One-line install (POSIX shells only — see Windows note below)
|
|
176
|
+
curl -fsSL https://cdn.jsdelivr.net/gh/ruvnet/ruflo@main/scripts/install.sh | bash
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**所有平台(包括原生 Windows PowerShell / cmd):**
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# Interactive setup wizard — runs identically on every platform
|
|
183
|
+
npx ruflo@latest init wizard
|
|
184
|
+
|
|
185
|
+
# Quick non-interactive init
|
|
186
|
+
# npx ruflo@latest init
|
|
187
|
+
|
|
188
|
+
# Or install globally
|
|
189
|
+
npm install -g ruflo@latest
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
> 💡 **Windows 用户请注意:** `curl ... | bash` 这种形式需要 POSIX shell(Git-Bash、WSL、MSYS)。`npx ruflo@latest init wizard` 这一行可以在 PowerShell 与 cmd 中原生运行。如果你遇到 `'bash' is not recognized` 报错,改用 `npx` 那一行即可——两条路径最终执行的都是同一个 init 流程。
|
|
193
|
+
|
|
194
|
+
### MCP 服务器
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
# Add Ruflo as an MCP server in Claude Code
|
|
198
|
+
claude mcp add claude-flow -- npx ruflo@latest mcp start
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 你能获得什么
|
|
204
|
+
|
|
205
|
+
| 能力 | 说明 |
|
|
206
|
+
|------------|-------------|
|
|
207
|
+
| 🤖 **100+ 智能体** | 面向编码、测试、安全、文档、架构的专用智能体 |
|
|
208
|
+
| 📡 **通信层** | 零信任联邦——跨机器/组织的智能体能够安全地相互发现、认证并交换工作 |
|
|
209
|
+
| 🐝 **蜂群协调** | 具备共识机制的层级、网状与自适应拓扑 |
|
|
210
|
+
| 🧠 **自学习** | SONA 神经模式、ReasoningBank、轨迹学习 |
|
|
211
|
+
| 💾 **向量记忆** | 基于 HNSW 索引的 AgentDB——实测在 N=20k 时比暴力检索快约 1.9 倍,N=5k 时快约 3.2–4.7 倍(recall@10 ≈ 0.99);超过交叉点后 ANN 胜出,小规模 N 下持平或略逊。参见[审计报告](docs/reviews/intelligence-system-audit-2026-05-29.md)与 [`scripts/benchmark-intelligence.mjs`](scripts/benchmark-intelligence.mjs) |
|
|
212
|
+
| ⚡ **后台工作者** | 12 个自动触发的工作者(审计、优化、测试缺口等) |
|
|
213
|
+
| 🧩 **插件市场** | 33 个原生 Claude Code 插件 + 21 个 npm 插件 |
|
|
214
|
+
| 🔌 **多提供商** | Claude、GPT、Gemini、Cohere、Ollama,支持智能路由 |
|
|
215
|
+
| 🛡️ **安全性** | AIDefence、输入校验、CVE 修复、路径穿越防护 |
|
|
216
|
+
| 🌐 **智能体联邦** | 跨安装的智能体协作,零信任安全 |
|
|
217
|
+
| 🔬 **[MetaHarness](docs/metaharness-user-guide.md)** | 发布前审计你的 AI 智能体配置。对就绪度打分(1–100)、扫描工具配置中的安全问题、对整个项目做快照以捕捉长期回归,并找到与你的仓库匹配的模板。`ruflo eject` 可将 ruflo 项目转换为拥有独立名称的独立智能体工具包。[完整指南](docs/metaharness-user-guide.md)。 |
|
|
218
|
+
| 💬 **[Web UI 测试版](https://flo.ruv.io/)** | flo.ruv.io 上的多模型聊天,支持并行 MCP 工具调用与浏览器内 WASM 工具画廊 |
|
|
219
|
+
| 🎯 **[RuFlo Research](https://goal.ruv.io/)** | goal.ruv.io 上的 GOAP A\* 规划器——用自然语言目标生成可执行的智能体计划,并配有 [/agents](https://goal.ruv.io/agents) 实时智能体仪表盘 |
|
|
220
|
+
|
|
221
|
+
<p align="center">
|
|
222
|
+
<a href="https://flo.ruv.io/">
|
|
223
|
+
<img src="v3/docs/assets/ruVocal.png" alt="RuFlo Web UI executing parallel MCP tool calls at flo.ruv.io — ruflo__memory_store and ruflo__memory_search firing in a single model turn with the 'Step 1 — 2 tools completed' parallel-execution indicator, thinking process panel visible, Qwen 3.6 Max as the active model. Multi-agent AI chat with Model Context Protocol (MCP) tool calling, persistent vector memory via AgentDB + HNSW, swarm coordination, and 6 frontier models including Claude Sonnet 4.6, Gemini 2.5 Pro, and OpenAI through OpenRouter." width="100%" />
|
|
224
|
+
</a>
|
|
225
|
+
</p>
|
|
226
|
+
|
|
227
|
+
### Web UI(测试版)——可自托管,托管演示见 [flo.ruv.io](https://flo.ruv.io/)
|
|
228
|
+
|
|
229
|
+
**RuFlo 的 Web UI 是一个内置 Model Context Protocol(MCP)工具调用的多模型 AI 聊天界面。** 与 Qwen、Claude、Gemini 或 OpenAI 对话的同时,RuFlo 会在聊天中直接调用 CLI 所使用的同一套 MCP 工具——智能体编排、持久记忆、蜂群协调、代码审查、GitHub 操作。无需安装,无需 API Key 即可试用。
|
|
230
|
+
|
|
231
|
+
| | 是什么 | 为什么重要 |
|
|
232
|
+
|---|------------|----------------|
|
|
233
|
+
| 🧠 | **任意模型,本地或远程** | 开箱即用 6 个精选前沿模型——Qwen 3.6 Max(默认)、Claude Sonnet 4.6、Claude Haiku 4.5、Gemini 2.5 Pro、Gemini 2.5 Flash、OpenAI——全部经由 OpenRouter。也可以接入自己的模型:任何 OpenAI 兼容端点(vLLM、Ollama、LM Studio、Together、Groq、自托管)均可。 |
|
|
234
|
+
| 🦾 | **ruvLLM 自学习 AI** | 原生支持 [ruvLLM](https://github.com/ruvnet/RuVector/tree/main/examples/ruvLLM)(位于 `ruvnet/RuVector/examples/ruvLLM`)——RuFlo 的自我改进本地模型层。路由到 MicroLoRA 适配器,通过 SONA 从你的轨迹中学习,并且始终留在你的机器上。可与云端模型搭配使用,也可完全离线运行。 |
|
|
235
|
+
| 🛠️ | **约 210 个工具,随时可调用** | 5 个服务器分组(Core、Intelligence、Agents、Memory、DevTools),外加一个完全运行在浏览器内的 18 工具画廊——离线也能用。 |
|
|
236
|
+
| 🔌 | **自带 MCP 服务器** | 点击聊天输入框中的 **MCP (n)** 胶囊按钮 → *Add Server*,粘贴任意 MCP 端点(HTTP、SSE 或 stdio)。你的工具会与 RuFlo 的原生工具一起进入同一个并行执行流程。在 `localhost:3000` 上跑一个本地 MCP 服务器,即刻生效。 |
|
|
237
|
+
| ⚡ | **工具并行执行** | 一次模型响应可以同时触发 4–6+ 个工具。UI 会以卡片形式展示它们,并带有 *Step 1 — 2 tools completed* 徽章,让你清楚看到具体执行了什么。 |
|
|
238
|
+
| 💾 | **记得住的记忆** | 说一句 *"remember my favorite color is indigo"*,几周后再问——RuFlo 依然记得。底层是 AgentDB + HNSW 向量搜索(实测超过交叉点后比暴力检索快约 1.9–4.7 倍,recall@10 ≈ 0.99)。 |
|
|
239
|
+
| 📘 | **内置能力导览** | 点击侧边栏的问号图标——会弹出 "RuFlo Capabilities" 模态框,展示完整工具列表、各模型强项、架构与键盘快捷键。 |
|
|
240
|
+
| 🏠 | **可自托管** | Web UI 以 Docker 形式发布(`ruflo/src/ruvocal/Dockerfile`),内置 Mongo。可部署到你自己的 Cloud Run / Fly / Kubernetes / docker-compose。托管演示 [flo.ruv.io](https://flo.ruv.io/) 只是选项之一,自建运行完全受支持。 |
|
|
241
|
+
| 🚀 | **零安装即可试用** | 打开托管网址,选一个模型,输入问题。这就是全部上手流程。 |
|
|
242
|
+
|
|
243
|
+
**试用托管演示:** [https://flo.ruv.io/](https://flo.ruv.io/)——无需账号、无需 API Key。**自建运行:** 源码位于 [`ruflo/src/ruvocal/`](ruflo/src/ruvocal/),带多阶段 Dockerfile(`INCLUDE_DB=true` 会内置 MongoDB)以及面向 Google Cloud Run 的 `cloudbuild.yaml`。架构详见 [ADR-033](ruflo/docs/adr/ADR-033-RUVOCAL-WASM-MCP-INTEGRATION.md),路线图见 [issue #1689](https://github.com/ruvnet/ruflo/issues/1689)。
|
|
244
|
+
|
|
245
|
+
<p align="center">
|
|
246
|
+
<a href="https://goal.ruv.io/agents">
|
|
247
|
+
<img src="v3/docs/assets/goal.png" alt="goal.ruv.io/agents — RuFlo Goal-Oriented Action Planning (GOAP) UI for autonomous AI agents. Visual goal decomposition, A* search through state spaces, multi-agent task assignment, and live agent telemetry." width="100%" />
|
|
248
|
+
</a>
|
|
249
|
+
</p>
|
|
250
|
+
|
|
251
|
+
### Goal Planner UI——[goal.ruv.io](https://goal.ruv.io/) 上的自主智能体
|
|
252
|
+
|
|
253
|
+
**把高层次目标变成可执行的智能体计划。** `goal.ruv.io` 是 RuFlo 托管的 Goal-Oriented Action Planning(GOAP)前端——用自然语言描述一个目标,看着 RuFlo 把它拆解为前置条件、动作,以及一条穿过状态空间的 A* 路径,随后把工作分派给 [`/agents`](https://goal.ruv.io/agents) 上的真实智能体。
|
|
254
|
+
|
|
255
|
+
| | 是什么 | 为什么重要 |
|
|
256
|
+
|---|------------|----------------|
|
|
257
|
+
| 🎯 | **自然语言目标** | 输入 *"ship the auth refactor with tests and a PR"*——RuFlo 会提取成功标准、约束条件与隐含的前置条件。无需 JSON,无需 DSL。 |
|
|
258
|
+
| 🧭 | **GOAP A\* 规划器** | 把游戏 AI 的经典规划方法移植到软件开发:在带前置条件/效果的动作间做状态空间搜索,找出最短可行路径。状态变化时即时重规划。 |
|
|
259
|
+
| 🤖 | **实时智能体仪表盘** | [goal.ruv.io/agents](https://goal.ruv.io/agents) 展示每一个已生成的智能体——角色、当前步骤、记忆命名空间、token 预算、状态。点击即可查看轨迹、终止失控工作者或重新分配任务。 |
|
|
260
|
+
| 🌳 | **可视化计划树** | 目标渲染为可折叠的动作树,进度、受阻分支与回滚都会高亮显示。能*确切*看到智能体为何选择某条路径——不再是黑盒思维链。 |
|
|
261
|
+
| ♻️ | **自适应重规划** | 当某个动作失败或有新信息出现时,规划器从当前状态重新运行 A\*,而不是从头再来。失败变成学习,而不是死循环。 |
|
|
262
|
+
| 🧠 | **共享记忆 + SONA** | 计划、轨迹与结果都会汇入 AgentDB。未来的计划通过 HNSW 检索过往解决方案——每运行一次,规划器就更聪明一点。 |
|
|
263
|
+
| 🔗 | **接入 MCP 工具** | 每个动作节点都映射到一次工具调用(RuFlo 约 210 个 MCP 工具、你的自定义服务器或 shell)。只要依赖图允许,规划器就会并行调度它们。 |
|
|
264
|
+
| 🚀 | **零安装即可试用** | 打开 [goal.ruv.io](https://goal.ruv.io/),描述一个目标,看着它运行。源码位于 [`v3/goal_ui/`](v3/goal_ui/)——Vite + Supabase,可自托管。 |
|
|
265
|
+
|
|
266
|
+
**立即体验:** 目标规划用 [https://goal.ruv.io/](https://goal.ruv.io/),实时智能体看 [https://goal.ruv.io/agents](https://goal.ruv.io/agents)。**自建运行:** 克隆 `goal` 分支,然后 `cd v3/goal_ui && npm install && npm run dev`。
|
|
267
|
+
|
|
268
|
+
### 智能体联邦——智能体版的 Slack
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
Your Agent --> [ Remove secrets ] --> [ Sign message ] --> [ Encrypted channel ]
|
|
272
|
+
Emails, SSNs, Proves it came No one reads it
|
|
273
|
+
keys stripped from you in transit
|
|
274
|
+
|
|
|
275
|
+
v
|
|
276
|
+
Their Agent <-- [ Block attacks ] <-- [ Check identity ] <------+
|
|
277
|
+
Stops prompt Rejects forgeries
|
|
278
|
+
injection
|
|
279
|
+
|
|
280
|
+
Audit trail on both sides.
|
|
281
|
+
Trust builds over time. Bad behavior = instant downgrade.
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
Slack 给团队带来了频道,联邦则给智能体带来了同样的东西——**跨越信任边界的共享工作区**:不同机器、组织或云区域上的智能体可以相互发现、证明自己的身份,并协作完成任务。
|
|
285
|
+
|
|
286
|
+
区别在于:有些频道可信,有些不可信。[`@claude-flow/plugin-agent-federation`](https://github.com/ruvnet/ruflo/issues/1669) 会自动处理这一切。你的智能体加入联邦,通过 mTLS + ed25519 完成验证,然后开始交换工作——任何数据离开你的节点前都会先剥离 PII,每条消息都可审计。不可信的智能体仍能以较低权限参与:它们只能看到发现信息,看不到你的记忆。随着它们不断证明自己的可靠性,信任级别会逐步提升;一旦行为失当,立刻降级——全程无需人工介入。
|
|
287
|
+
|
|
288
|
+
你不需要配置握手流程,也不需要管理证书。执行 `federation init`、`federation join`,你的智能体就会开始对话。协议负责身份验证,PII 流水线负责数据安全,审计追踪负责合规。
|
|
289
|
+
|
|
290
|
+
> **📘 完整用户指南:** [`docs/federation/`](./docs/federation/)——安装配置、MCP 工具、信任级别、熔断器,以及(可选的)WireGuard 网状层——它把包层的可达性绑定到联邦信任之上。ADR-111 深入解析见 [`docs/federation/phase7-mesh-bringup.md`](./docs/federation/phase7-mesh-bringup.md)。
|
|
291
|
+
|
|
292
|
+
<details>
|
|
293
|
+
<summary><strong>联邦能力</strong></summary>
|
|
294
|
+
|
|
295
|
+
| | 能力 | 工作原理 |
|
|
296
|
+
|---|---|---|
|
|
297
|
+
| 🔒 | **零信任联邦** | 远程智能体初始均不受信任。身份通过 mTLS + ed25519 质询-应答机制证明。无需 API Key,无需共享密钥。 |
|
|
298
|
+
| 🛡️ | **PII 门控数据流** | 14 类检测流水线扫描每条出站消息。按信任级别执行策略:BLOCK(阻断)、REDACT(脱敏)、HASH(哈希)或 PASS(放行)。自适应校准减少误报。 |
|
|
299
|
+
| 📊 | **行为信任评分** | 公式(`0.4×success + 0.2×uptime + 0.2×threat + 0.2×integrity`)持续评估对等方。升级需要历史积累;降级即时生效。 |
|
|
300
|
+
| 📋 | **内置合规** | HIPAA、SOC2、GDPR 审计追踪作为合规模式。每个联邦事件都会生成一条可通过 HNSW 检索的结构化记录。 |
|
|
301
|
+
| 🤝 | **9 个 MCP 工具 + 10 条 CLI 命令** | 全生命周期:`federation_init`、`federation_send`、`federation_trust`、`federation_audit` 等。 |
|
|
302
|
+
|
|
303
|
+
</details>
|
|
304
|
+
|
|
305
|
+
<details>
|
|
306
|
+
<summary><strong>示例:两个团队共享欺诈信号,但不共享客户数据</strong></summary>
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
# Team A: initialize federation and generate keypair
|
|
310
|
+
npx claude-flow@latest federation init
|
|
311
|
+
|
|
312
|
+
# Team A: join Team B's federation endpoint
|
|
313
|
+
npx claude-flow@latest federation join wss://team-b.example.com:8443
|
|
314
|
+
|
|
315
|
+
# Team A: send a task — PII is stripped automatically before it leaves
|
|
316
|
+
npx claude-flow@latest federation send --to team-b --type task-request \
|
|
317
|
+
--message "Analyze transaction patterns for account anomalies"
|
|
318
|
+
|
|
319
|
+
# Team A: check peer trust levels and session health
|
|
320
|
+
npx claude-flow@latest federation status
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
</details>
|
|
324
|
+
|
|
325
|
+
完整架构、信任模型与实现路线图见 [issue #1669](https://github.com/ruvnet/ruflo/issues/1669)。
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
# Claude Code plugin
|
|
329
|
+
/plugin install ruflo-federation@ruflo
|
|
330
|
+
|
|
331
|
+
# Or via CLI
|
|
332
|
+
npx claude-flow@latest plugins install @claude-flow/plugin-agent-federation
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
<details>
|
|
336
|
+
<summary><strong>Claude Code:有 Ruflo 与没有 Ruflo</strong></summary>
|
|
337
|
+
|
|
338
|
+
| 能力 | 仅用 Claude Code | 加上 Ruflo |
|
|
339
|
+
|------------|-------------------|---------|
|
|
340
|
+
| 智能体协作 | 相互隔离,无共享上下文 | 拥有共享记忆与共识的蜂群 |
|
|
341
|
+
| 协调机制 | 手动编排 | 蜂后主导的层级架构(Raft、拜占庭、Gossip) |
|
|
342
|
+
| 记忆 | 仅限会话内 | 亚毫秒级检索的 HNSW 向量记忆 |
|
|
343
|
+
| 学习能力 | 行为固定 | 基于模式匹配的 SONA 自学习 |
|
|
344
|
+
| 任务路由 | 由你决定 | 智能路由(准确率 89%) |
|
|
345
|
+
| 后台工作者 | 无 | 12 个自动触发的工作者 |
|
|
346
|
+
| LLM 提供商 | 仅 Anthropic | 5 家提供商,支持故障转移 |
|
|
347
|
+
| 安全性 | 标准水平 | 经 CVE 加固 + AIDefence 防护 |
|
|
348
|
+
|
|
349
|
+
</details>
|
|
350
|
+
|
|
351
|
+
<details>
|
|
352
|
+
<summary><strong>架构总览</strong></summary>
|
|
353
|
+
|
|
354
|
+
```
|
|
355
|
+
User --> Claude Code / CLI
|
|
356
|
+
|
|
|
357
|
+
v
|
|
358
|
+
Orchestration Layer
|
|
359
|
+
(MCP Server, Router, 27 Hooks)
|
|
360
|
+
|
|
|
361
|
+
v
|
|
362
|
+
Swarm Coordination
|
|
363
|
+
(Queen, Topology, Consensus)
|
|
364
|
+
|
|
|
365
|
+
v
|
|
366
|
+
100+ Specialized Agents
|
|
367
|
+
(coder, tester, reviewer, architect, security...)
|
|
368
|
+
|
|
|
369
|
+
v
|
|
370
|
+
Memory & Learning
|
|
371
|
+
(AgentDB, HNSW, SONA, ReasoningBank)
|
|
372
|
+
|
|
|
373
|
+
v
|
|
374
|
+
LLM Providers
|
|
375
|
+
(Claude, GPT, Gemini, Cohere, Ollama)
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
</details>
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## 文档
|
|
383
|
+
|
|
384
|
+
四份文档,面向四类读者:
|
|
385
|
+
|
|
386
|
+
| 文档 | 何时阅读 |
|
|
387
|
+
|-----|-----------------|
|
|
388
|
+
| **[状态](docs/STATUS.md)** | 了解当前可用功能——能力计数、测试基线、近期修复、下一步计划。*是否已就绪*文档。 |
|
|
389
|
+
| **[用户指南](docs/USERGUIDE.md)** | 日常参考——每条命令、每个配置项、每个插件。*该怎么做*文档。 |
|
|
390
|
+
| **[MetaHarness 指南](docs/metaharness-user-guide.md)** | 如何为智能体配置打分、扫描工具配置中的安全问题、检测运行间变更,以及把项目抽取为独立智能体工具包。*审计我的配置*文档。 |
|
|
391
|
+
| **[基准测试](https://gist.github.com/ruvnet/298f8c668c8859b369f91734a0e9cbbe)** | v3.8.0 在 darwin-arm64 + linux-x64 上与 LangGraph / AutoGen / CrewAI 的 SOTA 对比矩阵。ruflo 在冷启动、单轮、RSS 上快 1.3×–1953×。*是否够快*文档。 |
|
|
392
|
+
| **[验证](verification.md)** | 用密码学方式证明已安装的字节与签名见证一致——`ruflo verify`。*信任但验证*文档。 |
|
|
393
|
+
| **[团队网关检查清单](docs/TEAM-GATEWAY-CHECKLIST.md)** | 合并前门禁、双模式交接、记忆命名空间共享、每次合并的见证清单条目。*更安全的团队协作*文档。 |
|
|
394
|
+
|
|
395
|
+
基准测试内部资料(用于复现):[`sota-workload-spec.md`](https://github.com/ruvnet/ruflo/blob/perf/sota-comparator-benchmarks/docs/benchmarks/sota-workload-spec.md) · [`SOTA-PROGRESS.md`](https://github.com/ruvnet/ruflo/blob/perf/sota-comparator-benchmarks/docs/benchmarks/SOTA-PROGRESS.md) · [原始矩阵 JSON:darwin](https://github.com/ruvnet/ruflo/blob/perf/sota-comparator-benchmarks/docs/benchmarks/sota-matrix.json) · [linux](https://github.com/ruvnet/ruflo/blob/perf/sota-comparator-benchmarks/docs/benchmarks/sota-matrix-linux.json)
|
|
396
|
+
|
|
397
|
+
用户指南章节索引:
|
|
398
|
+
|
|
399
|
+
| 章节 | 主题 |
|
|
400
|
+
|---------|--------|
|
|
401
|
+
| [快速开始](docs/USERGUIDE.md#quick-start) | 安装、前置条件、安装配置 |
|
|
402
|
+
| [核心功能](docs/USERGUIDE.md#-core-features) | MCP 工具、智能体、记忆、神经学习 |
|
|
403
|
+
| [智能与学习](docs/USERGUIDE.md#-intelligence--learning) | 钩子、工作者、SONA、模型路由 |
|
|
404
|
+
| [蜂群与协调](docs/USERGUIDE.md#-swarm--coordination) | 拓扑、共识、蜂巢心智 |
|
|
405
|
+
| [安全](docs/USERGUIDE.md#%EF%B8%8F-security) | AIDefence、CVE 修复、校验 |
|
|
406
|
+
| [生态系统](docs/USERGUIDE.md#-ecosystem--integrations) | RuVector、agentic-flow、Flow Nexus |
|
|
407
|
+
| [配置](docs/USERGUIDE.md#%EF%B8%8F-configuration--reference) | 环境变量、配置 schema |
|
|
408
|
+
| [插件市场](https://ruvnet.github.io/ruflo) | 浏览与安装插件 |
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## 支持
|
|
413
|
+
|
|
414
|
+
| 资源 | 链接 |
|
|
415
|
+
|----------|------|
|
|
416
|
+
| 文档 | [用户指南](docs/USERGUIDE.md) |
|
|
417
|
+
| 问题与缺陷 | [GitHub Issues](https://github.com/ruvnet/claude-flow/issues) |
|
|
418
|
+
| 企业服务 | [ruv.io](https://ruv.io) |
|
|
419
|
+
| 社区 | [Agentics Foundation Discord](https://discord.com/invite/dfxmpwkG2D) |
|
|
420
|
+
| 由以下提供支持 | [Cognitum.one](https://cognitum.one) |
|
|
421
|
+
|
|
422
|
+
## 许可证
|
|
423
|
+
|
|
424
|
+
MIT - [RuvNet](https://github.com/ruvnet)
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/worktrees/coordinator.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,kBAAkB,EAAE,CAAC;CACnC;
|
|
1
|
+
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/worktrees/coordinator.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,kBAAkB,EAAE,CAAC;CACnC;AAUD,qBAAa,wBAAwB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAElB,QAAQ,EAAE,MAAM;IAQ5B,OAAO,CACL,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,EACjD,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACvD,iBAAiB;IA+CpB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB;IAkBxC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAYnE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;IAgBjE,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
import { execFileSync } from 'node:child_process';
|
|
2
1
|
import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
3
2
|
import { basename, dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { safeGitTextSync } from '@claude-flow/security/safe-git';
|
|
4
4
|
const SAFE_ID = /^[a-z0-9][a-z0-9._-]{0,63}$/;
|
|
5
5
|
function git(repoRoot, args) {
|
|
6
|
-
return
|
|
7
|
-
encoding: 'utf8',
|
|
8
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
9
|
-
maxBuffer: 4 * 1024 * 1024,
|
|
10
|
-
}).trim();
|
|
6
|
+
return safeGitTextSync(repoRoot, args, { maxBuffer: 4 * 1024 * 1024 });
|
|
11
7
|
}
|
|
12
8
|
function assertId(value, label) {
|
|
13
9
|
if (!SAFE_ID.test(value))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/worktrees/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/worktrees/coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQtC,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EAGb,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,OAAO,EACP,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,aAAc,SAAQ,YAAa,YAAW,UAAU;IAmBjE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAnBzB,SAAgB,IAAI,EAAE,aAAa,CAAU;IAE7C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAClD,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAwB;IACjD,OAAO,CAAC,UAAU,CAA+B;IAEjD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAK;gBAGJ,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,mBAAmB;IAQxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC3B,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIxC,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAI5C,eAAe,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAcjD,gBAAgB,CAAC,YAAY,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpE,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQtC,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EAGb,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,OAAO,EACP,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,aAAc,SAAQ,YAAa,YAAW,UAAU;IAmBjE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAnBzB,SAAgB,IAAI,EAAE,aAAa,CAAU;IAE7C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAClD,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAwB;IACjD,OAAO,CAAC,UAAU,CAA+B;IAEjD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAK;gBAGJ,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,mBAAmB;IAQxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC3B,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIxC,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAI5C,eAAe,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAcjD,gBAAgB,CAAC,YAAY,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpE,OAAO,CAAC,eAAe;IAoFvB,OAAO,CAAC,WAAW;IA4EnB,OAAO,CAAC,sBAAsB;YA2DhB,iBAAiB;YA2FjB,sBAAsB;IAuDpC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,YAAY;CA8BrB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,mBAAmB,GAC1B,aAAa,CAEf"}
|
|
@@ -182,9 +182,12 @@ export class HttpTransport extends EventEmitter {
|
|
|
182
182
|
if (this.config.requestTimeout) {
|
|
183
183
|
this.app.use((req, res, next) => {
|
|
184
184
|
res.setTimeout(this.config.requestTimeout, () => {
|
|
185
|
+
// A handler may have completed just as the socket timeout fired.
|
|
186
|
+
if (res.headersSent || res.writableEnded || res.destroyed)
|
|
187
|
+
return;
|
|
185
188
|
res.status(408).json({
|
|
186
189
|
jsonrpc: '2.0',
|
|
187
|
-
id: null,
|
|
190
|
+
id: req.body?.id ?? null,
|
|
188
191
|
error: { code: -32000, message: 'Request timeout' },
|
|
189
192
|
});
|
|
190
193
|
});
|
|
@@ -264,6 +267,8 @@ export class HttpTransport extends EventEmitter {
|
|
|
264
267
|
this.app.use((err, req, res, next) => {
|
|
265
268
|
this.logger.error('Express error', { error: err });
|
|
266
269
|
this.errors++;
|
|
270
|
+
if (res.headersSent || res.writableEnded || res.destroyed)
|
|
271
|
+
return;
|
|
267
272
|
res.status(500).json({
|
|
268
273
|
jsonrpc: '2.0',
|
|
269
274
|
id: null,
|
|
@@ -368,6 +373,8 @@ export class HttpTransport extends EventEmitter {
|
|
|
368
373
|
if (this.notificationHandler) {
|
|
369
374
|
await this.notificationHandler(message);
|
|
370
375
|
}
|
|
376
|
+
if (res.headersSent || res.writableEnded || res.destroyed)
|
|
377
|
+
return;
|
|
371
378
|
res.status(sseResponse ? 202 : 204).end();
|
|
372
379
|
}
|
|
373
380
|
else {
|
|
@@ -381,6 +388,10 @@ export class HttpTransport extends EventEmitter {
|
|
|
381
388
|
}
|
|
382
389
|
try {
|
|
383
390
|
const response = await this.requestHandler(message);
|
|
391
|
+
// A timed-out request can still finish its tool work; its HTTP reply
|
|
392
|
+
// already belongs to the timeout path and must not be written again.
|
|
393
|
+
if (res.headersSent || res.writableEnded || res.destroyed)
|
|
394
|
+
return;
|
|
384
395
|
if (sseResponse) {
|
|
385
396
|
sseResponse.write(`event: message\ndata: ${JSON.stringify(response)}\n\n`);
|
|
386
397
|
res.status(202).end();
|
|
@@ -392,6 +403,8 @@ export class HttpTransport extends EventEmitter {
|
|
|
392
403
|
}
|
|
393
404
|
catch (error) {
|
|
394
405
|
this.errors++;
|
|
406
|
+
if (res.headersSent || res.writableEnded || res.destroyed)
|
|
407
|
+
return;
|
|
395
408
|
res.status(500).json({
|
|
396
409
|
jsonrpc: '2.0',
|
|
397
410
|
id: message.id,
|