evolcore 0.0.33 → 0.0.34

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 (129) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/bin/ec.js +3 -2
  3. package/bin/install-codex-managed-hooks.mjs +12 -1
  4. package/dist/agents/baseagent-availability.js +20 -36
  5. package/dist/agents/claude-runner.js +82 -13
  6. package/dist/agents/codex/diagnostics.js +37 -11
  7. package/dist/agents/codex-runner.js +218 -44
  8. package/dist/agents/ecagent-runner.js +73 -20
  9. package/dist/agents/runner-types.js +5 -6
  10. package/dist/aun/aid/identity.js +1 -1
  11. package/dist/channels/aun.js +16 -6
  12. package/dist/channels/daemon.js +6 -3
  13. package/dist/cli/aun-commands.js +3 -2
  14. package/dist/cli/ctl-command.js +3 -1
  15. package/dist/cli/daemon-commands.js +120 -19
  16. package/dist/cli/fs-command.js +2 -1
  17. package/dist/cli/index.js +20 -6
  18. package/dist/cli/integrity-command.js +196 -0
  19. package/dist/cli/memory-command.js +158 -145
  20. package/dist/cli/thread-command.js +5 -3
  21. package/dist/cli/trigger-command.js +6 -1
  22. package/dist/config/config-field-policy.js +4 -0
  23. package/dist/config/config-manager.js +19 -0
  24. package/dist/config/contact-book-store.js +5 -0
  25. package/dist/config/role-service.js +13 -0
  26. package/dist/config/runtime-env.js +16 -0
  27. package/dist/config-store.js +30 -0
  28. package/dist/core/audit/log-integrity.js +3 -1
  29. package/dist/core/auth/agent-delegation.js +108 -35
  30. package/dist/core/auth/delegation-diagnostics.js +414 -0
  31. package/dist/core/auth/operation-authorizer.js +1 -1
  32. package/dist/core/auth/operation-catalog.js +16 -0
  33. package/dist/core/command/agent-control.js +18 -26
  34. package/dist/core/command/command-handler.js +138 -4
  35. package/dist/core/command/daemon-diagnostics.js +1 -0
  36. package/dist/core/command/menu-catalog.js +3 -0
  37. package/dist/core/command/menu-handler.js +22 -7
  38. package/dist/core/command/menu-protocol.js +1 -0
  39. package/dist/core/command/slash-handler.js +2 -0
  40. package/dist/core/daemon-bootstrap.js +4 -7
  41. package/dist/core/file-integrity/read.js +61 -0
  42. package/dist/core/file-integrity/store.js +262 -0
  43. package/dist/core/ipc-registration.js +36 -1
  44. package/dist/core/memory/batch-meta.js +132 -0
  45. package/dist/core/memory/consolidation-context.js +35 -14
  46. package/dist/core/memory/consolidation-ops-records.js +14 -16
  47. package/dist/core/memory/consolidation.js +91 -26
  48. package/dist/core/memory/index-manager.js +19 -28
  49. package/dist/core/memory/memory-admin.js +19 -14
  50. package/dist/core/memory/memory-document.js +53 -9
  51. package/dist/core/memory/memory-writer.js +30 -15
  52. package/dist/core/message/im-renderer.js +20 -4
  53. package/dist/core/message/message-bridge.js +2 -1
  54. package/dist/core/message/response-engine.js +584 -47
  55. package/dist/core/permission/ec-command-parser.js +93 -4
  56. package/dist/core/permission/protected-paths.js +5 -1
  57. package/dist/core/permission/readonly-shell-query.js +43 -5
  58. package/dist/core/permission/session-path-grants.js +334 -0
  59. package/dist/core/permission/tool-canonical.js +226 -0
  60. package/dist/core/permission/tool-policy.js +30 -62
  61. package/dist/core/role/runtime-policy.js +21 -10
  62. package/dist/core/session/session-fs-store.js +123 -8
  63. package/dist/core/session/session-manager.js +75 -5
  64. package/dist/core/skill/index-generator.js +17 -3
  65. package/dist/core/system-session/grants.js +40 -0
  66. package/dist/core/system-session/memory.js +222 -0
  67. package/dist/core/system-session/registry.js +74 -0
  68. package/dist/core/system-session/types.js +14 -0
  69. package/dist/core/thread/thread-service.js +13 -20
  70. package/dist/eck/kit-renderer.js +7 -2
  71. package/dist/eck/manifest-engine.js +24 -4
  72. package/dist/index.js +11 -2
  73. package/dist/ipc.js +51 -40
  74. package/dist/paths.js +70 -0
  75. package/dist/stats/billing.js +20 -8
  76. package/dist/trigger/feedback.js +6 -1
  77. package/dist/trigger/parser.js +8 -1
  78. package/dist/trigger/system-definitions.js +3 -3
  79. package/dist/utils/cross-platform.js +11 -2
  80. package/dist/utils/error-dict.json +18 -4
  81. package/dist/utils/error-utils.js +121 -0
  82. package/dist/utils/instance-registry.js +13 -8
  83. package/dist/utils/log-writer.js +12 -0
  84. package/dist/utils/process-introspect.js +11 -0
  85. package/kits/docs/context-assembly.md +0 -1
  86. package/kits/docs/evolcore/agent-create.md +5 -4
  87. package/kits/docs/evolcore/agent.md +2 -2
  88. package/kits/docs/evolcore/config.md +2 -2
  89. package/kits/docs/evolcore/ctl.md +2 -2
  90. package/kits/docs/evolcore/ec-capabilities.md +1 -1
  91. package/kits/docs/evolcore/fs-architecture.md +4 -5
  92. package/kits/docs/evolcore/fs.md +1 -1
  93. package/kits/docs/evolcore/group-collaboration.md +2 -2
  94. package/kits/docs/evolcore/group.md +10 -10
  95. package/kits/docs/evolcore/memory-architecture.md +4 -5
  96. package/kits/docs/evolcore/memory-consolidation.md +18 -14
  97. package/kits/docs/evolcore/memory-tags.md +3 -1
  98. package/kits/docs/evolcore/memory.md +24 -12
  99. package/kits/docs/evolcore/model.md +16 -0
  100. package/kits/docs/evolcore/msg.md +7 -7
  101. package/kits/docs/evolcore/thread-chain.md +5 -5
  102. package/kits/docs/prompt-loading-architecture.md +0 -1
  103. package/kits/eck_manifest.json +0 -20
  104. package/kits/eck_manifest.memory.json +0 -12
  105. package/kits/rules/01-overview.md +11 -0
  106. package/kits/rules/03-identity.md +6 -3
  107. package/kits/rules/06-channel.md +1 -1
  108. package/kits/rules/07-memory-and-thread.md +12 -15
  109. package/kits/schemas/_meta.json +7 -1
  110. package/kits/schemas/agent-config.schema.13.json +1 -1
  111. package/kits/schemas/daemon.schema.7.json +140 -0
  112. package/kits/skills/ec-group/SKILL.md +4 -4
  113. package/kits/skills/ec-skill/scripts/cli.mjs +1 -1
  114. package/kits/skills/ec-skill/scripts/skill.mjs +1 -1
  115. package/kits/templates/memory-consolidation/forget.md +2 -2
  116. package/kits/templates/memory-consolidation/generalize.md +4 -4
  117. package/kits/templates/memory-consolidation/notes.md +11 -11
  118. package/kits/templates/memory-consolidation/profile.md +3 -3
  119. package/kits/templates/memory-consolidation/promote.md +3 -3
  120. package/kits/templates/memory-consolidation/workflow.md +6 -6
  121. package/kits/templates/message-fragments/handoff-request-to-target.md +1 -1
  122. package/kits/templates/system-fragments/bootstrap.md +4 -3
  123. package/kits/templates/system-fragments/channel.md +2 -2
  124. package/kits/templates/system-fragments/memory.md +16 -9
  125. package/kits/templates/system-fragments/reply.md +6 -6
  126. package/kits/templates/system-fragments/session.md +1 -1
  127. package/package.json +4 -3
  128. package/dist/core/memory/memory-session-policy.js +0 -41
  129. package/dist/core/memory/memory-signature.js +0 -257
@@ -9,40 +9,40 @@
9
9
  - 仅在 evolcore 托管会话中可用(通过 daemon IPC 执行,依赖 `EVOLCORE_SESSION_ID`)。
10
10
  - `note` 写入当前关系,**必须有对端**(peerKey);没有对端的会话不要调用。
11
11
  - `memory.enableRelation=false` 时整个命令族被拒绝。
12
- - **不要用 Write / Edit 直接写记忆文件,也不要用 baseagent 的原生记忆工具**:绕过签名和索引,整理会话不感知。
12
+ - **不要用 Write / Edit 直接写记忆文件,也不要用 baseagent 的原生记忆工具**:绕过完整性台账和索引,会被当作带外修改恢复掉,整理会话也不感知。
13
13
  - `create` / `update` / `archive` 只在整理会话(`sessionType=memory`)里可用,主会话调用会被拒绝。
14
14
 
15
15
  ## note 写入
16
16
 
17
17
  ```bash
18
- ec memory note --slug <slug> [--tags <tag1,tag2,...>] [--speakers <id1,id2,...>] "<正文>"
18
+ ec memory note --slug <slug> [--tags '<tag1>,<tag2>'] [--speakers '<id1>,<id2>'] '<正文>'
19
19
  ```
20
20
 
21
21
  | 参数 | 说明 |
22
22
  |------|------|
23
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 下。私聊场景无需填写。 |
24
+ | `--tags` | 可选。写法固定为 `--tags 'tag1,tag2'`:单引号包住,逗号分隔。取值见 `$KITS_DOCS/evolcore/memory-tags.md` |
25
+ | `--speakers` | 可选,**群聊专用**。写法固定为 `--speakers '<aid1>,<aid2>'`:单引号包住,逗号分隔。填本条 note 涉及的发言人 AID 或渠道原生 ID。整理会话会据此把发言人相关信息分流写入各发言人自己的 relation 记忆,而不是只落在群的 relation 下。私聊场景无需填写。 |
26
26
  | 正文 | 必填。写清事实本身即可,不用组织成索引描述 |
27
27
 
28
28
  ```bash
29
- ec memory note --slug commit-chinese --tags "rule,long-term" \
30
- "对端要求:commit message 必须用中文,并列出所有功能改动点。"
29
+ ec memory note --slug commit-chinese --tags 'rule,long-term' \
30
+ '对端要求:commit message 必须用中文,并列出所有功能改动点。'
31
31
  ```
32
32
 
33
- note 是原料:不进索引、不签名,由整理会话读取后决定留下什么。
33
+ note 是原料:不进索引、不进台账,由整理会话读取后决定留下什么。
34
34
 
35
35
  ## note 修改
36
36
 
37
37
  ```bash
38
- ec memory note update <slug> [--slug <新slug>] [--tags <...>] ["<新正文>"]
38
+ ec memory note update <slug> [--slug <新slug>] [--tags 'tag1,tag2'] ['<新正文>']
39
39
  ```
40
40
 
41
41
  不传的字段保持不变;至少提供一项。判据:**还是在说同一件事 → update;不是 → 新建。**
42
42
 
43
43
  ```bash
44
- ec memory note update commit-chinese --tags "rule,long-term" \
45
- "commit 消息必须用中文;代码注释可以是英文"
44
+ ec memory note update commit-chinese --tags 'rule,long-term' \
45
+ 'commit 消息必须用中文;代码注释可以是英文'
46
46
  ```
47
47
 
48
48
  ## note 撤销
@@ -87,19 +87,31 @@ context: C:\...\consolidation-batches\20261005T103000-toleiliang4.agentid
87
87
 
88
88
  反馈规则:手动、上下文压缩、renew、`/new` 四种触发路径都会把整理结果反馈回**发起时的会话和话题**(用发起时抓取的 channelId / peerId / threadId 直接投递,不依赖会话 ID 是否变化)。只有定时触发不发反馈——结果只记录在整理批次目录的 `ops.jsonl` 里,供事后审计。
89
89
 
90
- 反馈内容优先取整理会话调用 `ec memory feedback` 写入的文本;未调用时回退到默认模板(模式、触发方式、耗时、新建/更新/归档条数等统计)。
90
+ 反馈内容取整理会话写入任务书指定反馈文件(`<batchDir>/scratch/feedback.txt`)的文本;未写入时回退到默认模板(模式、触发方式、耗时、新建/更新/归档条数等统计)。
91
91
 
92
92
  没有 `--scope`,作用域由模式唯一决定。
93
93
 
94
+ ## JSON 输出
95
+
96
+ 所有子命令都支持在末尾加 `--format json`,取值只能是 `json`。
97
+
98
+ ```bash
99
+ ec memory note list --format json
100
+ ```
101
+
102
+ 成功时 stdout 输出 daemon 返回的结果对象,如 `{ "ok": true, "filePath": "..." }`、`{ "ok": true, "notes": [...] }`;
103
+ 失败时 stdout 输出 `{ "ok": false, "code": "...", "error": "..." }` 并以退出码 1 结束,参数错误另带 `usage` 字段。
104
+
94
105
  ## 常见报错
95
106
 
96
107
  | 报错 | 原因与处理 |
97
108
  |------|-----------|
98
- | `必须提供 --slug` | 写入漏了 `--slug`,补上:`ec memory note --slug <slug> "<正文>"` |
109
+ | `必须提供 --slug` | 写入漏了 `--slug`,补上:`ec memory note --slug <slug> '<正文>'` |
99
110
  | `必须提供记忆内容(content)` | 正文缺失或被 shell 吞掉,正文整体加引号 |
100
111
  | `SLUG_EXISTS: 该 slug 已存在同名 note: <路径>` | 撞名。补充同一件事 → `note update <slug>`;确实是新事 → 换 slug |
101
112
  | `至少提供一项要改的内容` | `note update` 只给了 slug,补 `--slug` / `--tags` / 正文之一 |
102
113
  | `未知参数: --xxx` | 参数拼错,未识别的参数一律报错 |
114
+ | `--format 仅支持 json: <值>` | `--format` 后只能跟 `json` |
103
115
  | `--scope 已废弃` | 改用 `--mode` |
104
116
  | `<op> 只能由整理会话(sessionType=memory)调用` | 主会话调用了 `create` / `update` / `archive`,改用 `ec memory note` |
105
117
 
@@ -49,3 +49,19 @@ ec model check [--self <aid>]
49
49
  - 本地终端直接运行时不伪造远端角色。显式传入 `--role` 可检查该角色的模型可见性和有效模型。
50
50
  - `use`、`effort`、`reset` 不直接修改角色策略;传入 role 写作用域会返回 `ROLE_POLICY_MANAGED`。
51
51
  - `check` 会连接已配置的模型网关并发送最小探测请求;未配置自定义网关时跳过 API 探测。
52
+
53
+ ## 模型参数与执行窗口
54
+
55
+ 公共统计层通过 `resolveModelSpec()` 读取 `model-prices.jsonl`,但统计参数不等于底层执行器配置。
56
+
57
+ | Base agent | 执行与统计的处理方式 |
58
+ |------------|--------------------|
59
+ | Claude Code | 由参数表解析窗口,设置 SDK 自动压缩阈值;查询与手动压缩使用同一解析路径 |
60
+ | ecagent | 由参数表设置模型对象的 `contextWindow` 和输出上限 `maxTokens`;查询、手动压缩和上下文统计共用参数 |
61
+ | Codex | 优先使用 app-server 实时窗口;缺窗口时仅用参数表补齐统计,不修改 Codex 的执行窗口或压缩配置 |
62
+ | Gemini | 执行窗口和压缩仍交给 Gemini CLI 管理,不从参数表注入执行参数 |
63
+
64
+ Claude Code 和 ecagent 的窗口优先级为:显式 `[1m]` / `[200k]` 后缀 → 有效参数表记录 → runner 原有硬编码兜底。
65
+ ecagent 发给网关的模型 ID 不携带窗口后缀。Codex 没有实时窗口且参数表也无记录时,不虚构通用窗口。
66
+
67
+ 模型理论窗口与网关、团队的请求额度是不同限制;查表得到 1M 窗口,不代表可以突破团队的 200K 请求上限。
@@ -17,22 +17,22 @@
17
17
 
18
18
  ```bash
19
19
  # 文本(明文)
20
- ec msg send <from> <to> "<text>"
20
+ ec msg send <from> <to> '<text>'
21
21
 
22
22
  # 从文件读取文本内容(用于超长消息或避免 Shell 转义)
23
23
  ec msg send <from> <to> --text-from-file <path>
24
24
 
25
25
  # 文本(密文 E2EE)
26
- ec msg send <from> <to> "<text>" --encrypt
26
+ ec msg send <from> <to> '<text>' --encrypt
27
27
 
28
28
  # 强制明文(同时出现时优先于 --encrypt)
29
- ec msg send <from> <to> "<text>" --no-encrypt
29
+ ec msg send <from> <to> '<text>' --no-encrypt
30
30
 
31
31
  # 文件:--as 可选 image|video|voice|file(默认按扩展名推断)
32
32
  ec msg send <from> <to> --file <path> [--as <type>]
33
33
 
34
34
  # 链接卡片
35
- ec msg send <from> <to> --link <url> [--title "<title>"] [--description "<desc>"]
35
+ ec msg send <from> <to> --link <url> [--title '<title>'] [--description '<desc>']
36
36
 
37
37
  # 自定义 payload(JSON)
38
38
  ec msg send <from> <to> --payload '<json>'
@@ -67,7 +67,7 @@ ec contact unblock <target-aid> --self <self-aid>
67
67
 
68
68
  非托管环境的 `ec msg send` 是独立 AUN CLI 发送,不读取或要求 `agents/<aid>/config.json`,因此不会触发这套 Agent 联系人准入判断。
69
69
 
70
- 在 EvolCore 会话内,发送会经过当前 session 的 self/peer/role 鉴权。`visitor` 或 `member` 默认只允许回复当前对端;要联系当前对端以外的对象,必须通过话题路由:先 `ec thread list <对方AID>` 选话题(没有就 `ec thread create`),再用 `ec msg send "<text>" --thread <threadId> --check-every <时长>` 发送;from/to 由话题推断,无需手写。不带 `--thread` 直接改目标会被拒绝。完整话题路由操作序列见 `[memory-and-thread]` 段。没有成功 JSON 回执(含 `message_id`/`status`)不得声称已发送。
70
+ 在 EvolCore 会话内,发送会经过当前 session 的 self/peer/role 鉴权。`visitor` 或 `member` 默认只允许回复当前对端;要联系当前对端以外的对象,必须通过话题路由:先 `ec thread list <对方AID>` 选话题(没有就 `ec thread create`),再用 `ec msg send '<text>' --thread <threadId> --check-every <时长>` 发送;from/to 由话题推断,无需手写。不带 `--thread` 直接改目标会被拒绝。完整话题路由操作序列见 `[memory-and-thread]` 段。没有成功 JSON 回执(含 `message_id`/`status`)不得声称已发送。
71
71
 
72
72
  成功输出:`✓ 已发送 <message_id> seq=<n> status=<status>`
73
73
 
@@ -163,6 +163,6 @@ ec msg history <self-aid> <target-aid> \
163
163
  仅当无法使用 `ec msg send` 时(如拿不到自己的 AID),可用 `ec ctl send`,它自动继承当前会话的 AID 和对端:
164
164
 
165
165
  ```bash
166
- ec ctl send "<text>"
167
- ec ctl send --encrypt "<text>"
166
+ ec ctl send '<text>'
167
+ ec ctl send --encrypt '<text>'
168
168
  ```
@@ -27,7 +27,7 @@ ec thread history <peer>/<threadId> --self <selfAid> --limit 20
27
27
  # 第六步:查看/写入 summary
28
28
  ec thread summary show <peer>/<threadId> --self <selfAid>
29
29
  # 写入时必须带 --name(同时设标题);不想改名传 -(详见「话题摘要」一节)
30
- ec thread summary set <peer>/<threadId> "摘要内容" --name "<新标题>" --self <selfAid>
30
+ ec thread summary set <peer>/<threadId> '<摘要内容>' --name '<新标题>' --self <selfAid>
31
31
  ```
32
32
 
33
33
  ## 什么时候用
@@ -120,13 +120,13 @@ ec thread delete <peer>/<threadId> # 软删除:session 文件移入 _trash/
120
120
 
121
121
  ```bash
122
122
  # 完整形式
123
- ec msg send <from> <to> "消息内容" --thread <threadId>
123
+ ec msg send <from> <to> '<消息内容>' --thread <threadId>
124
124
 
125
125
  # 托管会话简化形式(from/to 自动从运行时上下文推断)
126
- ec msg send "消息内容" --thread <threadId>
126
+ ec msg send '<消息内容>' --thread <threadId>
127
127
 
128
128
  # 附带复查 Trigger(跨话题时必填;每 30m 唤醒本端回查)
129
- ec msg send "消息内容" --thread <threadId> --check-every 30m
129
+ ec msg send '<消息内容>' --thread <threadId> --check-every 30m
130
130
  ```
131
131
 
132
132
  注意事项:
@@ -176,7 +176,7 @@ ec thread summary show <peer>/<threadId>
176
176
  # 写入摘要 —— --name 必填:同时把话题改成这个标题
177
177
  ec thread summary set <peer>/<threadId> "项目A需求已确认,正在开发登录模块" --name "项目A登录模块"
178
178
  # 不想改话题名就显式传 -
179
- ec thread summary set <peer>/<threadId> "摘要内容" --name -
179
+ ec thread summary set <peer>/<threadId> '<摘要内容>' --name -
180
180
 
181
181
  # 支持 CAS(乐观锁),防止并发覆盖
182
182
  ec thread summary set <peer>/<threadId> "新内容" --name - --if-rev 3
@@ -103,7 +103,6 @@
103
103
  | 10 | rules | always | ✗ | `$KITS_RULES/` 目录(ECK 核心规则) |
104
104
  | 20 | identity-layer | chatType≠null | ✓ | 身份层 fragment |
105
105
  | 21 | persona | chatType≠null | ✗ | `$PERSONAL_DIR/persona.md` |
106
- | 21.5 | personal-profile | chatType≠null | ✗ | `$PERSONAL_DIR/personal.md` |
107
106
  | 30 | relation-layer | chatType∈{private,group} | ✓ | 关系层 fragment |
108
107
  | 35 | memory | memoryEnableRelation≠false | ✓ | 记忆系统 fragment(按 sessionType 分支) |
109
108
  | 36 | agent-memory | memoryEnableAgent≠false | ✗ | `$PERSONAL_DIR/memory/MEMORY.md` |
@@ -91,26 +91,6 @@
91
91
  },
92
92
  "description": "人格档案(persona.md)"
93
93
  },
94
- {
95
- "id": "personal-profile",
96
- "type": "file",
97
- "file": "$PERSONAL_DIR/personal.md",
98
- "order": 21.5,
99
- "needsInjection": false,
100
- "when": {
101
- "and": [
102
- {
103
- "var": "chatType",
104
- "neq": null
105
- },
106
- {
107
- "var": "lifecycle",
108
- "eq": "active"
109
- }
110
- ]
111
- },
112
- "description": "个人资料(personal.md)"
113
- },
114
94
  {
115
95
  "id": "relation-layer",
116
96
  "type": "file",
@@ -45,18 +45,6 @@
45
45
  },
46
46
  "description": "人格档案(判断记忆取舍时的行为准则参考)"
47
47
  },
48
- {
49
- "id": "personal-profile",
50
- "type": "file",
51
- "file": "$PERSONAL_DIR/personal.md",
52
- "order": 26,
53
- "needsInjection": false,
54
- "when": {
55
- "var": "lifecycle",
56
- "eq": "active"
57
- },
58
- "description": "个人资料与工作背景(判断记忆取舍时的自身定位参考)"
59
- },
60
48
  {
61
49
  "id": "peer-profile",
62
50
  "type": "file",
@@ -148,6 +148,17 @@ manifest schema、when 条件、合并覆盖、模板渲染、运行时变量目
148
148
  开启后落 `$EVOLCORE_HOME/data/eck-debug/`,文件名带时间戳:`vars-<ts>.json`、`context-<ts>.md`、
149
149
  `fragments-<ts>.md`、`manifest-<ts>.md`(逐条消息渲染另有 `msg-render-<ts>.md`),保留 24 小时。
150
150
 
151
+ ## 命令行的引号写法
152
+
153
+ `ec` 命令里的自由文本参数(消息正文、`--desc`、`--prompt`、`--name`、`--question`、
154
+ `--reason` 等)**一律用单引号包住**(`'…'`)。
155
+
156
+ 用双引号的话,正文里的反引号(`` ` ``)和 `$` 会被 shell 当作命令替换或变量展开,
157
+ 命令会被拒绝——`ec` 只接受能确认为字面量的命令。
158
+
159
+ 正文里不要出现半角撇号本身(会提前闭合引号);需要时用 `ʼ`(U+02BC)或 `'`(U+FF07)代替。
160
+ 单引号内无法转义单引号,改写措辞也是一种办法。
161
+
151
162
  ## 术语
152
163
 
153
164
  - **主体(Principal)**:通信参与者——人或 agent。AUN 网络上的主体持有 AID;非 AUN 渠道(飞书/微信等)的对端以该渠道的账号标识,同样是主体
@@ -17,8 +17,7 @@
17
17
 
18
18
  | 路径 | 用途 | 实际状态 |
19
19
  |------|------|----------|
20
- | `persona.md` | 人格(行为规范、身份认知) | evolcore 自动注入;通过 `ec agent persona` 读写 |
21
- | `personal.md` | 个人资料与工作背景 | evolcore 自动注入;当前 Agent 在 owner 权限下可直接编辑 |
20
+ | `persona.md` | 人格(行为规范、身份认知)+ 个人资料与工作背景 + `## Bootstrap 交接` | evolcore 自动注入;通过 `ec agent persona` 读写,owner 会话中也可用文件工具直接编辑 |
22
21
  | `memory/MEMORY.md` | agent 级 consolidated 记忆索引 | manifest order 36 注入(受 `memory.enableAgent` 开关控制) |
23
22
  | `memory/pending/` | 待整理记忆(note) | 主会话写入,不注入 |
24
23
  | `memory/consolidated/` | 正式记忆文件(签名) | 整理会话产出,通过 MEMORY.md 索引按需读取 |
@@ -26,6 +25,10 @@
26
25
  | `$EVOLCORE_HOME/memory/owner/<ownerAid>/MEMORY.md` | owner 级 consolidated 记忆索引 | manifest order 37 注入(受 `memory.enableOwner` 开关控制) |
27
26
  | `skills/` 目录 | 预留 | 会被创建,但目前无人读写 |
28
27
 
28
+ > `persona.md` 是**唯一**的人格/资料文件(`personal.md` 已废弃并入)。整体设置用
29
+ > `ec agent persona --text`(**整体覆盖**);只改其中某一段(如 `## Bootstrap 交接`)
30
+ > 用文件工具直接编辑,**不要**用 `--text` 单写一段,否则会冲掉其它段落。
31
+
29
32
  `memory/episodic.jsonl`、`memory/semantic.md`、`style.md`、`goals.md`、`journal.jsonl`
30
33
  是早期设计稿里的约定,**源码尚未实现读写**——不要假设写了就会生效。
31
34
 
@@ -34,7 +37,7 @@
34
37
  - **注入条件**是 `chatType ≠ null` 且 `lifecycle = active`(即处于正常运行阶段的渠道会话),不是"有没有注入 AID"。生命周期变量缺失时按 `active` 处理;非法生命周期仍失败关闭。本地 coding 模式也不注入。
35
38
  - persona.md 由 evolcore **自动前置**进 system prompt,你不需要主动 Read。
36
39
  - persona.md 缺失时**没有默认人格兜底**,只是这一段不出现;行为约束改由 `kits/rules/` + `roles/` 权限定义承担。
37
- - personal.md 缺失时跳过注入;文件位于 `$PERSONAL_DIR/personal.md`。人格文件 `persona.md` 通过 `ec agent persona show`、`ec agent persona --text <text>` 或 `ec agent persona --file <path>` 管理,修改后按 mtime 自动刷新(必要时可 `ec agent reload`)。
40
+ - `persona.md` 缺失时跳过注入;文件位于 `$PERSONAL_DIR/persona.md`。通过 `ec agent persona show`、`ec agent persona --text <text>` 或 `ec agent persona --file <path>` 管理,修改后按 mtime 自动刷新(必要时可 `ec agent reload`)。
38
41
  - 改完 persona.md 后 `ec agent reload` 生效(mtime 门控缓存)。
39
42
 
40
43
  不同 AID 可以有不同 persona——切换身份即切换人格。
@@ -24,7 +24,7 @@
24
24
  - interactive:直接输出即回复
25
25
  - proactive:通过托管发送通道正式回复,见 `[reply]` 段(thought.put vs message.send)
26
26
  - **附加能力与模式无关、始终需要 CLI**:发文件/图片/语音、@某人、加密、联系第三方
27
- - **以自己的 AID 为发送者**;拿不到时退回 `ec ctl send "<text>"`
27
+ - **以自己的 AID 为发送者**;拿不到时退回 `ec ctl send '<text>'`
28
28
 
29
29
  ### 命令返回值
30
30
 
@@ -33,16 +33,13 @@
33
33
 
34
34
  ```bash
35
35
  # 写入新 note
36
- ec memory note --slug <slug> [--tags <tag1,tag2>] "<正文>"
36
+ ec memory note --slug <slug> [--tags '<tag1>,<tag2>'] '<正文>'
37
37
 
38
38
  # 修改已有 note
39
- ec memory note --slug <slug> --update "<新正文>"
40
-
41
- # 查看记忆概览
42
- ec memory show
39
+ ec memory note update <slug> '<新正文>'
43
40
 
44
41
  # 查看待整理 notes
45
- ec memory notes
42
+ ec memory note list
46
43
 
47
44
  # 触发整理会话(将 notes 归档为正式记忆)
48
45
  ec memory consolidate
@@ -88,8 +85,8 @@ ec thread list <对方AID> --self <selfAid>
88
85
  ec thread create <对方AID> --name "问题跟踪" --self <selfAid> # 返回 threadId
89
86
 
90
87
  # 2. 带上话题发送;托管会话中 from/to 由话题推断,--check-every 必填
91
- ec msg send "<text>" --thread <threadId> --check-every 5m
92
- ec group send "<text>" --thread <threadId> --check-every 5m # 群对端
88
+ ec msg send '<text>' --thread <threadId> --check-every 5m
89
+ ec group send '<text>' --thread <threadId> --check-every 5m # 群对端
93
90
  ```
94
91
 
95
92
  - 不带 `--thread` 而直接把目标换成第三方,会被运行时拒绝(只能联系当前对端/群)
@@ -114,8 +111,8 @@ ec group send "<text>" --thread <threadId> --check-every 5m # 群对端
114
111
  - 避免:日期、轮次序号、"话题会话"等占位词
115
112
 
116
113
  ```bash
117
- ec thread rename current "<新名称>" # 托管会话
118
- ec thread rename <peer>/<threadId> "<新名称>" --self <selfAid> # 宿主终端
114
+ ec thread rename current '<新名称>' # 托管会话
115
+ ec thread rename <peer>/<threadId> '<新名称>' --self <selfAid> # 宿主终端
119
116
  ```
120
117
 
121
118
  ### 话题摘要维护
@@ -130,15 +127,15 @@ ec thread rename <peer>/<threadId> "<新名称>" --self <selfAid> # 宿主终
130
127
  ```bash
131
128
  # 情形 A:就在当前话题里总结(对话在上下文,增量就是本轮对话,不用读历史)
132
129
  ec thread summary show current # 1. 看上次摘要 + coveredThroughTs
133
- ec thread summary set current "<摘要内容>" --name "<新标题>" # 2. 写摘要 + 标题(--name 必填)
130
+ ec thread summary set current '<摘要内容>' --name '<新标题>' # 2. 写摘要 + 标题(--name 必填)
134
131
  # 游标自动推进;不想改名就传 --name -
135
132
 
136
133
  # 情形 B:从别的话题/别处总结(必须读增量)
137
134
  ec thread summary show <peer>/<threadId> # 1. 拿 coveredThroughTs
138
135
  ec thread history <peer>/<threadId> --after <coveredThroughTs> --limit 50 # 2. 读增量
139
136
  ec thread history <peer>/<threadId> --before <最早ts-1> --limit 50 # 3. 增量多则往回翻页
140
- ec thread summary set <peer>/<threadId> "<摘要内容>" # 4. 读完再写(游标自动推进)
141
- ec thread rename <peer>/<threadId> "<新名称>" # 5. 必要时改名
137
+ ec thread summary set <peer>/<threadId> '<摘要内容>' # 4. 读完再写(游标自动推进)
138
+ ec thread rename <peer>/<threadId> '<新名称>' # 5. 必要时改名
142
139
  ```
143
140
 
144
141
  **关键约束**:`summary set` 把游标设为**当时话题的最新一条**,所以跨话题总结**必须先把增量读完再写**——
@@ -171,10 +168,10 @@ ec thread rename <peer>/<threadId> "<新名称>" # 5.
171
168
  ec thread summary show current
172
169
 
173
170
  # 写入摘要(单 agent)
174
- ec thread summary set current "<摘要内容>"
171
+ ec thread summary set current '<摘要内容>'
175
172
 
176
173
  # 写入摘要(多 agent 协作,用 CAS 防覆盖)
177
- ec thread summary set current "<摘要内容>" --if-rev <当前rev>
174
+ ec thread summary set current '<摘要内容>' --if-rev <当前rev>
178
175
 
179
176
  # 查看摘要历史
180
177
  ec thread summary log current
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemas": {
3
3
  "daemon": {
4
- "currentVersion": 6
4
+ "currentVersion": 7
5
5
  },
6
6
  "defaults": {
7
7
  "currentVersion": 5
@@ -26,6 +26,12 @@
26
26
  }
27
27
  },
28
28
  "history": [
29
+ {
30
+ "schema": "daemon",
31
+ "version": 7,
32
+ "date": "2026-10-16",
33
+ "description": "add hot-reloadable delegated authorization diagnostic persistence switch"
34
+ },
29
35
  {
30
36
  "schema": "daemon",
31
37
  "version": 1,
@@ -120,7 +120,7 @@
120
120
  "description": "允许同时属于 AgentOwner 与 daemonOwner 的直接私聊任务使用宿主级 fullaccess"
121
121
  }
122
122
  },
123
- "description": "Agent 级宿主执行策略;仅 EC Web 可设置,不从 defaults 或 relation 继承"
123
+ "description": "Agent 级宿主执行策略;已认证 EC Web 或目标 Agent 与 daemon 的双 Owner 直接 Menu 可设置,不从 defaults 或 relation 继承"
124
124
  },
125
125
  "access": {
126
126
  "type": "object",
@@ -0,0 +1,140 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "daemon.schema.7.json",
4
+ "title": "ProcessConfig v7 (daemon.json)",
5
+ "description": "进程级配置:daemon 自身运行配置,链外独立作用域,不进覆盖链。",
6
+ "x-logical-name": "daemon",
7
+ "x-scope": "process",
8
+ "type": "object",
9
+ "additionalProperties": false,
10
+ "properties": {
11
+ "$schema_version": { "type": "number", "const": 7, "default": 7, "x-merge": "scalar" },
12
+ "aid": { "type": "string", "description": "daemon 默认身份 AID", "x-merge": "scalar" },
13
+ "owners": {
14
+ "type": "array",
15
+ "items": { "type": "string" },
16
+ "description": "进程控制面鉴权名单(谁能远程管 daemon)",
17
+ "x-merge": "list"
18
+ },
19
+ "debug": {
20
+ "type": "object",
21
+ "description": "进程级调试配置;唯一合法来源为 daemon.json,不参与 Agent 覆盖链",
22
+ "x-merge": "dict",
23
+ "additionalProperties": false,
24
+ "properties": {
25
+ "logLevel": { "type": "string", "enum": ["DEBUG", "INFO", "WARN", "ERROR"], "description": "daemon 日志级别" },
26
+ "aunTrace": { "type": "boolean", "description": "是否记录 AUN 协议 trace" },
27
+ "aunSdkLog": { "type": "boolean", "description": "是否启用 AUN SDK 调试日志" },
28
+ "upmsg": { "type": "boolean", "description": "是否向 Agent owner 发送 daemon 上线通知" },
29
+ "eckSnapshots": { "type": "boolean", "default": false, "description": "是否写入可能包含敏感上下文的 ECK 旁路调试快照" }
30
+ }
31
+ },
32
+ "tunnel": {
33
+ "type": "object",
34
+ "description": "内网穿透配置",
35
+ "x-merge": "dict",
36
+ "properties": {
37
+ "targets": { "type": "array", "description": "穿透目标列表", "items": { "type": "object" } }
38
+ }
39
+ },
40
+ "aun": {
41
+ "type": "object",
42
+ "description": "AUN 进程配置",
43
+ "x-merge": "dict",
44
+ "properties": {
45
+ "gatewayUrl": { "not": {}, "description": "已移除;网关由 fastaun 缓存和 AID discovery 决定" },
46
+ "defaultAidDomain": {
47
+ "type": "string",
48
+ "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)+$",
49
+ "description": "自动生成控制 AID 与 benchmark AID 使用的后缀域名;不影响已有 AID"
50
+ },
51
+ "minEvolVersion": { "type": "string", "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$", "description": "AUN Menu 允许的最低 Evol 客户端版本;省略时不限制" },
52
+ "menuTokenRequired": { "type": "boolean", "default": false, "description": "是否要求普通 AUN Menu 请求携带有效 menu_token;默认 false" },
53
+ "defaultEncrypt": { "type": "boolean", "description": "所有 daemon 管理的 AUN 通道共用的出站默认加密值;省略时为 true" }
54
+ }
55
+ },
56
+ "services": {
57
+ "type": "array",
58
+ "description": "daemon 管理的本机服务及其可选 AUN 代理",
59
+ "x-merge": "list",
60
+ "items": {
61
+ "type": "object",
62
+ "additionalProperties": false,
63
+ "required": ["name", "enabled"],
64
+ "properties": {
65
+ "name": {
66
+ "type": "string",
67
+ "pattern": "^[a-z0-9_-]+$",
68
+ "description": "服务的逻辑标识,同时作为 AUN 代理路由名;ecweb 表示本机 EC Web 服务实例"
69
+ },
70
+ "enabled": { "type": "boolean", "default": true, "description": "是否启用本机服务实例" },
71
+ "port": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "本机服务期望监听端口" },
72
+ "proxy": {
73
+ "type": "object",
74
+ "additionalProperties": false,
75
+ "allOf": [
76
+ {
77
+ "if": { "properties": { "enabled": { "const": true }, "source": { "const": "static" } }, "required": ["enabled", "source"] },
78
+ "then": { "required": ["endpoint", "visibility"] }
79
+ },
80
+ {
81
+ "if": { "properties": { "enabled": { "const": true } }, "required": ["enabled"] },
82
+ "then": { "required": ["source", "visibility"] }
83
+ }
84
+ ],
85
+ "properties": {
86
+ "enabled": { "type": "boolean", "default": false, "description": "是否通过 AUN Service Proxy 暴露该服务" },
87
+ "source": { "type": "string", "enum": ["instance", "static"], "description": "instance 表示自动发现同名本机服务;static 使用 endpoint 显式回连" },
88
+ "endpoint": { "type": "string", "maxLength": 2048, "description": "source=static 时使用的本机 HTTP/HTTPS 或 WS/WSS 回连地址" },
89
+ "serviceType": { "type": "string", "enum": ["http", "websocket", "ssh"], "default": "http", "description": "AUN 中公布的服务类型" },
90
+ "visibility": { "type": "string", "enum": ["public", "private", "aun-auth"], "default": "private", "description": "AUN Service Proxy 访问策略" },
91
+ "metadata": {
92
+ "type": "object",
93
+ "description": "非敏感服务描述;不得包含 endpoint、token、secret、cookie 等敏感信息",
94
+ "additionalProperties": { "type": "string", "maxLength": 8192 }
95
+ }
96
+ }
97
+ }
98
+ }
99
+ }
100
+ },
101
+ "configSnapshots": { "type": "boolean", "default": true, "description": "是否自动维护配置快照、启动日志和自检回落", "x-merge": "scalar" },
102
+ "restartRecovery": {
103
+ "type": "object",
104
+ "description": "重启失败后的自动修复配置;仅控制 restart-monitor 的 Claude self-heal",
105
+ "x-merge": "dict",
106
+ "additionalProperties": false,
107
+ "properties": {
108
+ "enabled": { "type": "boolean", "default": false, "description": "是否在重启失败后执行 Claude 自动修复;默认关闭" }
109
+ }
110
+ },
111
+ "delegationDiagnostics": {
112
+ "type": "object",
113
+ "description": "任务授权诊断持久化;仅用于排障,不恢复授权,事件保留 180 天、历史状态保留 90 天",
114
+ "x-merge": "dict",
115
+ "additionalProperties": false,
116
+ "properties": {
117
+ "enabled": { "type": "boolean", "default": true, "description": "是否持久化任务授权诊断;关闭后保留历史,内存诊断与权限校验不受影响,保存后热生效" }
118
+ }
119
+ },
120
+ "idleMonitor": {
121
+ "type": "object",
122
+ "description": "流式输出空闲监控配置",
123
+ "x-merge": "dict",
124
+ "properties": {
125
+ "enabled": { "type": "boolean", "default": true, "description": "是否启用空闲监控" },
126
+ "timeout": { "type": "number", "default": 120, "description": "空闲超时秒数" },
127
+ "apiRetryTimeout": { "type": "number", "description": "API 重试尝试连续无事件时的超时秒数;未设置时继承 timeout" },
128
+ "maxExecutionTime": { "type": "number", "description": "单个任务总执行时限(秒);未配置、非数字或小于等于 0 表示不限制" }
129
+ }
130
+ },
131
+ "watch": {
132
+ "type": "object",
133
+ "description": "日志监听配置",
134
+ "x-merge": "dict",
135
+ "properties": {
136
+ "logTypes": { "type": "array", "description": "要监听的日志类型", "items": { "type": "string" } }
137
+ }
138
+ }
139
+ }
140
+ }
@@ -39,13 +39,13 @@ license: MIT
39
39
  命令语法只在此处完整写一遍,别处引用本节:
40
40
 
41
41
  ```bash
42
- ec group send <selfAid> <groupId> "<text>" [选项]
42
+ ec group send <selfAid> <groupId> '<text>' [选项]
43
43
  ```
44
44
 
45
45
  | 选项 | 说明 |
46
46
  |---|---|
47
47
  | `--encrypt` / `--no-encrypt` | 必选一个,跟随收到消息的加密状态;不得省略后依赖默认 |
48
- | `--mention <aid>` | @ 单个成员,可重复;同一槽位可用逗号分隔多个 |
48
+ | `--mention '<aid1>,<aid2>'` | @ 成员。写法固定为单引号包住、逗号分隔多个 aid,可重复传入 |
49
49
  | `--mention-all` | @ 所有人 |
50
50
  | `--file <path> [--as image\|video\|voice\|file]` | 发文件 |
51
51
  | `--payload '<json>'` | 附加结构化数据 |
@@ -53,7 +53,7 @@ ec group send <selfAid> <groupId> "<text>" [选项]
53
53
  其它硬约束(同见 `[reply]` 段):
54
54
 
55
55
  - 一次 shell 调用只跑一条完整的 `ec` 命令,不拼接管道、重定向或子 shell。
56
- - 正文里的双引号、反引号和 `$` 前加反斜杠。
56
+ - 正文一律用半角单引号包住;正文里的双引号、反引号和 `$` 前加反斜杠;半角撇号用 `ʼ`(U+02BC)或 `'`(U+FF07)代替。
57
57
  - **正文必须以引号包住**。正文以 `/` 开头时尤其要注意——Git Bash 会把裸的 `/effort` 当成路径做 MSYS 转换,
58
58
  实际发出去的是 `C:/Program Files/Git/effort`。这不是命令没生效,是正文被 shell 改了。
59
59
  - 一轮任务可能发 0 到多条消息。发成功就继续做剩下的,不要重复发同一条。
@@ -211,7 +211,7 @@ ec group rules <selfAid> <groupId> get [--format json]
211
211
 
212
212
  ```bash
213
213
  # 发消息(唯一完整语法在第二节)
214
- ec group send <selfAid> <groupId> "<text>" --encrypt|--no-encrypt [--mention <aid>]
214
+ ec group send <selfAid> <groupId> '<text>' [--encrypt|--no-encrypt] [--mention '<aid1>,<aid2>']
215
215
 
216
216
  # 查上下文
217
217
  ec group history <selfAid> <groupId> --limit 50 --format json
@@ -15,7 +15,7 @@ const USAGE = `ec skill —— EC 技能管理
15
15
  用法:
16
16
  ec skill list [--json] 列出所有技能
17
17
  ec skill info <name> [--json] 查看单个技能详情
18
- ec skill create <name> [--desc "..."] [--force] [--enable]
18
+ ec skill create <name> [--desc '...'] [--force] [--enable]
19
19
  新建技能骨架(默认禁用)
20
20
  ec skill install <源> [--force] [--enable] 安装技能(目录 / .zip / .md,默认禁用)
21
21
  ec skill remove <name> 删除本机技能
@@ -367,7 +367,7 @@ export function resolveSkillDirArg(target) {
367
367
 
368
368
  export function cmdCreate(name, { desc = '', force = false, enable = false, json = false } = {}) {
369
369
  assertPermission('local'); // 骨架固定建在本机级,与 install 同档
370
- if (!name) throw new Error('缺少技能名。用法:ec skill create <name> --desc "..."');
370
+ if (!name) throw new Error(`缺少技能名。用法:ec skill create <name> --desc '...'`);
371
371
  if (!NAME_RE.test(name)) {
372
372
  throw new Error(`技能名「${name}」不符合 kebab-case(小写字母/数字/连字符,如 my-skill)`);
373
373
  }
@@ -63,9 +63,9 @@ ec memory archive <路径>
63
63
  若干条超期记忆**单独每一条都不值得续期,但合起来值得留一条**时,产出一条合并版:
64
64
 
65
65
  ```bash
66
- ec memory create --scope <本次会话的 scope> --slug <slug> --desc "一句话描述" \
66
+ ec memory create --scope <本次会话的 scope> --slug <slug> --desc '一句话描述' \
67
67
  --tags <...> [--keywords <...>] \
68
- --replaces "<旧文件1>,<旧文件2>,..." \
68
+ --replaces '<旧文件1>,<旧文件2>,...' \
69
69
  "<合并后的完整内容>"
70
70
  ```
71
71