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
@@ -1,257 +0,0 @@
1
- /**
2
- * memory-signature.ts — 记忆文件签名与验签
3
- *
4
- * **不重用 agent.md 的签名链路。** `signAgentMd` / `verifyAgentMd` 会走
5
- * agent-md-schema 的校验(强制 frontmatter 有 aid/name/type/version、payload ≤ 4096B),
6
- * 套在记忆文件上必然失败——而且 `signAgentMd` 签名时**不做校验**,
7
- * 签出来的文件自己验不回来,属于静默产废品。
8
- *
9
- * 这里改用 fastaun 的底层字节级接口:
10
- * - `AID.sign(payload)` → `{ signature: base64 }`,纯字节签名,无大小上限
11
- * - `AID.verify(payload, sig)` → `{ valid: boolean }`,纯字节验签
12
- *
13
- * 签名块格式沿用 AUN 既有的 `<!-- AUN-SIGNATURE ... -->`,便于工具链复用。
14
- * 但拼装 / 解析 / 证书绑定校验三个工具函数在 fastaun 里**没有导出**
15
- * (包 exports 只映射了 "."),所以在本模块内镜像实现。
16
- *
17
- * 签名身份:记忆所属 agent 自身的 AID 证书私钥。
18
- * 验签:只加载本地证书,无需网络。
19
- */
20
- import { X509Certificate, createHash } from 'node:crypto';
21
- import { getAidStore, loadAid, SLOT } from '../../aun/aid/store.js';
22
- import { aunPath } from '../../paths.js';
23
- /**
24
- * 记忆文件大小上限(字节)。超过即拒绝签名。
25
- *
26
- * 定这个限制的理由不是技术限制(`AID.sign` 本身无上限,实测 200KB 通过),
27
- * 而是记忆本身的性质:一条记忆应是**一句话能说清的结论**,不是文档。
28
- * 超过 10KB 通常意味着应该拆成多条,或者根本不该进记忆系统。
29
- */
30
- export const MAX_MEMORY_BYTES = 10 * 1024;
31
- // ── 镜像自 fastaun/dist/cert-utils.js ─────────────────────────────────────
32
- const SIGNATURE_MARKER = '<!-- AUN-SIGNATURE';
33
- const SIGNATURE_RE = /^<!-- AUN-SIGNATURE(?:\r\n|\n|\r)(?<body>[\s\S]*?)(?:\r\n|\n|\r)-->\s*$/;
34
- const FINGERPRINT_HEX_RE = /^[0-9a-f]+$/;
35
- const REQUIRED_FIELDS = ['cert_fingerprint', 'timestamp', 'signature'];
36
- const ALLOWED_FIELDS = [...REQUIRED_FIELDS, 'public_key_fingerprint'];
37
- /** 严格 base64 校验(长度是 4 的倍数、字符集合法、可往返)。 */
38
- function isStrictBase64(value) {
39
- const text = String(value ?? '');
40
- if (!text || text.length % 4 !== 0 || !/^[A-Za-z0-9+/]+={0,2}$/.test(text))
41
- return false;
42
- return Buffer.from(text, 'base64').toString('base64') === text;
43
- }
44
- /** 归一化指纹,去掉 `sha256:` 前缀和冒号分隔,返回小写 hex。 */
45
- function normalizeFingerprintHex(value) {
46
- let text = String(value ?? '').trim().toLowerCase();
47
- if (text.startsWith('sha256:'))
48
- text = text.slice('sha256:'.length);
49
- text = text.replace(/:/g, '');
50
- if (![16, 64].includes(text.length) || !FINGERPRINT_HEX_RE.test(text))
51
- return '';
52
- return text;
53
- }
54
- /** 证书指纹比对(`sha256:<hex>`)。 */
55
- function certMatchesFingerprint(certPem, fingerprint) {
56
- const expected = normalizeFingerprintHex(fingerprint);
57
- if (!expected)
58
- return false;
59
- const derHex = new X509Certificate(certPem).fingerprint256.replace(/:/g, '').toLowerCase();
60
- if (expected.length === 16)
61
- return derHex.slice(0, 16) === expected;
62
- return derHex === expected;
63
- }
64
- /** 公钥指纹(SPKI DER 的 SHA-256)。 */
65
- function publicKeyFingerprint(certPem) {
66
- const cert = new X509Certificate(certPem);
67
- const spkiDer = cert.publicKey.export({ type: 'spki', format: 'der' });
68
- return `sha256:${createHash('sha256').update(spkiDer).digest('hex')}`;
69
- }
70
- /** 构造签名块。`public_key_fingerprint` 可选,省略即可。 */
71
- export function buildSignatureBlock(certFingerprint, timestamp, signatureB64, publicKeyFp = '') {
72
- const lines = ['<!-- AUN-SIGNATURE', `cert_fingerprint: ${certFingerprint}`];
73
- if (publicKeyFp)
74
- lines.push(`public_key_fingerprint: ${publicKeyFp}`);
75
- lines.push(`timestamp: ${Math.trunc(timestamp)}`, `signature: ${signatureB64}`, '-->');
76
- return lines.join('\n');
77
- }
78
- /**
79
- * 解析文件尾部的签名块。
80
- * `payload` 是**原始字节子串**(`content.slice(0, idx)`),验签必须用它而不是原 content。
81
- */
82
- export function parseSignatureBlock(content) {
83
- const idx = content.lastIndexOf(SIGNATURE_MARKER);
84
- if (idx < 0)
85
- return { payload: content, fields: null };
86
- if (content.indexOf(SIGNATURE_MARKER) !== idx) {
87
- return { payload: content.slice(0, idx), fields: null, parseError: 'must contain exactly one signature block' };
88
- }
89
- if (idx > 0 && content[idx - 1] !== '\n' && content[idx - 1] !== '\r') {
90
- return { payload: content.slice(0, idx), fields: null, parseError: 'signature block must start on a new line' };
91
- }
92
- const tail = content.slice(idx);
93
- const match = tail.match(SIGNATURE_RE);
94
- if (!match)
95
- return { payload: content.slice(0, idx), fields: null, parseError: 'malformed signature block' };
96
- const fields = {};
97
- for (const rawLine of (match.groups?.body ?? '').split(/\r\n|\n|\r/)) {
98
- const line = rawLine.trim();
99
- if (!line)
100
- continue;
101
- const colon = line.indexOf(':');
102
- if (colon < 0)
103
- return { payload: content.slice(0, idx), fields: null, parseError: `malformed signature field: ${line}` };
104
- const key = line.slice(0, colon).trim().toLowerCase();
105
- if (Object.prototype.hasOwnProperty.call(fields, key)) {
106
- return { payload: content.slice(0, idx), fields: null, parseError: `duplicate signature field: ${key}` };
107
- }
108
- fields[key] = line.slice(colon + 1).trim();
109
- }
110
- for (const req of REQUIRED_FIELDS) {
111
- if (!fields[req])
112
- return { payload: content.slice(0, idx), fields: null, parseError: `signature block missing ${req}` };
113
- }
114
- if (Object.keys(fields).some(k => !ALLOWED_FIELDS.includes(k))) {
115
- return { payload: content.slice(0, idx), fields: null, parseError: 'signature block contains unknown fields' };
116
- }
117
- if (!/^sha256:[0-9a-f]{64}$/i.test(fields.cert_fingerprint)) {
118
- return { payload: content.slice(0, idx), fields: null, parseError: 'invalid cert_fingerprint' };
119
- }
120
- if (fields.public_key_fingerprint && !/^sha256:[0-9a-f]{64}$/i.test(fields.public_key_fingerprint)) {
121
- return { payload: content.slice(0, idx), fields: null, parseError: 'invalid public_key_fingerprint' };
122
- }
123
- if (!/^\d+$/.test(fields.timestamp)) {
124
- return { payload: content.slice(0, idx), fields: null, parseError: 'invalid timestamp' };
125
- }
126
- if (!isStrictBase64(fields.signature)) {
127
- return { payload: content.slice(0, idx), fields: null, parseError: 'invalid signature base64' };
128
- }
129
- return { payload: content.slice(0, idx), fields: fields };
130
- }
131
- // ── 证书 ↔ AID 绑定校验(镜像 fastaun/dist/agent-md-schema.js:102) ────────
132
- /** 取证书 Subject 的 CN。 */
133
- function certCommonName(certPem, issuer = false) {
134
- const cert = new X509Certificate(certPem);
135
- const target = issuer ? cert.issuer : cert.subject;
136
- for (const line of target.split('\n')) {
137
- const m = line.match(/^CN=(.*)$/);
138
- if (m)
139
- return m[1].trim();
140
- }
141
- return '';
142
- }
143
- /**
144
- * 校验证书本身与 AID 的绑定。
145
- *
146
- * `requireCurrentValidity` 默认 **false** —— 记忆文件是历史记录,证书到期后
147
- * 旧记忆不该集体失效。要做时效策略,由调用方比对 `timestamp`。
148
- */
149
- export function validateMemoryCertificate(certPem, expectedAid, timestamp, opts = {}) {
150
- let cert;
151
- try {
152
- cert = new X509Certificate(certPem);
153
- }
154
- catch (e) {
155
- return { ok: false, reason: `certificate unreadable: ${e?.message ?? e}` };
156
- }
157
- if (cert.publicKey.asymmetricKeyType !== 'ec'
158
- || cert.publicKey.asymmetricKeyDetails?.namedCurve !== 'prime256v1') {
159
- return { ok: false, reason: 'signing certificate must use P-256' };
160
- }
161
- const notBefore = Math.trunc(new Date(cert.validFrom).getTime() / 1000);
162
- const notAfter = Math.trunc(new Date(cert.validTo).getTime() / 1000);
163
- const current = Math.trunc(opts.now ?? Date.now() / 1000);
164
- if (![notBefore, notAfter, current, timestamp].every(Number.isFinite)) {
165
- return { ok: false, reason: 'signing certificate is invalid' };
166
- }
167
- if ((opts.requireCurrentValidity ?? false) && (current < notBefore || current > notAfter)) {
168
- return { ok: false, reason: 'signing certificate is expired or not yet valid' };
169
- }
170
- if (certCommonName(certPem).toLowerCase() !== expectedAid.trim().toLowerCase()) {
171
- return { ok: false, reason: 'signing certificate subject does not match AID' };
172
- }
173
- if (timestamp < notBefore || timestamp > notAfter) {
174
- return { ok: false, reason: 'signature timestamp is outside certificate validity' };
175
- }
176
- return { ok: true };
177
- }
178
- // ── 对外接口 ────────────────────────────────────────────────────────────────
179
- /**
180
- * 对记忆文件内容签名。
181
- * 失败时抛出错误,调用方负责处理(不静默丢弃)。
182
- */
183
- export async function signMemoryFile(content, selfAid) {
184
- const bytes = Buffer.byteLength(content, 'utf-8');
185
- if (bytes > MAX_MEMORY_BYTES) {
186
- throw new Error(`MEMORY_TOO_LARGE: 记忆文件 ${bytes} 字节,超过上限 ${MAX_MEMORY_BYTES} 字节(10KB)。` +
187
- `一条记忆应当是一句话能说清的结论。内容确实这么多时,请拆成多条分别 create,` +
188
- `或把细节留在归档的文件里、记忆只记结论。`);
189
- }
190
- const store = await getAidStore({ slotId: SLOT.daemon, aunPath: aunPath() });
191
- try {
192
- const aid = loadAid(store, selfAid);
193
- // 保证 payload 以换行结尾,签名块独占一行(解析时的硬要求)
194
- const payload = content.endsWith('\n') ? content : `${content}\n`;
195
- const r = aid.sign(payload);
196
- if (!r.ok) {
197
- throw new Error(`sign 失败(${selfAid}): ${r.error?.message ?? String(r.error)}`);
198
- }
199
- const block = buildSignatureBlock(aid.certFingerprint, Math.trunc(Date.now() / 1000), r.data.signature);
200
- return { ok: true, signed: payload + block };
201
- }
202
- finally {
203
- try {
204
- store.close();
205
- }
206
- catch { /* ignore */ }
207
- }
208
- }
209
- /**
210
- * 验签记忆文件内容。
211
- *
212
- * 返回 `unsigned` 表示文件没有签名块;`invalid` 表示签名块损坏、指纹不符、
213
- * 证书与 AID 不匹配、或字节验签失败。
214
- *
215
- * 只加载本地证书,无需网络。
216
- */
217
- export async function verifyMemoryFile(content, selfAid) {
218
- const parsed = parseSignatureBlock(content);
219
- if (parsed.parseError)
220
- return { status: 'invalid', reason: parsed.parseError };
221
- if (!parsed.fields)
222
- return { status: 'unsigned' };
223
- const store = await getAidStore({ slotId: SLOT.daemon, aunPath: aunPath() });
224
- try {
225
- const aid = loadAid(store, selfAid);
226
- // ① 证书指纹必须匹配本地证书
227
- if (!certMatchesFingerprint(aid.certPem, parsed.fields.cert_fingerprint)) {
228
- return { status: 'invalid', reason: 'certificate fingerprint mismatch' };
229
- }
230
- // ② 公钥指纹(若有)也必须匹配
231
- if (parsed.fields.public_key_fingerprint
232
- && parsed.fields.public_key_fingerprint.toLowerCase() !== publicKeyFingerprint(aid.certPem).toLowerCase()) {
233
- return { status: 'invalid', reason: 'public key fingerprint mismatch' };
234
- }
235
- // ③ 证书 ↔ AID 绑定 + 签名时间落在证书有效期
236
- const certCheck = validateMemoryCertificate(aid.certPem, selfAid, Number(parsed.fields.timestamp));
237
- if (!certCheck.ok)
238
- return { status: 'invalid', reason: certCheck.reason };
239
- // ④ 字节验签(用解析出的原始 payload,不是原 content)
240
- const v = aid.verify(parsed.payload, parsed.fields.signature);
241
- if (!v.ok) {
242
- return { status: 'invalid', reason: v.error?.message ?? String(v.error) };
243
- }
244
- if (!v.data.valid)
245
- return { status: 'invalid', reason: 'signature verification failed' };
246
- return { status: 'verified' };
247
- }
248
- catch (e) {
249
- return { status: 'invalid', reason: e?.message ?? String(e) };
250
- }
251
- finally {
252
- try {
253
- store.close();
254
- }
255
- catch { /* ignore */ }
256
- }
257
- }
@@ -1,17 +0,0 @@
1
- # ec group fs 已废弃
2
-
3
- 群文件空间统一使用 `ec fs`,不再提供 `ec group fs` 入口。
4
-
5
- 迁移:
6
-
7
- ```bash
8
- ec group fs ls <group-aid> /path
9
- # 改为
10
- ec fs ls <group-aid>:/path
11
-
12
- ec group fs cp ./file <group-aid>:/path/file
13
- # 改为
14
- ec fs cp ./file <group-aid>:/path/file
15
- ```
16
-
17
- 当前可用能力以 `fs.md` 为准。群空间通过统一 `ec fs` 入口支持 `ls`、`stat`、`lstat`、`cat`、`cp`、`mv`、`rm`、`mkdir`、`find`、`df`、`mount`、`umount`;group facade 暂无接口的 `ln`、`chmod`、`setfacl`、`getfacl`、`token`、`approve`、`reject` 不在群 AID 上承诺可用。
@@ -1,45 +0,0 @@
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,43 +0,0 @@
1
- # 群聊场景指引
2
-
3
- 群聊场景下的响应行为取决于 mentionMode(见 venue fragment 中的 `mentionMode` 变量)。
4
-
5
- ## 行为准则
6
- - `mentionMode: mention-only` — 仅响应明确 @ 自己的消息
7
- - `mentionMode: disabled` — 所有消息可见,自主判断是否参与。这不是叫你每条都回,而是你可以像真人一样:感兴趣的接话,不感兴趣的就跳过。回得短一点、快一点,让对话流动起来,不要一个人长篇大论堵住别人的空间
8
- - `mentionMode: auto` — 普通群消息先由轻量分类器判定是否唤醒主会话;明确 @ 直接进入主会话,未 @ 的 slash 被过滤
9
- - 查看关系档案(peer-profile)了解本群文化与策略
10
- - 如果上下文中出现“群规则”,它来自当前群资源空间的本地同步缓存;群规则优先于通用群聊指引
11
- - 群发言会被多人看到,谨言慎行
12
- - 具体渠道(AUN/飞书/微信等)的群聊特有指引见对应渠道文档
13
-
14
- ## 群聊 slash 命令
15
-
16
- 群内仅保留 `/help`、`/evolhelp`、`/status`、`/check`、`/ask`、`/pause`、`/resume`、`/stop`、
17
- `/compact`、`/renew`,以及只读的 `/mention`、`/model`、`/effort`、`/perm`、`/baseagent`。
18
- `/model current|list|check` 也是查询;切换、重置、审批等带参写操作在群内不支持。
19
- `/compact`、话题内的 `/renew` 仍受原有角色与会话状态限制。别名遵循主命令策略。
20
- `/chatmode`、`/activity` 和其他 slash 命令在群内不支持,请通过私聊或有权限的管理入口操作。
21
-
22
- AUN 群聊的命令查询、成功与进度反馈使用 `notice`,命令拒绝和失败使用可恢复的 `error`;
23
- 已有的 notice、error、timeout 和卡片协议保留。它们不会进入其他 EvolCore agent 的模型输入。
24
- 这些限制针对聊天 slash 入口;菜单协议与受管 CLI 继续走各自的鉴权路径。
25
-
26
- ## 可按需查询的群数据
27
-
28
- AUN 群的本地会话历史可供人工回看。需要补充背景时使用
29
- `ec group history <self-aid> <group-id> --limit 50 --format json`;
30
- 查询只读,可用 `--thread`、`--before`、`--after` 和 `--direction` 缩小范围。
31
- 历史读取不会触发对其中每一条消息的回复。
32
-
33
- 群结构信息(成员名单、各成员角色、群主、管理员、在线状态等)**不预先注入上下文**,
34
- 需要时用 `ec group` 自行查询(完整用法 Read `$KITS_DOCS/evolcore/group.md`):
35
-
36
- | 想知道 | 用命令 | 拿到 |
37
- |--------|--------|------|
38
- | 群基本信息、群主是谁 | `ec group info <from> <group-id>` | name / owner_aid / 成员数 / 描述等 |
39
- | 成员名单与各自角色 | `ec group members <from> <group-id>` | 每个成员的 aid + role(owner/admin/member)|
40
- | 当前谁在线 | `ec group online <from> <group-id>` | 在线成员及其角色 |
41
-
42
- 典型场景:要判断某人是不是管理员、给特定角色发消息、决定是否执行管理操作前,先查 members
43
- 拿到角色再决策——而不是假设。自己在群里的角色也从 members 里查自己的 aid 得到。