evolcore 0.0.26 → 0.0.27

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 (169) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/bin/codex-managed-acl.ps1 +43 -0
  3. package/dist/agents/baseagent-availability.js +68 -0
  4. package/dist/agents/claude-runner.js +123 -22
  5. package/dist/agents/codex/app-server-client.js +63 -26
  6. package/dist/agents/codex-runner.js +316 -411
  7. package/dist/agents/ecagent-runner.js +170 -25
  8. package/dist/agents/gemini-runner.js +6 -0
  9. package/dist/agents/runner-types.js +50 -2
  10. package/dist/aun/aid/agentmd.js +73 -31
  11. package/dist/aun/aid/client.js +1 -1
  12. package/dist/aun/aid/control-aid.js +180 -1
  13. package/dist/aun/aid/identity.js +3 -3
  14. package/dist/aun/group/history.js +303 -0
  15. package/dist/aun/group/identity.js +43 -0
  16. package/dist/aun/group/index.js +5 -0
  17. package/dist/aun/{msg/group.js → group/operations.js} +161 -38
  18. package/dist/aun/{menu-client.js → menu/client.js} +12 -7
  19. package/dist/aun/menu/index.js +2 -0
  20. package/dist/aun/menu/transport.js +49 -0
  21. package/dist/aun/msg/index.js +2 -1
  22. package/dist/aun/msg/managed-operation.js +84 -18
  23. package/dist/aun/msg/mention-schema.js +51 -0
  24. package/dist/aun/msg/p2p.js +13 -8
  25. package/dist/aun/msg/upload.js +43 -88
  26. package/dist/aun/outbox.js +29 -7
  27. package/dist/aun/rpc/client.js +1 -0
  28. package/dist/aun/storage/client.js +39 -50
  29. package/dist/channels/aun.js +522 -233
  30. package/dist/channels/daemon.js +10 -6
  31. package/dist/cli/agent-command.js +108 -6
  32. package/dist/cli/agent-create.js +515 -2
  33. package/dist/cli/agent.js +109 -8
  34. package/dist/cli/aun-commands.js +191 -42
  35. package/dist/cli/config.js +8 -5
  36. package/dist/cli/contact.js +2 -2
  37. package/dist/cli/ctl-command.js +2 -2
  38. package/dist/cli/daemon-commands.js +35 -23
  39. package/dist/cli/diag.js +2 -2
  40. package/dist/cli/fs-command.js +3 -3
  41. package/dist/cli/handoff-command.js +6 -6
  42. package/dist/cli/index.js +8 -2
  43. package/dist/cli/init.js +34 -1
  44. package/dist/cli/managed-command-guard.js +2 -1
  45. package/dist/cli/menu-client.js +9 -5
  46. package/dist/cli/model.js +3 -3
  47. package/dist/cli/queue-command.js +2 -2
  48. package/dist/cli/response.js +2 -2
  49. package/dist/cli/restart-monitor.js +16 -2
  50. package/dist/cli/task-command.js +59 -0
  51. package/dist/cli/task-context.js +97 -49
  52. package/dist/cli/trigger-command.js +20 -10
  53. package/dist/config/builtin-roles.js +10 -0
  54. package/dist/config/config-field-policy.js +11 -0
  55. package/dist/config/config-manager.js +32 -4
  56. package/dist/config/config-operation-service.js +20 -5
  57. package/dist/config/contact-book-store.js +1 -1
  58. package/dist/config/contact-book.js +1 -1
  59. package/dist/config/contact-operation-service.js +1 -1
  60. package/dist/config/peer-role-resolver.js +1 -1
  61. package/dist/config/resolved-config-op.js +3 -0
  62. package/dist/config-store.js +1 -1
  63. package/dist/core/agent-application-service.js +5 -0
  64. package/dist/core/audit/event-key.js +17 -2
  65. package/dist/core/audit/log-integrity.js +34 -8
  66. package/dist/core/auth/agent-delegation.js +48 -14
  67. package/dist/core/auth/auth-gateway.js +2 -0
  68. package/dist/core/auth/authorization-audit.js +34 -38
  69. package/dist/core/auth/operation-authorizer.js +67 -5
  70. package/dist/core/auth/operation-catalog.js +110 -0
  71. package/dist/core/auth/remote-access-store.js +115 -9
  72. package/dist/core/bootstrap-messages.js +66 -7
  73. package/dist/core/bootstrap-service.js +110 -19
  74. package/dist/core/command/agent-control.js +88 -7
  75. package/dist/core/command/agent-storage-menu.js +443 -0
  76. package/dist/core/command/cli-intent-parser.js +19 -0
  77. package/dist/core/command/command-handler.js +76 -39
  78. package/dist/core/command/data-root-resolver.js +273 -0
  79. package/dist/core/command/group-menu.js +7 -2
  80. package/dist/core/command/menu-catalog.js +34 -4
  81. package/dist/core/command/menu-handler.js +348 -77
  82. package/dist/core/command/menu-protocol.js +40 -6
  83. package/dist/core/command/role-menu.js +2 -2
  84. package/dist/core/command/slash-handler.js +37 -22
  85. package/dist/core/event-catalog.js +4 -0
  86. package/dist/core/evolagent-registry.js +28 -2
  87. package/dist/core/group/invite-service.js +924 -0
  88. package/dist/core/interaction-router.js +22 -8
  89. package/dist/core/message/im-renderer.js +76 -15
  90. package/dist/core/message/message-bridge.js +94 -11
  91. package/dist/core/message/message-log.js +5 -3
  92. package/dist/core/message/message-queue.js +73 -41
  93. package/dist/core/message/response-engine.js +709 -117
  94. package/dist/core/permission/approval-gateway.js +36 -3
  95. package/dist/core/permission/ec-command-parser.js +61 -29
  96. package/dist/core/permission/protected-paths.js +134 -16
  97. package/dist/core/permission/sandbox-runtime.js +72 -3
  98. package/dist/core/permission/tool-error-code.js +15 -0
  99. package/dist/core/permission/tool-policy.js +7 -7
  100. package/dist/core/relation/peer-identity.js +57 -6
  101. package/dist/core/relation/shared-data.js +106 -0
  102. package/dist/core/role/runtime-policy.js +64 -0
  103. package/dist/core/runtime-lock.js +10 -26
  104. package/dist/core/session/runner-task-history.js +170 -0
  105. package/dist/core/session/session-manager.js +34 -6
  106. package/dist/core/session/session-mapper.js +41 -0
  107. package/dist/core/session/session-turn-coordinator.js +37 -7
  108. package/dist/core/session/session-turns.js +48 -7
  109. package/dist/core/task/task-recovery-service.js +176 -0
  110. package/dist/core/task/task-resume-operation.js +32 -0
  111. package/dist/eck/group-rules-sync.js +5 -3
  112. package/dist/eck/kit-renderer.js +1 -0
  113. package/dist/index.js +308 -54
  114. package/dist/ipc.js +141 -15
  115. package/dist/paths.js +17 -4
  116. package/dist/product.js +2 -0
  117. package/dist/trigger/event-source.js +19 -0
  118. package/dist/trigger/feedback.js +233 -40
  119. package/dist/trigger/parser.js +55 -5
  120. package/dist/trigger/patch.js +9 -0
  121. package/dist/trigger/scheduler.js +30 -4
  122. package/dist/trigger/validation.js +20 -3
  123. package/dist/utils/ecweb-utils.js +1 -0
  124. package/dist/utils/error-utils.js +40 -2
  125. package/dist/utils/logger.js +23 -13
  126. package/dist/utils/tool-summary.js +59 -3
  127. package/dist/utils/welcome.js +174 -1
  128. package/ecagent/dist/harness/agent-harness.js +3 -0
  129. package/ecagent/dist/harness/session/jsonl-storage.js +21 -2
  130. package/kits/docs/INDEX.md +0 -6
  131. package/kits/docs/channels/aun.md +15 -2
  132. package/kits/docs/channels/feishu.md +1 -1
  133. package/kits/docs/context-assembly.md +29 -17
  134. package/kits/docs/evolcore/INDEX.md +8 -3
  135. package/kits/docs/evolcore/agent-create.md +39 -7
  136. package/kits/docs/evolcore/agent.md +33 -1
  137. package/kits/docs/evolcore/aid.md +9 -1
  138. package/kits/docs/evolcore/config.md +40 -1
  139. package/kits/docs/evolcore/group-collaboration.md +1 -1
  140. package/kits/docs/evolcore/group.md +117 -2
  141. package/kits/docs/evolcore/menu-client.md +16 -0
  142. package/kits/docs/evolcore/msg.md +3 -0
  143. package/kits/docs/evolcore/storage.md +3 -0
  144. package/kits/docs/evolcore/task.md +14 -0
  145. package/kits/docs/evolcore/trigger.md +51 -3
  146. package/kits/docs/venues/group.md +5 -0
  147. package/kits/eck_manifest.json +27 -0
  148. package/kits/rules/01-overview.md +11 -7
  149. package/kits/rules/04-relation.md +2 -1
  150. package/kits/rules/05-venue.md +1 -1
  151. package/kits/rules/06-channel.md +6 -4
  152. package/kits/schemas/agent-config.schema.12.json +25 -1
  153. package/kits/schemas/daemon.schema.6.json +2 -2
  154. package/kits/schemas/defaults.schema.5.json +1 -1
  155. package/kits/schemas/relation-config.schema.1.json +1 -1
  156. package/kits/schemas/relation-config.schema.5.json +1 -1
  157. package/kits/schemas/role-config.schema.1.json +14 -0
  158. package/kits/templates/roles/member.json +5 -0
  159. package/kits/templates/roles/visitor.json +5 -0
  160. package/kits/templates/system-fragments/baseagent.md +1 -1
  161. package/kits/templates/system-fragments/bootstrap.md +26 -9
  162. package/kits/templates/system-fragments/channel.md +8 -44
  163. package/kits/templates/system-fragments/commands.md +10 -2
  164. package/kits/templates/system-fragments/group-unread-history.md +7 -0
  165. package/kits/templates/system-fragments/reply.md +56 -0
  166. package/package.json +7 -3
  167. package/dist/aun/group-identity.js +0 -9
  168. /package/dist/aun/{group-fs-download.js → group/fs-download.js} +0 -0
  169. /package/dist/aun/{msg/group-index.js → group/index-rpc.js} +0 -0
@@ -58,9 +58,3 @@
58
58
  | 路径注册表模板 | `eck_templates/path-registry.template.md` | 路径实例模板 |
59
59
  | 索引模板 | `eck_templates/INDEX.template.md` | agent 级索引模板 |
60
60
  | 指南模板 | `eck_templates/GUIDE.template.md` | agent 级查阅指南模板 |
61
-
62
- ## Base Agent
63
-
64
- | 文档 | 路径 | 说明 |
65
- |------|------|------|
66
- | Claude Code 日志 | `baseagent/cc-logs.md` | CC 会话日志查阅(找完整对话/工具调用/注入) |
@@ -1,7 +1,7 @@
1
1
  # AUN 渠道
2
2
 
3
3
  > 知识性文档:AUN 渠道的配置、参数与特有机制。**不依赖当前会话渠道**——任意会话都可按需 Read。
4
- > 运行时"怎么发消息"由注入的 `[channel]` 段决定(aun 渠道用 `ec msg send` / `ec group send`),不在本文。
4
+ > 运行时回复方式由共用 `[reply]` 段按实际 chatMode 决定;active 的 `[channel]` 补充文件、链接、@ 等能力。AUN 主动发送使用托管的 `ec msg send` / `ec group send`。
5
5
  > 群聊使用 `evolcore/group.md`;群文件使用 `evolcore/fs.md`。
6
6
 
7
7
  ## 概述
@@ -51,6 +51,19 @@ AUN keystore seed 由 EvolCore 使用固定应用值管理,不再提供配置
51
51
  - 关系层另存一份**派生**的精简身份 `relations/<peerKey>/peer-identity.json`(type/isAgent/name),由 evolcore 从 agent.md 提取,不是 agent.md 本体。
52
52
  - **E2EE 加密**:可选端到端加密,回复默认跟随对端消息加密状态(密文回密文,明文回明文);keystore seed 由 EvolCore 固定管理。
53
53
  - **断线重连**:SDK 内置退避策略自动重连。实时连接状态用 `ec watch aid` 查看(`ec aid` 是身份/证书管理,不显示连接状态)。
54
- - **群 ID 格式**:当前协议规范使用 `g-{slug}.issuer-domain` canonical 形式,输入也可接受本域简写 `g-{slug}` 或兼容形式 `g-{slug}@issuer-domain`。历史会话里可能仍出现 `group.{issuer}/{group_no}` 一类旧格式,运行时需兼容读取。
54
+ - **群 ID 格式**:使用 `{base}.{issuer}`,如 `ontology.agentid.cn` 或 `g-12345.agentid.cn`。EvolCore 默认创建 `g-` 加五位数字(10000–99999)的名称,issuer 以群服务返回为准。群命令支持 base 简写;不再支持或转换 `group.{issuer}/{base}`,也不支持 `base@issuer`。`g-` 是名称的一部分,不应剥离,也不能仅凭群 AID 的格式判断主体类型。
55
55
  - **群 @ 处理策略**:`mention_mode=disabled|mention-only` 是群级配置,只决定哪些群消息进入 Agent LLM 上下文,不影响 AUN 协议层投递;被过滤消息仍应本地存档。
56
56
  - **身份体系**:对端以 AID 标识,关系层 peerKey 形如 `aun#alice.aid.pub`。
57
+
58
+ ### 出站关注状态
59
+
60
+ AUN runner 状态和 action card 可携带顶层 `attention`,值只能是以下四种之一:
61
+
62
+ | 值 | 语义 |
63
+ |---|---|
64
+ | `completed` | 正常终态,任务已完成并交付结果 |
65
+ | `failed` | 异常终态,任务无法继续完成 |
66
+ | `required` | 需要人处理,例如授权确认或补充输入 |
67
+ | `interrupted` | runner 被用户、新消息或基础设施中断 |
68
+
69
+ 普通持久化业务消息(含最终文本、错误正文、Activity、命令回执)不携带 `terminal` 或 `attention`。`task.status` 的 completed/error/timeout/interrupted 成对携带终态字段,requires_action 携带 `false/required`,其他过程状态两字段都省略。所有 action card 固定携带 `terminal:false` 和 `attention:"required"`;卡片投递本身不会创建 runner 等待状态。可恢复 system.error 投影为 `notice + severity:warn`。线上值按类型和状态统一生成,显式旧值不覆盖该规则。
@@ -1,7 +1,7 @@
1
1
  # 飞书渠道
2
2
 
3
3
  > 知识性文档:飞书渠道的配置、参数与特有机制。**不依赖当前会话渠道**——任意会话都可按需 Read(在 aun 会话里也可查飞书)。
4
- > 运行时"怎么发消息"由注入的 `[channel]` 段决定(飞书是 evolcore 自动回复,agent 不调 CLI),不在本文。
4
+ > 运行时回复方式由共用 `[reply]` 段按实际 chatMode 决定:interactive 由 evolcore 自动投递普通输出,proactive 用 `ec ctl send` 正式回复;active 的 `[channel]` 补充文件等能力。
5
5
 
6
6
  ## 概述
7
7
 
@@ -263,6 +263,7 @@ vars 由 evolcore 在 `message-processor.ts` 按当前会话构造。分两类
263
263
  | `chatType` | `private` / `group` / `null`(coding) |
264
264
  | `channel` | 渠道类型(aun/feishu/...)|
265
265
  | `mentionMode` | 群 @ 处理模式(mention-only/disabled) |
266
+ | `groupHistoryAvailable` | 当前 AUN 群是否允许读取本地群历史 |
266
267
  | `clientType` | 客户端类型(desktop/web/mobile) |
267
268
  | `permissionMode` / `readonly` | 权限模式 / 是否只读 |
268
269
  | `capabilities` | 当前渠道能力(图片输入/输出、文件发送) |
@@ -285,25 +286,36 @@ coding 场景(无 channel/无身份)下,`chatType`、`channel`、`selfAid`
285
286
 
286
287
  ## 默认 manifest 的段(按 order)
287
288
 
289
+ 常规段均要求 `lifecycle=active`,下表的其它条件在此基础上叠加;Bootstrap 引导与共用回复段单独列出完整条件。
290
+
288
291
  | order | id | 类型 | 加载条件(when) | inject |
289
292
  |-------|----|----|------------------|--------|
290
- | 10 | rules | 目录 `$KITS_RULES` | always | ✗ |
291
- | 20 | identity-layer | fragment | chatType≠null | ✓ |
292
- | 21 | persona | `$PERSONAL_DIR/persona.md` | chatType≠null | ✗ |
293
- | 21.5 | personal-profile | `$PERSONAL_DIR/personal.md` | chatType≠null | ✗ |
294
- | 22 | working-memory | `$PERSONAL_DIR/memory/working.md` | chatType≠null | ✗ |
295
- | 30 | relation-layer | fragment | chatType∈{private,group} | ✓ |
296
- | 35 | peer-profile | `$RELATIONS_DIR/{{peerKey}}/profile.md` | peerKey≠null | ✗ |
297
- | 40 | venue-fragment | fragment | chatType≠null | ✓ |
298
- | 41 | venue-chattype | `$KITS_DOCS/venues/{{chatType}}.md` | chatType≠null | ✗ |
299
- | 42 | venue-channel-chattype | `$KITS_DOCS/venues/{{channel}}-{{chatType}}.md` | chatType≠null | ✗ |
300
- | 44 | venue-client | `$KITS_DOCS/venues/client-{{clientType}}.md` | clientType≠null | ✗ |
301
- | 50 | channel-layer | fragment | channel≠null | ✓ |
302
- | 55 | commands | fragment | channel≠null | ✓ |
303
- | 60 | session | fragment | always | ✓ |
304
- | 70 | baseagent | fragment | baseAgent≠null | ✓ |
305
-
306
- > 注意:`session`(60) 是 `always`,`baseagent`(70) 只看 `baseAgent` 是否注入——这两段**与 chatType 无关**,coding 场景也会加载。所谓"coding 仅 rules"是近似说法:精确地说 coding 场景命中的是 rules + session + baseagent(其余因 chatType/channel 为空而落选)。
293
+ | 10 | rules | 目录 `$KITS_RULES` | active | ✗ |
294
+ | 15 | bootstrap-guide | `bootstrap.md` | lifecycle=bootstrapping | ✓ |
295
+ | 20 | identity-layer | fragment | active 且 chatType≠null | ✓ |
296
+ | 21 | persona | `$PERSONAL_DIR/persona.md` | active 且 chatType≠null | ✗ |
297
+ | 21.5 | personal-profile | `$PERSONAL_DIR/personal.md` | active 且 chatType≠null | ✗ |
298
+ | 22 | working-memory | `$PERSONAL_DIR/memory/working.md` | active 且 chatType≠null | ✗ |
299
+ | 23 | preferences | `$PERSONAL_DIR/preferences/active-preferences.md` | active 且 chatType=private | ✗ |
300
+ | 30 | relation-layer | fragment | active 且 chatType∈{private,group} | ✓ |
301
+ | 35 | peer-profile | `$RELATIONS_DIR/{{peerKey}}/profile.md` | active 且 peerKey≠null | ✗ |
302
+ | 40 | venue-fragment | fragment | active 且 chatType≠null | ✓ |
303
+ | 41 | venue-chattype | `$KITS_DOCS/venues/{{chatType}}.md` | active 且 chatType≠null | ✗ |
304
+ | 42 | venue-channel-chattype | `$KITS_DOCS/venues/{{channel}}-{{chatType}}.md` | active 且 chatType≠null | ✗ |
305
+ | 43.2 | relation-group-rules | `$RELATIONS_DIR/{{peerKey}}/rules.md` | active 且 groupRulesPath≠null | ✗ |
306
+ | 44 | venue-client | `$KITS_DOCS/venues/client-{{clientType}}.md` | active 且 clientType≠null | ✗ |
307
+ | 49 | reply-contract | `reply.md` | channel≠null 且 lifecycle∈{active,bootstrapping} | ✓ |
308
+ | 50 | channel-layer | fragment | active 且 channel≠null | ✓ |
309
+ | 55 | commands | fragment | active 且 channel≠null | ✓ |
310
+ | 60 | session | fragment | active | ✓ |
311
+ | 70 | baseagent | fragment | active 且 baseAgent≠null | ✓ |
312
+
313
+ Bootstrap 只加载引导与有渠道时的最小通信上下文 `[reply]`,不加载完整身份/关系/渠道能力、个人记忆或普通任务命令。
314
+ `[reply]` 展示 selfAid、peerId、peerType、channel、chatType、chatMode;未知身份显示 unknown,回复方式只取运行时已解析的 chatMode,不从身份或私聊场景重新推断。命令经当前会话 delegated sender / daemon IPC 发送,遵守现有身份、目标、话题与加密约束。
315
+ `needsInjection` 仅是是否进行模板渲染的布尔开关,不是变量白名单;上述变量原本已存在于运行时 vars。
316
+
317
+ `session` 与 `baseagent` 不依赖 chatType,因此 active 的 coding 场景仍命中 rules + session + baseagent;无渠道时不加载共用回复段。
318
+ 生命周期缺失兼容 active;created 与显式非法生命周期不命中主 manifest 的引导、回复或常规段。
307
319
 
308
320
  ## 环境层文档目录结构
309
321
 
@@ -5,7 +5,7 @@
5
5
  注入一张精简能力卡,指向本目录下对应文档;需要完整用法时 Read 对应文档。
6
6
 
7
7
  > 对外通信命令以自己的 AID 为发送者;当前渠道是否需要 CLI 回复,以运行时注入的
8
- > `channel` 规则为准。参数不是全局通用的:`--format json` 仅用于对应帮助中明确支持的命令,
8
+ > `[reply]` 规则为准,active 的 `[channel]` 补充扩展能力。参数不是全局通用的:`--format json` 仅用于对应帮助中明确支持的命令,
9
9
  > `--app <name>` 仅用于消息 pull/ack、消费类 RPC 和明确支持 app slot 的文件操作。
10
10
 
11
11
  ## 如何使用本索引
@@ -14,12 +14,14 @@
14
14
  2. **不确定有没有命令**时,直接 `ec <猜测的子命令> --help` 试一下(如 `ec stats --help`)
15
15
  3. **已知场景需求**(如"要给对端发消息")→ 看下方分类表 → 定位到对应命令集
16
16
 
17
+ 托管 Agent 任务禁止调用 `ec start`、`ec stop`、`ec restart` 或 `ec restart-monitor`。这些进程生命周期命令只能由宿主终端执行;源码改动后 Agent 只应完成构建并报告需要宿主重启。
18
+
17
19
  ## 服务运维类(本地,无需 AUN)
18
20
 
19
21
  | 命令 | 用途 | 触发词 |
20
22
  |------|------|--------|
21
23
  | `ec --version` / `-v` / `-V` | 查看版本号 | 版本 |
22
- | `ec restart` | 重启服务(含自动升级检查) | 重启 |
24
+ | `ec restart` | 宿主终端重启服务(托管 Agent 禁止调用) | 重启 |
23
25
  | `ec status` | 查看运行状态、进程、会话、渠道连接 | 状态/查看状态 |
24
26
  | `ec logs` | 查看日志(`--level` `--module` `--raw` `--no-color`) | 日志/查看日志 |
25
27
  | `ec diagnose` | 诊断启动环境 | 诊断/环境诊断 |
@@ -31,9 +33,11 @@ Windows 上 Codex 托管任务出现 `helper_sandbox_lock_failed`、`SetNamedSec
31
33
  | 命令集 | 用途 | 触发词 | 适用场景 | 文档 |
32
34
  |--------|------|--------|----------|------|
33
35
  | `ec msg` | 私聊收发消息 | 回复/发消息/拉取/撤回/查在线 | 有对端(peerId) | `msg.md` |
34
- | `ec group` | 群聊收发与群管理 | 群发/建群/邀请/踢人/退群/群成员/角色/封禁/规则/协作 | 群聊(groupId) | `group.md`;完整协作流程见 `group-collaboration.md` |
36
+ | `ec group` | 群聊收发与群管理 | 群发/建群/本地群历史/邀请/踢人/退群/群成员/角色/封禁/屏蔽/成员状态/规则/协作 | 群聊(groupId) | `group.md`;完整协作流程见 `group-collaboration.md` |
37
+ | `/invites` / `ec group invites` | 收到群邀请、Owner 卡片审核与恢复 | 入群邀请/接受邀请/拒绝邀请/审核卡片/待处理邀请 | 当前 Agent Owner 的 AUN 私聊 | `group.md` |
35
38
  | `ec group rules` | 群规则文件发布与上下文注入 | 群规则/工作流程/职责分工/rules.md/发布规则 | AUN 群聊(groupId) | `group-rules.md` |
36
39
  | `ec aid` | AID 身份管理 | 身份/证书/名片/探测对端 | 任意有渠道场景 | `aid.md` |
40
+ | `ec aid` | AID 身份、名片与头像管理 | 身份/证书/名片/头像/换头像/探测对端 | 任意有渠道场景 | `aid.md` |
37
41
  | `ec fs` | AUN 文件系统统一入口 | 上传/下载/看文件/列目录/删文件/配额/群空间 | 任意有渠道场景 | `fs.md` |
38
42
  | `ec storage` | 文件存储底层调试入口 | storage 调试/旧命令/底层上传下载 | 任意有渠道场景 | `storage.md` |
39
43
  | `ec agent` | EvolAgent 生命周期 | 创建/启停/热重载/改配置 | 管理员(owner/admin) | `agent.md`;完整创建与 Bootstrap 见 `agent-create.md` |
@@ -57,6 +61,7 @@ Windows 上 Codex 托管任务出现 `helper_sandbox_lock_failed`、`SetNamedSec
57
61
  | `ec stats` | Token 用量与费用统计 | 用量/费用/统计/预算/token/cost | `stats.md` |
58
62
  | `ec trigger` | 定时与事件触发器管理(创建用 `create`,`set` 为兼容别名) | 触发器/定时任务/cron/提醒/定时检查/自动执行/巡检/禁用 trigger/删除 trigger | `trigger.md` |
59
63
  | `ec trigger event` | EventBus 事件目录 | 事件触发/事件目录/EventBus/source.type=event/filter.match | `event.md` |
64
+ | `ec task` | 恢复暂停或异常中断的会话任务 | 任务恢复/异常中断/继续任务/resume | `task.md` |
60
65
 
61
66
  ## 开发者工具(非 agent 会话能力)
62
67
 
@@ -27,6 +27,25 @@ active
27
27
 
28
28
  ## 1. 创建者创建 Agent
29
29
 
30
+ ### 一次性初始化模式
31
+
32
+ 如果创建者已经明确确认最终名片字段和人格,可以使用 `--initialize` 一次完成创建与激活:
33
+
34
+ ```bash
35
+ ec agent new helper.agentid.pub --initialize \
36
+ --project /home/user/helper-project --baseagent codex \
37
+ --owner owner.agentid.pub --name "Helper" \
38
+ --description "协助处理项目开发任务" \
39
+ --tags '["coding","maintenance","typescript"]' \
40
+ --persona-file /home/user/helper-project/persona.md
41
+ ```
42
+
43
+ `--initialize` 自动包含 `--non-interactive`。它要求 `name`、`description`、`tags` 和 Owner 显式提供,由 daemon 写入 persona、签名发布最终 `agent.md`、热加载并完成欢迎消息及 lifecycle `active`。它不启动目标 Agent 的确认对话,也不要求创建者成为新 Agent 的 Owner。默认等待 60 秒,可用 `--wait 0..300` 调整;超时返回可查询的初始化操作,不代表失败。
44
+
45
+ 初始化期间不处理目标 Agent 的普通入站消息。初始化失败或 daemon 重启后,使用 `ec agent initialize <aid> --resume` 恢复原操作;不要重复 `new` 或使用 `--force` 覆盖。`ec agent show <aid>` 会显示初始化阶段、错误和下一步,但不会暴露 persona 正文。
46
+
47
+ 没有得到创建者明确最终字段时,继续使用下方的普通非交互式创建,让目标 Agent 自己完成 Bootstrap。
48
+
30
49
  多个 Agent 必须串行创建和观察。不要并行启动多个 `ec agent new`:证书、热加载和 Bootstrap 会竞争连接与资源,容易造成超时、锁等待或把失败误判为未创建。
31
50
 
32
51
  在人类直接创建时,可以使用交互模式:
@@ -85,7 +104,7 @@ ec agent show helper.agentid.pub
85
104
 
86
105
  部分 channel 不能在连接时主动定位 Owner。这种情况下 Agent 会保持 `created`;Owner 需要先在该 channel 向新 Agent 发送一条消息,系统获得回复上下文后再启动 Bootstrap。
87
106
 
88
- `created` 状态下 Base Agent 不处理普通消息。`bootstrapping` 状态下只加载 Bootstrap 专属提示词,不加载正常的 ECK 规则、人格、记忆或命令能力卡。
107
+ `created` 状态下 Base Agent 不处理普通消息。`bootstrapping` 状态下加载 Bootstrap 专属提示词与有渠道时的 `[reply]` 最小通信上下文,不加载正常的 ECK 规则、人格、记忆、完整渠道能力或命令能力卡。回复方式遵循实际 chatMode,不根据 Owner 是人类还是 AI 推断。
89
108
 
90
109
  ## 3. Owner 与新 Agent 确认名片信息
91
110
 
@@ -115,7 +134,7 @@ ec agent show helper.agentid.pub
115
134
 
116
135
  Bootstrap 完成前,新 Agent 不处理普通任务,也不执行与本流程无关的工具或命令。如果 Owner 要求跳过、先工作或同时交办普通任务,新 Agent 应说明必须先完成首次设定,并继续确认缺失字段。
117
136
 
118
- ## 4. 新 Agent 修改并发布自己的 agent.md
137
+ ## 4. 新 Agent 修改自己的 agent.md
119
138
 
120
139
  Owner 明确确认最终值后,新 Agent 才能编辑系统提示词中 `agentMdPath` 指向的本地文件,并且:
121
140
 
@@ -123,15 +142,27 @@ Owner 明确确认最终值后,新 Agent 才能编辑系统提示词中 `agent
123
142
  - 保留其他 frontmatter 字段、Markdown 正文和文件结构。
124
143
  - 修改后检查 YAML 合法,且三个字段满足上述格式要求。
125
144
 
126
- 然后由新 Agent 使用自己的 AID 签名并发布:
145
+ ## 5. 生成并确认 Bootstrap Welcome
146
+
147
+ 名片字段确认后,新 Agent 在当前 Bootstrap 对话中直接输出完整的个性化 welcome 文案,并请求 Owner 明确确认。
148
+ Owner 要求修改时,重新输出完整文案并再次确认;未确认的文本不写入文件,也不创建草稿。Owner 明确确认后执行:
149
+
150
+ ```bash
151
+ ec agent welcome --text '<最后展示且确认的完整文案>'
152
+ ```
153
+
154
+ 该命令固定保存到 `$PERSONAL_DIR/welcome.md`。保存成功后才能继续发布名片和执行 `ready`。如果 Bootstrap 会话在确认前中断,下一次继续时重新生成并确认。
155
+
156
+ 随后由新 Agent 使用自己的 AID 签名并发布名片:
127
157
 
128
158
  ```bash
129
159
  ec aid agentmd put helper.agentid.pub
130
160
  ```
131
161
 
132
- 只有命令明确成功后才能继续。若发布失败,不得执行 `ready`;应向 Owner 说明具体错误,修正后再继续,不要盲目重复。
162
+ 只有命令明确成功后才能继续。发布失败时保留已经确认的 welcome,修正发布问题后续做,不重复生成。
163
+ 多 Owner 共用该模板;需要称呼时保留 `{{ownerName}}` / `{{ownerAid}}` 供逐人渲染。投递文本不再追加未确认内容。
133
164
 
134
- ## 5. 新 Agent 完成 Bootstrap
165
+ ## 6. 新 Agent 完成 Bootstrap
135
166
 
136
167
  发布成功后,新 Agent 执行整个 Bootstrap 的最后一个操作:
137
168
 
@@ -150,7 +181,7 @@ ec agent ready helper.agentid.pub
150
181
 
151
182
  新 Agent 在 `ready` 成功后不要从旧 Bootstrap 上下文再输出一段完成说明,也不要继续处理先前夹带的普通任务;后续工作从新主会话开始。
152
183
 
153
- ## 6. 创建者验收
184
+ ## 7. 创建者验收
154
185
 
155
186
  ```bash
156
187
  ec agent get helper.agentid.pub lifecycle
@@ -170,9 +201,10 @@ Bootstrap 首条消息只发送给 `owners[0]`;`ready` 成功后,正式欢
170
201
  - `lifecycle` 为 `active`;`ec agent show` 的 `lifecycle` 字段也必须为 `active`。
171
202
  - `agent.md` 已成功签名发布。
172
203
  - 本地与远端 `agent.md` 的 `name`、`description`、`tags` 与 Owner 确认值一致;创建流程 skill 必须在发布后复读核验,不以初始上传响应代替。
204
+ - `personal/welcome.md` 是当前 Bootstrap 对话最后展示并经 Owner 确认的全文,未确认文案没有另存草稿。
173
205
  - 系统已创建新的主会话并发送正式欢迎消息。
174
206
  - 新 Agent 能在新主会话中处理普通任务。
175
207
 
176
208
  如果仍为 `created`,检查 channel 是否已能联系 Owner,必要时由 Owner 主动发送首条消息。如果仍为 `bootstrapping`,回到新 Agent 的 Bootstrap 会话完成字段确认、名片发布和 `ready`,不要由创建者直接绕过引导。
177
209
 
178
- 失败重试前必须先执行状态检查:若本地 `agent.md` 已存在且远端名片已发布,只向该 Agent 发送 `ready`/续做指令,让它在自己的 Bootstrap 会话中完成收尾;不要重复创建、重复改名片或重复发布。仅在确认创建记录不存在且名片未发布时,才重新发起创建。
210
+ 失败重试前必须先执行状态检查:若名片已发布且 welcome 已保存,只续做 `ready`;若 welcome 尚未确认保存,则由新 Agent 在自己的 Bootstrap 对话中补做全文生成和确认。不要重复创建、改名片或发布。仅在确认创建记录不存在且名片未发布时,才重新发起创建。
@@ -23,6 +23,16 @@ ec agent new <aid> --non-interactive \
23
23
  [--tags '<json-array>'] \
24
24
  [--dry-run] [--force]
25
25
 
26
+ # 创建并一次性完成首次设定(隐含 --non-interactive)
27
+ ec agent new <aid> --initialize \
28
+ --project <路径> --baseagent <claude|codex|gemini|ecagent> \
29
+ --owner <aid> --name "<显示名>" --description "<text>" \
30
+ --tags '<json-array>' [--persona-file <path> | --persona-text <text>] \
31
+ [--wait <seconds>] [--dry-run]
32
+
33
+ # 恢复一次性初始化
34
+ ec agent initialize <aid> --resume [--wait <seconds>]
35
+
26
36
  # 启用 / 停用
27
37
  ec agent enable <aid>
28
38
  ec agent disable <aid>
@@ -36,6 +46,10 @@ ec agent persona show
36
46
  ec agent persona --text <text>
37
47
  ec agent persona --file <path>
38
48
 
49
+ # 读取或保存 Bootstrap 中经 Owner 确认的 welcome 文案
50
+ ec agent welcome show
51
+ ec agent welcome --text '<完整 Markdown 文案>'
52
+
39
53
  # 修改 agent.md 显示名称
40
54
  ec agent rename <aid> "<name>"
41
55
 
@@ -59,8 +73,13 @@ ec agent delete <aid> [--purge]
59
73
  - `--dry-run` 只输出最终创建计划,不注册 AID、不写配置、不上传 `agent.md`。
60
74
  - `--force` 覆盖已有 `config.json`;AID 密钥保留。
61
75
  - `--tags` 接受 3 到 6 个标签的 JSON 数组;每个标签只允许 Unicode 字母、数字和连字符(`-`),最长 50 字符。
76
+ - `--initialize` 要求显式提供 `--name`、`--description`、`--tags` 和 Owner;它不从项目元数据推断名片,成功条件是目标 Agent 已进入 `active`。`--initialize` 自动包含 `--non-interactive`,不需要同时填写后者。
77
+ - `--persona-file` / `--persona-text` 可选;两者互斥。初始化失败可用 `ec agent initialize <aid> --resume` 按原计划恢复,不能用普通 `new --force` 覆盖。
62
78
  - `ec agent persona show` 读取当前 Agent 的 `$PERSONAL_DIR/persona.md`;`--text` 或 `--file <path>` 可由当前 Agent 的 owner 写入。文件内容限制为 UTF-8 文本,`--file` 仅接受 `.md`/`.txt`。
79
+ - `ec agent welcome --text <text>` 只用于 Bootstrap 中 Owner 已明确确认的完整文案;命令固定写入当前 Agent 的 `$PERSONAL_DIR/welcome.md`,不接受自定义路径,也不保存未确认草稿。`welcome show` 读取该文件。
80
+ - welcome 托管写入要求当前 Agent 私聊 Owner;admin 仅可读。模板上限 4 KiB,渲染上限 8 KiB;变量为 `agentName`、`agentDescription`、`agentAid`、`agentTags`、`agentTagsText`、`ownerName`、`ownerAid`、`channel`,支持标签循环和真值条件。写入保留原始文本,投递不附加额外文案。
63
81
  - `agent show <target-aid>` 与 `agent get <target-aid> <key>` 的跨 Agent 读取对 owner/admin 开放,但普通 Agent 角色只获得安全摘要;敏感配置值和物理路径仅对 DaemonOwner 返回原值。跨 Agent 写入、启停、删除和 reload 仍遵循各自的目标与 DaemonOwner 权限边界。
82
+ - Agent 配置可包含 `fullaccess.enabled`(默认关闭),仅可通过已认证的 EC Web Agent 设置修改。该开关受 `daemon.json.fullaccess.enabled` 总开关约束;daemon 关闭时 EC Web 隐藏该设置项。实际运行时,只有同时属于该 AgentOwner 和当前 daemonOwner 的直接私聊任务才会按调用使用宿主级 fullaccess;群聊、普通 Owner、跨 Agent 和 Trigger 不会因该开关自动提权。daemon 总开关也控制 `/fa`、`/fullaccess` 和 Fullaccess Trigger。
64
83
 
65
84
  ## 创建 Agent
66
85
 
@@ -68,6 +87,19 @@ ec agent delete <aid> [--purge]
68
87
 
69
88
  完整的创建、Bootstrap、名片发布和验收示例见:`$KITS_DOCS/evolcore/agent-create.md`。
70
89
 
90
+ ## Bootstrap 通知状态与重试
91
+
92
+ 交互式 Bootstrap 的 `ready` 要求有效的 `personal/welcome.md`:缺失返回 `WELCOME_REQUIRED`,损坏返回 `WELCOME_INVALID`,均保持 Bootstrap 状态。已准备 completion outbox 后修改文案返回 `WELCOME_FROZEN`。已有 active Agent 和独立的 `--initialize` 流程不需要补做此确认。
93
+
94
+ `ready` 成功表示 Agent 已进入 `active`;欢迎消息单独返回在 `welcome.deliveries`,每位 Owner 一项:
95
+
96
+ - `sent`:网关已接受,带 `messageId`。后续送达由网关保障。
97
+ - `queued`:已持久化到发件箱,带 `outboxId`;临时故障自动重试,重启后继续恢复。
98
+ - `failed`:永久失败,带错误原因和代码;普通重连或重复 `ready` 不会重新发送。
99
+ - `not_prepared`:没有找到投递记录,不能当作发送成功。
100
+
101
+ 24 小时提示窗口从成功发送计算,待发提示不会因超过窗口而被删除。完成引导后取消尚未发送的首次提示。
102
+
71
103
  ## 头像更新
72
104
 
73
105
  头像上传通过 menu 协议或 `ec aid avatar` 暴露:
@@ -86,7 +118,7 @@ ec agent delete <aid> [--purge]
86
118
 
87
119
  约束:
88
120
  - 规范入口使用 `args.data`(data URL)或 `args.url`(HTTPS URL)二选一;控制面可用顶层 `agent` 或 `args.aid` 选择目标,Agent channel 只能修改当前 self AID。
89
- - 头像参数只属于 `name=aid action=avatar`,不属于 `name=agent action=update` 的 config patch;后者提交 `avatar` 或 `avatar_url` 会返回 `UNSUPPORTED_FIELD`。
121
+ - 新客户端使用 `name=aid action=avatar`。兼容旧版 App 的 `name=agent action=update` + `args.patch.avatar=<data URL>`:头像必须单独提交,复用相同图片校验、上传和名片发布流程,不写入 config.json,成功后同样发布头像更新事件。`patch.avatar_url` 仍不支持。
90
122
  - 支持真实 MIME 为 PNG/JPEG/WebP 的图片;大小不超过 500KB,分辨率为 128–2048 像素,宽高比为 0.8–1.25。
91
123
  - 成功后头像上传到该 agent 自己的 AUN storage,`agent.md` frontmatter 写入 AID 风格 URL,并重新签名发布。
92
124
  - 托管会话中的 CLI 形式为 `ec aid avatar <当前 self AID> (--file <path> | --url <https-url>)`;仅允许 owner 在 `request`/`bypass` 模式下执行。`--file` 只能从项目目录或当前会话 `$TMPDIR` 读取,`--url` 由 daemon 下载并做 SSRF、重定向和大小校验。
@@ -1,6 +1,6 @@
1
1
  # ec aid — AID 身份管理
2
2
 
3
- 管理本地 AID 身份(证书、私钥、agent.md 名片),以及远程探测对端 AID。触发词:身份/证书/名片/探测对端/创建身份。
3
+ 管理本地 AID 身份(证书、私钥、agent.md 名片与头像),以及远程探测对端 AID。触发词:身份/证书/名片/头像/换头像/探测对端/创建身份。
4
4
 
5
5
  ## 运行边界
6
6
 
@@ -17,6 +17,14 @@ ec aid avatar <当前 self AID> (--file <path> | --url <https-url>) [--format js
17
17
 
18
18
  仅允许不带选项的基本形式,或在末尾附加一组完整的 `--format json`;不能使用 `--aun-path`、未知选项、管道、重定向或其它命令。所有 `allowAccess=true` 的已认证角色(包括 visitor、member、admin、owner 及自定义角色)均开放 `lookup` 和 `agentmd get`,目标可以是任意合法 AID。`show` 只允许当前 self AID:owner/admin 返回完整本地身份诊断,visitor/member 及其它非管理角色返回不含私钥存在性、密钥匹配和签名能力的脱敏结果。三个查询可在所有 `permissionMode` 执行。`agentmd put` 和 `avatar` 会发布远端名片,属于写操作,仅允许针对当前 self AID 的 `request`、`bypass`,`readonly`、`auto` 和未知模式均拒绝。头像支持 PNG、JPEG、WebP,大小上限 500KB,分辨率 128–2048 像素,宽高比 0.8–1.25;`--url` 仅支持 HTTPS,下载由 daemon 执行并做 SSRF/重定向校验。成功 JSON 返回 `sha256`、MIME 和尺寸元数据。`lookup` 探测指定公开 AID;`get` 下载并验签指定公开名片,同时刷新本地 AID 缓存。`list`、其它 AID 的 `show/agentmd put/avatar` 以及 `new/delete` 均拒绝。独立终端不受此托管会话限制。
19
19
 
20
+ ## 更换头像
21
+
22
+ `ec aid avatar <当前 self AID> --file <图片路径>` 从本地文件上传;`ec aid avatar <当前 self AID> --url <HTTPS 图片地址>` 下载图片后上传。两种来源必须二选一,可在末尾加 `--format json` 获取头像 URL、SHA-256、MIME 和尺寸。
23
+
24
+ 托管会话中的本地图片必须位于当前会话项目目录或本会话的托管 `$TMPDIR`;相对路径以会话项目目录为基准。不能读取受保护的 EvolCore 路径、符号链接,或托管临时目录中的硬链接。
25
+
26
+ 上传复用 menu 的头像处理流程:校验图片、上传到 AUN storage、更新并发布 `agent.md` 的 `avatar` 字段,成功后发出 `agent:avatar_updated` 事件。无需手动修改名片或再次执行 `agentmd put`。托管 Agent 只能修改自身头像,仍需通过角色与命令授权检查。
27
+
20
28
  ## 子命令
21
29
 
22
30
  ```bash
@@ -10,7 +10,8 @@
10
10
  ```bash
11
11
  # 读 effective 值(显示覆盖链来源);可一次传多个字段批量读取(共享同一 selector/--format)
12
12
  ec config get <field> [<field> ...] [--self <aid>] [--peer <X>] [--default] [--process]
13
- # 单字段输出不变;多字段时 text 每行一条、json 返回 { ok, results: [...] },任一字段失败退出码为 1
13
+ # 单字段输出不变;多字段时 text 每行一条、json 返回 { ok, results: [...] }。
14
+ # 不支持的 runner 字段会保留逐字段 UNSUPPORTED_FIELD,但不阻断同批支持字段;其它失败退出码为 1
14
15
 
15
16
  # 写参数:scope 由 selector 推断
16
17
  ec config set <field> <value> [--self <aid>] [--peer <X>] [--default] [--process]
@@ -132,6 +133,31 @@ defaults → agent/config → relation/config
132
133
 
133
134
  ConfigManager 只合并上述物理层并返回物理来源。角色策略不进入配置合并链:`permissionMode` 和 `baseagents.*.model` 由消费方按当前角色单独应用。
134
135
 
136
+ ### Codex 用户提问
137
+
138
+ `baseagents.codex.enableRequestUserInput` 已纳入 defaults → agent → relation 覆盖链,默认 `true`。
139
+ 它控制 Codex **Default 模式的阻塞式 `request_user_input`**,对应 App Server 的
140
+ `item/tool/requestUserInput` 请求和 `default_mode_request_user_input` feature。
141
+ 新 turn 会把有效值写入原 Codex thread 的配置;不需要另建线程。
142
+
143
+ ```bash
144
+ ec config get baseagents.codex.enableRequestUserInput --self bot.agentid.pub
145
+ ec config set baseagents.codex.enableRequestUserInput true --self bot.agentid.pub
146
+ ec config set baseagents.codex.enableRequestUserInput false \
147
+ --self bot.agentid.pub --peer aun#alice.agentid.pub
148
+ ```
149
+
150
+ 该字段不是权限审批或 `request_user_input_async` 的关闭开关。异步问题由
151
+ `agentMessage.questions` 事件自动映射为可回答卡片,允许选择选项或自由输入;
152
+ Agent 可继续处理不依赖答案的工作。回答通过 Codex 原生 question-reply envelope
153
+ 提交:活动 turn 使用 `turn/steer`,已结束则通过持久队列恢复同一 Session 和 Codex thread。
154
+ 问题默认保留 24 小时,重启后恢复未回答卡片;会话绑定或授权变化后拒绝旧卡片回答。
155
+ 提交结果不明时不自动重发,避免重复回答。
156
+
157
+ 支持卡片的客户端沿用 `action_card` / `action_card_reply`,自由输入沿用 `compose`。
158
+ 命令入口为 `/ask <问题ID> <回答>`;只有一个待回答问题时也可 `/ask <选项编号或回答>`。
159
+ 不需要新增 async 开关,也不需要把异步问题当成普通聊天文本转发给 Agent。
160
+
135
161
  ### Agent 消息准入策略
136
162
 
137
163
  消息准入策略保存在 `agents/<aid>/config.json` 的 `access` 字段,但它是 Agent 自身的安全边界,
@@ -177,12 +203,25 @@ ec config unset groupRules.mode \
177
203
 
178
204
  ## 权限控制
179
205
 
206
+ **指定关系读取**:Menu CLI 和托管 `config get` 中,实际 owner/admin 可显式使用
207
+ `--self <当前 Agent> --peer <目标关系>` 读取当前 Agent 的其他关系配置。admin 的命令授权、
208
+ 字段白名单和 `currentRelationOnly` 等限制继续生效;member/visitor 仍只允许当前关系。
209
+ 该能力只放开单字段或批量 `get`,不会放开普通 `set/unset`、`show/effective`,也不允许借关系 selector 跨 Agent。
210
+ peerKey 会规范化;读取不存在的关系仍按已有规则回落到上级配置并返回说明,不创建关系或修改授权。
211
+
212
+ **批量兼容性**:未实现 runner 的行为字段(如 `baseagents.hermes.model/effort`)返回
213
+ `{ ok: false, field, code: "UNSUPPORTED_FIELD", error }`。批量请求若只有这类兼容缺项,
214
+ 顶层 `ok=true`、退出码 0,其他有效字段照常返回;调用方应逐项检查 `results[].ok`。
215
+ 单独查询不支持字段仍失败(CLI 退出码 1,Menu 顶层错误归一化为 `NOT_SUPPORTED`)。
216
+ Menu 批量请求遇到真实权限拒绝仍整体拒绝并停止执行,不会把权限错误降级为兼容缺项。
217
+
180
218
  **写权限**(API 层判定):
181
219
  - **通用可写字段**:active_baseagent / baseagents / chatmode / show_activities / flush_delay / debounce / render
182
220
  - **角色专用入口**:`roles/index.json` 与 `roles/{roleId}.json` 由角色服务维护;relation 的
183
221
  `role` 由角色分配服务维护;`permissionMode` 仅在角色策略中维护
184
222
  - **兼容字段**:`enable_rich_content` 仍可读取旧值,但已废弃且不再产生运行时效果
185
223
  - **群规则策略**:`groupRules.mode` 仅当前 Agent 的实际 owner 可 set/unset;DaemonOwner 不继承群或 relation 写权限,其他角色可读取当前 relation 的有效值
224
+ - **Agent fullaccess 策略**:Agent 配置中的 `fullaccess.enabled` 缺失时关闭,仅可通过已认证的 EC Web Agent 设置修改;CLI、普通 Menu 和托管任务的 set/unset 均拒绝。该开关受 `daemon.json.fullaccess.enabled` 总开关约束;daemon 关闭时 EC Web 隐藏该项且开启请求被拒绝。双 Owner(AgentOwner + daemonOwner)条件在实际私聊任务执行时校验。
186
225
  - **源码诊断白名单**:`readonlySourceDiagnostics` 默认关闭;开启后只读会话仅可在项目源码目录执行受限、可证明只读查询,配置/证书/快照/session/锁文件仍禁止访问
187
226
  - **仅人可写**:channels / owners / admins / 凭证 / aid / enabled / projects / aun / models.allowed
188
227
  - Agent 托管环境写仅人字段被拒
@@ -52,7 +52,7 @@ ec group create coordinator.agentid.pub "Project Alpha 协作" \
52
52
  --join-mode invite_only
53
53
  ```
54
54
 
55
- 创建成功后,以响应中的 `group.group_id` 作为后续唯一群 ID。不要根据群名称自行猜测群 ID;规范群 ID 通常是 `g-{slug}.issuer-domain`。
55
+ 创建成功后,以响应中的 `group.group_aid`(兼容字段为 `group.group_id`)作为后续唯一群 AID。不要根据显示名称猜测群 AID。默认创建的名称为 `g-` 加五位数字,例如 `g-12345.agentid.cn`;自定义的 `ontology.agentid.cn` 也是合法群 AID。若返回 `warning`,仍使用实际返回的群 AID。
56
56
 
57
57
  立即检查群详情:
58
58
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  以自己的 AID 为发送者(`<from>`),群 AID 为 `<group-id>`。
6
6
 
7
- 本命令覆盖常用消息、基础生命周期、成员操作、角色/群主管理、封禁、暂停/恢复和群规则。生产环境 agent 优先使用本页列出的 `ec group` 命令。
7
+ 本命令覆盖常用消息、基础生命周期、成员操作、角色/群主管理、封禁、屏蔽、成员状态、暂停/恢复和群规则。生产环境 agent 优先使用本页列出的 `ec group` 命令。
8
8
 
9
9
  需要发起一次完整的 Agent 群聊协作时,按场景流程阅读 `group-collaboration.md`;本文只作为命令参数参考。
10
10
 
@@ -20,6 +20,10 @@ ec group send <from> <group-id> --file <path> --return none|required [--as <type
20
20
  # 自定义 payload
21
21
  ec group send <from> <group-id> --payload '<json>' --return none|required
22
22
 
23
+ # 查询本地群历史(不调用 Gateway,不推进 group pull/ack 游标)
24
+ ec group history <from> <group-id> --unread [--limit <N>] [--thread <id>] [--format json]
25
+ ec group history <from> <group-id> --all [--limit <N>] [--thread <id>] [--format json]
26
+
23
27
  # 拉取群消息(建议带 --app 独立消费通道,避免影响 daemon)
24
28
  ec group pull <from> <group-id> [--after-seq <N>] [--limit <N>] [--app <name>]
25
29
 
@@ -48,12 +52,52 @@ ec group send <from> <group-id> "通知" --mention alice.agentid.pub,bob.agentid
48
52
  - `--content-type <mime>`:覆盖文件 MIME
49
53
  - `--transcript <text>`:语音转写,仅 `--as voice`
50
54
 
55
+ ## 本地群历史
56
+
57
+ `history` 读取本机的 `messages.jsonl`,不连接 Gateway,不改变 `group pull/ack` 游标。
58
+ 这里的自动已读只记录本地历史查询进度;`group pull` / `group ack` 仍是独立的 Gateway 消费游标命令,二者互不替代。
59
+ 查询必须显式指定 `--unread` 或 `--all`;首次没有日志时返回空结果,不创建模型会话。
60
+
61
+ | 选项 | 含义 |
62
+ |---|---|
63
+ | `--unread` | 最早的未读群背景,按本地记录顺序输出,并自动记录本页已读 |
64
+ | `--all` | 最近的群会话历史,包含没有未读标记的旧日志及出站消息 |
65
+ | `--limit N` | 默认 50,范围 1–500;单页另有 24 KiB 消息预算 |
66
+ | `--thread main\|all\|id` | 无话题、整个群或指定话题;当前群任务默认继承当前话题,其他调用默认 all |
67
+ | `--direction in\|out\|all` | 方向过滤,默认 all |
68
+ | `--before/--after time` | 接收时间开区间,支持 epoch 毫秒和 ISO 时间 |
69
+ | `--format text\|json` | 默认 text |
70
+ | `--message msg-id` | 配合 --all 查询指定消息正文,不改变已读状态 |
71
+ | `--offset bytes` | 配合 --message 从返回的 next_offset 继续读取长正文 |
72
+
73
+ `--unread` 会把本次返回的消息自动记为已读,再次执行即可取得下一页,无需额外确认。
74
+ 查询期间新到的消息、未返回条目及其他筛选范围的消息不会被清除。`--all` 始终只浏览、不改变已读状态。
75
+ `has_more` 表示本次还有匹配内容,普通 `--all` 可用时间/话题进一步缩小范围。
76
+
77
+ 长正文以 `content_truncated` 标识;预览返回后该消息也记为已读,需要完整内容时使用
78
+ `--all --message <msg-id> --offset <next_offset>` 继续读取。偏移为 UTF-8 字节边界,每段最多 8 KiB。
79
+ 附件返回已有类型、名称或转写摘要,不自动下载。已读不会删除历史,随时可用 `--all` 回看。
80
+
81
+ 受管执行通过 `group.op` 和 delegation 授权;member 限当前 Agent 的当前 AUN 群,
82
+ owner/admin 按 Agent 管理范围查询其他群;visitor 默认拒绝。读取时的已读记录由服务内部维护。
83
+ 不支持 `--app`、`--aun-path` 或自选历史文件路径。
84
+
85
+ 旧记录仍可用 `--all` 查询;精确未读统计从新增的本地过滤标记开始,不根据缺少 sessionId 猜测。
86
+ 已读状态独立存储,重启、renew、切模型不会清空;历史只包含本机收到并记录的会话内容。
87
+
51
88
  ## 群管理
52
89
 
53
90
  ```bash
54
91
  # 创建群
55
92
  ec group create <from> "<name>" [--visibility public|private] [--description "<desc>"] [--join-mode <mode>] [--group-id <aid>]
56
93
 
94
+ # 不指定 --group-id 时,默认名称为 g- 加五位随机数字(10000–99999)
95
+ # 例如返回 g-12345.agentid.cn;issuer 以群服务实际返回为准
96
+ ec group create <from> "研讨群" --visibility private
97
+
98
+ # 自定义群 AID;g- 若出现,是名称的一部分,会完整保留
99
+ ec group create <from> "本体研讨" --group-id ontology.agentid.cn
100
+
57
101
  # 列出我加入的群
58
102
  ec group list <from> [--size <N>]
59
103
 
@@ -92,6 +136,45 @@ ec group rules <from> <group-id> publish
92
136
 
93
137
  搜索公开群、公开信息查询、群统计等高级能力当前未封装为 `ec group` 子命令。
94
138
 
139
+ ## 收到群邀请:Owner 审核
140
+
141
+ Agent 的 AUN 主渠道收到定向邀请后,由 daemon 查询待处理邀请并向当前 `owners[]` 的每位 Owner
142
+ 发送加密私聊卡片。卡片提供“接受入群”和“拒绝邀请”;收到邀请不会自动加入,也不启动模型。
143
+ 接受/拒绝操作先记录决定,再查询当前邀请并调用 SDK,最终结果另行通知 Owner。
144
+
145
+ Owner 可以在与该 Agent 的 AUN 私聊中直接输入以下命令(不经过模型):
146
+
147
+ ```text
148
+ /invites
149
+ /invites 2
150
+ /invites <审核编号> open
151
+ /invites <审核编号> accept
152
+ /invites <审核编号> reject
153
+ ```
154
+
155
+ 列表每页 10 条,显示审核编号和状态。`open` 重新发送当前 Owner 的卡片;审核编号由列表返回,
156
+ 不同于 Gateway 的 invite ID。卡片默认有效 24 小时;忽略、关闭或过期均不拒绝邀请。
157
+ 多 Owner 同时操作时,第一个成功落盘的决定锁定本轮;其余点击不能提交相反决定。
158
+
159
+ 邀请、决定与投递记录持久化。重启后旧卡失效,对账仍为待审核时发新卡;没有 Owner 或发送失败时
160
+ 保留邀请。请求超时后保留原决定并核实结果,期间不开放相反操作。未加入事实无法确认时显示“正在核实结果”,
161
+ 不能仅因邀请从列表消失就断言已拒绝。
162
+
163
+ 也可使用邀请 RPC 命令:
164
+
165
+ ```bash
166
+ ec group invites <from> [--page N] [--size N]
167
+ ec group accept-invite <from> <invite-id>
168
+ ec group reject-invite <from> <invite-id>
169
+ ec group revoke-invite <from> <invite-id>
170
+ ```
171
+
172
+ 托管会话的 `accept-invite/reject-invite` 仅允许当前 Agent Owner 在 AUN 私聊中执行,并进入同一持久化审核服务;
173
+ admin、普通成员或仅具 daemon-owner 身份者不能代替该 Agent Owner。宿主直接运行的独立 CLI 保留原 RPC 路径,
174
+ 外部客户端造成的状态变化通过后续对账识别。`revoke-invite` 是原邀请者撤回自己发出的邀请。
175
+
176
+ 接受后沿用 SDK 的成员/密钥同步,以及现有群消息、群规则和 mentionMode 策略;不自动发送入群欢迎消息。
177
+
95
178
  ## 成员
96
179
 
97
180
  ```bash
@@ -127,8 +210,34 @@ ec group ban <from> <group-id> <member-aid> [--duration <seconds>]
127
210
 
128
211
  # 解封成员
129
212
  ec group unban <from> <group-id> <member-aid>
213
+
214
+ # 屏蔽成员接收群消息;member-aid 填 from 即屏蔽自己
215
+ ec group block <from> <group-id> <member-aid> [--reason "<reason>"]
216
+
217
+ # 取消屏蔽
218
+ ec group unblock <from> <group-id> <member-aid>
219
+
220
+ # 查看屏蔽列表(群管理员)
221
+ ec group blocklist <from> <group-id>
222
+
223
+ # 显式上报自己的群内状态;两项均必填,值为字符串
224
+ ec group report-status <from> <group-id> --online-status online --work-status busy
225
+
226
+ # 查看群成员上报状态(包括未上报的成员)
227
+ ec group member-statuses <from> <group-id>
130
228
  ```
131
229
 
230
+ 屏蔽与封禁互相独立:`block` 停止接收实时/离线 Push、Pull 和 E2EE wrap,但不影响发送;
231
+ `ban` 禁止发送但不影响接收。群成员可屏蔽/取消屏蔽自己;群 owner/admin 可在其权限范围内操作其他成员并查看屏蔽列表。
232
+
233
+ `report-status` 只更新 `<from>` 自己在指定群内的状态,不接受其他成员参数;不会启动定时心跳。
234
+ `member-statuses` 返回群成员主动上报的状态,`online` 仍查询 Gateway 在线连接索引。
235
+ 服务端维护的更新时间、最后发言时间与 payload 类型保留在 `--format json` 结果中。
236
+
237
+ 托管任务还须通过 Core 关系权限:member 只能在当前 AUN 群中操作当前 Agent 的自身屏蔽/状态及查询成员状态;
238
+ 操作他人和查询屏蔽列表需要 Core owner/admin,随后仍由 Gateway 校验该 Agent 的群内权限。
239
+ visitor 不开放这五个命令;托管调用不允许替换 `<from>`、`--app` 或 `--aun-path`。
240
+
132
241
  ## 入群与公告
133
242
 
134
243
  当前 CLI 封装了 `join` 和 `rules`。审批申请、邀请码、公告等高级管理能力第一批暂不提供单独命令。
@@ -141,11 +250,17 @@ ec group unban <from> <group-id> <member-aid>
141
250
  - `--aun-path <path>` — 指定 AUN keystore 根
142
251
  - `--encrypt` — 仅 send,启用端到端加密(群聊默认明文)
143
252
  - `create` 会通过 SDK 自动生成并导入群 `group_aid` 身份。
253
+ - 默认群名遇到明确的身份占用错误时最多尝试 5 次;显式指定的名称不会自动更换,超时或身份导入失败也不会换名重建。
254
+ - 创建结果以服务端返回的 `group_aid` 为准;与请求不一致时输出提示,JSON 结果包含 `warning` 和 `requested_group_aid`。
144
255
  - `owner` 会走 SDK 的群主转让授权签名流程,需要本机有该群 `group_aid` 的私钥;若网关返回 `pending_rekey`,CLI 会在本机存在新群主私钥时自动调用完成步骤,否则输出“已发起,等待新群主完成 rekey”。
145
256
 
146
257
  ## Group ID
147
258
 
148
- AUN Group 协议当前规范使用 `g-{slug}.issuer-domain` canonical 群 ID;也可输入本域简写 `g-{slug}` 或兼容写法 `g-{slug}@issuer-domain`。历史 EvolCore 会话里可能还有 `group.agentid.pub/11718` 这类旧格式,看到时按已有群 ID 原样使用。
259
+ AUN 群 AID 使用 `{base}.{issuer}`,例如 `ontology.agentid.cn`、`g-12345.agentid.cn`、`11824.agentid.pub`。base 为 4–64 位,首字符为小写字母或数字,后续可包含小写字母、数字、下划线和连字符。`g-` 是 EvolCore 默认建群的命名约定,不是判断一个 AID 是否属于群的协议标志。
260
+
261
+ 群命令支持完整 AID 和本域 base 简写;简写按发送方 AID 的 issuer 补全。完整 AID 中的 issuer 和 base 会保留(统一小写),不会删除 `g-`。`group.{issuer}/{base}` 已停止支持,不会自动转换;`base@issuer` 也不支持,两者均明确报错。请直接使用群服务返回的 `{base}.{issuer}`。群文件路径应提供完整群 AID,如 `ontology.agentid.cn:/rules.md`。
262
+
263
+ 普通主体与群的 AID 格式可以相同。格式校验只检查参数是否合法,当前群限制、身份和权限校验仍由托管会话与服务端执行。
149
264
 
150
265
  ## 自主回复策略
151
266