mycohive-claw 4.0.0
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/LICENSE +21 -0
- package/README.md +222 -0
- package/dist/circuit-breaker.d.ts +82 -0
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +214 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/context-tree.d.ts +94 -0
- package/dist/context-tree.d.ts.map +1 -0
- package/dist/context-tree.js +624 -0
- package/dist/context-tree.js.map +1 -0
- package/dist/event-bus.d.ts +174 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +750 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/i18n.d.ts +91 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +150 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +301 -0
- package/dist/index.js.map +1 -0
- package/dist/intent-analyzer.d.ts +119 -0
- package/dist/intent-analyzer.d.ts.map +1 -0
- package/dist/intent-analyzer.js +563 -0
- package/dist/intent-analyzer.js.map +1 -0
- package/dist/logger.d.ts +46 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +126 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics.d.ts +98 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +192 -0
- package/dist/metrics.js.map +1 -0
- package/dist/openclaw-api.d.ts +122 -0
- package/dist/openclaw-api.d.ts.map +1 -0
- package/dist/openclaw-api.js +8 -0
- package/dist/openclaw-api.js.map +1 -0
- package/dist/rate-limiter.d.ts +46 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +134 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/result-cache.d.ts +76 -0
- package/dist/result-cache.d.ts.map +1 -0
- package/dist/result-cache.js +158 -0
- package/dist/result-cache.js.map +1 -0
- package/dist/router.d.ts +90 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +447 -0
- package/dist/router.js.map +1 -0
- package/dist/setup-entry.d.ts +18 -0
- package/dist/setup-entry.d.ts.map +1 -0
- package/dist/setup-entry.js +64 -0
- package/dist/setup-entry.js.map +1 -0
- package/dist/token-counter.d.ts +57 -0
- package/dist/token-counter.d.ts.map +1 -0
- package/dist/token-counter.js +125 -0
- package/dist/token-counter.js.map +1 -0
- package/dist/tool-handlers.d.ts +52 -0
- package/dist/tool-handlers.d.ts.map +1 -0
- package/dist/tool-handlers.js +317 -0
- package/dist/tool-handlers.js.map +1 -0
- package/dist/tools/mycohive-tools.d.ts +11 -0
- package/dist/tools/mycohive-tools.d.ts.map +1 -0
- package/dist/tools/mycohive-tools.js +160 -0
- package/dist/tools/mycohive-tools.js.map +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +57 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace-loader.d.ts +67 -0
- package/dist/workspace-loader.d.ts.map +1 -0
- package/dist/workspace-loader.js +175 -0
- package/dist/workspace-loader.js.map +1 -0
- package/package.json +52 -0
- package/workspaces/api_dev/CONFIG.md +31 -0
- package/workspaces/api_dev/RULES.md +8 -0
- package/workspaces/api_dev/SKILL.md +69 -0
- package/workspaces/api_dev/SOUL.md +19 -0
- package/workspaces/architect/CONFIG.md +32 -0
- package/workspaces/architect/RULES.md +8 -0
- package/workspaces/architect/SKILL.md +63 -0
- package/workspaces/architect/SOUL.md +19 -0
- package/workspaces/backend_dev/CONFIG.md +42 -0
- package/workspaces/backend_dev/RULES.md +8 -0
- package/workspaces/backend_dev/SKILL.md +41 -0
- package/workspaces/backend_dev/SOUL.md +19 -0
- package/workspaces/browser/CONFIG.md +42 -0
- package/workspaces/browser/RULES.md +8 -0
- package/workspaces/browser/SKILL.md +57 -0
- package/workspaces/browser/SOUL.md +19 -0
- package/workspaces/builder/CONFIG.md +31 -0
- package/workspaces/builder/RULES.md +8 -0
- package/workspaces/builder/SKILL.md +39 -0
- package/workspaces/builder/SOUL.md +18 -0
- package/workspaces/coder/CONFIG.md +44 -0
- package/workspaces/coder/RULES.md +9 -0
- package/workspaces/coder/SKILL.md +53 -0
- package/workspaces/coder/SOUL.md +19 -0
- package/workspaces/coordinator/CONFIG.md +62 -0
- package/workspaces/coordinator/RULES.md +8 -0
- package/workspaces/coordinator/SKILL.md +77 -0
- package/workspaces/coordinator/SOUL.md +20 -0
- package/workspaces/data_engineer/CONFIG.md +32 -0
- package/workspaces/data_engineer/RULES.md +8 -0
- package/workspaces/data_engineer/SKILL.md +44 -0
- package/workspaces/data_engineer/SOUL.md +19 -0
- package/workspaces/deployer/CONFIG.md +45 -0
- package/workspaces/deployer/RULES.md +8 -0
- package/workspaces/deployer/SKILL.md +74 -0
- package/workspaces/deployer/SOUL.md +19 -0
- package/workspaces/dreamer/CONFIG.md +34 -0
- package/workspaces/dreamer/RULES.md +8 -0
- package/workspaces/dreamer/SKILL.md +48 -0
- package/workspaces/dreamer/SOUL.md +19 -0
- package/workspaces/evaluator/CONFIG.md +40 -0
- package/workspaces/evaluator/RULES.md +21 -0
- package/workspaces/evaluator/SKILL.md +65 -0
- package/workspaces/evaluator/SOUL.md +20 -0
- package/workspaces/front_director/CONFIG.md +54 -0
- package/workspaces/front_director/RULES.md +8 -0
- package/workspaces/front_director/SKILL.md +52 -0
- package/workspaces/front_director/SOUL.md +20 -0
- package/workspaces/frontend_dev/CONFIG.md +33 -0
- package/workspaces/frontend_dev/RULES.md +8 -0
- package/workspaces/frontend_dev/SKILL.md +42 -0
- package/workspaces/frontend_dev/SOUL.md +19 -0
- package/workspaces/observer/CONFIG.md +60 -0
- package/workspaces/observer/RULES.md +7 -0
- package/workspaces/observer/SKILL.md +77 -0
- package/workspaces/observer/SOUL.md +19 -0
- package/workspaces/planner/CONFIG.md +43 -0
- package/workspaces/planner/RULES.md +8 -0
- package/workspaces/planner/SKILL.md +65 -0
- package/workspaces/planner/SOUL.md +20 -0
- package/workspaces/qa/CONFIG.md +32 -0
- package/workspaces/qa/RULES.md +8 -0
- package/workspaces/qa/SKILL.md +52 -0
- package/workspaces/qa/SOUL.md +19 -0
- package/workspaces/researcher/CONFIG.md +32 -0
- package/workspaces/researcher/RULES.md +8 -0
- package/workspaces/researcher/SKILL.md +58 -0
- package/workspaces/researcher/SOUL.md +20 -0
- package/workspaces/reviewer/CONFIG.md +41 -0
- package/workspaces/reviewer/RULES.md +17 -0
- package/workspaces/reviewer/SKILL.md +56 -0
- package/workspaces/reviewer/SOUL.md +20 -0
- package/workspaces/router/CONFIG.md +58 -0
- package/workspaces/router/RULES.md +8 -0
- package/workspaces/router/SKILL.md +97 -0
- package/workspaces/router/SOUL.md +20 -0
- package/workspaces/scraper/CONFIG.md +41 -0
- package/workspaces/scraper/RULES.md +8 -0
- package/workspaces/scraper/SKILL.md +51 -0
- package/workspaces/scraper/SOUL.md +19 -0
- package/workspaces/scripter/CONFIG.md +42 -0
- package/workspaces/scripter/RULES.md +8 -0
- package/workspaces/scripter/SKILL.md +54 -0
- package/workspaces/scripter/SOUL.md +18 -0
- package/workspaces/security/CONFIG.md +47 -0
- package/workspaces/security/RULES.md +8 -0
- package/workspaces/security/SKILL.md +50 -0
- package/workspaces/security/SOUL.md +19 -0
- package/workspaces/translator/CONFIG.md +43 -0
- package/workspaces/translator/RULES.md +8 -0
- package/workspaces/translator/SKILL.md +35 -0
- package/workspaces/translator/SOUL.md +19 -0
- package/workspaces/writer/CONFIG.md +31 -0
- package/workspaces/writer/RULES.md +8 -0
- package/workspaces/writer/SKILL.md +40 -0
- package/workspaces/writer/SOUL.md +19 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 MycoHive
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# MycoHive-Claw
|
|
2
|
+
|
|
3
|
+
> OpenClaw Plugin for Multi-Agent Orchestration with LLM Intent Routing
|
|
4
|
+
|
|
5
|
+
[English](#english) | [中文](#中文)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## English
|
|
10
|
+
|
|
11
|
+
### Overview
|
|
12
|
+
|
|
13
|
+
MycoHive-Claw is an OpenClaw plugin that implements a **corporate-style multi-agent collaboration system** with 24 specialized agents. It features **LLM-driven intent analysis** that automatically routes user requests to the appropriate agents — no manual `@agent` or `!!` prefixes needed.
|
|
14
|
+
|
|
15
|
+
### Architecture
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Entry Layer → Router (LLM Intent Analysis)
|
|
19
|
+
↓
|
|
20
|
+
Coordinator (Task Decomposition)
|
|
21
|
+
↓
|
|
22
|
+
┌──────────┴──────────┐
|
|
23
|
+
↓ ↓ ↓
|
|
24
|
+
Management Execution Review
|
|
25
|
+
(planner, (coder, (reviewer,
|
|
26
|
+
observer) frontend, qa,
|
|
27
|
+
backend...) security)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**24 Agents** organized in 7 categories:
|
|
31
|
+
- **Entry**: `front_director`, `router`
|
|
32
|
+
- **Management**: `coordinator`, `planner`, `observer`
|
|
33
|
+
- **Architecture**: `architect`
|
|
34
|
+
- **Execution**: `coder`, `frontend_dev`, `backend_dev`, `api_dev`, `data_engineer`, `scripter`, `researcher`, `writer`, `translator`
|
|
35
|
+
- **Review**: `reviewer`, `qa`, `security`, `evaluator`
|
|
36
|
+
- **Tool**: `browser`, `scraper`, `deployer`
|
|
37
|
+
- **Autonomous**: `builder`, `dreamer`
|
|
38
|
+
|
|
39
|
+
### Key Features
|
|
40
|
+
|
|
41
|
+
- **LLM Intent Routing** — Natural language auto-routing without `@xxx` / `!!` prefixes
|
|
42
|
+
- **Context Tree** — WAL-based incremental persistence with crash recovery and CRC validation
|
|
43
|
+
- **Event Bus** — Trie-prefix subscription matching + DLQ retry with exponential backoff
|
|
44
|
+
- **Circuit Breaker** — Failure protection for dispatch pipeline
|
|
45
|
+
- **Workspace Loader** — Dynamic agent capability discovery from filesystem
|
|
46
|
+
- **Review Agent Isolation** — `session_mode: isolated` for reviewer/qa/security/evaluator
|
|
47
|
+
|
|
48
|
+
### Requirements
|
|
49
|
+
|
|
50
|
+
- **OpenClaw** (Plugin SDK compatible version)
|
|
51
|
+
- **Node.js 18+** (for building)
|
|
52
|
+
- **TypeScript 5.x** (dev dependency included)
|
|
53
|
+
|
|
54
|
+
### Installation
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# Install via npm (recommended)
|
|
58
|
+
npm install mycohive-claw
|
|
59
|
+
|
|
60
|
+
# Or install from GitHub directly
|
|
61
|
+
npm install github:LiamLucas-m/MycoHive-Claw
|
|
62
|
+
|
|
63
|
+
# Install to OpenClaw
|
|
64
|
+
openclaw plugins install ./mycohive-claw
|
|
65
|
+
|
|
66
|
+
# Restart OpenClaw
|
|
67
|
+
openclaw restart
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Update
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# Pull latest changes
|
|
74
|
+
git pull
|
|
75
|
+
|
|
76
|
+
# Rebuild
|
|
77
|
+
npm run build
|
|
78
|
+
|
|
79
|
+
# Restart OpenClaw
|
|
80
|
+
openclaw restart
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Uninstall
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
openclaw plugins uninstall mycohive-claw
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Project Structure
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
src/
|
|
93
|
+
├── index.ts # Plugin entry (createExtension)
|
|
94
|
+
├── setup-entry.ts # Setup entry (setup)
|
|
95
|
+
├── router.ts # Intent routing + dispatch with circuit breaker
|
|
96
|
+
├── intent-analyzer.ts # LLM + keyword dual-engine intent analysis
|
|
97
|
+
├── context-tree.ts # WAL-based incremental persistence + CRC
|
|
98
|
+
├── event-bus.ts # Pub/sub + Trie matching + DLQ retry
|
|
99
|
+
├── circuit-breaker.ts # Failure protection
|
|
100
|
+
├── tool-handlers.ts # mycohive_* tool handlers
|
|
101
|
+
├── tools/mycohive-tools.ts # Tool registration
|
|
102
|
+
├── workspace-loader.ts # Agent workspace loader (SOUL/SKILL/RULES/CONFIG)
|
|
103
|
+
├── metrics.ts # Metrics collection
|
|
104
|
+
├── rate-limiter.ts # Rate limiting
|
|
105
|
+
├── result-cache.ts # Result caching
|
|
106
|
+
├── token-counter.ts # Token counting
|
|
107
|
+
├── logger.ts # Logging
|
|
108
|
+
├── i18n.ts # Internationalization
|
|
109
|
+
└── types.ts # Shared type definitions
|
|
110
|
+
|
|
111
|
+
workspaces/ # 24 Agent workspace definitions (SOUL.md + SKILL.md + RULES.md + CONFIG.md)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### License
|
|
115
|
+
|
|
116
|
+
MIT
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 中文
|
|
121
|
+
|
|
122
|
+
### 概述
|
|
123
|
+
|
|
124
|
+
MycoHive-Claw 是一个 OpenClaw 插件,实现了**企业级多 Agent 协作系统**,包含 **24 个专业 Agent**。通过 **LLM 驱动的意图分析**自动将用户请求路由到合适的 Agent,无需手动指定 `@agent` 或 `!!` 前缀。
|
|
125
|
+
|
|
126
|
+
### 架构
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
入口层 → 路由器(LLM 意图分析)
|
|
130
|
+
↓
|
|
131
|
+
协调者(任务分解)
|
|
132
|
+
↓
|
|
133
|
+
┌───────────┴───────────┐
|
|
134
|
+
↓ ↓ ↓
|
|
135
|
+
管理 执行 审查
|
|
136
|
+
(planner, (coder, (reviewer,
|
|
137
|
+
observer) frontend, qa,
|
|
138
|
+
backend...) security)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 24 个 Agent
|
|
142
|
+
|
|
143
|
+
- **入口层**: front_director, router
|
|
144
|
+
- **管理类**: coordinator, planner, observer
|
|
145
|
+
- **架构类**: architect
|
|
146
|
+
- **执行类**: coder, frontend_dev, backend_dev, api_dev, data_engineer, scripter, researcher, writer, translator
|
|
147
|
+
- **审查类**: reviewer, qa, security, evaluator
|
|
148
|
+
- **工具类**: browser, scraper, deployer
|
|
149
|
+
- **自主产出类**: builder, dreamer
|
|
150
|
+
|
|
151
|
+
### 核心特性
|
|
152
|
+
|
|
153
|
+
- **LLM 意图路由** — 自然语言自动路由,无需 `@xxx` / `!!` 前缀
|
|
154
|
+
- **Context Tree** — WAL 增量持久化 + CRC 校验 + 崩溃恢复
|
|
155
|
+
- **Event Bus** — 前缀树订阅匹配 + DLQ 重试(指数退避)
|
|
156
|
+
- **熔断器** — 派发管道故障保护
|
|
157
|
+
- **Workspace Loader** — 文件系统动态 Agent 能力发现
|
|
158
|
+
- **审查类 Agent 隔离** — reviewer/qa/security/evaluator 使用独立 Session
|
|
159
|
+
|
|
160
|
+
### 系统要求
|
|
161
|
+
|
|
162
|
+
- **OpenClaw**(兼容 Plugin SDK 版本)
|
|
163
|
+
- **Node.js 18+**
|
|
164
|
+
- **TypeScript 5.x**
|
|
165
|
+
|
|
166
|
+
### 安装
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# 通过 npm 安装(推荐)
|
|
170
|
+
npm install mycohive-claw
|
|
171
|
+
|
|
172
|
+
# 或从 GitHub 直接安装
|
|
173
|
+
npm install github:LiamLucas-m/MycoHive-Claw
|
|
174
|
+
|
|
175
|
+
# 安装到 OpenClaw
|
|
176
|
+
openclaw plugins install ./mycohive-claw
|
|
177
|
+
|
|
178
|
+
# 重启 OpenClaw
|
|
179
|
+
openclaw restart
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 更新
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
npm install mycohive-claw@latest
|
|
186
|
+
openclaw restart
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 卸载
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
openclaw plugins uninstall mycohive-claw
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 目录结构
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
src/ # TypeScript 源码
|
|
199
|
+
├── index.ts # 插件入口
|
|
200
|
+
├── setup-entry.ts # 安装入口
|
|
201
|
+
├── router.ts # 意图路由(含熔断器)
|
|
202
|
+
├── intent-analyzer.ts # LLM + 关键词双引擎意图分析
|
|
203
|
+
├── context-tree.ts # WAL 增量持久化 + CRC 校验
|
|
204
|
+
├── event-bus.ts # 事件总线(前缀树 + DLQ 重试)
|
|
205
|
+
├── circuit-breaker.ts # 熔断器
|
|
206
|
+
├── tool-handlers.ts # mycohive_* 工具处理
|
|
207
|
+
├── tools/mycohive-tools.ts # 工具注册
|
|
208
|
+
├── workspace-loader.ts # Agent workspace 加载器
|
|
209
|
+
├── metrics.ts # 指标收集
|
|
210
|
+
├── rate-limiter.ts # 限流
|
|
211
|
+
├── result-cache.ts # 结果缓存
|
|
212
|
+
├── token-counter.ts # Token 计数
|
|
213
|
+
├── logger.ts # 日志
|
|
214
|
+
├── i18n.ts # 国际化
|
|
215
|
+
└── types.ts # 类型定义
|
|
216
|
+
|
|
217
|
+
workspaces/ # 24 个 Agent 工作区定义(SOUL.md + SKILL.md + RULES.md + CONFIG.md)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### License
|
|
221
|
+
|
|
222
|
+
MIT
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker 模块
|
|
3
|
+
* 版本: v4.0.0
|
|
4
|
+
*
|
|
5
|
+
* 熔断机制:连续失败超过阈值时暂停路由,防止雪崩
|
|
6
|
+
*/
|
|
7
|
+
export declare enum CircuitState {
|
|
8
|
+
CLOSED = "closed",// 正常,允许请求
|
|
9
|
+
OPEN = "open",// 熔断,拒绝请求
|
|
10
|
+
HALF_OPEN = "half_open"
|
|
11
|
+
}
|
|
12
|
+
export interface CircuitBreakerConfig {
|
|
13
|
+
failureThreshold: number;
|
|
14
|
+
successThreshold: number;
|
|
15
|
+
timeoutMs: number;
|
|
16
|
+
monitorIntervalMs: number;
|
|
17
|
+
}
|
|
18
|
+
export interface CircuitBreakerStats {
|
|
19
|
+
state: CircuitState;
|
|
20
|
+
failures: number;
|
|
21
|
+
successes: number;
|
|
22
|
+
lastFailureTime: number | null;
|
|
23
|
+
lastSuccessTime: number | null;
|
|
24
|
+
totalRequests: number;
|
|
25
|
+
totalFailures: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class CircuitBreaker {
|
|
28
|
+
private config;
|
|
29
|
+
private state;
|
|
30
|
+
private failures;
|
|
31
|
+
private successes;
|
|
32
|
+
private lastFailureTime;
|
|
33
|
+
private lastSuccessTime;
|
|
34
|
+
private totalRequests;
|
|
35
|
+
private totalFailures;
|
|
36
|
+
private monitorTimer;
|
|
37
|
+
private logger;
|
|
38
|
+
constructor(name: string, config?: Partial<CircuitBreakerConfig>);
|
|
39
|
+
/**
|
|
40
|
+
* 执行请求,自动处理熔断
|
|
41
|
+
* 返回 { success: true, result } 或 { success: false, error, rejected: true }
|
|
42
|
+
*/
|
|
43
|
+
execute<T>(operation: () => Promise<T>, fallback?: () => Promise<T>): Promise<{
|
|
44
|
+
success: boolean;
|
|
45
|
+
result?: T;
|
|
46
|
+
error?: Error;
|
|
47
|
+
rejected?: boolean;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* 手动记录成功
|
|
51
|
+
*/
|
|
52
|
+
recordSuccess(): void;
|
|
53
|
+
/**
|
|
54
|
+
* 手动记录失败
|
|
55
|
+
*/
|
|
56
|
+
recordFailure(): void;
|
|
57
|
+
/**
|
|
58
|
+
* 获取当前状态
|
|
59
|
+
*/
|
|
60
|
+
getState(): CircuitState;
|
|
61
|
+
/**
|
|
62
|
+
* 获取统计数据
|
|
63
|
+
*/
|
|
64
|
+
getStats(): CircuitBreakerStats;
|
|
65
|
+
/**
|
|
66
|
+
* 重置熔断器
|
|
67
|
+
*/
|
|
68
|
+
reset(): void;
|
|
69
|
+
/**
|
|
70
|
+
* 停止监控
|
|
71
|
+
*/
|
|
72
|
+
dispose(): void;
|
|
73
|
+
private transitionToOpen;
|
|
74
|
+
private transitionToHalfOpen;
|
|
75
|
+
private transitionToClosed;
|
|
76
|
+
private checkStateTransition;
|
|
77
|
+
private startMonitor;
|
|
78
|
+
}
|
|
79
|
+
export declare function getCircuitBreaker(name: string, config?: CircuitBreakerConfig): CircuitBreaker;
|
|
80
|
+
export declare function resetAllCircuitBreakers(): void;
|
|
81
|
+
export declare function disposeCircuitBreakers(): void;
|
|
82
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,oBAAY,YAAY;IACtB,MAAM,WAAW,CAAM,UAAU;IACjC,IAAI,SAAS,CAAU,UAAU;IACjC,SAAS,cAAc;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AASD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,MAAM,CAAe;gBAEjB,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAKhE;;;OAGG;IACG,OAAO,CAAC,CAAC,EACb,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAuC/E;;OAEG;IACH,aAAa,IAAI,IAAI;IAYrB;;OAEG;IACH,aAAa,IAAI,IAAI;IAerB;;OAEG;IACH,QAAQ,IAAI,YAAY;IAIxB;;OAEG;IACH,QAAQ,IAAI,mBAAmB;IAY/B;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,YAAY;CAQrB;AAsCD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,oBAAoB,GAAG,cAAc,CAE7F;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker 模块
|
|
3
|
+
* 版本: v4.0.0
|
|
4
|
+
*
|
|
5
|
+
* 熔断机制:连续失败超过阈值时暂停路由,防止雪崩
|
|
6
|
+
*/
|
|
7
|
+
import { getLogger } from "./logger.js";
|
|
8
|
+
export var CircuitState;
|
|
9
|
+
(function (CircuitState) {
|
|
10
|
+
CircuitState["CLOSED"] = "closed";
|
|
11
|
+
CircuitState["OPEN"] = "open";
|
|
12
|
+
CircuitState["HALF_OPEN"] = "half_open";
|
|
13
|
+
})(CircuitState || (CircuitState = {}));
|
|
14
|
+
const DEFAULT_CONFIG = {
|
|
15
|
+
failureThreshold: 5,
|
|
16
|
+
successThreshold: 3,
|
|
17
|
+
timeoutMs: 30000, // 30秒
|
|
18
|
+
monitorIntervalMs: 1000,
|
|
19
|
+
};
|
|
20
|
+
export class CircuitBreaker {
|
|
21
|
+
config;
|
|
22
|
+
state = CircuitState.CLOSED;
|
|
23
|
+
failures = 0;
|
|
24
|
+
successes = 0;
|
|
25
|
+
lastFailureTime = null;
|
|
26
|
+
lastSuccessTime = null;
|
|
27
|
+
totalRequests = 0;
|
|
28
|
+
totalFailures = 0;
|
|
29
|
+
monitorTimer = null;
|
|
30
|
+
logger = getLogger();
|
|
31
|
+
constructor(name, config) {
|
|
32
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
33
|
+
this.startMonitor(name);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 执行请求,自动处理熔断
|
|
37
|
+
* 返回 { success: true, result } 或 { success: false, error, rejected: true }
|
|
38
|
+
*/
|
|
39
|
+
async execute(operation, fallback) {
|
|
40
|
+
this.totalRequests++;
|
|
41
|
+
// 检查是否应该转换状态
|
|
42
|
+
this.checkStateTransition();
|
|
43
|
+
// OPEN 状态时拒绝请求
|
|
44
|
+
if (this.state === CircuitState.OPEN) {
|
|
45
|
+
this.logger.warn(`Circuit breaker OPEN, rejecting request`);
|
|
46
|
+
if (fallback) {
|
|
47
|
+
try {
|
|
48
|
+
const result = await fallback();
|
|
49
|
+
return { success: true, result };
|
|
50
|
+
}
|
|
51
|
+
catch (fbError) {
|
|
52
|
+
return { success: false, error: fbError, rejected: true };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
success: false,
|
|
57
|
+
error: new Error("Circuit breaker is open"),
|
|
58
|
+
rejected: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// HALF_OPEN 状态时只允许一个请求
|
|
62
|
+
// (通过 success/failure 计数来控制)
|
|
63
|
+
try {
|
|
64
|
+
const result = await operation();
|
|
65
|
+
this.recordSuccess();
|
|
66
|
+
return { success: true, result };
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
this.recordFailure();
|
|
70
|
+
return { success: false, error: error };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 手动记录成功
|
|
75
|
+
*/
|
|
76
|
+
recordSuccess() {
|
|
77
|
+
this.successes++;
|
|
78
|
+
this.lastSuccessTime = Date.now();
|
|
79
|
+
this.totalRequests++;
|
|
80
|
+
if (this.state === CircuitState.HALF_OPEN) {
|
|
81
|
+
if (this.successes >= this.config.successThreshold) {
|
|
82
|
+
this.transitionToClosed();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 手动记录失败
|
|
88
|
+
*/
|
|
89
|
+
recordFailure() {
|
|
90
|
+
this.failures++;
|
|
91
|
+
this.lastFailureTime = Date.now();
|
|
92
|
+
this.totalFailures++;
|
|
93
|
+
if (this.state === CircuitState.CLOSED) {
|
|
94
|
+
if (this.failures >= this.config.failureThreshold) {
|
|
95
|
+
this.transitionToOpen();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if (this.state === CircuitState.HALF_OPEN) {
|
|
99
|
+
// 半开状态失败,立即重新打开
|
|
100
|
+
this.transitionToOpen();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 获取当前状态
|
|
105
|
+
*/
|
|
106
|
+
getState() {
|
|
107
|
+
return this.state;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 获取统计数据
|
|
111
|
+
*/
|
|
112
|
+
getStats() {
|
|
113
|
+
return {
|
|
114
|
+
state: this.state,
|
|
115
|
+
failures: this.failures,
|
|
116
|
+
successes: this.successes,
|
|
117
|
+
lastFailureTime: this.lastFailureTime,
|
|
118
|
+
lastSuccessTime: this.lastSuccessTime,
|
|
119
|
+
totalRequests: this.totalRequests,
|
|
120
|
+
totalFailures: this.totalFailures,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 重置熔断器
|
|
125
|
+
*/
|
|
126
|
+
reset() {
|
|
127
|
+
this.transitionToClosed();
|
|
128
|
+
this.totalRequests = 0;
|
|
129
|
+
this.totalFailures = 0;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 停止监控
|
|
133
|
+
*/
|
|
134
|
+
dispose() {
|
|
135
|
+
if (this.monitorTimer) {
|
|
136
|
+
clearInterval(this.monitorTimer);
|
|
137
|
+
this.monitorTimer = null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
transitionToOpen() {
|
|
141
|
+
this.state = CircuitState.OPEN;
|
|
142
|
+
this.logger.warn(`Circuit breaker opened after ${this.failures} failures`);
|
|
143
|
+
}
|
|
144
|
+
transitionToHalfOpen() {
|
|
145
|
+
this.state = CircuitState.HALF_OPEN;
|
|
146
|
+
this.successes = 0;
|
|
147
|
+
this.logger.info(`Circuit breaker half-open`);
|
|
148
|
+
}
|
|
149
|
+
transitionToClosed() {
|
|
150
|
+
this.state = CircuitState.CLOSED;
|
|
151
|
+
this.failures = 0;
|
|
152
|
+
this.successes = 0;
|
|
153
|
+
this.logger.info(`Circuit breaker closed`);
|
|
154
|
+
}
|
|
155
|
+
checkStateTransition() {
|
|
156
|
+
if (this.state === CircuitState.OPEN) {
|
|
157
|
+
if (this.lastFailureTime) {
|
|
158
|
+
const elapsed = Date.now() - this.lastFailureTime;
|
|
159
|
+
if (elapsed >= this.config.timeoutMs) {
|
|
160
|
+
this.transitionToHalfOpen();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
startMonitor(name) {
|
|
166
|
+
// 定期记录状态
|
|
167
|
+
this.monitorTimer = setInterval(() => {
|
|
168
|
+
if (this.state !== CircuitState.CLOSED) {
|
|
169
|
+
this.logger.info(`Circuit breaker [${name}] state: ${this.state}`, this.getStats());
|
|
170
|
+
}
|
|
171
|
+
}, this.config.monitorIntervalMs * 10);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// 熔断器管理器
|
|
175
|
+
class CircuitBreakerManager {
|
|
176
|
+
breakers = new Map();
|
|
177
|
+
logger = getLogger();
|
|
178
|
+
get(name, config) {
|
|
179
|
+
if (!this.breakers.has(name)) {
|
|
180
|
+
this.breakers.set(name, new CircuitBreaker(name, config));
|
|
181
|
+
}
|
|
182
|
+
return this.breakers.get(name);
|
|
183
|
+
}
|
|
184
|
+
getAll() {
|
|
185
|
+
return new Map(this.breakers);
|
|
186
|
+
}
|
|
187
|
+
reset(name) {
|
|
188
|
+
if (name) {
|
|
189
|
+
this.breakers.get(name)?.reset();
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
for (const breaker of this.breakers.values()) {
|
|
193
|
+
breaker.reset();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
dispose() {
|
|
198
|
+
for (const breaker of this.breakers.values()) {
|
|
199
|
+
breaker.dispose();
|
|
200
|
+
}
|
|
201
|
+
this.breakers.clear();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const globalManager = new CircuitBreakerManager();
|
|
205
|
+
export function getCircuitBreaker(name, config) {
|
|
206
|
+
return globalManager.get(name, config);
|
|
207
|
+
}
|
|
208
|
+
export function resetAllCircuitBreakers() {
|
|
209
|
+
globalManager.reset();
|
|
210
|
+
}
|
|
211
|
+
export function disposeCircuitBreakers() {
|
|
212
|
+
globalManager.dispose();
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Tree 实现
|
|
3
|
+
* 版本: v4.0.0
|
|
4
|
+
*
|
|
5
|
+
* 全局共享上下文树,支持惰性加载,修复内存泄漏风险。
|
|
6
|
+
* 增量持久化:WAL(Write-Ahead Log)+ 定期 checkpoint + 批量写入
|
|
7
|
+
*/
|
|
8
|
+
import { ContextNode, NodeState, TaskStatus, ProgressStep } from "./types.js";
|
|
9
|
+
export declare class ContextTree {
|
|
10
|
+
private storagePath;
|
|
11
|
+
private root;
|
|
12
|
+
private loadedNodes;
|
|
13
|
+
private dirtyNodes;
|
|
14
|
+
private wal;
|
|
15
|
+
private walFlushTimer;
|
|
16
|
+
private writeCountSinceCheckpoint;
|
|
17
|
+
private pendingWrites;
|
|
18
|
+
constructor(storagePath?: string);
|
|
19
|
+
private startWalFlushTimer;
|
|
20
|
+
private stopWalFlushTimer;
|
|
21
|
+
/**
|
|
22
|
+
* 刷新 WAL 到磁盘(增量写)
|
|
23
|
+
*/
|
|
24
|
+
private flushWal;
|
|
25
|
+
/**
|
|
26
|
+
* 执行全量 checkpoint(合并 WAL 到主文件)
|
|
27
|
+
*/
|
|
28
|
+
private performCheckpoint;
|
|
29
|
+
/**
|
|
30
|
+
* 从 checkpoint 恢复
|
|
31
|
+
*/
|
|
32
|
+
private restoreFromCheckpoint;
|
|
33
|
+
/**
|
|
34
|
+
* 将待写入操作加入 pending WAL(用于批量合并)
|
|
35
|
+
*/
|
|
36
|
+
private queueWalEntry;
|
|
37
|
+
/**
|
|
38
|
+
* 标记节点为脏
|
|
39
|
+
*/
|
|
40
|
+
private markDirty;
|
|
41
|
+
/**
|
|
42
|
+
* 移除脏标记
|
|
43
|
+
*/
|
|
44
|
+
private clearDirty;
|
|
45
|
+
private createRoot;
|
|
46
|
+
private load;
|
|
47
|
+
/**
|
|
48
|
+
* 应用 WAL 条目到内存树
|
|
49
|
+
*/
|
|
50
|
+
private applyWalEntries;
|
|
51
|
+
private isMemoryMode;
|
|
52
|
+
/**
|
|
53
|
+
* 增量保存(仅保存脏节点,不保存整个树)
|
|
54
|
+
* 注意:为了兼容性,仍然提供全量保存方法 saveFull()
|
|
55
|
+
*/
|
|
56
|
+
save(): void;
|
|
57
|
+
/**
|
|
58
|
+
* 全量保存(强制保存整个树,用于 shutdown 等场景)
|
|
59
|
+
*/
|
|
60
|
+
saveFull(): void;
|
|
61
|
+
private findNode;
|
|
62
|
+
getNode(nodeId: string): ContextNode | null;
|
|
63
|
+
getTopic(topicId: string): ContextNode | null;
|
|
64
|
+
getActiveTopics(): ContextNode[];
|
|
65
|
+
getTasks(topicId: string): ContextNode[];
|
|
66
|
+
getArtifacts(taskId: string): ContextNode[];
|
|
67
|
+
getArtifact(artifactId: string): ContextNode | null;
|
|
68
|
+
getMessages(topicId: string): ContextNode[];
|
|
69
|
+
addTopic(topicId: string, label: string): ContextNode;
|
|
70
|
+
addTask(topicId: string, taskId: string, agent: string, taskDesc: string): ContextNode;
|
|
71
|
+
addArtifact(taskId: string, artifactId: string, artifactData: Record<string, unknown>): ContextNode;
|
|
72
|
+
addMessage(topicId: string, messageId: string, role: string, content: string, contextAnnotation?: Record<string, unknown>): ContextNode;
|
|
73
|
+
updateTopicState(topicId: string, state: NodeState, updates?: Partial<ContextNode>): void;
|
|
74
|
+
updateTaskState(taskId: string, state: NodeState, updates?: Partial<ContextNode> & {
|
|
75
|
+
task_status?: TaskStatus;
|
|
76
|
+
}): void;
|
|
77
|
+
addProgressStep(taskId: string, step: ProgressStep): void;
|
|
78
|
+
findTasksByState(state: NodeState): ContextNode[];
|
|
79
|
+
private findTasksRecursive;
|
|
80
|
+
findTopicsByState(state: NodeState): ContextNode[];
|
|
81
|
+
getStats(): {
|
|
82
|
+
topics: number;
|
|
83
|
+
tasks: number;
|
|
84
|
+
activeTopics: number;
|
|
85
|
+
activeTasks: number;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* 销毁实例(清理定时器,强制刷盘)
|
|
89
|
+
*/
|
|
90
|
+
dispose(): void;
|
|
91
|
+
}
|
|
92
|
+
export declare function getContextTree(storagePath?: string): ContextTree;
|
|
93
|
+
export declare function resetContextTree(): void;
|
|
94
|
+
//# sourceMappingURL=context-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-tree.d.ts","sourceRoot":"","sources":["../src/context-tree.ts"],"names":[],"mappings":"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"}
|