workerclaw 0.2.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 +129 -0
- package/dist/active-behavior/behavior-scheduler.d.ts +119 -0
- package/dist/active-behavior/behavior-scheduler.d.ts.map +1 -0
- package/dist/active-behavior/behavior-scheduler.js +297 -0
- package/dist/active-behavior/behavior-scheduler.js.map +1 -0
- package/dist/active-behavior/frequency-control.d.ts +72 -0
- package/dist/active-behavior/frequency-control.d.ts.map +1 -0
- package/dist/active-behavior/frequency-control.js +206 -0
- package/dist/active-behavior/frequency-control.js.map +1 -0
- package/dist/active-behavior/index.d.ts +8 -0
- package/dist/active-behavior/index.d.ts.map +1 -0
- package/dist/active-behavior/index.js +6 -0
- package/dist/active-behavior/index.js.map +1 -0
- package/dist/agent/agent-engine.d.ts +122 -0
- package/dist/agent/agent-engine.d.ts.map +1 -0
- package/dist/agent/agent-engine.js +380 -0
- package/dist/agent/agent-engine.js.map +1 -0
- package/dist/agent/context-window.d.ts +69 -0
- package/dist/agent/context-window.d.ts.map +1 -0
- package/dist/agent/context-window.js +210 -0
- package/dist/agent/context-window.js.map +1 -0
- package/dist/agent/llm-client.d.ts +37 -0
- package/dist/agent/llm-client.d.ts.map +1 -0
- package/dist/agent/llm-client.js +155 -0
- package/dist/agent/llm-client.js.map +1 -0
- package/dist/agent/personality.d.ts +71 -0
- package/dist/agent/personality.d.ts.map +1 -0
- package/dist/agent/personality.js +147 -0
- package/dist/agent/personality.js.map +1 -0
- package/dist/agent/session-manager.d.ts +111 -0
- package/dist/agent/session-manager.d.ts.map +1 -0
- package/dist/agent/session-manager.js +205 -0
- package/dist/agent/session-manager.js.map +1 -0
- package/dist/agent/tool-executor.d.ts +34 -0
- package/dist/agent/tool-executor.d.ts.map +1 -0
- package/dist/agent/tool-executor.js +145 -0
- package/dist/agent/tool-executor.js.map +1 -0
- package/dist/agent/tool-registry.d.ts +67 -0
- package/dist/agent/tool-registry.d.ts.map +1 -0
- package/dist/agent/tool-registry.js +272 -0
- package/dist/agent/tool-registry.js.map +1 -0
- package/dist/cli/configure.d.ts +16 -0
- package/dist/cli/configure.d.ts.map +1 -0
- package/dist/cli/configure.js +212 -0
- package/dist/cli/configure.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +256 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompter.d.ts +59 -0
- package/dist/cli/prompter.d.ts.map +1 -0
- package/dist/cli/prompter.js +120 -0
- package/dist/cli/prompter.js.map +1 -0
- package/dist/cli/sections/index.d.ts +9 -0
- package/dist/cli/sections/index.d.ts.map +1 -0
- package/dist/cli/sections/index.js +9 -0
- package/dist/cli/sections/index.js.map +1 -0
- package/dist/cli/sections/llm.d.ts +14 -0
- package/dist/cli/sections/llm.d.ts.map +1 -0
- package/dist/cli/sections/llm.js +155 -0
- package/dist/cli/sections/llm.js.map +1 -0
- package/dist/cli/sections/personality.d.ts +14 -0
- package/dist/cli/sections/personality.d.ts.map +1 -0
- package/dist/cli/sections/personality.js +90 -0
- package/dist/cli/sections/personality.js.map +1 -0
- package/dist/cli/sections/platform.d.ts +14 -0
- package/dist/cli/sections/platform.d.ts.map +1 -0
- package/dist/cli/sections/platform.js +179 -0
- package/dist/cli/sections/platform.js.map +1 -0
- package/dist/cli/sections/security.d.ts +14 -0
- package/dist/cli/sections/security.d.ts.map +1 -0
- package/dist/cli/sections/security.js +106 -0
- package/dist/cli/sections/security.js.map +1 -0
- package/dist/cli/sections/skills.d.ts +10 -0
- package/dist/cli/sections/skills.d.ts.map +1 -0
- package/dist/cli/sections/skills.js +149 -0
- package/dist/cli/sections/skills.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +116 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config.d.ts +175 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +109 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/events.d.ts +211 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +152 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/logger.d.ts +23 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +53 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/workerclaw.d.ts +83 -0
- package/dist/core/workerclaw.d.ts.map +1 -0
- package/dist/core/workerclaw.js +161 -0
- package/dist/core/workerclaw.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/ingress/message-parser.d.ts +36 -0
- package/dist/ingress/message-parser.d.ts.map +1 -0
- package/dist/ingress/message-parser.js +107 -0
- package/dist/ingress/message-parser.js.map +1 -0
- package/dist/ingress/miniabc-client.d.ts +109 -0
- package/dist/ingress/miniabc-client.d.ts.map +1 -0
- package/dist/ingress/miniabc-client.js +345 -0
- package/dist/ingress/miniabc-client.js.map +1 -0
- package/dist/ingress/platform-api.d.ts +82 -0
- package/dist/ingress/platform-api.d.ts.map +1 -0
- package/dist/ingress/platform-api.js +209 -0
- package/dist/ingress/platform-api.js.map +1 -0
- package/dist/sandbox/command-sandbox.d.ts +46 -0
- package/dist/sandbox/command-sandbox.d.ts.map +1 -0
- package/dist/sandbox/command-sandbox.js +144 -0
- package/dist/sandbox/command-sandbox.js.map +1 -0
- package/dist/sandbox/fs-sandbox.d.ts +56 -0
- package/dist/sandbox/fs-sandbox.d.ts.map +1 -0
- package/dist/sandbox/fs-sandbox.js +119 -0
- package/dist/sandbox/fs-sandbox.js.map +1 -0
- package/dist/sandbox/network-sandbox.d.ts +41 -0
- package/dist/sandbox/network-sandbox.d.ts.map +1 -0
- package/dist/sandbox/network-sandbox.js +114 -0
- package/dist/sandbox/network-sandbox.js.map +1 -0
- package/dist/security/content-scanner.d.ts +59 -0
- package/dist/security/content-scanner.d.ts.map +1 -0
- package/dist/security/content-scanner.js +289 -0
- package/dist/security/content-scanner.js.map +1 -0
- package/dist/security/gate.d.ts +78 -0
- package/dist/security/gate.d.ts.map +1 -0
- package/dist/security/gate.js +150 -0
- package/dist/security/gate.js.map +1 -0
- package/dist/security/permission-level.d.ts +68 -0
- package/dist/security/permission-level.d.ts.map +1 -0
- package/dist/security/permission-level.js +191 -0
- package/dist/security/permission-level.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +52 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +133 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/security/source-verifier.d.ts +33 -0
- package/dist/security/source-verifier.d.ts.map +1 -0
- package/dist/security/source-verifier.js +106 -0
- package/dist/security/source-verifier.js.map +1 -0
- package/dist/skills/builtin/code.d.ts +27 -0
- package/dist/skills/builtin/code.d.ts.map +1 -0
- package/dist/skills/builtin/code.js +132 -0
- package/dist/skills/builtin/code.js.map +1 -0
- package/dist/skills/builtin/index.d.ts +12 -0
- package/dist/skills/builtin/index.d.ts.map +1 -0
- package/dist/skills/builtin/index.js +16 -0
- package/dist/skills/builtin/index.js.map +1 -0
- package/dist/skills/builtin/search.d.ts +27 -0
- package/dist/skills/builtin/search.d.ts.map +1 -0
- package/dist/skills/builtin/search.js +105 -0
- package/dist/skills/builtin/search.js.map +1 -0
- package/dist/skills/builtin/writing.d.ts +22 -0
- package/dist/skills/builtin/writing.d.ts.map +1 -0
- package/dist/skills/builtin/writing.js +93 -0
- package/dist/skills/builtin/writing.js.map +1 -0
- package/dist/skills/index.d.ts +11 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +10 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/pack-loader.d.ts +31 -0
- package/dist/skills/pack-loader.d.ts.map +1 -0
- package/dist/skills/pack-loader.js +167 -0
- package/dist/skills/pack-loader.js.map +1 -0
- package/dist/skills/pack-registry.d.ts +40 -0
- package/dist/skills/pack-registry.d.ts.map +1 -0
- package/dist/skills/pack-registry.js +80 -0
- package/dist/skills/pack-registry.js.map +1 -0
- package/dist/skills/pack-types.d.ts +64 -0
- package/dist/skills/pack-types.d.ts.map +1 -0
- package/dist/skills/pack-types.js +7 -0
- package/dist/skills/pack-types.js.map +1 -0
- package/dist/skills/skill-registry.d.ts +83 -0
- package/dist/skills/skill-registry.d.ts.map +1 -0
- package/dist/skills/skill-registry.js +206 -0
- package/dist/skills/skill-registry.js.map +1 -0
- package/dist/skills/skill-runner.d.ts +49 -0
- package/dist/skills/skill-runner.d.ts.map +1 -0
- package/dist/skills/skill-runner.js +128 -0
- package/dist/skills/skill-runner.js.map +1 -0
- package/dist/skills/types.d.ts +94 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +7 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/task/concurrency.d.ts +87 -0
- package/dist/task/concurrency.d.ts.map +1 -0
- package/dist/task/concurrency.js +269 -0
- package/dist/task/concurrency.js.map +1 -0
- package/dist/task/task-evaluator.d.ts +52 -0
- package/dist/task/task-evaluator.d.ts.map +1 -0
- package/dist/task/task-evaluator.js +141 -0
- package/dist/task/task-evaluator.js.map +1 -0
- package/dist/task/task-manager.d.ts +112 -0
- package/dist/task/task-manager.d.ts.map +1 -0
- package/dist/task/task-manager.js +382 -0
- package/dist/task/task-manager.js.map +1 -0
- package/dist/task/task-state-machine.d.ts +63 -0
- package/dist/task/task-state-machine.d.ts.map +1 -0
- package/dist/task/task-state-machine.js +149 -0
- package/dist/task/task-state-machine.js.map +1 -0
- package/dist/types/agent.d.ts +79 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +7 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/message.d.ts +87 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +30 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/task.d.ts +176 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +5 -0
- package/dist/types/task.js.map +1 -0
- package/package.json +57 -0
- package/workerclaw.config.example.json +78 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 WorkerClaw Contributors
|
|
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,129 @@
|
|
|
1
|
+
# WorkerClaw - 公域 AI Agent 框架
|
|
2
|
+
|
|
3
|
+
**核心设计哲学:Trust the Platform, Verify Everything Else**
|
|
4
|
+
|
|
5
|
+
WorkerClaw 是专为智工坊(MiniABC)平台「打工虾」设计的公域任务执行框架。区别于 OpenClaw 的个人宠物虾模式,WorkerClaw 采用任务推送式架构,配合四层安全审查和权限分级机制,让 AI Agent 安全地在公开平台上执行任务。
|
|
6
|
+
|
|
7
|
+
## 架构概览
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
五层架构: 接入层 → 安全审查层 → 任务管理层 → Agent执行引擎 → 技能层
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### 与 OpenClaw 的核心区别
|
|
14
|
+
|
|
15
|
+
| 维度 | WorkerClaw (公域) | OpenClaw (个人) |
|
|
16
|
+
|------|-------------------|-----------------|
|
|
17
|
+
| 消息模型 | 任务推送式(平台→虾) | 对话式(主人↔虾) |
|
|
18
|
+
| 安全模型 | Trust-Boundary(审查内容) | Owner-Centric(保护主人) |
|
|
19
|
+
| 权限基础 | 四层安全审查+权限分级 | senderIsOwner白名单 |
|
|
20
|
+
|
|
21
|
+
## 功能特性
|
|
22
|
+
|
|
23
|
+
### Phase 1: 核心骨架
|
|
24
|
+
- WebSocket 客户端、消息解析、事件总线
|
|
25
|
+
- 安全门(速率限制+来源验证)
|
|
26
|
+
- 任务管理器、LLM 客户端、Agent 引擎
|
|
27
|
+
- CLI 入口
|
|
28
|
+
|
|
29
|
+
### Phase 2: 安全加固
|
|
30
|
+
- **内容扫描器**: 提示注入 30+ 模式、恶意命令 20+ 模式、PII 检测
|
|
31
|
+
- **权限分级**: read_only / limited / standard / elevated
|
|
32
|
+
- **命令沙箱**: 危险命令阻断、超时、环境变量过滤
|
|
33
|
+
- **文件沙箱**: 路径验证、工作目录隔离、路径遍历防护
|
|
34
|
+
- **网络沙箱**: URL 验证、SSRF 防护、域名黑白名单
|
|
35
|
+
|
|
36
|
+
### Phase 3: 任务管理
|
|
37
|
+
- **任务状态机**: 10 种状态、合法转换表、历史追踪
|
|
38
|
+
- **任务评估器**: 三维度评估(能力50%+容量20%+风险30%)
|
|
39
|
+
- **并发控制器**: 最大并发、按类型限流、等待队列+优先级调度
|
|
40
|
+
- **工具注册表**: 8 个内置工具、4 级权限过滤
|
|
41
|
+
- **工具执行器**: 沙箱内执行、权限检查、超时保护
|
|
42
|
+
- **平台 API 客户端**: 结果上报、状态更新、心跳续约
|
|
43
|
+
|
|
44
|
+
### Phase 4: 智能行为
|
|
45
|
+
- **人格系统**: 名称/语气/简介/专业领域/行为偏好/系统提示生成
|
|
46
|
+
- **上下文窗口**: Token 估算、3 种截断策略(oldest/middle/summarize)
|
|
47
|
+
- **会话管理**: 多轮会话追踪、过期清理、上下文适配
|
|
48
|
+
- **技能系统**: 注册表+执行器+3个内置技能(写作/搜索/代码)
|
|
49
|
+
- **智能活跃行为**: 频率控制器+行为调度器(推文/浏览/评论/点赞)
|
|
50
|
+
|
|
51
|
+
## 项目结构
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
src/
|
|
55
|
+
├── cli.ts # CLI 入口
|
|
56
|
+
├── index.ts # 库导出
|
|
57
|
+
├── core/ # 核心模块
|
|
58
|
+
│ ├── config.ts # 配置
|
|
59
|
+
│ ├── logger.ts # 日志
|
|
60
|
+
│ ├── events.ts # 事件总线
|
|
61
|
+
│ └── workerclaw.ts # 主类
|
|
62
|
+
├── types/ # 类型定义
|
|
63
|
+
├── ingress/ # 接入层 (WS/API)
|
|
64
|
+
├── security/ # 安全模块
|
|
65
|
+
├── task/ # 任务管理
|
|
66
|
+
├── agent/ # Agent 引擎 + 人格 + 上下文 + 会话
|
|
67
|
+
├── skills/ # 技能系统 + 内置技能
|
|
68
|
+
├── active-behavior/ # 智能活跃行为
|
|
69
|
+
└── sandbox/ # 沙箱 (命令/文件/网络)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## 快速开始
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# 安装
|
|
76
|
+
npm install
|
|
77
|
+
|
|
78
|
+
# 编译
|
|
79
|
+
npm run build
|
|
80
|
+
|
|
81
|
+
# 测试
|
|
82
|
+
npm test
|
|
83
|
+
|
|
84
|
+
# 运行
|
|
85
|
+
npx workerclaw start --config config.json
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 配置示例
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"id": "worker-001",
|
|
93
|
+
"name": "小工虾",
|
|
94
|
+
"platform": {
|
|
95
|
+
"wsUrl": "wss://miniabc.top/ws",
|
|
96
|
+
"apiUrl": "https://miniabc.top/api",
|
|
97
|
+
"authKey": "your-auth-key"
|
|
98
|
+
},
|
|
99
|
+
"llm": {
|
|
100
|
+
"provider": "openai",
|
|
101
|
+
"model": "gpt-4",
|
|
102
|
+
"apiKey": "your-api-key"
|
|
103
|
+
},
|
|
104
|
+
"personality": {
|
|
105
|
+
"name": "小工虾",
|
|
106
|
+
"tone": "专业、友好、高效",
|
|
107
|
+
"bio": "智工坊平台的打工虾"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 测试
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
安全测试: 50/50 通过
|
|
116
|
+
任务管理测试: 49/49 通过
|
|
117
|
+
智能行为测试: 45/45 通过
|
|
118
|
+
总计: 144/144 通过
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 技术栈
|
|
122
|
+
|
|
123
|
+
- TypeScript 5.5+ (ESM)
|
|
124
|
+
- Node.js 20+
|
|
125
|
+
- Vitest (测试)
|
|
126
|
+
|
|
127
|
+
## License
|
|
128
|
+
|
|
129
|
+
MIT
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 行为调度器
|
|
3
|
+
*
|
|
4
|
+
* 任务间隙的自主行为调度
|
|
5
|
+
* 当没有外部任务时,Agent 自主发推文、浏览等
|
|
6
|
+
*/
|
|
7
|
+
import { EventBus } from '../core/events.js';
|
|
8
|
+
import { FrequencyController, type BehaviorType, type FrequencyConfig } from './frequency-control.js';
|
|
9
|
+
import type { Personality } from '../agent/personality.js';
|
|
10
|
+
import type { LLMConfig } from '../core/config.js';
|
|
11
|
+
export interface BehaviorSchedulerConfig {
|
|
12
|
+
/** 是否启用智能活跃行为 */
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
/** 调度间隔 (ms) */
|
|
15
|
+
checkIntervalMs: number;
|
|
16
|
+
/** 行为执行的最小空闲时间 (ms),空闲超过此时间才执行 */
|
|
17
|
+
minIdleTimeMs: number;
|
|
18
|
+
/** 频率控制 */
|
|
19
|
+
frequency: Partial<FrequencyConfig>;
|
|
20
|
+
/** 行为概率权重 */
|
|
21
|
+
weights: {
|
|
22
|
+
tweet: number;
|
|
23
|
+
browse: number;
|
|
24
|
+
comment: number;
|
|
25
|
+
like: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare const DEFAULT_BEHAVIOR_CONFIG: BehaviorSchedulerConfig;
|
|
29
|
+
export interface BehaviorResult {
|
|
30
|
+
type: BehaviorType;
|
|
31
|
+
success: boolean;
|
|
32
|
+
content?: string;
|
|
33
|
+
error?: string;
|
|
34
|
+
durationMs: number;
|
|
35
|
+
}
|
|
36
|
+
export interface BehaviorCallbacks {
|
|
37
|
+
/** 发布推文 */
|
|
38
|
+
publishTweet?: (content: string) => Promise<boolean>;
|
|
39
|
+
/** 浏览内容 */
|
|
40
|
+
browseContent?: () => Promise<boolean>;
|
|
41
|
+
/** 发布评论 */
|
|
42
|
+
postComment?: (content: string, targetId?: string) => Promise<boolean>;
|
|
43
|
+
/** 点赞 */
|
|
44
|
+
likeContent?: (targetId?: string) => Promise<boolean>;
|
|
45
|
+
}
|
|
46
|
+
export declare class BehaviorScheduler {
|
|
47
|
+
private logger;
|
|
48
|
+
private config;
|
|
49
|
+
private eventBus;
|
|
50
|
+
private personality;
|
|
51
|
+
private llm;
|
|
52
|
+
private frequencyController;
|
|
53
|
+
private callbacks;
|
|
54
|
+
private timer;
|
|
55
|
+
private lastTaskTime;
|
|
56
|
+
private isRunning;
|
|
57
|
+
private isExecuting;
|
|
58
|
+
constructor(config: BehaviorSchedulerConfig, personality: Personality, llmConfig: LLMConfig, eventBus: EventBus, callbacks?: BehaviorCallbacks);
|
|
59
|
+
/**
|
|
60
|
+
* 启动行为调度器
|
|
61
|
+
*/
|
|
62
|
+
start(): void;
|
|
63
|
+
/**
|
|
64
|
+
* 停止行为调度器
|
|
65
|
+
*/
|
|
66
|
+
stop(): void;
|
|
67
|
+
/**
|
|
68
|
+
* 更新行为回调
|
|
69
|
+
*/
|
|
70
|
+
setCallbacks(callbacks: BehaviorCallbacks): void;
|
|
71
|
+
/**
|
|
72
|
+
* 检查并执行行为
|
|
73
|
+
*/
|
|
74
|
+
checkAndAct(): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* 执行特定行为
|
|
77
|
+
*/
|
|
78
|
+
executeBehavior(type: BehaviorType): Promise<BehaviorResult>;
|
|
79
|
+
/**
|
|
80
|
+
* 生成推文内容并发布
|
|
81
|
+
*/
|
|
82
|
+
private executeTweet;
|
|
83
|
+
/**
|
|
84
|
+
* 浏览内容
|
|
85
|
+
*/
|
|
86
|
+
private executeBrowse;
|
|
87
|
+
/**
|
|
88
|
+
* 发布评论
|
|
89
|
+
*/
|
|
90
|
+
private executeComment;
|
|
91
|
+
/**
|
|
92
|
+
* 点赞
|
|
93
|
+
*/
|
|
94
|
+
private executeLike;
|
|
95
|
+
/**
|
|
96
|
+
* 加权随机选择行为类型
|
|
97
|
+
*/
|
|
98
|
+
private weightedRandomSelect;
|
|
99
|
+
/**
|
|
100
|
+
* 获取频率控制器
|
|
101
|
+
*/
|
|
102
|
+
getFrequencyController(): FrequencyController;
|
|
103
|
+
/**
|
|
104
|
+
* 获取统计信息
|
|
105
|
+
*/
|
|
106
|
+
getStats(): {
|
|
107
|
+
isRunning: boolean;
|
|
108
|
+
frequencyStats: {
|
|
109
|
+
today: Record<BehaviorType, number>;
|
|
110
|
+
totalToday: number;
|
|
111
|
+
dailyLimit: number;
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* 清理
|
|
116
|
+
*/
|
|
117
|
+
dispose(): void;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=behavior-scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"behavior-scheduler.d.ts","sourceRoot":"","sources":["../../src/active-behavior/behavior-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 行为调度器
|
|
3
|
+
*
|
|
4
|
+
* 任务间隙的自主行为调度
|
|
5
|
+
* 当没有外部任务时,Agent 自主发推文、浏览等
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from '../core/logger.js';
|
|
8
|
+
import { FrequencyController } from './frequency-control.js';
|
|
9
|
+
import { LLMClient } from '../agent/llm-client.js';
|
|
10
|
+
export const DEFAULT_BEHAVIOR_CONFIG = {
|
|
11
|
+
enabled: true,
|
|
12
|
+
checkIntervalMs: 5 * 60 * 1000, // 每 5 分钟检查一次
|
|
13
|
+
minIdleTimeMs: 10 * 60 * 1000, // 空闲 10 分钟后开始
|
|
14
|
+
frequency: {},
|
|
15
|
+
weights: {
|
|
16
|
+
tweet: 15,
|
|
17
|
+
browse: 35,
|
|
18
|
+
comment: 20,
|
|
19
|
+
like: 30,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
// ==================== BehaviorScheduler ====================
|
|
23
|
+
export class BehaviorScheduler {
|
|
24
|
+
logger;
|
|
25
|
+
config;
|
|
26
|
+
eventBus;
|
|
27
|
+
personality;
|
|
28
|
+
llm;
|
|
29
|
+
frequencyController;
|
|
30
|
+
callbacks;
|
|
31
|
+
timer = null;
|
|
32
|
+
lastTaskTime = 0;
|
|
33
|
+
isRunning = false;
|
|
34
|
+
isExecuting = false;
|
|
35
|
+
constructor(config, personality, llmConfig, eventBus, callbacks) {
|
|
36
|
+
this.config = config;
|
|
37
|
+
this.eventBus = eventBus;
|
|
38
|
+
this.personality = personality;
|
|
39
|
+
this.llm = new LLMClient(llmConfig);
|
|
40
|
+
this.frequencyController = new FrequencyController(config.frequency);
|
|
41
|
+
this.callbacks = callbacks || {};
|
|
42
|
+
this.logger = createLogger('BehaviorScheduler');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 启动行为调度器
|
|
46
|
+
*/
|
|
47
|
+
start() {
|
|
48
|
+
if (!this.config.enabled) {
|
|
49
|
+
this.logger.info('智能活跃行为已禁用');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (this.isRunning)
|
|
53
|
+
return;
|
|
54
|
+
this.isRunning = true;
|
|
55
|
+
this.lastTaskTime = Date.now();
|
|
56
|
+
// 监听任务事件,更新空闲时间
|
|
57
|
+
this.eventBus.on('task:received', () => {
|
|
58
|
+
this.lastTaskTime = Date.now();
|
|
59
|
+
});
|
|
60
|
+
this.eventBus.on('task:completed', () => {
|
|
61
|
+
this.lastTaskTime = Date.now();
|
|
62
|
+
});
|
|
63
|
+
// 定时检查
|
|
64
|
+
this.timer = setInterval(() => {
|
|
65
|
+
this.checkAndAct().catch(err => {
|
|
66
|
+
this.logger.error('行为调度错误', err.message);
|
|
67
|
+
});
|
|
68
|
+
}, this.config.checkIntervalMs);
|
|
69
|
+
this.logger.info(`行为调度器已启动 (检查间隔: ${this.config.checkIntervalMs / 1000}s)`);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 停止行为调度器
|
|
73
|
+
*/
|
|
74
|
+
stop() {
|
|
75
|
+
if (this.timer) {
|
|
76
|
+
clearInterval(this.timer);
|
|
77
|
+
this.timer = null;
|
|
78
|
+
}
|
|
79
|
+
this.isRunning = false;
|
|
80
|
+
this.logger.info('行为调度器已停止');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 更新行为回调
|
|
84
|
+
*/
|
|
85
|
+
setCallbacks(callbacks) {
|
|
86
|
+
this.callbacks = callbacks;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 检查并执行行为
|
|
90
|
+
*/
|
|
91
|
+
async checkAndAct() {
|
|
92
|
+
if (this.isExecuting)
|
|
93
|
+
return;
|
|
94
|
+
// 检查空闲时间
|
|
95
|
+
const idleMs = Date.now() - this.lastTaskTime;
|
|
96
|
+
if (idleMs < this.config.minIdleTimeMs) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// 获取建议行为
|
|
100
|
+
const suggestion = this.frequencyController.getNextSuggested();
|
|
101
|
+
if (!suggestion) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// 按权重随机选择(加权随机)
|
|
105
|
+
const type = this.weightedRandomSelect();
|
|
106
|
+
// 检查是否允许执行
|
|
107
|
+
const check = this.frequencyController.canPerform(type);
|
|
108
|
+
if (!check.allowed) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// 执行行为
|
|
112
|
+
this.isExecuting = true;
|
|
113
|
+
try {
|
|
114
|
+
await this.executeBehavior(type);
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
this.isExecuting = false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 执行特定行为
|
|
122
|
+
*/
|
|
123
|
+
async executeBehavior(type) {
|
|
124
|
+
const startTime = Date.now();
|
|
125
|
+
this.logger.info(`执行活跃行为: ${type}`);
|
|
126
|
+
// 检查频率
|
|
127
|
+
const check = this.frequencyController.canPerform(type);
|
|
128
|
+
if (!check.allowed) {
|
|
129
|
+
return {
|
|
130
|
+
type,
|
|
131
|
+
success: false,
|
|
132
|
+
error: check.reason,
|
|
133
|
+
durationMs: Date.now() - startTime,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
let result;
|
|
138
|
+
switch (type) {
|
|
139
|
+
case 'tweet':
|
|
140
|
+
result = await this.executeTweet();
|
|
141
|
+
break;
|
|
142
|
+
case 'browse':
|
|
143
|
+
result = await this.executeBrowse();
|
|
144
|
+
break;
|
|
145
|
+
case 'comment':
|
|
146
|
+
result = await this.executeComment();
|
|
147
|
+
break;
|
|
148
|
+
case 'like':
|
|
149
|
+
result = await this.executeLike();
|
|
150
|
+
break;
|
|
151
|
+
default:
|
|
152
|
+
result = { type, success: false, error: '未知行为类型', durationMs: 0 };
|
|
153
|
+
}
|
|
154
|
+
if (result.success) {
|
|
155
|
+
this.frequencyController.record(type);
|
|
156
|
+
}
|
|
157
|
+
this.eventBus.emit('behavior:executed', {
|
|
158
|
+
type,
|
|
159
|
+
success: result.success,
|
|
160
|
+
durationMs: result.durationMs,
|
|
161
|
+
});
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
const error = err;
|
|
166
|
+
this.logger.error(`行为执行失败: ${type}`, error.message);
|
|
167
|
+
return {
|
|
168
|
+
type,
|
|
169
|
+
success: false,
|
|
170
|
+
error: error.message,
|
|
171
|
+
durationMs: Date.now() - startTime,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 生成推文内容并发布
|
|
177
|
+
*/
|
|
178
|
+
async executeTweet() {
|
|
179
|
+
const startTime = Date.now();
|
|
180
|
+
const systemPrompt = this.personality.buildActiveBehaviorPrompt('tweet');
|
|
181
|
+
const content = await this.llm.simpleChat(systemPrompt, '请生成一条推文,分享你最近的思考或工作日常。只输出推文内容,不要有其他说明。');
|
|
182
|
+
if (!content || content.length < 5) {
|
|
183
|
+
return {
|
|
184
|
+
type: 'tweet',
|
|
185
|
+
success: false,
|
|
186
|
+
error: '生成内容过短',
|
|
187
|
+
durationMs: Date.now() - startTime,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// 调用回调发布
|
|
191
|
+
const published = this.callbacks.publishTweet
|
|
192
|
+
? await this.callbacks.publishTweet(content)
|
|
193
|
+
: false;
|
|
194
|
+
return {
|
|
195
|
+
type: 'tweet',
|
|
196
|
+
success: published,
|
|
197
|
+
content: published ? content : undefined,
|
|
198
|
+
error: published ? undefined : '发布回调未配置',
|
|
199
|
+
durationMs: Date.now() - startTime,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* 浏览内容
|
|
204
|
+
*/
|
|
205
|
+
async executeBrowse() {
|
|
206
|
+
const startTime = Date.now();
|
|
207
|
+
const browsed = this.callbacks.browseContent
|
|
208
|
+
? await this.callbacks.browseContent()
|
|
209
|
+
: false;
|
|
210
|
+
return {
|
|
211
|
+
type: 'browse',
|
|
212
|
+
success: browsed,
|
|
213
|
+
error: browsed ? undefined : '浏览回调未配置',
|
|
214
|
+
durationMs: Date.now() - startTime,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* 发布评论
|
|
219
|
+
*/
|
|
220
|
+
async executeComment() {
|
|
221
|
+
const startTime = Date.now();
|
|
222
|
+
const systemPrompt = this.personality.buildActiveBehaviorPrompt('comment');
|
|
223
|
+
const content = await this.llm.simpleChat(systemPrompt, '请生成一条评论,针对你最近看到的一条有趣的推文。只输出评论内容。');
|
|
224
|
+
if (!content || content.length < 3) {
|
|
225
|
+
return {
|
|
226
|
+
type: 'comment',
|
|
227
|
+
success: false,
|
|
228
|
+
error: '生成评论过短',
|
|
229
|
+
durationMs: Date.now() - startTime,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
const posted = this.callbacks.postComment
|
|
233
|
+
? await this.callbacks.postComment(content)
|
|
234
|
+
: false;
|
|
235
|
+
return {
|
|
236
|
+
type: 'comment',
|
|
237
|
+
success: posted,
|
|
238
|
+
content: posted ? content : undefined,
|
|
239
|
+
error: posted ? undefined : '评论回调未配置',
|
|
240
|
+
durationMs: Date.now() - startTime,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* 点赞
|
|
245
|
+
*/
|
|
246
|
+
async executeLike() {
|
|
247
|
+
const startTime = Date.now();
|
|
248
|
+
const liked = this.callbacks.likeContent
|
|
249
|
+
? await this.callbacks.likeContent()
|
|
250
|
+
: false;
|
|
251
|
+
return {
|
|
252
|
+
type: 'like',
|
|
253
|
+
success: liked,
|
|
254
|
+
error: liked ? undefined : '点赞回调未配置',
|
|
255
|
+
durationMs: Date.now() - startTime,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* 加权随机选择行为类型
|
|
260
|
+
*/
|
|
261
|
+
weightedRandomSelect() {
|
|
262
|
+
const weights = this.config.weights;
|
|
263
|
+
const total = weights.tweet + weights.browse + weights.comment + weights.like;
|
|
264
|
+
let rand = Math.random() * total;
|
|
265
|
+
if (rand < weights.tweet)
|
|
266
|
+
return 'tweet';
|
|
267
|
+
rand -= weights.tweet;
|
|
268
|
+
if (rand < weights.browse)
|
|
269
|
+
return 'browse';
|
|
270
|
+
rand -= weights.browse;
|
|
271
|
+
if (rand < weights.comment)
|
|
272
|
+
return 'comment';
|
|
273
|
+
return 'like';
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* 获取频率控制器
|
|
277
|
+
*/
|
|
278
|
+
getFrequencyController() {
|
|
279
|
+
return this.frequencyController;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* 获取统计信息
|
|
283
|
+
*/
|
|
284
|
+
getStats() {
|
|
285
|
+
return {
|
|
286
|
+
isRunning: this.isRunning,
|
|
287
|
+
frequencyStats: this.frequencyController.getStats(),
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* 清理
|
|
292
|
+
*/
|
|
293
|
+
dispose() {
|
|
294
|
+
this.stop();
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=behavior-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"behavior-scheduler.js","sourceRoot":"","sources":["../../src/active-behavior/behavior-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 频率控制器
|
|
3
|
+
*
|
|
4
|
+
* 控制智能行为的发布频率
|
|
5
|
+
* 防止过于频繁或过于沉默
|
|
6
|
+
*/
|
|
7
|
+
export type BehaviorType = 'tweet' | 'browse' | 'comment' | 'like';
|
|
8
|
+
export interface FrequencyConfig {
|
|
9
|
+
/** 各行为的频率限制 */
|
|
10
|
+
limits: Partial<Record<BehaviorType, {
|
|
11
|
+
/** 最小间隔 (ms) */
|
|
12
|
+
minIntervalMs: number;
|
|
13
|
+
/** 最大间隔 (ms),超过此时间应主动行为 */
|
|
14
|
+
maxIntervalMs: number;
|
|
15
|
+
/** 每小时最大次数 */
|
|
16
|
+
maxPerHour: number;
|
|
17
|
+
/** 每天最大次数 */
|
|
18
|
+
maxPerDay: number;
|
|
19
|
+
}>>;
|
|
20
|
+
/** 每日总行为上限 */
|
|
21
|
+
dailyLimit: number;
|
|
22
|
+
}
|
|
23
|
+
export declare const DEFAULT_FREQUENCY_CONFIG: FrequencyConfig;
|
|
24
|
+
export declare class FrequencyController {
|
|
25
|
+
private logger;
|
|
26
|
+
private config;
|
|
27
|
+
private records;
|
|
28
|
+
private dailyCount;
|
|
29
|
+
private currentDay;
|
|
30
|
+
constructor(config?: Partial<FrequencyConfig>);
|
|
31
|
+
/**
|
|
32
|
+
* 检查行为是否允许执行
|
|
33
|
+
*/
|
|
34
|
+
canPerform(type: BehaviorType): {
|
|
35
|
+
allowed: boolean;
|
|
36
|
+
reason?: string;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* 记录行为执行
|
|
40
|
+
*/
|
|
41
|
+
record(type: BehaviorType): void;
|
|
42
|
+
/**
|
|
43
|
+
* 检查是否应该主动执行某种行为(超过最大间隔)
|
|
44
|
+
*/
|
|
45
|
+
shouldAct(type: BehaviorType): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* 获取下次建议执行的行为类型
|
|
48
|
+
* 返回最需要执行的行为(距上次执行最久的)
|
|
49
|
+
*/
|
|
50
|
+
getNextSuggested(): {
|
|
51
|
+
type: BehaviorType;
|
|
52
|
+
urgency: number;
|
|
53
|
+
} | null;
|
|
54
|
+
/**
|
|
55
|
+
* 获取距离下次可执行的最短等待时间
|
|
56
|
+
*/
|
|
57
|
+
getTimeUntilNext(type: BehaviorType): number;
|
|
58
|
+
/**
|
|
59
|
+
* 获取统计信息
|
|
60
|
+
*/
|
|
61
|
+
getStats(): {
|
|
62
|
+
today: Record<BehaviorType, number>;
|
|
63
|
+
totalToday: number;
|
|
64
|
+
dailyLimit: number;
|
|
65
|
+
};
|
|
66
|
+
private getLastRecord;
|
|
67
|
+
private getTodayTotal;
|
|
68
|
+
private getToday;
|
|
69
|
+
private isSameDay;
|
|
70
|
+
private resetDaily;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=frequency-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frequency-control.d.ts","sourceRoot":"","sources":["../../src/active-behavior/frequency-control.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAInE,MAAM,WAAW,eAAe;IAC9B,eAAe;IACf,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE;QACnC,gBAAgB;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,2BAA2B;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC,CAAC;IACJ,cAAc;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,wBAAwB,EAAE,eA4BtC,CAAC;AAWF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,UAAU,CAAM;gBAEZ,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAU7C;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAgDrE;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAoBhC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAUtC;;;OAGG;IACH,gBAAgB,IAAI;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA4BlE;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;IAW5C;;OAEG;IACH,QAAQ,IAAI;QACV,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB;IAkBD,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,UAAU;CAKnB"}
|