multiclaws 0.4.36 → 0.4.38
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 +39 -39
- package/README.zh-CN.md +39 -39
- package/dist/gateway/handlers.js +17 -0
- package/dist/index.js +89 -45
- package/dist/infra/version.d.ts +1 -0
- package/dist/infra/version.js +19 -0
- package/dist/service/a2a-adapter.d.ts +27 -4
- package/dist/service/a2a-adapter.js +239 -30
- package/dist/service/multiclaws-service.d.ts +7 -0
- package/dist/service/multiclaws-service.js +84 -20
- package/openclaw.plugin.json +47 -47
- package/package.json +56 -56
- package/skills/meeting-scheduler/SKILL.md +175 -0
- package/skills/multiclaws/SKILL.md +218 -218
package/package.json
CHANGED
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "multiclaws",
|
|
3
|
-
"version": "0.4.
|
|
4
|
-
"description": "MultiClaws plugin for OpenClaw collaboration via A2A protocol",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"types": "dist/index.d.ts",
|
|
7
|
-
"openclaw": {
|
|
8
|
-
"extensions": [
|
|
9
|
-
"./dist/index.js"
|
|
10
|
-
]
|
|
11
|
-
},
|
|
12
|
-
"files": [
|
|
13
|
-
"dist",
|
|
14
|
-
"skills",
|
|
15
|
-
"openclaw.plugin.json",
|
|
16
|
-
"README.md"
|
|
17
|
-
],
|
|
18
|
-
"scripts": {
|
|
19
|
-
"build": "tsc -p tsconfig.json",
|
|
20
|
-
"test": "vitest run",
|
|
21
|
-
"test:watch": "vitest",
|
|
22
|
-
"clean": "rm -rf dist"
|
|
23
|
-
},
|
|
24
|
-
"keywords": [
|
|
25
|
-
"openclaw",
|
|
26
|
-
"plugin",
|
|
27
|
-
"multiclaws",
|
|
28
|
-
"a2a",
|
|
29
|
-
"collaboration"
|
|
30
|
-
],
|
|
31
|
-
"author": "Eric Sun",
|
|
32
|
-
"license": "MIT",
|
|
33
|
-
"repository": {
|
|
34
|
-
"type": "git",
|
|
35
|
-
"url": "https://github.com/EricSun0218/multiclaws.git"
|
|
36
|
-
},
|
|
37
|
-
"dependencies": {
|
|
38
|
-
"@a2a-js/sdk": "^0.3.10",
|
|
39
|
-
"@opentelemetry/api": "^1.9.0",
|
|
40
|
-
"@opentelemetry/sdk-trace-base": "^2.6.0",
|
|
41
|
-
"@opentelemetry/sdk-trace-node": "^2.6.0",
|
|
42
|
-
"express": "^5.2.1",
|
|
43
|
-
"opossum": "^9.0.0",
|
|
44
|
-
"p-retry": "^7.1.1",
|
|
45
|
-
"proper-lockfile": "^4.1.2",
|
|
46
|
-
"zod": "^4.3.6"
|
|
47
|
-
},
|
|
48
|
-
"devDependencies": {
|
|
49
|
-
"@types/express": "^5.0.6",
|
|
50
|
-
"@types/node": "^24.3.0",
|
|
51
|
-
"@types/opossum": "^8.1.9",
|
|
52
|
-
"@types/proper-lockfile": "^4.1.4",
|
|
53
|
-
"typescript": "^5.9.2",
|
|
54
|
-
"vitest": "^3.2.4"
|
|
55
|
-
}
|
|
56
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "multiclaws",
|
|
3
|
+
"version": "0.4.38",
|
|
4
|
+
"description": "MultiClaws plugin for OpenClaw collaboration via A2A protocol",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"openclaw": {
|
|
8
|
+
"extensions": [
|
|
9
|
+
"./dist/index.js"
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"skills",
|
|
15
|
+
"openclaw.plugin.json",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc -p tsconfig.json",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"test:watch": "vitest",
|
|
22
|
+
"clean": "rm -rf dist"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"openclaw",
|
|
26
|
+
"plugin",
|
|
27
|
+
"multiclaws",
|
|
28
|
+
"a2a",
|
|
29
|
+
"collaboration"
|
|
30
|
+
],
|
|
31
|
+
"author": "Eric Sun",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/EricSun0218/multiclaws.git"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@a2a-js/sdk": "^0.3.10",
|
|
39
|
+
"@opentelemetry/api": "^1.9.0",
|
|
40
|
+
"@opentelemetry/sdk-trace-base": "^2.6.0",
|
|
41
|
+
"@opentelemetry/sdk-trace-node": "^2.6.0",
|
|
42
|
+
"express": "^5.2.1",
|
|
43
|
+
"opossum": "^9.0.0",
|
|
44
|
+
"p-retry": "^7.1.1",
|
|
45
|
+
"proper-lockfile": "^4.1.2",
|
|
46
|
+
"zod": "^4.3.6"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/express": "^5.0.6",
|
|
50
|
+
"@types/node": "^24.3.0",
|
|
51
|
+
"@types/opossum": "^8.1.9",
|
|
52
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
53
|
+
"typescript": "^5.9.2",
|
|
54
|
+
"vitest": "^3.2.4"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# 会议调度 — 技能行为
|
|
2
|
+
|
|
3
|
+
以下规则指导 AI 如何利用 MultiClaws 团队协作和 Google Calendar 完成会议调度。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 触发条件
|
|
8
|
+
|
|
9
|
+
当用户的请求包含以下意图时激活此 Skill:
|
|
10
|
+
- 约会议 / 安排会议 / 组织会议
|
|
11
|
+
- 查询团队成员空闲时间
|
|
12
|
+
- 找一个大家都有空的时间
|
|
13
|
+
|
|
14
|
+
**关键词示例:** 「约会议」「开会」「安排一个会」「找个时间碰一下」「schedule a meeting」
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 工作流
|
|
19
|
+
|
|
20
|
+
### 步骤 1:解析会议需求
|
|
21
|
+
|
|
22
|
+
从用户请求中提取:
|
|
23
|
+
- **参会人**:指定的团队成员名单(如「小明和小红」)。若用户说「所有人」或「整个团队」,则查询全部成员
|
|
24
|
+
- **时间范围**:用户期望的日期/时间段(如「明天下午」「本周五」「下周一到周三」)
|
|
25
|
+
- **会议主题**:会议目的(可选)
|
|
26
|
+
- **会议时长**:默认 1 小时,用户可指定
|
|
27
|
+
|
|
28
|
+
如果用户未指定时间范围,询问用户希望在什么时间段开会。
|
|
29
|
+
|
|
30
|
+
### 步骤 2:查询本地日历
|
|
31
|
+
|
|
32
|
+
使用 Google Calendar 工具读取**用户自己**在指定时间范围内的日程:
|
|
33
|
+
|
|
34
|
+
1. 获取指定时间范围内的所有事件
|
|
35
|
+
2. 计算用户的空闲时段
|
|
36
|
+
3. 如果用户在该时间范围内完全没空,提前告知用户并建议换个时间段
|
|
37
|
+
|
|
38
|
+
### 步骤 3:获取团队成员信息
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
multiclaws_agents()
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
从返回的智能体列表中,根据用户指定的参会人名单匹配对应的智能体。
|
|
45
|
+
|
|
46
|
+
**匹配规则:**
|
|
47
|
+
- 优先按 `ownerName` 匹配
|
|
48
|
+
- 如果用户说「所有人」,取团队全部成员(排除自己)
|
|
49
|
+
- 找不到的成员告知用户
|
|
50
|
+
|
|
51
|
+
### 步骤 4:并行委派查询空闲时间
|
|
52
|
+
|
|
53
|
+
对每个参会成员**分别**调用 `multiclaws_delegate`:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
multiclaws_delegate(
|
|
57
|
+
agentUrl="成员的agentUrl",
|
|
58
|
+
task="请查询你的主人在 [时间范围] 的日程安排,告诉我哪些时段是空闲的。
|
|
59
|
+
请以如下格式回复:
|
|
60
|
+
- 空闲时段1:HH:MM - HH:MM
|
|
61
|
+
- 空闲时段2:HH:MM - HH:MM
|
|
62
|
+
如果完全没空,请说明。"
|
|
63
|
+
)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
记录每个委派返回的 `taskId`。
|
|
67
|
+
|
|
68
|
+
### 步骤 5:收集回复(超时机制)
|
|
69
|
+
|
|
70
|
+
**等待策略:手动检查 + 自动超时**
|
|
71
|
+
|
|
72
|
+
1. 委派发出后告知用户:「已向 N 位成员查询空闲时间,等待回复中…」
|
|
73
|
+
2. 设定超时:**3 分钟**
|
|
74
|
+
3. 在超时前,如有结果通过子 agent 消息返回则自动收集
|
|
75
|
+
4. 超时后检查各任务状态:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
multiclaws_task_status(taskId="xxx")
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**处理逻辑:**
|
|
82
|
+
- ✅ **已回复**:提取空闲时段信息
|
|
83
|
+
- ⏳ **未回复(超时)**:标记该成员为「未响应」
|
|
84
|
+
- ❌ **失败**:标记该成员为「查询失败」
|
|
85
|
+
|
|
86
|
+
如果全部超时/失败,告知用户并建议:
|
|
87
|
+
- 稍后重试
|
|
88
|
+
- 直接问相关人员的空闲时间
|
|
89
|
+
- 跳过未响应成员继续安排
|
|
90
|
+
|
|
91
|
+
### 步骤 6:汇总与展示
|
|
92
|
+
|
|
93
|
+
将所有结果汇总为易读的表格,展示给用户:
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
📅 会议空闲时段汇总(主题:xxx)
|
|
97
|
+
|
|
98
|
+
| 时段 | 你 | 小明 | 小红 | 可行? |
|
|
99
|
+
|----------------|------|------|------|--------|
|
|
100
|
+
| 14:00 - 15:00 | ✅ | ✅ | ✅ | ✅ 全员可行 |
|
|
101
|
+
| 15:00 - 16:00 | ✅ | ❌ | ✅ | ⚠️ 小明不行 |
|
|
102
|
+
| 16:00 - 17:00 | ✅ | ✅ | ⏳ | ⚠️ 小红未响应 |
|
|
103
|
+
|
|
104
|
+
推荐时段:14:00 - 15:00(全员可行)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**推荐逻辑:**
|
|
108
|
+
1. 优先推荐全员都空闲的时段
|
|
109
|
+
2. 若无全员空闲时段,推荐覆盖人数最多的时段
|
|
110
|
+
3. 若有多个等价时段,推荐最早的
|
|
111
|
+
|
|
112
|
+
### 步骤 7:用户确认
|
|
113
|
+
|
|
114
|
+
询问用户:
|
|
115
|
+
- 选择哪个时段?
|
|
116
|
+
- 是否接受部分成员缺席?
|
|
117
|
+
- 会议标题需要调整吗?
|
|
118
|
+
- 是否需要添加会议描述或议程?
|
|
119
|
+
|
|
120
|
+
等待用户明确确认后才继续。
|
|
121
|
+
|
|
122
|
+
### 步骤 8:创建日历事件
|
|
123
|
+
|
|
124
|
+
用户确认后,使用 Google Calendar 工具:
|
|
125
|
+
1. 创建日历事件(标题、时间、描述)
|
|
126
|
+
2. 添加所有确认参会的成员为与会者(如果有邮箱信息)
|
|
127
|
+
3. 发送日历邀请
|
|
128
|
+
|
|
129
|
+
### 步骤 9:通知参会者
|
|
130
|
+
|
|
131
|
+
对每个确认参会的远端成员调用 `multiclaws_delegate`,通知会议已确定:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
multiclaws_delegate(
|
|
135
|
+
agentUrl="成员的agentUrl",
|
|
136
|
+
task="会议已确定:[主题],时间:[日期] [时段]。
|
|
137
|
+
请在你主人的日历上创建这个事件。"
|
|
138
|
+
)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
向用户确认:「会议已创建,日历邀请已发送给所有参会者。」
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 边界情况处理
|
|
146
|
+
|
|
147
|
+
### 跨时区
|
|
148
|
+
- 委派查询时明确指定时区(如 GMT+8)
|
|
149
|
+
- 汇总时统一转换为用户所在时区展示
|
|
150
|
+
|
|
151
|
+
### 只有一个参会者
|
|
152
|
+
- 跳过汇总表格,直接展示双方都空闲的时段
|
|
153
|
+
- 简化确认流程
|
|
154
|
+
|
|
155
|
+
### 用户取消
|
|
156
|
+
- 在任何步骤用户都可以说「算了」「取消」
|
|
157
|
+
- 取消时不创建任何事件
|
|
158
|
+
|
|
159
|
+
### 成员无日历能力
|
|
160
|
+
- 如果某成员的 bio 中没有提到日历相关能力,在委派时明确说明:
|
|
161
|
+
「请询问你的主人在 [时间范围] 是否有空,由主人口头回答即可」
|
|
162
|
+
|
|
163
|
+
### 紧急会议
|
|
164
|
+
- 如果用户说「现在」「马上」「尽快」,将时间范围设为今天剩余时间
|
|
165
|
+
- 缩短超时为 1 分钟
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 重要规则
|
|
170
|
+
|
|
171
|
+
- **必须等用户确认后才创建事件**,永远不要自动创建
|
|
172
|
+
- **委派查询时要说明会议主题**(如果有),让对方判断优先级
|
|
173
|
+
- **汇总要直观**,用表格和 emoji 使结果一目了然
|
|
174
|
+
- **尊重隐私**,不在委派消息中透露其他成员的具体日程细节
|
|
175
|
+
- **保持礼貌**,委派消息用协商语气而非命令语气
|