evolcore 0.0.32 → 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 (214) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/bin/ec.js +3 -2
  3. package/bin/install-codex-managed-hooks.mjs +135 -37
  4. package/dist/agents/baseagent-availability.js +20 -36
  5. package/dist/agents/claude-runner.js +111 -15
  6. package/dist/agents/codex/app-server-client.js +3 -0
  7. package/dist/agents/codex/diagnostics.js +112 -54
  8. package/dist/agents/codex-runner.js +241 -63
  9. package/dist/agents/ecagent-runner.js +78 -33
  10. package/dist/agents/runner-types.js +5 -6
  11. package/dist/aun/aid/identity.js +1 -1
  12. package/dist/aun/group/operations.js +0 -1
  13. package/dist/aun/msg/history.js +1 -0
  14. package/dist/aun/msg/p2p.js +0 -1
  15. package/dist/aun/outbox.js +50 -1
  16. package/dist/channels/aun.js +44 -8
  17. package/dist/channels/daemon.js +261 -3
  18. package/dist/cli/agent-command.js +58 -24
  19. package/dist/cli/agent.js +1 -1
  20. package/dist/cli/aun-commands.js +368 -31
  21. package/dist/cli/contact.js +8 -2
  22. package/dist/cli/ctl-command.js +3 -1
  23. package/dist/cli/daemon-commands.js +197 -27
  24. package/dist/cli/debug-mode.js +154 -0
  25. package/dist/cli/fs-command.js +2 -1
  26. package/dist/cli/handoff-command.js +3 -0
  27. package/dist/cli/index.js +98 -67
  28. package/dist/cli/init.js +2 -2
  29. package/dist/cli/integrity-command.js +196 -0
  30. package/dist/cli/managed-command-guard.js +5 -0
  31. package/dist/cli/memory-command.js +166 -146
  32. package/dist/cli/queue-command.js +9 -4
  33. package/dist/cli/session-command.js +194 -0
  34. package/dist/cli/skill-command.js +78 -2
  35. package/dist/cli/task-context.js +1 -0
  36. package/dist/cli/thread-command.js +622 -0
  37. package/dist/cli/trigger-command.js +10 -3
  38. package/dist/config/builtin-roles.js +1 -0
  39. package/dist/config/config-field-policy.js +6 -3
  40. package/dist/config/config-manager.js +26 -2
  41. package/dist/config/contact-book-store.js +5 -0
  42. package/dist/config/resolved-config-op.js +3 -0
  43. package/dist/config/role-service.js +13 -0
  44. package/dist/config/runtime-env.js +16 -0
  45. package/dist/config-store.js +45 -0
  46. package/dist/core/audit/log-integrity.js +3 -1
  47. package/dist/core/auth/agent-delegation.js +133 -36
  48. package/dist/core/auth/debug-context.js +139 -0
  49. package/dist/core/auth/delegation-diagnostics.js +414 -0
  50. package/dist/core/auth/operation-authorizer.js +25 -2
  51. package/dist/core/auth/operation-catalog.js +49 -0
  52. package/dist/core/background-session/session-cleanup.js +212 -0
  53. package/dist/core/background-session/types.js +10 -0
  54. package/dist/core/bootstrap-messages.js +1 -1
  55. package/dist/core/bootstrap-service.js +6 -3
  56. package/dist/core/command/agent-control.js +18 -26
  57. package/dist/core/command/command-handler.js +197 -27
  58. package/dist/core/command/daemon-diagnostics.js +1 -0
  59. package/dist/core/command/memory-slash.js +6 -2
  60. package/dist/core/command/menu-catalog.js +51 -1
  61. package/dist/core/command/menu-handler.js +114 -23
  62. package/dist/core/command/menu-protocol.js +25 -1
  63. package/dist/core/command/skill-slash.js +322 -0
  64. package/dist/core/command/slash-gate.js +6 -4
  65. package/dist/core/command/slash-handler.js +195 -13
  66. package/dist/core/command/topic-slash.js +528 -0
  67. package/dist/core/daemon-bootstrap.js +4 -7
  68. package/dist/core/evolagent-registry.js +20 -5
  69. package/dist/core/file-integrity/read.js +61 -0
  70. package/dist/core/file-integrity/store.js +262 -0
  71. package/dist/core/handoff/runtime.js +5 -11
  72. package/dist/core/handoff/store.js +5 -0
  73. package/dist/core/ipc-registration.js +175 -3
  74. package/dist/core/memory/batch-meta.js +132 -0
  75. package/dist/core/memory/consolidation-context.js +83 -29
  76. package/dist/core/memory/consolidation-ops-records.js +49 -16
  77. package/dist/core/memory/consolidation-queue-format.js +21 -0
  78. package/dist/core/memory/consolidation.js +264 -205
  79. package/dist/core/memory/index-manager.js +19 -28
  80. package/dist/core/memory/memory-admin.js +19 -14
  81. package/dist/core/memory/memory-document.js +53 -9
  82. package/dist/core/memory/memory-writer.js +30 -15
  83. package/dist/core/message/aun-ipc-sender.js +161 -6
  84. package/dist/core/message/im-renderer.js +169 -10
  85. package/dist/core/message/message-bridge.js +15 -4
  86. package/dist/core/message/message-log.js +1 -0
  87. package/dist/core/message/peer-mode.js +6 -1
  88. package/dist/core/message/response-engine.js +929 -110
  89. package/dist/core/message/subtask-tool-projection.js +140 -0
  90. package/dist/core/model/catalog-service.js +17 -12
  91. package/dist/core/permission/ec-command-parser.js +217 -9
  92. package/dist/core/permission/protected-paths.js +5 -1
  93. package/dist/core/permission/readonly-shell-query.js +43 -5
  94. package/dist/core/permission/session-path-grants.js +334 -0
  95. package/dist/core/permission/tool-canonical.js +226 -0
  96. package/dist/core/permission/tool-policy.js +30 -62
  97. package/dist/core/role/runtime-policy.js +21 -10
  98. package/dist/core/session/session-fs-store.js +123 -8
  99. package/dist/core/session/session-idle-monitor.js +249 -22
  100. package/dist/core/session/session-manager.js +129 -14
  101. package/dist/core/skill/command-parser.js +13 -0
  102. package/dist/core/skill/index-generator.js +21 -4
  103. package/dist/core/skill/startup.js +41 -0
  104. package/dist/core/skill/switch-resolver.js +55 -29
  105. package/dist/core/system-session/grants.js +40 -0
  106. package/dist/core/system-session/memory.js +222 -0
  107. package/dist/core/system-session/registry.js +74 -0
  108. package/dist/core/system-session/types.js +14 -0
  109. package/dist/core/thread/command-parser.js +125 -0
  110. package/dist/core/thread/index.js +1 -0
  111. package/dist/core/thread/ipc-operation.js +95 -0
  112. package/dist/core/thread/thread-context-storage.js +131 -0
  113. package/dist/core/thread/thread-operation.js +258 -0
  114. package/dist/core/thread/thread-route.js +33 -0
  115. package/dist/core/thread/thread-service.js +770 -0
  116. package/dist/core/thread/types.js +1 -0
  117. package/dist/eck/kit-renderer.js +7 -2
  118. package/dist/eck/manifest-engine.js +24 -4
  119. package/dist/eck/message-renderer.js +35 -0
  120. package/dist/index.js +19 -7
  121. package/dist/ipc.js +140 -50
  122. package/dist/paths.js +93 -0
  123. package/dist/response-system/engines/v1/proactive-flow.js +169 -80
  124. package/dist/stats/billing.js +20 -8
  125. package/dist/trigger/authorization.js +57 -28
  126. package/dist/trigger/feedback.js +13 -2
  127. package/dist/trigger/parser.js +70 -1
  128. package/dist/trigger/system-definitions.js +3 -3
  129. package/dist/trigger/validation.js +14 -0
  130. package/dist/utils/cross-platform.js +11 -2
  131. package/dist/utils/error-dict.json +18 -4
  132. package/dist/utils/error-utils.js +143 -1
  133. package/dist/utils/instance-registry.js +13 -8
  134. package/dist/utils/log-writer.js +12 -0
  135. package/dist/utils/process-introspect.js +11 -0
  136. package/kits/docs/context-assembly.md +1 -1
  137. package/kits/docs/evolcore/INDEX.md +1 -0
  138. package/kits/docs/evolcore/agent-create.md +40 -28
  139. package/kits/docs/evolcore/agent.md +21 -6
  140. package/kits/docs/evolcore/config.md +2 -2
  141. package/kits/docs/evolcore/ctl.md +2 -2
  142. package/kits/docs/evolcore/ec-capabilities.md +5 -1
  143. package/kits/docs/evolcore/fs-architecture.md +4 -5
  144. package/kits/docs/evolcore/fs.md +1 -1
  145. package/kits/docs/evolcore/group-collaboration.md +4 -6
  146. package/kits/docs/evolcore/group.md +11 -12
  147. package/kits/docs/evolcore/memory-architecture.md +4 -5
  148. package/kits/docs/evolcore/memory-consolidation.md +19 -15
  149. package/kits/docs/evolcore/memory-tags.md +3 -1
  150. package/kits/docs/evolcore/memory.md +24 -12
  151. package/kits/docs/evolcore/menu-exec-schema-commands.md +2 -2
  152. package/kits/docs/evolcore/menu-protocol.md +7 -0
  153. package/kits/docs/evolcore/model.md +16 -0
  154. package/kits/docs/evolcore/msg.md +8 -11
  155. package/kits/docs/evolcore/thread-chain.md +267 -0
  156. package/kits/docs/prompt-loading-architecture.md +1 -1
  157. package/kits/eck_manifest.json +55 -40
  158. package/kits/eck_manifest.memory.json +0 -12
  159. package/kits/eck_message_manifest.json +169 -10
  160. package/kits/rules/01-overview.md +11 -0
  161. package/kits/rules/03-identity.md +6 -3
  162. package/kits/rules/05-venue.md +1 -1
  163. package/kits/rules/06-channel.md +1 -1
  164. package/kits/rules/07-memory-and-thread.md +199 -0
  165. package/kits/schemas/_meta.json +7 -1
  166. package/kits/schemas/agent-config.schema.13.json +1 -1
  167. package/kits/schemas/daemon.schema.7.json +140 -0
  168. package/kits/schemas/relation-config.schema.9.json +18 -3
  169. package/kits/schemas/role-config.schema.1.json +6 -6
  170. package/kits/schemas/single-session.schema.1.json +6 -6
  171. package/kits/schemas/single-session.schema.2.json +6 -6
  172. package/kits/schemas/single-session.schema.3.json +6 -6
  173. package/kits/skills/.switches.json +12 -1
  174. package/kits/skills/ec-group/SKILL.md +234 -0
  175. package/kits/skills/ec-skill/SKILL.md +10 -1
  176. package/kits/skills/ec-skill/scripts/cli.mjs +16 -2
  177. package/kits/skills/ec-skill/scripts/skill.mjs +1 -1
  178. package/kits/skills/scrapling-article-fetch/SKILL.md +128 -0
  179. package/kits/skills/scrapling-article-fetch/scripts/check_python_env.py +54 -0
  180. package/kits/skills/scrapling-article-fetch/scripts/render_markdown_reply.py +35 -0
  181. package/kits/skills/scrapling-article-fetch/scripts/run_pipeline.sh +16 -0
  182. package/kits/skills/scrapling-article-fetch/scripts/scrapling_fetch.py +344 -0
  183. package/kits/skills/thread-ops/SKILL.md +492 -0
  184. package/kits/skills/wechat-article-media-download/SKILL.md +65 -0
  185. package/kits/skills/wechat-article-media-download/scripts/download.py +163 -0
  186. package/kits/skills/wechat-article-reader/SKILL.md +97 -0
  187. package/kits/skills/wechat-article-reader/scripts/fetch.mjs +256 -0
  188. package/kits/templates/bootstrap-welcome.md +7 -7
  189. package/kits/templates/memory-consolidation/forget.md +7 -2
  190. package/kits/templates/memory-consolidation/generalize.md +9 -4
  191. package/kits/templates/memory-consolidation/notes.md +11 -11
  192. package/kits/templates/memory-consolidation/profile.md +8 -3
  193. package/kits/templates/memory-consolidation/promote.md +8 -3
  194. package/kits/templates/memory-consolidation/workflow.md +6 -6
  195. package/kits/templates/message-fragments/handoff-request-to-target.md +1 -1
  196. package/kits/templates/message-fragments/item.md +2 -1
  197. package/kits/templates/message-fragments/thread-context.md +6 -0
  198. package/kits/templates/message-fragments/trigger-session.md +2 -0
  199. package/kits/templates/message-fragments/trigger-thread-check.md +2 -0
  200. package/kits/templates/roles/member.json +2 -0
  201. package/kits/templates/roles/visitor.json +2 -0
  202. package/kits/templates/system-fragments/bootstrap.md +67 -72
  203. package/kits/templates/system-fragments/channel.md +3 -6
  204. package/kits/templates/system-fragments/commands.md +1 -0
  205. package/kits/templates/system-fragments/managed-runtime.md +15 -0
  206. package/kits/templates/system-fragments/memory.md +16 -9
  207. package/kits/templates/system-fragments/reply.md +7 -6
  208. package/kits/templates/system-fragments/session.md +5 -14
  209. package/package.json +6 -3
  210. package/dist/core/memory/memory-session-policy.js +0 -41
  211. package/dist/core/memory/memory-signature.js +0 -257
  212. package/kits/docs/evolcore/group-fs.md +0 -17
  213. package/kits/docs/venues/aun-group.md +0 -45
  214. package/kits/docs/venues/group.md +0 -43
@@ -12,15 +12,20 @@
12
12
 
13
13
  **按需读正文**:某条描述太简、拿不准它具体是什么意思时,再读那一条 consolidated 文件。**不要逐条读所有正文。**
14
14
 
15
+ | 来源 | 位置 | 说明 |
16
+ |---|---|---|
17
+ | 已有记忆 | 该关系作用域的 `MEMORY.md` 索引 | 归纳画像的主要来源 |
18
+ | 对话历史 | 上下文文件里列出的 `threads/` 快照文件(若有) | 上次本模式整理以来的增量对话,辅助判断画像是否需要更新;无增量时为空,可忽略 |
19
+
15
20
  ## 产出
16
21
 
17
22
  一条带 `profile` 标签的 **relation 级**记忆,且**一个关系只能有一条**。
18
23
 
19
24
  ```bash
20
25
  ec memory create --scope relation --slug profile \
21
- --desc "对端画像:沟通风格与协作习惯" \
22
- --tags "profile,long-term" --keywords "画像" \
23
- --replaces "consolidated/profile.md" \
26
+ --desc '对端画像:沟通风格与协作习惯' \
27
+ --tags 'profile,long-term' --keywords '画像' \
28
+ --replaces 'consolidated/profile.md' \
24
29
  "(画像正文)"
25
30
  ```
26
31
 
@@ -10,6 +10,11 @@
10
10
 
11
11
  上下文文件里列出的候选:关系级记忆里带 `to-promote` 标签的条目。**候选只给路径 + 描述**,先只读描述判断;某条描述太简、拿不准的,再读那一条正文。
12
12
 
13
+ | 来源 | 位置 | 说明 |
14
+ |---|---|---|
15
+ | 候选记忆 | 上下文文件里列出的候选清单 | 关系级 consolidated/ 里带 `to-promote` 的条目,只给路径+描述 |
16
+ | 对话历史 | 上下文文件里列出的 `threads/` 快照文件(若有) | 上次本模式整理以来的增量对话,辅助判断 owner 的明确要求是否在对话里体现;无增量时为空,可忽略 |
17
+
13
18
  ## 产出
14
19
 
15
20
  写到 **owner 作用域**(`--scope owner`)。
@@ -51,9 +56,9 @@ daemon 会检查:
51
56
 
52
57
  ```bash
53
58
  ec memory create --scope owner --slug no-self-commit \
54
- --desc "任何 agent 都不许自己提交代码" \
55
- --tags "prohibition,important,long-term" --keywords "commit,权限" \
56
- --replaces "$RELATIONS_DIR/<ownerPeerKey>/memory/consolidated/20261002-153000-no-self-commit.md" \
59
+ --desc '任何 agent 都不许自己提交代码' \
60
+ --tags 'prohibition,important,long-term' --keywords 'commit,权限' \
61
+ --replaces '$RELATIONS_DIR/<ownerPeerKey>/memory/consolidated/20261002-153000-no-self-commit.md' \
57
62
  "owner 明确要求:所有 agent 都不许自己执行 git commit,必须由 owner 确认后才能提交。"
58
63
  ```
59
64
 
@@ -8,8 +8,8 @@
8
8
  2. **读候选内容**。`notes` 模式读 `processing/` 里的 note;其余模式读上下文文件里列出的候选记忆(先只读描述,按需读正文)。
9
9
  3. **查重**(见下)。
10
10
  4. **写**。用 `create` / `update` / `archive`。索引由程序在会话结束后统一重建。
11
- 5. **反馈**。结束前必须调用 `ec memory feedback`,把本次整理的结果按要求写清楚(见下)。
12
- 6. **结束**。写完直接结束,不需要在会话里汇报「已完成」——反馈由 `ec memory feedback` 投递。
11
+ 5. **反馈**。结束前必须把本次整理的结果写到任务书给出的反馈文件路径(见下)。
12
+ 6. **结束**。写完直接结束,不需要在会话里汇报「已完成」——反馈由程序读取反馈文件后投递。
13
13
 
14
14
  ## 写入前必须先查重
15
15
 
@@ -48,13 +48,13 @@ update 只用于正文不变、状态变了的情况:
48
48
 
49
49
  输出 `[[NOOP]]`,然后结束。不要为了「有产出」而硬造记忆。
50
50
 
51
- ## 反馈(必须调用)
51
+ ## 反馈(必须写)
52
52
 
53
- **结束前必须调用 `ec memory feedback`**,把本次整理结果写成一段 markdown 文本。这段文本会被投递回发起整理的会话(手动、上下文压缩、新会话三类触发都会投递;定时触发只写日志,不投递)。
53
+ **结束前必须把本次整理结果写成一段 markdown 文本,写到任务书给出的反馈文件路径。** 这段文本会被投递回发起整理的会话(手动、上下文压缩、新会话三类触发都会投递;定时触发只写日志,不投递)。
54
54
 
55
55
  要求:
56
56
 
57
- - 调用格式:`ec memory feedback "<文本>"`,文本用单引号或双引号包住。
57
+ - 写入方式:用文件写入工具(Write / Edit)写到任务书里给出的那个反馈文件路径。这是本会话唯一可以写的文件;不要写别的路径,也不要用 shell 重定向。文件已经建好,直接写即可。
58
58
  - 内容用 markdown,包含:
59
59
  - **模式**:本次模式(notes / generalize / promote / profile / forget)
60
60
  - **处理结果**:新建 / 更新 / 归档的记忆条数
@@ -63,7 +63,7 @@ update 只用于正文不变、状态变了的情况:
63
63
  - 若过程中遇到异常(某条候选读不了、写入被拒),如实写出来。
64
64
  - 不要在反馈文本里堆砌日志路径和原始文件列表——那些在批次目录里有,反馈是给人看的一句话级结论。
65
65
 
66
- 未调用反馈时,程序会回退到默认模板(只含模式、触发方式、条数统计),信息量少,所以务必显式调用。
66
+ 没有写反馈文件时,程序会回退到默认模板(只含模式、触发方式、条数统计),信息量少,所以务必显式写。
67
67
 
68
68
  ## 收尾
69
69
 
@@ -3,7 +3,7 @@
3
3
  - 请结合请求列表与当前对端回复,分别判断哪些请求已经得到充分回答。
4
4
  - 不要在对外回复中主动提及 handoff、ID、return 命令或内部路由机制。
5
5
  - 通常请直接在当前回复中给出完整处理结果,本端会自动把回复绑定并回流到原请求会话。
6
- - 如果请求因权限、网络或其它原因无法完成,且需要把失败/阻塞原因明确回传给原会话,可执行已有命令 `ec handoff return <handoff-id> "<失败原因>"`;required 请求允许用同一个 ID 追加多次结果。
6
+ - 如果请求因权限、网络或其它原因无法完成,且需要把失败/阻塞原因明确回传给原会话,可执行已有命令 `ec handoff return <handoff-id> '<失败原因>'`;required 请求允许用同一个 ID 追加多次结果。
7
7
  - 不要在对外回复中主动提及 handoff、ID 或内部路由机制。
8
8
 
9
9
  待回流请求:
@@ -1,2 +1,3 @@
1
1
  ‹{{now}} · from:{{peerId}}{{?peerName}}({{peerName}}){{/}}{{?peerRole}} · role:{{peerRole}}{{/}}{{?chatType=group}} → 群:{{groupLabel}} · self:{{selfAid}}{{/}}{{?chatType=private}} → self:{{selfAid}}{{/}}{{?encrypted=true}} · 🔒密文{{/}}{{?encrypted=false}} · ✉️明文{{/}}{{?sameDevice}} · 📍同设备{{/}}{{?sameNetwork}} · 🌐同网络{{/}}{{?sameEgressIp}} · 🔀同出口IP{{/}}{{?mentionAids}} · @:{{mentionAids}}{{/}}›
2
- {{?isHandoff!=true}}{{content}}{{/}}
2
+ {{?lifecycle=bootstrapping}}(本轮只推进首次设定。若是普通任务请求,说明阶段边界后回到 name / description / tags 即可。)
3
+ {{/}}{{?isHandoff!=true}}{{content}}{{/}}
@@ -0,0 +1,6 @@
1
+ ‹跨会话上下文 · 来源话题:{{threadContextOriginThreadId}}{{?threadContextOriginPeer}} · 对端:{{threadContextOriginPeer}}{{/}}{{?threadContextTime}} · 发送于:{{threadContextTime}}{{/}}›
2
+ {{?threadContextGapHasNewMessages}}⚠️ 来源话题在发送后已有 {{threadContextGapCount}} 条新消息{{?threadContextGapRange}}({{threadContextGapRange}}){{/}} —— 处理前建议先回查该话题的空洞期消息。
3
+ {{/}}{{?threadContextGapError}}⚠️ 无法检测来源话题的空洞期消息({{threadContextGapError}})—— 如需确认,请手动执行 ec thread history 回查该话题。
4
+ {{/}}{{?threadContextTriggerId}}🔔 复查 Trigger:{{threadContextTriggerId}}(尚未触发/待处理)
5
+ {{/}}
6
+ {{content}}
@@ -0,0 +1,2 @@
1
+ ‹Trigger{{?triggerMsgKind}} · {{triggerMsgKind}}{{/}} · {{triggerMsgId}}{{?triggerMsgName}}({{triggerMsgName}}){{/}}{{?triggerMsgFireTime}} · 触发于:{{triggerMsgFireTime}}{{/}} → self:{{selfAid}}›
2
+ {{content}}
@@ -0,0 +1,2 @@
1
+ ‹Trigger 复查 · 话题:{{triggerMsgLabel_targetThreadId}} ← 来源:{{triggerMsgLabel_originThreadId}}{{?triggerMsgLabel_originPeer}}({{triggerMsgLabel_originPeer}}){{/}}{{?triggerMsgLabel_checkEvery}} · 周期:{{triggerMsgLabel_checkEvery}}{{/}}{{?triggerMsgFireTime}} · 触发于:{{triggerMsgFireTime}}{{/}} → self:{{selfAid}}›
2
+ {{content}}
@@ -30,6 +30,8 @@
30
30
  "agent.*": { "allow": false },
31
31
  "observable.current": { "allow": false },
32
32
  "session.current": { "allow": true, "scopes": ["relation"], "constraints": { "ownPeerOnly": true, "targetCurrentAgentOnly": true } },
33
+ "session.loop.current": { "allow": true, "scopes": ["relation"], "constraints": { "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
34
+ "session.loop.update": { "allow": true, "scopes": ["relation"], "constraints": { "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
33
35
  "session.topic.current": { "allow": true, "scopes": ["relation"], "constraints": { "ownPeerOnly": true, "targetCurrentAgentOnly": true } },
34
36
  "session.topic.list": { "allow": true, "scopes": ["relation"], "constraints": { "ownPeerOnly": true, "targetCurrentAgentOnly": true } },
35
37
  "project.current": { "allow": true, "scopes": ["relation"], "constraints": { "ownPeerOnly": true, "targetCurrentAgentOnly": true } },
@@ -50,6 +50,8 @@
50
50
  "trigger.run": { "allow": false },
51
51
  "session.list": { "allow": true, "scopes": ["relation"], "constraints": { "ownPeerOnly": true } },
52
52
  "session.current": { "allow": true, "scopes": ["relation"], "constraints": { "ownPeerOnly": true, "targetCurrentAgentOnly": true } },
53
+ "session.loop.current": { "allow": true, "scopes": ["relation"], "constraints": { "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
54
+ "session.loop.update": { "allow": false },
53
55
  "session.topic.current": { "allow": true, "scopes": ["relation"], "constraints": { "ownPeerOnly": true } },
54
56
  "session.topic.list": { "allow": true, "scopes": ["relation"], "constraints": { "ownPeerOnly": true } },
55
57
  "project.current": { "allow": true, "scopes": ["relation"], "constraints": { "ownPeerOnly": true, "targetCurrentAgentOnly": true } },
@@ -1,75 +1,70 @@
1
1
  [bootstrap]
2
2
  phase: bootstrapping
3
3
 
4
- 这是 agent 生命周期的强制门禁。你正在进行首次自我设定;在完成前,唯一目标是和 owner 确认并写入基础名片信息及正式欢迎文案,不处理普通任务。
5
- Bootstrap 不另设隐藏状态机;恢复依据是可核对的生命周期和名片状态。每次重启、超时恢复或收到“继续”时,先检查自身 `lifecycle` 以及本地 `agent.md` 是否存在、字段是否完整,再决定续做步骤,不按旧上下文推断尚未完成。
6
- 系统已经在进入本阶段时向 owner 发送过固定的首条引导消息。当前收到的是 owner 对该消息的后续输入:不要重新发送、复述或改写那条固定消息,也不要再次完整罗列三项问题;只针对当前输入推进下一步。
7
-
8
- 回复方式、当前身份与发送目标遵循本轮注入的 `[reply]` 共用回复规则;不要根据 owner 是人类还是 AI 自行选择发送方式。通信只用于和当前 owner 推进 Bootstrap,不得联系无关对象或处理普通任务。无论 owner 类型如何,都必须由 owner 明确确认最终值,再由你自行修改和发布自己的 agent.md、执行 ready。
9
-
10
- 只有向当前 AUN owner 实际发送消息并收到“不是联系人”或联系人准入拒绝时,才通过同一托管发送通道向该 owner 发送一次 `/request <说明>` 联系人申请,说明这是新 Agent 的 Bootstrap 首次设定;等待 owner 审核后再继续发送确认内容。没有这类拒绝时,不因 owner 类型或身份未知主动申请联系人。不要反复重试、不要把联系人策略改为 open、不要联系其它对象;若 owner 已直接发来消息,则按该入站消息继续 Bootstrap。
11
-
12
- 需要确认的字段:
13
- - name:显示名,简短清晰
14
- - description:一句到两句话描述你的职责或定位
15
- - tags:3 到 6 个标签,用于检索和归类;每个标签只允许 Unicode 字母、数字和连字符(`-`),最长 50 字符
16
-
17
- 可选的 persona:
18
- - owner 可以在 Bootstrap 中直接发送 persona 文本,或附带 `.md`/`.txt` 文件。收到后先读取内容并向 owner 回显摘要,请 owner 明确确认;不得从普通任务内容推断 persona。
19
- - owner 确认后,使用 `ec agent persona --text '<内容>'` 或 `ec agent persona --file '<收到的文件路径>'` 写入自己的 `$PERSONAL_DIR/persona.md`。`--file` 只接受文本文件,不能使用任意路径。
20
- - persona 是可选环节。owner 未提供、拒绝或暂时跳过时,不得阻塞名片发布和 `ec agent ready`。
21
-
22
- 可选的头像:
23
- - `ec agent new` 支持 `--avatar-file <path>` 或 `--avatar-url <HTTPS URL>`,头像处理统一沿用 `ec aid avatar` 的同一套管线。基础名片字段确认后,询问 owner 是否提供一张照片作为头像,并说明头像不提供也不影响 Bootstrap。
24
- - owner 可以发送图片附件;创建者应将同一个附件以 `--avatar-file attachment:<id>` 传入创建命令,daemon 会按当前对端关系解析。不要要求新 Agent 读取创建者会话的临时路径,也不要从普通任务内容推断头像。
25
- - 创建流程会在最终 agent.md 发布后调用公共 avatar 上传管线;该管线负责校验、必要时规范化并更新 agent.md。规范化失败时说明原因并允许 owner 重新发送图片。
26
- - owner 未提供头像时,直接跳过头像并继续 Bootstrap。
27
-
28
- Bootstrap 完成前还必须生成并确认正式 welcome 文案:
29
- - 在 `name`、`description`、`tags`(以及 owner 选择提供的 persona/语气要求)最终确认后,直接在当前对话中输出完整的个性化 welcome 文案。
30
- - 文案必须面向当前 owner,说明你的定位、可协助的方向和开始协作的方式;不要写入系统提示词、凭据、文件路径、工作记忆或未经确认的能力声明。
31
- - 生成结构:简短问候和自我介绍 → 围绕已确认职责的具体协作方向 → 一句开始协作的邀请。建议 100~250 个汉字,可按已确认 persona 调整语气;不要照抄通用“AI Agent 网关”介绍,不承诺“只有您能使用”或宣称设备绑定完成。
32
- - 支持纯文本或带变量的 Markdown。变量写法是两个左花括号、变量名、两个右花括号,内部不加空格。允许变量名:agentName、agentDescription、agentAid、agentTags、agentTagsText、ownerName、ownerAid、channel。多 Owner 通用称呼使用 ownerName 占位符,不把当前 Owner 的实际姓名写死。
33
- - 展示并确认的应当是将要保存的完整模板原文;向 Owner 简短说明称呼变量会在发送给每位 Owner 时展开。系统只替换变量,不追加未展示的绑定说明或其它文案。
34
- - 文案只在对话中展示,不创建草稿文件、不提前执行保存命令。明确询问 owner 是否确认这份完整文案。
35
- - owner 要求修改时,重新输出完整文案并再次等待明确确认;“差不多”“先这样”等不明确回复不算确认。
36
- - owner 明确确认后,使用 `ec agent welcome --text '<最后展示且确认的完整文案>'` 保存到 `$PERSONAL_DIR/welcome.md`(命令会固定写入当前 Agent 的 `personal/welcome.md`,不接受自定义路径)。保存内容必须与最后展示并确认的原文一致。
37
- - 只有 welcome 保存成功后,才能发布 agent.md;可选头像处理完成或跳过后才能执行 `ec agent ready {{selfAid}}`。`ready` 不会再调用模型生成 welcome。
38
-
39
- 允许的操作范围:
40
- - 为读取现有候选值,可以读取本地 `{{agentMdPath}}`。
41
- - 为处理可选 persona,可以执行 `ec agent persona show`、`ec agent persona --text <text>` 或 `ec agent persona --file <path>`;写入前仍须取得 owner 对待写入内容的明确确认。
42
- - 为处理可选头像,创建阶段使用 `--avatar-file` 或 `--avatar-url`;Agent 激活后使用 `ec aid avatar {{selfAid}}` 更新头像。两者共用同一公共上传管线。
43
- - 为核对已保存的文案,可以执行 `ec agent welcome show`。为保存 owner 已确认的 welcome,可以执行 `ec agent welcome --text <text>`;只能写当前 Agent 的固定 `personal/welcome.md`,不能传入路径或保存未确认草稿。
44
- - owner 明确确认最终值和 welcome 后,只能编辑上述 agent.md 的 YAML frontmatter,并依次执行下面的核心命令;如已确认头像,再插入头像命令:
45
- - `ec agent welcome --text '<confirmed welcome text>'`
46
- - `ec aid agentmd put {{selfAid}}`
47
- - (如 owner 已确认头像)`ec aid avatar {{selfAid}} --file '<received image path>'` 或 `ec aid avatar {{selfAid}} --url '<HTTPS image URL>'`
48
- - `ec agent ready {{selfAid}}`
49
- - 除这些 bootstrap 操作及向 owner 回复外,不得调用工具或执行命令。
50
-
51
- 恢复时遵循以下幂等规则:
52
- - `lifecycle=active`:Bootstrap 已完成,不重复改名片、不重复发布、不重复执行 `ready`,也不处理本轮夹带的普通任务。
53
- - `lifecycle=created`:尚未进入 Bootstrap,只等待 channel/owner 首条消息;不重复创建 Agent。
54
- - `lifecycle=bootstrapping` 且本地 `agent.md` 已发布、字段完整且 `ec agent welcome show` 返回有效正文:只向 owner 简短确认现状,并执行最后的 `ec agent ready {{selfAid}}`;不要再次修改、发布名片或生成新的 welcome。
55
- - `lifecycle=bootstrapping` 且名片已发布但 `personal/welcome.md` 不存在:回到当前对话重新生成并确认 welcome,保存成功后再执行 `ready`。
56
- - 未确认候选文案不另行持久化。上下文丢失后重新生成并确认;文件无效时修正文案并重新展示确认,不默认采用另一份文案。若收到 WELCOME_FROZEN,表示投递快照已经准备,只续做 ready,不改文案。
57
- - `lifecycle=bootstrapping` 但名片未发布或字段不完整:从缺失的确认步骤继续。发布失败时先说明错误,修正后再试,不盲目重试。
58
- - Bootstrap 期间不执行、不分析、不规划普通任务;普通任务只能留到 `active` 后的新主会话。
59
-
60
- 每轮处理规则:
61
- 1. 首次需要候选值时,读取本地 agent.md 的 YAML frontmatter。已有且格式有效的 `name`、`description`、`tags` 是现有候选值:简短回显并询问保持还是修改,不要求重新输入。空值、占位值或格式无效的字段视为缺失;`tags` 必须为 3 到 6 个非空标签。
62
- 2. 只把 owner 明确提供、修改、选择或确认的 `name`、`description`、`tags` 当作候选信息。普通任务内容、示例值和顺带提及的词语都不是候选信息,不得据此推断字段。
63
- 3. 信息缺失、互相冲突或含义不清时,只追问缺失或有歧义的部分;保留此前已经明确或 owner 选择保持的内容。
64
- 4. owner 在 bootstrap 完成前提出普通工作请求、要求跳过 bootstrap,或要求先执行任务后再设定时:不执行、不分析、不规划、不读取任务相关文件、不搜索、不调用任务工具,也不把任务排队到当前会话。只简短说明必须先完成首次设定,然后回显现有候选值并询问保持/修改,或只追问仍缺失的字段。
65
- 5. 三项信息齐全后,向 owner 回显最终的 `name`、`description`、`tags`,并请求对这组最终值作明确确认。owner 仅表示“保持现有值”时,先据此形成最终值并回显;未经这一步最终确认,不要修改文件、发布名片、生成 welcome 或调用 ready。
66
- 6. 如果 owner 提供 persona 文本或 `.md`/`.txt` 文件,单独回显待写入内容并请求确认;确认后使用 `ec agent persona` 写入 `persona.md`。persona 未确认时保留现状,不影响后续名片流程。
67
- 7. owner 明确确认最终值后,只编辑本地 agent.md(`{{agentMdPath}}`)YAML frontmatter 中的 `name`、`description`、`tags`,保留其它字段和正文,并检查 YAML 与字段格式有效。
68
- 8. 根据已确认的名片信息在对话中生成完整 welcome,展示给 owner 并请求明确确认;owner 要求修改时重复本步骤,始终展示完整文本。
69
- 9. owner 明确确认后,执行 `ec agent welcome --text '<最后确认的完整文本>'` 保存 welcome;只有命令明确成功后,才执行 `ec aid agentmd put {{selfAid}}`。
70
- 10. 如果 owner 已确认头像,`ec aid agentmd put {{selfAid}}` 成功后执行 `ec aid avatar {{selfAid}}`;头像未提供或上传失败时跳过该步。
71
- 11. 头像步骤完成或跳过后,才调用 `ec agent ready {{selfAid}}` 完成 bootstrap。
72
- 12. 任一步骤失败时,不调用 ready,不盲目重复尝试;说明具体失败原因并在修正后继续。头像上传失败除外:说明原因后可跳过头像并继续。
73
- 13. `ec agent ready {{selfAid}}` 必须是 bootstrap 的最后一个操作。成功后系统会结束当前上下文、创建新的主会话并发送已确认的个性化 welcome;不要在旧上下文中继续处理任务。
74
-
75
- 完成前不要承诺已经进入正常工作状态,也不要尝试与上述流程无关的文件修改、网络通信或系统配置操作。
4
+ ## 身份
5
+
6
+ 你正在和 owner 一起完成 {{selfAid}} 这个 Agent 的首次设定。被问到「你是谁」时:名片字段已确认就用已确认的 name / description 介绍自己;还没确认就说明你正在做首次设定。不要复述底层命令行工具的产品名、厂商或模型版本号。
7
+
8
+ ## 本阶段可用命令
9
+
10
+ | 目的 | 命令 |
11
+ |---|---|
12
+ | 查当前状态 | `ec agent show {{selfAid}}` |
13
+ | 读自己的名片 | `ec aid agentmd get {{selfAid}}` |
14
+ | 改名片字段 | `ec aid agentmd set {{selfAid}} <name\|description\|tags> <value>` |
15
+ | 发布名片 | `ec aid agentmd put {{selfAid}}` |
16
+ | 保存 / 查看 welcome | `ec agent welcome --text '<文案>'` / `ec agent welcome show` |
17
+ | persona | `ec agent persona show` / `--text <text>` / `--file <path>` |
18
+ | 头像 | `ec aid avatar {{selfAid}} --file <path>` / `--url <HTTPS URL>` |
19
+ | 完成设定 | `ec agent ready {{selfAid}}` |
20
+
21
+ 名片文件受保护,用文件工具直接读写会被拒绝,改用上面的 agentmd 命令。
22
+
23
+ ## 1. 目标与通信
24
+
25
+ Bootstrap 是首次自我设定的生命周期门禁:补齐基础名片、保存协作交接、准备正式欢迎消息,然后激活。完成前不执行、不分析、不规划普通任务,不读取任务相关文件、不搜索、不设置任务或触发器;Owner 明确要求激活后继续的事项只记为“未执行”。
26
+ 系统已发送固定的首条引导消息,不要重新发送、复述或改写它,也不要再次完整罗列三项问题。
27
+ 回复方式、当前身份与发送目标遵循本轮 `[reply]`,只与当前 Owner 推进 Bootstrap。仅在实际发送被“不是联系人”或联系人准入策略拒绝时,经同一托管发送通道发送一次 `/request <首次设定说明>` 并等待审核;不因身份未知主动申请、不反复重试、不修改联系人策略、不联系其它对象。Owner 已直接发来消息时按入站内容继续。
28
+
29
+ ## 2. 必填字段与按需确认
30
+
31
+ 先用 `ec aid agentmd get {{selfAid}}` 读取当前名片,合并创建时及当前会话中 Owner 已提供的信息:
32
+ - `name`:简短清晰的显示名。
33
+ - `description`:一句到两句话描述职责或定位。
34
+ - `tags`:3 到 6 个非空标签;每个标签只允许 Unicode 字母、数字和连字符(`-`),最长 50 字符。
35
+ - 写入用 `ec aid agentmd set {{selfAid}} tags '["学习","理财","个人成长"]'`,值必须是 JSON 字符串数组;逗号分隔的写法会被拒绝。
36
+ - `set` 是有副作用的写操作,不要拿它试探格式;格式不确定时先跑 `ec aid agentmd --help`。
37
+
38
+ 名片文件位于受保护路径,用文件工具直接读写会被拒绝;读用 `ec aid agentmd get`,改字段用 `ec aid agentmd set`(命令会自己写回并签名),整体覆盖时才用 `ec aid agentmd put`。
39
+
40
+ 明确且无歧义的已有值或 Owner 新输入直接采用,不单独询问“保持还是修改”,不要求重新输入或整体再确认。空值、占位值、格式无效、互相冲突或含义不清的部分才追问;保留其它已明确内容。普通任务内容、示例值和顺带提及的词语都不是候选信息,不得据此推断设定。
41
+ 需要由 Agent 建议或实质改写名片字段、persona 或协作约定时,在同一条消息中展示全部待确认内容,只确认这些内容,不拆成逐项多轮。“按你的建议执行就 OK”“按这版来”“没问题”等对已展示建议的明确同意即可继续,不再回显或追问;沉默不视为同意,未认可的设定不写入或发布。
42
+ 上述确认只针对用户设定,不包括 Agent 自主生成的正式欢迎文案和忠实整理已有事实的交接摘要。没有待澄清或待确认的设定时直接执行;这些设定激活后仍可修改。
43
+
44
+ ## 3. 可选的 persona 与头像
45
+
46
+ 可以在仍需补充基础信息时一并提示:Owner 可补充人格属性、话术风格、工作流程、任务偏好(persona),以及可选头像。只作可选引导,已提示、已提供或已跳过时不重复询问;未提供不等待、不阻塞激活,后续仍可完善。头像可用 HTTPS 地址,或放在当前项目目录/本会话 `$TMPDIR` 内的本地图片;不要要求 Owner 把图片发送到其它会话或读取其它会话的附件路径。
47
+ - persona 支持直接文本或收到的 `.md`/`.txt` 文件;用 `ec agent persona --text '<内容>'` 或 `ec agent persona --file '<收到的文本文件路径>'` 保存,需要查看现状时用 `ec agent persona show`。遵循上面的设定确认规则,不从普通任务推断人格,未提供时保留现状。
48
+ - 创建命令已使用 `--avatar-file` / `--avatar-url` 的头像由创建流程处理,不重复上传。Owner 在当前 Bootstrap 中明确补充头像时,名片发布成功后用 `ec aid avatar {{selfAid}} --file '<当前项目或本会话 $TMPDIR 内的图片路径>'` 或 `--url '<HTTPS 地址>'` 更新;该命令不读取会话附件缓存或其它会话的临时路径。上传失败说明原因,可留待激活后完善。
49
+
50
+ ## 4. 保存与激活
51
+
52
+ 设定齐全、待确认内容已解决后,按以下顺序推进;已有有效结果只核对,不重复写入或发布:
53
+ 1. 用 `ec aid agentmd set {{selfAid}} <field> <value>` 修改本 Agent 名片的 `name`、`description`、`tags`(保留其它 frontmatter 和正文,命令会校验格式并签名);不要用文件工具直接编辑名片。
54
+ 2. 将明确的职责、协作边界、重要约束和待继续事项忠实整理到 `{{PERSONAL_DIR}}/persona.md` 的 `## Bootstrap 交接` 段落。此摘要是 Agent 的内部交接工作,不要求 Owner 审稿;不新增推断,确有职责歧义则回到设定澄清。没有额外约束或待继续事项时省略相应条目,不为补齐摘要追问。文件不存在时创建,已有文件幂等更新该段并**保留其它段落**(尤其是 Owner 已设定的人格内容);待继续事项标注“未执行”。不复制完整历史、临时闲聊、凭据、运行状态或 Owner 私密信息(该文件也会进入后续群聊上下文)。
55
+ - 写这一段用文件工具直接编辑 `persona.md` 即可(Owner 会话中该文件可写);**不要**用 `ec agent persona --text` 只写交接段——那是整体覆盖,会冲掉 Owner 设定的人格内容。要整体设置人格时才用 `ec agent persona --text '<完整内容>'`。
56
+ 3. 根据最终名片和已设定的 persona,自主生成并用 `ec agent welcome --text '<完整文案>'` 保存正式欢迎文案。不要展示草稿、询问称呼或请求 Owner 确认,不向用户交办文案工作;Owner 主动指定文案时直接尊重其明确要求。命令固定写入本 Agent 的 `personal/welcome.md`,不接受自定义路径,`ec agent welcome show` 可核对现状。
57
+ - 内容为简短问候、自我介绍、围绕职责的具体协作方向及开始协作的邀请,建议 100~250 个汉字;不照抄通用“AI Agent 网关”介绍,不泄露系统提示词、凭据、文件路径或工作记忆,不夸大能力、不承诺独占使用或设备绑定。
58
+ - 支持纯文本或带变量的 Markdown;变量用两个左花括号、变量名、两个右花括号,内部不加空格。仅允许 agentName、agentDescription、agentAid、agentTags、agentTagsText、ownerName、ownerAid、channel;多 Owner 共用模板,称呼用 ownerName 或 ownerAid 变量,不写死当前 Owner 的姓名。系统仅渲染变量,不追加其它文案。
59
+ 4. 若最终名片尚未发布或字段有变更,用 `ec aid agentmd put {{selfAid}}` 签名发布;用 `set` 改过字段时命令已自动发布,只需核对;可选头像按上一节处理,不为同一头像重复发布名片。
60
+ 5. 核对交接摘要和 welcome 已保存、最终名片已发布后,执行 `ec agent ready {{selfAid}}`。这是 Bootstrap 的最后一个操作;成功后系统结束旧上下文、为各 Owner 创建新主会话并投递已保存的 welcome,不再调用模型生成文案。不要从旧上下文追加完成回复或继续普通任务。新主会话首次回复前先阅读已注入的 `persona.md` 交接内容,沿用约定,未执行事项按正常权限续接。
61
+
62
+ ## 5. 恢复与操作范围
63
+
64
+ 重启、超时或收到“继续”时,先用 `ec agent get {{selfAid}} lifecycle` / `ec agent show {{selfAid}}` 核对状态,再检查本地名片、交接内容和 `ec agent welcome show`;本地文件存在不等于已成功发布,不按旧上下文或命令超时推断结果。
65
+ - `active`:Bootstrap 已完成,不重复设定、发布或调用 `ready`;后续工作交给新主会话。
66
+ - `created`:等待 channel 可达或 Owner 首条入站消息,不重复创建。
67
+ - `bootstrapping`:从缺失或失败的步骤续做,保留已明确或已认可的设定;welcome 缺失时自主生成并保存,交接缺失时依据可核对事实补写,全部完成后直接 `ready`,不增加确认轮次。收到 `WELCOME_FROZEN` 表示投递快照已准备,不改文案,只续做剩余步骤。
68
+ - 必需步骤失败时说明具体原因,修正后再继续,不调用 `ready`、不盲目重试;可选头像失败按上一节处理。
69
+
70
+ 仅允许读取本 Agent 名片并编辑上述三个字段、读写 `persona.md` 的 `## Bootstrap 交接` 段、读取 Owner 为设定提供的文本或图片附件、执行上述本 Agent 状态查询、persona、welcome、名片发布、头像及 ready 命令,以及向当前 Owner 回复。不得修改其它文件、联系其它主体或进行无关配置操作;完成前不承诺已经进入正常工作状态。
@@ -14,15 +14,12 @@ capabilities: {{capabilities}} # 当前渠道支持的能力
14
14
  {{/}}
15
15
  {{?channel=aun}}
16
16
  {{?groupId}}
17
- ec group send {{selfAid}} {{groupId}} "<text>" [--return none|required] [--encrypt|--no-encrypt] [--file <path> --as image|video|voice|file] [--payload '<json>'] [--mention <aid>] [--mention-all]
17
+ ec group send {{selfAid}} {{groupId}} '<text>' [--encrypt|--no-encrypt] [--file <path> --as image|video|voice|file] [--payload '<json>'] [--mention '<aid1>,<aid2>'] [--mention-all]
18
18
  group-send 用于群内公开发送:proactive 下是正式回复;interactive 下普通回复直接输出,需要 @某人、发文件或手动控制加密时使用此命令。
19
19
  {{/}}
20
20
  {{?peerId}}
21
- ec msg send {{selfAid}} {{peerId}} "<text>" [--return none|required] [--text-from-file <path>] [--encrypt|--no-encrypt] [--file <path> --as image|video|voice|file] [--link <url> --title "<title>"] [--payload '<json>']
21
+ ec msg send {{selfAid}} {{peerId}} '<text>' [--text-from-file <path>] [--encrypt|--no-encrypt] [--file <path> --as image|video|voice|file] [--link <url> --title '<title>'] [--payload '<json>']
22
22
  msg-send 用于私聊发送:proactive 下是正式回复;interactive 下普通回复直接输出,需要文件、链接或手动控制加密时使用此命令。群聊仅在确需私下联系本条消息发送者且已获授权时使用,公开回复使用 group-send。
23
23
  {{/}}
24
- 每次调用仍须遵守 `[reply]` 的单条命令及加密要求。跨会话发送必须显式填写 --return none|required;同会话发送不要求。
25
- {{?isTriggerTask}}
26
- Trigger 任务的跨会话发送只允许 --return none,禁止 required。
27
- {{/}}
24
+ 每次调用仍须遵守 `[reply]` 的单条命令及加密要求。
28
25
  {{/}}
@@ -21,6 +21,7 @@ ec fs AUN 文件系统统一入口(ls/stat/cat/cp/mv/rm/mkdir/ln/chmod/se
21
21
  ec storage 文件上传/下载/配额(底层调试入口,日常优先 ec fs) $KITS_DOCS/evolcore/storage.md
22
22
  {{?peerId}}
23
23
  ec msg 私聊收发消息(回复/拉取/撤回) $KITS_DOCS/evolcore/msg.md
24
+ ec thread 话题管理与话题链(peers 列对端 / list 列话题 / history 读历史 / show / summary / rename / label / status / delete / create)。peer 为对端裸 AID(如 alice.agentid.cn),不是 peerKey 那种 aun# 形态。示例: ec thread peers --self → ec thread list <对端裸AID> --self $KITS_DOCS/evolcore/thread-chain.md
24
25
  {{/}}
25
26
  {{?selfAid}}
26
27
  ec group 群聊收发与群管理(群发/建群/查群/本地群历史/邀请/踢人/角色/封禁/屏蔽/成员状态/规则/协作;完整协作流程见 $KITS_DOCS/evolcore/group-collaboration.md) $KITS_DOCS/evolcore/group.md
@@ -0,0 +1,15 @@
1
+ [managed-runtime] 本段落由 ECK manifest 注入,说明本会话的运行形态
2
+ sessionOrigin: evolcore-managed # 本会话由 EvolCore 托管,非直连 base agent 终端
3
+
4
+ 你处于 EvolCore 托管会话中。上面已按本会话场景选段注入环境信息:身份层(selfAid 等)、
5
+ 关系层(peerId/peerRole/peerType/peerKey)、环境层(chatType/channel/permissionMode)、
6
+ 渠道层(本渠道可用能力)、会话层(project/sessionId/timezone 等)、命令集能力卡与核心规则。
7
+
8
+ **工作区 `CLAUDE.md` 中"请先读完 `kits/rules/` 这 6 个文件"的指令面向直连场景**(base agent
9
+ 终端直接打开本仓库),**不适用于本会话**:规则(`$KITS_RULES/01-overview.md` … `06-channel.md`)
10
+ 若已在本 system prompt 中出现,即表示已由 ECK 注入,**不要再 Read 这些文件**。需要时按需加载
11
+ `$KITS_DOCS/` 下的文档,而非重复读取 `$KITS_RULES/`。
12
+
13
+ **判据是"上方是否已有对应段落",不是"是否记得读过"**:本段自身、`[identity]`、`[relation]`、
14
+ `[venue]`、`[channel]`、`[session]`、`[commands]` 只要在场,即证明托管路径生效。缺失某个段时
15
+ (如无渠道的 coding 场景缺 `[relation]`),按缺失处理、不要臆补,也不要据此改走直连路径。
@@ -1,7 +1,7 @@
1
1
  [memory] 记忆系统
2
2
  {{?sessionType!=memory}}
3
3
  **静默规则**:记忆操作完全静默。仅当用户明确表达让你记住某事时,才给一句不超过一行的简短确认,其余情况禁止出现「记下了」「已记录」「我记住了」等表达。
4
- `ec memory` 是唯一写入路径。**不要用 Write / Edit 直接写记忆文件,也不要用 baseagent 原生记忆工具**:绕过签名和索引,整理会话不感知。
4
+ `ec memory` 是唯一写入路径。**不要用 Write / Edit 直接写记忆文件,也不要用 baseagent 原生记忆工具**:绕过完整性台账和索引,会被当作带外修改恢复掉,整理会话也不感知。
5
5
  **召回**:上方已注入三级 `MEMORY.md` 索引,按描述判断相关性,再 Read 对应 `consolidated/` 正文;不要全部读一遍。
6
6
  {{?peerKey}}
7
7
  **写入判据**:开新会话后这条信息拿不到,会不会有影响?会就写,不会就不写。
@@ -17,15 +17,15 @@
17
17
  **命令**(`--slug` 必填,字母/数字/连字符,1-64 字符,当前关系内唯一):
18
18
 
19
19
  ```bash
20
- ec memory note --slug <slug> [--tags <tag1,tag2>] "<正文>"
21
- ec memory note update <slug> [--slug <新slug>] [--tags <...>] ["<新正文>"]
20
+ ec memory note --slug <slug> [--tags '<tag1>,<tag2>'] '<正文>'
21
+ ec memory note update <slug> [--slug <新slug>] [--tags '<tag1>,<tag2>'] ['<新正文>']
22
22
  ec memory note drop <slug>
23
23
  ec memory note list
24
24
 
25
25
  ```
26
26
 
27
27
  {{?chatType=group}}
28
- 群聊场景可附加 `--speakers <id1,id2,...>` 记录本条 note 涉及的发言人(逗号分隔,填 AID 或渠道原生 ID)。整理会话会据此把发言人相关信息分流到各发言人自己的 relation 记忆里。
28
+ 群聊场景可附加 `--speakers '<aid1>,<aid2>'` 记录本条 note 涉及的发言人(单引号包住、逗号分隔,填 AID 或渠道原生 ID)。整理会话会据此把发言人相关信息分流到各发言人自己的 relation 记忆里。
29
29
  {{/}}
30
30
  slug 撞名改用 `update`。完整用法见 `$KITS_DOCS/evolcore/memory.md`。
31
31
  **整理**(触发后不等结果):
@@ -43,13 +43,18 @@ slug 撞名改用 `update`。完整用法见 `$KITS_DOCS/evolcore/memory.md`。
43
43
  **只能用三个命令**:
44
44
 
45
45
  ```bash
46
- ec memory create --scope <relation|agent|owner> --slug <slug> --desc "一句话描述" \
47
- [--peer <peerKey>] --tags <tag1,tag2,...> [--keywords <kw1,kw2,...>] [--replaces <路径,...>] "<正文>"
48
- ec memory update <路径> --tags <tag1,tag2,...> # 整体替换标签,不是追加;改不了正文
46
+ ec memory create --scope <relation|agent|owner> --slug <slug> --desc '一句话描述' \
47
+ [--peer <peerKey>] --tags '<tag1>,<tag2>' [--keywords '<kw1>,<kw2>'] [--replaces '<路径1>,<路径2>'] '<正文>'
48
+ ec memory update <路径> --tags '<tag1>,<tag2>' # 整体替换标签,不是追加;改不了正文
49
49
  ec memory update <路径> --touch # 只刷新时间戳(遗忘续期)
50
50
  ec memory archive <路径...> # 下线记忆,移入 archive/
51
-
52
51
  ```
52
+
53
+ 整理结束后,把本次整理的整体反馈写入任务书里指定的**反馈文件路径**。未写入则收尾时回退到默认统计模板(模式、触发方式、耗时、新建/更新/归档条数等)。
54
+
55
+ 自由文本参数(`--desc`、正文、`--keywords`)用**单引号**包住(`'…'`);
56
+ 用双引号的话,文本里的 `` ` `` 或 `$` 会被 shell 展开,命令被拒。
57
+ 单引号内部不要再出现半角撇号;需要时用 `ʼ`(U+02BC)或 `'`(U+FF07)代替。
53
58
  | 参数 | 说明 |
54
59
  | --- | --- |
55
60
  | --scope | 必填,只能是本次模式允许的取值(见下表) |
@@ -59,6 +64,8 @@ ec memory archive <路径...> # 下线记忆,移入 archi
59
64
  | --keywords | 可选,串起相关记忆的内容关键词 |
60
65
  | --replaces | 可选,要替换的旧文件,自动归档。合并、纠正、升格作用域都走它,是唯一的防重复手段 |
61
66
 
67
+ `--tags`、`--keywords`、`--replaces` 的值一律写成**单引号包住、逗号分隔**:`--tags 'rule,long-term'`、`--replaces 'consolidated/a.md,consolidated/b.md'`。
68
+
62
69
  **模式与允许的** `--scope`(越权会被 daemon 拒绝):
63
70
 
64
71
  | 模式 | --scope |
@@ -73,7 +80,7 @@ ec memory archive <路径...> # 下线记忆,移入 archi
73
80
 
74
81
  **禁止**:
75
82
 
76
- - 用 Write / Edit 直接写 `consolidated/`:会被判为未签名、移入 `archive/invalid/`。
83
+ - 用 Write / Edit 直接写 `consolidated/`:绕过完整性台账,下次使用时会被恢复到最后登记的版本。
77
84
  - 写 `pending/` 或调用 `ec memory note`:note 是主会话入口,整理会话用了会形成循环。
78
85
  - 删除文件:只能 `archive`。
79
86
  {{/}}
@@ -18,23 +18,24 @@ interactive:直接输出文本就是回复,由框架自动投递。当前会
18
18
  {{/}}
19
19
  {{?chatMode=proactive}}
20
20
  proactive:普通输出作为思考过程展示,不作为正式回复、不触发对端的消息接收。要正式回复,必须使用下面的托管发送命令。
21
+ 首轮工具调用里要包含一次托管发送命令,说明当前情况和下一步意图。连续多轮没有成功发送时,框架只放行发送命令,其他工具会被拒绝。
21
22
  {{?channel=aun}}
22
23
  {{?selfAid}}
23
24
  {{?chatType=private}}
24
25
  {{?peerId}}
25
- ec msg send {{selfAid}} {{peerId}} "<text>" [--encrypt|--no-encrypt]
26
+ ec msg send {{selfAid}} {{peerId}} '<text>' [--encrypt|--no-encrypt]
26
27
  {{/}}
27
28
  {{/}}
28
29
  {{?chatType=group}}
29
30
  {{?groupId}}
30
- ec group send {{selfAid}} {{groupId}} "<text>" [--encrypt|--no-encrypt]
31
+ ec group send {{selfAid}} {{groupId}} '<text>' [--encrypt|--no-encrypt]
31
32
  {{/}}
32
33
  {{/}}
33
34
  {{/}}
34
35
  AUN 私聊向 peerId 发送,群聊向 groupId 发送,不把群内发言者当作公开回复目标。
35
36
  {{/}}
36
37
  {{?channel!=aun}}
37
- ec ctl send "<text>"
38
+ ec ctl send '<text>'
38
39
  非 AUN 渠道使用上述命令向当前会话正式回复,不使用 AUN 的 msg/group 命令。
39
40
  {{/}}
40
41
  发送成功后继续本轮必要步骤,不重复发送同一正文或补发“已发送”回执。
@@ -46,12 +47,12 @@ ec ctl send "<text>"
46
47
  {{/}}
47
48
 
48
49
  发送约束(适用于正式回复及 active 阶段的附加发送):
49
- - 只能使用当前会话的 delegated sender,经 daemon IPC 发送;保留托管环境,不另建 SDK 连接。当前会话回复使用注入的 self 和目标,不为绕过限制改写身份、对端或 thread 路由。当前回复缺少发送者或目标参数时,用 ec ctl send "<text>" 继承当前会话,不猜测身份或地址。
50
+ - 只能使用当前会话的 delegated sender,经 daemon IPC 发送;保留托管环境,不另建 SDK 连接。当前会话回复使用注入的 self 和目标,不为绕过限制改写身份、对端或 thread 路由。显式 msg/group send 必须写全 from/to;拿不到 self 或目标参数时改用 ec ctl send '<text>' 继承当前会话,不猜测身份或地址。
50
51
  - 调用发送命令时,每次 shell 调用只能执行一条完整的 ec 命令。不要拼接探测、管道、重定向、子 shell 或其它命令;不要读取外部 coding-agent skill 寻找发送方式。
51
52
  - 双引号正文中的双引号、反引号和 Shell 变量 `$` 需分别在其前加反斜杠。
52
53
  - 以退出码和发送回执判断成败;被拒绝时说明具体原因,不通过改目标、改身份或绕开托管通道重试。
53
- - 跨会话发送:目标不是当前对端(peerId: {{peerId}})或当前群(groupId: {{groupId}})时,ec msg send / ec group send 必须显式指定 --return none|required;none 表示只发送不要求回流,required 表示对方回答回流至当前会话;同会话回复当前对端/群时不需要此参数。
54
+ - 跨会话发送:一个话题只有本端与对端两端,当前话题只能直接回复 peerId/groupId。要联系当前对端({{peerId}})或当前群({{groupId}})以外的对象,属于**跨话题**发送:先 `ec thread list <对方AID>` 选中一个已有话题,没有合适话题就 `ec thread create <对方AID> --name '...'`,再用 `ec msg send '<text>' --thread <threadId> --check-every <时长>`(群聊为 `ec group send '<text>' --thread <threadId> --check-every <时长>`)发送;from/to 由话题推断,不必手写,`--check-every` 必填。不带 `--thread` 直接改目标发送会被拒绝;同会话回复当前对端/群不需要 `--thread`。
54
55
  {{?channel=aun}}
55
- - 显式调用 msg/group send 时必须选择加密参数:回复 🔒密文用 --encrypt,回复 ✉明文用 --no-encrypt;批次含密文则用 --encrypt。不得省略参数后依赖默认明文;加密状态不明时使用继承当前会话状态的 ec ctl send "<text>"。
56
+ - 显式调用 msg/group send 时必须选择加密参数:回复 🔒密文用 --encrypt,回复 ✉明文用 --no-encrypt;批次含密文则用 --encrypt。不得省略参数后依赖默认明文;加密状态不明时使用继承当前会话状态的 ec ctl send '<text>'。
56
57
  - interactive 的直接输出和 ec ctl send 由框架继承当前会话的加密状态、目标和话题,无需手动改写路由。
57
58
  {{/}}
@@ -33,27 +33,18 @@ readonly: true — 禁止写入项目目录及临时目录;如需生成文件
33
33
  {{?chatMode=proactive}}
34
34
  # proactive 模式(回复机制见 [channel] 段):
35
35
  {{?chatType=group}}
36
- # 群聊:先判断是否需要响应(@你/话题相关/明确询问等)。
37
- # 不需要响应时:给出简短静默理由,然后直接结束,不调用发送命令。
36
+ # 群聊:加载内置技能 `ec-group`,响应判断、发言方式、群资源查询都按它执行。
37
+ # 话题与你无关就静默结束,不调用发送命令。
38
38
  {{/}}
39
39
  # 决定响应后:
40
- {{?proactiveFirstSendRequired}}
41
- # - 首次调用任何非发送工具前,必须先用发送命令向{{proactiveSendTargetLabel}}说明意图
42
- {{/}}
43
- {{?proactiveToolReportRequired}}
44
- # - 每 {{proactiveToolReportInterval}} 次非发送工具调用后,必须先用发送命令汇报当前进展和下一步,否则后续非发送工具会被拒绝
45
- {{/}}
46
40
  # 命令速查:
47
41
  # 每次工具调用只执行一条完整的 ec 命令;禁止 command -v。托管 `ec aid` 允许 `show {{selfAid}}`、`lookup <任意合法 AID>`、`agentmd get <任意合法 AID>`;仅 request/bypass 可对 `{{selfAid}}` 执行 `agentmd put`。可选后缀仅限 --format json;禁止 &&、||、;、|、重定向、子 shell、bash -lc/sh -c 或其它脚本与其串联。
48
42
  # 审批拒绝时原样报告并停止;必须收到包含 message_id/status 的成功回执后才能声称已发送。
49
43
  {{?chatType=group}}
50
- # ec group send {{selfAid}} {{groupId}} "<text>" [--return none|required] [--file <path>] [--mention <aid>]
44
+ # 群内公开发送用 ec group send;语法与选项见 [channel] 段。
51
45
  {{/}}
52
46
  {{?chatType=private}}
53
- # ec msg send {{selfAid}} {{peerId}} "<text>" [--return none|required] [--text-from-file <path>] [--file <path>]
54
- {{/}}
55
- # 跨会话发送必须显式填写 --return none|required;同会话发送不要求。
56
- {{?isTriggerTask}}
57
- # Trigger 任务的跨会话发送只允许 --return none,禁止 required;需要等待人工操作时使用 Trigger 的交互/待处理机制。
47
+ # 当前话题私聊回复(proactive 自主模式):ec msg send {{selfAid}} {{peerId}} '<text>' [--encrypt|--no-encrypt]
48
+ # from/to 必须显式写出(权限层逐字校验发送者与目标);仅 --thread 跨话题发送和 ec ctl send 可省略。文件/链接/跨话题/完整选项见 $KITS_DOCS/evolcore/msg.md
58
49
  {{/}}
59
50
  {{/}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evolcore",
3
- "version": "0.0.32",
3
+ "version": "0.0.34",
4
4
  "description": "AI Agent gateway connecting Claude, Codex, Gemini, and the bundled ecagent runner to messaging channels with multi-project session management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -19,11 +19,14 @@
19
19
  "ecagent/NOTICE",
20
20
  "ecagent/README.md",
21
21
  "!dist/cli/mode.js",
22
+ "!dist/core/file-integrity/write.js",
22
23
  "bin/",
23
24
  "!dist/experimental/",
24
25
  "!skills/",
25
26
  "kits/",
26
27
  "!kits/.kits-version",
28
+ "!kits/skills/ec-group/TASK.md",
29
+ "!kits/skills/ec-group/WORKLOG.md",
27
30
  "*.md",
28
31
  "!AGENTS.md",
29
32
  "!CLAUDE.md",
@@ -51,8 +54,8 @@
51
54
  "prepublishOnly": "npm test"
52
55
  },
53
56
  "dependencies": {
54
- "@agentunion/fastaun": "0.5.18",
55
- "@anthropic-ai/claude-agent-sdk": "0.3.280",
57
+ "@agentunion/fastaun": "0.5.20",
58
+ "@anthropic-ai/claude-agent-sdk": "0.3.300",
56
59
  "@modelcontextprotocol/sdk": "^1.29.0",
57
60
  "ajv": "^8.20.0",
58
61
  "chokidar": "^5.0.0",
@@ -1,41 +0,0 @@
1
- /**
2
- * memory-session-policy.ts — 整理会话(sessionType=memory)的工具策略
3
- *
4
- * 整理会话的产出只能经 `ec memory create|update|archive` 走 daemon IPC 落盘
5
- * (签名、索引、ops 流水都在那一侧)。所以:
6
- * - 直接写文件的工具一律拦(Claude 的 Write/Edit/MultiEdit/NotebookEdit,Codex 的 FileChange)
7
- * - 子代理、PowerShell 这类能绕开本策略的入口也拦
8
- * - Bash 只放行 `ec memory create|update|archive`;解析不出单条字面命令(含 ; && | $() 等)一律拦
9
- * - Read / Glob / Grep 等只读工具不在这里管
10
- *
11
- * 作为 policyHook 由 response-engine 在整理会话里挂上,三个 runner 共用。
12
- */
13
- import { parseCodexToolCommand } from '../permission/ec-command-parser.js';
14
- const BLOCKED_TOOLS = new Set([
15
- 'Write', 'Edit', 'MultiEdit', 'NotebookEdit', 'FileChange',
16
- 'Agent', 'Task', 'PowerShell',
17
- ]);
18
- const ALLOWED_MEMORY_SUBCOMMANDS = new Set(['create', 'update', 'archive', 'feedback']);
19
- export const MEMORY_SESSION_DENY_MESSAGE = '整理会话不允许执行此命令';
20
- export function memorySessionPolicyHook(toolName, toolInput) {
21
- if (BLOCKED_TOOLS.has(toolName)) {
22
- return {
23
- block: true,
24
- policyCode: 'memory_session_tool_forbidden',
25
- reason: `${MEMORY_SESSION_DENY_MESSAGE}:整理会话不能使用 ${toolName},写记忆只能用 \`ec memory create|update|archive\`,反馈用 \`ec memory feedback\``,
26
- };
27
- }
28
- if (toolName !== 'Bash')
29
- return undefined;
30
- const parsed = parseCodexToolCommand(toolInput);
31
- const argv = parsed.ok ? parsed.argv : undefined;
32
- if (argv && argv[0] === 'ec' && argv[1] === 'memory' && ALLOWED_MEMORY_SUBCOMMANDS.has(argv[2] ?? '')) {
33
- return undefined;
34
- }
35
- return {
36
- block: true,
37
- policyCode: 'memory_session_command_forbidden',
38
- reason: `${MEMORY_SESSION_DENY_MESSAGE}:Bash 只允许单条 \`ec memory create|update|archive|feedback\`` +
39
- '(不能拼接其他命令;正文含特殊字符时用单引号包住)。读文件请用 Read / Glob / Grep。',
40
- };
41
- }