evolcore 0.0.20 → 0.0.21

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 (123) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +58 -9
  3. package/dist/agents/baseagent.js +10 -6
  4. package/dist/agents/claude-runner.js +379 -108
  5. package/dist/agents/codex-app-server-client.js +10 -2
  6. package/dist/agents/codex-runner.js +402 -135
  7. package/dist/agents/ecagent-runner.js +171 -61
  8. package/dist/agents/gemini-runner.js +130 -30
  9. package/dist/agents/request-identity.js +25 -0
  10. package/dist/agents/runner-types.js +19 -0
  11. package/dist/aun/aid/agentmd.js +59 -2
  12. package/dist/aun/aid/identity.js +4 -1
  13. package/dist/aun/aid/index.js +1 -1
  14. package/dist/aun/msg/group.js +72 -6
  15. package/dist/aun/msg/history.js +213 -36
  16. package/dist/aun/msg/managed-operation.js +58 -9
  17. package/dist/aun/msg/p2p.js +5 -0
  18. package/dist/aun/outbox.js +182 -80
  19. package/dist/aun/service-proxy.js +43 -25
  20. package/dist/channels/aun.js +409 -88
  21. package/dist/channels/daemon.js +6 -1
  22. package/dist/cli/agent-command.js +4 -3
  23. package/dist/cli/agent.js +66 -56
  24. package/dist/cli/aun-commands.js +177 -42
  25. package/dist/cli/command-log.js +10 -11
  26. package/dist/cli/contact.js +1 -0
  27. package/dist/cli/daemon-commands.js +69 -115
  28. package/dist/cli/init.js +27 -15
  29. package/dist/cli/task-context.js +46 -0
  30. package/dist/cli/trigger-command.js +1 -1
  31. package/dist/cli/watch-logs.js +10 -3
  32. package/dist/config/builtin-roles.js +1 -0
  33. package/dist/config/config-field-policy.js +16 -5
  34. package/dist/config/config-manager.js +135 -17
  35. package/dist/config/contact-operation-service.js +32 -1
  36. package/dist/config/contact-request-service.js +44 -0
  37. package/dist/config/daemon-services.js +186 -0
  38. package/dist/config/gateway-config.js +20 -9
  39. package/dist/config/role-service.js +54 -3
  40. package/dist/config/schema-migration.js +550 -0
  41. package/dist/config-store.js +151 -9
  42. package/dist/core/agent-application-service.js +279 -0
  43. package/dist/core/audit/log-integrity.js +102 -0
  44. package/dist/core/auth/agent-delegation.js +31 -1
  45. package/dist/core/auth/auth-gateway.js +33 -4
  46. package/dist/core/auth/authorization-audit.js +150 -2
  47. package/dist/core/auth/operation-authorizer.js +41 -1
  48. package/dist/core/auth/operation-catalog.js +9 -1
  49. package/dist/core/bootstrap-service.js +6 -2
  50. package/dist/core/causation/aun-association.js +7 -4
  51. package/dist/core/command/agent-control.js +56 -16
  52. package/dist/core/command/command-handler.js +290 -44
  53. package/dist/core/command/connect-menu.js +3 -4
  54. package/dist/core/command/group-menu.js +5 -7
  55. package/dist/core/command/menu-handler.js +279 -80
  56. package/dist/core/command/role-menu.js +21 -11
  57. package/dist/core/command/slash-gate.js +85 -18
  58. package/dist/core/command/slash-handler.js +350 -32
  59. package/dist/core/event-catalog.js +5 -0
  60. package/dist/core/evolagent.js +4 -0
  61. package/dist/core/handoff/dispatcher.js +4 -0
  62. package/dist/core/handoff/runtime.js +10 -0
  63. package/dist/core/handoff/store.js +32 -9
  64. package/dist/core/inference/text-inference.js +7 -15
  65. package/dist/core/message/im-renderer.js +83 -84
  66. package/dist/core/message/{inbound-admission.js → message-admission.js} +51 -1
  67. package/dist/core/message/message-bridge.js +124 -10
  68. package/dist/core/message/message-log.js +14 -7
  69. package/dist/core/message/message-queue.js +206 -16
  70. package/dist/core/message/message-utils.js +12 -5
  71. package/dist/core/message/response-engine.js +486 -68
  72. package/dist/core/message/send-receipt.js +1 -0
  73. package/dist/core/message/stream-debouncer.js +9 -2
  74. package/dist/core/model/model-catalog.js +23 -15
  75. package/dist/core/model/model-diagnostics.js +28 -10
  76. package/dist/core/permission/approval-gateway.js +180 -6
  77. package/dist/core/permission/ec-command-parser.js +410 -54
  78. package/dist/core/permission/mode.js +18 -3
  79. package/dist/core/{protected-paths.js → permission/protected-paths.js} +17 -5
  80. package/dist/core/permission/readonly-shell-query.js +263 -9
  81. package/dist/core/permission/sandbox-runtime.js +159 -1
  82. package/dist/core/permission/tool-policy.js +575 -21
  83. package/dist/core/session/session-fs-store.js +154 -5
  84. package/dist/core/session/session-manager.js +299 -30
  85. package/dist/core/session/session-renew.js +19 -12
  86. package/dist/core/session/session-turn-coordinator.js +11 -4
  87. package/dist/eck/kit-renderer.js +1 -1
  88. package/dist/index.js +253 -46
  89. package/dist/ipc.js +374 -24
  90. package/dist/paths.js +64 -7
  91. package/dist/response-system/context-builder.js +1 -7
  92. package/dist/trigger/anomaly-store.js +1 -0
  93. package/dist/trigger/feedback.js +56 -5
  94. package/dist/trigger/history.js +79 -4
  95. package/dist/trigger/legacy-session-history.js +2 -2
  96. package/dist/trigger/parser.js +3 -2
  97. package/dist/trigger/validation.js +6 -1
  98. package/dist/utils/atomic-write.js +27 -0
  99. package/dist/utils/ecweb-utils.js +16 -2
  100. package/dist/utils/error-utils.js +4 -1
  101. package/dist/utils/logger.js +21 -2
  102. package/dist/utils/process-tree-stats.js +24 -4
  103. package/dist/utils/process-tree-worker.js +31 -0
  104. package/dist/utils/project-path.js +1 -2
  105. package/kits/docs/INDEX.md +1 -1
  106. package/kits/docs/evolcore/INDEX.md +1 -1
  107. package/kits/docs/evolcore/contact.md +7 -1
  108. package/kits/docs/evolcore/msg.md +16 -0
  109. package/kits/schemas/_meta.json +4 -2
  110. package/kits/schemas/agent-config.schema.11.json +13 -0
  111. package/kits/schemas/daemon.schema.5.json +0 -1
  112. package/kits/schemas/daemon.schema.6.json +131 -0
  113. package/kits/schemas/defaults.schema.5.json +15 -3
  114. package/kits/schemas/migrations/README.md +3 -1
  115. package/kits/schemas/relation-config.schema.8.json +13 -0
  116. package/kits/schemas/role-config.schema.1.json +1 -2
  117. package/kits/schemas/single-session.schema.3.json +32 -0
  118. package/kits/templates/roles/admin.json +1 -0
  119. package/kits/templates/roles/member.json +1 -0
  120. package/kits/templates/roles/visitor.json +1 -0
  121. package/package.json +6 -3
  122. package/skills/eclink/SKILL.md +2 -0
  123. package/dist/config/aun-gateway-config.js +0 -2
package/CHANGELOG.md CHANGED
@@ -3,6 +3,28 @@
3
3
  本文件记录 EvolCore 的重要变更。EvolClaw 版本线的历史记录已归档至
4
4
  [`docs/_archive/CHANGELOG-evolclaw.md`](docs/_archive/CHANGELOG-evolclaw.md)。
5
5
 
6
+ ## 0.0.21 (2026-09-03)
7
+
8
+ ### 话题与权限控制
9
+
10
+ - 新增话题 `/renew`,支持在空闲状态下安全续接话题后端会话,并强化并发操作与异常恢复处理。
11
+ - 新增 `/fa`、`/fullaccess` 和持久 Fullaccess Trigger,统一 daemon-owner 授权、可信运行身份与审计记录。
12
+
13
+ ### 服务与消息管理
14
+
15
+ - 统一本机服务和 AUN Service Proxy 的配置与旧版迁移,支持按实例配置本机服务及代理。
16
+ - `ec msg history` 支持按完整渠道实例和原生对端 ID 查询已落盘的非 AUN 私聊历史。
17
+
18
+ ### AUN 投递与联系人
19
+
20
+ - 完善 AUN Outbox 投递与回执处理,覆盖排队、重试、过期和永久失败等状态。
21
+ - 新增联系人申请与 Owner 审核流程,并将联系人策略应用到托管私聊的入站和出站准入。
22
+
23
+ ### 安全与运行兼容
24
+
25
+ - 加固 Codex Shell 载体解析、受管权限校验和受保护路径沙箱边界,并将受保护路径策略归入权限模块。
26
+ - 统一 BaseAgent 请求地址和身份请求头处理,升级 AUN SDK 至 0.5.10,并兼容 Node.js 22.16.0。
27
+
6
28
  ## 0.0.20 (2026-08-28)
7
29
 
8
30
  ### AUN 网关与投递可靠性
package/README.md CHANGED
@@ -78,7 +78,7 @@ ResponseEngine.processMessage()
78
78
  ### 环境要求
79
79
 
80
80
  - **操作系统**:macOS / Linux / Windows
81
- - **Node.js** >= 22.19.0(依赖 `node:sqlite`)
81
+ - **Node.js** >= 22.16.0(依赖 `node:sqlite`,并与 AUN SDK 要求保持一致)
82
82
  - **Claude Code** >= 2.1.32(`npm install -g @anthropic-ai/claude-code`)
83
83
 
84
84
  ### 1. 安装
@@ -143,7 +143,7 @@ ec init aun
143
143
  ```
144
144
 
145
145
  交互式引导完成以下配置:
146
- - 环境检查(Node.js >= 22、claude CLI、SDK 版本)
146
+ - 环境检查(Node.js >= 22.16.0、claude CLI、SDK 版本)
147
147
  - 渠道选择(飞书 / 微信 / 钉钉 / QQ 频道 / 企业微信 / AUN)并扫码登录
148
148
  - 默认项目路径
149
149
  - 模型选择(sonnet/opus/haiku)
@@ -177,8 +177,8 @@ ec init aun
177
177
  - `model`:配置文件 → `~/.claude/settings.json` → 默认 `sonnet`
178
178
  - `effort`:配置文件 → `~/.claude/settings.json` → SDK 默认值(`auto`)
179
179
 
180
- Claude/Codex 兼容网关需要额外请求头或查询参数时,可以直接在 EvolCore 的
181
- `baseagents` 配置中设置,不需要修改 Claude/Codex 的全局配置文件:
180
+ ClaudeCodex 或 EC Agent 兼容网关需要额外请求头或查询参数时,可以直接在 EvolCore 的
181
+ `baseagents` 配置中设置,不需要修改各 base agent 的全局配置文件:
182
182
 
183
183
  ```json
184
184
  {
@@ -200,6 +200,15 @@ Claude/Codex 兼容网关需要额外请求头或查询参数时,可以直接
200
200
  "queryParams": {
201
201
  "source": "evolcore"
202
202
  }
203
+ },
204
+ "ecagent": {
205
+ "baseUrl": "https://example.com/ecagent/v1",
206
+ "headers": {
207
+ "X-Tenant-Id": "${TENANT_ID}"
208
+ },
209
+ "queryParams": {
210
+ "source": "evolcore"
211
+ }
203
212
  }
204
213
  }
205
214
  }
@@ -207,9 +216,48 @@ Claude/Codex 兼容网关需要额外请求头或查询参数时,可以直接
207
216
 
208
217
  `${VAR}` 会按 EvolCore 的环境变量规则展开。Claude 通过 `ANTHROPIC_CUSTOM_HEADERS`
209
218
  传递 Header;Codex app-server 启动时由 EvolCore 注入 `env_http_headers` 和
210
- `query_params`,所以不需要手改 `~/.codex/config.toml`。`queryParams` 不应放置密钥等敏感信息。
219
+ `query_params`;EC Agent 主推理、模型列表和辅助推理直接在请求 URL 上追加参数。
220
+ 因此不需要手改 Claude/Codex 的全局配置文件。`queryParams` 不应放置密钥等敏感信息。
221
+
222
+ 完整设计、运行链路和排障说明见:[Baseagent 自定义请求元数据技术文档](docs/baseagent-request-metadata.md)。
223
+
224
+ ### Baseagent 模型与备用链
225
+
226
+ Session Renew 的辅助模型配置与主模型、推理强度放在同一个
227
+ `baseagents.<baseagent>` 块中,与 `responseMode` 正交。主模型故障备用链
228
+ `fallbackModels` 只在 `agents/defaults.json` 中配置:
229
+
230
+ ```jsonc
231
+ {
232
+ "baseagents": {
233
+ "claude": {
234
+ "model": "claude-opus",
235
+ "effort": "medium",
236
+ "auxiliaryModel": "claude-haiku-4-5-20251001",
237
+ "auxiliaryEffort": "low",
238
+ "fallbackModels": [
239
+ { "model": "claude-sonnet-4-5", "effort": "medium" },
240
+ { "model": "claude-haiku-4-5", "effort": "low" }
241
+ ]
242
+ },
243
+ "codex": {
244
+ "model": "gpt-5.6",
245
+ "effort": "high",
246
+ "auxiliaryModel": "gpt-5.6-sol",
247
+ "auxiliaryEffort": "medium",
248
+ "fallbackModels": [
249
+ { "model": "gpt-5.4", "effort": "medium" }
250
+ ]
251
+ }
252
+ }
253
+ }
254
+ ```
255
+
256
+ `auxiliaryEffort` 必须与同一 baseagent 块中的 `auxiliaryModel` 一起配置;未配置辅助模型时,
257
+ Session Renew 按 `session_renew.fallback_action` 处理。`fallbackModels` 不会被辅助推理使用。
211
258
 
212
- 完整设计、运行链路和排障说明见:[Claude/Codex 自定义请求元数据技术文档](docs/baseagent-request-metadata.md)。
259
+ 升级旧版本时,daemon 启动前会自动把模式桶中的辅助字段迁移到对应的 baseagent 块并创建备份。
260
+ 迁移逻辑集中在 `src/config/schema-migration.ts`,运行时不会回退读取旧字段。
213
261
 
214
262
  ### 3. 运行
215
263
 
@@ -269,10 +317,11 @@ evolcore/
269
317
  │ │ │ ├── session-fs-store.ts # 文件系统存储原语
270
318
  │ │ │ └── session-manager.ts # 会话管理(多项目支持)
271
319
  │ │ ├── auth/ # 授权审计与 Trigger 鉴权
320
+ │ │ ├── permission/ # 权限策略与沙箱边界
321
+ │ │ │ └── protected-paths.ts # 受保护路径分级
272
322
  │ │ ├── evolagent.ts # EvolAgent 实体
273
323
  │ │ ├── evolagent-registry.ts # Agent 注册表(扫描/路由/热重载)
274
- │ │ ├── interaction-router.ts # 卡片交互回调路由
275
- │ │ └── protected-paths.ts # 受保护路径分级
324
+ │ │ └── interaction-router.ts # 卡片交互回调路由
276
325
  │ ├── channels/
277
326
  │ │ ├── feishu.ts # 飞书 WebSocket 渠道
278
327
  │ │ ├── wechat.ts # 微信 ClawBot 渠道
@@ -380,7 +429,7 @@ v3.2 新增进程级身份标识。启动时自动生成 `ec+5位数字.agentid.
380
429
 
381
430
  ## 技术栈
382
431
 
383
- - **运行时**:Node.js >= 22 + TypeScript(ES modules)
432
+ - **运行时**:Node.js >= 22.16.0 + TypeScript(ES modules)
384
433
  - **AI 后端**:@anthropic-ai/claude-agent-sdk 0.3.220(固定版本)、Codex CLI app-server、Gemini CLI
385
434
  - **消息渠道**:飞书(@larksuiteoapi/node-sdk)、微信(ClawBot ilink API)、钉钉(dingtalk-stream)、QQ频道(pure-qqbot)、企业微信(AI Bot API)、AUN 网络
386
435
  - **数据存储**:文件系统(per-chat 目录) + JSONL(CLI 共用)
@@ -28,12 +28,16 @@ const BASEAGENT_ALIASES = {
28
28
  geminicli: { canonical: 'gemini', displayName: 'Gemini CLI' },
29
29
  ecagent: { canonical: 'ecagent', displayName: 'ecagent' },
30
30
  'ec-agent': { canonical: 'ecagent', displayName: 'ecagent' },
31
- hermes: { canonical: 'hermes', displayName: 'Hermes' },
32
31
  };
32
+ const SUPPORTED_BASEAGENTS = new Set(['claude', 'codex', 'gemini', 'ecagent']);
33
33
  export function normalizeBaseagent(input) {
34
34
  const key = String(input || '').trim().toLowerCase().replace(/_/g, '-');
35
35
  return BASEAGENT_ALIASES[key] || { canonical: 'unknown', displayName: input ? String(input) : 'Unknown' };
36
36
  }
37
+ export function isSupportedBaseagent(input) {
38
+ const key = String(input || '').trim().toLowerCase();
39
+ return SUPPORTED_BASEAGENTS.has(key);
40
+ }
37
41
  function directInferencePair(apiKey, baseUrl) {
38
42
  const normalizedApiKey = directInferenceValue(apiKey);
39
43
  const normalizedBaseUrl = directInferenceValue(baseUrl);
@@ -232,7 +236,7 @@ export function resolveOpenaiDirectConfig(override) {
232
236
  }
233
237
  : undefined;
234
238
  }
235
- export function resolveOpenaiConfig(config, override) {
239
+ export function resolveOpenaiConfig(config, override, runtime) {
236
240
  const codexSettings = loadCodexSettings();
237
241
  const isPlaceholder = (v) => !v || v.includes('your-') || v.includes('placeholder');
238
242
  const overrideApiKey = isPlaceholder(override?.apiKey) ? undefined : override?.apiKey;
@@ -279,8 +283,8 @@ export function resolveOpenaiConfig(config, override) {
279
283
  effort,
280
284
  enableRequestUserInput,
281
285
  approvalsReviewer,
282
- evolcoreAgentAid: override?.evolcoreAgentAid ?? config.agents?.codex?.evolcoreAgentAid,
283
- evolcoreAgentConfig: override?.evolcoreAgentConfig ?? config.agents?.codex?.evolcoreAgentConfig,
286
+ agentAid: runtime?.agentAid,
287
+ agentConfig: runtime?.agentConfig,
284
288
  };
285
289
  }
286
290
  export function resolveGoogleConfig(config, override) {
@@ -328,18 +332,18 @@ export function resolveEcagentConfig(config, override) {
328
332
  || DEFAULT_ECAGENT_BASE_URL;
329
333
  const model = override?.model || configured?.model || DEFAULT_ECAGENT_MODEL;
330
334
  const headers = normalizeStringMap(override?.headers ?? configured?.headers, 'headers');
335
+ const queryParams = normalizeStringMap(override?.queryParams ?? configured?.queryParams, 'queryParams');
331
336
  const effort = override?.effort ?? configured?.effort;
332
337
  const numberOr = (value, fallback) => (typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : fallback);
333
338
  return {
334
339
  apiKey,
335
340
  baseUrl,
336
341
  headers,
342
+ queryParams,
337
343
  model,
338
344
  effort,
339
345
  timeoutMs: numberOr(override?.timeoutMs ?? configured?.timeoutMs, DEFAULT_ECAGENT_TIMEOUT_MS),
340
346
  maxRetries: numberOr(override?.maxRetries ?? configured?.maxRetries, DEFAULT_ECAGENT_MAX_RETRIES),
341
347
  maxRetryDelayMs: numberOr(override?.maxRetryDelayMs ?? configured?.maxRetryDelayMs, DEFAULT_ECAGENT_MAX_RETRY_DELAY_MS),
342
- evolcoreAgentAid: configured?.evolcoreAgentAid,
343
- evolcoreAgentConfig: configured?.evolcoreAgentConfig,
344
348
  };
345
349
  }