evolcore 0.0.31 → 0.0.33

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 (179) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/bin/install-codex-managed-hooks.mjs +124 -37
  3. package/dist/agents/claude-runner.js +29 -2
  4. package/dist/agents/codex/app-server-client.js +3 -0
  5. package/dist/agents/codex/diagnostics.js +76 -44
  6. package/dist/agents/codex-runner.js +51 -24
  7. package/dist/agents/ecagent-runner.js +9 -13
  8. package/dist/agents/gemini-runner.js +4 -0
  9. package/dist/aun/aid/store.js +0 -81
  10. package/dist/aun/group/fs-download.js +1 -10
  11. package/dist/aun/group/operations.js +0 -1
  12. package/dist/aun/msg/history.js +1 -0
  13. package/dist/aun/msg/managed-operation.js +130 -32
  14. package/dist/aun/msg/p2p.js +0 -1
  15. package/dist/aun/outbox.js +50 -1
  16. package/dist/aun/service-proxy.js +12 -18
  17. package/dist/aun/storage/index.js +29 -0
  18. package/dist/channels/aun.js +38 -137
  19. package/dist/channels/daemon.js +257 -2
  20. package/dist/cli/agent-command.js +64 -31
  21. package/dist/cli/agent-create.js +43 -24
  22. package/dist/cli/agent.js +16 -70
  23. package/dist/cli/aun-commands.js +512 -32
  24. package/dist/cli/contact.js +8 -2
  25. package/dist/cli/ctl-command.js +1 -2
  26. package/dist/cli/daemon-commands.js +82 -13
  27. package/dist/cli/debug-mode.js +154 -0
  28. package/dist/cli/diag.js +2 -2
  29. package/dist/cli/handoff-command.js +18 -5
  30. package/dist/cli/index.js +81 -64
  31. package/dist/cli/init.js +2 -2
  32. package/dist/cli/managed-command-guard.js +5 -0
  33. package/dist/cli/memory-command.js +93 -12
  34. package/dist/cli/model.js +14 -138
  35. package/dist/cli/queue-command.js +51 -0
  36. package/dist/cli/response.js +5 -54
  37. package/dist/cli/session-command.js +194 -0
  38. package/dist/cli/skill-command.js +85 -3
  39. package/dist/cli/stats.js +10 -4
  40. package/dist/cli/task-command.js +1 -0
  41. package/dist/cli/task-context.js +16 -0
  42. package/dist/cli/thread-command.js +620 -0
  43. package/dist/cli/trigger-command.js +76 -50
  44. package/dist/config/builtin-roles.js +9 -7
  45. package/dist/config/config-field-policy.js +2 -3
  46. package/dist/config/config-manager.js +7 -2
  47. package/dist/config/resolved-config-op.js +3 -0
  48. package/dist/config-store.js +15 -0
  49. package/dist/core/agent-ipc-registration.js +65 -22
  50. package/dist/core/auth/agent-delegation.js +42 -2
  51. package/dist/core/auth/debug-context.js +139 -0
  52. package/dist/core/auth/delegation-authorization.js +1 -0
  53. package/dist/core/auth/operation-authorizer.js +24 -1
  54. package/dist/core/auth/operation-catalog.js +44 -3
  55. package/dist/core/background-session/session-cleanup.js +212 -0
  56. package/dist/core/background-session/types.js +10 -0
  57. package/dist/core/bootstrap-messages.js +1 -1
  58. package/dist/core/bootstrap-service.js +6 -3
  59. package/dist/core/command/command-handler.js +224 -45
  60. package/dist/core/command/diag-service.js +5 -1
  61. package/dist/core/command/memory-slash.js +6 -2
  62. package/dist/core/command/menu-catalog.js +48 -1
  63. package/dist/core/command/menu-handler.js +92 -16
  64. package/dist/core/command/menu-protocol.js +24 -1
  65. package/dist/core/command/skill-slash.js +322 -0
  66. package/dist/core/command/slash-gate.js +6 -4
  67. package/dist/core/command/slash-handler.js +193 -13
  68. package/dist/core/command/topic-slash.js +528 -0
  69. package/dist/core/evolagent-registry.js +20 -5
  70. package/dist/core/handoff/ipc-registration.js +38 -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 +210 -9
  74. package/dist/core/memory/consolidation-context.js +49 -16
  75. package/dist/core/memory/consolidation-ops-records.js +35 -0
  76. package/dist/core/memory/consolidation-queue-format.js +21 -0
  77. package/dist/core/memory/consolidation.js +174 -180
  78. package/dist/core/message/aun-ipc-sender.js +207 -8
  79. package/dist/core/message/im-renderer.js +149 -6
  80. package/dist/core/message/message-bridge.js +13 -3
  81. package/dist/core/message/message-log.js +1 -0
  82. package/dist/core/message/message-queue.js +131 -3
  83. package/dist/core/message/peer-mode.js +6 -1
  84. package/dist/core/message/response-engine.js +379 -69
  85. package/dist/core/message/subtask-tool-projection.js +140 -0
  86. package/dist/core/model/catalog-service.js +17 -12
  87. package/dist/core/permission/ec-command-parser.js +126 -7
  88. package/dist/core/permission/sandbox-runtime.js +14 -1
  89. package/dist/core/session/session-idle-monitor.js +249 -22
  90. package/dist/core/session/session-manager.js +54 -9
  91. package/dist/core/skill/command-parser.js +13 -0
  92. package/dist/core/skill/index-generator.js +4 -1
  93. package/dist/core/skill/startup.js +41 -0
  94. package/dist/core/skill/switch-resolver.js +55 -29
  95. package/dist/core/task/task-recovery-service.js +2 -0
  96. package/dist/core/task/task-resume-operation.js +11 -0
  97. package/dist/core/thread/command-parser.js +125 -0
  98. package/dist/core/thread/index.js +1 -0
  99. package/dist/core/thread/ipc-operation.js +95 -0
  100. package/dist/core/thread/thread-context-storage.js +131 -0
  101. package/dist/core/thread/thread-operation.js +258 -0
  102. package/dist/core/thread/thread-route.js +33 -0
  103. package/dist/core/thread/thread-service.js +777 -0
  104. package/dist/core/thread/types.js +1 -0
  105. package/dist/eck/message-renderer.js +35 -0
  106. package/dist/index.js +10 -7
  107. package/dist/ipc.js +234 -17
  108. package/dist/paths.js +23 -0
  109. package/dist/response-system/engines/v1/proactive-flow.js +169 -80
  110. package/dist/trigger/authorization.js +59 -29
  111. package/dist/trigger/feedback.js +7 -1
  112. package/dist/trigger/ipc-service.js +49 -35
  113. package/dist/trigger/parser.js +63 -1
  114. package/dist/trigger/script-sandbox.js +58 -77
  115. package/dist/trigger/validation.js +14 -0
  116. package/dist/utils/error-utils.js +22 -1
  117. package/kits/docs/AUTHORING.md +1 -1
  118. package/kits/docs/channels/aun.md +8 -0
  119. package/kits/docs/context-assembly.md +1 -0
  120. package/kits/docs/evolcore/INDEX.md +3 -2
  121. package/kits/docs/evolcore/agent-create.md +39 -28
  122. package/kits/docs/evolcore/agent.md +19 -4
  123. package/kits/docs/evolcore/ec-capabilities.md +4 -0
  124. package/kits/docs/evolcore/group-collaboration.md +3 -5
  125. package/kits/docs/evolcore/group.md +3 -4
  126. package/kits/docs/evolcore/memory-consolidation.md +1 -1
  127. package/kits/docs/evolcore/menu-exec-schema-commands.md +2 -2
  128. package/kits/docs/evolcore/menu-protocol.md +7 -0
  129. package/kits/docs/evolcore/msg.md +5 -8
  130. package/kits/docs/evolcore/task.md +2 -0
  131. package/kits/docs/evolcore/thread-chain.md +267 -0
  132. package/kits/docs/evolcore/trigger.md +2 -2
  133. package/kits/docs/prompt-loading-architecture.md +1 -0
  134. package/kits/eck_manifest.json +61 -26
  135. package/kits/eck_message_manifest.json +169 -10
  136. package/kits/rules/01-overview.md +0 -9
  137. package/kits/rules/05-venue.md +1 -1
  138. package/kits/rules/06-channel.md +7 -1
  139. package/kits/rules/07-memory-and-thread.md +202 -0
  140. package/kits/schemas/relation-config.schema.9.json +18 -3
  141. package/kits/schemas/role-config.schema.1.json +6 -6
  142. package/kits/schemas/single-session.schema.1.json +6 -6
  143. package/kits/schemas/single-session.schema.2.json +6 -6
  144. package/kits/schemas/single-session.schema.3.json +6 -6
  145. package/kits/skills/.switches.json +12 -1
  146. package/kits/skills/ec-group/SKILL.md +234 -0
  147. package/kits/skills/ec-skill/SKILL.md +10 -1
  148. package/kits/skills/ec-skill/scripts/cli.mjs +15 -1
  149. package/kits/skills/scrapling-article-fetch/SKILL.md +128 -0
  150. package/kits/skills/scrapling-article-fetch/scripts/check_python_env.py +54 -0
  151. package/kits/skills/scrapling-article-fetch/scripts/render_markdown_reply.py +35 -0
  152. package/kits/skills/scrapling-article-fetch/scripts/run_pipeline.sh +16 -0
  153. package/kits/skills/scrapling-article-fetch/scripts/scrapling_fetch.py +344 -0
  154. package/kits/skills/thread-ops/SKILL.md +492 -0
  155. package/kits/skills/wechat-article-media-download/SKILL.md +65 -0
  156. package/kits/skills/wechat-article-media-download/scripts/download.py +163 -0
  157. package/kits/skills/wechat-article-reader/SKILL.md +97 -0
  158. package/kits/skills/wechat-article-reader/scripts/fetch.mjs +256 -0
  159. package/kits/templates/bootstrap-welcome.md +7 -7
  160. package/kits/templates/memory-consolidation/forget.md +5 -0
  161. package/kits/templates/memory-consolidation/generalize.md +5 -0
  162. package/kits/templates/memory-consolidation/profile.md +5 -0
  163. package/kits/templates/memory-consolidation/promote.md +5 -0
  164. package/kits/templates/message-fragments/item.md +2 -1
  165. package/kits/templates/message-fragments/thread-context.md +6 -0
  166. package/kits/templates/message-fragments/trigger-session.md +2 -0
  167. package/kits/templates/message-fragments/trigger-thread-check.md +2 -0
  168. package/kits/templates/roles/member.json +2 -0
  169. package/kits/templates/roles/visitor.json +2 -0
  170. package/kits/templates/system-fragments/bootstrap.md +66 -72
  171. package/kits/templates/system-fragments/channel.md +3 -6
  172. package/kits/templates/system-fragments/commands.md +2 -1
  173. package/kits/templates/system-fragments/managed-runtime.md +15 -0
  174. package/kits/templates/system-fragments/reply.md +3 -2
  175. package/kits/templates/system-fragments/session.md +5 -14
  176. package/package.json +3 -1
  177. package/kits/docs/evolcore/group-fs.md +0 -17
  178. package/kits/docs/venues/aun-group.md +0 -45
  179. package/kits/docs/venues/group.md +0 -43
@@ -10,9 +10,9 @@
10
10
 
11
11
  文件输入限制为 4 MiB,拒绝符号链接、junction、硬链接、路径逃逸、其他会话临时目录、密钥及其他 Agent 私有数据。普通定义导入必须属于当前 Agent;脚本只上传 `execution.script.path` 指定的单个文件,不允许覆盖 `trigger.json`、`active.json` 等管理状态。绝对 `--script-path` 会上传脚本内容并保存 Agent 内相对路径,不保留宿主绝对路径。`--help` / `-h` 在鉴权和文件读取前返回。
12
12
 
13
- 普通脚本 Trigger 按每次执行重新核验的 Agent 授权运行,`bypass` 不等于宿主权限:项目按有效模式只读或可写,脚本使用只读快照,只有当前 run 的临时工作目录可写,不继承 daemon 凭据或 IPC 入口,网络禁用。脚本快照位置不同于持久化 Trigger 目录;需要项目资源时按工作目录定位,不能依赖 Trigger 状态文件或其他脚本附件。Node `.js` 保留原 package 的模块类型。
13
+ 普通脚本 Trigger 按每次执行重新核验的 Agent 授权运行,复用主会话的权限模式与 H/L 路径保护:`readonly` 项目只读且禁止读取 L 类路径,`auto/request` 项目可写、L 类路径只读;认证 `owner + bypass` 关闭项目写入沙箱,但仍遮蔽 H 类路径并保护 L 类路径。网络默认开放,不需要网络权限配置;保留宿主 HOME、Git/SSH 与代理环境,清除 daemon 凭据、任务 delegation 和代码注入变量。`request` 的非交互脚本不能申请额外权限,越界操作直接失败,不自动升级。脚本使用只读快照和独立临时工作目录;快照位置不同于持久化 Trigger 目录,需要项目资源时按工作目录定位。Node `.js` 保留原 package 的模块类型。
14
14
 
15
- - Linux:需要可用的 `bubblewrap`,使用独立根文件系统及进程/网络命名空间,仅绑定项目、最小系统运行时和当前 run。
15
+ - Linux:需要可用的 `bubblewrap`,复用会话权限运行时的进程隔离和 H/L 路径保护,不隔离网络命名空间;受限模式将宿主根目录只读映射,按权限开放项目和当前 run 临时目录,完整保留系统依赖及 `/etc/alternatives` 链接。
16
16
  - Windows:需要支持受限读取策略的原生 Codex CLI,以及宿主已准备好的 elevated sandbox。每次启动前先用同一个临时 canary 验证“显式授权可读、撤回授权后拒绝读取”和当前 run 可写;只有权限拒绝才算通过,文件不存在、探针超时或取消均失败关闭。旧初始化、不支持的运行时或无法证明读取隔离时返回 `SCRIPT_SANDBOX_UNAVAILABLE`,不会启动用户脚本;托管任务不会自动提权、初始化沙箱或降级为宿主执行。
17
17
  - 其他平台:当前普通脚本执行失败关闭,不提供未隔离的回退。
18
18
 
@@ -117,6 +117,7 @@
117
117
  | 55 | commands | channel≠null | ✓ | 命令集能力卡 |
118
118
  | 60 | session | always | ✓ | 会话层 fragment(含 localDate/weekday) |
119
119
  | 70 | baseagent | baseAgent≠null | ✓ | base agent 配置 fragment |
120
+ | 80 | managed-runtime-notice | lifecycle=active | ✓ | 托管运行时提示(勿重复读 $KITS_RULES/ 与 CLAUDE.md 指令) |
120
121
 
121
122
  ### 输出结构
122
123
 
@@ -45,6 +45,32 @@
45
45
  },
46
46
  "description": "身份层:我是谁"
47
47
  },
48
+ {
49
+ "id": "skills-builtin",
50
+ "type": "file",
51
+ "file": "$AGENT_DIR/skills/.index-builtin.md",
52
+ "order": 20.5,
53
+ "needsInjection": false,
54
+ "optional": true,
55
+ "when": {
56
+ "var": "lifecycle",
57
+ "eq": "active"
58
+ },
59
+ "description": "内置技能索引"
60
+ },
61
+ {
62
+ "id": "skills-local",
63
+ "type": "file",
64
+ "file": "$AGENT_DIR/skills/.index-local.md",
65
+ "order": 20.6,
66
+ "needsInjection": false,
67
+ "optional": true,
68
+ "when": {
69
+ "var": "lifecycle",
70
+ "eq": "active"
71
+ },
72
+ "description": "本机技能索引"
73
+ },
48
74
  {
49
75
  "id": "persona",
50
76
  "type": "file",
@@ -85,32 +111,6 @@
85
111
  },
86
112
  "description": "个人资料(personal.md)"
87
113
  },
88
- {
89
- "id": "skills-builtin",
90
- "type": "file",
91
- "file": "$AGENT_DIR/skills/.index-builtin.md",
92
- "order": 20.5,
93
- "needsInjection": false,
94
- "optional": true,
95
- "when": {
96
- "var": "lifecycle",
97
- "eq": "active"
98
- },
99
- "description": "内置技能索引"
100
- },
101
- {
102
- "id": "skills-local",
103
- "type": "file",
104
- "file": "$AGENT_DIR/skills/.index-local.md",
105
- "order": 20.6,
106
- "needsInjection": false,
107
- "optional": true,
108
- "when": {
109
- "var": "lifecycle",
110
- "eq": "active"
111
- },
112
- "description": "本机技能索引"
113
- },
114
114
  {
115
115
  "id": "relation-layer",
116
116
  "type": "file",
@@ -346,6 +346,29 @@
346
346
  },
347
347
  "description": "客户端环境文档"
348
348
  },
349
+ {
350
+ "id": "memory-and-thread",
351
+ "type": "file",
352
+ "file": "$KITS_RULES/07-memory-and-thread.md",
353
+ "order": 46,
354
+ "needsInjection": false,
355
+ "when": {
356
+ "and": [
357
+ {
358
+ "var": "chatType",
359
+ "in": [
360
+ "private",
361
+ "group"
362
+ ]
363
+ },
364
+ {
365
+ "var": "lifecycle",
366
+ "eq": "active"
367
+ }
368
+ ]
369
+ },
370
+ "description": "记忆与话题:持久化上下文的两套机制(memory + thread)"
371
+ },
349
372
  {
350
373
  "id": "reply-contract",
351
374
  "type": "file",
@@ -440,6 +463,18 @@
440
463
  ]
441
464
  },
442
465
  "description": "Base Agent 特定配置"
466
+ },
467
+ {
468
+ "id": "managed-runtime-notice",
469
+ "type": "file",
470
+ "file": "$KITS_FRAGMENTS/managed-runtime.md",
471
+ "order": 80,
472
+ "needsInjection": true,
473
+ "when": {
474
+ "var": "lifecycle",
475
+ "eq": "active"
476
+ },
477
+ "description": "托管运行时提示:上下文已就绪,勿重复读取"
443
478
  }
444
479
  ]
445
480
  }
@@ -10,7 +10,18 @@
10
10
  "modeType": "inject",
11
11
  "modeName": "default",
12
12
  "isDefault": true,
13
- "when": { "and": [ { "var": "isOwnerHint", "eq": true }, { "var": "renderMode_inject", "eq": "default" } ] },
13
+ "when": {
14
+ "and": [
15
+ {
16
+ "var": "isOwnerHint",
17
+ "eq": true
18
+ },
19
+ {
20
+ "var": "renderMode_inject",
21
+ "eq": "default"
22
+ }
23
+ ]
24
+ },
14
25
  "description": "观察者插话提示渲染(owner 信封头·default 模式)"
15
26
  },
16
27
  {
@@ -21,8 +32,23 @@
21
32
  "needsInjection": true,
22
33
  "modeType": "handoff",
23
34
  "modeName": "request_to_target",
24
- "when": { "and": [ { "var": "isHandoff", "eq": true }, { "var": "handoffKind", "eq": "request_to_target" }, { "var": "handoffReturnPolicy", "eq": "required" } ] },
25
- "description": "msg send 跨会话请求回复上下文渲染"
35
+ "when": {
36
+ "and": [
37
+ {
38
+ "var": "isHandoff",
39
+ "eq": true
40
+ },
41
+ {
42
+ "var": "handoffKind",
43
+ "eq": "request_to_target"
44
+ },
45
+ {
46
+ "var": "handoffReturnPolicy",
47
+ "eq": "required"
48
+ }
49
+ ]
50
+ },
51
+ "description": "[DEPRECATED] msg send 跨会话请求回复上下文渲染(handoff 已被 Thread Context 取代,见 docs/thread-chain/handoff-deprecation.md)"
26
52
  },
27
53
  {
28
54
  "id": "msg-handoff-context-to-target",
@@ -32,8 +58,23 @@
32
58
  "needsInjection": true,
33
59
  "modeType": "handoff",
34
60
  "modeName": "request_to_target",
35
- "when": { "and": [ { "var": "isHandoff", "eq": true }, { "var": "handoffKind", "eq": "request_to_target" }, { "var": "handoffReturnPolicy", "eq": "none" } ] },
36
- "description": "msg send 跨会话单次本地上下文渲染"
61
+ "when": {
62
+ "and": [
63
+ {
64
+ "var": "isHandoff",
65
+ "eq": true
66
+ },
67
+ {
68
+ "var": "handoffKind",
69
+ "eq": "request_to_target"
70
+ },
71
+ {
72
+ "var": "handoffReturnPolicy",
73
+ "eq": "none"
74
+ }
75
+ ]
76
+ },
77
+ "description": "[DEPRECATED] msg send 跨会话单次本地上下文渲染(handoff 已被 Thread Context 取代,见 docs/thread-chain/handoff-deprecation.md)"
37
78
  },
38
79
  {
39
80
  "id": "msg-handoff-response-to-origin",
@@ -43,8 +84,80 @@
43
84
  "needsInjection": true,
44
85
  "modeType": "handoff",
45
86
  "modeName": "response_to_origin",
46
- "when": { "and": [ { "var": "isHandoff", "eq": true }, { "var": "handoffKind", "eq": "response_to_origin" } ] },
47
- "description": "msg send 跨会话结果回流上下文渲染"
87
+ "when": {
88
+ "and": [
89
+ {
90
+ "var": "isHandoff",
91
+ "eq": true
92
+ },
93
+ {
94
+ "var": "handoffKind",
95
+ "eq": "response_to_origin"
96
+ }
97
+ ]
98
+ },
99
+ "description": "[DEPRECATED] msg send 跨会话结果回流上下文渲染(handoff 已被 Thread Context 取代,见 docs/thread-chain/handoff-deprecation.md)"
100
+ },
101
+ {
102
+ "id": "msg-trigger-thread-check",
103
+ "type": "file",
104
+ "file": "$KITS_MESSAGE_FRAGMENTS/trigger-thread-check.md",
105
+ "order": 5,
106
+ "needsInjection": true,
107
+ "modeType": "trigger-thread-check",
108
+ "modeName": "default",
109
+ "isDefault": true,
110
+ "when": {
111
+ "and": [
112
+ {
113
+ "var": "isTriggerMsg",
114
+ "eq": true
115
+ },
116
+ {
117
+ "var": "triggerMsgKind",
118
+ "eq": "thread-check"
119
+ }
120
+ ]
121
+ },
122
+ "description": "跨话题复查 Trigger 专属渲染(kind=thread-check:来源话题 + 目标话题 + 周期)"
123
+ },
124
+ {
125
+ "id": "msg-trigger-session",
126
+ "type": "file",
127
+ "file": "$KITS_MESSAGE_FRAGMENTS/trigger-session.md",
128
+ "order": 6,
129
+ "needsInjection": true,
130
+ "modeType": "trigger-session",
131
+ "modeName": "default",
132
+ "isDefault": true,
133
+ "when": {
134
+ "and": [
135
+ {
136
+ "var": "isTriggerMsg",
137
+ "eq": true
138
+ },
139
+ {
140
+ "var": "triggerMsgKind",
141
+ "neq": "thread-check"
142
+ }
143
+ ]
144
+ },
145
+ "description": "Trigger 唤醒消息渲染(trigger 信封头 + 触发时间 + 正文)"
146
+ },
147
+ {
148
+ "id": "msg-thread-context",
149
+ "type": "file",
150
+ "file": "$KITS_MESSAGE_FRAGMENTS/thread-context.md",
151
+ "order": 8,
152
+ "needsInjection": true,
153
+ "modeType": "thread-context",
154
+ "modeName": "default",
155
+ "isDefault": true,
156
+ "when": {
157
+ "var": "isThreadContext",
158
+ "eq": true
159
+ },
160
+ "description": "跨会话上下文注入(来源话题 + 空洞提示 + 复查 Trigger)"
48
161
  },
49
162
  {
50
163
  "id": "msg-private-default",
@@ -55,7 +168,30 @@
55
168
  "modeType": "private",
56
169
  "modeName": "default",
57
170
  "isDefault": true,
58
- "when": { "and": [ { "var": "isOwnerHint", "neq": true }, { "var": "chatType", "neq": "group" }, { "var": "renderMode_private", "eq": "default" } ] },
171
+ "when": {
172
+ "and": [
173
+ {
174
+ "var": "isOwnerHint",
175
+ "neq": true
176
+ },
177
+ {
178
+ "var": "isThreadContext",
179
+ "neq": true
180
+ },
181
+ {
182
+ "var": "isTriggerMsg",
183
+ "neq": true
184
+ },
185
+ {
186
+ "var": "chatType",
187
+ "neq": "group"
188
+ },
189
+ {
190
+ "var": "renderMode_private",
191
+ "eq": "default"
192
+ }
193
+ ]
194
+ },
59
195
  "description": "对端私聊消息渲染(default 模式;chatType 非 group 的非插话消息,含 handoff/coding/null 兜底)"
60
196
  },
61
197
  {
@@ -67,8 +203,31 @@
67
203
  "modeType": "group",
68
204
  "modeName": "default",
69
205
  "isDefault": true,
70
- "when": { "and": [ { "var": "isOwnerHint", "neq": true }, { "var": "chatType", "eq": "group" }, { "var": "renderMode_group", "eq": "default" } ] },
206
+ "when": {
207
+ "and": [
208
+ {
209
+ "var": "isOwnerHint",
210
+ "neq": true
211
+ },
212
+ {
213
+ "var": "isThreadContext",
214
+ "neq": true
215
+ },
216
+ {
217
+ "var": "isTriggerMsg",
218
+ "neq": true
219
+ },
220
+ {
221
+ "var": "chatType",
222
+ "eq": "group"
223
+ },
224
+ {
225
+ "var": "renderMode_group",
226
+ "eq": "default"
227
+ }
228
+ ]
229
+ },
71
230
  "description": "群聊消息渲染(default 模式)"
72
231
  }
73
232
  ]
74
- }
233
+ }
@@ -6,15 +6,6 @@ ECK 的总览:前置概念和框架结构。
6
6
 
7
7
  Base agent 是提供推理与生成能力的底层智能,规范值有 `claude`(Claude Code)、`codex`(Codex)、`gemini`(Gemini CLI)、`ecagent`(EvolCore 内置基座)四类。你就是当前会话的 base agent;具体是哪一类以 `[baseagent]` 段注入的 `baseAgentName` 为准,不要默认自己是 Claude Code。
8
8
 
9
- ### 外部 Coding Agent Skills 边界
10
-
11
- 当前会话由 EvolCore 托管时,不加载、不读取、不执行工作区之外的 coding-agent `SKILL.md`,包括
12
- `/home/evolcore/skills/eclink/SKILL.md`。该类 skill 只服务于独立运行、未接入 EvolCore 会话上下文的
13
- Codex/Claude Code 等独立工具实例。EvolCore 会话必须遵循本 ECK、daemon IPC 和渠道适配层提供的通信与权限路径。
14
-
15
- 尤其不要在 EvolCore 会话中因为看到 AUN/agent 间通信需求,就自行读取 `eclink` skill 或直接拼接 shell
16
- 命令调用 `ec`;发送必须经过当前会话的 delegated sender,以便锁定 self/peer、角色、审计和回执。
17
-
18
9
  ## AUN 是什么
19
10
 
20
11
  AUN(Agent Union Network)是 agent 间安全通信的网络协议,SDK 的 npm 包名 `@agentunion/fastaun`。
@@ -29,7 +29,7 @@
29
29
 
30
30
  | 位置 | 内容 |
31
31
  |------|------|
32
- | `$KITS_DOCS/venues/` | 环境层场景文档(只读,按需加载):`private.md` `group.md` `<channel>-<chatType>.md` `client-*.md` |
32
+ | `$KITS_DOCS/venues/` | 环境层场景文档(只读,按需加载):`private.md` `<channel>-<chatType>.md` `client-*.md`。群聊场景的完整指引已抽离为内置技能 `ec-group`,不再有 `venues/group.md` |
33
33
  | `$VENUES_DIR`(`$AGENT_DIR/venues/`) | **目前是死目录**:会被创建(含 `_index/` `_trash/`),但源码里 `agentVenuesDir()` 零调用点,无人读写 |
34
34
 
35
35
  > `venues/` 下若有 `aun#<group-aid>` 之类的实例目录,是已删除模块 `group-venue-sync.ts` 的历史残留,
@@ -45,7 +45,13 @@
45
45
  **完整命令集目录(含分类、触发词、适用场景)**:`$KITS_DOCS/evolcore/INDEX.md`。
46
46
  单个命令集的详细用法按需 Read 对应文档。
47
47
 
48
- 托管 Agent 任务禁止调用 `ec start`、`ec stop`、`ec restart` 或 `ec restart-monitor`。这些是宿主终端的进程生命周期命令;源码改动后 Agent 只负责构建并报告需要宿主重启,不得尝试、重试或建议 Agent 自己执行 `ec restart`。
48
+ ### 当前托管实例的生命周期保护
49
+
50
+ 托管 Agent 不得自行停止、重启或替换承载当前会话的 EvolCore 实例,包括针对该实例的 `ec stop`、`ec restart`、`ec restart-monitor` 和会启动替代进程的 `ec start`。限制以实际目标实例为准,不按命令名称、是否同主机或调用通道一概判定;`fullaccess` 不解除自身实例保护。
51
+
52
+ 其他 EvolCore 实例(包括同主机的独立实例和远程实例)不属于上述保护范围,操作仍须获得用户授权并满足目标端权限。SSH、受鉴权 API 或其他获准的管理通道均可使用,不限定为 SSH;通过回连、代理或端口转发实际操作自身实例,仍受上述限制。无法确认目标是否为自身实例时,应先核实,不得仅凭“远程”调用形式认定允许。
53
+
54
+ 修改承载当前会话的 EvolCore 源码后,Agent 只负责构建并报告需要宿主重启;`ec agent reload` 只重载配置/persona/memory,不重载源码。
49
55
 
50
56
  共同约定:
51
57
  - 以自己的 AID 为发送者
@@ -0,0 +1,202 @@
1
+ # 记忆与话题:持久化上下文的两套机制
2
+
3
+ 触发词:记忆/memory/话题/thread/summary/摘要/ec memory/ec thread/话题名/工作报告
4
+
5
+ 这两套机制共同解决"跨会话上下文丢失"的问题,但定位不同:
6
+
7
+ | 机制 | 粒度 | 作用 | 写入时机 |
8
+ |------|------|------|----------|
9
+ | 记忆(memory) | 对端级 / agent 级 / owner 级 | 跨所有话题持久化的长期事实 | 每轮对话中识别到值得保留的事实时 |
10
+ | 话题摘要(summary) | 话题级 | 这个话题的进展快照,供下次激活时快速恢复 | 阶段完成时、离开话题前 |
11
+
12
+ 两者不冲突,按粒度分工:对端的基本信息(偏好、角色、背景)写进记忆;这个任务线做了什么、结果如何写进话题摘要。
13
+
14
+ ---
15
+
16
+ ## 一、记忆系统(ec memory)
17
+
18
+ 记忆是写给自己、跨会话持久的事实。不要依赖会话上下文来记住用户说过的事,用记忆系统写下来。
19
+
20
+ ### 什么时候写记忆
21
+
22
+ **必须写的情况**:
23
+ - 用户告知了关于自己的事实(姓名、职业、偏好、背景)
24
+ - 用户明确要求"记住"某件事
25
+ - 发现了跨会话有用的规律(用户的工作方式、反馈模式)
26
+
27
+ **不要写的情况**:
28
+ - 当前话题的具体进展(写话题摘要,不写记忆)
29
+ - 只在本会话有意义的临时状态
30
+ - 代码结构、文件路径、git 历史(代码库本身就记录了)
31
+
32
+ ### 记忆命令
33
+
34
+ ```bash
35
+ # 写入新 note
36
+ ec memory note --slug <slug> [--tags <tag1,tag2>] "<正文>"
37
+
38
+ # 修改已有 note
39
+ ec memory note --slug <slug> --update "<新正文>"
40
+
41
+ # 查看记忆概览
42
+ ec memory show
43
+
44
+ # 查看待整理 notes
45
+ ec memory notes
46
+
47
+ # 触发整理会话(将 notes 归档为正式记忆)
48
+ ec memory consolidate
49
+ ```
50
+
51
+ ### 默认行为
52
+
53
+ 记忆写入动作默认**静默**,不打断对话。用户明确要求记住某事时,给一句简短确认("已记下"),然后继续。
54
+
55
+ ---
56
+
57
+ ## 二、话题系统(ec thread)
58
+
59
+ ### 标准工作流
60
+
61
+ ```bash
62
+ # 1. 列出本机所有 agent
63
+ ec agent list
64
+
65
+ # 2. 列出某 agent 有话题记录的所有对端
66
+ ec thread peers --self <selfAid>
67
+
68
+ # 3. 列出与某对端的所有话题(默认10条/页,含消息统计和摘要)
69
+ ec thread list <peer> --self <selfAid>
70
+
71
+ # 4. 翻页(页脚自动给出完整翻页命令,含真实 peer 和 selfAid)
72
+ ec thread list <peer> --self <selfAid> --page 2 --limit 10 --sort recent
73
+
74
+ # 5. 查看某话题的历史消息
75
+ ec thread history <peer>/<threadId> --self <selfAid> --limit 20
76
+
77
+ # 6. 查看/更新话题摘要
78
+ ec thread summary show <peer>/<threadId> --self <selfAid>
79
+ ```
80
+
81
+ ### 跨话题发送(联系当前对端以外的对象)
82
+
83
+ 一个话题只有本端与对端两端。当前话题能直接回复的只有本话题的对端;要联系**其他**对象,必须换到与该对象的话题上发送:
84
+
85
+ ```bash
86
+ # 1. 选中目标话题(没有就新建)
87
+ ec thread list <对方AID> --self <selfAid>
88
+ ec thread create <对方AID> --name "问题跟踪" --self <selfAid> # 返回 threadId
89
+
90
+ # 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 # 群对端
93
+ ```
94
+
95
+ - 不带 `--thread` 而直接把目标换成第三方,会被运行时拒绝(只能联系当前对端/群)
96
+ - `--thread` 指定的话题必须已存在于本端索引,否则报 `TOPIC_NOT_FOUND`
97
+ - 发送成功后本端写入 thread-inbox:目标话题下次被唤醒时注入一次来源话题上下文,然后删除
98
+ - `--check-every` 会创建周期复查 Trigger(每次发送各新建一个,名称 `check-<目标>-from-<来源>-<唯一后缀>`),
99
+ 需显式 `ec trigger cancel <trigger_id>` 结束;定位用返回的 `trigger_id`(`trig_…`),**不是名称**
100
+
101
+ ### 话题名称维护
102
+
103
+ **何时更新名称**(主动触发,不等对端问):
104
+
105
+ | 情况 | 操作 |
106
+ |------|------|
107
+ | 名称是"话题会话"、"你好"等无意义短语 | 立即改名 |
108
+ | 话题方向已明确,名称仍未反映内容 | 改名 |
109
+ | 话题完成,名称与成果不符 | 改名 |
110
+
111
+ **命名规范**:
112
+ - 不超过 20 字,用动词短语描述核心动作
113
+ - 好的示例:`skill 索引热更新 bug 修复`、`manifest 注入与 CLAUDE.md 冗余问题`
114
+ - 避免:日期、轮次序号、"话题会话"等占位词
115
+
116
+ ```bash
117
+ ec thread rename current "<新名称>" # 托管会话
118
+ ec thread rename <peer>/<threadId> "<新名称>" --self <selfAid> # 宿主终端
119
+ ```
120
+
121
+ ### 话题摘要维护
122
+
123
+ 摘要是话题的进展快照,**daemon 不自动总结**,需要主动写入。
124
+
125
+ **用户说"总结一下话题"时**(触发词:总结一下话题 / 总结话题 / 给这个话题写个总结 / 更新一下摘要):
126
+
127
+ 核心:`summary show` 打印 `coveredThroughTs`(上次覆盖到的时间戳)→ 用它作起点读增量 → 写新摘要。
128
+ `summary set` 自动把游标推进到当时话题最新一条。
129
+
130
+ ```bash
131
+ # 情形 A:就在当前话题里总结(对话在上下文,增量就是本轮对话,不用读历史)
132
+ ec thread summary show current # 1. 看上次摘要 + coveredThroughTs
133
+ ec thread summary set current "<摘要内容>" --name "<新标题>" # 2. 写摘要 + 标题(--name 必填)
134
+ # 游标自动推进;不想改名就传 --name -
135
+
136
+ # 情形 B:从别的话题/别处总结(必须读增量)
137
+ ec thread summary show <peer>/<threadId> # 1. 拿 coveredThroughTs
138
+ ec thread history <peer>/<threadId> --after <coveredThroughTs> --limit 50 # 2. 读增量
139
+ 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. 必要时改名
142
+ ```
143
+
144
+ **关键约束**:`summary set` 把游标设为**当时话题的最新一条**,所以跨话题总结**必须先把增量读完再写**——
145
+ 没读完就写,游标越过未读消息,它们下次不会再返回。
146
+
147
+ **改名**:`summary set --name "<新标题>"` 一次完成写摘要 + 改名(比单独跑 `rename` 省一步)。
148
+ `--name` 必填;要保留原标题就显式传 `--name -`。
149
+
150
+ **首次总结**:`summary show` 没有 `coveredThroughTs`(从未总结过,或是只带 `updatedAt` 的旧记录),
151
+ 此时从最新往回翻到你认为已覆盖的开头再写。
152
+
153
+ **必须写摘要的时机**:
154
+
155
+ | 时机 | 操作 |
156
+ |------|------|
157
+ | 用户明确说"总结一下" | 按上面的情形 A / B 序列执行 |
158
+ | 一个明确的阶段或任务完成 | 写入/更新摘要 |
159
+ | 即将跨话题路由(去问另一个 agent)之前 | 写入当前状态 |
160
+ | 话题状态改为 `completed` 之前 | 写入最终成果摘要 |
161
+ | 被唤醒时发现摘要显示"未总结" | 回顾历史后补写 |
162
+
163
+ **摘要规范**:
164
+ - 100 字以内,写给自己下次看,不是给对端展示
165
+ - 格式:`[谁]做了[什么],结果是[什么],遗留[什么]`
166
+ - 示例:`leiliang 要求把 skill 开关从默认开改为默认关。tl3 完成 switch-resolver.ts 修改并验证,107 个开关记录对应,daemon 已重启。`
167
+ - summary 是本端私有的(keyed by 本地 sessionId),只写"我下次该知道什么",不写给对端的话
168
+
169
+ ```bash
170
+ # 查看当前摘要和版本号
171
+ ec thread summary show current
172
+
173
+ # 写入摘要(单 agent)
174
+ ec thread summary set current "<摘要内容>"
175
+
176
+ # 写入摘要(多 agent 协作,用 CAS 防覆盖)
177
+ ec thread summary set current "<摘要内容>" --if-rev <当前rev>
178
+
179
+ # 查看摘要历史
180
+ ec thread summary log current
181
+ ```
182
+
183
+ `ec thread list` 输出里摘要显示"未总结"就是行动信号。
184
+
185
+ ### 话题状态管理
186
+
187
+ ```bash
188
+ ec thread status current in_progress # 开始处理
189
+ ec thread status current completed # 任务完成
190
+ # 状态值:pending | in_progress | completed | archived
191
+ ```
192
+
193
+ 状态改为 `completed` 前,先写入最终摘要。
194
+
195
+ ---
196
+
197
+ ## 三、不需要做的事
198
+
199
+ - 不要在每条消息后都更新摘要——只在阶段完成时
200
+ - 不要把话题摘要当成会议纪要——简短的进展摘记即可
201
+ - 不要把当前话题的进展写进记忆——那是话题摘要的工作
202
+ - 不要因为对端没问就不更新——摘要和记忆都是给自己的
@@ -72,10 +72,25 @@
72
72
  "x-merge": "scalar",
73
73
  "description": "群聊 auto 注意力分类的静默等待窗口,单位为毫秒;默认 3000"
74
74
  },
75
- "sessionIdleSec": {
76
- "type": "number",
75
+ "sessionLoop": {
76
+ "type": "object",
77
77
  "x-merge": "scalar",
78
- "description": "会话闲置周期,单位为秒;缺省或小于等于 0 关闭,正值小于 30 秒按 30 秒处理"
78
+ "description": "当前关系主会话的闲置触发设置;话题不继承",
79
+ "oneOf": [
80
+ {
81
+ "properties": { "enabled": { "const": false } },
82
+ "required": ["enabled"],
83
+ "additionalProperties": false
84
+ },
85
+ {
86
+ "properties": {
87
+ "enabled": { "const": true },
88
+ "idleSeconds": { "type": "integer", "minimum": 30, "maximum": 86400 }
89
+ },
90
+ "required": ["enabled", "idleSeconds"],
91
+ "additionalProperties": false
92
+ }
93
+ ]
79
94
  },
80
95
  "model": { "type": "string", "x-merge": "scalar" },
81
96
  "responseMode": { "type": "string", "x-merge": "scalar" },