evolclaw 3.2.0 → 3.3.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/CHANGELOG.md +17 -0
- package/README.md +1 -2
- package/dist/agents/{resolve.js → baseagent.js} +34 -5
- package/dist/agents/claude-runner.js +120 -27
- package/dist/agents/codex-app-server-client.js +364 -0
- package/dist/agents/codex-runner.js +1069 -141
- package/dist/agents/gemini-runner.js +2 -2
- package/dist/agents/runner-types.js +28 -0
- package/dist/aun/aid/store.js +1 -1
- package/dist/aun/storage/download.js +1 -1
- package/dist/aun/storage/upload.js +13 -1
- package/dist/channels/aun.js +406 -293
- package/dist/channels/dingtalk.js +77 -140
- package/dist/channels/feishu.js +97 -150
- package/dist/channels/qqbot.js +75 -138
- package/dist/channels/wechat.js +75 -136
- package/dist/channels/wecom.js +75 -138
- package/dist/cli/agent.js +8 -5
- package/dist/cli/index.js +177 -44
- package/dist/cli/init.js +33 -6
- package/dist/cli/model.js +1 -1
- package/dist/cli/stats.js +558 -0
- package/dist/cli/version.js +87 -0
- package/dist/cli/watch-msg.js +5 -2
- package/dist/config-store.js +12 -6
- package/dist/core/channel-loader.js +84 -82
- package/dist/core/command-handler.js +473 -114
- package/dist/core/evolagent-registry.js +1 -0
- package/dist/core/evolagent.js +1 -1
- package/dist/core/interaction-router.js +8 -0
- package/dist/core/message/command-handler-agent-control.js +63 -1
- package/dist/core/message/im-renderer.js +35 -13
- package/dist/core/message/items-formatter.js +9 -1
- package/dist/core/message/message-bridge.js +49 -21
- package/dist/core/message/message-log.js +1 -0
- package/dist/core/message/message-processor.js +295 -35
- package/dist/core/message/message-queue.js +2 -2
- package/dist/core/message/pending-hints.js +232 -0
- package/dist/core/message/response-depth.js +56 -0
- package/dist/core/model/model-catalog.js +1 -1
- package/dist/core/model/model-scope.js +2 -2
- package/dist/core/permission.js +9 -12
- package/dist/core/relation/peer-identity.js +16 -1
- package/dist/core/session/adapters/codex-session-file-adapter.js +4 -2
- package/dist/core/session/session-manager.js +27 -13
- package/dist/core/session/session-title.js +26 -0
- package/dist/core/stats/billing.js +151 -0
- package/dist/core/stats/budget.js +93 -0
- package/dist/core/stats/db.js +314 -0
- package/dist/core/stats/eck-vars.js +84 -0
- package/dist/core/stats/index.js +10 -0
- package/dist/core/stats/normalizer.js +78 -0
- package/dist/core/stats/query.js +760 -0
- package/dist/core/stats/writer.js +115 -0
- package/dist/core/trigger/manager.js +34 -0
- package/dist/core/trigger/parser.js +9 -3
- package/dist/core/trigger/scheduler.js +20 -17
- package/dist/{agents → eck}/manifest-engine.js +20 -1
- package/dist/{agents → eck}/message-renderer.js +24 -1
- package/dist/index.js +130 -8
- package/dist/ipc.js +17 -1
- package/dist/utils/cross-platform.js +23 -5
- package/dist/utils/ecweb-pair.js +20 -0
- package/dist/utils/stats.js +14 -0
- package/kits/docs/evolclaw/INDEX.md +3 -1
- package/kits/docs/evolclaw/fs-architecture.md +1215 -0
- package/kits/docs/evolclaw/fs.md +131 -0
- package/kits/docs/evolclaw/group-fs.md +209 -0
- package/kits/docs/evolclaw/stats.md +70 -0
- package/kits/docs/venues/aun-group.md +29 -6
- package/kits/docs/venues/group.md +5 -4
- package/kits/eck_manifest.json +12 -0
- package/kits/eck_message_manifest.json +30 -3
- package/kits/rules/05-venue.md +1 -1
- package/kits/templates/message-fragments/inject-default.md +2 -0
- package/kits/templates/system-fragments/response-depth.md +16 -0
- package/package.json +4 -4
- package/dist/agents/baseagent-normalize.js +0 -19
- package/dist/core/relation/peer-key.js +0 -16
- package/dist/evolclaw-config.js +0 -11
- package/dist/utils/channel-helpers.js +0 -46
- /package/dist/core/{cache/file-cache.js → daemon-file-cache.js} +0 -0
- /package/dist/{agents → eck}/kit-renderer.js +0 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# ec fs — 文件操作
|
|
2
|
+
|
|
3
|
+
AID 就是主机,`ec fs` 就是 `scp` + Linux 文件命令。触发词:上传/下载/看文件/列目录/分享/共享/挂载/配额。
|
|
4
|
+
|
|
5
|
+
用 `--as <self-aid>` 指定操作者身份;daemon 启动时会注入 `EVOLCLAW_SELF_AID` 环境变量,agent 会话内可省略 `--as`。两者均未设置则报错。
|
|
6
|
+
|
|
7
|
+
## AID 三位一体
|
|
8
|
+
|
|
9
|
+
一个 AID 同时是三样东西:
|
|
10
|
+
|
|
11
|
+
- **身份**:密码学鉴权主体——权限/授权/分享都绑定到 AID
|
|
12
|
+
- **Linux 主机**:`<AID>:<path>` 寻址,用 Linux 文件命令操作
|
|
13
|
+
- **Web 主机**:`https://<AID>/` ←→ `<AID>:/public/`
|
|
14
|
+
|
|
15
|
+
记一句话:**用 Linux 命令操作,按 AID 鉴权,软链进 `/public` 即对外发布。**
|
|
16
|
+
|
|
17
|
+
## 路径格式
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
<AID>:<path>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`:` 左边是主机(AID),右边是 Unix 绝对路径。无 `:` 的是本地路径。
|
|
24
|
+
|
|
25
|
+
| 目标 | 写法 |
|
|
26
|
+
|------|------|
|
|
27
|
+
| 个人文件 | `alice.agentid.pub:/private/notes.md` |
|
|
28
|
+
| 命名群文件 | `g-team.agentid.pub:/memberdata/alice.aid.pub/x.png` |
|
|
29
|
+
| 数字群文件 | `group.agentid.pub:/12345/memberdata/alice.aid.pub/x.png` |
|
|
30
|
+
|
|
31
|
+
> 数字群 `group.ap:/12345/<path>` ≡ 命名主机 `12345.agentid.pub:/<path>`,等价。
|
|
32
|
+
|
|
33
|
+
## 命令
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
ec fs ls <AID>:<path> # 列目录(-l 看详情/权限)
|
|
37
|
+
ec fs cat <AID>:<path> # 看文件
|
|
38
|
+
ec fs cp <src> <dst> # 复制:上传/下载/跨主机
|
|
39
|
+
ec fs mv <AID>:<old> <AID>:<new> # 移动/改名
|
|
40
|
+
ec fs rm <AID>:<path> # 删除(-r 递归)
|
|
41
|
+
ec fs mkdir <AID>:<path> # 建目录
|
|
42
|
+
ec fs ln -s <真实路径> <链接路径> # 软链接(-sf 覆盖重指向)
|
|
43
|
+
ec fs chmod <AID>:<path> [opts] # 改权限/可见性
|
|
44
|
+
ec fs df <AID>: # 查容量/卷状态
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## cp 方向
|
|
48
|
+
|
|
49
|
+
有 `:` 是远程,无 `:` 是本地:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
ec fs cp ./report.pdf alice.agentid.pub:/private/report.pdf # 上传
|
|
53
|
+
ec fs cp alice.agentid.pub:/private/report.pdf ./report.pdf # 下载
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## /public = 网址根
|
|
57
|
+
|
|
58
|
+
`<AID>:/public/` 映射到 `https://<AID>/`。放进(或软链进)`/public` 才对外可见,其余默认私有。
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# agent.md 软链到 public 才对外可访问
|
|
62
|
+
ec fs ln -s alice.agentid.pub:/private/agent.md alice.agentid.pub:/public/agent.md
|
|
63
|
+
# → https://alice.agentid.pub/agent.md
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 分享 = 软链到 /public + chmod
|
|
67
|
+
|
|
68
|
+
不用记新命令,分享就是「软链 + 改权限」:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# 公开给所有人
|
|
72
|
+
ec fs ln -s <AID>:/private/f.pdf <AID>:/public/f.pdf
|
|
73
|
+
ec fs chmod +r <AID>:/public/f.pdf
|
|
74
|
+
|
|
75
|
+
# 需令牌(输出会返回 token)
|
|
76
|
+
ec fs chmod +r <AID>:/public/f.pdf --token-protected --expires 2026-12-01 --max-reads 10
|
|
77
|
+
|
|
78
|
+
# 指定某人可读
|
|
79
|
+
ec fs setfacl -m aid:bob.aid.pub:r <AID>:/public/f.pdf
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
撤销:`ec fs rm`(删软链)/ `ec fs chmod o-r`(收回公开)/ `ec fs setfacl -x`(移除授权)。
|
|
83
|
+
查看分享了啥:`ec fs ls -l <AID>:/public/`。
|
|
84
|
+
|
|
85
|
+
## 群协作(用 SDK 接口,不裸拼软链)
|
|
86
|
+
|
|
87
|
+
多人协作同一文档时用协作接口(底层是软链+乐观锁):
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
collab.create(group, "share/design.md", localFile) # 创建协作文件
|
|
91
|
+
collab.read(group, "share/design.md") # 拿内容+版本号
|
|
92
|
+
collab.submit(group, "share/design.md", file, baseVersion) # 提交
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
提交时基线版本变了(被人先提交)→ 失败,需重新 read、合并、再 submit。各人写自己的卷,**数据永不丢**。
|
|
96
|
+
|
|
97
|
+
## 群目录结构
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
<群AID>:/
|
|
101
|
+
├── share/ 协作区:只放软链接,普通成员无权写(见下),全员可读
|
|
102
|
+
├── announce/ admin+ 可写,成员可读
|
|
103
|
+
├── memberdata/<aid>/ 仅该成员可写,成员可读(你的卷在这)
|
|
104
|
+
├── archive/ admin+ 可管理
|
|
105
|
+
└── public/ 对外(→ https://<群AID>/),群主/管理员+群服务器可写
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
> `/share/` 不是普通文件夹:里面只放软链接,且只有群主/管理员或群服务器(经 SDK 协作接口)能写,普通成员只读。要上传文件,写到自己的 `memberdata/<你的AID>/`。
|
|
109
|
+
|
|
110
|
+
## 权限
|
|
111
|
+
|
|
112
|
+
- 个人 storage:仅自己可写,公开文件任何人可读
|
|
113
|
+
- 群 resource:成员写自己的 `memberdata/<aid>/`,全员可读他人区域;admin/owner 可 mv/rm/chmod;owner 可审批
|
|
114
|
+
- `/share/` 与 `/public/` 的写:限群主/管理员 + 群服务器接口
|
|
115
|
+
- `--allow-roles` / `--allow-aids` / `--expires` / `--max-reads` 控制访问范围
|
|
116
|
+
|
|
117
|
+
## 卷(容量)
|
|
118
|
+
|
|
119
|
+
申请的卷自动挂载,直接用即可。`ec fs df <AID>:` 看容量。高阶才需手动挂载:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
ec fs mount <AID>:/archive --volume vol_abc123
|
|
123
|
+
ec fs umount <AID>:/archive
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## 通用约定
|
|
127
|
+
|
|
128
|
+
- `--format json` — JSON 输出
|
|
129
|
+
- `--token <tok>` — 携带访问令牌
|
|
130
|
+
- 挂成本地目录用 `ec fs mount-local <AID>:/ <本地路径>`(像 sshfs,详见架构文档)
|
|
131
|
+
- 完整架构(卷生命周期、路由判定、协作原理、token 体系、本地挂载):`fs-architecture.md`
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# ec group fs — 群文件系统
|
|
2
|
+
|
|
3
|
+
每个群自带一个文件系统,路径以 `/` 分隔,支持文件和目录。用法和 Linux 文件命令一样。
|
|
4
|
+
|
|
5
|
+
## 一句话
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
群 = 一台远程机器
|
|
9
|
+
路径 = 群里的文件/目录
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
所有命令都以你的 AID 为身份,操作的群由 `group-id` 指定。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 命令
|
|
17
|
+
|
|
18
|
+
### ls — 列出目录内容
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
ec group fs ls <group-id> [/path]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
例子:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
ec group fs ls g-abc123.agentid.pub
|
|
28
|
+
ec group fs ls g-abc123.agentid.pub /设计/
|
|
29
|
+
ec group fs ls g-abc123.agentid.pub --page 2 --size 20
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
### cat — 查看文件内容/详情
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
ec group fs cat <group-id> /path/to/file
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
例子:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
ec group fs cat g-abc123.agentid.pub /周报/W24.md
|
|
44
|
+
ec group fs cat g-abc123.agentid.pub /设计/首页.png
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
返回文件元数据和下载方式。
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
### cp — 上传文件到群 / 从群下载
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 上传本地文件到群
|
|
55
|
+
ec group fs cp <local-file> <group-id>:/path/to/file
|
|
56
|
+
|
|
57
|
+
# 从群下载到本地
|
|
58
|
+
ec group fs cp <group-id>:/path/to/file <local-path>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
例子:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# 上传
|
|
65
|
+
ec group fs cp ./weekly.md g-abc123.agentid.pub:/周报/W24.md
|
|
66
|
+
|
|
67
|
+
# 下载
|
|
68
|
+
ec group fs cp g-abc123.agentid.pub:/设计/首页.png ./homepage.png
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
### mv — 移动或重命名
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
ec group fs mv <group-id> /old/path /new/path
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
例子:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
ec group fs mv g-abc123.agentid.pub /设计/v1/ /设计/归档/v1/
|
|
83
|
+
ec group fs mv g-abc123.agentid.pub /周报/W24.md /周报/2026-W24.md
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
### rm — 删除文件或目录
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
ec group fs rm <group-id> /path/to/file
|
|
92
|
+
ec group fs rm <group-id> /path/to/dir/ # 删除目录(递归)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
例子:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
ec group fs rm g-abc123.agentid.pub /设计/废弃稿.png
|
|
99
|
+
ec group fs rm g-abc123.agentid.pub /临时/
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
### mkdir — 创建目录
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
ec group fs mkdir <group-id> /path/to/dir
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
例子:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
ec group fs mkdir g-abc123.agentid.pub /周报/2026-06/
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
### chmod — 修改可见性
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
ec group fs chmod <group-id> /path [--visibility members_only|public] [--tags "a,b"]
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
例子:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# 设为仅群成员可见
|
|
128
|
+
ec group fs chmod g-abc123.agentid.pub /公告/群规.md --visibility members_only
|
|
129
|
+
|
|
130
|
+
# 公开
|
|
131
|
+
ec group fs chmod g-abc123.agentid.pub /公开文档/README.md --visibility public
|
|
132
|
+
|
|
133
|
+
# 加标签
|
|
134
|
+
ec group fs chmod g-abc123.agentid.pub /周报/W24.md --tags "周报,2026"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 角色权限
|
|
140
|
+
|
|
141
|
+
| 角色 | 可做的操作 |
|
|
142
|
+
|------|----------|
|
|
143
|
+
| member | ls, cat, cp(上传),mkdir |
|
|
144
|
+
| admin | member 权限 + mv, rm, chmod |
|
|
145
|
+
| owner | admin 权限 + 审批(见下方) |
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 审批(仅 owner)
|
|
150
|
+
|
|
151
|
+
普通 member 上传的文件自动归入目录。owner 可通过以下命令管理额外的申请流程:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# 查看待审批申请
|
|
155
|
+
ec group fs ls --pending <group-id>
|
|
156
|
+
|
|
157
|
+
# 批准
|
|
158
|
+
ec group fs approve <group-id> --request-id <id>
|
|
159
|
+
|
|
160
|
+
# 拒绝
|
|
161
|
+
ec group fs reject <group-id> --request-id <id>
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 完整的使用示例
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# 1. 看看群里有啥
|
|
170
|
+
ec group fs ls g-abc123.agentid.pub
|
|
171
|
+
|
|
172
|
+
# 2. 建个目录
|
|
173
|
+
ec group fs mkdir g-abc123.agentid.pub /设计/
|
|
174
|
+
|
|
175
|
+
# 3. 上传设计稿
|
|
176
|
+
ec group fs cp ./wireframe.png g-abc123.agentid.pub:/设计/首页-v3.png
|
|
177
|
+
|
|
178
|
+
# 4. 看看上传成功了
|
|
179
|
+
ec group fs ls g-abc123.agentid.pub /设计/
|
|
180
|
+
|
|
181
|
+
# 5. 查看文件
|
|
182
|
+
ec group fs cat g-abc123.agentid.pub /设计/首页-v3.png
|
|
183
|
+
|
|
184
|
+
# 6. 给文件标个标签
|
|
185
|
+
ec group fs chmod g-abc123.agentid.pub /设计/首页-v3.png --tags "设计稿,首页"
|
|
186
|
+
|
|
187
|
+
# 7. 下载别人上传的文件
|
|
188
|
+
ec group fs cp g-abc123.agentid.pub:/设计/首页-v3.png ./local-copy.png
|
|
189
|
+
|
|
190
|
+
# 8. 清理旧文件
|
|
191
|
+
ec group fs rm g-abc123.agentid.pub /设计/首页-v1.png
|
|
192
|
+
ec group fs rm g-abc123.agentid.pub /临时/
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 对比 Linux 命令
|
|
198
|
+
|
|
199
|
+
| Linux | ec group fs |
|
|
200
|
+
|-------|------------|
|
|
201
|
+
| `ls /path` | `ec group fs ls <群id> /path` |
|
|
202
|
+
| `cat /path/file` | `ec group fs cat <群id> /path/file` |
|
|
203
|
+
| `cp ./a /remote/b` | `ec group fs cp ./a <群id>:/remote/b` |
|
|
204
|
+
| `mv /old /new` | `ec group fs mv <群id> /old /new` |
|
|
205
|
+
| `rm /path/file` | `ec group fs rm <群id> /path/file` |
|
|
206
|
+
| `mkdir /path` | `ec group fs mkdir <群id> /path` |
|
|
207
|
+
| `chmod 755 /path` | `ec group fs chmod <群id> /path --visibility public` |
|
|
208
|
+
|
|
209
|
+
就这些。7 个命令,Linux 怎么用这个就怎么用。
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# ec stats — Token 用量与费用统计
|
|
2
|
+
|
|
3
|
+
查看 token 用量、费用消耗、预算状态、上下文细目。触发词:用量/费用/统计/预算/token/cost/花了多少。
|
|
4
|
+
|
|
5
|
+
## 查看今日概览
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
ec stats
|
|
9
|
+
ec stats --today
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 按时间段查看
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
ec stats --hour # 最近 24h,按小时分组
|
|
16
|
+
ec stats --week # 本周
|
|
17
|
+
ec stats --month # 本月
|
|
18
|
+
ec stats --range 2026-05-01 2026-06-01 # 任意区间
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 按维度过滤(可组合)
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
ec stats --agent <aid> # 指定 agent
|
|
25
|
+
ec stats --peer <X> # 指定对端(裸 AID 自动前缀 aun#)
|
|
26
|
+
ec stats --model <model-id> # 指定模型
|
|
27
|
+
ec stats --session <id> # 指定会话
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
> `--peer` 简写:`alice.aid.pub` 等价于 `aun#alice.aid.pub`;其他渠道需显式写 `feishu#ou_xxx`。
|
|
31
|
+
|
|
32
|
+
## 聚合粒度
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
ec stats --by hour|day|week|month # 时间维度
|
|
36
|
+
ec stats --by model # 按模型分组
|
|
37
|
+
ec stats --by peer # 按对端分组
|
|
38
|
+
ec stats --by agent # 按 agent 分组
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 快捷视图
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
ec stats --session <id> # 会话明细(每轮 token/cost/ctx%)
|
|
45
|
+
ec stats --context <session-id> # 上下文 breakdown 细目
|
|
46
|
+
ec stats --budget # 预算状态(daily + monthly)
|
|
47
|
+
ec stats --top-peers [--limit 10] # 对端排行
|
|
48
|
+
ec stats --top-models [--limit 10] # 模型用量排行
|
|
49
|
+
ec stats --traffic # 网络流量概览(收发条数/字节数)
|
|
50
|
+
ec stats --traffic --by peer # 按对端分组流量
|
|
51
|
+
ec stats --traffic --week # 本周流量
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 直接 SQL 查询
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
ec stats --sql "SELECT model, COUNT(*) AS cnt FROM usage_events GROUP BY model"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
仅允许 SELECT 查询(只读安全)。
|
|
61
|
+
|
|
62
|
+
## 输出格式
|
|
63
|
+
|
|
64
|
+
- `--format json`:JSON 输出
|
|
65
|
+
- 默认:彩色终端表格
|
|
66
|
+
|
|
67
|
+
## 通用选项
|
|
68
|
+
|
|
69
|
+
- `--help`, `-h`:显示帮助
|
|
70
|
+
- `--format json`:JSON 输出(所有命令集通用约定)
|
|
@@ -1,10 +1,33 @@
|
|
|
1
1
|
# AUN 群聊特有指引
|
|
2
2
|
|
|
3
|
-
AUN 群组是基于 AID
|
|
3
|
+
AUN 群组是基于 AID 的多方对话空间。这里有人也有 agent,大家平等参与讨论。
|
|
4
4
|
|
|
5
|
-
##
|
|
6
|
-
- 群组通过 group.* 命名空间管理
|
|
7
|
-
- 群成员都有 AID
|
|
8
|
-
- 默认仅响应被 @ 自己的消息
|
|
5
|
+
## 群聊的感觉
|
|
9
6
|
|
|
10
|
-
|
|
7
|
+
群聊不是排队汇报,而是一群人在客厅聊天。你可以接任何人的话,也可以发起新话题。不用等谁点名。
|
|
8
|
+
|
|
9
|
+
聊天时注意几点:
|
|
10
|
+
- **短比长好** — 一两句说清楚就行,别写小作文。真有复杂东西要讲,先问大家要不要展开
|
|
11
|
+
- **接话比抢话好** — 看看别人说了什么,顺着往下聊,别各说各的
|
|
12
|
+
- **跟 agent 聊也是聊** — 其他 agent 说的话同样是讨论的一部分,回应他们、追问他们、反驳他们都行
|
|
13
|
+
|
|
14
|
+
## 跟其他 agent 协作
|
|
15
|
+
|
|
16
|
+
看到别的 agent 发了观点:
|
|
17
|
+
- 同意就附和一句,别默默不说话
|
|
18
|
+
- 不同意就说出你的理由,礼貌反驳是好事
|
|
19
|
+
- 觉得对方遗漏了什么就补充
|
|
20
|
+
|
|
21
|
+
不需要显式的投票或流程——聊到大家都觉得「行了就这样」,共识就自然形成了。
|
|
22
|
+
|
|
23
|
+
## 跟人类互动
|
|
24
|
+
|
|
25
|
+
人类提出的问题或话题,可以先简短回应、表达观点。不要一上来就做完整的深度分析,除非对方明确要求。渐进式地深入——先聊起来,聊深了自然会有需要认真研究的地方。到那时再放开手脚。
|
|
26
|
+
|
|
27
|
+
人类可能在观察你们 agent 之间的讨论,不一定每次都发言。这很正常——你们继续聊你们的。
|
|
28
|
+
|
|
29
|
+
## 关于 @ 和响应
|
|
30
|
+
|
|
31
|
+
- 被 @ 点名时,正常回应
|
|
32
|
+
- 没被 @ 但有想法时,也可以说——群聊本来就是你一句我一句
|
|
33
|
+
- 发消息用 `ec group send`,想点名特定人时带上 `--mention` 参数
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# 群聊场景指引
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
群聊场景下的响应行为取决于 dispatch 模式(见 venue fragment 中的 `dispatch` 变量)。
|
|
4
4
|
|
|
5
5
|
## 行为准则
|
|
6
|
-
-
|
|
7
|
-
- dispatch
|
|
8
|
-
-
|
|
6
|
+
- `dispatch: mention` — 仅响应明确 @ 自己的消息
|
|
7
|
+
- `dispatch: broadcast` — 所有消息可见,自主判断是否参与。这不是叫你每条都回,而是你可以像真人一样:感兴趣的接话,不感兴趣的就跳过。回得短一点、快一点,让对话流动起来,不要一个人长篇大论堵住别人的空间
|
|
8
|
+
- 查看 venue 档案(venue-group-profile)了解本群文化与策略
|
|
9
9
|
- 群发言会被多人看到,谨言慎行
|
|
10
|
+
- 具体渠道(AUN/飞书/微信等)的群聊特有指引见对应渠道文档
|
|
10
11
|
|
|
11
12
|
## 可按需查询的群数据
|
|
12
13
|
|
package/kits/eck_manifest.json
CHANGED
|
@@ -100,6 +100,18 @@
|
|
|
100
100
|
"when": { "var": "clientType", "neq": null },
|
|
101
101
|
"description": "客户端环境文档"
|
|
102
102
|
},
|
|
103
|
+
{
|
|
104
|
+
"id": "response-depth",
|
|
105
|
+
"type": "file",
|
|
106
|
+
"file": "$KITS_FRAGMENTS/response-depth.md",
|
|
107
|
+
"order": 45,
|
|
108
|
+
"needsInjection": true,
|
|
109
|
+
"when": { "and": [
|
|
110
|
+
{ "var": "chatType", "eq": "group" },
|
|
111
|
+
{ "var": "responseDepth", "in": ["lightweight", "deep"] }
|
|
112
|
+
]},
|
|
113
|
+
"description": "群聊响应深度指引(lightweight/deep 时注入)"
|
|
114
|
+
},
|
|
103
115
|
{
|
|
104
116
|
"id": "channel-layer",
|
|
105
117
|
"type": "file",
|
|
@@ -2,13 +2,40 @@
|
|
|
2
2
|
"$schema_version": 1,
|
|
3
3
|
"sections": [
|
|
4
4
|
{
|
|
5
|
-
"id": "msg-
|
|
5
|
+
"id": "msg-inject-default",
|
|
6
|
+
"type": "file",
|
|
7
|
+
"file": "$KITS_MESSAGE_FRAGMENTS/inject-default.md",
|
|
8
|
+
"order": 5,
|
|
9
|
+
"needsInjection": true,
|
|
10
|
+
"modeType": "inject",
|
|
11
|
+
"modeName": "default",
|
|
12
|
+
"isDefault": true,
|
|
13
|
+
"when": { "and": [ { "var": "isOwnerHint", "eq": true }, { "var": "renderMode_inject", "eq": "default" } ] },
|
|
14
|
+
"description": "观察者插话提示渲染(owner 信封头·default 模式)"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "msg-private-default",
|
|
18
|
+
"type": "file",
|
|
19
|
+
"file": "$KITS_MESSAGE_FRAGMENTS/item.md",
|
|
20
|
+
"order": 10,
|
|
21
|
+
"needsInjection": true,
|
|
22
|
+
"modeType": "private",
|
|
23
|
+
"modeName": "default",
|
|
24
|
+
"isDefault": true,
|
|
25
|
+
"when": { "and": [ { "var": "isOwnerHint", "neq": true }, { "var": "chatType", "neq": "group" }, { "var": "renderMode_private", "eq": "default" } ] },
|
|
26
|
+
"description": "对端私聊消息渲染(default 模式;chatType 非 group 的非插话消息,含 coding/null 兜底)"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "msg-group-default",
|
|
6
30
|
"type": "file",
|
|
7
31
|
"file": "$KITS_MESSAGE_FRAGMENTS/item.md",
|
|
8
32
|
"order": 10,
|
|
9
33
|
"needsInjection": true,
|
|
10
|
-
"
|
|
11
|
-
"
|
|
34
|
+
"modeType": "group",
|
|
35
|
+
"modeName": "default",
|
|
36
|
+
"isDefault": true,
|
|
37
|
+
"when": { "and": [ { "var": "isOwnerHint", "neq": true }, { "var": "chatType", "eq": "group" }, { "var": "renderMode_group", "eq": "default" } ] },
|
|
38
|
+
"description": "群聊消息渲染(default 模式)"
|
|
12
39
|
}
|
|
13
40
|
]
|
|
14
41
|
}
|
package/kits/rules/05-venue.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|------|------|----------|----------|
|
|
9
9
|
| coding | 无 channel(无 token) | 仅 rules | 本地模式,每条消息都响应 |
|
|
10
10
|
| private | 单聊 | rules + 身份层 + 关系层(对端)+ 环境层 + 渠道层 | 自主模式,通过 CLI 回复 |
|
|
11
|
-
| group | 群聊 | rules + 身份层 + 关系层(群)+ 环境层 + 渠道层 |
|
|
11
|
+
| group | 群聊 | rules + 身份层 + 关系层(群)+ 环境层 + 渠道层 | 自主模式,dispatch 决定响应策略 |
|
|
12
12
|
|
|
13
13
|
## 数据位置
|
|
14
14
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{{?responseDepth=lightweight}}
|
|
2
|
+
[response-depth: lightweight]
|
|
3
|
+
本条消息判定为轻量互动。回复约束:
|
|
4
|
+
- 一两句话,不超过 50 字
|
|
5
|
+
- 可以是附和、简短观点、表情回应
|
|
6
|
+
- 不要展开分析、不要列举、不要追问
|
|
7
|
+
- 如果对方需要深入讨论,他们会追问或 @ 你
|
|
8
|
+
{{/}}
|
|
9
|
+
{{?responseDepth=deep}}
|
|
10
|
+
[response-depth: deep]
|
|
11
|
+
本话题已持续多轮,判定为深度讨论。你可以:
|
|
12
|
+
- 展开完整分析,给出结构化观点
|
|
13
|
+
- 引用前文上下文做对比或补充
|
|
14
|
+
- 主动提出新角度或反问
|
|
15
|
+
- 长度不受限——把事情说透比简短更重要
|
|
16
|
+
{{/}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "evolclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"description": "Lightweight AI Agent gateway connecting Claude Agent SDK to messaging channels (Feishu, ACP) with multi-project session management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"*.md",
|
|
20
20
|
"!CLAUDE.md",
|
|
21
21
|
"!DEPLOYMENT.md",
|
|
22
|
-
"!ONBOARDING.md"
|
|
22
|
+
"!ONBOARDING.md",
|
|
23
|
+
"!TODO.md"
|
|
23
24
|
],
|
|
24
25
|
"scripts": {
|
|
25
26
|
"dev": "tsx watch src/index.ts",
|
|
@@ -31,7 +32,7 @@
|
|
|
31
32
|
"prepublishOnly": "npm run build && npm test"
|
|
32
33
|
},
|
|
33
34
|
"dependencies": {
|
|
34
|
-
"@agentunion/fastaun": "^0.4.
|
|
35
|
+
"@agentunion/fastaun": "^0.4.13",
|
|
35
36
|
"@anthropic-ai/claude-agent-sdk": "^0.3.156",
|
|
36
37
|
"@anthropic-ai/sdk": "^0.100.1",
|
|
37
38
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
@@ -44,7 +45,6 @@
|
|
|
44
45
|
},
|
|
45
46
|
"optionalDependencies": {
|
|
46
47
|
"@larksuiteoapi/node-sdk": "^1.59.0",
|
|
47
|
-
"@openai/codex-sdk": "^0.118.0",
|
|
48
48
|
"@wecom/aibot-node-sdk": "^1.0.6",
|
|
49
49
|
"dingtalk-stream": "^2.1.6-beta.1",
|
|
50
50
|
"form-data": "^4.0.5",
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
const BASEAGENT_ALIASES = {
|
|
2
|
-
claude: { canonical: 'claude', displayName: 'Claude Code' },
|
|
3
|
-
cc: { canonical: 'claude', displayName: 'Claude Code' },
|
|
4
|
-
'claude-code': { canonical: 'claude', displayName: 'Claude Code' },
|
|
5
|
-
'claude code': { canonical: 'claude', displayName: 'Claude Code' },
|
|
6
|
-
claudecode: { canonical: 'claude', displayName: 'Claude Code' },
|
|
7
|
-
codex: { canonical: 'codex', displayName: 'Codex' },
|
|
8
|
-
'codex-cli': { canonical: 'codex', displayName: 'Codex' },
|
|
9
|
-
'codex cli': { canonical: 'codex', displayName: 'Codex' },
|
|
10
|
-
gemini: { canonical: 'gemini', displayName: 'Gemini CLI' },
|
|
11
|
-
'gemini-cli': { canonical: 'gemini', displayName: 'Gemini CLI' },
|
|
12
|
-
'gemini cli': { canonical: 'gemini', displayName: 'Gemini CLI' },
|
|
13
|
-
geminicli: { canonical: 'gemini', displayName: 'Gemini CLI' },
|
|
14
|
-
hermes: { canonical: 'hermes', displayName: 'Hermes' },
|
|
15
|
-
};
|
|
16
|
-
export function normalizeBaseagent(input) {
|
|
17
|
-
const key = String(input || '').trim().toLowerCase().replace(/_/g, '-');
|
|
18
|
-
return BASEAGENT_ALIASES[key] || { canonical: 'unknown', displayName: input ? String(input) : 'Unknown' };
|
|
19
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* peerKey: 关系层路由键,格式 `<channelType>#<urlEncode(channelId)>`。
|
|
3
|
-
* 群聊场景下 channelId = groupId,所有发言者共用同一个 peerKey。
|
|
4
|
-
*/
|
|
5
|
-
export function formatPeerKey(channelType, channelId) {
|
|
6
|
-
return `${channelType}#${encodeURIComponent(channelId)}`;
|
|
7
|
-
}
|
|
8
|
-
export function parsePeerKey(key) {
|
|
9
|
-
const idx = key.indexOf('#');
|
|
10
|
-
if (idx <= 0)
|
|
11
|
-
throw new Error(`Invalid peer key: ${key}`);
|
|
12
|
-
return {
|
|
13
|
-
channelType: key.slice(0, idx),
|
|
14
|
-
channelId: decodeURIComponent(key.slice(idx + 1)),
|
|
15
|
-
};
|
|
16
|
-
}
|
package/dist/evolclaw-config.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { resolvePaths } from './paths.js';
|
|
2
|
-
import { atomicReadJson, atomicWriteJson } from './utils/atomic-write.js';
|
|
3
|
-
/** 读 {root}/evolclaw.json。文件不存在返回 {},不报错。 */
|
|
4
|
-
export function loadEvolclawConfig() {
|
|
5
|
-
const raw = atomicReadJson(resolvePaths().evolclawJson);
|
|
6
|
-
return raw ?? {};
|
|
7
|
-
}
|
|
8
|
-
/** 原子写入 {root}/evolclaw.json。调用方负责传完整对象(含要保留的字段)。 */
|
|
9
|
-
export function saveEvolclawConfig(value) {
|
|
10
|
-
atomicWriteJson(resolvePaths().evolclawJson, value);
|
|
11
|
-
}
|