evolcore 0.0.28 → 0.0.29-test.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 +12 -0
- package/bin/ec-safe-output.js +270 -54
- package/dist/agents/baseagent-availability.js +37 -1
- package/dist/agents/baseagent.js +19 -9
- package/dist/agents/claude-runner.js +171 -13
- package/dist/agents/codex/app-server-client.js +6 -2
- package/dist/agents/codex/diagnostics.js +4 -3
- package/dist/agents/codex-runner.js +396 -95
- package/dist/agents/gemini-runner.js +35 -17
- package/dist/aun/group/history.js +130 -90
- package/dist/aun/group/operations.js +1 -3
- package/dist/aun/menu/transport.js +5 -3
- package/dist/aun/msg/managed-operation.js +70 -0
- package/dist/aun/msg/p2p.js +1 -3
- package/dist/aun/msg/upload.js +2 -2
- package/dist/aun/outbox.js +1 -37
- package/dist/channels/aun.js +249 -89
- package/dist/channels/daemon.js +18 -1
- package/dist/channels/feishu.js +1 -2
- package/dist/cli/agent-command.js +23 -3
- package/dist/cli/agent-create.js +68 -2
- package/dist/cli/agent.js +12 -2
- package/dist/cli/aun-commands.js +87 -13
- package/dist/cli/cli-argv.js +26 -0
- package/dist/cli/daemon-commands.js +40 -10
- package/dist/cli/data-command.js +4 -4
- package/dist/cli/handoff-command.js +2 -0
- package/dist/cli/index.js +18 -1
- package/dist/cli/managed-command-guard.js +10 -0
- package/dist/cli/memory-command.js +441 -0
- package/dist/cli/restart-monitor.js +62 -6
- package/dist/cli/skill-command.js +41 -0
- package/dist/cli/task-context.js +2 -23
- package/dist/cli/trigger-command.js +9 -1
- package/dist/cli/watch-msg-diag.js +209 -0
- package/dist/config/config-field-policy.js +52 -3
- package/dist/config/config-manager.js +17 -4
- package/dist/config/contact-book-store.js +2 -2
- package/dist/config/mention-mode.js +7 -2
- package/dist/config/merge.js +28 -9
- package/dist/config/resolved-config-op.js +1 -1
- package/dist/config/runtime-env.js +137 -0
- package/dist/config/schema-registry.js +11 -1
- package/dist/config-store.js +10 -10
- package/dist/core/audit/event-key.js +3 -1
- package/dist/core/audit/log-integrity.js +4 -0
- package/dist/core/auth/agent-delegation.js +2 -1
- package/dist/core/auth/auth-gateway.js +13 -6
- package/dist/core/auth/authorization-audit.js +54 -19
- package/dist/core/auth/operation-authorizer.js +17 -0
- package/dist/core/auth/operation-catalog.js +9 -0
- package/dist/core/causation/context.js +5 -1
- package/dist/core/command/agent-control.js +1 -2
- package/dist/core/command/command-handler.js +51 -23
- package/dist/core/command/memory-slash.js +270 -0
- package/dist/core/command/menu-catalog.js +1 -0
- package/dist/core/command/menu-handler.js +315 -60
- package/dist/core/command/menu-protocol.js +42 -4
- package/dist/core/command/slash-gate.js +10 -10
- package/dist/core/command/slash-handler.js +206 -64
- package/dist/core/data-migration.js +282 -505
- package/dist/core/event-catalog.js +26 -0
- package/dist/core/evolagent-registry.js +6 -0
- package/dist/core/evolagent.js +0 -10
- package/dist/core/handoff/store.js +1 -20
- package/dist/core/inference/text-inference.js +57 -1
- package/dist/core/memory/consolidation-context.js +505 -0
- package/dist/core/memory/consolidation-ops-records.js +124 -0
- package/dist/core/memory/consolidation-trigger.js +394 -0
- package/dist/core/memory/index-manager.js +308 -0
- package/dist/core/memory/launch-consolidation.js +395 -0
- package/dist/core/memory/memory-admin.js +234 -0
- package/dist/core/memory/memory-document.js +100 -0
- package/dist/core/memory/memory-session-policy.js +41 -0
- package/dist/core/memory/memory-signature.js +257 -0
- package/dist/core/memory/memory-writer.js +432 -0
- package/dist/core/memory/staleness.js +117 -0
- package/dist/core/message/auto-mention-gate.js +454 -0
- package/dist/core/message/im-renderer.js +69 -16
- package/dist/core/message/message-bridge.js +287 -21
- package/dist/core/message/message-log.js +1 -0
- package/dist/core/message/message-queue.js +114 -27
- package/dist/core/message/pending-hints.js +329 -161
- package/dist/core/message/response-engine.js +567 -80
- package/dist/core/permission/ec-command-parser.js +1029 -80
- package/dist/core/permission/protected-paths.js +376 -126
- package/dist/core/permission/sandbox-runtime.js +40 -12
- package/dist/core/permission/tool-error-code.js +96 -13
- package/dist/core/permission/tool-policy.js +276 -23
- package/dist/core/role/runtime-policy.js +3 -7
- package/dist/core/session/{runner-task-history.js → runner-event-summary.js} +1 -1
- package/dist/core/session/session-fs-store.js +0 -76
- package/dist/core/session/session-idle-monitor.js +355 -0
- package/dist/core/session/session-manager.js +478 -17
- package/dist/core/session/session-mapper.js +33 -16
- package/dist/core/session/session-renew.js +217 -155
- package/dist/core/session/{session-turns.js → session-transcript.js} +35 -6
- package/dist/core/skill/global-watcher.js +282 -0
- package/dist/core/skill/index-generator.js +84 -0
- package/dist/core/skill/startup.js +73 -0
- package/dist/core/skill/switch-resolver.js +115 -0
- package/dist/core/task/task-activity-store.js +219 -0
- package/dist/eck/kit-renderer.js +30 -3
- package/dist/eck/manifest-engine.js +26 -4
- package/dist/index.js +708 -18
- package/dist/ipc.js +564 -2
- package/dist/paths.js +30 -9
- package/dist/response-system/engines/v1/proactive-flow.js +116 -15
- package/dist/response-system/modes/single-session/index.js +3 -0
- package/dist/trigger/feedback.js +1 -0
- package/dist/trigger/manager.js +0 -10
- package/dist/trigger/scheduler.js +11 -0
- package/dist/trigger/validation.js +22 -0
- package/dist/utils/avatar-upload.js +59 -18
- package/dist/utils/error-dict.json +6 -3
- package/dist/utils/error-utils.js +27 -0
- package/dist/utils/logger.js +32 -10
- package/dist/utils/media-cache.js +84 -0
- package/dist/utils/msg-diag.js +97 -0
- package/dist/utils/welcome.js +37 -8
- package/kits/docs/AUTHORING.md +314 -0
- package/kits/docs/GUIDE.md +2 -0
- package/kits/docs/INDEX.md +2 -0
- package/kits/docs/aun/CHEATSHEET.md +4 -0
- package/kits/docs/aun/SDK.md +60 -0
- package/kits/docs/context-assembly.md +10 -6
- package/kits/docs/evolcore/INDEX.md +17 -3
- package/kits/docs/evolcore/agent-create.md +24 -0
- package/kits/docs/evolcore/agent.md +5 -2
- package/kits/docs/evolcore/config.md +1 -1
- package/kits/docs/evolcore/ec-capabilities.md +364 -0
- package/kits/docs/evolcore/group.md +34 -18
- package/kits/docs/evolcore/memory-architecture.md +78 -0
- package/kits/docs/evolcore/memory-consolidation-batches.md +133 -0
- package/kits/docs/evolcore/memory-consolidation.md +263 -0
- package/kits/docs/evolcore/memory-tags.md +63 -0
- package/kits/docs/evolcore/memory.md +110 -0
- package/kits/docs/evolcore/menu-client.md +27 -11
- package/kits/{schemas → docs/evolcore}/menu-exec-schema-commands.md +12 -6
- package/kits/docs/evolcore/menu-protocol.md +213 -0
- package/kits/docs/evolcore/msg.md +2 -0
- package/kits/docs/evolcore/trigger.md +7 -5
- package/kits/docs/path-registry.md +6 -8
- package/kits/docs/prompt-loading-architecture.md +5 -3
- package/kits/docs/venues/group.md +5 -4
- package/kits/eck_manifest.json +294 -88
- package/kits/eck_manifest.memory.json +257 -0
- package/kits/rules/03-identity.md +8 -8
- package/kits/rules/05-venue.md +4 -2
- package/kits/rules/06-channel.md +1 -1
- package/kits/schemas/_meta.json +276 -47
- package/kits/schemas/agent-config.schema.12.json +38 -2
- package/kits/schemas/agent-config.schema.13.json +591 -0
- package/kits/schemas/daemon.schema.6.json +9 -9
- package/kits/schemas/defaults.schema.5.json +29 -0
- package/kits/schemas/relation-config.schema.8.json +14 -1
- package/kits/schemas/relation-config.schema.9.json +129 -0
- package/kits/schemas/role-config.schema.1.json +3 -3
- package/kits/skills/.switches.json +3 -0
- package/kits/skills/ec-skill/SKILL.md +217 -0
- package/kits/skills/ec-skill/scripts/cli.mjs +128 -0
- package/kits/skills/ec-skill/scripts/deps.mjs +107 -0
- package/kits/skills/ec-skill/scripts/frontmatter.mjs +104 -0
- package/kits/skills/ec-skill/scripts/skill.mjs +629 -0
- package/kits/skills/ec-skill/scripts/template/SKILL.md.tmpl +30 -0
- package/kits/templates/decision/auto-mention.md +25 -0
- package/kits/templates/decision/session-renew.md +22 -0
- package/kits/templates/memory-consolidation/forget.md +104 -0
- package/kits/templates/memory-consolidation/generalize.md +76 -0
- package/kits/templates/memory-consolidation/notes.md +133 -0
- package/kits/templates/memory-consolidation/profile.md +58 -0
- package/kits/templates/memory-consolidation/promote.md +72 -0
- package/kits/templates/memory-consolidation/workflow.md +75 -0
- package/kits/templates/system-fragments/bootstrap.md +14 -5
- package/kits/templates/system-fragments/commands.md +1 -0
- package/kits/templates/system-fragments/group-history.md +6 -0
- package/kits/templates/system-fragments/identity.md +0 -3
- package/kits/templates/system-fragments/memory.md +79 -0
- package/kits/templates/system-fragments/reply.md +1 -0
- package/kits/templates/system-fragments/venue.md +1 -1
- package/package.json +4 -6
- package/dist/trigger/legacy-session-history.js +0 -19
- package/kits/templates/system-fragments/group-unread-history.md +0 -7
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# EC Skill 系统
|
|
2
|
+
|
|
3
|
+
EC 的技能系统:**一组可加载的能力单元**。每个技能是一个目录,里面放一个 `SKILL.md`。
|
|
4
|
+
本文是整个机制的概要,面向使用者。
|
|
5
|
+
|
|
6
|
+
> 写技能、装技能、调试技能没生效——看本文就够。开发设计细节见文末「开发设计文档」。
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. 技能是什么
|
|
11
|
+
|
|
12
|
+
一个技能 = 一个目录 + 一个 `SKILL.md`:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
<skill-name>/
|
|
16
|
+
├── SKILL.md # 必须。YAML frontmatter + Markdown 正文
|
|
17
|
+
├── references/ # 可选。大块参考资料,按需读取,不进默认上下文
|
|
18
|
+
├── scripts/ # 可选。确定性脚本
|
|
19
|
+
└── assets/ # 可选。模板、样例数据
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
格式遵循 **Agent Skills 标准**,与 Claude Code / Codex / OpenClaw 一致——写技能的人不用学第二套规范,
|
|
23
|
+
社区已有的技能可以直接拿来用。
|
|
24
|
+
|
|
25
|
+
`<skill-name>` 用小写字母、数字、连字符(kebab-case),**且必须与 `SKILL.md` 里 `name` 字段一致**。
|
|
26
|
+
|
|
27
|
+
### 与 Base Agent 技能的关系
|
|
28
|
+
|
|
29
|
+
**不复用、不代理、不封装。** Claude Code / Codex / Gemini CLI 各自的技能由它们自己管理,
|
|
30
|
+
EC 不在上面再套一层。EC 只管「EC 自身有哪些技能、哪些启用」。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. 三级目录
|
|
35
|
+
|
|
36
|
+
| 级别 | 位置 | 内容 | 生命周期 |
|
|
37
|
+
|---|---|---|---|
|
|
38
|
+
| **内置级** | `<包根>/kits/skills/` | `SKILL.md` + 开关 | 随包发布,用户不应直接改 |
|
|
39
|
+
| **本机级** | `$EVOLCORE_HOME/skills/` | `SKILL.md` + 开关 | 本机安装,本机所有 agent 共享 |
|
|
40
|
+
| **Agent 级** | `$EVOLCORE_AGENT_DIR/skills/` | **只有开关,没有 `SKILL.md`** | 按 agent 单独调整 |
|
|
41
|
+
|
|
42
|
+
三条实际路径用 `ec skill where` 打印,不要凭记忆猜。
|
|
43
|
+
|
|
44
|
+
**为什么叫「本机级」而不是「用户级」**:三家 base agent 的惯例叫 user-level,语义其实也是按机器共享。
|
|
45
|
+
但 EC 里「用户」已经是关系层的角色概念(owner / admin / member / visitor),沿用会歧义。
|
|
46
|
+
「主机级」也被否——`host` 在 ECK 中已是对端类型(daemon AID)。所以定为**本机级**:按机器划界。
|
|
47
|
+
|
|
48
|
+
**关系级不参与**。技能启用与否不按对端区分,只到 Agent 级为止。
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 3. 开关机制
|
|
53
|
+
|
|
54
|
+
### 开关文件
|
|
55
|
+
|
|
56
|
+
开关**不是**每技能一个文件,而是**每级一个字典** `.switches.json`,放在各自的 skills 目录内:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
内置级:<包根>/kits/skills/.switches.json
|
|
60
|
+
本机级:$EVOLCORE_HOME/skills/.switches.json
|
|
61
|
+
Agent 级:$EVOLCORE_AGENT_DIR/skills/.switches.json
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"my-skill": { "enabled": true },
|
|
67
|
+
"core-guard": { "enabled": true, "locked": true }
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
| 字段 | 含义 |
|
|
72
|
+
|---|---|
|
|
73
|
+
| `enabled` | 该级是否启用这个技能 |
|
|
74
|
+
| `locked` | **仅内置级读取**。`true` = 拒绝被本机级 / Agent 级覆盖 |
|
|
75
|
+
|
|
76
|
+
缺省语义:
|
|
77
|
+
|
|
78
|
+
- 技能名**不在字典里 → 禁用**(开关字典是显式白名单)
|
|
79
|
+
- 只有 `enabled: true` 算启用;字段缺失、写成其它值、文件损坏都按禁用处理
|
|
80
|
+
- 文件不存在 = 空字典 = 所有技能禁用
|
|
81
|
+
|
|
82
|
+
### `locked` 与 `enabled` 正交
|
|
83
|
+
|
|
84
|
+
`locked` **只表达「不可覆盖」,不表达「强制开」**。两个字段是独立维度:
|
|
85
|
+
|
|
86
|
+
| enabled | locked | 含义 |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| (无文件) | — | 禁用,可被下级覆盖 |
|
|
89
|
+
| `true` | `false` | 开,可被下级覆盖 |
|
|
90
|
+
| `false` | `false` | 关,可被下级覆盖 |
|
|
91
|
+
| `true` | `true` | **强制可用,任何级别都关不掉** |
|
|
92
|
+
| `false` | `true` | 关着,且任何级别都打不开 |
|
|
93
|
+
|
|
94
|
+
典型用途是基础设施类技能——EC 自身运行依赖、不允许被误关。
|
|
95
|
+
|
|
96
|
+
### 覆盖链
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
Agent 级 > 本机级 > 内置级
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
由近及远逐级覆盖。求值规则:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
1. 若内置级存在且 locked: true
|
|
106
|
+
→ 结论由内置级的 enabled 唯一决定,直接返回
|
|
107
|
+
2. 否则,从 Agent 级往下找第一个有显式声明的层级
|
|
108
|
+
→ 用它的 enabled 作为结论
|
|
109
|
+
3. 三级都没有声明 → enabled 默认 false(禁用)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
注意:内置级与本机级同名时,**不是简单的「内置优先」或「本机优先」**,而是按声明逐级求值。
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 4. 渐进式披露
|
|
117
|
+
|
|
118
|
+
**技能正文不常驻上下文。** 常驻的只有每个技能的 `name` + `description`,写在这两个文件里:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
$AGENT_DIR/skills/.index-builtin.md 内置技能索引
|
|
122
|
+
$AGENT_DIR/skills/.index-local.md 本机技能索引
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
由 ECK manifest 注入(`order` 20.5 / 20.6,位于身份层之后、关系层之前)。技能属于
|
|
126
|
+
「我有什么能力」的自我认知,与身份层同族,所以排在前面。
|
|
127
|
+
|
|
128
|
+
模型的行为链:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
① 读索引 → 看到「本 Agent 有这些技能」
|
|
132
|
+
② 判断相关 → 按 description 比对当前任务
|
|
133
|
+
③ 读全文 → Read <根目录>/<技能名>/SKILL.md
|
|
134
|
+
④ 执行 → 按 SKILL.md 指令执行;需要时读 references/、跑 scripts/
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**因此 `description` 是路由器,不是介绍文案。** 写得含糊,技能永远不会被选中。
|
|
138
|
+
|
|
139
|
+
索引文件由监控器**自动重建**(约 2 秒防抖):改 `.switches.json`、改 `SKILL.md`、增删技能目录
|
|
140
|
+
都会触发。不需要手工刷新。
|
|
141
|
+
|
|
142
|
+
**该组没有任何启用的技能时不生成索引文件**——manifest 按「文件是否存在」判断,不存在就跳过注入,
|
|
143
|
+
上下文里不会出现「暂无技能」这类零信息量段落。
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 5. 路径:模型自己拼绝对路径
|
|
148
|
+
|
|
149
|
+
EC **不会把 cwd 设到技能目录**(runner 拉起 base agent 时 cwd 固定为项目目录,且 Claude Code 的
|
|
150
|
+
Bash 工具没有 cwd 参数),所以三家的「裸相对路径直接可用」在 EC 复现不了。
|
|
151
|
+
|
|
152
|
+
EC 的解法:**索引里给根目录 + 拼路径规则,模型自己拼成绝对路径**。
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
路径规则:
|
|
156
|
+
根目录: <该组的真实绝对路径>
|
|
157
|
+
技能目录 = 根目录 + 路径分隔符 + 技能名
|
|
158
|
+
SKILL.md = 技能目录 + 路径分隔符 + "SKILL.md"
|
|
159
|
+
执行脚本时必须写完整绝对路径。
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
好处是**社区技能不用改**——正文里照写裸相对路径,模型知道技能目录在哪,自己就能拼。
|
|
163
|
+
|
|
164
|
+
配套硬要求:**脚本内部必须用自身位置定位资源,不能依赖 cwd**。
|
|
165
|
+
|
|
166
|
+
```js
|
|
167
|
+
// 好:从脚本自身推
|
|
168
|
+
const SKILL_DIR = path.resolve(import.meta.dirname, '..');
|
|
169
|
+
|
|
170
|
+
// 差:cwd 不对就挂
|
|
171
|
+
fs.readFileSync('assets/template.csv');
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
理由:即使模型把脚本路径拼对了,脚本自身的 cwd 仍是**模型调 Bash 时的 cwd**(项目目录)。
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 6. 编写规范
|
|
179
|
+
|
|
180
|
+
### frontmatter
|
|
181
|
+
|
|
182
|
+
必填两项:
|
|
183
|
+
|
|
184
|
+
```yaml
|
|
185
|
+
---
|
|
186
|
+
name: my-skill # 必须与目录名一致,kebab-case
|
|
187
|
+
description: >- # 最关键:写清做什么 + 触发场景 + 不适用场景
|
|
188
|
+
一句话说清能力。当用户要求……时使用。不适用于……
|
|
189
|
+
---
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
可选字段(Agent Skills 标准):
|
|
193
|
+
|
|
194
|
+
| 字段 | 说明 |
|
|
195
|
+
|---|---|
|
|
196
|
+
| `license` | 许可协议标识(`MIT`、`Apache-2.0`)。分享型技能建议写 |
|
|
197
|
+
| `compatibility` | 兼容性声明,标注依赖的运行时 / 平台 / 版本约束 |
|
|
198
|
+
| `metadata` | 自由键值对(作者、版本、仓库地址)。各家都不解析,纯透传 |
|
|
199
|
+
| `allowed-tools` | 工具白名单(`Read, Grep, Glob, Bash`)。不写则继承当前会话权限 |
|
|
200
|
+
|
|
201
|
+
Claude Code 扩展字段(`disable-model-invocation`、`user-invocable`、`context: fork`、`agent`)
|
|
202
|
+
EC **读取但不强依赖**——不认识就忽略,不报错。
|
|
203
|
+
|
|
204
|
+
**未知字段一律忽略不报错**,这是向前兼容的前提。
|
|
205
|
+
|
|
206
|
+
### `description` 怎么写
|
|
207
|
+
|
|
208
|
+
官方文档明确指出模型有「触发不足」的倾向。有效写法:
|
|
209
|
+
|
|
210
|
+
1. **先写做什么**:一句话说清能力
|
|
211
|
+
2. **再列举触发场景**:用户可能说的原话、涉及的文件类型、典型任务
|
|
212
|
+
3. **显式写不适用场景**:`不适用于……`,防止误触发
|
|
213
|
+
4. **包含关键词**:用户真实会说的词,而不是术语
|
|
214
|
+
|
|
215
|
+
```yaml
|
|
216
|
+
# 差:模型不知道什么时候该用
|
|
217
|
+
description: 处理 CSV 文件
|
|
218
|
+
|
|
219
|
+
# 好:触发条件写死
|
|
220
|
+
description: >-
|
|
221
|
+
清洗并规范化 CSV 文件。当用户要求清洗、去重、修正 CSV,或提到表头混乱、
|
|
222
|
+
列序不一致、编码问题时使用。不适用于 Excel 宏、PDF、图片数据。
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
建议控制在单行可读、总长约 **1536 字符**以内(三家共同的截断阈值)。**把最关键的用例放最前面**。
|
|
226
|
+
|
|
227
|
+
### 正文结构
|
|
228
|
+
|
|
229
|
+
建议:**目标 → 步骤(编号、祈使句)→ 输出契约 → 边界情况 → 参考资料指引**。
|
|
230
|
+
控制在 **500 行**内,超出部分挪到 `references/`。
|
|
231
|
+
|
|
232
|
+
### 脚本语言偏好
|
|
233
|
+
|
|
234
|
+
| 优先级 | 语言 | 理由 |
|
|
235
|
+
|---|---|---|
|
|
236
|
+
| 1 | **Node.js** | EC 本身是 Node 项目,`node` 必然存在,零依赖问题 |
|
|
237
|
+
| 2 | shell | Windows 上要看 Git Bash 是否可用 |
|
|
238
|
+
| 3 | Python | 完全靠用户自装,最不可靠 |
|
|
239
|
+
|
|
240
|
+
**随包发布的内置技能,脚本优先用 node 写**,否则用户装完 evolcore 会发现内置技能有一半跑不了。
|
|
241
|
+
|
|
242
|
+
### 依赖声明
|
|
243
|
+
|
|
244
|
+
技能可以在 `metadata.requires` 里声明运行时依赖:
|
|
245
|
+
|
|
246
|
+
```yaml
|
|
247
|
+
metadata:
|
|
248
|
+
requires:
|
|
249
|
+
bins: [python3] # 每个都必须在 PATH 里存在
|
|
250
|
+
anyBins: [jq, python3] # 至少有一个
|
|
251
|
+
env: [GROQ_API_KEY] # 环境变量必须存在
|
|
252
|
+
os: [linux, darwin, win32] # 平台限制
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
检查在**索引生成阶段**执行:不满足的技能**从索引里排除**,不进模型上下文。
|
|
256
|
+
技能本身没消失、开关也还是开着的,只是当前主机跑不了——这个状态在前端展示(提示缺什么)。
|
|
257
|
+
|
|
258
|
+
**不自动安装依赖。** 自动装运行时是重大副作用,不该由技能系统发起。前端只负责说清楚缺什么。
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## 7. 权限
|
|
263
|
+
|
|
264
|
+
**技能不能成为提权手段。** 最终可用工具取交集:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
最终可用工具 = 技能的 allowed-tools ∩ 当前会话权限
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
- 技能的 `allowed-tools` **只能收紧,不能放宽**。会话是 `readonly` 时,技能声明再多工具也没用
|
|
271
|
+
- 会话放宽了、技能没收紧,按会话走
|
|
272
|
+
- 技能没声明 `allowed-tools`,等同于不额外收紧
|
|
273
|
+
|
|
274
|
+
技能的脚本执行与普通 Bash 调用走**同一道闸门**,不另开通道——权限判据只有一套,
|
|
275
|
+
已有的审计、拒绝提示、审批流程自动生效。
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## 8. 命令
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
ec skill list [--json] # 列出所有技能:名称、来源、最终状态
|
|
283
|
+
ec skill info <name> [--json] # 单技能详情:路径、描述、三级开关、生效依据
|
|
284
|
+
ec skill create <name> [--desc "..."] [--enable] # 新建技能骨架到本机级(默认禁用)
|
|
285
|
+
ec skill install <源> [--force] [--enable] # 安装技能(目录 / .zip / .md,默认禁用)
|
|
286
|
+
ec skill remove <name> # 删除本机技能(内置技能不能删)
|
|
287
|
+
ec skill enable <name> [--level agent|local]
|
|
288
|
+
ec skill disable <name> [--level agent|local]
|
|
289
|
+
ec skill validate <name|路径> # 校验 SKILL.md 是否合规
|
|
290
|
+
ec skill where # 打印三级根目录的实际路径
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### 常见任务
|
|
294
|
+
|
|
295
|
+
**装一个技能**:
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
ec skill install ./my-skill/ # 目录
|
|
299
|
+
ec skill install ./my-skill.zip # 压缩包
|
|
300
|
+
ec skill install ./foo.md # 单个 SKILL.md
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
安装前会**自动校验 `SKILL.md`**,不合规直接拒绝。已存在同名技能加 `--force` 覆盖。
|
|
304
|
+
`.zip` 首次使用会自动装解压依赖(需要联网,之后离线可用)。
|
|
305
|
+
|
|
306
|
+
**装完默认禁用**:`install`(连同 `create`)**不写开关文件**——字典里没有该技能就是禁用,
|
|
307
|
+
技能不进索引、不会被模型选中。确认可用之后显式启用:
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
ec skill enable <name>
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
要装完即启用就加 `--enable`(此时才写入 `{"enabled": true}`):
|
|
314
|
+
`ec skill install ./my-skill/ --enable`。
|
|
315
|
+
这是刻意设计——陌生技能在未经确认前不应自动生效。
|
|
316
|
+
|
|
317
|
+
**查某个技能为什么没生效**:
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
ec skill info <name>
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
看 `生效依据` 那一行,它会指出是 Agent 级 / 本机级 / 内置级 / 默认值决定了当前状态。
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## 9. 边界情况
|
|
328
|
+
|
|
329
|
+
- **装完默认禁用**:`install` / `create` 不写开关文件,缺省即禁用,技能不进索引、
|
|
330
|
+
不被选中,等确认后再 `enable`;加 `--enable` 可装完即启用
|
|
331
|
+
- **开关是显式白名单**:字典里没有该技能 = 关;要关一个已启用的技能写 `{"enabled": false}`
|
|
332
|
+
或直接删条目,效果相同
|
|
333
|
+
- **内置技能不可删**:随包发布,`remove` 会拒绝。要停用请用 `disable`
|
|
334
|
+
- **Agent 级不能装技能**:那一级只有 `.switches.json`。想让某技能只对单个 agent 生效,
|
|
335
|
+
先装到本机级,再对其他 agent `disable --level agent`
|
|
336
|
+
- **`locked` 技能关不掉**:`enable` / `disable` 会拒绝并说明原因
|
|
337
|
+
- **离线环境**:`install` 用目录方式不受影响;`.zip` 需要联网装一次解压依赖
|
|
338
|
+
- **改动后约 2 秒生效**:索引重建有防抖,不用手工触发
|
|
339
|
+
|
|
340
|
+
### 常见坑
|
|
341
|
+
|
|
342
|
+
| 症状 | 原因 |
|
|
343
|
+
|---|---|
|
|
344
|
+
| 技能不出现 | 索引里没有 → 检查开关、`name` 与目录名是否一致、依赖是否满足 |
|
|
345
|
+
| 装完立刻用但没反应 | 防抖 2 秒未到,稍等再看 `ec skill list` |
|
|
346
|
+
| 脚本找不到文件 | 脚本内部依赖了 cwd。必须用自身位置定位资源 |
|
|
347
|
+
| 改了 `SKILL.md` 但模型行为没变 | 模型已经读过旧正文,本轮上下文里不会自动刷新 |
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## 10. 开发设计文档
|
|
352
|
+
|
|
353
|
+
以下文档**只在源码仓库里**(`docs/skills/`),**不随 npm 包发布**——它们面向开发者,
|
|
354
|
+
讲的是机制怎么设计的、为什么这么取舍:
|
|
355
|
+
|
|
356
|
+
| 文档 | 内容 |
|
|
357
|
+
|---|---|
|
|
358
|
+
| `docs/skills/skill-md-spec-and-loading.md` | `SKILL.md` 规范、frontmatter 字段语义、渐进式披露、三家对照 |
|
|
359
|
+
| `docs/skills/ec-skill-system-design.md` | 三级目录、开关模型、覆盖链、`locked` 正交语义、前端展示 |
|
|
360
|
+
| `docs/skills/ec-skill-injection.md` | 索引怎么生成、防抖、文件格式、manifest 注入段位 |
|
|
361
|
+
| `docs/skills/skill-script-execution.md` | 脚本执行机制、路径解析、依赖检查、权限闸门、隔离与 8 个待澄清问题 |
|
|
362
|
+
|
|
363
|
+
读到本文(`ec-capabilities.md`)说明你拿到的是**随包发布**的那一份。若要深挖实现细节,
|
|
364
|
+
先确认手上是否有源码仓库;没有就以本文为准。
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
## 消息
|
|
12
12
|
|
|
13
|
+
内联正文及文本选项(`--text`、`--transcript`、`--description`、`--question`、`--message`、`--answer`、`--reason`)遵循与私聊相同的单次 `\n` / `\r` / `\t` / `\\` 解码契约;真实换行也支持。PowerShell 中不要使用反引号换行转义,物理多行使用命令名而非显式批处理入口。文件、路径和 `--payload` JSON 不解码;名称和状态不是长文本。
|
|
14
|
+
|
|
13
15
|
```bash
|
|
14
16
|
# 文本(含空格/换行/特殊字符时用引号包起来;纯短词可不包,但多空格会被压成一个)
|
|
15
17
|
ec group send <from> <group-id> "<text>" --return none|required [--encrypt]
|
|
@@ -20,9 +22,8 @@ ec group send <from> <group-id> --file <path> --return none|required [--as <type
|
|
|
20
22
|
# 自定义 payload
|
|
21
23
|
ec group send <from> <group-id> --payload '<json>' --return none|required
|
|
22
24
|
|
|
23
|
-
#
|
|
24
|
-
ec group history <from> <group-id>
|
|
25
|
-
ec group history <from> <group-id> --all [--limit <N>] [--thread <id>] [--format json]
|
|
25
|
+
# 查询本地群历史(只读,不调用 Gateway,不推进 group pull/ack 游标)
|
|
26
|
+
ec group history <from> <group-id> [--limit <N>] [--thread <main|all|id>] [--format json]
|
|
26
27
|
|
|
27
28
|
# 拉取群消息(建议带 --app 独立消费通道,避免影响 daemon)
|
|
28
29
|
ec group pull <from> <group-id> [--after-seq <N>] [--limit <N>] [--app <name>]
|
|
@@ -54,36 +55,35 @@ ec group send <from> <group-id> "通知" --mention alice.agentid.pub,bob.agentid
|
|
|
54
55
|
|
|
55
56
|
## 本地群历史
|
|
56
57
|
|
|
57
|
-
`history` 读取本机的 `messages.jsonl`,不连接 Gateway,不改变 `group pull/ack`
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
`history` 读取本机的 `messages.jsonl`,不连接 Gateway,不改变 `group pull/ack` 游标,也不维护本地已读游标。
|
|
59
|
+
`group pull` / `group ack` 仍是独立的 Gateway 消费游标命令,二者互不替代。
|
|
60
|
+
查询始终只读;首次没有日志时返回空结果,不创建模型会话。
|
|
60
61
|
|
|
61
62
|
| 选项 | 含义 |
|
|
62
63
|
|---|---|
|
|
63
|
-
|
|
|
64
|
-
| `--all` | 最近的群会话历史,包含没有未读标记的旧日志及出站消息 |
|
|
64
|
+
| 默认 | 最近的群会话历史,包含入站和出站普通消息 |
|
|
65
65
|
| `--limit N` | 默认 50,范围 1–500;单页另有 24 KiB 消息预算 |
|
|
66
66
|
| `--thread main\|all\|id` | 无话题、整个群或指定话题;当前群任务默认继承当前话题,其他调用默认 all |
|
|
67
67
|
| `--direction in\|out\|all` | 方向过滤,默认 all |
|
|
68
68
|
| `--before/--after time` | 接收时间开区间,支持 epoch 毫秒和 ISO 时间 |
|
|
69
|
+
| `--before-id/--after-id id` | 同一时间戳分页的 64 位游标 ID,需配合对应时间参数 |
|
|
70
|
+
| `--before-id/--after-id id` | 同一时间戳分页时的消息 ID tie-break,需配合对应时间 |
|
|
69
71
|
| `--format text\|json` | 默认 text |
|
|
70
|
-
| `--message msg-id` |
|
|
72
|
+
| `--message msg-id` | 查询指定消息正文,不改变任何状态 |
|
|
71
73
|
| `--offset bytes` | 配合 --message 从返回的 next_offset 继续读取长正文 |
|
|
72
74
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
`has_more` 表示本次还有匹配内容,普通 `--all` 可用时间/话题进一步缩小范围。
|
|
75
|
+
`has_more` 表示本次还有匹配内容。按结果中的 `next_before` / `next_after` 原样传入时间和
|
|
76
|
+
64 位游标 ID 获取相邻页,保证同一毫秒的多条消息也不会漏读或重复。
|
|
76
77
|
|
|
77
|
-
长正文以 `content_truncated`
|
|
78
|
-
`--
|
|
79
|
-
|
|
78
|
+
长正文以 `content_truncated` 标识,需要完整内容时使用
|
|
79
|
+
`--message <msg-id> --offset <next_offset>` 继续读取。偏移为 UTF-8 字节边界,每段最多 8 KiB。
|
|
80
|
+
附件返回已有类型、名称或转写摘要,不自动下载。
|
|
80
81
|
|
|
81
82
|
受管执行通过 `group.op` 和 delegation 授权;member 限当前 Agent 的当前 AUN 群,
|
|
82
|
-
owner/admin 按 Agent 管理范围查询其他群;visitor
|
|
83
|
+
owner/admin 按 Agent 管理范围查询其他群;visitor 默认拒绝。
|
|
83
84
|
不支持 `--app`、`--aun-path` 或自选历史文件路径。
|
|
84
85
|
|
|
85
|
-
|
|
86
|
-
已读状态独立存储,重启、renew、切模型不会清空;历史只包含本机收到并记录的会话内容。
|
|
86
|
+
历史只包含本机收到并记录的会话内容;不根据缺少 sessionId 推断读取状态。
|
|
87
87
|
|
|
88
88
|
## 群管理
|
|
89
89
|
|
|
@@ -238,6 +238,22 @@ ec group member-statuses <from> <group-id>
|
|
|
238
238
|
操作他人和查询屏蔽列表需要 Core owner/admin,随后仍由 Gateway 校验该 Agent 的群内权限。
|
|
239
239
|
visitor 不开放这五个命令;托管调用不允许替换 `<from>`、`--app` 或 `--aun-path`。
|
|
240
240
|
|
|
241
|
+
## @ 提及模式
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
# 查看当前群生效的提及模式及来源(本群覆盖 / Agent 全局 / AUN 服务端 / 默认配置)
|
|
245
|
+
ec group mention <from> <group-id>
|
|
246
|
+
|
|
247
|
+
# 设置本群覆盖;可选 mention-only(被 @ 才响应)/ disabled(全响应)/ auto(本地自动判断)
|
|
248
|
+
ec group mention <from> <group-id> mention-only
|
|
249
|
+
|
|
250
|
+
# 清除本群覆盖,回到跟随上级设置
|
|
251
|
+
ec group mention <from> <group-id> --clear
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
`<mode>` 与 `--clear` 互斥。本命令只调整本群 relation 级覆盖,Agent 全局默认走 `/mention` slash 命令
|
|
255
|
+
(私聊写 Agent 级)或 `ec config set mentionMode`。
|
|
256
|
+
|
|
241
257
|
## 入群与公告
|
|
242
258
|
|
|
243
259
|
当前 CLI 封装了 `join` 和 `rules`。审批申请、邀请码、公告等高级管理能力第一批暂不提供单独命令。
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# 记忆系统概述
|
|
2
|
+
|
|
3
|
+
记忆系统怎么运转:作用域、流水线、开关、目录结构。命令用法见 `$KITS_DOCS/evolcore/memory.md`;整理会话细节见 `$KITS_DOCS/evolcore/memory-consolidation.md`。
|
|
4
|
+
|
|
5
|
+
## 流水线
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
主会话写 note → pending/ → 整理会话产生正式记忆 → consolidated/ → 索引自动注入
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
- **note 是原料**:主会话写,不分类、不判断层级,不进索引、不签名。
|
|
12
|
+
- **正式记忆只由整理会话产生**:读 note 或候选记忆,判断取舍,用 `create` / `update` / `archive` 写入。程序负责签名、重建索引、落日志。
|
|
13
|
+
|
|
14
|
+
## 三个作用域
|
|
15
|
+
|
|
16
|
+
| 作用域 | 位置 | 怎么产生 | 谁能看到 |
|
|
17
|
+
|------|------|---------|---------|
|
|
18
|
+
| relation | `$RELATIONS_DIR/<peerKey>/memory/` | `notes` / `profile` 模式 | 与该对端的会话 |
|
|
19
|
+
| agent | `$PERSONAL_DIR/memory/` | `generalize` 模式(关系级 → agent 级) | 当前 agent 的所有会话 |
|
|
20
|
+
| owner | `$EVOLCORE_HOME/memory/owner/<ownerAid>/` | `promote` 模式(关系级 → owner 级) | owner 名下所有 agent 的会话 |
|
|
21
|
+
|
|
22
|
+
relation 是所有记忆的唯一出生地,agent 级和 owner 级都由它升格而来。
|
|
23
|
+
|
|
24
|
+
## 整理什么时候启动
|
|
25
|
+
|
|
26
|
+
| 触发 | 说明 |
|
|
27
|
+
|------|------|
|
|
28
|
+
| 上下文压缩前 | 自动。反馈回压缩时的会话和话题 |
|
|
29
|
+
| renew / 新会话创建时 | 自动。反馈回发起时的会话和话题 |
|
|
30
|
+
| 定时检查 | 自动。由 evolcore trigger 的 `script` 模式周期执行,检查 pending 堆积、待泛化 / 待提升 / 超期记忆 / 画像超期五类候选;**不反馈** |
|
|
31
|
+
| 手动 | `ec memory consolidate [--mode ...]`。反馈回当前会话的当前话题 |
|
|
32
|
+
|
|
33
|
+
所有触发路径都收口到统一入口 `launchConsolidation()`,它负责完整生命周期:启动前把 `pending/` 移入 `processing/` 加锁、序列化上下文、直接创建整理会话、会话结束后收尾(归档 note、写 checkpoint、定稿重建索引、反馈)。
|
|
34
|
+
|
|
35
|
+
触发方分两层:**定时检查**由 trigger 的 `script` 模式承担,只做候选判断,不管理生命周期;**手动 / compact / renew / `/new`** 直接调用 `launchConsolidation()`。
|
|
36
|
+
|
|
37
|
+
**并发与排队**:同一 agent 同时只能有一个整理会话;全局最多 5 个 agent 并发。超出的请求排队,前一个结束后自动启动下一个。
|
|
38
|
+
|
|
39
|
+
## 召回
|
|
40
|
+
|
|
41
|
+
各作用域的 `MEMORY.md` 索引由 manifest 注入 system prompt(主会话 order 36 / 37 / 38)。模型按索引里的描述和关键词判断哪条相关,再按需 Read 对应的 `consolidated/` 正文。
|
|
42
|
+
|
|
43
|
+
索引上限 `memory.indexMaxBytes`(默认 5KB)。`important` / `urgent` / `profile` 必进且永不淘汰;`done` / `cancelled` 不进;其余按优先级和 mtime 排序,超限从末尾截断。没进索引的文件仍在磁盘上,只有 `archive` 才让它下线。
|
|
44
|
+
|
|
45
|
+
## 规则从哪里来
|
|
46
|
+
|
|
47
|
+
| 内容 | 位置 |
|
|
48
|
+
|------|------|
|
|
49
|
+
| 何时写、命令速查、召回(主会话);三个写命令、模式权限、禁止事项(整理会话) | `$KITS_FRAGMENTS/memory.md`,两份 manifest 共用,按 `sessionType` 分支渲染 |
|
|
50
|
+
| 整理流程:查重、取舍、收尾 | `$KITS_TEMPLATES/memory-consolidation/workflow.md` |
|
|
51
|
+
| 各模式的具体做法 | `$KITS_TEMPLATES/memory-consolidation/<mode>.md` |
|
|
52
|
+
|
|
53
|
+
会话原型到 manifest 的映射内置在代码里(`kit-renderer.ts` 的 `BUILTIN_SESSION_MANIFESTS`:`main` / `memory` / `auxiliary`),`config.sessionManifests` 只作可选覆盖。
|
|
54
|
+
|
|
55
|
+
## 开关
|
|
56
|
+
|
|
57
|
+
| 配置字段 | 控制范围 |
|
|
58
|
+
|---------|---------|
|
|
59
|
+
| `memory.enableRelation=false` | **总开关**。note 写不了、`[memory]` 段和索引不注入、所有整理模式和手动调用一并拒绝 |
|
|
60
|
+
| `memory.enableAgent=false` | 关闭泛化模式与 agent 索引注入;notes / promote 照常 |
|
|
61
|
+
| `memory.enableOwner=false` | 关闭提升模式与 owner 索引注入;notes / generalize 照常 |
|
|
62
|
+
|
|
63
|
+
## 目录结构
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
$RELATIONS_DIR/<peerKey>/memory/ ← relation 作用域(note 唯一写入处)
|
|
67
|
+
├── MEMORY.md # 索引(程序自动生成,manifest 注入)
|
|
68
|
+
├── pending/ # note 写入的临时记忆
|
|
69
|
+
│ └── archive/ # 被 drop 的 note
|
|
70
|
+
├── processing/ # 整理中的快照
|
|
71
|
+
├── consolidated/ # 正式记忆(已签名)
|
|
72
|
+
└── archive/
|
|
73
|
+
├── notes/ # 整理完成的 pending 原件
|
|
74
|
+
└── invalid/ # 验签失败或未签名的文件
|
|
75
|
+
|
|
76
|
+
$PERSONAL_DIR/memory/ ← agent 作用域(结构相同,由泛化产出)
|
|
77
|
+
$EVOLCORE_HOME/memory/owner/<ownerAid>/ ← owner 作用域(结构相同,由提升产出)
|
|
78
|
+
```
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# 记忆整理批次目录结构
|
|
2
|
+
|
|
3
|
+
> 本文描述每次记忆整理产生的文件布局,以及整理进度标记文件的位置与格式。
|
|
4
|
+
> 整理会话的触发机制与五种模式见 `memory-consolidation.md`;整理命令用法见 `memory.md`。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 一、整理进度标记(Checkpoint)
|
|
9
|
+
|
|
10
|
+
**路径**:`<chatDir>/consolidation-checkpoint.json`
|
|
11
|
+
|
|
12
|
+
`chatDir` 与 `messages.jsonl` 同目录,即:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
$EVOLCORE_HOME/agents/<selfAid>/sessions/<channelSessionKey>/
|
|
16
|
+
messages.jsonl ← 该关系所有消息流水
|
|
17
|
+
consolidation-checkpoint.json ← 整理进度标记
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**格式**:
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"lastConsolidatedAt": 1728021600000
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`lastConsolidatedAt` 是上一次整理完成时的毫秒时间戳。每次整理会话完成后由程序写入。
|
|
29
|
+
|
|
30
|
+
**作用**:决定下次整理时从 `messages.jsonl` 里截取哪段历史。只取 `ts >= lastConsolidatedAt` 的行,避免把整个对端历史全量喂入整理会话。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 二、整理批次目录(Consolidation Run Directory)
|
|
35
|
+
|
|
36
|
+
每次触发一次整理,在以下位置建一个新目录:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
$EVOLCORE_HOME/memory/consolidation-batches/
|
|
40
|
+
<prettyTs>-<selfAid>-<mode>/ ← 整理批次目录
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`prettyTs` 格式为 `YYYYMMDDTHHmmss`(UTC),例如 `20261004T185900`。
|
|
44
|
+
|
|
45
|
+
**示例**:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
memory/consolidation-batches/
|
|
49
|
+
20261004T185900-toleiliang4.agentid.pub-notes/
|
|
50
|
+
20261005T100000-toleiliang4.agentid.pub-generalize/
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 三、批次目录内的文件
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
<整理批次目录>/
|
|
59
|
+
context.md ← 任务书
|
|
60
|
+
ops.jsonl ← 操作流水
|
|
61
|
+
threads/ ← 话题快照目录
|
|
62
|
+
main.md ← 主话题快照
|
|
63
|
+
<threadId>.md ← 分话题快照(每个 thread 一个)
|
|
64
|
+
artifacts/ ← 产物目录(调试用)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### context.md — 任务书
|
|
68
|
+
|
|
69
|
+
整理会话启动时读取的上下文文件,包含:
|
|
70
|
+
|
|
71
|
+
- 整理模式、triggeredBy、允许写入的 scope
|
|
72
|
+
- 作用域信息(selfAid、peerAid、processingDir、consolidatedDir、indexPath)
|
|
73
|
+
- notes 模式:`threads/` 目录下各话题快照文件的路径列表
|
|
74
|
+
- 其余模式:候选记忆列表(只有路径 + 描述,不塞全文)
|
|
75
|
+
|
|
76
|
+
整理会话以此文件为起点,不依赖任何注入变量。
|
|
77
|
+
|
|
78
|
+
### ops.jsonl — 操作流水
|
|
79
|
+
|
|
80
|
+
整理会话执行的每条 `ec memory` 命令及其结果,每行一条 JSON:
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{"ts": "2026-10-04T18:59:30.000Z", "op": "create", "scope": "relation", "target": "commit-chinese", "tags": ["rule", "long-term"], "ok": true}
|
|
84
|
+
{"ts": "2026-10-04T18:59:31.000Z", "op": "archive", "scope": "relation", "target": "consolidated/old-note.md", "ok": true}
|
|
85
|
+
{"ts": "2026-10-04T18:59:32.000Z", "op": "summary", "created": 1, "updated": 0, "archived": 1, "errors": 0}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
字段说明:`ts` 是 ISO 8601 字符串;`op` 取值 `create` / `update` / `archive` / `summary`;`target` 对 create 是 slug,对 update/archive 是目标路径;`ok` 是布尔值,失败时附 `error` 字段。最后一行 summary 由程序在会话结束时追加。
|
|
89
|
+
|
|
90
|
+
### threads/ — 话题快照目录
|
|
91
|
+
|
|
92
|
+
从 `messages.jsonl` 里截取本次整理范围内的消息(`ts >= lastConsolidatedAt`),按 threadId 分组,每个 thread 一个 Markdown 文件。没有 threadId 的消息归入 `main.md`。
|
|
93
|
+
|
|
94
|
+
每个文件的格式:
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
# 话题快照:<threadId>
|
|
98
|
+
|
|
99
|
+
> 时间范围:<firstMsgTime> — <lastMsgTime>
|
|
100
|
+
> 消息行范围:L<start>–L<end>(对应 messages.jsonl 行号)
|
|
101
|
+
|
|
102
|
+
L行号 时间 [用户 <peerAid>]: 内容
|
|
103
|
+
L行号 时间 [助手]: 内容
|
|
104
|
+
...
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
整理会话通过 `context.md` 里的路径列表逐一读取各话题快照,不需要自己去扫目录。
|
|
108
|
+
|
|
109
|
+
### artifacts/ — 产物目录(调试用)
|
|
110
|
+
|
|
111
|
+
整理会话 create / update 的记忆文件的符号链接或副本,便于一次性查看本次整理的全部产出。
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
artifacts/
|
|
115
|
+
consolidated/
|
|
116
|
+
<slug>.md ← 指向 consolidated/ 下的实际文件
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 四、目录命名速查
|
|
122
|
+
|
|
123
|
+
| 名称 | 路径 | 说明 |
|
|
124
|
+
|------|------|------|
|
|
125
|
+
| 整理进度标记 | `<chatDir>/consolidation-checkpoint.json` | 记录上次整理到哪了 |
|
|
126
|
+
| 整理批次根目录 | `$EVOLCORE_HOME/memory/consolidation-batches/` | 所有批次平铺在这里 |
|
|
127
|
+
| 整理批次目录 | `consolidation-batches/<ts>-<selfAid>-<mode>/` | 一次整理对应一个目录 |
|
|
128
|
+
| 任务书 | `<批次目录>/context.md` | 整理会话的起点文件 |
|
|
129
|
+
| 操作流水 | `<批次目录>/ops.jsonl` | 所有 ec memory 调用记录 |
|
|
130
|
+
| 话题快照目录 | `<批次目录>/threads/` | 按 threadId 切分的对话历史 |
|
|
131
|
+
| 主话题快照 | `<批次目录>/threads/main.md` | 无 threadId 的消息 |
|
|
132
|
+
| 分话题快照 | `<批次目录>/threads/<threadId>.md` | 某个 thread 的消息 |
|
|
133
|
+
| 产物目录 | `<批次目录>/artifacts/` | 本次整理产出的记忆文件(调试用) |
|