evolcore 0.0.28 → 0.0.29

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.
Files changed (183) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/bin/ec-safe-output.js +270 -54
  3. package/dist/agents/baseagent-availability.js +37 -1
  4. package/dist/agents/baseagent.js +19 -9
  5. package/dist/agents/claude-runner.js +171 -13
  6. package/dist/agents/codex/app-server-client.js +6 -2
  7. package/dist/agents/codex/diagnostics.js +4 -3
  8. package/dist/agents/codex-runner.js +396 -95
  9. package/dist/agents/gemini-runner.js +35 -17
  10. package/dist/aun/group/history.js +130 -90
  11. package/dist/aun/group/operations.js +1 -3
  12. package/dist/aun/menu/transport.js +5 -3
  13. package/dist/aun/msg/managed-operation.js +70 -0
  14. package/dist/aun/msg/p2p.js +1 -3
  15. package/dist/aun/msg/upload.js +2 -2
  16. package/dist/aun/outbox.js +1 -37
  17. package/dist/channels/aun.js +249 -89
  18. package/dist/channels/daemon.js +18 -1
  19. package/dist/channels/feishu.js +1 -2
  20. package/dist/cli/agent-command.js +23 -3
  21. package/dist/cli/agent-create.js +68 -2
  22. package/dist/cli/agent.js +12 -2
  23. package/dist/cli/aun-commands.js +87 -13
  24. package/dist/cli/cli-argv.js +26 -0
  25. package/dist/cli/daemon-commands.js +40 -10
  26. package/dist/cli/data-command.js +4 -4
  27. package/dist/cli/handoff-command.js +2 -0
  28. package/dist/cli/index.js +18 -1
  29. package/dist/cli/managed-command-guard.js +10 -0
  30. package/dist/cli/memory-command.js +441 -0
  31. package/dist/cli/restart-monitor.js +62 -6
  32. package/dist/cli/skill-command.js +41 -0
  33. package/dist/cli/task-context.js +2 -23
  34. package/dist/cli/trigger-command.js +9 -1
  35. package/dist/cli/watch-msg-diag.js +209 -0
  36. package/dist/config/config-field-policy.js +52 -3
  37. package/dist/config/config-manager.js +17 -4
  38. package/dist/config/contact-book-store.js +2 -2
  39. package/dist/config/mention-mode.js +7 -2
  40. package/dist/config/merge.js +28 -9
  41. package/dist/config/resolved-config-op.js +1 -1
  42. package/dist/config/runtime-env.js +137 -0
  43. package/dist/config/schema-registry.js +11 -1
  44. package/dist/config-store.js +10 -10
  45. package/dist/core/audit/event-key.js +3 -1
  46. package/dist/core/audit/log-integrity.js +4 -0
  47. package/dist/core/auth/agent-delegation.js +2 -1
  48. package/dist/core/auth/auth-gateway.js +13 -6
  49. package/dist/core/auth/authorization-audit.js +54 -19
  50. package/dist/core/auth/operation-authorizer.js +17 -0
  51. package/dist/core/auth/operation-catalog.js +9 -0
  52. package/dist/core/causation/context.js +5 -1
  53. package/dist/core/command/agent-control.js +1 -2
  54. package/dist/core/command/command-handler.js +51 -23
  55. package/dist/core/command/memory-slash.js +270 -0
  56. package/dist/core/command/menu-catalog.js +1 -0
  57. package/dist/core/command/menu-handler.js +315 -60
  58. package/dist/core/command/menu-protocol.js +42 -4
  59. package/dist/core/command/slash-gate.js +10 -10
  60. package/dist/core/command/slash-handler.js +206 -64
  61. package/dist/core/data-migration.js +282 -505
  62. package/dist/core/event-catalog.js +26 -0
  63. package/dist/core/evolagent-registry.js +6 -0
  64. package/dist/core/evolagent.js +0 -10
  65. package/dist/core/handoff/store.js +1 -20
  66. package/dist/core/inference/text-inference.js +57 -1
  67. package/dist/core/memory/consolidation-context.js +505 -0
  68. package/dist/core/memory/consolidation-ops-records.js +124 -0
  69. package/dist/core/memory/consolidation-trigger.js +394 -0
  70. package/dist/core/memory/index-manager.js +308 -0
  71. package/dist/core/memory/launch-consolidation.js +395 -0
  72. package/dist/core/memory/memory-admin.js +234 -0
  73. package/dist/core/memory/memory-document.js +100 -0
  74. package/dist/core/memory/memory-session-policy.js +41 -0
  75. package/dist/core/memory/memory-signature.js +257 -0
  76. package/dist/core/memory/memory-writer.js +432 -0
  77. package/dist/core/memory/staleness.js +117 -0
  78. package/dist/core/message/auto-mention-gate.js +454 -0
  79. package/dist/core/message/im-renderer.js +69 -16
  80. package/dist/core/message/message-bridge.js +287 -21
  81. package/dist/core/message/message-log.js +1 -0
  82. package/dist/core/message/message-queue.js +114 -27
  83. package/dist/core/message/pending-hints.js +329 -161
  84. package/dist/core/message/response-engine.js +567 -80
  85. package/dist/core/permission/ec-command-parser.js +1029 -80
  86. package/dist/core/permission/protected-paths.js +376 -126
  87. package/dist/core/permission/sandbox-runtime.js +40 -12
  88. package/dist/core/permission/tool-error-code.js +96 -13
  89. package/dist/core/permission/tool-policy.js +276 -23
  90. package/dist/core/role/runtime-policy.js +3 -7
  91. package/dist/core/session/{runner-task-history.js → runner-event-summary.js} +1 -1
  92. package/dist/core/session/session-fs-store.js +0 -76
  93. package/dist/core/session/session-idle-monitor.js +355 -0
  94. package/dist/core/session/session-manager.js +478 -17
  95. package/dist/core/session/session-mapper.js +33 -16
  96. package/dist/core/session/session-renew.js +217 -155
  97. package/dist/core/session/{session-turns.js → session-transcript.js} +35 -6
  98. package/dist/core/skill/global-watcher.js +282 -0
  99. package/dist/core/skill/index-generator.js +84 -0
  100. package/dist/core/skill/startup.js +73 -0
  101. package/dist/core/skill/switch-resolver.js +115 -0
  102. package/dist/core/task/task-activity-store.js +219 -0
  103. package/dist/eck/kit-renderer.js +30 -3
  104. package/dist/eck/manifest-engine.js +26 -4
  105. package/dist/index.js +708 -18
  106. package/dist/ipc.js +564 -2
  107. package/dist/paths.js +30 -9
  108. package/dist/response-system/engines/v1/proactive-flow.js +116 -15
  109. package/dist/response-system/modes/single-session/index.js +3 -0
  110. package/dist/trigger/feedback.js +1 -0
  111. package/dist/trigger/manager.js +0 -10
  112. package/dist/trigger/scheduler.js +11 -0
  113. package/dist/trigger/validation.js +22 -0
  114. package/dist/utils/avatar-upload.js +59 -18
  115. package/dist/utils/error-dict.json +6 -3
  116. package/dist/utils/error-utils.js +27 -0
  117. package/dist/utils/logger.js +32 -10
  118. package/dist/utils/media-cache.js +84 -0
  119. package/dist/utils/msg-diag.js +97 -0
  120. package/dist/utils/welcome.js +37 -8
  121. package/kits/docs/AUTHORING.md +314 -0
  122. package/kits/docs/GUIDE.md +2 -0
  123. package/kits/docs/INDEX.md +2 -0
  124. package/kits/docs/aun/CHEATSHEET.md +4 -0
  125. package/kits/docs/aun/SDK.md +60 -0
  126. package/kits/docs/context-assembly.md +10 -6
  127. package/kits/docs/evolcore/INDEX.md +17 -3
  128. package/kits/docs/evolcore/agent-create.md +24 -0
  129. package/kits/docs/evolcore/agent.md +5 -2
  130. package/kits/docs/evolcore/config.md +1 -1
  131. package/kits/docs/evolcore/ec-capabilities.md +364 -0
  132. package/kits/docs/evolcore/group.md +34 -18
  133. package/kits/docs/evolcore/memory-architecture.md +78 -0
  134. package/kits/docs/evolcore/memory-consolidation-batches.md +133 -0
  135. package/kits/docs/evolcore/memory-consolidation.md +263 -0
  136. package/kits/docs/evolcore/memory-tags.md +63 -0
  137. package/kits/docs/evolcore/memory.md +110 -0
  138. package/kits/docs/evolcore/menu-client.md +27 -11
  139. package/kits/{schemas → docs/evolcore}/menu-exec-schema-commands.md +12 -6
  140. package/kits/docs/evolcore/menu-protocol.md +213 -0
  141. package/kits/docs/evolcore/msg.md +2 -0
  142. package/kits/docs/evolcore/trigger.md +7 -5
  143. package/kits/docs/path-registry.md +6 -8
  144. package/kits/docs/prompt-loading-architecture.md +5 -3
  145. package/kits/docs/venues/group.md +5 -4
  146. package/kits/eck_manifest.json +294 -88
  147. package/kits/eck_manifest.memory.json +257 -0
  148. package/kits/rules/03-identity.md +8 -8
  149. package/kits/rules/05-venue.md +4 -2
  150. package/kits/rules/06-channel.md +1 -1
  151. package/kits/schemas/_meta.json +276 -47
  152. package/kits/schemas/agent-config.schema.12.json +38 -2
  153. package/kits/schemas/agent-config.schema.13.json +591 -0
  154. package/kits/schemas/daemon.schema.6.json +9 -9
  155. package/kits/schemas/defaults.schema.5.json +29 -0
  156. package/kits/schemas/relation-config.schema.8.json +14 -1
  157. package/kits/schemas/relation-config.schema.9.json +129 -0
  158. package/kits/schemas/role-config.schema.1.json +3 -3
  159. package/kits/skills/.switches.json +3 -0
  160. package/kits/skills/ec-skill/SKILL.md +217 -0
  161. package/kits/skills/ec-skill/scripts/cli.mjs +128 -0
  162. package/kits/skills/ec-skill/scripts/deps.mjs +107 -0
  163. package/kits/skills/ec-skill/scripts/frontmatter.mjs +104 -0
  164. package/kits/skills/ec-skill/scripts/skill.mjs +629 -0
  165. package/kits/skills/ec-skill/scripts/template/SKILL.md.tmpl +30 -0
  166. package/kits/templates/decision/auto-mention.md +25 -0
  167. package/kits/templates/decision/session-renew.md +22 -0
  168. package/kits/templates/memory-consolidation/forget.md +104 -0
  169. package/kits/templates/memory-consolidation/generalize.md +76 -0
  170. package/kits/templates/memory-consolidation/notes.md +133 -0
  171. package/kits/templates/memory-consolidation/profile.md +58 -0
  172. package/kits/templates/memory-consolidation/promote.md +72 -0
  173. package/kits/templates/memory-consolidation/workflow.md +75 -0
  174. package/kits/templates/system-fragments/bootstrap.md +14 -5
  175. package/kits/templates/system-fragments/commands.md +1 -0
  176. package/kits/templates/system-fragments/group-history.md +6 -0
  177. package/kits/templates/system-fragments/identity.md +0 -3
  178. package/kits/templates/system-fragments/memory.md +79 -0
  179. package/kits/templates/system-fragments/reply.md +1 -0
  180. package/kits/templates/system-fragments/venue.md +1 -1
  181. package/package.json +4 -6
  182. package/dist/trigger/legacy-session-history.js +0 -19
  183. package/kits/templates/system-fragments/group-unread-history.md +0 -7
@@ -0,0 +1,263 @@
1
+ # ec memory 整理会话 — 机制说明
2
+
3
+ > 本文说明**整理会话**(`sessionType=memory`)的工作机制:它是什么、有哪几种模式、各自怎么干活、产出什么。
4
+ > 整理会话自己读的规范是注入的 `[memory]` fragment 与模板(`kits/templates/memory-consolidation/`),本文供人排查问题时阅读。
5
+ >
6
+ > 主会话的命令用法见 `$KITS_DOCS/evolcore/memory.md`;标签取值见 `$KITS_DOCS/evolcore/memory-tags.md`。
7
+
8
+ ---
9
+
10
+ ## 一、整理会话是什么
11
+
12
+ 一个**临时的、跑完即删的**独立会话,不在对端对话里,也不在会话列表里留痕。
13
+
14
+ ```
15
+ 主会话 launchConsolidation() 整理会话(模型) 程序
16
+ │ │ │ │
17
+ ├─ note ─────────────────────────────────────► pending/
18
+ │ │ │ │
19
+ ├─ consolidate ─────►│ │ │
20
+ │ pending/ → processing/ │ │
21
+ │ 序列化上下文文件 │ │
22
+ │ ├── 拉起会话 ────────────►│ │
23
+ │ │ ├─ 读上下文文件 │
24
+ │ │ ├─ 读候选记忆 │
25
+ │ │ ├─ create/update/archive
26
+ │ │ │ ├─ 签名
27
+ │ │ │ ├─ 日志落盘
28
+ │ │◄──── 会话结束 ───────────┤ │
29
+ │ onConsolidationComplete() │ │
30
+ │ processing/ 归位 │ │
31
+ │ writeCheckpoint │ │
32
+ │ 重建索引(收尾时一次性) │ │
33
+ │ feedback → 发起时的会话和话题 │ │
34
+ ```
35
+
36
+ **它是唯一能产生正式记忆的地方。** 主会话只能写 note(原料),正式记忆的增删改全部由整理会话完成。
37
+
38
+ **统一入口 `launchConsolidation()`**:所有触发路径——手动调用、定时检查、上下文压缩、renew / `/new`——都收口到这一个函数。它负责整理的完整生命周期:启动前把 `pending/` 加锁移入 `processing/`,序列化上下文文件,**直接创建整理会话**,会话结束后通过 `onConsolidationComplete` 处理收尾(归位、checkpoint、定稿索引、反馈)。
39
+
40
+ **触发方分两个层次**:
41
+ - **定时检查**:由 evolcore trigger 的 `script` 模式每小时执行一次,检查五类候选(notes / generalize / promote / profile / forget),符合条件就拉起整理会话。检查器只做判断,不承载生命周期。
42
+ - **手动 / compact / renew / `/new`**:直接调用 `launchConsolidation()`,不经检查器。
43
+
44
+ **并发与排队**:同一 agent 同时只能有一个整理会话在跑;全局最多 5 个 agent 并发。超出的请求排队,前一个结束后自动启动下一个。
45
+
46
+ ---
47
+
48
+ ## 二、五种模式
49
+
50
+ | 模式 | 输入 | 产出 | 判断依据 | 检查 owner |
51
+ |---|---|---|---|---|
52
+ | `notes` | 当前关系的 `pending/` + 会话历史 | relation 正式记忆 | 值不值得长期留下 | 否 |
53
+ | `generalize` | 关系级里带 `to-generalize` 的记忆 | agent 正式记忆 | **普遍性**:换成别的对端也成立 | 否 |
54
+ | `promote` | 关系级里带 `to-promote` 的记忆 | owner 正式记忆 | **权威性**:owner 定下、对所有 agent 有效 | **是** |
55
+ | `profile` | 该关系索引里的全部记忆 | 一条带 `profile` 标签的 relation 记忆 | 归纳对端这个主体 | 否 |
56
+ | `forget` | mtime 超过 `forgetAfterDays` 的记忆 | 无新结论,只做续期 / 合并 / 归档 | 这条还成立吗 | 否 |
57
+
58
+ **每种模式各自起独立的整理会话**,一个会话只对应一种模式。候选集和允许写的 scope 都不一样,不能合成一次会话跑固定流程。
59
+
60
+ **会话怎么知道自己是什么模式**:`launchConsolidation()` 建会话时带 `memoryMode`,经 `session.metadata` → `kitCtx.vars` → manifest 的 `when` 条件选出对应的模式手册。只有 `[memory]` 段、`workflow.md` 和自己那一份模式手册会被加载。
61
+
62
+ ---
63
+
64
+ ## 三、三个写命令
65
+
66
+ 整理会话只能用这三个命令写正式记忆。**不允许用 Write / Edit 直接写文件**——那会绕过签名和索引。
67
+
68
+ ### create — 新建
69
+
70
+ ```bash
71
+ ec memory create --scope <relation|agent|owner> --slug <slug> --desc "一句话描述" \
72
+ --tags <tag1,tag2,...> [--keywords <kw1,kw2,...>] [--replaces <路径,...>] "<正文>"
73
+ ```
74
+
75
+ - 程序负责签名、写入 `consolidated/`、重建索引。
76
+ - `--replaces` 指定的旧文件会被自动归档——**合并、纠正内容、升格作用域都走这条路径**,一次调用完成,不会出现「新的写了、旧的没归档」的重复记忆。
77
+ - **目标 slug 已存在且未在 `--replaces` 里列出 → 拒绝**,报错回传已有文件路径。这是防止漏用 `--replaces` 导致静默覆盖的闸门。
78
+ - **正文上限 10KB**,超出报 `MEMORY_TOO_LARGE`。这不是技术限制(底层签名接口本身无上限),而是记忆的性质决定的:一条记忆应当是**一句话能说清的结论**。内容确实那么多时,拆成多条分别 `create`,或把细节留在归档文件里、记忆只记结论。
79
+
80
+ ### update — 只改标签
81
+
82
+ ```bash
83
+ ec memory update <路径> --tags <tag1,tag2,...> # 整体替换标签
84
+ ec memory update <路径> --touch # 刷新 mtime 与 updatedAt,用于续期
85
+ ```
86
+
87
+ **update 不能改正文。** 内容一变,描述和关键词都得跟着变,那就应该 create 一条新的。它剩下的场景都是正文不变、只有状态变的:
88
+
89
+ | 场景 | 改法 |
90
+ |---|---|
91
+ | 任务推进 | `in-progress` → `blocked` → `done` / `cancelled` |
92
+ | 紧急解除 | 去掉 `urgent` |
93
+ | 推断被确认 | `inferred` → `verified` |
94
+ | 判定长期有效或重要 | 补 `long-term` / `important` |
95
+ | 评估后不该升级 | 去掉 `to-generalize` / `to-promote` |
96
+
97
+ ### archive — 归档
98
+
99
+ ```bash
100
+ ec memory archive <路径...>
101
+ ```
102
+
103
+ **没有删除,只有归档。** 文件移入 `archive/`,可人工回捞。用于:合并后多出来的旧文件、已经过时的记忆。
104
+
105
+ ---
106
+
107
+ ## 四、权限校验
108
+
109
+ daemon 按整理会话的模式校验 `--scope`:
110
+
111
+ | 会话模式 | 允许的 `--scope` |
112
+ |---|---|
113
+ | `notes` | `relation` |
114
+ | `generalize` | `agent` |
115
+ | `promote` | `owner`,且 `--replaces` 的来源必须包含 owner 关系的记忆 |
116
+ | `profile` | `relation` |
117
+ | `forget` | `relation`(合并产出;续期与归档不限作用域) |
118
+
119
+ **这是唯一真正生效的一道闸。** 触发器提示词里写的模式、上下文文件里写的模式、daemon 的校验,三层一致——前两层是引导,第三层是保证。模型理解错了模式,越权的写入也会被拒。
120
+
121
+ **其他写入限制**:
122
+
123
+ - `profile` 标签的记忆,一个关系只能有一条。重新生成必须用 `--replaces` 指定旧的那条。
124
+ - `to-promote` 只能打在对端是 owner 的关系上。群聊关系额外检查发言人身份,owner 本人说的话可以打。
125
+ - 全局总开关是 `memory.enableRelation`。它关闭时,五种模式和手动调用全部拒绝。
126
+ - `enableAgent=false` 关闭泛化模式与 agent 索引注入,notes / promote 照常。
127
+ - `enableOwner=false` 关闭提升模式与 owner 索引注入,notes / generalize 照常。
128
+
129
+ ---
130
+
131
+ ## 五、候选怎么筛
132
+
133
+ 主会话每一轮判断「压缩或新会话后会丢、且有影响」就写一条 note,所以 `pending/` 里是**未经分类的原料**:可能重复、可能矛盾、可能有错。
134
+
135
+ **`notes` 模式**的输入是:
136
+
137
+ - `pending/` 里的全部 note
138
+ - 会话历史(`triggeredBy` 为 `compress` / `session-new` / `manual` 时可用;`periodic-trigger` 触发的补漏整理没有会话历史,只能凭 note 本身判断)
139
+ - 现有的 `MEMORY.md` 索引(查重用)
140
+
141
+ **`launchConsolidation()` 在拉起整理会话之前会把 `pending/` 整体 rename 到 `processing/`**,相当于加锁声明认领。整理过程中主会话新写的 note 落在 `pending/`,不会被这次整理误伤,也不会被误删。
142
+
143
+ **`profile` 和 `forget` 模式**的候选清单**只给路径 + 描述**,会话按需读正文:
144
+
145
+ - `profile`:先读该关系的索引(每条描述即一句话结论),归纳画像主要靠这些;某条太简、拿不准时再读那一条。
146
+ - `forget`:候选只给路径和描述,只有拿不准是不是还成立的那几条才读全文。
147
+
148
+ 一个关系可能有几百条记忆,全读正文既慢又没必要。
149
+
150
+ ---
151
+
152
+ ## 六、收尾
153
+
154
+ | 结果 | 处理 |
155
+ |---|---|
156
+ | 成功(含 `[[NOOP]]`) | `processing/` 里的 note 移入 `archive/notes/`,留底便于追查整理质量;写 checkpoint |
157
+ | 失败 / 中断 | `processing/` 里的 note 移回 `pending/`,下次重新整理;不写 checkpoint |
158
+
159
+ `processing/` 里的非 note 条目(如 `pending/archive/` 的 drop 留底)无论成败都原样还回 `pending/`。归位时与已有文件重名不覆盖,改名加时间戳后缀。
160
+
161
+ **这个收尾由程序做(`onConsolidationComplete`),不让模型自己挪文件。**
162
+
163
+ 同时程序会在批次目录 `$EVOLCORE_HOME/memory/consolidation-batches/<YYYYMMDDTHHmmss>-<selfAid>-<mode>/` 下:
164
+
165
+ - 往 `ops.jsonl` 追加一行 `summary`(created / updated / archived / errors 计数)。
166
+ - 导出整理会话历史到 `history.jsonl`。
167
+
168
+ 索引 `MEMORY.md` 在每次 `create` / `update` / `archive` 后已即时重建,收尾不再重复。
169
+
170
+ 上一批的 `processing/` 还在时(会话未结束,或 daemon 中途重启丢了收尾),新一轮 notes 整理不迁移 `pending/`,避免两批混在一起。
171
+
172
+ ---
173
+
174
+ ## 七、整理会话里能做什么、不能做什么
175
+
176
+ **能**:
177
+
178
+ - 用 Read / Glob / Grep 读上下文文件、`processing/`、`consolidated/`、`MEMORY.md`、批次目录。
179
+ - 用 Bash 执行**单条** `ec memory create` / `update` / `archive` 写正式记忆。
180
+
181
+ **不能**(程序拦截,提示「整理会话不允许执行此命令」):
182
+
183
+ - Write / Edit / MultiEdit / NotebookEdit(Codex 的文件变更同理)——直接写文件绕过签名和索引。
184
+ - 子代理(Agent / Task)、PowerShell——能绕开本策略。
185
+ - Bash 里的其他任何命令,包括 `ls`、`cat`、`npm`、`git`,以及 `ec memory note` / `ec memory consolidate`
186
+ (note 是主会话入口,用了会把结果变回原料;consolidate 会形成循环)。
187
+ - 在放行命令后拼接其他命令(`;`、`&&`、`|`、`$()`、反引号)。正文含特殊字符时用单引号包住。
188
+
189
+ **不能**(daemon 校验拒绝):
190
+
191
+ - 处理模式之外的 `--scope`。
192
+
193
+ **不该做**:
194
+
195
+ - 逐一读取所有 consolidated 文件查重。先查 `MEMORY.md` 索引,只在发现高度相似的描述时才读那一条确认。
196
+
197
+ 实现:`src/core/memory/memory-session-policy.ts`,由 response-engine 在 `sessionType=memory` 的会话上挂为 policyHook,Claude / Codex / ecagent 三个 runner 共用。整理 trigger 不带 `permissionMode`,不会进入 fullaccess,策略不会被跳过。
198
+
199
+ ---
200
+
201
+ ## 八、索引与目录
202
+
203
+ ```
204
+ <memory>/
205
+ ├── MEMORY.md # 索引,程序自动重建
206
+ ├── pending/ # note 写入;整理前整体移到 processing/
207
+ │ └── archive/ # 被 drop 的 note
208
+ ├── processing/ # 整理中快照
209
+ ├── consolidated/ # 正式记忆(已签名),文件名即 <slug>.md
210
+ └── archive/
211
+ ├── notes/ # 整理完成的 pending 原件
212
+ └── invalid/ # 验签失败或未签名的文件
213
+ ```
214
+
215
+ **索引**:每个作用域一份,上限 `memory.indexMaxBytes`(默认 5KB)。重建时**逐份验签,只认 `verified`**——`invalid` 和 `unsigned` 都移入 `archive/invalid/`,都不进索引。筛选顺序:
216
+
217
+ 1. `important`、`urgent`、`profile` 必进,**永不淘汰**
218
+ 2. `in-progress`、`pending`、`blocked`
219
+ 3. `long-term`
220
+ 4. 其余按文件 mtime 从新到旧
221
+ 5. `done`、`cancelled` **不进索引**
222
+ 6. 超过上限从末尾截断
223
+
224
+ **时间有两处来源**:文件 mtime 给程序用(排序、超期判断),frontmatter 的 `updatedAt` 给人读。程序在每次写操作时同步写入。
225
+
226
+ **「候选」与「索引」是两回事**:候选是本次遗忘会话要审查的那份清单(mtime 超 `forgetAfterDays` 的记忆);索引是 `MEMORY.md`,决定召回时能否看到。**续期只是让它在 `forgetAfterDays` 天内不再进候选,完全不影响索引**——那条记忆一直可被召回。只有归档才会把它从索引里移除。**续期可逆,归档不可逆。**
227
+
228
+ **索引行格式**:`- [描述](consolidated/<slug>.md) #keyword1 #keyword2`
229
+
230
+ 没进索引的文件仍留在磁盘上,可以搜到;只有 `archive` 才让它下线。
231
+
232
+ **整理批次**:`$EVOLCORE_HOME/memory/consolidation-batches/`,每次整理建一个批次目录,命名为 `YYYYMMDDTHHmmss-<selfAid>-<mode>/`,目录内含 `context.md`(任务书)、`ops.jsonl`(操作流水)、`threads/`(话题快照)。不自动清理,由人工维护。详细结构见 `memory-consolidation-batches.md`。
233
+
234
+ ---
235
+
236
+ ## 九、整理会话的 manifest
237
+
238
+ 整理会话的 manifest(`kits/eck_manifest.memory.json`,14 段)不是主会话的减配版,而是独立的一份。会话原型 `memory` 由代码内置映射到这份 manifest(`kit-renderer.ts` 的 `BUILTIN_SESSION_MANIFESTS`),不依赖 agent config;`config.sessionManifests` 只作可选覆盖。
239
+
240
+ | order | 段 | 用途 |
241
+ |---|---|---|
242
+ | 12 | `memory` | 与主会话共用的 `$KITS_FRAGMENTS/memory.md`,按 `sessionType=memory` 渲染整理分支:三个写命令、模式权限、禁止事项 |
243
+ | 20 | `memory-workflow` | 整理流程:读上下文、查重、取舍、update 与 create --replaces 的选择、收尾 |
244
+ | 25 | `persona` | 当前 agent 的人格 |
245
+ | 26 | `personal-profile` | 当前 agent 的个人资料与工作背景 |
246
+ | 27 | `peer-profile` | **当前对端画像**(`profile` 标签的记忆) |
247
+ | 31 | `memory-mode-*` | 五份模式手册,按 `memoryMode` 五选一 |
248
+ | 36/37/38 | 三份记忆索引 | agent / owner / relation |
249
+ | 60 | `session` | 会话实例状态 |
250
+
251
+ **为什么注入人格、个人资料和对端画像**:判断一条记忆值不值得留下、该归到哪个作用域时,需要知道「我是谁」(人格与自身定位)和「对方是谁」(画像)。三者都在模式手册之前加载(order 25–27 < 31),确保判断依据先于操作指令到位。
252
+
253
+ **相对 v2 去掉的段**:`rules` 目录段(原本会把 `04-relation.md` / `05-venue.md` / `06-channel.md` 一并注入,对整理会话是噪声甚至误导)、`identity-layer`。整理会话不跟对端说话、不进群、不发消息。
254
+
255
+ ---
256
+
257
+ ## 十、session.md 的注入
258
+
259
+ 整理会话也加载 `$KITS_FRAGMENTS/session.md`,但其中的 proactive 行为约束(群聊要不要响应、首次调用工具前先发言、每 N 次调用汇报进展、`ec group send` / `ec msg send` 语法速查、跨会话 `--return` 规则)**不会渲染**。
260
+
261
+ 原因:整理会话由触发器创建,`peerType` 是 `system`、`chatType` 是 `private`。`resolveChatModeForPeer` 对 system 对端有硬约束,返回 `interactive`,而 proactive 那段的条件是 `{{?chatMode=proactive}}`,所以整块跳过。已实测确认。
262
+
263
+ **因此 `session.md` 不需要为整理会话做任何改动。** 要保留的字段是 `permissionMode`(决定能否调三个写命令)、`timezone` / `tzOffset` / `localDate`(遗忘判断算天数,时区错会误判超期)、`sessionId` / `project`(诊断)。
@@ -0,0 +1,63 @@
1
+ # memory-tags — 记忆标签说明
2
+
3
+ 记忆系统的标签值全集。写入记忆时从本表选值,同一条记忆可以贴多个标签。
4
+
5
+ 标签值直接放在 frontmatter 的 `tags` 数组里:
6
+
7
+ ```yaml
8
+ tags: [important, long-term, rule, verified]
9
+
10
+ ```
11
+
12
+ ---
13
+
14
+ ## 标签表
15
+
16
+ | 标签值 | 说明 | 判断条件 | 例子 |
17
+ | --- | --- | --- | --- |
18
+ | important | 重要标记(保证进索引,不参与淘汰) | 忘了会直接影响工作质量或引发冲突 | owner 要求 commit 必须用中文;不要直接删文件 |
19
+ | urgent | 紧急标记(保证进索引,不参与淘汰) | 当前任务中需要立即用到 | 今天必须完成的约定 |
20
+ | long-term | 长期有效标记 | 预期较长时间内都会成立,不随当前任务结束而过期 | 项目使用 vitest |
21
+ | verified | 已验证标记 | 对端明确确认过,或多次一致表现 | 对方说「对,就是这样」 |
22
+ | inferred | 推断标记 | 从行为或上下文推断,对端未明确说过 | 对方总用列表回复,推断偏好列表格式 |
23
+ | preference | 偏好类记忆 | 对端表达了稳定的偏好、风格或习惯 | 偏好简洁回复;不喜欢表格 |
24
+ | rule | 规则类记忆 | 关于工作方式的正向约定 | commit 消息必须用中文;改代码前先读文件 |
25
+ | prohibition | 禁令类记忆 | 明确说了不要做某件事 | 不要直接删文件 |
26
+ | fact | 事实类记忆 | 关于项目、环境、技术的客观事实 | 项目用 vitest 跑测试 |
27
+ | profile | 画像类记忆(保证进索引,不参与淘汰;一个关系只能有一条) | 关于对端这个主体的综合性描述 | 风格直接,不喜欢来回确认 |
28
+ | feedback | 反馈类记忆 | 对端对我的工作给出了明确的纠正或评价 | 「你上次列了一堆选项,我不需要,直接给结论就行」 |
29
+ | decision | 决策类记忆 | 一个方向性结论被确立,来自澄清或拍板均算 | memory.md 改名为 memory-consolidation.md |
30
+ | context | 背景类记忆 | 项目或阶段的辅助背景,不属于其他类型 | 当前处于记忆系统 v2 设计阶段;上周完成 T17 |
31
+ | to-generalize | 待泛化标记 | 这条关系级记忆换成别的对端大概率也成立 | 构建前要先清 dist;改代码前先读文件 |
32
+ | to-promote | 待提升标记 | owner 明确定下、要求名下所有 agent 都遵守的规矩 | owner 说以后谁都不许自己提交 |
33
+ | in-progress | 任务进行中 | 任务正在执行 | — |
34
+ | pending | 任务等待中 | 等待条件或确认才能继续 | — |
35
+ | blocked | 任务被阻塞 | 被外部因素卡住,无法推进 | — |
36
+ | cancelled | 任务已取消 | 任务被放弃,不再推进 | — |
37
+ | done | 任务已完成 | 任务结束,整理时从索引移除 | — |
38
+
39
+ ---
40
+
41
+ ## 规则
42
+
43
+ 1. 同一条记忆可以贴多个标签
44
+ 2. `in-progress / pending / blocked / cancelled / done` 描述同一件事的状态,同一条记忆只选其中一个
45
+ 3. `verified` 和 `inferred` 不同时贴
46
+
47
+ ---
48
+
49
+ ## 两个升级标记的用法
50
+
51
+ `to-generalize` 和 `to-promote` 不是给记忆定性的,而是给整理会话留的**待办**:
52
+
53
+ - 打上 `to-generalize` → 下次泛化模式会扫到它,评估能否升到 agent 级。
54
+ - 打上 `to-promote` → 下次提升模式会扫到它,评估能否升到 owner 级。
55
+
56
+ **打标的只有整理会话**(`create --tags`,事后可用 `update` 补)。主会话写的 note 不带标签。
57
+
58
+ **清标的两种方式**:
59
+
60
+ - 升级成功 —— 源文件被 `--replaces` 归档,标签随文件一起消失。
61
+ - 评估后认为不该升级 —— 用 `update` 去掉标签,否则每次定时检查都会重新扫到它。
62
+
63
+ **限制**:`to-promote` 只能打在对端是 owner 的关系上。其他对端打这个标签会被拒绝——否则它会永远挂在磁盘上没人处理。群聊关系下额外检查发言人身份,owner 本人说的话可以打。
@@ -0,0 +1,110 @@
1
+ # ec memory — 记忆写入与整理
2
+
3
+ 写入、修改、撤销当前关系的临时记忆(note),以及手动触发整理。触发词:记住/记一下/mark it/这很重要/别忘了/泛化一下/提升一下/整理记忆。
4
+
5
+ 何时该写、每轮自检、召回方式见系统提示词的 `[memory]` 段;本页只讲命令用法。系统怎么运转见 `$KITS_DOCS/evolcore/memory-architecture.md`。
6
+
7
+ ## 边界
8
+
9
+ - 仅在 evolcore 托管会话中可用(通过 daemon IPC 执行,依赖 `EVOLCORE_SESSION_ID`)。
10
+ - `note` 写入当前关系,**必须有对端**(peerKey);没有对端的会话不要调用。
11
+ - `memory.enableRelation=false` 时整个命令族被拒绝。
12
+ - **不要用 Write / Edit 直接写记忆文件,也不要用 baseagent 的原生记忆工具**:绕过签名和索引,整理会话不感知。
13
+ - `create` / `update` / `archive` 只在整理会话(`sessionType=memory`)里可用,主会话调用会被拒绝。
14
+
15
+ ## note 写入
16
+
17
+ ```bash
18
+ ec memory note --slug <slug> [--tags <tag1,tag2,...>] [--speakers <id1,id2,...>] "<正文>"
19
+ ```
20
+
21
+ | 参数 | 说明 |
22
+ |------|------|
23
+ | `--slug` | **必填**。字母/数字/连字符,1-64 字符,当前关系内唯一,后续 update / drop 靠它定位 |
24
+ | `--tags` | 可选。逗号分隔,取值见 `$KITS_DOCS/evolcore/memory-tags.md` |
25
+ | `--speakers` | 可选,**群聊专用**。逗号分隔,填本条 note 涉及的发言人 AID 或渠道原生 ID(如 `alice.agentid.pub,bob.agentid.pub`)。整理会话会据此把发言人相关信息分流写入各发言人自己的 relation 记忆,而不是只落在群的 relation 下。私聊场景无需填写。 |
26
+ | 正文 | 必填。写清事实本身即可,不用组织成索引描述 |
27
+
28
+ ```bash
29
+ ec memory note --slug commit-chinese --tags "rule,long-term" \
30
+ "对端要求:commit message 必须用中文,并列出所有功能改动点。"
31
+ ```
32
+
33
+ note 是原料:不进索引、不签名,由整理会话读取后决定留下什么。
34
+
35
+ ## note 修改
36
+
37
+ ```bash
38
+ ec memory note update <slug> [--slug <新slug>] [--tags <...>] ["<新正文>"]
39
+ ```
40
+
41
+ 不传的字段保持不变;至少提供一项。判据:**还是在说同一件事 → update;不是 → 新建。**
42
+
43
+ ```bash
44
+ ec memory note update commit-chinese --tags "rule,long-term" \
45
+ "commit 消息必须用中文;代码注释可以是英文"
46
+ ```
47
+
48
+ ## note 撤销
49
+
50
+ ```bash
51
+ ec memory note drop <slug>
52
+ ```
53
+
54
+ 文件移入 `pending/archive/`,不会真删。drop 后 slug 空出,可同名重建。
55
+
56
+ ## note 查看
57
+
58
+ ```bash
59
+ ec memory note list
60
+ ```
61
+
62
+ 列出当前关系 `pending/` 里的 note(slug + 标签 + 首行)。长会话里忘了写过什么就先查一下,避免重复新建。
63
+
64
+ ## 触发整理
65
+
66
+ ```bash
67
+ ec memory consolidate [--mode <notes|generalize|promote|profile|forget>]
68
+ ```
69
+
70
+ | 模式 | 做什么 | 什么时候用 |
71
+ |------|--------|-----------|
72
+ | `notes`(默认) | pending → 关系级正式记忆 | 想立刻固化刚才聊到的东西 |
73
+ | `generalize` | 关系级 → agent 级 | 对端说「不管跟谁聊你都要记得这个」 |
74
+ | `promote` | 关系级 → owner 级 | owner 说「让我所有 Agent 都记住这个」 |
75
+ | `profile` | 生成/重建当前对端画像 | owner 说「重新生成一下画像」 |
76
+ | `forget` | 评估超期记忆续期或归档 | 一般不手动,由定时检查发起 |
77
+
78
+ **命令是异步的**:`launchConsolidation()` 在拿到整理会话的 base agent 会话 ID 后命令即退出,不等整理会话完成。输出示例:
79
+
80
+ ```
81
+ 整理会话已启动(notes 模式)
82
+ agentSessionId: d6c2835e-3ccb-494b-b391-9725c5578043
83
+ context: C:\...\consolidation-batches\20261005T103000-toleiliang4.agentid.pub-notes\context.md
84
+ ```
85
+
86
+ `agentSessionId` 用于调试,可以在 base agent 的会话目录里找到对应的日志。整理完成后,结果会以消息形式反馈到**当前会话的当前话题**。
87
+
88
+ 反馈规则:手动、上下文压缩、renew、`/new` 四种触发路径都会把整理结果反馈回**发起时的会话和话题**(用发起时抓取的 channelId / peerId / threadId 直接投递,不依赖会话 ID 是否变化)。只有定时触发不发反馈——结果只记录在整理批次目录的 `ops.jsonl` 里,供事后审计。
89
+
90
+ 反馈内容优先取整理会话调用 `ec memory feedback` 写入的文本;未调用时回退到默认模板(模式、触发方式、耗时、新建/更新/归档条数等统计)。
91
+
92
+ 没有 `--scope`,作用域由模式唯一决定。
93
+
94
+ ## 常见报错
95
+
96
+ | 报错 | 原因与处理 |
97
+ |------|-----------|
98
+ | `必须提供 --slug` | 写入漏了 `--slug`,补上:`ec memory note --slug <slug> "<正文>"` |
99
+ | `必须提供记忆内容(content)` | 正文缺失或被 shell 吞掉,正文整体加引号 |
100
+ | `SLUG_EXISTS: 该 slug 已存在同名 note: <路径>` | 撞名。补充同一件事 → `note update <slug>`;确实是新事 → 换 slug |
101
+ | `至少提供一项要改的内容` | `note update` 只给了 slug,补 `--slug` / `--tags` / 正文之一 |
102
+ | `未知参数: --xxx` | 参数拼错,未识别的参数一律报错 |
103
+ | `--scope 已废弃` | 改用 `--mode` |
104
+ | `<op> 只能由整理会话(sessionType=memory)调用` | 主会话调用了 `create` / `update` / `archive`,改用 `ec memory note` |
105
+
106
+ ## 相关文档
107
+
108
+ - 系统概述(作用域、流水线、开关、目录) → `$KITS_DOCS/evolcore/memory-architecture.md`
109
+ - 标签取值全集 → `$KITS_DOCS/evolcore/memory-tags.md`
110
+ - 整理会话工作机制 → `$KITS_DOCS/evolcore/memory-consolidation.md`
@@ -2,11 +2,8 @@
2
2
 
3
3
  向另一台主机的 EvolCore Control AID 发送标准 `menu.*` 请求。独立终端使用 AUN 短连接完成发送、拉取、匹配和 ACK;EvolCore 托管 Agent 自动通过当前 daemon 的委托入口与现有 AUN 连接完成调用。
4
4
 
5
- ## 托管会话边界
6
-
7
- 托管调用必须使用当前 self AID,并拥有 `ec.menu.request` 的 relation 权限。daemon 校验当前 session、委托和角色,按目标 AID 与 request ID 匹配加密响应;普通角色的聊天权限不自动授予远程 Menu 调用能力。
8
-
9
- 托管模式不接受 `--app`、`--aun-path`、`--no-encrypt`,也不创建独立连接或清理 daemon 的消息。`--request-file` 由 daemon 校验后读取,须为当前项目或本会话 `$TMPDIR` 内不受保护的普通文件,最大 128 KiB;也可用 `--request-json`。目标是否允许具体操作,仍由远端 Control Menu 的 Token/Owner 鉴权决定。
5
+ > **本文只讲工具用法**(CLI 语法、参数、连接与输出行为)。
6
+ > Menu 消息的格式、`protected_headers`、鉴权机制见 `menu-protocol.md`;通过 menu exec 取配置 schema 见 `menu-exec-schema-commands.md`。
10
7
 
11
8
  ## 用法
12
9
 
@@ -18,21 +15,40 @@ ec menu-client request <from-aid> <daemon-aid> \
18
15
  --format json
19
16
  ```
20
17
 
21
- - `--request-file` 与 `--request-json` 二选一,内容是现有 Menu request;缺少 `id` 时自动生成 UUID。
18
+ - `--request-file` 与 `--request-json` 二选一,内容是**现有 Menu request**(结构见 `menu-protocol.md §三`);缺少 `id` 时自动生成 UUID。
19
+ - 请求与响应的 `ttl`、volatile 游标、`to_device_id` 定向回复等传输细节由 CLI 与 daemon 自动处理,调用方无需关心。
22
20
  - 默认使用 E2EE,并发送 `client_name=ec-menu-client` 和本机 EvolCore `client_version`。
23
21
  - 独立终端默认 slot 是 `evolcore-menu-client`;`--app <slot>` 可覆盖,但会切换消费游标,调用方须自行串行化。托管模式使用 daemon 的现有连接和 ACK 路径。
22
+ - `menu.query` / `menu.options` 等待响应超时时自动重发一次相同 request id;写操作不自动重试。
23
+
24
+ ## 鉴权入口
25
+
24
26
  - 默认授权是远端 `daemon.json.owners` 对发送 AID 的校验。
25
27
  - `--remote-token <token>` 使用 daemon 签发的远程访问 token,权限与 daemon-owner 一致。CLI 审计日志不会记录 token 明文。
28
+ - `--ecweb-token <token>` 是 `--remote-token` 的兼容别名。
26
29
  - `system/paircode` 例外:仅接受加密的 daemon-owner 请求,已有 remote token 不能换取新配对码。
30
+
31
+ > 具体的权限判定层次(哪些 operation 需要 daemon-owner、哪些走 agent 角色)见 `menu-protocol.md §五`。
32
+
33
+ ## 托管会话边界
34
+
35
+ 托管调用必须使用当前 self AID,并拥有 `ec.menu.request` 的 relation 权限。daemon 校验当前 session、委托和角色,按目标 AID 与 request ID 匹配加密响应;普通角色的聊天权限不自动授予远程 Menu 调用能力。
36
+
37
+ 托管模式不接受 `--app`、`--aun-path`、`--no-encrypt`,也不创建独立连接或清理 daemon 的消息。`--request-file` 由 daemon 校验后读取,须为当前项目或本会话 `$TMPDIR` 内不受保护的普通文件,最大 128 KiB;也可用 `--request-json`。目标是否允许具体操作,仍由远端 Control Menu 的 Token/Owner 鉴权决定。
38
+
39
+ ## 配对码与 token 生命周期
40
+
27
41
  - 配对码有效期为 10 分钟,成功兑换一次即失效;并发兑换最多一次成功。再次获取会生成新码,已签发 token 不受影响。
28
42
  - 未消费的码由各入口共享,重复获取不延长有效期。发放来源记录在运行时 `data/instance/control-access-tokens.json` 的 `pairingIssuances`:`host-cli` 为宿主机 CLI,`pair` 为 `/pair`,`menu` 为 AUN Menu,`ecweb-local` 为本地 ECWeb。`pair` / `menu` 同时记录已认证 daemon owner 的 `authorizedBy` AID;同一码经多个入口发放时保留全部不同来源与 owner,而不覆盖旧记录。
29
43
  - 发放记录包含 `pairingId`、发放/到期时间、`issuers` 和成功兑换时间 `redeemedAt`,保留 30 天;不保存配对码或其哈希。成功兑换的 token 同时保存 `pairingId` / `pairingIssuers`,后续续期与 daemon 重启不丢失来源。旧 token 缺少来源时不补造历史。
30
- - `--ecweb-token <token>` 是 `--remote-token` 的兼容别名。
31
- - Menu 请求和响应使用 `message.send` 顶层 `ttl: 60`,接收响应时应支持 volatile 游标和无持久 `seq`;响应若带 `sender_device_id`,服务端会用 `to_device_id` 定向回原设备。
32
- - `menu.query` / `menu.options` 等待响应超时时自动重发一次相同 request id;写操作不自动重试。
44
+
45
+ ## 输出与退出码
46
+
33
47
  - 成功时 stdout 是完整 `menu.response` JSON。远端业务错误仍在响应的 `error` 字段中;本地传输/超时错误退出码非 0。独立终端的 ACK 错误也以非零退出码返回;托管模式由 daemon 的正常消费路径处理 ACK。
34
48
 
35
- ## 常用请求
49
+ ## 常用请求示例
50
+
51
+ 请求体的完整字段定义见 `menu-protocol.md §三`。以下是可直接填入 `--request-json` 的样例:
36
52
 
37
53
  ```json
38
54
  {"type":"menu.query","id":"status-1","name":"system","args":{"view":"status"}}
@@ -54,5 +70,5 @@ ec menu-client request <from-aid> <daemon-aid> \
54
70
 
55
71
  子任务示例需发往目标 Agent 的会话;话题可用 `name=topic args={"target":"<threadId>","view":"subtasks"}`。
56
72
  返回 `{ scope: "retained-history", tasks: [...] }`。普通 session/topic 状态另带 `subtasks`、`subtasksScope`;
57
- `/status` 单列“已记录子任务数”,不把它加到主会话轮数中。历史来自现有 `events*.log`,
73
+ `/status` 单列"已记录子任务数",不把它加到主会话轮数中。历史来自现有 `events*.log`,
58
74
  受 `EVENT_LOG` 开关和日志保留期限制(当前归档保留 48 小时);无记录不能据此推断从未执行过子任务。
@@ -1,7 +1,7 @@
1
1
  # 通过 menu action exec 获取 Schema 的命令手册
2
2
 
3
3
  > 面向前端(App / Web / Bot)通过 `menu.action name=cli action=exec` 远程执行 CLI,取回配置 schema 的**版本**与**内容**。
4
- > 传输层、`menu.response` 配对、错误处理等通用机制见 [menu-protocol-cli-exec-frontend.md](./menu-protocol-cli-exec-frontend.md)。
4
+ > 传输层、`menu.response` 配对、错误处理等通用机制见 `$KITS_DOCS/evolcore/menu-protocol.md`。
5
5
 
6
6
  对应代码:`src/cli/config.ts` · `src/config/config-operation-service.ts`(`executeSchema`)· `src/config/schema-registry.ts`
7
7
 
@@ -27,7 +27,7 @@
27
27
  - `exitCode === 0` 才算命令成功;`--format json` 时对 `stdout` 直接 `JSON.parse`。
28
28
  - 失败(透传层拒绝,命令没跑):`error = { code, message }`。
29
29
 
30
- > 逻辑 schema 名(`<name>`):`daemon` / `defaults` / `agent-config` / `relation-config` / `contact-book` / `single-session`。各名对应哪份配置见 [§6 配置 ↔ Schema 对应表](#6-配置--schema-对应表)。
30
+ > 逻辑 schema 名(`<name>`):`daemon` / `defaults` / `agent-config` / `relation-config` / `contact-book` / `single-session`。各名对应哪份配置见 [§5 配置 ↔ Schema 对应表](#5-配置--schema-对应表)。
31
31
 
32
32
  ---
33
33
 
@@ -149,7 +149,7 @@
149
149
 
150
150
  ---
151
151
 
152
- ## 6. 配置 ↔ Schema 对应表
152
+ ## 5. 配置 ↔ Schema 对应表
153
153
 
154
154
  每份配置文件由 `ConfigTarget` 路由到唯一的 schema(`src/config/config-manager.ts` 的 `TARGET_SCHEMA`)。查某份配置有哪些字段、类型/枚举/默认,就用 §2 拉对应 `<name>` 的内容。
155
155
 
@@ -188,21 +188,27 @@
188
188
 
189
189
  ---
190
190
 
191
- ## 5. 完整发送样例(AUN)
191
+ ## 6. 完整发送样例(AUN)
192
192
 
193
193
  ```typescript
194
194
  await client.call('message.send', {
195
195
  to: targetAid,
196
- payload: JSON.stringify({
196
+ payload: {
197
197
  type: 'menu.action',
198
198
  id: 'c-schema-1',
199
199
  name: 'cli',
200
200
  action: 'exec',
201
201
  args: { argv: ['config', 'schema', 'agent-config', '--format', 'json'] },
202
- }),
202
+ },
203
203
  encrypt: true,
204
+ ttl: 60, // MENU_MESSAGE_TTL_SECONDS
205
+ protected_headers: { client_name: 'Evol App' },
204
206
  });
205
207
  // 响应在 onMessage 里按 parsed.id 配对:
206
208
  // parsed.data.exitCode === 0 → JSON.parse(parsed.data.stdout).content
207
209
  // parsed.error → 透传层拒绝
208
210
  ```
211
+
212
+ - `payload` 传**对象**(不是 `JSON.stringify` 后的字符串);`message.send` 的协议层要求 payload 是 JSON 对象。
213
+ - `ttl: 60` 是 Menu 消息的固定约定(`src/aun/menu/transport.ts` 的 `MENU_MESSAGE_TTL_SECONDS`),缺失时不会被自动补上。
214
+ - `protected_headers` 承载客户端标识与鉴权方式,字段定义见 `menu-protocol.md §二`。