evolcore 0.0.25 → 0.0.26
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.
- package/CHANGELOG.md +607 -565
- package/LICENSE +21 -21
- package/README.md +455 -455
- package/bin/codex-managed-acl.ps1 +160 -160
- package/bin/codex-managed-hook.mjs +208 -208
- package/bin/ec-safe-output.js +327 -327
- package/bin/ec.js +40 -29
- package/bin/install-codex-managed-hooks.mjs +582 -555
- package/dist/agents/baseagent.js +96 -46
- package/dist/agents/claude-runner.js +50 -12
- package/dist/agents/codex/app-server-client.js +13 -5
- package/dist/agents/codex/catalog.js +1 -1
- package/dist/agents/codex/diagnostics.js +34 -1
- package/dist/agents/codex-runner.js +121 -38
- package/dist/agents/ecagent-runner.js +4 -9
- package/dist/agents/gemini-runner.js +2 -7
- package/dist/agents/runner-types.js +25 -17
- package/dist/aun/aid/agentmd.js +81 -8
- package/dist/aun/aid/client.js +1 -1
- package/dist/aun/aid/identity.js +1 -1
- package/dist/aun/aid/index.js +1 -1
- package/dist/aun/aid/store.js +17 -13
- package/dist/aun/menu-client.js +74 -0
- package/dist/aun/msg/group.js +1 -1
- package/dist/aun/msg/managed-operation.js +1 -1
- package/dist/aun/msg/p2p.js +6 -1
- package/dist/aun/msg/upload.js +30 -22
- package/dist/channels/aun.js +329 -94
- package/dist/cli/agent-command.js +105 -84
- package/dist/cli/agent-create.js +112 -10
- package/dist/cli/agent.js +16 -5
- package/dist/cli/aun-commands.js +297 -296
- package/dist/cli/bench.js +20 -20
- package/dist/cli/config.js +47 -28
- package/dist/cli/contact.js +70 -13
- package/dist/cli/ctl-command.js +22 -22
- package/dist/cli/daemon-commands.js +105 -40
- package/dist/cli/diag.js +31 -0
- package/dist/cli/fs-command.js +67 -67
- package/dist/cli/handoff-command.js +41 -9
- package/dist/cli/index.js +83 -77
- package/dist/cli/link-rules.js +21 -21
- package/dist/cli/managed-command-guard.js +3 -0
- package/dist/cli/menu-client.js +46 -31
- package/dist/cli/net-check.js +22 -22
- package/dist/cli/queue-command.js +29 -29
- package/dist/cli/response.js +30 -30
- package/dist/cli/restart-monitor.js +87 -40
- package/dist/cli/stats.js +51 -51
- package/dist/cli/trigger-command.js +56 -56
- package/dist/config/builtin-roles.js +1 -0
- package/dist/config/config-operation-service.js +145 -0
- package/dist/config/contact-operation-service.js +96 -7
- package/dist/config/resolved-config-op.js +27 -7
- package/dist/core/agent-application-service.js +2 -1
- package/dist/core/auth/authorization-audit.js +20 -12
- package/dist/core/auth/operation-authorizer.js +25 -4
- package/dist/core/auth/operation-catalog.js +35 -4
- package/dist/core/auth/remote-access-store.js +40 -1
- package/dist/core/bootstrap-service.js +1 -1
- package/dist/core/command/command-handler.js +83 -26
- package/dist/core/command/diag-service.js +118 -0
- package/dist/core/command/menu-catalog.js +12 -3
- package/dist/core/command/menu-handler.js +47 -26
- package/dist/core/command/menu-protocol.js +5 -0
- package/dist/core/command/menu-token-store.js +41 -8
- package/dist/core/command/slash-gate.js +34 -4
- package/dist/core/command/slash-handler.js +86 -21
- package/dist/core/handoff/runtime.js +205 -27
- package/dist/core/handoff/store.js +193 -4
- package/dist/core/message/im-renderer.js +72 -21
- package/dist/core/message/message-bridge.js +69 -9
- package/dist/core/message/message-queue.js +26 -0
- package/dist/core/message/message-utils.js +1 -0
- package/dist/core/message/response-engine.js +47 -28
- package/dist/core/model/catalog-service.js +79 -49
- package/dist/core/model/context-window-suffix.js +33 -0
- package/dist/core/model/model-catalog.js +1 -1
- package/dist/core/model/model-permission.js +12 -3
- package/dist/core/permission/ec-command-parser.js +51 -12
- package/dist/core/permission/sandbox-runtime.js +36 -14
- package/dist/core/permission/tool-policy.js +2 -1
- package/dist/index.js +280 -163
- package/dist/ipc.js +54 -2
- package/dist/response-system/engines/v1/proactive-flow.js +59 -2
- package/dist/stats/billing.js +41 -15
- package/dist/stats/db.js +159 -159
- package/dist/stats/eck-vars.js +9 -9
- package/dist/stats/price-resolver.js +28 -10
- package/dist/stats/query.js +139 -139
- package/dist/stats/role-budget.js +6 -6
- package/dist/stats/writer.js +51 -51
- package/dist/utils/cross-platform.js +30 -1
- package/dist/utils/error-dict.json +160 -160
- package/dist/utils/error-utils.js +21 -0
- package/dist/utils/evolcore-version.js +129 -0
- package/dist/utils/logger.js +3 -1
- package/dist/utils/macos-autostart.js +22 -22
- package/dist/utils/model-prices.jsonl +23 -23
- package/dist/utils/npm-ops.js +176 -35
- package/dist/utils/welcome.js +22 -22
- package/ecagent/LICENSE +21 -21
- package/ecagent/NOTICE +11 -11
- package/ecagent/README.md +61 -61
- package/ecagent/dist/harness/compaction/branch-summarization.js +30 -30
- package/ecagent/dist/harness/compaction/compaction.js +83 -83
- package/ecagent/dist/harness/messages.js +7 -7
- package/kits/docs/GUIDE.md +20 -20
- package/kits/docs/INDEX.md +66 -66
- package/kits/docs/aun/CHEATSHEET.md +19 -19
- package/kits/docs/aun/SYNC_PROTOCOL.md +15 -15
- package/kits/docs/channels/aun.md +56 -56
- package/kits/docs/channels/feishu.md +56 -56
- package/kits/docs/context-assembly.md +364 -364
- package/kits/docs/eck_templates/GUIDE.template.md +22 -22
- package/kits/docs/eck_templates/INDEX.template.md +28 -28
- package/kits/docs/eck_templates/path-registry.template.md +33 -33
- package/kits/docs/eck_templates/runtime.template.md +19 -19
- package/kits/docs/evolcore/INDEX.md +71 -71
- package/kits/docs/evolcore/agent-create.md +170 -165
- package/kits/docs/evolcore/agent.md +66 -66
- package/kits/docs/evolcore/aid.md +60 -60
- package/kits/docs/evolcore/codex-windows-sandbox.md +146 -146
- package/kits/docs/evolcore/config.md +202 -195
- package/kits/docs/evolcore/contact.md +75 -68
- package/kits/docs/evolcore/ctl.md +46 -46
- package/kits/docs/evolcore/event.md +216 -216
- package/kits/docs/evolcore/fs-architecture.md +1215 -1215
- package/kits/docs/evolcore/fs.md +110 -110
- package/kits/docs/evolcore/group-collaboration.md +243 -243
- package/kits/docs/evolcore/group-fs.md +17 -17
- package/kits/docs/evolcore/group-rules.md +251 -251
- package/kits/docs/evolcore/group.md +152 -152
- package/kits/docs/evolcore/menu-client.md +42 -34
- package/kits/docs/evolcore/model.md +50 -50
- package/kits/docs/evolcore/msg.md +166 -165
- package/kits/docs/evolcore/response.md +75 -75
- package/kits/docs/evolcore/rpc.md +37 -37
- package/kits/docs/evolcore/self-summary.md +29 -29
- package/kits/docs/evolcore/stats.md +83 -83
- package/kits/docs/evolcore/storage.md +50 -50
- package/kits/docs/evolcore/trigger.md +575 -575
- package/kits/docs/identity/AID_PROFILE_SPEC.md +26 -26
- package/kits/docs/identity/PATH_OPS.md +16 -16
- package/kits/docs/identity/ROLE_DETAIL.md +25 -25
- package/kits/docs/identity/identity-tools.md +26 -26
- package/kits/docs/path-registry.md +62 -62
- package/kits/docs/prompt-loading-architecture.md +269 -269
- package/kits/docs/venues/aun-group.md +45 -45
- package/kits/docs/venues/aun-private.md +10 -10
- package/kits/docs/venues/client-desktop.md +10 -10
- package/kits/docs/venues/client-mobile.md +10 -10
- package/kits/docs/venues/feishu-group.md +13 -13
- package/kits/docs/venues/feishu-private.md +9 -9
- package/kits/docs/venues/group.md +37 -25
- package/kits/docs/venues/private.md +10 -10
- package/kits/eck_manifest.auxiliary.json +43 -43
- package/kits/eck_manifest.json +190 -190
- package/kits/eck_message_manifest.json +74 -74
- package/kits/migrations/README-role-config-v4.md +32 -32
- package/kits/migrations/migrate-contact-book-v2.mjs +748 -748
- package/kits/migrations/migrate-role-config-v4.mjs +614 -614
- package/kits/migrations/migrate-role-config-v5.mjs +365 -365
- package/kits/migrations/rename-config-file.mjs +99 -99
- package/kits/rules/01-overview.md +162 -162
- package/kits/rules/02-navigation.md +96 -96
- package/kits/rules/03-identity.md +36 -36
- package/kits/rules/04-relation.md +75 -75
- package/kits/rules/05-venue.md +60 -60
- package/kits/rules/06-channel.md +63 -63
- package/kits/schemas/_meta.json +53 -53
- package/kits/schemas/agent-config.schema.1.json +177 -177
- package/kits/schemas/agent-config.schema.10.json +395 -395
- package/kits/schemas/agent-config.schema.11.json +421 -421
- package/kits/schemas/agent-config.schema.12.json +427 -427
- package/kits/schemas/agent-config.schema.2.json +239 -239
- package/kits/schemas/agent-config.schema.3.json +119 -119
- package/kits/schemas/agent-config.schema.4.json +208 -208
- package/kits/schemas/agent-config.schema.5.json +326 -326
- package/kits/schemas/agent-config.schema.6.json +322 -322
- package/kits/schemas/agent-config.schema.7.json +303 -303
- package/kits/schemas/agent-config.schema.8.json +304 -304
- package/kits/schemas/agent-config.schema.9.json +364 -364
- package/kits/schemas/contact-book.schema.1.json +36 -36
- package/kits/schemas/contact-book.schema.2.json +43 -43
- package/kits/schemas/contact-book.schema.3.json +67 -67
- package/kits/schemas/daemon.schema.1.json +91 -91
- package/kits/schemas/daemon.schema.2.json +101 -101
- package/kits/schemas/daemon.schema.3.json +123 -123
- package/kits/schemas/daemon.schema.4.json +136 -136
- package/kits/schemas/daemon.schema.5.json +135 -135
- package/kits/schemas/daemon.schema.6.json +131 -131
- package/kits/schemas/defaults.schema.1.json +81 -81
- package/kits/schemas/defaults.schema.2.json +85 -85
- package/kits/schemas/defaults.schema.3.json +73 -73
- package/kits/schemas/defaults.schema.4.json +107 -107
- package/kits/schemas/defaults.schema.5.json +119 -119
- package/kits/schemas/menu-exec-schema-commands.md +208 -208
- package/kits/schemas/migrations/README.md +30 -30
- package/kits/schemas/relation-config.schema.1.json +158 -158
- package/kits/schemas/relation-config.schema.2.json +73 -73
- package/kits/schemas/relation-config.schema.3.json +50 -50
- package/kits/schemas/relation-config.schema.4.json +47 -47
- package/kits/schemas/relation-config.schema.5.json +47 -47
- package/kits/schemas/relation-config.schema.6.json +46 -46
- package/kits/schemas/relation-config.schema.7.json +59 -59
- package/kits/schemas/relation-config.schema.8.json +103 -103
- package/kits/schemas/role-config.schema.1.json +201 -201
- package/kits/schemas/role-registry.schema.1.json +35 -35
- package/kits/schemas/single-session.schema.1.json +31 -31
- package/kits/schemas/single-session.schema.2.json +57 -57
- package/kits/schemas/single-session.schema.3.json +32 -32
- package/kits/templates/bootstrap-welcome.md +17 -17
- package/kits/templates/message-fragments/handoff-context-to-target.md +9 -9
- package/kits/templates/message-fragments/handoff-request-to-target.md +19 -19
- package/kits/templates/message-fragments/handoff-response-to-origin.md +9 -9
- package/kits/templates/message-fragments/inject-default.md +2 -2
- package/kits/templates/message-fragments/item.md +2 -2
- package/kits/templates/roles/admin.json +92 -92
- package/kits/templates/roles/member.json +96 -96
- package/kits/templates/roles/owner.json +9 -9
- package/kits/templates/roles/visitor.json +85 -85
- package/kits/templates/system-fragments/baseagent.md +14 -14
- package/kits/templates/system-fragments/bootstrap.md +31 -29
- package/kits/templates/system-fragments/channel.md +64 -64
- package/kits/templates/system-fragments/commands.md +28 -28
- package/kits/templates/system-fragments/identity.md +13 -13
- package/kits/templates/system-fragments/relation.md +19 -19
- package/kits/templates/system-fragments/session.md +59 -59
- package/kits/templates/system-fragments/venue.md +31 -31
- package/package.json +100 -98
|
@@ -1,272 +1,272 @@
|
|
|
1
|
-
# EvolCore 提示词装载全景(Prompt Loading Architecture)
|
|
2
|
-
|
|
3
|
-
> 文档范围:消息从渠道到 base agent 的完整提示词装载流程,涵盖系统提示词渲染层与消息渲染层两套机制。
|
|
4
|
-
> 最后更新:2026-06-04
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 总体数据流
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
收到一条消息
|
|
12
|
-
│
|
|
13
|
-
▼
|
|
14
|
-
┌──────────────────────────────────────────────────────────┐
|
|
15
|
-
│ MessageBridge │
|
|
16
|
-
│ • 消息预处理(去重/拦截/chatType 填充) │
|
|
17
|
-
│ • messagePrefix 硬编码已移除(归消息渲染层) │
|
|
18
|
-
│ • 构造 Message(含 items=undefined 此时) │
|
|
19
|
-
└──────────────────────┬───────────────────────────────────┘
|
|
20
|
-
│
|
|
21
|
-
▼
|
|
22
|
-
┌──────────────────────────────────────────────────────────┐
|
|
23
|
-
│ MessageQueue │
|
|
24
|
-
│ • 去重 / 单聊 interrupt / 群聊 FIFO │
|
|
25
|
-
│ • dequeueGreedy:弹出连续同 peerId 消息 │
|
|
26
|
-
│ • mergeItems(多条时): │
|
|
27
|
-
│ - content = join('\n')(兜底) │
|
|
28
|
-
│ - items[] = 每条 SubMessage{peer,time,images,...} │
|
|
29
|
-
│ - images/mentions 扁平合并(给 runQuery 的总量) │
|
|
30
|
-
└──────────────────────┬───────────────────────────────────┘
|
|
31
|
-
│ Message(可能带 items[])
|
|
32
|
-
▼
|
|
33
|
-
┌──────────────────────────────────────────────────────────┐
|
|
34
|
-
│ MessageProcessor.processMessage() │
|
|
35
|
-
│ │
|
|
36
|
-
│ ① wrapPrompt 准备(中断包装函数) │
|
|
37
|
-
│ effectivePrompt = wrapPrompt(message.content) ← 兜底 │
|
|
38
|
-
│ │
|
|
39
|
-
│ ② 构造 kitCtx.vars(~47 个变量,见下节) │
|
|
40
|
-
│ │
|
|
41
|
-
│ ③ 系统提示词渲染层 │
|
|
42
|
-
│ renderKitSections(kitCtx) │
|
|
43
|
-
│ effectiveSystemPrompt = persona + kitContext │
|
|
44
|
-
│ │
|
|
45
|
-
│ ④ 消息渲染层 │
|
|
46
|
-
│ renderMessageBody(items, kitCtx.vars, sessionId) │
|
|
47
|
-
│ effectivePrompt = wrapPrompt(body) ← 覆盖兜底 │
|
|
48
|
-
│ renderImages = result.images │
|
|
49
|
-
│ │
|
|
50
|
-
│ ⑤ agent.runQuery( │
|
|
51
|
-
│ effectivePrompt, │
|
|
52
|
-
│ renderImages ?? message.images, │
|
|
53
|
-
│ effectiveSystemPrompt, │
|
|
54
|
-
│ modelOverride │
|
|
55
|
-
│ ) │
|
|
56
|
-
└──────────────────────────────────────────────────────────┘
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## 两个渲染层对比
|
|
62
|
-
|
|
63
|
-
| | 系统提示词渲染层 | 消息渲染层 |
|
|
64
|
-
|--|--|--|
|
|
65
|
-
| **驱动文件** | `kits/eck_manifest.json`(默认;按 `session.sessionType` 经 config.sessionManifests 可切到 `eck_manifest.<type>.json`,如 auxiliary) | `kits/eck_message_manifest.json` |
|
|
66
|
-
| **覆盖文件** | `$EVOLCORE_HOME/eck/<驱动文件名>` | `$EVOLCORE_HOME/eck/eck_message_manifest.json` |
|
|
67
|
-
| **模板目录** | `kits/templates/system-fragments/` | `kits/templates/message-fragments/` |
|
|
68
|
-
| **输出去向** | `systemPrompt.append`(每轮覆盖,不进 transcript) | `effectivePrompt`(进 transcript,成永久历史) |
|
|
69
|
-
| **vars 粒度** | 会话级(一次构造,整批复用) | item 级(每条叠加 peerName/now/images) |
|
|
70
|
-
| **模板空行** | 删除(stripBlankLines=true,紧凑) | 保留(stripBlankLines=false,消息多段) |
|
|
71
|
-
| **content 注入** | N/A | 哨兵末步字面量注入(防二次解析) |
|
|
72
|
-
| **缓存** | 随包 `kits/` 文件跨 session 缓存到 reload;personal/relations 等运行时文件按 mtime 刷新 | 随包模板缓存到 reload,消息数据不缓存 |
|
|
73
|
-
| **debug 输出** | `eck-debug/context-*.md` `fragments-*.md` `manifest-*.md` `vars-*.json` | `eck-debug/msg-render-*.md` |
|
|
74
|
-
|
|
75
|
-
---
|
|
76
|
-
|
|
77
|
-
## manifest 共享引擎(manifest-engine.ts)
|
|
78
|
-
|
|
79
|
-
两个渲染层共用同一套原语,由 `src/eck/manifest-engine.ts` 提供:
|
|
80
|
-
|
|
81
|
-
| 函数 | 作用 |
|
|
82
|
-
|------|------|
|
|
83
|
-
| `loadManifest(filename)` | 加载并合并 manifest,按文件名缓存 |
|
|
84
|
-
| `evaluateWhen(when, vars)` | 求值 section 加载条件 |
|
|
85
|
-
| `renderTemplate(tpl, vars, stripBlankLines)` | 条件块 + 变量替换,可选删空行 |
|
|
86
|
-
| `resolvePathWithDiag(rawPath, vars)` | `$VAR` / `{{key}}` 路径展开 + 诊断 |
|
|
87
|
-
| `loadSectionFiles(section, vars, cache)` | 按 section 类型加载文件内容 |
|
|
88
|
-
| `buildPathMappings(vars)` / `shortenPath` | debug 输出路径别名化 |
|
|
89
|
-
| `invalidateManifestCache()` | 清全部 manifest 缓存 |
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## 系统提示词渲染层详解
|
|
94
|
-
|
|
95
|
-
### 执行位置
|
|
96
|
-
|
|
97
|
-
`src/core/message/message-processor.ts` → `renderKitSections(kitCtx)` → `src/agents/kit-renderer.ts`
|
|
98
|
-
|
|
99
|
-
### manifest 默认段(按 order)
|
|
100
|
-
|
|
101
|
-
| order | id | 加载条件 | needsInjection | 内容 |
|
|
102
|
-
|-------|----|----|--------|------|
|
|
103
|
-
| 10 | rules | always | ✗ | `$KITS_RULES/` 目录(ECK 核心规则) |
|
|
104
|
-
| 20 | identity-layer | chatType≠null | ✓ | 身份层 fragment |
|
|
1
|
+
# EvolCore 提示词装载全景(Prompt Loading Architecture)
|
|
2
|
+
|
|
3
|
+
> 文档范围:消息从渠道到 base agent 的完整提示词装载流程,涵盖系统提示词渲染层与消息渲染层两套机制。
|
|
4
|
+
> 最后更新:2026-06-04
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 总体数据流
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
收到一条消息
|
|
12
|
+
│
|
|
13
|
+
▼
|
|
14
|
+
┌──────────────────────────────────────────────────────────┐
|
|
15
|
+
│ MessageBridge │
|
|
16
|
+
│ • 消息预处理(去重/拦截/chatType 填充) │
|
|
17
|
+
│ • messagePrefix 硬编码已移除(归消息渲染层) │
|
|
18
|
+
│ • 构造 Message(含 items=undefined 此时) │
|
|
19
|
+
└──────────────────────┬───────────────────────────────────┘
|
|
20
|
+
│
|
|
21
|
+
▼
|
|
22
|
+
┌──────────────────────────────────────────────────────────┐
|
|
23
|
+
│ MessageQueue │
|
|
24
|
+
│ • 去重 / 单聊 interrupt / 群聊 FIFO │
|
|
25
|
+
│ • dequeueGreedy:弹出连续同 peerId 消息 │
|
|
26
|
+
│ • mergeItems(多条时): │
|
|
27
|
+
│ - content = join('\n')(兜底) │
|
|
28
|
+
│ - items[] = 每条 SubMessage{peer,time,images,...} │
|
|
29
|
+
│ - images/mentions 扁平合并(给 runQuery 的总量) │
|
|
30
|
+
└──────────────────────┬───────────────────────────────────┘
|
|
31
|
+
│ Message(可能带 items[])
|
|
32
|
+
▼
|
|
33
|
+
┌──────────────────────────────────────────────────────────┐
|
|
34
|
+
│ MessageProcessor.processMessage() │
|
|
35
|
+
│ │
|
|
36
|
+
│ ① wrapPrompt 准备(中断包装函数) │
|
|
37
|
+
│ effectivePrompt = wrapPrompt(message.content) ← 兜底 │
|
|
38
|
+
│ │
|
|
39
|
+
│ ② 构造 kitCtx.vars(~47 个变量,见下节) │
|
|
40
|
+
│ │
|
|
41
|
+
│ ③ 系统提示词渲染层 │
|
|
42
|
+
│ renderKitSections(kitCtx) │
|
|
43
|
+
│ effectiveSystemPrompt = persona + kitContext │
|
|
44
|
+
│ │
|
|
45
|
+
│ ④ 消息渲染层 │
|
|
46
|
+
│ renderMessageBody(items, kitCtx.vars, sessionId) │
|
|
47
|
+
│ effectivePrompt = wrapPrompt(body) ← 覆盖兜底 │
|
|
48
|
+
│ renderImages = result.images │
|
|
49
|
+
│ │
|
|
50
|
+
│ ⑤ agent.runQuery( │
|
|
51
|
+
│ effectivePrompt, │
|
|
52
|
+
│ renderImages ?? message.images, │
|
|
53
|
+
│ effectiveSystemPrompt, │
|
|
54
|
+
│ modelOverride │
|
|
55
|
+
│ ) │
|
|
56
|
+
└──────────────────────────────────────────────────────────┘
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 两个渲染层对比
|
|
62
|
+
|
|
63
|
+
| | 系统提示词渲染层 | 消息渲染层 |
|
|
64
|
+
|--|--|--|
|
|
65
|
+
| **驱动文件** | `kits/eck_manifest.json`(默认;按 `session.sessionType` 经 config.sessionManifests 可切到 `eck_manifest.<type>.json`,如 auxiliary) | `kits/eck_message_manifest.json` |
|
|
66
|
+
| **覆盖文件** | `$EVOLCORE_HOME/eck/<驱动文件名>` | `$EVOLCORE_HOME/eck/eck_message_manifest.json` |
|
|
67
|
+
| **模板目录** | `kits/templates/system-fragments/` | `kits/templates/message-fragments/` |
|
|
68
|
+
| **输出去向** | `systemPrompt.append`(每轮覆盖,不进 transcript) | `effectivePrompt`(进 transcript,成永久历史) |
|
|
69
|
+
| **vars 粒度** | 会话级(一次构造,整批复用) | item 级(每条叠加 peerName/now/images) |
|
|
70
|
+
| **模板空行** | 删除(stripBlankLines=true,紧凑) | 保留(stripBlankLines=false,消息多段) |
|
|
71
|
+
| **content 注入** | N/A | 哨兵末步字面量注入(防二次解析) |
|
|
72
|
+
| **缓存** | 随包 `kits/` 文件跨 session 缓存到 reload;personal/relations 等运行时文件按 mtime 刷新 | 随包模板缓存到 reload,消息数据不缓存 |
|
|
73
|
+
| **debug 输出** | `eck-debug/context-*.md` `fragments-*.md` `manifest-*.md` `vars-*.json` | `eck-debug/msg-render-*.md` |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## manifest 共享引擎(manifest-engine.ts)
|
|
78
|
+
|
|
79
|
+
两个渲染层共用同一套原语,由 `src/eck/manifest-engine.ts` 提供:
|
|
80
|
+
|
|
81
|
+
| 函数 | 作用 |
|
|
82
|
+
|------|------|
|
|
83
|
+
| `loadManifest(filename)` | 加载并合并 manifest,按文件名缓存 |
|
|
84
|
+
| `evaluateWhen(when, vars)` | 求值 section 加载条件 |
|
|
85
|
+
| `renderTemplate(tpl, vars, stripBlankLines)` | 条件块 + 变量替换,可选删空行 |
|
|
86
|
+
| `resolvePathWithDiag(rawPath, vars)` | `$VAR` / `{{key}}` 路径展开 + 诊断 |
|
|
87
|
+
| `loadSectionFiles(section, vars, cache)` | 按 section 类型加载文件内容 |
|
|
88
|
+
| `buildPathMappings(vars)` / `shortenPath` | debug 输出路径别名化 |
|
|
89
|
+
| `invalidateManifestCache()` | 清全部 manifest 缓存 |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 系统提示词渲染层详解
|
|
94
|
+
|
|
95
|
+
### 执行位置
|
|
96
|
+
|
|
97
|
+
`src/core/message/message-processor.ts` → `renderKitSections(kitCtx)` → `src/agents/kit-renderer.ts`
|
|
98
|
+
|
|
99
|
+
### manifest 默认段(按 order)
|
|
100
|
+
|
|
101
|
+
| order | id | 加载条件 | needsInjection | 内容 |
|
|
102
|
+
|-------|----|----|--------|------|
|
|
103
|
+
| 10 | rules | always | ✗ | `$KITS_RULES/` 目录(ECK 核心规则) |
|
|
104
|
+
| 20 | identity-layer | chatType≠null | ✓ | 身份层 fragment |
|
|
105
105
|
| 21 | persona | chatType≠null | ✗ | `$PERSONAL_DIR/persona.md` |
|
|
106
106
|
| 21.5 | personal-profile | chatType≠null | ✗ | `$PERSONAL_DIR/personal.md` |
|
|
107
107
|
| 22 | working-memory | chatType≠null | ✗ | `$PERSONAL_DIR/memory/working.md` |
|
|
108
|
-
| 30 | relation-layer | chatType∈{private,group} | ✓ | 关系层 fragment |
|
|
109
|
-
| 35 | peer-profile | peerKey≠null | ✗ | 对端 profile.md |
|
|
110
|
-
| 40 | venue-fragment | chatType≠null | ✓ | 环境层 fragment |
|
|
111
|
-
| 41 | venue-chattype | chatType≠null | ✗ | `venues/{{chatType}}.md` |
|
|
112
|
-
| 42 | venue-channel-chattype | chatType≠null | ✗ | `venues/{{channel}}-{{chatType}}.md` |
|
|
113
|
-
| 44 | venue-client | clientType≠null | ✗ | `venues/client-{{clientType}}.md` |
|
|
114
|
-
| 50 | channel-layer | channel≠null | ✓ | 渠道层 fragment |
|
|
115
|
-
| 55 | commands | channel≠null | ✓ | 命令集能力卡 |
|
|
116
|
-
| 60 | session | always | ✓ | 会话层 fragment(含 localDate/weekday) |
|
|
117
|
-
| 70 | baseagent | baseAgent≠null | ✓ | base agent 配置 fragment |
|
|
118
|
-
|
|
119
|
-
### 输出结构
|
|
120
|
-
|
|
121
|
-
```
|
|
122
|
-
<system-reminder>
|
|
123
|
-
EvolCore Context Kit documents are shown below.
|
|
124
|
-
|
|
125
|
-
Contenu de $KITS_RULES/01-overview.md (rules — ECK 核心规则):
|
|
126
|
-
...(各 section 内容,按 order)
|
|
127
|
-
|
|
128
|
-
IMPORTANT: Use this context when it affects the current interaction.
|
|
129
|
-
</system-reminder>
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### 加载限额(防撑爆保护)
|
|
133
|
-
|
|
134
|
-
目录段与整个清单都有加载上限,超出即截断并注入说明(详见 `context-assembly.md`「目录加载限额」):
|
|
135
|
-
|
|
136
|
-
| 层级 | 维度 | 默认 | 覆盖字段 |
|
|
137
|
-
|------|------|------|---------|
|
|
138
|
-
| 单目录段 | 文件数 / 字节 | 20 / 40KB | section `maxFiles` / `maxBytes` |
|
|
139
|
-
| 整个清单 | 文件数 / 字节 | 50 / 100KB | 清单顶层 `totalMaxFiles` / `totalMaxBytes` |
|
|
140
|
-
|
|
141
|
-
超限时:单目录段末尾注入 `[注意] 目录 X 未完整加载…`;总闸超限则停止加载后续段,末尾注入 `[注意] …以下 section 未加载:<id 集合>`。截断信息同步进 `manifest-*.md` 调试输出。
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## 消息渲染层详解
|
|
146
|
-
|
|
147
|
-
### 执行位置
|
|
148
|
-
|
|
149
|
-
`src/core/message/message-processor.ts` → `renderMessageBody(items, vars, sessionId)` → `src/eck/message-renderer.ts`
|
|
150
|
-
|
|
151
|
-
### 渲染流程
|
|
152
|
-
|
|
153
|
-
```
|
|
154
|
-
for each SubMessage in items:
|
|
155
|
-
sentinel = '\x00ECMSG-<UUID>\x00' ← 每次调用独立,null 字节在渠道消息中不可能出现
|
|
156
|
-
itemVars = {
|
|
157
|
-
...sessionVars,
|
|
158
|
-
peerId / peerName / peerType, ← 本条消息自己的发送者
|
|
159
|
-
now = formatLocalTime(timestamp), ← 本条消息自己的时刻
|
|
160
|
-
content = sentinel, ← 占位,末步换回
|
|
161
|
-
}
|
|
162
|
-
loadManifest(eck_message_manifest) → 选段 → renderTemplate(stripBlankLines=false)
|
|
163
|
-
rendered.split(sentinel).join(item.content) ← 字面量注入,不二次解析
|
|
164
|
-
收集 item.images
|
|
165
|
-
|
|
166
|
-
join('\n\n') → { body: string, images: ImageData[] }
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
对于 `kind: "handoff"` 的消息,普通 private/group section 仍会命中并渲染标准消息信封;
|
|
170
|
-
`item.md` 通过 `{{?isHandoff!=true}}` 只在普通消息上输出正文,避免 handoff 当前回复重复。
|
|
171
|
-
随后按 handoff 类型追加专用上下文 fragment(request、return=none 或 response-to-origin)。
|
|
172
|
-
因此 handoff 消息与其它私聊、coding、群聊消息共享时间、发送者、角色、群、加密和 @ 等元数据格式,
|
|
173
|
-
只在其后增加一次性跨会话上下文。
|
|
174
|
-
|
|
175
|
-
### 批次包裹层(loop 段)
|
|
176
|
-
|
|
177
|
-
消息 manifest 里若有 `loop` 段(见 `context-assembly.md`「三段式循环」),逐条渲染结果会被**包裹**:
|
|
178
|
-
|
|
179
|
-
```
|
|
180
|
-
逐条渲染(每条走 renderOneItem,自带 content 哨兵)→ renderedParts[]
|
|
181
|
-
↓
|
|
182
|
-
wrapBatch:loop 段的 file 作 wrapper,渲染批次 vars(remainingInQueue/pendingCount 等,从 sessionVars 透传)
|
|
183
|
-
↓
|
|
184
|
-
wrapper 的 {{@loop}} 处字面量填入 renderedParts.join(separator)
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
- **child = renderOneItem 逐条结果**(不用 loop.childFile)——复用消息渲染的完整逻辑(哨兵/renderMode/图片/handoff)
|
|
188
|
-
- **哨兵天然生效**:每条 content 在 renderOneItem 内已哨兵化,wrapBatch 只做字面量拼接,用户消息里的 `{{}}` 不被解析
|
|
189
|
-
- loop 段的 `separator` 默认 `\n`(消息层若不设则逐条间用 `\n\n`;wrapper 内 loop 段可自定)
|
|
190
|
-
- **无 loop 段** → 回退现有 `join('\n\n')`,行为不变(向后兼容)
|
|
191
|
-
- loop 段只做批次包裹,不参与逐条 renderOneItem(renderOneItem 跳过 `section.loop`)
|
|
192
|
-
|
|
193
|
-
> 批次包裹层是响应模式(单会话/双会话)批量处理消息的基础设施:把背压信号、批次头尾
|
|
194
|
-
> 渲染在逐条消息外层,供辅助会话/主会话感知队列状态。
|
|
195
|
-
|
|
196
|
-
### 初始 manifest(一个段)
|
|
197
|
-
|
|
198
|
-
```json
|
|
199
|
-
{
|
|
200
|
-
"id": "msg-item",
|
|
201
|
-
"file": "$KITS_MESSAGE_FRAGMENTS/item.md",
|
|
202
|
-
"when": "always",
|
|
203
|
-
"needsInjection": true
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
### 紧凑模板(item.md)
|
|
208
|
-
|
|
209
|
-
```
|
|
210
|
-
‹{{now}}{{?chatType=group}} · {{peerName}}{{/}}›
|
|
211
|
-
{{content}}
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
- 私聊:`{{?chatType=group}}` 块收敛,只剩时间
|
|
215
|
-
- 群聊:时间 + 发送者名
|
|
216
|
-
- 改格式只动这一个文件,不动代码
|
|
217
|
-
|
|
218
|
-
---
|
|
219
|
-
|
|
220
|
-
## vars 时变性归属
|
|
221
|
-
|
|
222
|
-
### 进系统提示词(每轮覆盖,缓存友好)
|
|
223
|
-
|
|
224
|
-
| 类别 | 变量 |
|
|
225
|
-
|------|------|
|
|
226
|
-
| 静态(进程级) | `PACKAGE_ROOT` `KITS*` `evolcoreMode` `osInfo` `baseAgent` |
|
|
227
|
-
| 会话稳定 | `selfAid` `sessionId` `sessionKey` `chatType` `channel` `timezone` `tzOffset` `capabilities` `CURRENT_PROJECT` |
|
|
228
|
-
| 慢变(配置驱动) | `effectiveModel` `permissionMode` `peerRole` `readonly` `chatMode` `modelFallback*` |
|
|
229
|
-
| 新增(日期级) | `localDate`(YYYY-MM-DD)`weekday`(星期四),一天才变一次,缓存暖 ~24h |
|
|
230
|
-
|
|
231
|
-
### 进消息渲染层(每条独立,进 transcript 永久保真)
|
|
232
|
-
|
|
233
|
-
| 变量 | 说明 |
|
|
234
|
-
|------|------|
|
|
235
|
-
| `now` | 精确到秒的本地时间(含时区偏移),每条自己的发生时刻 |
|
|
236
|
-
| `peerName` / `peerId` / `peerType` | 群聊每条消息的发送者,单聊复用会话值 |
|
|
237
|
-
| `content` | 原始消息文本(字面量注入,不参与模板解析) |
|
|
238
|
-
| `images` | 按条归属的图片(SubMessage.images) |
|
|
239
|
-
|
|
240
|
-
---
|
|
241
|
-
|
|
242
|
-
## 关键保证
|
|
243
|
-
|
|
244
|
-
| 保证 | 实现方式 |
|
|
245
|
-
|------|---------|
|
|
246
|
-
| **模板注入防护** | 哨兵 `\x00ECMSG-<UUID>\x00`,per-call 独立,null 字节在任何渠道消息中不可能出现 |
|
|
247
|
-
| **消息不丢失** | manifest 无产出或渲染抛异常均显式 fallback 到 `wrapPrompt(message.content)` |
|
|
248
|
-
| **系统提示词不累积** | `systemPrompt.append` 是 SDK 每次 `query()` 的独立参数,随调用重传覆盖,不进 transcript |
|
|
249
|
-
| **图片归属** | `SubMessage.images` 按条保留,`renderMessageBody` 返回按顺序收集的 images;`runQuery` 用此数组而非 flat-merge 的 `message.images` |
|
|
250
|
-
| **群聊发送者保真** | 每条 SubMessage 携带自己的 peerName/peerId,进 transcript 成永久历史,模型可推理"谁说的、隔了多久" |
|
|
251
|
-
| **空消息安全** | `hasContent` guard,空消息不进渲染层,不传 `runQuery` |
|
|
252
|
-
|
|
253
|
-
---
|
|
254
|
-
|
|
255
|
-
## 文件索引
|
|
256
|
-
|
|
257
|
-
| 文件 | 角色 |
|
|
258
|
-
|------|------|
|
|
259
|
-
| `src/eck/manifest-engine.ts` | 共享渲染引擎原语 |
|
|
260
|
-
| `src/agents/kit-renderer.ts` | 系统提示词渲染,输出 `<system-reminder>` |
|
|
261
|
-
| `src/eck/message-renderer.ts` | 消息渲染层,输出 `{ body, images }` |
|
|
262
|
-
| `src/core/message/message-processor.ts` | 装配点:构造 vars,调两层渲染,调 runQuery |
|
|
263
|
-
| `src/core/message/message-queue.ts` | 队列合并:mergeItems 保留 items[] 和 per-item images |
|
|
264
|
-
| `src/core/message/message-bridge.ts` | 消息入口:已移除 messagePrefix 硬编码 |
|
|
265
|
-
| `src/types.ts` | SubMessage / Message.items 类型定义 |
|
|
266
|
-
| `kits/eck_manifest.json` | 系统提示词 manifest |
|
|
267
|
-
| `kits/eck_message_manifest.json` | 消息渲染 manifest |
|
|
268
|
-
| `kits/templates/system-fragments/session.md` | 含 localDate/weekday |
|
|
269
|
-
| `kits/templates/message-fragments/item.md` | 消息渲染紧凑模板 |
|
|
270
|
-
| `$EVOLCORE_HOME/eck/eck_manifest.json` | 系统提示词 manifest 用户覆盖(可选) |
|
|
271
|
-
| `$EVOLCORE_HOME/eck/eck_message_manifest.json` | 消息渲染 manifest 用户覆盖(可选) |
|
|
272
|
-
| `$EVOLCORE_HOME/data/eck-debug/` | 调试输出目录(保留 24h) |
|
|
108
|
+
| 30 | relation-layer | chatType∈{private,group} | ✓ | 关系层 fragment |
|
|
109
|
+
| 35 | peer-profile | peerKey≠null | ✗ | 对端 profile.md |
|
|
110
|
+
| 40 | venue-fragment | chatType≠null | ✓ | 环境层 fragment |
|
|
111
|
+
| 41 | venue-chattype | chatType≠null | ✗ | `venues/{{chatType}}.md` |
|
|
112
|
+
| 42 | venue-channel-chattype | chatType≠null | ✗ | `venues/{{channel}}-{{chatType}}.md` |
|
|
113
|
+
| 44 | venue-client | clientType≠null | ✗ | `venues/client-{{clientType}}.md` |
|
|
114
|
+
| 50 | channel-layer | channel≠null | ✓ | 渠道层 fragment |
|
|
115
|
+
| 55 | commands | channel≠null | ✓ | 命令集能力卡 |
|
|
116
|
+
| 60 | session | always | ✓ | 会话层 fragment(含 localDate/weekday) |
|
|
117
|
+
| 70 | baseagent | baseAgent≠null | ✓ | base agent 配置 fragment |
|
|
118
|
+
|
|
119
|
+
### 输出结构
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
<system-reminder>
|
|
123
|
+
EvolCore Context Kit documents are shown below.
|
|
124
|
+
|
|
125
|
+
Contenu de $KITS_RULES/01-overview.md (rules — ECK 核心规则):
|
|
126
|
+
...(各 section 内容,按 order)
|
|
127
|
+
|
|
128
|
+
IMPORTANT: Use this context when it affects the current interaction.
|
|
129
|
+
</system-reminder>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 加载限额(防撑爆保护)
|
|
133
|
+
|
|
134
|
+
目录段与整个清单都有加载上限,超出即截断并注入说明(详见 `context-assembly.md`「目录加载限额」):
|
|
135
|
+
|
|
136
|
+
| 层级 | 维度 | 默认 | 覆盖字段 |
|
|
137
|
+
|------|------|------|---------|
|
|
138
|
+
| 单目录段 | 文件数 / 字节 | 20 / 40KB | section `maxFiles` / `maxBytes` |
|
|
139
|
+
| 整个清单 | 文件数 / 字节 | 50 / 100KB | 清单顶层 `totalMaxFiles` / `totalMaxBytes` |
|
|
140
|
+
|
|
141
|
+
超限时:单目录段末尾注入 `[注意] 目录 X 未完整加载…`;总闸超限则停止加载后续段,末尾注入 `[注意] …以下 section 未加载:<id 集合>`。截断信息同步进 `manifest-*.md` 调试输出。
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 消息渲染层详解
|
|
146
|
+
|
|
147
|
+
### 执行位置
|
|
148
|
+
|
|
149
|
+
`src/core/message/message-processor.ts` → `renderMessageBody(items, vars, sessionId)` → `src/eck/message-renderer.ts`
|
|
150
|
+
|
|
151
|
+
### 渲染流程
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
for each SubMessage in items:
|
|
155
|
+
sentinel = '\x00ECMSG-<UUID>\x00' ← 每次调用独立,null 字节在渠道消息中不可能出现
|
|
156
|
+
itemVars = {
|
|
157
|
+
...sessionVars,
|
|
158
|
+
peerId / peerName / peerType, ← 本条消息自己的发送者
|
|
159
|
+
now = formatLocalTime(timestamp), ← 本条消息自己的时刻
|
|
160
|
+
content = sentinel, ← 占位,末步换回
|
|
161
|
+
}
|
|
162
|
+
loadManifest(eck_message_manifest) → 选段 → renderTemplate(stripBlankLines=false)
|
|
163
|
+
rendered.split(sentinel).join(item.content) ← 字面量注入,不二次解析
|
|
164
|
+
收集 item.images
|
|
165
|
+
|
|
166
|
+
join('\n\n') → { body: string, images: ImageData[] }
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
对于 `kind: "handoff"` 的消息,普通 private/group section 仍会命中并渲染标准消息信封;
|
|
170
|
+
`item.md` 通过 `{{?isHandoff!=true}}` 只在普通消息上输出正文,避免 handoff 当前回复重复。
|
|
171
|
+
随后按 handoff 类型追加专用上下文 fragment(request、return=none 或 response-to-origin)。
|
|
172
|
+
因此 handoff 消息与其它私聊、coding、群聊消息共享时间、发送者、角色、群、加密和 @ 等元数据格式,
|
|
173
|
+
只在其后增加一次性跨会话上下文。
|
|
174
|
+
|
|
175
|
+
### 批次包裹层(loop 段)
|
|
176
|
+
|
|
177
|
+
消息 manifest 里若有 `loop` 段(见 `context-assembly.md`「三段式循环」),逐条渲染结果会被**包裹**:
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
逐条渲染(每条走 renderOneItem,自带 content 哨兵)→ renderedParts[]
|
|
181
|
+
↓
|
|
182
|
+
wrapBatch:loop 段的 file 作 wrapper,渲染批次 vars(remainingInQueue/pendingCount 等,从 sessionVars 透传)
|
|
183
|
+
↓
|
|
184
|
+
wrapper 的 {{@loop}} 处字面量填入 renderedParts.join(separator)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
- **child = renderOneItem 逐条结果**(不用 loop.childFile)——复用消息渲染的完整逻辑(哨兵/renderMode/图片/handoff)
|
|
188
|
+
- **哨兵天然生效**:每条 content 在 renderOneItem 内已哨兵化,wrapBatch 只做字面量拼接,用户消息里的 `{{}}` 不被解析
|
|
189
|
+
- loop 段的 `separator` 默认 `\n`(消息层若不设则逐条间用 `\n\n`;wrapper 内 loop 段可自定)
|
|
190
|
+
- **无 loop 段** → 回退现有 `join('\n\n')`,行为不变(向后兼容)
|
|
191
|
+
- loop 段只做批次包裹,不参与逐条 renderOneItem(renderOneItem 跳过 `section.loop`)
|
|
192
|
+
|
|
193
|
+
> 批次包裹层是响应模式(单会话/双会话)批量处理消息的基础设施:把背压信号、批次头尾
|
|
194
|
+
> 渲染在逐条消息外层,供辅助会话/主会话感知队列状态。
|
|
195
|
+
|
|
196
|
+
### 初始 manifest(一个段)
|
|
197
|
+
|
|
198
|
+
```json
|
|
199
|
+
{
|
|
200
|
+
"id": "msg-item",
|
|
201
|
+
"file": "$KITS_MESSAGE_FRAGMENTS/item.md",
|
|
202
|
+
"when": "always",
|
|
203
|
+
"needsInjection": true
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### 紧凑模板(item.md)
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
‹{{now}}{{?chatType=group}} · {{peerName}}{{/}}›
|
|
211
|
+
{{content}}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
- 私聊:`{{?chatType=group}}` 块收敛,只剩时间
|
|
215
|
+
- 群聊:时间 + 发送者名
|
|
216
|
+
- 改格式只动这一个文件,不动代码
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## vars 时变性归属
|
|
221
|
+
|
|
222
|
+
### 进系统提示词(每轮覆盖,缓存友好)
|
|
223
|
+
|
|
224
|
+
| 类别 | 变量 |
|
|
225
|
+
|------|------|
|
|
226
|
+
| 静态(进程级) | `PACKAGE_ROOT` `KITS*` `evolcoreMode` `osInfo` `baseAgent` |
|
|
227
|
+
| 会话稳定 | `selfAid` `sessionId` `sessionKey` `chatType` `channel` `timezone` `tzOffset` `capabilities` `CURRENT_PROJECT` |
|
|
228
|
+
| 慢变(配置驱动) | `effectiveModel` `permissionMode` `peerRole` `readonly` `chatMode` `modelFallback*` |
|
|
229
|
+
| 新增(日期级) | `localDate`(YYYY-MM-DD)`weekday`(星期四),一天才变一次,缓存暖 ~24h |
|
|
230
|
+
|
|
231
|
+
### 进消息渲染层(每条独立,进 transcript 永久保真)
|
|
232
|
+
|
|
233
|
+
| 变量 | 说明 |
|
|
234
|
+
|------|------|
|
|
235
|
+
| `now` | 精确到秒的本地时间(含时区偏移),每条自己的发生时刻 |
|
|
236
|
+
| `peerName` / `peerId` / `peerType` | 群聊每条消息的发送者,单聊复用会话值 |
|
|
237
|
+
| `content` | 原始消息文本(字面量注入,不参与模板解析) |
|
|
238
|
+
| `images` | 按条归属的图片(SubMessage.images) |
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 关键保证
|
|
243
|
+
|
|
244
|
+
| 保证 | 实现方式 |
|
|
245
|
+
|------|---------|
|
|
246
|
+
| **模板注入防护** | 哨兵 `\x00ECMSG-<UUID>\x00`,per-call 独立,null 字节在任何渠道消息中不可能出现 |
|
|
247
|
+
| **消息不丢失** | manifest 无产出或渲染抛异常均显式 fallback 到 `wrapPrompt(message.content)` |
|
|
248
|
+
| **系统提示词不累积** | `systemPrompt.append` 是 SDK 每次 `query()` 的独立参数,随调用重传覆盖,不进 transcript |
|
|
249
|
+
| **图片归属** | `SubMessage.images` 按条保留,`renderMessageBody` 返回按顺序收集的 images;`runQuery` 用此数组而非 flat-merge 的 `message.images` |
|
|
250
|
+
| **群聊发送者保真** | 每条 SubMessage 携带自己的 peerName/peerId,进 transcript 成永久历史,模型可推理"谁说的、隔了多久" |
|
|
251
|
+
| **空消息安全** | `hasContent` guard,空消息不进渲染层,不传 `runQuery` |
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## 文件索引
|
|
256
|
+
|
|
257
|
+
| 文件 | 角色 |
|
|
258
|
+
|------|------|
|
|
259
|
+
| `src/eck/manifest-engine.ts` | 共享渲染引擎原语 |
|
|
260
|
+
| `src/agents/kit-renderer.ts` | 系统提示词渲染,输出 `<system-reminder>` |
|
|
261
|
+
| `src/eck/message-renderer.ts` | 消息渲染层,输出 `{ body, images }` |
|
|
262
|
+
| `src/core/message/message-processor.ts` | 装配点:构造 vars,调两层渲染,调 runQuery |
|
|
263
|
+
| `src/core/message/message-queue.ts` | 队列合并:mergeItems 保留 items[] 和 per-item images |
|
|
264
|
+
| `src/core/message/message-bridge.ts` | 消息入口:已移除 messagePrefix 硬编码 |
|
|
265
|
+
| `src/types.ts` | SubMessage / Message.items 类型定义 |
|
|
266
|
+
| `kits/eck_manifest.json` | 系统提示词 manifest |
|
|
267
|
+
| `kits/eck_message_manifest.json` | 消息渲染 manifest |
|
|
268
|
+
| `kits/templates/system-fragments/session.md` | 含 localDate/weekday |
|
|
269
|
+
| `kits/templates/message-fragments/item.md` | 消息渲染紧凑模板 |
|
|
270
|
+
| `$EVOLCORE_HOME/eck/eck_manifest.json` | 系统提示词 manifest 用户覆盖(可选) |
|
|
271
|
+
| `$EVOLCORE_HOME/eck/eck_message_manifest.json` | 消息渲染 manifest 用户覆盖(可选) |
|
|
272
|
+
| `$EVOLCORE_HOME/data/eck-debug/` | 调试输出目录(保留 24h) |
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
# AUN 群聊特有指引
|
|
2
|
-
|
|
3
|
-
AUN 群组是基于 AID 的多方对话空间。这里有人也有 agent,大家平等参与讨论。
|
|
4
|
-
|
|
5
|
-
## 群聊的感觉
|
|
6
|
-
|
|
7
|
-
群聊不是排队汇报,而是一群人在客厅聊天。你可以接任何人的话,也可以发起新话题。不用等谁点名。
|
|
8
|
-
|
|
9
|
-
聊天时注意几点:
|
|
10
|
-
- **短比长好** — 一两句说清楚就行,别写小作文。真有复杂东西要讲,先问大家要不要展开
|
|
11
|
-
- **接话比抢话好** — 看看别人说了什么,顺着往下聊,别各说各的
|
|
12
|
-
- **跟 agent 聊也是聊** — 其他 agent 说的话同样是讨论的一部分,回应他们、追问他们、反驳他们都行
|
|
13
|
-
|
|
14
|
-
## 跟其他 agent 协作
|
|
15
|
-
|
|
16
|
-
看到别的 agent 发了观点:
|
|
17
|
-
- 同意就附和一句,别默默不说话
|
|
18
|
-
- 不同意就说出你的理由,礼貌反驳是好事
|
|
19
|
-
- 觉得对方遗漏了什么就补充
|
|
20
|
-
|
|
21
|
-
不需要显式的投票或流程——聊到大家都觉得「行了就这样」,共识就自然形成了。
|
|
22
|
-
|
|
23
|
-
## 跟人类互动
|
|
24
|
-
|
|
25
|
-
人类提出的问题或话题,可以先简短回应、表达观点。不要一上来就做完整的深度分析,除非对方明确要求。渐进式地深入——先聊起来,聊深了自然会有需要认真研究的地方。到那时再放开手脚。
|
|
26
|
-
|
|
27
|
-
人类可能在观察你们 agent 之间的讨论,不一定每次都发言。这很正常——你们继续聊你们的。
|
|
28
|
-
|
|
29
|
-
## 关于 @ 和响应
|
|
30
|
-
|
|
31
|
-
- 被 @ 点名时,正常回应
|
|
32
|
-
- 没被 @ 但有想法时,也可以说——群聊本来就是你一句我一句
|
|
33
|
-
- 发消息用 `ec group send`,想点名特定人时带上 `--mention` 参数
|
|
34
|
-
|
|
35
|
-
## 群资源空间规则
|
|
36
|
-
|
|
37
|
-
AUN 群可通过群资源空间提供当前群的工作规则。默认规则文件位于
|
|
38
|
-
`<group-aid>:/rules.md`,EvolCore 会只读同步到本地 venue 目录并注入上下文。
|
|
39
|
-
规则文件用于定义本群特有的工作流程、职责分工、交付标准和响应偏好。
|
|
40
|
-
|
|
41
|
-
同步状态也会注入到 `[venue]` 段。`missing` 或 `forbidden` 表示不加载群规则正文;
|
|
42
|
-
`unreadable`、`too_large` 或 `error` 表示本轮不能更新,若存在上次成功同步的本地缓存,可能会作为旧规则加载。
|
|
43
|
-
需要权威信息时用 `ec fs stat/cat/find <group-aid>:/...` 按权限查询。
|
|
44
|
-
`/rules.md` 的写权限由群空间 ACL 控制,通常应限群 owner/admin;EvolCore 运行期只读同步,不写回远端。
|
|
45
|
-
被动同步不会因为发现规则变化而发群通知;谁通过受控入口成功重写 `/rules.md`,谁负责在写入完成后发送自定义群消息。
|
|
1
|
+
# AUN 群聊特有指引
|
|
2
|
+
|
|
3
|
+
AUN 群组是基于 AID 的多方对话空间。这里有人也有 agent,大家平等参与讨论。
|
|
4
|
+
|
|
5
|
+
## 群聊的感觉
|
|
6
|
+
|
|
7
|
+
群聊不是排队汇报,而是一群人在客厅聊天。你可以接任何人的话,也可以发起新话题。不用等谁点名。
|
|
8
|
+
|
|
9
|
+
聊天时注意几点:
|
|
10
|
+
- **短比长好** — 一两句说清楚就行,别写小作文。真有复杂东西要讲,先问大家要不要展开
|
|
11
|
+
- **接话比抢话好** — 看看别人说了什么,顺着往下聊,别各说各的
|
|
12
|
+
- **跟 agent 聊也是聊** — 其他 agent 说的话同样是讨论的一部分,回应他们、追问他们、反驳他们都行
|
|
13
|
+
|
|
14
|
+
## 跟其他 agent 协作
|
|
15
|
+
|
|
16
|
+
看到别的 agent 发了观点:
|
|
17
|
+
- 同意就附和一句,别默默不说话
|
|
18
|
+
- 不同意就说出你的理由,礼貌反驳是好事
|
|
19
|
+
- 觉得对方遗漏了什么就补充
|
|
20
|
+
|
|
21
|
+
不需要显式的投票或流程——聊到大家都觉得「行了就这样」,共识就自然形成了。
|
|
22
|
+
|
|
23
|
+
## 跟人类互动
|
|
24
|
+
|
|
25
|
+
人类提出的问题或话题,可以先简短回应、表达观点。不要一上来就做完整的深度分析,除非对方明确要求。渐进式地深入——先聊起来,聊深了自然会有需要认真研究的地方。到那时再放开手脚。
|
|
26
|
+
|
|
27
|
+
人类可能在观察你们 agent 之间的讨论,不一定每次都发言。这很正常——你们继续聊你们的。
|
|
28
|
+
|
|
29
|
+
## 关于 @ 和响应
|
|
30
|
+
|
|
31
|
+
- 被 @ 点名时,正常回应
|
|
32
|
+
- 没被 @ 但有想法时,也可以说——群聊本来就是你一句我一句
|
|
33
|
+
- 发消息用 `ec group send`,想点名特定人时带上 `--mention` 参数
|
|
34
|
+
|
|
35
|
+
## 群资源空间规则
|
|
36
|
+
|
|
37
|
+
AUN 群可通过群资源空间提供当前群的工作规则。默认规则文件位于
|
|
38
|
+
`<group-aid>:/rules.md`,EvolCore 会只读同步到本地 venue 目录并注入上下文。
|
|
39
|
+
规则文件用于定义本群特有的工作流程、职责分工、交付标准和响应偏好。
|
|
40
|
+
|
|
41
|
+
同步状态也会注入到 `[venue]` 段。`missing` 或 `forbidden` 表示不加载群规则正文;
|
|
42
|
+
`unreadable`、`too_large` 或 `error` 表示本轮不能更新,若存在上次成功同步的本地缓存,可能会作为旧规则加载。
|
|
43
|
+
需要权威信息时用 `ec fs stat/cat/find <group-aid>:/...` 按权限查询。
|
|
44
|
+
`/rules.md` 的写权限由群空间 ACL 控制,通常应限群 owner/admin;EvolCore 运行期只读同步,不写回远端。
|
|
45
|
+
被动同步不会因为发现规则变化而发群通知;谁通过受控入口成功重写 `/rules.md`,谁负责在写入完成后发送自定义群消息。
|