evolclaw 3.1.4 → 3.1.6
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 +60 -0
- package/dist/agents/claude-runner.js +398 -161
- package/dist/agents/kit-renderer.js +191 -25
- package/dist/aun/aid/agentmd.js +75 -103
- package/dist/aun/aid/client.js +1 -29
- package/dist/aun/aid/identity.js +105 -64
- package/dist/aun/aid/index.js +2 -1
- package/dist/aun/aid/store.js +74 -0
- package/dist/aun/msg/group.js +2 -2
- package/dist/aun/msg/p2p.js +26 -2
- package/dist/aun/rpc/connection.js +23 -30
- package/dist/channels/aun.js +174 -99
- package/dist/channels/dingtalk.js +2 -1
- package/dist/channels/feishu.js +301 -199
- package/dist/channels/qqbot.js +2 -1
- package/dist/channels/wechat.js +2 -1
- package/dist/channels/wecom.js +2 -1
- package/dist/cli/agent.js +21 -16
- package/dist/cli/bench.js +41 -28
- package/dist/cli/help.js +8 -0
- package/dist/cli/index.js +176 -87
- package/dist/cli/init-channel.js +5 -1
- package/dist/cli/init.js +37 -21
- package/dist/cli/link-rules.js +1 -7
- package/dist/cli/model.js +549 -0
- package/dist/cli/net-check.js +133 -50
- package/dist/cli/watch-msg.js +7 -7
- package/dist/cli/watch-web/debug-log.js +18 -0
- package/dist/cli/watch-web/server.js +306 -0
- package/dist/cli/watch-web/sources/aid.js +63 -0
- package/dist/cli/watch-web/sources/msg.js +70 -0
- package/dist/cli/watch-web/sources/session.js +638 -0
- package/dist/cli/watch-web/sources/types.js +10 -0
- package/dist/cli/watch-web/static/app.js +546 -0
- package/dist/cli/watch-web/static/index.html +54 -0
- package/dist/cli/watch-web/static/style.css +247 -0
- package/dist/config-store.js +1 -22
- package/dist/core/channel-loader.js +7 -4
- package/dist/core/command-handler.js +261 -133
- package/dist/core/evolagent-registry.js +1 -1
- package/dist/core/evolagent.js +4 -22
- package/dist/core/interaction-router.js +59 -0
- package/dist/core/message/im-renderer.js +9 -20
- package/dist/core/message/message-bridge.js +13 -9
- package/dist/core/message/message-log.js +2 -2
- package/dist/core/message/message-processor.js +211 -123
- package/dist/core/message/stream-idle-monitor.js +21 -0
- package/dist/core/model/model-catalog.js +215 -0
- package/dist/core/model/model-scope.js +250 -0
- package/dist/core/relation/peer-identity.js +58 -55
- package/dist/core/relation/peer-key.js +16 -0
- package/dist/core/session/session-fs-store.js +34 -55
- package/dist/core/session/session-key.js +24 -0
- package/dist/core/session/session-manager.js +308 -251
- package/dist/core/session/session-mapper.js +9 -4
- package/dist/core/trigger/manager.js +3 -3
- package/dist/core/trigger/parser.js +4 -4
- package/dist/core/trigger/scheduler.js +22 -7
- package/dist/index.js +61 -7
- package/dist/ipc.js +23 -1
- package/dist/utils/error-utils.js +6 -0
- package/dist/utils/process-introspect.js +7 -5
- package/kits/docs/GUIDE.md +2 -2
- package/kits/docs/INDEX.md +8 -8
- package/kits/docs/channels/aun.md +56 -17
- package/kits/docs/channels/feishu.md +41 -12
- package/kits/docs/context-assembly.md +182 -0
- package/kits/docs/evolclaw/INDEX.md +43 -0
- package/kits/docs/evolclaw/agent.md +49 -0
- package/kits/docs/evolclaw/aid.md +49 -0
- package/kits/docs/evolclaw/ctl.md +46 -0
- package/kits/docs/evolclaw/group.md +89 -0
- package/kits/docs/evolclaw/model.md +51 -0
- package/kits/docs/evolclaw/msg.md +91 -0
- package/kits/docs/evolclaw/rpc.md +35 -0
- package/kits/docs/evolclaw/storage.md +49 -0
- package/kits/docs/venues/aun-group.md +10 -0
- package/kits/docs/venues/aun-private.md +10 -0
- package/kits/docs/venues/client-desktop.md +10 -0
- package/kits/docs/venues/client-mobile.md +10 -0
- package/kits/docs/venues/feishu-group.md +13 -0
- package/kits/docs/venues/feishu-private.md +9 -0
- package/kits/docs/venues/group.md +23 -0
- package/kits/docs/venues/private.md +10 -0
- package/kits/eck_manifest.json +81 -36
- package/kits/rules/01-overview.md +20 -10
- package/kits/rules/06-channel.md +34 -27
- package/kits/templates/system-fragments/baseagent.md +7 -1
- package/kits/templates/system-fragments/channel.md +7 -5
- package/kits/templates/system-fragments/commands.md +19 -0
- package/kits/templates/system-fragments/session.md +19 -3
- package/kits/templates/system-fragments/venue.md +24 -0
- package/package.json +10 -5
- package/dist/aun/aid/lifecycle-log.js +0 -33
- package/dist/utils/aid-lifecycle-log.js +0 -33
- package/kits/docs/evolclaw/AGENT_CMD.md +0 -31
- package/kits/docs/evolclaw/MSG_GROUP.md +0 -30
- package/kits/docs/evolclaw/MSG_PRIVATE.md +0 -72
- package/kits/docs/evolclaw/tools.md +0 -25
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# 上下文组装机制(manifest)
|
|
2
|
+
|
|
3
|
+
ECK 把"每条消息该给 base agent 看哪些上下文"这件事,交给一份 **manifest** 声明式描述,由 `renderKitSections`(`src/agents/kit-renderer.ts`)在每次处理消息时执行。本文是这套机制的完整参考。
|
|
4
|
+
|
|
5
|
+
> 本文是按需载入文档。日常对话不需要读它——只有在排查"为什么某段上下文没出现/出现了"、要改 manifest、或要看实际渲染结果时才 Read。
|
|
6
|
+
|
|
7
|
+
## 三个阶段
|
|
8
|
+
|
|
9
|
+
evolclaw 收到消息 → 构造一份 **vars**(运行时变量,见下)→ `renderKitSections`:
|
|
10
|
+
|
|
11
|
+
1. **选段**:按 manifest 顺序遍历每个 section,用它的 `when` 条件 + 当前 vars 判断是否加载。
|
|
12
|
+
2. **渲染**:解析 section 路径里的 `$NAME` / `{{key}}` 占位符定位文件;`needsInjection:true` 的文件再跑一遍模板渲染(条件块 + 变量替换)。
|
|
13
|
+
3. **拼装**:所有命中的文件内容包进一个 `<system-reminder>` 块,作为 system prompt 的一部分注入。
|
|
14
|
+
|
|
15
|
+
整个过程对每次消息执行一次,结果同时落盘到调试目录(见"调试机制")。
|
|
16
|
+
|
|
17
|
+
## manifest 文件位置
|
|
18
|
+
|
|
19
|
+
| 文件 | 角色 | 性质 |
|
|
20
|
+
|------|------|------|
|
|
21
|
+
| `$KITS/eck_manifest.json` | 基础 manifest(开发时维护) | 只读 |
|
|
22
|
+
| `$ECK/eck_manifest.json` | 用户覆盖(可选,默认不存在) | 可写 |
|
|
23
|
+
|
|
24
|
+
加载时合并两者(见"合并与覆盖")。manifest 只加载一次并缓存。
|
|
25
|
+
|
|
26
|
+
## section 字段
|
|
27
|
+
|
|
28
|
+
manifest 是 `{ "$schema_version": 1, "sections": [...] }`。每个 section:
|
|
29
|
+
|
|
30
|
+
| 字段 | 必填 | 含义 |
|
|
31
|
+
|------|------|------|
|
|
32
|
+
| `id` | ✓ | 唯一标识,覆盖合并的键 |
|
|
33
|
+
| `type` | ✓ | `file`(单文件)或 `directory`(整目录) |
|
|
34
|
+
| `file` | type=file | 文件路径,可含 `$NAME` / `{{key}}` |
|
|
35
|
+
| `path` | type=directory | 目录路径 |
|
|
36
|
+
| `pattern` | | 目录匹配 glob,默认 `*.md`(支持 `*` 和 `{a,b}`) |
|
|
37
|
+
| `order` | ✓ | 排序,**升序**决定上下文中出现的先后 |
|
|
38
|
+
| `needsInjection` | ✓ | `true`=按模板渲染(解析 `{{}}` 条件与变量);`false`=原样读入 |
|
|
39
|
+
| `when` | ✓ | 加载条件,`"always"` 或条件对象(见下) |
|
|
40
|
+
| `enabled` | | `false` 时整段跳过 |
|
|
41
|
+
| `description` | | 调试输出里的人类可读标签 |
|
|
42
|
+
|
|
43
|
+
## when 条件求值
|
|
44
|
+
|
|
45
|
+
`when` 是 `"always"` 或一个对象。求值规则(`evaluateWhen`):
|
|
46
|
+
|
|
47
|
+
| 写法 | 含义 |
|
|
48
|
+
|------|------|
|
|
49
|
+
| `"always"` | 恒为真 |
|
|
50
|
+
| `{ "var": "X", "eq": V }` | `vars.X === V`;`eq:null` 匹配"未注入"(null/undefined) |
|
|
51
|
+
| `{ "var": "X", "neq": V }` | `vars.X !== V`;`neq:null` 匹配"已注入" |
|
|
52
|
+
| `{ "var": "X", "in": [...] }` | `vars.X` 在数组内 |
|
|
53
|
+
| `{ "var": "X", "nin": [...] }` | `vars.X` 不在数组内 |
|
|
54
|
+
| `{ "any": ["A","B"] }` | A、B 任一为真值 |
|
|
55
|
+
| `{ "all": ["A","B"] }` | A、B 全为真值 |
|
|
56
|
+
|
|
57
|
+
"真值"判定:非 `undefined`/`null`/`false`/`""`/`0`。
|
|
58
|
+
|
|
59
|
+
典型用法:`{ "var": "chatType", "neq": null }` = "非 coding 场景才加载";`{ "var": "groupId", "neq": null }` = "群聊才加载"。
|
|
60
|
+
|
|
61
|
+
## 合并与覆盖
|
|
62
|
+
|
|
63
|
+
无 `$ECK/eck_manifest.json` 时,直接用基础 manifest。存在时:
|
|
64
|
+
|
|
65
|
+
- 覆盖文件含 `"mode": "replace"` → **完全替换**,只用覆盖文件的 sections。
|
|
66
|
+
- 否则 **patch 合并**:以 `id` 为键,覆盖文件里同 id 的字段浅合并进基础 section(`{...base, ...override}`),新 id 追加。
|
|
67
|
+
|
|
68
|
+
合并后统一按 `order` 升序排序。改某段行为(如关掉某层、调顺序、换条件)优先用覆盖文件,不动基础 manifest。
|
|
69
|
+
|
|
70
|
+
## 路径与模板渲染
|
|
71
|
+
|
|
72
|
+
### 路径占位符(所有 section 的 file/path)
|
|
73
|
+
|
|
74
|
+
- `$NAME`(大写)→ 从 vars 取真值,如 `$KITS_DOCS` → 包内文档目录。
|
|
75
|
+
- `{{key}}` → 从 vars 取真值,如 `{{chatType}}` → `private`,`{{peerKey}}` → `aun#alice.aid.pub`。
|
|
76
|
+
|
|
77
|
+
任一占位符解析为空 → 该 section 视为"未解析",跳过(调试输出标 `unresolved-vars`)。文件不存在 → 标 `not-exist`,也跳过。这是**正常机制**:很多 section 靠"路径解析不出来"自然落选(如 coding 场景没有 `$PERSONAL_DIR`)。
|
|
78
|
+
|
|
79
|
+
### 模板渲染(仅 needsInjection:true 的文件)
|
|
80
|
+
|
|
81
|
+
读入跑三遍:
|
|
82
|
+
|
|
83
|
+
1. **条件块**(内层优先,可嵌套):
|
|
84
|
+
- `{{?key}}...{{/}}` — key 为真值才保留
|
|
85
|
+
- `{{?key=value}}...{{/}}` — `String(vars.key)===value` 才保留
|
|
86
|
+
- `{{?key!=value}}...{{/}}` — 不等才保留
|
|
87
|
+
2. **变量替换**:`{{key}}` 替换为值,非真值替换为空串。
|
|
88
|
+
3. **清理**:删掉空行。
|
|
89
|
+
|
|
90
|
+
`needsInjection:false` 的文件原样读入,不做任何替换(如 rules 目录、persona.md、各 venue 文档)。
|
|
91
|
+
|
|
92
|
+
## 运行时变量(vars)目录
|
|
93
|
+
|
|
94
|
+
vars 由 evolclaw 在 `message-processor.ts` 按当前会话构造。分两类:
|
|
95
|
+
|
|
96
|
+
**路径类**(供占位符展开成真实路径):
|
|
97
|
+
`EVOLCLAW_HOME`、`PACKAGE_ROOT`、`CURRENT_PROJECT`、`KITS`、`KITS_RULES`、`KITS_DOCS`、`KITS_TEMPLATES`、`KITS_FRAGMENTS`、`PERSONAL_DIR`、`RELATIONS_DIR`、`VENUES_DIR`。
|
|
98
|
+
|
|
99
|
+
**内容/场景类**(供 when 判断与模板替换):
|
|
100
|
+
|
|
101
|
+
| 变量 | 含义 |
|
|
102
|
+
|------|------|
|
|
103
|
+
| `selfAid` / `selfName` | 当前 agent 身份 |
|
|
104
|
+
| `hasPersona` / `hasWorkingMemory` | 是否有人格 / 当前关注 |
|
|
105
|
+
| `peerId` / `peerKey` / `peerName` | 对端原生 ID / 跨渠道键 / 显示名 |
|
|
106
|
+
| `peerRole` / `peerType` | 对端角色(owner/admin/guest/...)/ 类型(human/agent) |
|
|
107
|
+
| `groupId` | 群 ID(群聊时) |
|
|
108
|
+
| `chatType` | `private` / `group` / `null`(coding) |
|
|
109
|
+
| `channel` | 渠道类型(aun/feishu/...)|
|
|
110
|
+
| `dispatch` | 群分发模式(mention/broadcast) |
|
|
111
|
+
| `clientType` | 客户端类型(desktop/web/mobile) |
|
|
112
|
+
| `permissionMode` / `readonly` | 权限模式 / 是否只读 |
|
|
113
|
+
| `capabilities` | 当前渠道能力(图片输入/输出、文件发送) |
|
|
114
|
+
| `project` / `CURRENT_PROJECT` | 项目目录名 / 完整路径 |
|
|
115
|
+
| `sessionId` / `sessionName` / `sessionKey` / `sessionCreatedAt` / `threadId` | 会话标识与元信息 |
|
|
116
|
+
| `chatMode` | `interactive` / `proactive` |
|
|
117
|
+
| `baseAgent` / `baseAgentName` / `baseAgentModel` / `agentSessionId` | base agent 信息 |
|
|
118
|
+
|
|
119
|
+
coding 场景(无 channel/无身份)下,`chatType`、`channel`、`selfAid`、`peer*` 等均为空——这正是身份/关系/环境/渠道层落选的原因。
|
|
120
|
+
|
|
121
|
+
## 默认 manifest 的段(按 order)
|
|
122
|
+
|
|
123
|
+
| order | id | 类型 | 加载条件(when) | inject |
|
|
124
|
+
|-------|----|----|------------------|--------|
|
|
125
|
+
| 10 | rules | 目录 `$KITS_RULES` | always | ✗ |
|
|
126
|
+
| 20 | identity-layer | fragment | chatType≠null | ✓ |
|
|
127
|
+
| 21 | persona | `$PERSONAL_DIR/persona.md` | chatType≠null | ✗ |
|
|
128
|
+
| 22 | working-memory | `$PERSONAL_DIR/memory/working.md` | chatType≠null | ✗ |
|
|
129
|
+
| 30 | relation-layer | fragment | chatType∈{private,group} | ✓ |
|
|
130
|
+
| 35 | peer-profile | `$RELATIONS_DIR/{{peerKey}}/profile.md` | peerKey≠null | ✗ |
|
|
131
|
+
| 40 | venue-fragment | fragment | chatType≠null | ✓ |
|
|
132
|
+
| 41 | venue-chattype | `$KITS_DOCS/venues/{{chatType}}.md` | chatType≠null | ✗ |
|
|
133
|
+
| 42 | venue-channel-chattype | `$KITS_DOCS/venues/{{channel}}-{{chatType}}.md` | chatType≠null | ✗ |
|
|
134
|
+
| 43 | venue-group-profile | `$VENUES_DIR/{{channel}}#{{groupId}}/profile.md` | groupId≠null | ✗ |
|
|
135
|
+
| 44 | venue-client | `$KITS_DOCS/venues/client-{{clientType}}.md` | clientType≠null | ✗ |
|
|
136
|
+
| 50 | channel-layer | fragment | channel≠null | ✓ |
|
|
137
|
+
| 55 | commands | fragment | channel≠null | ✓ |
|
|
138
|
+
| 60 | session | fragment | always | ✓ |
|
|
139
|
+
| 70 | baseagent | fragment | baseAgent≠null | ✓ |
|
|
140
|
+
|
|
141
|
+
> 注意:`session`(60) 是 `always`,`baseagent`(70) 只看 `baseAgent` 是否注入——这两段**与 chatType 无关**,coding 场景也会加载。所谓"coding 仅 rules"是近似说法:精确地说 coding 场景命中的是 rules + session + baseagent(其余因 chatType/channel 为空而落选)。
|
|
142
|
+
|
|
143
|
+
## 输出结构
|
|
144
|
+
|
|
145
|
+
所有命中 section 的文件内容拼成一个块,注入 system prompt:
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
<system-reminder>
|
|
149
|
+
EvolClaw Context Kit documents are shown below.
|
|
150
|
+
|
|
151
|
+
Contenu de <展示路径> (<id — description>):
|
|
152
|
+
|
|
153
|
+
<文件内容>
|
|
154
|
+
|
|
155
|
+
...(每个文件一段,按 order)
|
|
156
|
+
|
|
157
|
+
IMPORTANT: Use this context when it affects the current interaction.
|
|
158
|
+
</system-reminder>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
展示路径会把绝对路径回缩成 `$KITS_RULES`/`$AGENT_DIR` 等别名。`needsInjection:true` 的段额外单独汇总到 `fragments-*.md` 调试文件(见下)。
|
|
162
|
+
|
|
163
|
+
## 调试机制(看实际渲染结果)
|
|
164
|
+
|
|
165
|
+
每次渲染都把结果落盘到 **`$EVOLCLAW_HOME/data/eck-debug/`**,文件名带时间戳(`<字段>-YYYY-MM-DD-HH-MM-SS`):
|
|
166
|
+
|
|
167
|
+
| 文件 | 内容 |
|
|
168
|
+
|------|------|
|
|
169
|
+
| `vars-<ts>.json` | 本次注入的全部 vars 真值 + 每个变量的中文说明 |
|
|
170
|
+
| `context-<ts>.md` | 最终注入 base agent 的完整 `<system-reminder>` 块(即上面"输出结构"的实际产物) |
|
|
171
|
+
| `fragments-<ts>.md` | 仅经过模板渲染(needsInjection)的段,单独汇总,便于核对 `{{}}` 替换是否正确 |
|
|
172
|
+
| `manifest-<ts>.md` | **诊断报告**:每个 section 的 when 是否通过、路径解析状态(ok/unresolved-vars/not-exist/skipped)、是否被用上、是否注入;含未解析占位符清单 |
|
|
173
|
+
|
|
174
|
+
排查"某段为什么没出现":看 `manifest-<ts>.md` 里该 section 的 `status` 和 `unresolved tokens`。看"实际给 agent 的全文":读 `context-<ts>.md`。
|
|
175
|
+
|
|
176
|
+
调试文件保留 24 小时,`cleanEckDebug` 自动清理过期的。
|
|
177
|
+
|
|
178
|
+
## 缓存与热加载
|
|
179
|
+
|
|
180
|
+
- **manifest 缓存**:`_manifestCache`,进程内只加载一次。改了 manifest 需触发 `invalidateKitCache()`(或重启)才生效。
|
|
181
|
+
- **文件内容缓存**:`_sessionPathCache` 按 `sessionId` 缓存已读文件内容;`invalidateSessionCache(sessionId)` 清单个会话。
|
|
182
|
+
- rules / fragments / docs 这些 `kits/` 下的文件,改完一般随会话重建生效(缓存按会话隔离);manifest 本身的结构改动需要 invalidate。
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# EvolClaw 命令集目录
|
|
2
|
+
|
|
3
|
+
所有 `ec` 命令集的专属索引:用途、触发词、适用场景、详细文档。
|
|
4
|
+
运行时 evolclaw 会通过 `commands` fragment 按当前场景(有无 peer/group、对端角色)
|
|
5
|
+
注入一张精简能力卡,指向本目录下对应文档;需要完整用法时 Read 对应文档。
|
|
6
|
+
|
|
7
|
+
> 命令通用约定:以自己 AID 为发送者;必须走 CLI,不在会话里直接输出对外消息;
|
|
8
|
+
> `--format json` 所有命令通用;`--app <name>` 指定应用 slot(独立消费通道)。
|
|
9
|
+
|
|
10
|
+
## 对外通信 / 网络类(连 AUN,以 AID 为发送者)
|
|
11
|
+
|
|
12
|
+
| 命令集 | 用途 | 触发词 | 适用场景 | 文档 |
|
|
13
|
+
|--------|------|--------|----------|------|
|
|
14
|
+
| `ec msg` | 私聊收发消息 | 回复/发消息/拉取/撤回/查在线 | 有对端(peerId) | `msg.md` |
|
|
15
|
+
| `ec group` | 群聊收发与群管理 | 群发/建群/邀请/踢人/退群/群成员 | 群聊(groupId) | `group.md` |
|
|
16
|
+
| `ec aid` | AID 身份管理 | 身份/证书/名片/探测对端 | 任意有渠道场景 | `aid.md` |
|
|
17
|
+
| `ec storage` | 文件存储 | 上传/下载/配额 | 任意有渠道场景 | `storage.md` |
|
|
18
|
+
| `ec agent` | EvolAgent 生命周期 | 创建/启停/热重载/改配置 | 管理员(owner/admin) | `agent.md` |
|
|
19
|
+
| `ec rpc` | 底层 AUN RPC(逃生通道) | 直接调协议方法 | 高级/兜底 | `rpc.md` |
|
|
20
|
+
|
|
21
|
+
## 会话自管理类(不连 AUN,操作当前会话)
|
|
22
|
+
|
|
23
|
+
| 命令集 | 用途 | 触发词 | 文档 |
|
|
24
|
+
|--------|------|--------|------|
|
|
25
|
+
| `ec ctl` | 会话运行时自管理 | 切模型/推理强度/压缩/重启/主动发消息 | `ctl.md` |
|
|
26
|
+
|
|
27
|
+
## 本地工具类(不连 AUN,操作本地配置)
|
|
28
|
+
|
|
29
|
+
| 命令集 | 用途 | 触发词 | 文档 |
|
|
30
|
+
|--------|------|--------|------|
|
|
31
|
+
| `ec model` | 模型管理(按作用域持久化) | 切模型/列模型/看当前/改强度 | `model.md` |
|
|
32
|
+
|
|
33
|
+
## 开发者工具(非 agent 会话能力)
|
|
34
|
+
|
|
35
|
+
| 命令 | 用途 | 说明 |
|
|
36
|
+
|------|------|------|
|
|
37
|
+
| `ec bench` | AUN 消息系统性能基准测试 | CLI 工具,agent 一般不主动调用;`ec bench --help` 查看用法 |
|
|
38
|
+
|
|
39
|
+
## 其他
|
|
40
|
+
|
|
41
|
+
| 文档 | 说明 |
|
|
42
|
+
|------|------|
|
|
43
|
+
| `self-summary.md` | 自我总结流程指南 |
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# ec agent — EvolAgent 生命周期管理
|
|
2
|
+
|
|
3
|
+
管理本机托管的 EvolAgent(创建、启停、配置、热重载)。触发词:创建/新建/列出/查看/启用/禁用/删除/热重载/改配置。
|
|
4
|
+
|
|
5
|
+
## 子命令
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 列出所有 agent
|
|
9
|
+
ec agent list
|
|
10
|
+
|
|
11
|
+
# 查看 agent 详情(身份 + 配置 + 连接 + 会话 + 路径)
|
|
12
|
+
ec agent show <aid>
|
|
13
|
+
|
|
14
|
+
# 创建 agent(交互式)
|
|
15
|
+
ec agent new [aid]
|
|
16
|
+
|
|
17
|
+
# 创建 agent(非交互式,自动化场景)
|
|
18
|
+
ec agent new <aid> --non-interactive --project <绝对路径> \
|
|
19
|
+
[--baseagent claude|codex|gemini] [--owner <aid>] \
|
|
20
|
+
[--name "<显示名>"] [--description "<text>"] [--force]
|
|
21
|
+
|
|
22
|
+
# 启用 / 停用
|
|
23
|
+
ec agent enable <aid>
|
|
24
|
+
ec agent disable <aid>
|
|
25
|
+
|
|
26
|
+
# 读 / 改单个配置字段(支持点路径,如 active_baseagent)
|
|
27
|
+
ec agent get <aid> <key>
|
|
28
|
+
ec agent set <aid> <key> <val>
|
|
29
|
+
|
|
30
|
+
# 改 agent 名称(更新 agent.md 并重新上传)
|
|
31
|
+
ec agent rename <aid> "<name>"
|
|
32
|
+
|
|
33
|
+
# 热重载配置(无参数 = 全量 resync:扫磁盘,新增上线/删除下线/修改热更新)
|
|
34
|
+
ec agent reload [aid]
|
|
35
|
+
|
|
36
|
+
# 删除 agent(--purge 连数据一并清除)
|
|
37
|
+
ec agent delete <aid> [--purge]
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 非交互创建必填项
|
|
41
|
+
|
|
42
|
+
`ec agent new <aid> --non-interactive` 时:
|
|
43
|
+
- 必填:`--project <absolute path>`
|
|
44
|
+
- 可选:`--baseagent`(默认 PATH 中第一个可用项)、`--owner`、`--name`、`--description`、`--force`(覆盖已有 config.json)
|
|
45
|
+
|
|
46
|
+
## 通用约定
|
|
47
|
+
|
|
48
|
+
- `--format json` — 输出 JSON
|
|
49
|
+
- `--help` / `-h` — 各子命令均支持,查看详细用法
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# ec aid — AID 身份管理
|
|
2
|
+
|
|
3
|
+
管理本地 AID 身份(证书、私钥、agent.md 名片),以及远程探测对端 AID。触发词:身份/证书/名片/探测对端/创建身份。
|
|
4
|
+
|
|
5
|
+
## 子命令
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 列出本地所有 AID(实测 sign+verify)
|
|
9
|
+
ec aid list [筛选选项] [--no-verify]
|
|
10
|
+
|
|
11
|
+
# 查看本地 AID 详情(证书有效期、私钥状态、签名能力)
|
|
12
|
+
ec aid show <aid>
|
|
13
|
+
|
|
14
|
+
# 创建新 AID 身份
|
|
15
|
+
ec aid new <aid>
|
|
16
|
+
|
|
17
|
+
# 远程探测 AID(是否存在 + 网关 + agent.md)
|
|
18
|
+
ec aid lookup <aid>
|
|
19
|
+
|
|
20
|
+
# agent.md 名片:签名上传 / 下载验签
|
|
21
|
+
ec aid agentmd put <aid>
|
|
22
|
+
ec aid agentmd get <aid>
|
|
23
|
+
|
|
24
|
+
# 删除指定本地 AID(无网络注销)
|
|
25
|
+
ec aid delete <aid>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## list 筛选选项
|
|
29
|
+
|
|
30
|
+
不指定 = 列出 mine + broken + peer-cert(隐藏 no-cert)。可组合:
|
|
31
|
+
- `--mine` — 仅本地可用身份(实测可签名+验签通过)
|
|
32
|
+
- `--broken` — 仅有私钥但不可用(公钥不匹配 / 证书过期 / sign 失败)
|
|
33
|
+
- `--peer-cert` — 仅对端 AID(无私钥,有公钥证书)
|
|
34
|
+
- `--no-cert` — 仅无私钥无证书的孤儿目录
|
|
35
|
+
- `--no-verify` — 跳过 sign+verify 实测,仅静态扫描(更快)
|
|
36
|
+
|
|
37
|
+
输出图标:`🔑` 有私钥 · `✅` 实测可签名/验签 · `❌` 不可签名 · `⌛` 证书过期 · `📜` 有公钥证书 · `📄` 有 agent.md
|
|
38
|
+
|
|
39
|
+
## delete 批量清理
|
|
40
|
+
|
|
41
|
+
批量删除**默认 dry-run,加 `--yes` 才真正执行**:
|
|
42
|
+
- `ec aid delete --orphan` — 清理无私钥的外部 AID 缓存
|
|
43
|
+
- `ec aid delete --no-cert` — 清理无私钥也无公钥证书的孤儿目录
|
|
44
|
+
- `ec aid delete --unrecoverable` — 清理云端公钥已变更、本地不可恢复的 AID
|
|
45
|
+
|
|
46
|
+
## 通用约定
|
|
47
|
+
|
|
48
|
+
- `--format json` — 输出 JSON
|
|
49
|
+
- `--help` / `-h` — 各子命令均支持
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# ec ctl — 会话运行时自管理
|
|
2
|
+
|
|
3
|
+
对**当前会话**的运行时自管理:切模型、调推理强度、压缩上下文、切权限、重启服务。触发词:切模型/推理强度/压缩上下文/切权限/重启。
|
|
4
|
+
|
|
5
|
+
> ctl 命令通过 IPC 转发给 daemon,仅在 evolclaw 托管环境中可用(依赖 `EVOLCLAW_SESSION_ID`)。
|
|
6
|
+
|
|
7
|
+
## 查询
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
ec ctl status # 查看会话状态
|
|
11
|
+
ec ctl check # 检查渠道健康状态
|
|
12
|
+
ec ctl pwd # 显示当前项目路径
|
|
13
|
+
ec ctl help # 显示帮助
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## 配置
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
ec ctl model [model-id] # 查看/切换模型(如 opus, sonnet, haiku)
|
|
20
|
+
ec ctl effort [low|medium|high] # 查看/切换推理强度
|
|
21
|
+
ec ctl compact # 压缩当前会话上下文
|
|
22
|
+
ec ctl perm [mode] # 查看/切换权限模式
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 消息(兜底用)
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
ec ctl send "<text>" # 主动发送文本(proactive 模式)
|
|
29
|
+
ec ctl file [channel] <path> # 发送项目内文件
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
> 发消息**首选 `ec msg send <self-aid> <peer-id> "<text>"`**(见 msg.md)。
|
|
33
|
+
> `ec ctl send` 只在拿不到自己的 AID 时兜底——它自动继承当前会话的 AID 和对端。
|
|
34
|
+
|
|
35
|
+
## 运维
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
ec ctl restart [channel] # 重启服务,或重连指定渠道
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 相关命令集
|
|
42
|
+
|
|
43
|
+
- agent 全生命周期管理(创建/启停/配置)→ `ec agent`(见 agent.md)
|
|
44
|
+
- AID 身份与 agent.md 名片 → `ec aid`(见 aid.md)
|
|
45
|
+
|
|
46
|
+
ctl 内也转发了 `ec ctl agent <subcommand>`,但完整功能请直接用 `ec agent`。
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# ec group — 群聊消息与群管理
|
|
2
|
+
|
|
3
|
+
群聊场景下收发消息、管理群与成员。触发词:群发/建群/邀请/踢人/退群/群成员。
|
|
4
|
+
|
|
5
|
+
以自己的 AID 为发送者(`<from>`),群 AID 为 `<group-id>`。
|
|
6
|
+
|
|
7
|
+
## 消息
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# 文本(含空格/换行/特殊字符时用引号包起来;纯短词可不包,但多空格会被压成一个)
|
|
11
|
+
ec group send <from> <group-id> "<text>" [--encrypt]
|
|
12
|
+
|
|
13
|
+
# 文件(--as image|video|voice|file)
|
|
14
|
+
ec group send <from> <group-id> --file <path> [--as <type>] [--text "<说明>"]
|
|
15
|
+
|
|
16
|
+
# 自定义 payload
|
|
17
|
+
ec group send <from> <group-id> --payload '<json>'
|
|
18
|
+
|
|
19
|
+
# 拉取群消息(建议带 --app 独立消费通道,避免影响 daemon)
|
|
20
|
+
ec group pull <from> <group-id> [--after-seq <N>] [--limit <N>] [--app <name>]
|
|
21
|
+
|
|
22
|
+
# 确认已读(推进消费游标;同样建议带 --app)
|
|
23
|
+
ec group ack <from> <group-id> <seq> [--app <name>]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
@ 成员:
|
|
27
|
+
- `--mention <aid>` — @ 某个成员,可多次,或单个槽位用逗号分隔多个(`--mention a,b,c`),每个 aid 都过格式校验
|
|
28
|
+
- `--mention-all` — @ 所有人
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
ec group send <from> <group-id> "@bob 看下 PR" --mention bob.agentid.pub
|
|
32
|
+
ec group send <from> <group-id> "通知" --mention alice.agentid.pub,bob.agentid.pub
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
> 正文恰好以 `--` 开头:带空格的(如 `"--file 是正文"`)会被正确识别为正文;
|
|
36
|
+
> 若正文**精确等于**某个 flag 名(如要发送文本 `--encrypt`),用 `--` 分隔:
|
|
37
|
+
> `ec group send <from> <group-id> -- --encrypt`
|
|
38
|
+
|
|
39
|
+
## 群管理
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# 创建群
|
|
43
|
+
ec group create <from> "<name>" [--visibility public|private] [--description "<desc>"] [--join-mode <mode>]
|
|
44
|
+
|
|
45
|
+
# 列出我加入的群
|
|
46
|
+
ec group list <from> [--size <N>]
|
|
47
|
+
|
|
48
|
+
# 查看群详情
|
|
49
|
+
ec group info <from> <group-id>
|
|
50
|
+
|
|
51
|
+
# 修改群信息
|
|
52
|
+
ec group update <from> <group-id> [--name "<name>"] [--description "<desc>"]
|
|
53
|
+
|
|
54
|
+
# 解散群
|
|
55
|
+
ec group dissolve <from> <group-id>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## 成员
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# 申请加入
|
|
62
|
+
ec group join <from> <group-id> [--message "<msg>"] [--answer "<answer>"]
|
|
63
|
+
|
|
64
|
+
# 退出群
|
|
65
|
+
ec group leave <from> <group-id>
|
|
66
|
+
|
|
67
|
+
# 邀请成员(可多个)
|
|
68
|
+
ec group invite <from> <group-id> <member-aid> [<member-aid>...]
|
|
69
|
+
|
|
70
|
+
# 踢出成员
|
|
71
|
+
ec group kick <from> <group-id> <member-aid>
|
|
72
|
+
|
|
73
|
+
# 列出群成员
|
|
74
|
+
ec group members <from> <group-id> [--page <N>] [--size <N>]
|
|
75
|
+
|
|
76
|
+
# 查看在线成员
|
|
77
|
+
ec group online <from> <group-id>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 通用约定
|
|
81
|
+
|
|
82
|
+
- `<from>` 必须是合法 AID(入口统一校验,格式错直接报错)
|
|
83
|
+
- `--format json` — 所有子命令通用
|
|
84
|
+
- `--app <name>` — 指应用 slot(独立消费通道,不影响 daemon)
|
|
85
|
+
- `--encrypt` — 仅 send,启用端到端加密(群聊默认明文)
|
|
86
|
+
|
|
87
|
+
## 自主回复策略
|
|
88
|
+
|
|
89
|
+
群聊中默认被 @ 才响应,可通过 venue policy 配置其他触发条件。
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# ec model — 模型管理命令集
|
|
2
|
+
|
|
3
|
+
按作用域查看/设置 agent 使用的模型与推理强度。触发词:切模型/列模型/看当前模型/改强度/模型详情/检查可用模型/诊断网关。
|
|
4
|
+
|
|
5
|
+
> 与 `ec ctl model`(会话内即时切当前会话模型)不同:`ec model` 改的是**持久化作用域配置**,
|
|
6
|
+
> 影响对应范围所有会话的下一条消息;`ec ctl` 只作用于当前运行中的会话。
|
|
7
|
+
|
|
8
|
+
## 命令
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
# 列出可用模型,标注各作用域命中
|
|
12
|
+
ec model list
|
|
13
|
+
|
|
14
|
+
# 显示按优先级解析后实际生效的模型 + 来源
|
|
15
|
+
ec model current [--self <aid>] [--peer <X>]
|
|
16
|
+
|
|
17
|
+
# 查看单个模型详情(厂商/上下文/价格/模态/effort/状态)
|
|
18
|
+
ec model info <model-id>
|
|
19
|
+
|
|
20
|
+
# 设置模型(作用域由 --self/--peer 决定)
|
|
21
|
+
ec model use <model-id> [--self <aid>] [--peer <X>] [--effort <level>]
|
|
22
|
+
|
|
23
|
+
# 清除指定作用域设置,回落上一级
|
|
24
|
+
ec model reset [--self <aid>] [--peer <X>]
|
|
25
|
+
|
|
26
|
+
# 设置推理强度(low|medium|high|xhigh|max|auto)
|
|
27
|
+
ec model effort <level> [--self <aid>] [--peer <X>]
|
|
28
|
+
|
|
29
|
+
# 诊断网关连通性与模型可用性(分阶段输出)
|
|
30
|
+
# 阶段1: 网关 DNS/TCP 连通性
|
|
31
|
+
# 阶段2: 认证 + 模型列表获取(v1/models → models → remote → mock 降级)
|
|
32
|
+
# 阶段3: 当前配置模型确认
|
|
33
|
+
# 阶段4: 模型可用性探测(弱并发 → 4并发,约 10s 内完成)
|
|
34
|
+
ec model check [--self <aid>] [--peer <X>]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 作用域(越具体越优先:关系 > agent > 全局)
|
|
38
|
+
|
|
39
|
+
| 参数 | 作用域 | 落盘 |
|
|
40
|
+
|------|--------|------|
|
|
41
|
+
| (无) | 全局默认 | `defaults.json` |
|
|
42
|
+
| `--self <aid>` | agent 级 | `config.json` |
|
|
43
|
+
| `--self <aid> --peer <X>` | 关系级 | `relations/<peerKey>/preferences.json` |
|
|
44
|
+
|
|
45
|
+
`--peer` 取 `channelType#channelId` 或裸 aid(裸 aid 视为 `aun#<aid>`)。改某作用域后,对应范围所有会话的下一条消息即时生效。
|
|
46
|
+
|
|
47
|
+
## 通用约定
|
|
48
|
+
|
|
49
|
+
- `--format json` — 所有子命令通用
|
|
50
|
+
- 本命令不连 AUN 网络,操作本地配置;与对话内 slash(/model /effort)互不影响
|
|
51
|
+
- `check` 子命令例外:会连接网关发探测请求,未配置自定义 baseUrl 时跳过 API 探测
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# ec msg — 私聊消息命令
|
|
2
|
+
|
|
3
|
+
私聊场景下收发消息的命令集。触发词:回复/发消息/拉取/撤回/查在线。
|
|
4
|
+
|
|
5
|
+
以自己的 AID 为发送者(`<from>`),对端 AID 为 `<to>`。
|
|
6
|
+
|
|
7
|
+
## 发送消息
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# 文本(明文)
|
|
11
|
+
ec msg send <from> <to> "<text>"
|
|
12
|
+
|
|
13
|
+
# 文本(密文 E2EE)
|
|
14
|
+
ec msg send <from> <to> "<text>" --encrypt
|
|
15
|
+
|
|
16
|
+
# 文件:--as 可选 image|video|voice|file(默认按扩展名推断)
|
|
17
|
+
ec msg send <from> <to> --file <path> [--as <type>]
|
|
18
|
+
|
|
19
|
+
# 链接卡片
|
|
20
|
+
ec msg send <from> <to> --link <url> [--title "<title>"] [--description "<desc>"]
|
|
21
|
+
|
|
22
|
+
# 自定义 payload(JSON)
|
|
23
|
+
ec msg send <from> <to> --payload '<json>'
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
发送相关选项:
|
|
27
|
+
- `--encrypt` — 端到端加密
|
|
28
|
+
- `--thread <id>` — 指定话题 ID(多话题路由)
|
|
29
|
+
- `--content-type <mime>` — 显式覆盖 MIME(仅 `--file`)
|
|
30
|
+
- `--text <说>` — 附件说明文字(仅 `--file`)
|
|
31
|
+
- `--transcript <text>` — 语音转写(仅 `--as voice`)
|
|
32
|
+
|
|
33
|
+
成功输出:`✓ 已发送 <message_id> seq=<n> status=<status>`
|
|
34
|
+
|
|
35
|
+
> 正文写法:含空格/换行/特殊字符时用引号包起来;纯短词可不包,但多空格会被压成一个。
|
|
36
|
+
> 正文恰好以 `--` 开头:带空格的(如 `"--file 是正文"`)会被正确识别为正文;
|
|
37
|
+
> 若正文**精确等于**某个 flag 名(如要发送文本 `--encrypt`),用 `--` 分隔:
|
|
38
|
+
> `ec msg send <from> <to> -- --encrypt`
|
|
39
|
+
|
|
40
|
+
## 拉取消息
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
ec msg pull <from> --app <name>
|
|
44
|
+
ec msg pull <from> --app <name> --after-seq <N> --limit <N>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`--app <name>` 指定独立消费通道(slot)。**不传 `--app` 会与 daemon 共享 evolclaw 消费游标,可能影响 daemon 收消息。**
|
|
48
|
+
|
|
49
|
+
## 确认已读
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
ec msg ack <from> <seq> --app <name>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
同样:不传 `--app` 会推进与 daemon 共享的游标。
|
|
56
|
+
|
|
57
|
+
## 撤回消息
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
ec msg recall <from> <message-id> [<message-id>...]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 查询在线状态
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
ec msg online <from> <target-aid> [<target-aid>...]
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
输出:`🟢` 在线 / `⚫` 离线。
|
|
70
|
+
|
|
71
|
+
## 通用约定
|
|
72
|
+
|
|
73
|
+
- `--format json` — 所有子命令通用,输出 JSON
|
|
74
|
+
- `--app <name>` — 指定应用 slot
|
|
75
|
+
|
|
76
|
+
## 自主回复策略
|
|
77
|
+
|
|
78
|
+
收到消息 ≠ 必须回复。是否回复、怎么回复、何时回复由 agent 自主决定。
|
|
79
|
+
|
|
80
|
+
加密策略:
|
|
81
|
+
- 对端发来密文消息时,回复也应使用 `--encrypt`(保持对话加密一致性)
|
|
82
|
+
- 对端发来明文消息时,默认明文回复
|
|
83
|
+
|
|
84
|
+
## 在当前会话中快速回复(备选)
|
|
85
|
+
|
|
86
|
+
仅当无法使用 `ec msg send` 时(如拿不到自己的 AID),可用 `ec ctl send`,它自动继承当前会话的 AID 和对端:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
ec ctl send "<text>"
|
|
90
|
+
ec ctl send --encrypt "<text>"
|
|
91
|
+
```
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# ec rpc — 底层 AUN RPC 调用
|
|
2
|
+
|
|
3
|
+
直接调用 AUN 协议方法的逃生通道。触发词:直接调协议方法/批量 RPC。
|
|
4
|
+
|
|
5
|
+
> 常规消息收发用 `ec msg` / `ec group`,文件用 `ec storage`。`ec rpc` 是这些命令未覆盖到协议方法时的低层入口。
|
|
6
|
+
|
|
7
|
+
## 用法
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
ec rpc --as <aid> --params <params>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- `--as <aid>` — 以哪个本地 AID 身份发起调用
|
|
14
|
+
- `--params` — 调用参数,自动判断输入形式:
|
|
15
|
+
- 单行 JSON(以 `{` 开头)→ 单次调用
|
|
16
|
+
- 多行 JSONL → 逐行执行,失败即停
|
|
17
|
+
- 文件路径(文件存在)→ 读取文件内容作为 JSONL
|
|
18
|
+
|
|
19
|
+
每行 JSON 格式:`{"method":"<namespace.method>","params":{...}}`
|
|
20
|
+
|
|
21
|
+
## 示例
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# 单次调用
|
|
25
|
+
ec rpc --as alice.agentid.pub --params '{"method":"message.send","params":{"to":"bob.agentid.pub","payload":{"type":"text","text":"hello"}}}'
|
|
26
|
+
|
|
27
|
+
# 批量(从文件读 JSONL)
|
|
28
|
+
ec rpc --as alice.agentid.pub --params calls.jsonl
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
输出为每次调用的 JSON 结果(批量则逐行输出)。
|
|
32
|
+
|
|
33
|
+
## 命名空间速查
|
|
34
|
+
|
|
35
|
+
完整协议命名空间(auth/message/group/storage/stream/meta 等)见 `$KITS_DOCS/aun/CHEATSHEET.md`;完整协议文档 Read `$AUN_PROTOCOL_DOCS`。
|