evolcore 0.0.3 → 0.0.4

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 (143) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +45 -10
  3. package/bin/ec-safe-output.js +89 -24
  4. package/dist/agents/baseagent.js +46 -0
  5. package/dist/agents/claude-runner.js +1 -31
  6. package/dist/agents/codex-app-server-client.js +68 -0
  7. package/dist/agents/codex-runner.js +157 -5
  8. package/dist/agents/runner-types.js +2 -2
  9. package/dist/aun/aid/agentmd.js +79 -0
  10. package/dist/aun/aid/encryption-seed-policy.js +29 -0
  11. package/dist/aun/aid/index.js +1 -1
  12. package/dist/aun/aid/store.js +2 -5
  13. package/dist/channels/aun.js +220 -112
  14. package/dist/channels/daemon.js +18 -4
  15. package/dist/channels/dingtalk.js +52 -137
  16. package/dist/channels/feishu.js +56 -4
  17. package/dist/channels/qqbot.js +23 -1
  18. package/dist/channels/wechat.js +303 -155
  19. package/dist/channels/wecom.js +383 -7
  20. package/dist/cli/aun-commands.js +11 -11
  21. package/dist/cli/handoff-command.js +2 -1
  22. package/dist/cli/init-channel.js +185 -67
  23. package/dist/cli/init.js +7 -5
  24. package/dist/cli/trigger-command.js +92 -11
  25. package/dist/config/access-policy-domain.js +38 -0
  26. package/dist/config/access-policy.js +134 -0
  27. package/dist/config/builtin-role-templates.js +27 -14
  28. package/dist/config/builtin-roles.js +25 -6
  29. package/dist/config/config-field-policy.js +17 -5
  30. package/dist/config/config-manager.js +198 -22
  31. package/dist/config/config-operation-service.js +35 -38
  32. package/dist/config/contact-bind-code.js +274 -0
  33. package/dist/config/contact-book-store.js +173 -5
  34. package/dist/config/contact-book.js +32 -0
  35. package/dist/config/contact-operation-service.js +9 -3
  36. package/dist/config/contact-request-service.js +331 -0
  37. package/dist/config/peer-role-resolver.js +3 -1
  38. package/dist/config/schema-registry.js +49 -24
  39. package/dist/config-store.js +14 -2
  40. package/dist/core/auth/agent-delegation.js +105 -11
  41. package/dist/core/auth/authorization-audit.js +6 -0
  42. package/dist/core/auth/operation-authorizer.js +8 -0
  43. package/dist/core/auth/operation-catalog.js +51 -3
  44. package/dist/core/auth/trigger-authorization.js +15 -0
  45. package/dist/core/bootstrap-service.js +2 -9
  46. package/dist/core/channel-loader.js +6 -2
  47. package/dist/core/command/command-handler.js +10 -13
  48. package/dist/core/command/connect-menu.js +249 -24
  49. package/dist/core/command/evol-menu-version-gate.js +38 -0
  50. package/dist/core/command/group-menu.js +421 -0
  51. package/dist/core/command/menu-handler.js +269 -85
  52. package/dist/core/command/menu-protocol.js +8 -2
  53. package/dist/core/command/menu-token-store.js +102 -0
  54. package/dist/core/command/slash-gate.js +1 -1
  55. package/dist/core/command/slash-handler.js +158 -31
  56. package/dist/core/daemon-file-cache.js +28 -0
  57. package/dist/core/event-catalog.js +29 -0
  58. package/dist/core/evolagent-registry.js +4 -39
  59. package/dist/core/handoff/runtime.js +162 -37
  60. package/dist/core/handoff/store.js +46 -2
  61. package/dist/core/handoff/types.js +1 -0
  62. package/dist/core/inference/text-inference.js +16 -74
  63. package/dist/core/message/file-markers.js +7 -0
  64. package/dist/core/message/im-renderer.js +18 -14
  65. package/dist/core/message/inbound-admission.js +124 -0
  66. package/dist/core/message/message-bridge.js +616 -74
  67. package/dist/core/message/message-log.js +1 -0
  68. package/dist/core/message/message-queue.js +185 -10
  69. package/dist/core/message/peer-mode.js +7 -8
  70. package/dist/core/message/response-engine.js +381 -79
  71. package/dist/core/permission/approval-gateway.js +17 -10
  72. package/dist/core/permission/ec-command-parser.js +101 -46
  73. package/dist/core/permission/tool-policy.js +69 -24
  74. package/dist/core/protected-paths.js +36 -11
  75. package/dist/core/session/session-manager.js +25 -3
  76. package/dist/core/session/session-mapper.js +2 -0
  77. package/dist/core/session/session-renew.js +125 -69
  78. package/dist/core/session/session-turn-coordinator.js +5 -1
  79. package/dist/eck/kit-renderer.js +12 -1
  80. package/dist/eck/message-renderer.js +79 -1
  81. package/dist/index.js +224 -89
  82. package/dist/ipc.js +81 -4
  83. package/dist/paths.js +3 -0
  84. package/dist/response-system/config-resolver.js +29 -0
  85. package/dist/response-system/coordinator.js +8 -32
  86. package/dist/response-system/engines/v1/proactive-flow.js +1 -1
  87. package/dist/response-system/index.js +1 -0
  88. package/dist/response-system/modes/single-session/index.js +7 -4
  89. package/dist/trigger/parser.js +55 -15
  90. package/dist/trigger/patch.js +4 -1
  91. package/dist/trigger/scheduler.js +441 -39
  92. package/dist/utils/error-dict.json +7 -0
  93. package/dist/utils/evolcore-version.js +21 -0
  94. package/dist/utils/logger.js +2 -2
  95. package/dist/utils/stable-semver.js +21 -0
  96. package/dist/utils/stats.js +33 -9
  97. package/kits/docs/channels/aun.md +4 -13
  98. package/kits/docs/evolcore/INDEX.md +1 -1
  99. package/kits/docs/evolcore/config.md +47 -2
  100. package/kits/docs/evolcore/contact.md +7 -3
  101. package/kits/docs/evolcore/group-rules.md +46 -4
  102. package/kits/docs/evolcore/group.md +4 -4
  103. package/kits/docs/evolcore/msg.md +5 -5
  104. package/kits/docs/evolcore/trigger.md +25 -8
  105. package/kits/docs/path-registry.md +36 -17
  106. package/kits/eck_message_manifest.json +12 -1
  107. package/kits/migrations/migrate-contact-book-v2.mjs +7 -0
  108. package/kits/rules/01-overview.md +17 -7
  109. package/kits/rules/02-navigation.md +38 -18
  110. package/kits/rules/03-identity.md +28 -24
  111. package/kits/rules/04-relation.md +44 -28
  112. package/kits/rules/05-venue.md +31 -15
  113. package/kits/rules/06-channel.md +11 -7
  114. package/kits/schemas/_meta.json +18 -7
  115. package/kits/schemas/agent-config.schema.7.json +303 -0
  116. package/kits/schemas/agent-config.schema.8.json +304 -0
  117. package/kits/schemas/agent-config.schema.9.json +374 -0
  118. package/kits/schemas/contact-book.schema.3.json +67 -0
  119. package/kits/schemas/daemon.schema.1.json +3 -2
  120. package/kits/schemas/daemon.schema.2.json +101 -0
  121. package/kits/schemas/daemon.schema.3.json +123 -0
  122. package/kits/schemas/defaults.schema.2.json +85 -0
  123. package/kits/schemas/defaults.schema.3.json +73 -0
  124. package/kits/schemas/relation-config.schema.6.json +46 -0
  125. package/kits/schemas/relation-config.schema.7.json +59 -0
  126. package/kits/schemas/single-session.schema.2.json +57 -0
  127. package/kits/templates/message-fragments/handoff-context-to-target.md +9 -0
  128. package/kits/templates/message-fragments/handoff-request-to-target.md +14 -8
  129. package/kits/templates/message-fragments/handoff-response-to-origin.md +5 -6
  130. package/kits/templates/roles/admin.json +46 -0
  131. package/kits/templates/roles/member.json +4 -0
  132. package/kits/templates/roles/visitor.json +4 -0
  133. package/kits/templates/system-fragments/channel.md +12 -2
  134. package/kits/templates/system-fragments/identity.md +3 -1
  135. package/kits/templates/system-fragments/relation.md +1 -1
  136. package/kits/templates/system-fragments/session.md +6 -2
  137. package/package.json +4 -2
  138. package/MIGRATION-0.5.0.md +0 -378
  139. package/ROLE_ACCESS_CONTROL.md +0 -174
  140. package/dist/channels/contact-bind-code.js +0 -134
  141. package/dist/channels/wecom-card.js +0 -101
  142. package/dist/channels/wecom-onboarding.js +0 -82
  143. package/dist/channels/wecom-state.js +0 -191
@@ -12,7 +12,10 @@ AUN(Agent Union Network)是 agent 间安全通信的网络协议,SDK 的 n
12
12
 
13
13
  ### AID
14
14
 
15
- AID(Agent Identifier)是主体在 AUN 网络中的唯一身份标识,格式为 `{name}.{issuer}`(如 `alice.aid.pub`)。任何拥有域名的组织都可以作为 Issuer 签发 AID——去中心化,无需中央权威。AID 同时也是通信地址:身份即入口。
15
+ AID(Agent Identifier)是主体在 AUN 网络中的唯一身份标识,格式为 `{name}.{issuer}`(如 `alice.agentid.pub`)。任何拥有域名的组织都可以作为 Issuer 签发 AID——去中心化,无需中央权威。AID 同时也是通信地址:身份即入口。
16
+
17
+ > 本机 evolcore 新建 AID 时的默认 issuer 是 `agentid.pub`(`src/aun/aid/control-aid.ts` 的
18
+ > `resolveControlIssuer()`,可用 `EVOLCORE_ISSUER` 覆盖)。文档里出现的 `xxx.aid.pub` 是旧例子。
16
19
 
17
20
  访问 `https://{aid}` 可获取该主体的个人主页。
18
21
 
@@ -114,7 +117,7 @@ ECK(EvolCore Context Kit)是 EvolCore 的上下文组装系统。你正在
114
117
 
115
118
  ### 上下文组装流程
116
119
 
117
- evolcore 收到每条消息时,由一份**声明式 manifest** 决定加载哪些上下文段——不是写死的分支。
120
+ evolcore 收到每条消息时,由**声明式 manifest** 决定加载哪些上下文段——不是写死的分支。
118
121
  每个 section 带 `when` 条件,evolcore 按当前会话构造一组运行时变量(`chatType`、`channel`、
119
122
  `selfAid`、`peerKey` 等)逐段求值,命中的才按顺序拼进 system prompt(`needsInjection` 的段还会先做模板渲染)。
120
123
 
@@ -123,15 +126,22 @@ evolcore 收到每条消息时,由一份**声明式 manifest** 决定加载哪
123
126
  | 场景 | 命中的层/段 |
124
127
  |------|------------|
125
128
  | coding(无渠道) | rules + 会话层 + baseagent(身份/关系/环境/渠道层因无 channel、无身份而落选) |
126
- | private(私聊) | rules + 身份层 + 关系层(对端)+ 环境层 + 渠道层 + 会话层 + baseagent |
127
- | group(群聊) | rules + 身份层 + 关系层(群)+ 环境层 + 渠道层 + 会话层 + baseagent |
129
+ | private(私聊) | rules + 身份层(含 preferences)+ 关系层(对端)+ 环境层 + 渠道层 + 会话层 + baseagent |
130
+ | group(群聊) | rules + 身份层(**无 preferences**)+ 关系层(群)+ 环境层 + 渠道层 + 会话层 + baseagent |
131
+ | bootstrapping | rules + bootstrap 引导 + 会话层 + baseagent |
128
132
 
129
133
  > 会话层(session fragment)是 `when:always`、baseagent 段只要注入了 base agent 信息就加载——
130
134
  > 二者与 chatType 无关,每个场景都在;所以 coding 并非"仅 rules"。
131
135
 
132
- manifest schema、when 条件、合并覆盖、模板渲染、运行时变量目录,以及**实际渲染结果的调试输出**
133
- (`$EVOLCORE_HOME/data/eck-debug/` 下的 vars / context / fragments / manifest 四个文件):
134
- 详见 `$KITS_DOCS/context-assembly.md`。
136
+ 三份 manifest 各管一段:`kits/eck_manifest.json`(system prompt 默认)、
137
+ `kits/eck_manifest.auxiliary.json`(备用,可由 `config.sessionManifests` 指定)、
138
+ `kits/eck_message_manifest.json`(逐条消息渲染)。
139
+
140
+ manifest schema、when 条件、合并覆盖、模板渲染、运行时变量目录详见 `$KITS_DOCS/context-assembly.md`。
141
+
142
+ **实际渲染结果的调试输出**默认**关闭**,要在进程级配置里打开 `debug.eckSnapshots: true` 才会写;
143
+ 开启后落 `$EVOLCORE_HOME/data/eck-debug/`,文件名带时间戳:`vars-<ts>.json`、`context-<ts>.md`、
144
+ `fragments-<ts>.md`、`manifest-<ts>.md`(逐条消息渲染另有 `msg-render-<ts>.md`),保留 24 小时。
135
145
 
136
146
  ## 术语
137
147
 
@@ -6,28 +6,38 @@
6
6
 
7
7
  | 路径 | 含义 |
8
8
  |------|------|
9
- | `$EVOLCORE_HOME` | 用户数据根(默认 `~/.evolcore`) |
10
- | `$PACKAGE_ROOT` | evolcore 包根目录 |
9
+ | `$EVOLCORE_HOME` | 用户数据根。解析顺序:`EVOLCORE_HOME` 环境变量 → cwd 下有 `agents/defaults.json` 则取 cwd → `~/.evolcore`(第二步意味着**包根和数据根可能是同一个目录**) |
10
+ | `$PACKAGE_ROOT` | evolcore 包根目录(由 `getPackageRoot()` 从 `import.meta` 推出) |
11
11
  | `$CURRENT_PROJECT` | 当前工作目录 |
12
12
 
13
13
  ### 派生路径
14
14
 
15
+ 以下是 ECK 真正认识的别名(`src/eck/manifest-engine.ts` 的 `buildPathMappings`):
16
+
15
17
  | 名称 | 派生自 | 含义 |
16
18
  |------|--------|------|
17
19
  | `$KITS` | `$PACKAGE_ROOT/kits` | ECK 知识包根 |
18
20
  | `$KITS_RULES` | `$KITS/rules` | 自动载入部分(本目录) |
19
21
  | `$KITS_DOCS` | `$KITS/docs` | 按需载入文档 |
20
22
  | `$KITS_TEMPLATES` | `$KITS/templates` | prompt 模板 |
21
- | `$KITS_FRAGMENTS` | `$KITS_TEMPLATES/system-fragments` | ECK 动态注入 fragment 模板 |
22
- | `$ECK` | `$EVOLCORE_HOME/eck` | 运行时配置 |
23
- | `$AGENTS_DIR` | `$EVOLCORE_HOME/agents` | per-agent 数据根 |
24
- | `$AGENT_DIR` | `$AGENTS_DIR/<self-aid>` | 当前 agent 根 |
25
- | `$SELF_DIR` | `$AGENT_DIR/personal` | 个人数据层(身份层) |
23
+ | `$KITS_FRAGMENTS` | `$KITS_TEMPLATES/system-fragments` | system prompt fragment 模板 |
24
+ | `$KITS_MESSAGE_FRAGMENTS` | `$KITS_TEMPLATES/message-fragments` | 逐条消息渲染的 fragment 模板 |
25
+ | `$PERSONAL_DIR` | `$AGENT_DIR/personal` | 个人数据层(身份层) |
26
26
  | `$RELATIONS_DIR` | `$AGENT_DIR/relations` | 关系层 |
27
- | `$VENUES_DIR` | `$AGENT_DIR/venues` | 环境层 |
28
- | `$AGENT_INDEX` | `$AGENT_DIR/index` | agent 级文档索引 |
27
+ | `$VENUES_DIR` | `$AGENT_DIR/venues` | 环境层(当前是死目录,见 `05-venue.md`) |
28
+ | `$AGENT_DIR` | `$EVOLCORE_HOME/agents/<selfAid>` | 当前 agent 根(`selfAid` 为空时这四个别名都不注册) |
29
+
30
+ > ⚠️ **只有上表这些别名能在 manifest 的 `path` 字段里用**。写成 `$SELF_DIR`(旧名)、
31
+ > `$PEER_DIR`、`$AGENTS_DIR`、`$AGENT_INDEX`、`$ECK` 会被判为未解析变量,**整段静默丢弃**。
29
32
 
30
- 会话级动态注入:`$PEER_DIR` 当前对端的关系目录。
33
+ 下面这些只是**文档里的书写约定**,不是 ECK 能解析的别名,引用时要么写全路径要么当散文读:
34
+
35
+ | 名称 | 实际位置 | 含义 |
36
+ |------|----------|------|
37
+ | `$ECK` | `$EVOLCORE_HOME/eck` | 运行时配置实例(见下文 Bootstrap 的告警) |
38
+ | `$AGENTS_DIR` | `$EVOLCORE_HOME/agents` | per-agent 数据根 |
39
+ | `$AGENT_INDEX` | `$AGENT_DIR/index` | agent 级文档索引 |
40
+ | `$PEER_DIR` | `$RELATIONS_DIR/<peerKey>` | 当前对端的关系目录 |
31
41
 
32
42
  ## 路径注册表机制
33
43
 
@@ -44,9 +54,12 @@
44
54
  ### 两类路径
45
55
 
46
56
  - **可直接派生**:从基础路径按固定规则算出(如 `$KITS = $PACKAGE_ROOT/kits`)
47
- - **不可直接派生**:需按寻找规则搜索,找到后写入实例文件。例如:
48
- - `$AUN_SDK`:寻找规则 `npm list -g @agentunion/fastaun --parseable`
49
- - `$AUN_PROTOCOL_DOCS`:`$AUN_SDK/docs/protocol`(AUN 协议详细文档)
57
+ - **不可直接派生**:需按寻找规则搜索。例如:
58
+ - `$AUN_SDK`:`node -e "console.log(require.resolve('@agentunion/fastaun/package.json'))"`
59
+ —— 本机是**本地依赖** `$PACKAGE_ROOT/node_modules/@agentunion/fastaun`,不是全局包,
60
+ `npm ls -g` 查不到
61
+ - `$AUN_PROTOCOL_DOCS`:`$AUN_SDK/_packed_docs/protocol`
62
+ —— 注意是 `_packed_docs/`,**该包没有 `docs/` 目录**
50
63
 
51
64
  ### 按需加载时机
52
65
 
@@ -69,8 +82,15 @@ agent 级索引范围:`$CURRENT_PROJECT` + `$AGENT_DIR`。
69
82
  ## Bootstrap(独立使用 ECK 时)
70
83
 
71
84
  无 evolcore 动态注入时,路径确定顺序:
72
- 1. `$EVOLCORE_HOME`:环境变量 → 默认 `~/.evolcore`
73
- 2. 读取 `$ECK/runtime.md` 获取基础路径和运行时参数
74
- 3. 按派生规则构造其余路径
75
-
76
- 参数加载优先级:evolcore 动态注入 > 环境变量 > `$ECK/runtime.md` > 硬编码默认值。
85
+ 1. `$EVOLCORE_HOME`:环境变量 → cwd 下有 `agents/defaults.json` 则取 cwd → `~/.evolcore`
86
+ 2. `$PACKAGE_ROOT`:evolcore 安装目录(dev 模式下可能与上一步同一个目录)
87
+ 3. 按上面的派生规则构造其余路径
88
+
89
+ > ⚠️ **不要指望 `$ECK/runtime.md` `$ECK/path-registry.md`**。这两个文件由
90
+ > `src/eck/init.ts` **写一次就不再更新**(`if (fs.existsSync(file)) return`),而且只渲染
91
+ > `EVOLCORE_HOME` / `PACKAGE_ROOT` 两个变量,其余 `{{...}}` 占位符会原样留在文件里;
92
+ > 源码中也**没有任何地方读回它们**。本机这两个文件仍是 evolclaw 时代生成的,
93
+ > 里面写着 `$EVOLCLAW_HOME | /home/evolclaw`。要真实路径就按上面 1-3 步自己算,
94
+ > 或直接读 `src/paths.ts`。
95
+
96
+ 参数加载优先级:evolcore 动态注入 > 环境变量 > 硬编码默认值。
@@ -1,34 +1,38 @@
1
1
  # 身份层:我是谁
2
2
 
3
- 身份层包含当前 agent 的一切自我认知。动态注入的 `$SELF_AID` `$SELF_NAME` 标识当前身份。
3
+ 身份层是当前 agent 的自我认知。ECK identity fragment 注入 `selfAid`(当前 AID),
4
+ 并把 `$EVOLCORE_HOME/AIDs/<aid>/agent.md` frontmatter 的 `name` 投影为 `selfName`。
5
+ `selfName` 仅用于展示,名片缺失或尚未拉取完成时可能为空;身份与授权判断必须使用 `selfAid`。
4
6
 
5
7
  ## 数据位置
6
8
 
7
9
  | 位置 | 内容 |
8
10
  |------|------|
9
- | `$SELF_DIR`(`$AGENT_DIR/personal/`) | 个人数据(可写) |
11
+ | `$PERSONAL_DIR`(`$AGENT_DIR/personal/`) | 个人数据(可写) |
10
12
  | `$KITS_DOCS/identity/` | 身份层详细规则(只读,按需加载) |
11
13
 
12
- ## 数据结构
14
+ > manifest 模板里只认 `$PERSONAL_DIR` / `$RELATIONS_DIR` / `$VENUES_DIR` / `$AGENT_DIR` 这几个路径别名。
15
+ > 写成 `$SELF_DIR` 会被判为未解析变量,**整段静默丢弃**。
13
16
 
14
- | 文件 | 用途 |
15
- |------|------|
16
- | `persona.md` | 人格(行为规范、心理独白、身份认知) |
17
- | `memory/episodic.jsonl` | 事件性记忆("我经历了什么") |
18
- | `memory/semantic.md` | 语义性记忆(习得的事实/规律) |
19
- | `memory/working.md` | 当前关注(短期,每会话加载) |
20
- | `style.md` | 表达风格(用词偏好、句式偏好) |
21
- | `preferences.json` | 工具/模型/操作偏好 |
22
- | `skills/` | 技能清单(`_index.json` + 每技能一文件) |
23
- | `goals.md` | 长期目标 |
24
- | `journal.jsonl` | 反思日志(关键决策、自我修订) |
25
-
26
- ## 行为规范加载
27
-
28
- ```
29
- evolcore 注入了当前 AID
30
- ├─ Read $SELF_DIR/persona.md,执行其中行为规范
31
- └─ 否(coding 模式)→ 使用默认行为
32
- ```
33
-
34
- 不同 AID 可以有不同人格——切换身份即切换行为。
17
+ ## 数据结构(以源码实际读写为准)
18
+
19
+ | 路径 | 用途 | 实际状态 |
20
+ |------|------|----------|
21
+ | `persona.md` | 人格(行为规范、身份认知) | evolcore 自动注入;无写入命令,带外手改 |
22
+ | `memory/working.md` | 当前关注(短期) | evolcore 自动注入 |
23
+ | `preferences/active-preferences.md` | 已确认的稳定用户偏好 | **仅私聊**注入;由用户态 trigger 维护 |
24
+ | `preferences/stats.json`、`preferences/preferences-conflicts.md` | 偏好计分状态与冲突记录 | trigger 私有,无 schema 保证 |
25
+ | `memory/`、`skills/` 目录 | 预留 | 会被创建,但目前无人读写 |
26
+
27
+ `memory/episodic.jsonl`、`memory/semantic.md`、`style.md`、`preferences.json`、`goals.md`、`journal.jsonl`
28
+ 是早期设计稿里的约定,**源码尚未实现读写**——不要假设写了就会生效。
29
+
30
+ ## 人格与行为规范怎么生效
31
+
32
+ - **注入条件**是 `chatType ≠ null` 且 `lifecycle ≠ bootstrapping`(即有渠道的会话),不是"有没有注入 AID"。本地 coding 模式不注入身份层。
33
+ - persona.md evolcore **自动前置**进 system prompt,你不需要主动 Read
34
+ - persona.md 缺失时**没有默认人格兜底**,只是这一段不出现;行为约束改由 `kits/rules/` + `roles/` 权限定义承担。
35
+ - 改完 persona.md 后 `ec agent reload` 生效(mtime 门控缓存)。
36
+ - `agents/<aid>/behavior.json` 是**已废弃**的旧配置(基座/模型/权限模式已并入 `config.json`),与人格无关。
37
+
38
+ 不同 AID 可以有不同 persona——切换身份即切换人格。
@@ -8,52 +8,68 @@
8
8
 
9
9
  > 为什么用 `peerId` 而非直接用 AID:非 AUN 渠道的对端(飞书群、微信)没有 AID,用 `<channel>#<peerId>` 才能统一覆盖所有渠道的对端。
10
10
 
11
+ relation fragment 注入的全部变量:`peerKey`、`peerId`、`peerName`、`peerRole`、`peerType`,
12
+ 群聊另有 `groupId`、`groupRulesStatus`、`groupRulesError`。`groupRulesStatus=ignored` 表示本轮由
13
+ 本地 `groupRules.mode=ignore` 主动跳过,不是远端缺失、无权限或同步失败。
14
+
11
15
  ## 数据位置
12
16
 
13
- | 位置 | 内容 |
14
- |------|------|
15
- | `$RELATIONS_DIR`(`$AGENT_DIR/relations/`) | 关系数据(可写) |
16
- | `$KITS_DOCS/relations/` | 关系层详细规则(只读,按需加载) |
17
+ 关系数据(可写)在 `$RELATIONS_DIR`(= `$AGENT_DIR/relations/`)。
17
18
 
18
- ## 数据结构
19
+ ## 数据结构(以源码实际读写为准)
19
20
 
20
21
  ```
21
22
  relations/
22
- ├── _index/ 名字反查索引
23
- │ └── name_<urlEncode(name)>.json { "name": "王老板", "channel": "feishu", "peerId": "ou_xxx", "peerKey": "feishu#ou_xxx" }
24
- ├── <channel>#<urlEncode(peerId)>/ 每个对端一个目录(统一命名,不区分 contacts/_observed)
25
- │ ├── profile.md 身份、关系评注、交互历史
26
- │ └── history.jsonl 关系演化事件流
27
- └── _trash/ merged/split 后的重定向占位
23
+ └── <channel>#<urlEncode(peerId)>/ 每个对端一个目录
24
+ ├── peer-identity.json 身份快照缓存(PeerIdentityCache 唯一的写入方)
25
+ ├── config.json 关系级配置——**对端角色 config.role 就存在这里**;群可覆盖 groupRules.mode
26
+ └── rules.md 仅群目录:校验通过后物化的群规则字节
28
27
  ```
29
28
 
29
+ 群规则加载策略按 Agent `config.json` → 当前群 relation `config.json` 覆盖,缺省为 `load`。当有效值为
30
+ `ignore` 时,本轮不访问远端规则、不读取本地 `rules.md`、不暴露 `groupRulesPath`;旧文件保留但不
31
+ 作为回退来源。该字段仅 owner/daemon owner 可修改,其他角色可读取当前 relation 的有效值。
32
+
30
33
  **例子**:
31
- - AUN 对端:`relations/aun#alice.aid.pub/`
34
+ - AUN 对端:`relations/aun#alice.agentid.pub/`
32
35
  - 飞书对端:`relations/feishu#ou_xxx/`
33
36
  - 微信对端:`relations/wechat#wxid_xxx/`
34
37
 
38
+ **下列条目只是设计稿,源码尚未实现——不要假设读了/写了会生效**:
39
+
40
+ | 条目 | 真实状态 |
41
+ |------|----------|
42
+ | `<peerKey>/profile.md` | manifest 声明了加载槽(`peer-profile`、`relation-group-profile`,缺失即跳过),但**没有任何代码写它**,磁盘上零文件。你可以手写一份,它会被加载 |
43
+ | `_index/name_<name>.json` 名字反查索引 | 目录会被创建,但**无任何读写代码**,磁盘上全是空目录。"已知 name 反查 peerKey" 这条路走不通 |
44
+ | `<peerKey>/history.jsonl` | 关系层无此实现(同名文件都属于 handoff / trigger / CC 自己的历史) |
45
+ | `_trash/` | 只创建目录,没有 merge/split 重定向逻辑 |
46
+ | `relations/contacts/`、`relations/_observed/` | 目录骨架仍在创建这两个旧结构(`ensureAgentDirSkeleton`),但已不再使用,都是空的 |
47
+ | `<peerKey>/behavior.json` | 旧配置残留,已并入 `config.json` |
48
+
35
49
  ## 查找逻辑
36
50
 
37
- | 场景 | 路径 |
38
- |------|------|
39
- | 已知 channel + peerId | 直接拼路径 `relations/<channel>#<urlEncode(peerId)>/` |
40
- | 已知 name(如"给王老板发消息") | 读 `_index/name_<urlEncode(name)>.json` 拿到 peerKey,再拼路径 |
51
+ 已知 channel + peerId → 直接拼 `relations/<channel>#<urlEncode(peerId)>/`。这是**唯一可用的查找路径**;
52
+ 只知道名字("给王老板发消息")时没有索引可查,用 `ec aid`/联系人命令或直接问用户。
41
53
 
42
54
  ## 对端身份与权限
43
55
 
44
- | 身份 | 权限 |
45
- |------|------|
46
- | owner | agent 级最高关系权限,可执行 agent 管理和 owner 审批 |
47
- | admin | agent 管理权限,不能修改 owner,危险操作向 owner 申请审批 |
48
- | member | 任务型普通成员,默认使用 `auto` |
49
- | visitor | 特选只读角色,默认使用 `readonly` |
50
- | 自定义角色 | 按 agent 配置定义,未指定模式时默认按 `auto` |
51
- | none | 无有效关系角色,拒绝访问 |
56
+ 四个内置角色(rank 从高到低)+ 自定义角色 + `none`:
52
57
 
53
- 进程级 daemon owner 是最高管理者;通过 agent channel 访问时,按设计映射为该 agent `owner` 关系角色。
58
+ | 身份 | rank | 默认 permissionMode | 权限 |
59
+ |------|------|--------------------|------|
60
+ | owner | 900 | `bypass` | agent 级最高关系权限,可执行 agent 管理和 owner 审批 |
61
+ | admin | 700 | `request` | agent 管理权限,不能修改 owner,危险操作向 owner 申请审批 |
62
+ | member | 300 | `auto` | 任务型普通成员 |
63
+ | visitor | 100 | `readonly` | 只读角色,且是**强制保留角色**(兜底用) |
64
+ | 自定义角色 | 按配置 | 缺失/非法时安全兜底 **`readonly`** | 按 agent 角色模板定义 |
65
+ | none | — | — | 无有效关系角色,拒绝访问 |
54
66
 
55
- 兜底:无 token coding 模式;token 残缺或角色无效 → `none`,拒绝访问。
67
+ 角色实际存储在 `relations/<peerKey>/config.json` `role` 字段。
68
+ 进程级 daemon owner 是最高管理者;命中时在 auth 层直接提升为 `owner`(不经过角色解析器,
69
+ 后者的 owner 只来自 agent 级 `config.owners`)。
56
70
 
57
- ## 详细规则
71
+ **兜底链**:无匹配角色 → 回落内置 `visitor`(即 `readonly`);只有角色注册表本身缺失、
72
+ 或 `visitor` 未注册时才落到 `none` 拒绝访问。所以正常配置下几乎总是降权到只读,而不是拒绝。
58
73
 
59
- 关系层的详细规则(直接交互判定、merge/split、profile.md 完整格式):Read `$KITS_DOCS/relations/` 中的相关文档。
74
+ > permissionMode 的合法取值只有 `readonly` / `auto` / `request` / `bypass` 四个。
75
+ > "coding" 是**场景**名(无渠道的本地会话,见 `05-venue.md`),**不是** permissionMode。
@@ -1,36 +1,47 @@
1
1
  # 环境层:当前对话场景
2
2
 
3
- 环境层决定当前会话加载哪些信息。动态注入的 `chatType` 标识当前聊天类型(private/group/null),`venueUid` 是场所唯一标识(预留)。
3
+ 环境层决定当前会话加载哪些信息。ECK venue fragment 注入的环境层变量:
4
+
5
+ | 变量 | 取值 | 说明 |
6
+ |------|------|------|
7
+ | `chatType` | `private` / `group` / null | null = 无渠道的本地 coding 会话 |
8
+ | `mentionMode` | `mention-only` / `disabled` | 群内响应策略;取 agent/relation 配置,缺省时由服务器 `dispatchMode` 翻译(mention→mention-only,broadcast→disabled) |
9
+ | `clientType` | `desktop` / `web` / `mobile` | 有值时额外加载客户端场景文档 |
10
+ | `permissionMode` | readonly/auto/request/bypass | 当前生效权限模式 |
11
+ | `venueUid` | 恒为 undefined | 声明了但源码固定不填,模板有 `{{?}}` 守卫所以永不渲染——**不要依赖它** |
4
12
 
5
13
  ## 场景判定
6
14
 
7
- | 场景 | 条件 | 加载的层 | 你的行为 |
15
+ 命中哪些段由 `kits/eck_manifest.json` `when` 条件决定,不是写死的分支:
16
+
17
+ | 场景 | 条件 | 加载的段 | 你的行为 |
8
18
  |------|------|----------|----------|
9
- | coding | channel(无 token) | rules | 本地模式,每条消息都响应 |
10
- | private | 单聊 | rules + 身份层 + 关系层(对端)+ 环境层 + 渠道层 | 自主模式,通过 CLI 回复 |
11
- | group | 群聊 | rules + 身份层 + 关系层(群)+ 环境层 + 渠道层 | 自主模式,mentionMode 决定响应策略 |
19
+ | coding | `chatType = null`(无渠道) | rules + 会话层 + baseagent | 本地模式,每条消息都响应 |
20
+ | private | `chatType = private` | 上述 + 身份层(含 persona/working-memory/**preferences**)+ 关系层(对端 profile)+ 环境层 + 渠道层 + commands | 自主模式,回复方式随 `chatMode` |
21
+ | group | `chatType = group` | private,但**无 preferences**;`groupId` 有值加群 profile,`groupRulesPath` 有值加群规则 | 自主模式,`mentionMode` 决定是否响应 |
22
+ | bootstrapping | `lifecycle = bootstrapping` | rules + bootstrap 引导 + 会话层 + baseagent(身份/关系/环境层全部落选) | 初始化引导 |
23
+
24
+ > coding 场景**不是"仅 rules"**:`session` 段 `when:always`、`baseagent` 段只要注入了 base agent 就加载。
12
25
 
13
26
  ## 数据位置
14
27
 
15
28
  | 位置 | 内容 |
16
29
  |------|------|
17
- | `$VENUES_DIR`(`$AGENT_DIR/venues/`) | 环境数据(可写,预留) |
18
- | `$KITS_DOCS/venues/` | 环境层详细规则(只读,按需加载) |
30
+ | `$KITS_DOCS/venues/` | 环境层场景文档(只读,按需加载):`private.md` `group.md` `<channel>-<chatType>.md` `client-*.md` |
31
+ | `$VENUES_DIR`(`$AGENT_DIR/venues/`) | **目前是死目录**:会被创建(含 `_index/` `_trash/`),但源码里 `agentVenuesDir()` 零调用点,无人读写 |
32
+
33
+ > `venues/` 下若有 `aun#<group-aid>` 之类的实例目录,是已删除模块 `group-venue-sync.ts` 的历史残留,
34
+ > 不再有效——群规则现在走关系层(见下文)。
19
35
 
20
36
  > **重要**:环境层承载比"单个群/私聊实例"更高的抽象(如组织、类型级共性),**不为具体群/私聊实例建目录**。
21
37
  > 具体群实例的数据(如群规则 `rules.md`、群 profile)落**关系层** `$RELATIONS_DIR/<peerKey>/`。
22
38
 
23
39
  ## Venue 类型抽象
24
40
 
25
- 环境层关注的是**类型**,而非具体实例:
41
+ 环境层关注的是**类型**,而非具体实例。类型只有 `private` 和 `group` 两种(即 `chatType` 的两个非空取值)——
42
+ 没有 `broadcast` 这个 venue 类型,`broadcast` 是**群分发模式** `dispatchMode` 的取值之一(另一个是 `mention`)。
26
43
 
27
- | 类型 | 含义 |
28
- |------|------|
29
- | private | 一对一私聊(类型抽象) |
30
- | group | 群聊(类型抽象) |
31
- | broadcast | 广播频道(类型抽象) |
32
-
33
- `chatType`(private/group/coding)是类型级参数,属于环境层范畴。但"张三所在的 team-alpha 这个**具体群**"是关系层的对端实例,其数据落 `relations/<peerKey>/`。
44
+ "张三所在的 team-alpha 这个**具体群**"不属于环境层,它是关系层的对端实例,数据落 `relations/<peerKey>/`。
34
45
 
35
46
  ## 群规则(关系层数据)
36
47
 
@@ -42,3 +53,8 @@ AUN 群规则文件固定来自 `<group-aid>:/rules.md`。EvolCore 先读取 sig
42
53
 
43
54
  其它群资源不预先注入,需要时用 `ec fs ls/find/stat/cat <group-aid>:/...` 查询。
44
55
  不要把本地残留的 `rules.md` 当作权威源;只有本轮校验通过并暴露 `groupRulesPath` 时才使用。
56
+
57
+ 本地有效配置 `groupRules.mode` 决定是否进入上述流程:relation 值覆盖 Agent 值,缺省为 `load`。
58
+ `ignore` 时返回 `groupRulesStatus=ignored`,且不访问远端规则、不读取本地物化文件、不设置
59
+ `groupRulesPath`,因此不会注入正文。切换配置不会自动清空或新建 base agent 会话;配置提交后开始
60
+ 处理的新 turn 使用新策略。
@@ -1,15 +1,17 @@
1
1
  # 渠道层:我通过什么通信
2
2
 
3
- 渠道层决定你使用什么方式收发消息。动态注入的 `$CHANNEL_TYPE` 标识当前渠道。
3
+ 渠道层决定你使用什么方式收发消息。ECK 在 channel fragment 注入 `channel`
4
+ (取值 `aun|feishu|wechat|dingtalk|qqbot|wecom`)。变量名就是小写 `channel`,没有 `$CHANNEL_TYPE`。
4
5
 
5
6
  ## 数据位置
6
7
 
7
8
  | 位置 | 内容 |
8
9
  |------|------|
9
10
  | `$KITS_DOCS/channels/` | 各渠道的**知识文档**:配置、参数、特有机制(只读,按需加载) |
10
- | `$AGENT_DIR/channels/` | 各渠道的运行时数据(可写) |
11
+ | `$AGENT_DIR/config.json` 的 `channels[]` | agent 接入的渠道实配置(类型、凭据、网关等) |
11
12
 
12
- > 运行时"当前渠道怎么发消息"由动态注入的 `[channel]` 段决定(见下方通信规则);
13
+ > **没有 `$AGENT_DIR/channels/` 目录**——渠道不按目录分家:配置在 `config.json`
14
+ > `channels[]` 列表里,运行时状态落会话层 `$AGENT_DIR/sessions/`。
13
15
  > `$KITS_DOCS/channels/` 是**不依赖当前渠道**的知识库,任意会话都可按需 Read 任意渠道文档。
14
16
 
15
17
  ## 通信规则
@@ -26,8 +28,10 @@
26
28
 
27
29
  ### 命令返回值
28
30
 
29
- - 成功:`ok` 或包含 `✓ 已发送 ...` 的输出(exit 0)
30
- - 失败:`✗ ...` 错误信息(exit 非零)
31
+ 判断成败**看 exit code**,别靠字符串前缀——各命令集格式不统一:
32
+
33
+ - `ec ctl send`:成功打印 `ok`;失败把**裸错误信息**打到 stderr(如 `消息内容不能为空`、`adapter 未找到: feishu`),exit≠0
34
+ - `ec msg` / `ec group` 发送类:成功 `✓ 已发送 message_id=… seq=…`;失败 `❌ 发送失败: <原因>`,exit≠0
31
35
 
32
36
  发送成功后**继续后续处理**。一次任务可能发 0 到多条消息不要因为看到"已发送"就反复发送同一条消息。
33
37
 
@@ -44,8 +48,8 @@
44
48
  共同约定:
45
49
  - 以自己的 AID 为发送者
46
50
  - 回复方式随 `chatMode` 走(见上方通信规则);附加能力(文件/@/加密/发第三方)任何模式下都用 CLI
47
- - `--format json` 所有命令通用
48
- - `--app <name>` 指定应用 slot
51
+ - `--format json` / `--app <name>` **不是全局参数**:只在自身 `--help` 明确列出的命令上有效
52
+ (`--app` 主要用于消息 pull/ack、消费类 RPC 和支持 app slot 的文件操作)。拿不准就先跑 `--help`
49
53
 
50
54
  ## 各渠道知识文档(按需加载)
51
55
 
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "schemas": {
3
- "daemon": { "currentVersion": 1 },
4
- "defaults": { "currentVersion": 1 },
5
- "agent-config": { "currentVersion": 6 },
6
- "relation-config": { "currentVersion": 5 },
7
- "contact-book": { "currentVersion": 2 },
8
- "single-session": { "currentVersion": 1 },
3
+ "daemon": { "currentVersion": 3 },
4
+ "defaults": { "currentVersion": 3 },
5
+ "agent-config": { "currentVersion": 9 },
6
+ "relation-config": { "currentVersion": 7 },
7
+ "contact-book": { "currentVersion": 3 },
8
+ "single-session": { "currentVersion": 2 },
9
9
  "role-registry": { "currentVersion": 1 },
10
10
  "role-config": { "currentVersion": 1 }
11
11
  },
12
12
  "history": [
13
13
  { "schema": "daemon", "version": 1, "date": "2026-06-14", "description": "initial: process config (daemon.json)" },
14
+ { "schema": "daemon", "version": 2, "date": "2026-07-28", "description": "add AUN Menu minimum Evol client version" },
14
15
  { "schema": "defaults", "version": 1, "date": "2026-06-14", "description": "global defaults (models.allowed/projects/aun)" },
15
16
  { "schema": "agent-config", "version": 1, "date": "2026-06-14", "description": "initial: agent config with all parameters unified in config.json" },
16
17
  { "schema": "agent-config", "version": 2, "date": "2026-06-23", "description": "add lifecycle state for bootstrap flow; initialized retained for compatibility" },
@@ -27,6 +28,16 @@
27
28
  { "schema": "role-config", "version": 1, "date": "2026-07-22", "description": "standalone role policy definition" },
28
29
  { "schema": "agent-config", "version": 6, "date": "2026-07-23", "description": "move admin identities into AUN private relation role and reject admins[]" },
29
30
  { "schema": "contact-book", "version": 2, "date": "2026-07-24", "description": "AID display names, full-channelKey aliases, and extensible contact status" },
30
- { "schema": "relation-config", "version": 5, "date": "2026-07-23", "description": "restore authoritative private/group relation role; allow admin and forbid owner" }
31
+ { "schema": "relation-config", "version": 5, "date": "2026-07-23", "description": "restore authoritative private/group relation role; allow admin and forbid owner" },
32
+ { "schema": "defaults", "version": 2, "date": "2026-07-27", "description": "remove Session Renew effort and add globally defaultable response-mode parameters" },
33
+ { "schema": "agent-config", "version": 7, "date": "2026-07-27", "description": "remove Session Renew effort; auxiliary inference is response-mode owned" },
34
+ { "schema": "relation-config", "version": 6, "date": "2026-07-27", "description": "remove relation Session Renew effort; auxiliary inference is response-mode owned" },
35
+ { "schema": "single-session", "version": 2, "date": "2026-07-27", "description": "add optional baseagent-aware auxiliaryModel and auxiliaryEffort without factory defaults" },
36
+ { "schema": "daemon", "version": 3, "date": "2026-07-29", "description": "make daemon.json the exclusive source for all process debug settings" },
37
+ { "schema": "defaults", "version": 3, "date": "2026-07-29", "description": "remove debug from the Agent configuration inheritance chain" },
38
+ { "schema": "agent-config", "version": 8, "date": "2026-07-29", "description": "reject Agent-level debug because debug is process-owned" },
39
+ { "schema": "agent-config", "version": 9, "date": "2026-07-29", "description": "add owner-controlled AUN group rules loading and Agent message access policy" },
40
+ { "schema": "relation-config", "version": 7, "date": "2026-07-29", "description": "add per-group override for the AUN group rules loading policy" },
41
+ { "schema": "contact-book", "version": 3, "date": "2026-07-29", "description": "add versioned contact requests and declined status" }
31
42
  ]
32
43
  }