evolcore 0.0.24 → 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.
Files changed (112) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/bin/ec.js +12 -1
  3. package/bin/install-codex-managed-hooks.mjs +28 -1
  4. package/dist/agents/baseagent.js +96 -46
  5. package/dist/agents/claude-runner.js +54 -13
  6. package/dist/agents/codex/app-server-client.js +13 -5
  7. package/dist/agents/codex/catalog.js +1 -1
  8. package/dist/agents/codex/diagnostics.js +34 -1
  9. package/dist/agents/codex-runner.js +128 -42
  10. package/dist/agents/ecagent-runner.js +14 -18
  11. package/dist/agents/gemini-runner.js +24 -9
  12. package/dist/agents/runner-types.js +25 -17
  13. package/dist/aun/aid/agentmd.js +135 -10
  14. package/dist/aun/aid/client.js +1 -1
  15. package/dist/aun/aid/identity.js +1 -1
  16. package/dist/aun/aid/index.js +2 -1
  17. package/dist/aun/aid/managed-operation.js +53 -1
  18. package/dist/aun/aid/store.js +17 -13
  19. package/dist/aun/menu-client.js +74 -0
  20. package/dist/aun/msg/group.js +1 -1
  21. package/dist/aun/msg/managed-operation.js +1 -1
  22. package/dist/aun/msg/p2p.js +6 -1
  23. package/dist/aun/msg/upload.js +30 -22
  24. package/dist/aun/storage/client.js +4 -1
  25. package/dist/aun/storage/index.js +1 -1
  26. package/dist/channels/aun.js +329 -94
  27. package/dist/cli/agent-command.js +125 -5
  28. package/dist/cli/agent-create.js +151 -11
  29. package/dist/cli/agent.js +119 -6
  30. package/dist/cli/aun-commands.js +74 -7
  31. package/dist/cli/config.js +27 -8
  32. package/dist/cli/contact.js +63 -6
  33. package/dist/cli/daemon-commands.js +90 -25
  34. package/dist/cli/diag.js +31 -0
  35. package/dist/cli/handoff-command.js +35 -3
  36. package/dist/cli/index.js +7 -1
  37. package/dist/cli/managed-command-guard.js +3 -0
  38. package/dist/cli/menu-client.js +38 -23
  39. package/dist/cli/restart-monitor.js +57 -10
  40. package/dist/config/builtin-roles.js +2 -0
  41. package/dist/config/config-manager.js +15 -0
  42. package/dist/config/config-operation-service.js +165 -3
  43. package/dist/config/contact-operation-service.js +96 -7
  44. package/dist/config/resolved-config-op.js +66 -8
  45. package/dist/core/agent-application-service.js +2 -1
  46. package/dist/core/auth/authorization-audit.js +20 -12
  47. package/dist/core/auth/operation-authorizer.js +87 -8
  48. package/dist/core/auth/operation-catalog.js +51 -4
  49. package/dist/core/auth/remote-access-store.js +40 -1
  50. package/dist/core/bootstrap-service.js +1 -1
  51. package/dist/core/command/agent-control.js +54 -25
  52. package/dist/core/command/cli-intent-parser.js +18 -0
  53. package/dist/core/command/command-handler.js +152 -20
  54. package/dist/core/command/diag-service.js +118 -0
  55. package/dist/core/command/menu-catalog.js +13 -3
  56. package/dist/core/command/menu-handler.js +88 -31
  57. package/dist/core/command/menu-protocol.js +6 -0
  58. package/dist/core/command/menu-token-store.js +41 -8
  59. package/dist/core/command/slash-gate.js +34 -4
  60. package/dist/core/command/slash-handler.js +77 -12
  61. package/dist/core/event-catalog.js +5 -0
  62. package/dist/core/evolagent.js +3 -3
  63. package/dist/core/handoff/runtime.js +205 -27
  64. package/dist/core/handoff/store.js +193 -4
  65. package/dist/core/message/im-renderer.js +72 -21
  66. package/dist/core/message/message-bridge.js +69 -9
  67. package/dist/core/message/message-queue.js +26 -0
  68. package/dist/core/message/message-utils.js +1 -0
  69. package/dist/core/message/response-engine.js +48 -23
  70. package/dist/core/model/catalog-service.js +79 -49
  71. package/dist/core/model/context-window-suffix.js +33 -0
  72. package/dist/core/model/model-catalog.js +1 -1
  73. package/dist/core/model/model-permission.js +12 -3
  74. package/dist/core/permission/ec-command-parser.js +51 -12
  75. package/dist/core/permission/sandbox-runtime.js +36 -14
  76. package/dist/core/permission/tool-policy.js +47 -7
  77. package/dist/index.js +195 -31
  78. package/dist/ipc.js +54 -2
  79. package/dist/response-system/engines/v1/proactive-flow.js +59 -2
  80. package/dist/stats/billing.js +41 -15
  81. package/dist/stats/price-resolver.js +28 -10
  82. package/dist/utils/avatar-upload.js +282 -23
  83. package/dist/utils/cross-platform.js +30 -1
  84. package/dist/utils/error-utils.js +21 -0
  85. package/dist/utils/evolcore-version.js +129 -0
  86. package/dist/utils/logger.js +3 -1
  87. package/dist/utils/model-prices.jsonl +3 -3
  88. package/dist/utils/npm-ops.js +176 -35
  89. package/kits/docs/context-assembly.md +1 -0
  90. package/kits/docs/evolcore/INDEX.md +3 -1
  91. package/kits/docs/evolcore/agent-create.md +30 -11
  92. package/kits/docs/evolcore/agent.md +18 -8
  93. package/kits/docs/evolcore/aid.md +6 -4
  94. package/kits/docs/evolcore/codex-windows-sandbox.md +146 -0
  95. package/kits/docs/evolcore/config.md +7 -0
  96. package/kits/docs/evolcore/contact.md +12 -5
  97. package/kits/docs/evolcore/menu-client.md +11 -3
  98. package/kits/docs/evolcore/msg.md +1 -0
  99. package/kits/docs/prompt-loading-architecture.md +1 -0
  100. package/kits/docs/venues/group.md +12 -0
  101. package/kits/eck_manifest.json +12 -0
  102. package/kits/rules/03-identity.md +3 -1
  103. package/kits/templates/message-fragments/handoff-request-to-target.md +3 -3
  104. package/kits/templates/roles/admin.json +14 -2
  105. package/kits/templates/roles/member.json +3 -2
  106. package/kits/templates/roles/visitor.json +4 -3
  107. package/kits/templates/system-fragments/bootstrap.md +16 -5
  108. package/kits/templates/system-fragments/channel.md +1 -1
  109. package/kits/templates/system-fragments/session.md +1 -1
  110. package/package.json +6 -4
  111. package/skills/eclink/SKILL.md +0 -84
  112. package/skills/eclink/agents/openai.yaml +0 -4
@@ -20,6 +20,7 @@ ec agent new [aid]
20
20
  ec agent new <aid> --non-interactive \
21
21
  [--project <路径>] [--baseagent claude|codex|gemini|ecagent] \
22
22
  [--owner <aid>] [--name "<显示名>"] [--description "<text>"] \
23
+ [--tags '<json-array>'] \
23
24
  [--dry-run] [--force]
24
25
 
25
26
  # 启用 / 停用
@@ -30,6 +31,11 @@ ec agent disable <aid>
30
31
  ec agent get <aid> <key>
31
32
  ec agent set <aid> <key> <val>
32
33
 
34
+ # 读取或设置当前 Agent 的 persona.md
35
+ ec agent persona show
36
+ ec agent persona --text <text>
37
+ ec agent persona --file <path>
38
+
33
39
  # 修改 agent.md 显示名称
34
40
  ec agent rename <aid> "<name>"
35
41
 
@@ -52,6 +58,9 @@ ec agent delete <aid> [--purge]
52
58
  - `--name` / `--description` 缺省读取当前项目 `package.json`,再回退到目录名 / 空描述。
53
59
  - `--dry-run` 只输出最终创建计划,不注册 AID、不写配置、不上传 `agent.md`。
54
60
  - `--force` 覆盖已有 `config.json`;AID 密钥保留。
61
+ - `--tags` 接受 3 到 6 个标签的 JSON 数组;每个标签只允许 Unicode 字母、数字和连字符(`-`),最长 50 字符。
62
+ - `ec agent persona show` 读取当前 Agent 的 `$PERSONAL_DIR/persona.md`;`--text` 或 `--file <path>` 可由当前 Agent 的 owner 写入。文件内容限制为 UTF-8 文本,`--file` 仅接受 `.md`/`.txt`。
63
+ - `agent show <target-aid>` 与 `agent get <target-aid> <key>` 的跨 Agent 读取对 owner/admin 开放,但普通 Agent 角色只获得安全摘要;敏感配置值和物理路径仅对 DaemonOwner 返回原值。跨 Agent 写入、启停、删除和 reload 仍遵循各自的目标与 DaemonOwner 权限边界。
55
64
 
56
65
  ## 创建 Agent
57
66
 
@@ -61,26 +70,27 @@ ec agent delete <aid> [--purge]
61
70
 
62
71
  ## 头像更新
63
72
 
64
- 头像上传通过 menu 协议暴露,不是 `ec agent` CLI 子命令:
73
+ 头像上传通过 menu 协议或 `ec aid avatar` 暴露:
65
74
 
66
75
  ```json
67
76
  {
68
77
  "type": "menu.action",
69
- "name": "agent",
70
- "action": "update",
78
+ "name": "aid",
79
+ "action": "avatar",
71
80
  "args": {
72
81
  "aid": "mybot.agentid.pub",
73
- "patch": {
74
- "avatar": "data:image/png;base64,..."
75
- }
82
+ "data": "data:image/png;base64,..."
76
83
  }
77
84
  }
78
85
  ```
79
86
 
80
87
  约束:
81
- - `patch.avatar` 必须单独提交,不能和 `chatmode`、`owners`、`channels` 等 config patch 混合。
82
- - 支持 PNG/JPEG/WebP;后端按解码后图片大小硬限制 500KB。
88
+ - 规范入口使用 `args.data`(data URL)或 `args.url`(HTTPS URL)二选一;控制面可用顶层 `agent` 或 `args.aid` 选择目标,Agent channel 只能修改当前 self AID。
89
+ - 头像参数只属于 `name=aid action=avatar`,不属于 `name=agent action=update` 的 config patch;后者提交 `avatar` 或 `avatar_url` 会返回 `UNSUPPORTED_FIELD`。
90
+ - 支持真实 MIME 为 PNG/JPEG/WebP 的图片;大小不超过 500KB,分辨率为 128–2048 像素,宽高比为 0.8–1.25。
83
91
  - 成功后头像上传到该 agent 自己的 AUN storage,`agent.md` frontmatter 写入 AID 风格 URL,并重新签名发布。
92
+ - 托管会话中的 CLI 形式为 `ec aid avatar <当前 self AID> (--file <path> | --url <https-url>)`;仅允许 owner 在 `request`/`bypass` 模式下执行。`--file` 只能从项目目录或当前会话 `$TMPDIR` 读取,`--url` 由 daemon 下载并做 SSRF、重定向和大小校验。
93
+ - 成功响应包含 `sha256`、`mime`、`width`、`height` 和 `aspectRatio`,便于调用方核对实际上传内容。
84
94
 
85
95
  ## 通用约定
86
96
 
@@ -4,17 +4,18 @@
4
4
 
5
5
  ## 运行边界
6
6
 
7
- 本页列出独立终端中 `ec aid` 的完整 CLI 能力。在 EvolCore 托管 Agent 会话中,为防止会话枚举、创建、删除或切换身份,只允许当前 self AID 上的以下精确命令:
7
+ 本页列出独立终端中 `ec aid` 的完整 CLI 能力。在 EvolCore 托管 Agent 会话中,为防止会话枚举、创建、删除或切换本地身份,只允许以下精确命令:
8
8
 
9
9
  ```bash
10
10
  ec aid show <当前 self AID> [--format json]
11
- ec aid lookup <当前 self AID> [--format json]
12
- ec aid agentmd get <当前 self AID> [--format json]
11
+ ec aid lookup <任意合法 AID> [--format json]
12
+ ec aid agentmd get <任意合法 AID> [--format json]
13
13
  # 仅 request / bypass
14
14
  ec aid agentmd put <当前 self AID> [--format json]
15
+ ec aid avatar <当前 self AID> (--file <path> | --url <https-url>) [--format json]
15
16
  ```
16
17
 
17
- 仅允许不带选项的基本形式,或在末尾附加一组完整的 `--format json`;不能使用 `--aun-path`、未知选项、管道、重定向或其他 AID。`show`、`lookup` 和 `agentmd get` 是 self-scoped 查询,可在所有 `permissionMode` 执行;`agentmd put` 会发布远端名片,属于写操作,仅允许 `request`、`bypass`,`readonly`、`auto` 和未知模式均拒绝。该身份范围边界早于模式审批,`bypass` 也不能跨越当前 self AID。`show` 会对自身身份做本地签名/验签自检,但不输出私钥;`lookup` 只探测已知的自身 AID;`get` 不改变身份或远端数据,但会下载并验签自身公开名片,同时刷新本地 AID 缓存。`list`、其他 AID 的 `show/lookup/agentmd get/put` 以及 `new/delete` 均拒绝。独立终端不受此托管会话限制。
18
+ 仅允许不带选项的基本形式,或在末尾附加一组完整的 `--format json`;不能使用 `--aun-path`、未知选项、管道、重定向或其它命令。所有 `allowAccess=true` 的已认证角色(包括 visitor、member、admin、owner 及自定义角色)均开放 `lookup` 和 `agentmd get`,目标可以是任意合法 AID。`show` 只允许当前 self AID:owner/admin 返回完整本地身份诊断,visitor/member 及其它非管理角色返回不含私钥存在性、密钥匹配和签名能力的脱敏结果。三个查询可在所有 `permissionMode` 执行。`agentmd put` 和 `avatar` 会发布远端名片,属于写操作,仅允许针对当前 self AID 的 `request`、`bypass`,`readonly`、`auto` 和未知模式均拒绝。头像支持 PNG、JPEG、WebP,大小上限 500KB,分辨率 128–2048 像素,宽高比 0.8–1.25;`--url` 仅支持 HTTPS,下载由 daemon 执行并做 SSRF/重定向校验。成功 JSON 返回 `sha256`、MIME 和尺寸元数据。`lookup` 探测指定公开 AID;`get` 下载并验签指定公开名片,同时刷新本地 AID 缓存。`list`、其它 AID 的 `show/agentmd put/avatar` 以及 `new/delete` 均拒绝。独立终端不受此托管会话限制。
18
19
 
19
20
  ## 子命令
20
21
 
@@ -34,6 +35,7 @@ ec aid lookup <aid>
34
35
  # agent.md 名片:签名上传 / 下载验签
35
36
  ec aid agentmd put <aid>
36
37
  ec aid agentmd get <aid>
38
+ ec aid avatar <aid> (--file <path> | --url <https-url>)
37
39
 
38
40
  # 删除指定本地 AID(无网络注销)
39
41
  ec aid delete <aid>
@@ -0,0 +1,146 @@
1
+ # Windows 上的 Codex Sandbox 权限排障
2
+
3
+ 本文适用于 EvolCore 在 Windows 上调用 Codex 时,任务在启动阶段因 sandbox 权限失败的情况。目标运行方式是:Codex Desktop、EvolCore daemon 和 `ec` CLI 均以普通用户运行;只有 Codex sandbox 的安装或修复过程临时通过 UAC 提权。
4
+
5
+ 不要为了绕过 sandbox 错误而长期以管理员身份运行全部组件。这样不仅扩大权限,还可能使高完整性 daemon 创建的命名管道拒绝普通权限 `ec` CLI 连接。
6
+
7
+ ## 典型错误
8
+
9
+ ### `.sandbox-bin` 无法锁定
10
+
11
+ ```text
12
+ helper_sandbox_lock_failed: lock sandbox bin dir C:\Users\<user>\.codex\.sandbox-bin failed:
13
+ SetNamedSecurityInfoW sandbox dir failed: 5
14
+ ```
15
+
16
+ 错误码 5 是 Windows `ACCESS_DENIED`。常见原因是 `.sandbox-bin` 归 `BUILTIN\Administrators` 所有,而当前普通用户只有 `Modify`,没有修改 DACL 所需的 `WRITE_DAC`。Codex 的日常 sandbox refresh 不会请求 UAC,因此无法自行修复这个状态。
17
+
18
+ ### `unelevated` 无法执行 deny-read
19
+
20
+ ```text
21
+ windows unelevated restricted-token sandbox cannot enforce deny-read restrictions directly;
22
+ refusing to run unsandboxed
23
+ ```
24
+
25
+ 这不是同一个错误。EvolCore 会为托管 Agent 注入 deny-read 限制;Windows 的 `unelevated` backend 无法实施这些限制并会 fail closed。因此不要把下面的配置当作修复:
26
+
27
+ ```toml
28
+ [windows]
29
+ sandbox = "unelevated"
30
+ ```
31
+
32
+ 需要 deny-read 时应继续使用:
33
+
34
+ ```toml
35
+ [windows]
36
+ sandbox = "elevated"
37
+ ```
38
+
39
+ 这里的 `elevated` 指 sandbox provisioning 能通过 UAC 建立受限账户和 ACL,不表示 Desktop 或 EvolCore 必须一直以管理员运行。
40
+
41
+ ## 先确认错误属于哪一层
42
+
43
+ 在普通 PowerShell 中执行:
44
+
45
+ ```powershell
46
+ codex --version
47
+ codex doctor --json
48
+ whoami /groups
49
+
50
+ $sandboxBin = Join-Path $env:USERPROFILE '.codex\.sandbox-bin'
51
+ Get-Item -LiteralPath $sandboxBin -Force |
52
+ Select-Object FullName, Attributes, LinkType
53
+ Get-Acl -LiteralPath $sandboxBin |
54
+ Select-Object Owner, AreAccessRulesProtected, Sddl
55
+ ```
56
+
57
+ 同时检查:
58
+
59
+ ```powershell
60
+ Get-Content (Join-Path $env:USERPROFILE '.codex\.sandbox\setup_error.json')
61
+ Get-Content (Join-Path $env:USERPROFILE '.codex\.sandbox\setup_marker.json')
62
+ Get-Content (Join-Path $env:USERPROFILE '.codex\.sandbox\sandbox.*.log') -Tail 80
63
+ ```
64
+
65
+ 注意以下边界:
66
+
67
+ | 现象 | 所属层 | 处理方向 |
68
+ |------|--------|----------|
69
+ | `helper_sandbox_lock_failed` / `SetNamedSecurityInfoW ... 5` | Codex sandbox ACL | 重新 provisioning 或修复 `.sandbox-bin` owner |
70
+ | `unelevated ... cannot enforce deny-read` | Codex sandbox 模式 | 使用 `windows.sandbox = "elevated"` |
71
+ | `connect EPERM \\.\pipe\daemon-*` | EvolCore IPC | 让 daemon 与 CLI 使用相同用户和完整性级别 |
72
+ | sandbox 已启动,随后出现 `POLICY_DENIED` | EvolCore 角色/权限策略 | 检查任务发起者角色和 permission mode |
73
+
74
+ 共享同一个项目目录或同一个 `CODEX_HOME` 本身不是错误。关键是宿主进程的完整性级别一致,以及 sandbox 基础 ACL 已正确 provisioning。
75
+
76
+ ## 推荐修复:重新执行 elevated provisioning
77
+
78
+ 1. 结束正在启动的 Codex Agent 任务,保留 Codex Desktop 和 EvolCore 的普通权限运行方式。
79
+ 2. 将 Codex Desktop 与独立安装的 Codex CLI 更新到兼容版本,避免两个版本交替刷新同一 `CODEX_HOME`。
80
+ 3. 在 Codex Desktop 的 Windows Sandbox 设置中执行 setup/repair,选择 elevated backend,并接受一次 UAC 提示。对应的 app-server 操作为 `windowsSandbox/setupStart`,模式为 `elevated`;普通用户不应自行拼接内部 RPC。
81
+ 4. provisioning 完成后关闭管理员窗口。后续 Desktop、EvolCore daemon 和 `ec` CLI 均以普通用户运行。
82
+ 5. 在普通 PowerShell 中执行验证命令。
83
+
84
+ ```powershell
85
+ codex doctor --json
86
+ codex sandbox -- cmd /c whoami
87
+ ```
88
+
89
+ 验收结果应满足:
90
+
91
+ - `codex doctor` 中 sandbox backend 为 `elevated`,provisioning 为 `complete`,没有 `helper_sandbox_lock_failed`。
92
+ - `codex sandbox -- cmd /c whoami` 成功,身份是专用 sandbox 用户(例如 `CodexSandboxOffline` 或 `CodexSandboxOnline`),而不是当前桌面用户。
93
+ - 普通权限 EvolCore 任务可以进入模型执行阶段。
94
+
95
+ 如果 setup/repair 仍反复失败,优先使用 Codex 的修复或重新安装流程。不要先清空整个 `.codex`,其中包含会话、认证和其他用户数据。
96
+
97
+ ## 已验证的定向 workaround
98
+
99
+ 仅当官方 repair 无法完成、错误明确为 `.sandbox-bin` owner/DACL 不一致时使用。此方法只修复目录 owner,不递归改文件权限,也不删除或放宽现有 DACL。
100
+
101
+ 先在普通 PowerShell 中确认目标是实体目录而非重解析点:
102
+
103
+ ```powershell
104
+ $sandboxBin = Join-Path $env:USERPROFILE '.codex\.sandbox-bin'
105
+ $item = Get-Item -LiteralPath $sandboxBin -Force
106
+ if ($item.Attributes -band [IO.FileAttributes]::ReparsePoint) {
107
+ throw "$sandboxBin is a reparse point; stop and inspect it manually"
108
+ }
109
+ Get-Acl -LiteralPath $sandboxBin | Format-List Owner, Sddl
110
+ ```
111
+
112
+ 然后只为下面一次操作打开管理员 PowerShell:
113
+
114
+ ```powershell
115
+ $sandboxBin = Join-Path $env:USERPROFILE '.codex\.sandbox-bin'
116
+ $currentUser = [Security.Principal.WindowsIdentity]::GetCurrent().Name
117
+ $acl = Get-Acl -LiteralPath $sandboxBin
118
+ $acl.SetOwner([Security.Principal.NTAccount]::new($currentUser))
119
+ Set-Acl -LiteralPath $sandboxBin -AclObject $acl
120
+ ```
121
+
122
+ 关闭管理员 PowerShell,在普通 PowerShell 中重新运行:
123
+
124
+ ```powershell
125
+ codex sandbox -- cmd /c whoami
126
+ codex doctor --json
127
+ ```
128
+
129
+ 本 workaround 已验证可以让普通权限 refresh 越过 `SetNamedSecurityInfoW ... 5`,但它不是替代官方 provisioning 的长期安装流程。Codex 更新或 repair 可能重新设置 owner;若问题复发,应保留 `doctor` 输出和 sandbox 日志并反馈给 Codex,而不是持续扩大 ACL。
130
+
131
+ ## 禁止采用的规避方式
132
+
133
+ - 不要给 `Everyone`、`Users` 或 `CodexSandboxUsers` 授予 `FullControl`、`WRITE_DAC` 或 `WRITE_OWNER`。
134
+ - 不要删除 `.codex` 父目录上的 deny ACL;这些规则可能正是 deny-read 隔离的一部分。
135
+ - 不要关闭 sandbox 或使用危险绕过参数来运行不受信任的 Agent 任务。
136
+ - 不要让 EvolCore daemon 长期管理员运行而 CLI 保持普通权限;这会造成命名管道 `EPERM`。
137
+ - 不要仅凭 `ec status` 中 PID 存活判断系统健康;还要确认 IPC 和实际 Agent 任务都能运行。
138
+
139
+ ## EvolCore 侧最终验证
140
+
141
+ ```powershell
142
+ ec status
143
+ ec agent reload <agent-aid> --format json
144
+ ```
145
+
146
+ 然后从一个普通 AID 向目标 Agent 发送最小测试任务。观察 daemon 日志时,正确顺序应是:sandbox 初始化成功、Codex thread 启动、任务进入工具/模型执行。若此后出现 `POLICY_DENIED`,说明 sandbox 已恢复,下一步应修复 EvolCore 的角色或任务权限,而不是继续修改 Windows ACL。
@@ -18,6 +18,13 @@ ec config set <field> <value> [--self <aid>] [--peer <X>] [--default] [--process
18
18
  # 删除某层显式设置,回落下一层
19
19
  ec config unset <field> [--self <aid>] [--peer <X>]
20
20
 
21
+ # 关系角色:通过 Role Assignment 服务读取、设置或撤销(仅支持 AUN private/group)
22
+ ec config get role --self <aid> --peer <peer-aid>
23
+ ec config set role <role-id> --self <aid> --peer <peer-aid>
24
+ ec config unset role --self <aid> --peer <peer-aid>
25
+
26
+ `role` 不走通用配置写入;设置/撤销仍执行角色目标校验、权限检查、revision CAS、原子写入和审计。
27
+
21
28
  # 查看某一层文件原始内容(不合并,凭证显示 ${VAR} 不展开)
22
29
  ec config show [--self <aid>] [--peer <X>] [--default] [--process]
23
30
 
@@ -9,10 +9,15 @@
9
9
  ec contact add <aid> --self <agent-aid>
10
10
  ec contact block <aid> --self <agent-aid>
11
11
  ec contact unblock <aid> --self <agent-aid>
12
- ec contact list --blocked --self <agent-aid>
12
+ ec contact list --blocked [--self <agent-aid>]
13
+ ec contact list --pending [--self <agent-aid>]
14
+ ec contact list --all [--self <agent-aid>]
15
+ ec contact approve <aid> --request-id <id> [--self <agent-aid>]
16
+ ec contact reject <aid> --request-id <id> [--self <agent-aid>]
17
+ ec contact block-request <aid> --request-id <id> [--self <agent-aid>]
13
18
  ```
14
19
 
15
- 所有命令都要求显式 `--self`,支持 `--format json`。
20
+ 支持 `--format json`。本机 `list` 省略 `--self` 时聚合全部 Agent;写操作在仅有一个 Agent 时可自动推断,多 Agent 环境必须显式指定,避免误操作错误 Agent。
16
21
 
17
22
  ## 约束
18
23
 
@@ -20,12 +25,13 @@ ec contact list --blocked --self <agent-aid>
20
25
  - Agent 托管会话中的 `add` 只能针对当前 AUN 私聊对端;它创建/更新 `pending`,并向本 Agent Owner 发送审核卡片。
21
26
  - `add` 复用 `/request` 的联系人申请额度、过期和请求版本校验;已有 `pending`/`declined` 条目会重新走申请流程。
22
27
  - Owner 在审核卡片点击“通过”后才变为 active;`blocked` 必须先执行 `unblock`。
28
+ - `list --pending` 可查看仍待审核的申请及其 `requestId`;卡片过期或投递失败时,Owner 可用 `approve/reject/block-request` 通过 requestId 处理当前申请,过期申请需申请方重新提交。
23
29
  - 直接从本机终端执行 `add` 属于本地管理操作,会直接创建或恢复 active 联系人;Connect `action=add` 同样是管理端直接操作。
24
30
  - 写入 Agent Owner 时,系统会自动创建该 Owner 的 active 联系人记录。
25
31
  - `block/unblock` 只接受已存在的联系人;不存在时返回 `NOT_FOUND`。
26
32
  - `block/unblock` 至少改变本 Agent 的入站接收策略;托管任务的普通私聊 `ec msg send` 对 blocked 目标也会在 daemon 侧被拒绝。非托管 AUN CLI 发送不读取本地联系人簿。不代表对端也拉黑了本 Agent。
27
33
  - Agent owner 不能被拉黑。
28
- - `list --blocked` 只列出当前 blocked contact,并返回 `contactRevision`。
34
+ - `list --blocked` 只列出 blocked contact;`list --pending` 只列出待审申请;`list --all` 列出联系人全状态。指定 `--self` 时返回该 Agent 的 `contactRevision`,本机省略 `--self` 时按 Agent 聚合。
29
35
 
30
36
  ## 权限边界
31
37
 
@@ -35,11 +41,12 @@ ec contact list --blocked --self <agent-aid>
35
41
 
36
42
  | 操作 | owner | admin | 普通角色 |
37
43
  |---|---:|---:|---:|
38
- | `list --blocked` | 允许 | 允许 | 拒绝 |
44
+ | `list --blocked/--pending/--all` | 允许 | 允许 | 拒绝 |
39
45
  | Agent 会话 `add` 当前私聊对端 | 允许 | 允许 | 由当前关系授权,受 AUN 私聊和申请限制 |
40
46
  | `block` / `unblock` | 允许 | 拒绝 | 拒绝 |
47
+ | `approve/reject/block-request` | 允许 | 允许 | 拒绝 |
41
48
 
42
- 缺少、伪造、撤销或跨会话 delegation token 时失败关闭。托管调用的 `--self` 必须等于当前任务所属 Agent。
49
+ 缺少、伪造、撤销或跨会话 delegation token 时失败关闭。托管调用省略 `--self` 时使用 delegation 中的当前 Agent;显式 `--self` 必须等于当前任务所属 Agent。
43
50
 
44
51
  角色管理使用 Role Menu relation assignment;admin 的授予和撤销必须由 owner 执行。
45
52
 
@@ -1,6 +1,12 @@
1
1
  # ec menu-client — 远程 Daemon Menu 客户端
2
2
 
3
- 向另一台主机的 EvolCore Control AID 发送一个标准 `menu.*` 请求,并在同一 AUN 短连接中完成发送、拉取、匹配和 ACK。适合非托管主机上的 eclink/运维工具调用;托管 Agent 会话不应使用它绕过当前 daemon。
3
+ 向另一台主机的 EvolCore Control AID 发送标准 `menu.*` 请求。独立终端使用 AUN 短连接完成发送、拉取、匹配和 ACK;EvolCore 托管 Agent 自动通过当前 daemon 的委托入口与现有 AUN 连接完成调用。
4
+
5
+ ## 托管会话边界
6
+
7
+ 托管调用必须使用当前 self AID,并拥有 `ec.menu.request` 的 relation 权限。daemon 校验当前 session、委托和角色,按目标 AID 与 request ID 匹配加密响应;普通角色的聊天权限不自动授予远程 Menu 调用能力。
8
+
9
+ 托管模式不接受 `--app`、`--aun-path`、`--no-encrypt`,也不创建独立连接或清理 daemon 的消息。`--request-file` 由 daemon 校验后读取,须为当前项目或本会话 `$TMPDIR` 内不受保护的普通文件,最大 128 KiB;也可用 `--request-json`。目标是否允许具体操作,仍由远端 Control Menu 的 Token/Owner 鉴权决定。
4
10
 
5
11
  ## 用法
6
12
 
@@ -14,12 +20,13 @@ ec menu-client request <from-aid> <daemon-aid> \
14
20
 
15
21
  - `--request-file` 与 `--request-json` 二选一,内容是现有 Menu request;缺少 `id` 时自动生成 UUID。
16
22
  - 默认使用 E2EE,并发送 `client_name=ec-menu-client` 和本机 EvolCore `client_version`。
17
- - 默认 slot 是 `evolcore-menu-client`;`--app <slot>` 可覆盖,但会切换消费游标,调用方须自行串行化。
23
+ - 独立终端默认 slot 是 `evolcore-menu-client`;`--app <slot>` 可覆盖,但会切换消费游标,调用方须自行串行化。托管模式使用 daemon 的现有连接和 ACK 路径。
18
24
  - 默认授权是远端 `daemon.json.owners` 对发送 AID 的校验。
19
25
  - `--remote-token <token>` 使用 daemon 签发的远程访问 token,权限与 daemon-owner 一致。CLI 审计日志不会记录 token 明文。
26
+ - `system/paircode` 例外:仅接受加密的 daemon-owner 请求,已有 remote token 不能换取新配对码。
20
27
  - `--ecweb-token <token>` 是 `--remote-token` 的兼容别名。
21
28
  - `menu.query` / `menu.options` 等待响应超时时自动重发一次相同 request id;写操作不自动重试。
22
- - 成功时 stdout 是完整 `menu.response` JSON。远端业务错误仍在响应的 `error` 字段中;本地传输/超时/ACK 错误退出码非 0。
29
+ - 成功时 stdout 是完整 `menu.response` JSON。远端业务错误仍在响应的 `error` 字段中;本地传输/超时错误退出码非 0。独立终端的 ACK 错误也以非零退出码返回;托管模式由 daemon 的正常消费路径处理 ACK。
23
30
 
24
31
  ## 常用请求
25
32
 
@@ -27,6 +34,7 @@ ec menu-client request <from-aid> <daemon-aid> \
27
34
  {"type":"menu.query","id":"status-1","name":"system","args":{"view":"status"}}
28
35
  {"type":"menu.query","id":"monitor-1","name":"system","args":{"view":"monitor"}}
29
36
  {"type":"menu.query","id":"logs-1","name":"system","args":{"view":"logs","source":"daemon","limit":200}}
37
+ {"type":"menu.action","id":"paircode-1","name":"system","action":"paircode"}
30
38
  {"type":"menu.options","id":"config-options-1","name":"config","args":{"option":"rawFile"}}
31
39
  {"type":"menu.query","id":"config-1","name":"config","args":{"view":"rawFile","resource":"daemon"}}
32
40
  ```
@@ -40,6 +40,7 @@ ec msg send <from> <to> --payload '<json>'
40
40
 
41
41
  发送相关选项:
42
42
  - `--text-from-file <path>` — 从文件读取文本(UTF-8),用于超长消息或避免 Shell 转义
43
+ - `--handoff-context <text>` — 仅托管私聊跨会话发送可用,1–65536 字符;为本 Agent 的目标会话保存额外交接上下文,处理对端回复时补入。该内容不加入网络 payload,实际发送正文不变;不能用来迁移整个运行中的任务。
43
44
  - `--encrypt` — 端到端加密
44
45
  - `--no-encrypt` — 强制明文发送,优先于 `--encrypt`
45
46
  - `--thread <id>` — 指定话题 ID(多话题路由)
@@ -103,6 +103,7 @@
103
103
  | 10 | rules | always | ✗ | `$KITS_RULES/` 目录(ECK 核心规则) |
104
104
  | 20 | identity-layer | chatType≠null | ✓ | 身份层 fragment |
105
105
  | 21 | persona | chatType≠null | ✗ | `$PERSONAL_DIR/persona.md` |
106
+ | 21.5 | personal-profile | chatType≠null | ✗ | `$PERSONAL_DIR/personal.md` |
106
107
  | 22 | working-memory | chatType≠null | ✗ | `$PERSONAL_DIR/memory/working.md` |
107
108
  | 30 | relation-layer | chatType∈{private,group} | ✓ | 关系层 fragment |
108
109
  | 35 | peer-profile | peerKey≠null | ✗ | 对端 profile.md |
@@ -10,6 +10,18 @@
10
10
  - 群发言会被多人看到,谨言慎行
11
11
  - 具体渠道(AUN/飞书/微信等)的群聊特有指引见对应渠道文档
12
12
 
13
+ ## 群聊 slash 命令
14
+
15
+ 群内仅保留 `/help`、`/evolhelp`、`/status`、`/check`、`/ask`、`/pause`、`/resume`、`/stop`、
16
+ `/compact`、`/renew`,以及只读的 `/mentionmode`、`/model`、`/effort`、`/perm`、`/baseagent`。
17
+ `/model current|list|check` 也是查询;切换、重置、审批等带参写操作在群内不支持。
18
+ `/compact`、话题内的 `/renew` 仍受原有角色与会话状态限制。别名遵循主命令策略。
19
+ `/chatmode`、`/activity` 和其他 slash 命令在群内不支持,请通过私聊或有权限的管理入口操作。
20
+
21
+ AUN 群聊的命令查询、成功与进度反馈使用 `notice`,命令拒绝和失败使用可恢复的 `error`;
22
+ 已有的 notice、error、timeout 和卡片协议保留。它们不会进入其他 EvolCore agent 的模型输入。
23
+ 这些限制针对聊天 slash 入口;菜单协议与受管 CLI 继续走各自的鉴权路径。
24
+
13
25
  ## 可按需查询的群数据
14
26
 
15
27
  群结构信息(成员名单、各成员角色、群主、管理员、在线状态等)**不预先注入上下文**,
@@ -43,6 +43,18 @@
43
43
  ] },
44
44
  "description": "人格档案(persona.md)"
45
45
  },
46
+ {
47
+ "id": "personal-profile",
48
+ "type": "file",
49
+ "file": "$PERSONAL_DIR/personal.md",
50
+ "order": 21.5,
51
+ "needsInjection": false,
52
+ "when": { "and": [
53
+ { "var": "chatType", "neq": null },
54
+ { "var": "lifecycle", "eq": "active" }
55
+ ] },
56
+ "description": "个人资料(personal.md)"
57
+ },
46
58
  {
47
59
  "id": "working-memory",
48
60
  "type": "file",
@@ -18,7 +18,8 @@
18
18
 
19
19
  | 路径 | 用途 | 实际状态 |
20
20
  |------|------|----------|
21
- | `persona.md` | 人格(行为规范、身份认知) | evolcore 自动注入;无写入命令,带外手改 |
21
+ | `persona.md` | 人格(行为规范、身份认知) | evolcore 自动注入;通过 `ec agent persona` 读写 |
22
+ | `personal.md` | 个人资料与工作背景 | evolcore 自动注入;当前 Agent 在 owner 权限下可直接编辑 |
22
23
  | `memory/working.md` | 当前关注(短期) | evolcore 自动注入 |
23
24
  | `preferences/active-preferences.md` | 已确认的稳定用户偏好 | **仅私聊**注入;由用户态 trigger 维护 |
24
25
  | `preferences/stats.json`、`preferences/preferences-conflicts.md` | 偏好计分状态与冲突记录 | trigger 私有,无 schema 保证 |
@@ -32,6 +33,7 @@
32
33
  - **注入条件**是 `chatType ≠ null` 且 `lifecycle = active`(即处于正常运行阶段的渠道会话),不是"有没有注入 AID"。生命周期变量缺失时按 `active` 处理;非法生命周期仍失败关闭。本地 coding 模式也不注入。
33
34
  - persona.md 由 evolcore **自动前置**进 system prompt,你不需要主动 Read。
34
35
  - persona.md 缺失时**没有默认人格兜底**,只是这一段不出现;行为约束改由 `kits/rules/` + `roles/` 权限定义承担。
36
+ - personal.md 缺失时跳过注入;文件位于 `$PERSONAL_DIR/personal.md`。人格文件 `persona.md` 通过 `ec agent persona show`、`ec agent persona --text <text>` 或 `ec agent persona --file <path>` 管理,修改后按 mtime 自动刷新(必要时可 `ec agent reload`)。
35
37
  - 改完 persona.md 后 `ec agent reload` 生效(mtime 门控缓存)。
36
38
  - `agents/<aid>/behavior.json` 是**已废弃**的旧配置(基座/模型/权限模式已并入 `config.json`),与人格无关。
37
39
 
@@ -2,9 +2,9 @@
2
2
  - 以下是尚未完成的跨会话请求,仅本端可见。
3
3
  - 请结合请求列表与当前对端回复,分别判断哪些请求已经得到充分回答。
4
4
  - 不要在对外回复中主动提及 handoff、ID、return 命令或内部路由机制。
5
- - 当前回复足以处理某项请求时,需要使用:`ec handoff return ID "<完整回流内容>"`
6
- - 命令双引号内若含双引号、反引号或 Shell 展开形式的 `$`,需经转义符转义,Shell 传给 ec 时会做还原。
7
- - 若回复不足,不要执行 return。
5
+ - 通常请直接在当前回复中给出完整处理结果,本端会自动把回复绑定并回流到原请求会话。
6
+ - 如果请求因权限、网络或其它原因无法完成,且需要把失败/阻塞原因明确回传给原会话,可执行已有命令 `ec handoff return <handoff-id> "<失败原因>"`;required 请求允许用同一个 ID 追加多次结果。
7
+ - 不要在对外回复中主动提及 handoff、ID 或内部路由机制。
8
8
 
9
9
  待回流请求:
10
10
  {{#each handoffRequiredEntries}}- ID:{{handoffId}}
@@ -58,14 +58,26 @@
58
58
  "scopes": ["agent"],
59
59
  "constraints": { "targetCurrentAgentOnly": true, "requireAgentAdmin": true }
60
60
  },
61
- "ec.aid.lookup": { "allow": true, "scopes": ["agent"] },
62
- "ec.aid.agentmd.get": { "allow": true, "scopes": ["agent"] },
61
+ "ec.aid.lookup": {
62
+ "allow": true,
63
+ "scopes": ["agent"]
64
+ },
65
+ "ec.aid.agentmd.get": {
66
+ "allow": true,
67
+ "scopes": ["agent"]
68
+ },
63
69
  "ec.aid.agentmd.put": {
64
70
  "allow": true,
65
71
  "dangerous": true,
66
72
  "scopes": ["agent"],
67
73
  "constraints": { "targetCurrentAgentOnly": true, "requireAgentAdmin": true }
68
74
  },
75
+ "ec.aid.avatar": {
76
+ "allow": false,
77
+ "dangerous": true,
78
+ "scopes": ["agent"],
79
+ "constraints": { "targetCurrentAgentOnly": true, "requireAgentOwner": true }
80
+ },
69
81
  "ec.fs.mkdir": { "allow": true, "permissionMode": "auto", "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
70
82
  "ec.fs.upload": { "allow": true, "permissionMode": "auto", "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
71
83
  "ec.fs.copy": { "allow": true, "permissionMode": "auto", "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
@@ -58,9 +58,10 @@
58
58
  "ec.msg.online": { "allow": true, "scopes": ["relation"], "constraints": { "privateOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
59
59
  "ec.version": { "allow": true },
60
60
  "ec.aid.show": { "allow": true, "dangerous": true, "scopes": ["relation"], "constraints": { "targetCurrentAgentOnly": true } },
61
- "ec.aid.lookup": { "allow": true, "scopes": ["relation"], "constraints": { "targetCurrentAgentOnly": true } },
62
- "ec.aid.agentmd.get": { "allow": true, "scopes": ["relation"], "constraints": { "targetCurrentAgentOnly": true } },
61
+ "ec.aid.lookup": { "allow": true, "scopes": ["relation"] },
62
+ "ec.aid.agentmd.get": { "allow": true, "scopes": ["relation"] },
63
63
  "ec.aid.agentmd.put": { "allow": false },
64
+ "ec.aid.avatar": { "allow": false },
64
65
  "ec.fs.ls": { "allow": true, "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
65
66
  "ec.fs.stat": { "allow": true, "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
66
67
  "ec.fs.lstat": { "allow": true, "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
@@ -62,10 +62,11 @@
62
62
  "ec.msg.history": { "allow": false },
63
63
  "ec.msg.online": { "allow": false },
64
64
  "ec.version": { "allow": true },
65
- "ec.aid.show": { "allow": false },
66
- "ec.aid.lookup": { "allow": true, "scopes": ["relation"], "constraints": { "targetCurrentAgentOnly": true } },
67
- "ec.aid.agentmd.get": { "allow": false },
65
+ "ec.aid.show": { "allow": true, "dangerous": true, "scopes": ["relation"], "constraints": { "targetCurrentAgentOnly": true } },
66
+ "ec.aid.lookup": { "allow": true, "scopes": ["relation"] },
67
+ "ec.aid.agentmd.get": { "allow": true, "scopes": ["relation"] },
68
68
  "ec.aid.agentmd.put": { "allow": false },
69
+ "ec.aid.avatar": { "allow": false },
69
70
  "ec.fs.*": { "allow": false },
70
71
  "ec.handoff.*": { "allow": false },
71
72
  "ec.queue.*": { "allow": false },
@@ -5,13 +5,23 @@ phase: bootstrapping
5
5
  Bootstrap 不另设隐藏状态机;恢复依据是可核对的生命周期和名片状态。每次重启、超时恢复或收到“继续”时,先检查自身 `lifecycle` 以及本地 `agent.md` 是否存在、字段是否完整,再决定续做步骤,不按旧上下文推断尚未完成。
6
6
  系统已经在进入本阶段时向 owner 发送过固定的首条引导消息。当前收到的是 owner 对该消息的后续输入:不要重新发送、复述或改写那条固定消息,也不要再次完整罗列三项问题;只针对当前输入推进下一步。
7
7
 
8
+ 如果当前 owner 是 Agent/AI,必须使用 `ec msg send` 与其交流 Bootstrap 信息,具体参数遵循当前注入的消息发送说明;可发送提问、最终值回显、确认请求或错误说明,但不得联系无关对象或处理普通任务。不要只输出普通文本而未实际发送。对方作为 owner 提供信息并确认,你仍须自行修改和发布自己的 agent.md、执行 ready,不因对方是 Agent/AI 而跳过确认流程。
9
+
10
+ 如果向 Agent/AI owner 发送消息时收到“不是联系人”或联系人准入拒绝:只向该 owner 发送一次 `/request <说明>` 联系人申请,说明这是新 Agent 的 Bootstrap 首次设定;等待 owner 审核后再继续发送确认内容。不要反复重试、不要把联系人策略改为 open、不要联系其它对象;若 owner 已直接发来消息,则按该入站消息继续 Bootstrap。
11
+
8
12
  需要确认的字段:
9
13
  - name:显示名,简短清晰
10
14
  - description:一句到两句话描述你的职责或定位
11
- - tags:3 到 6 个标签,用于检索和归类
15
+ - tags:3 到 6 个标签,用于检索和归类;每个标签只允许 Unicode 字母、数字和连字符(`-`),最长 50 字符
16
+
17
+ 可选的 persona:
18
+ - owner 可以在 Bootstrap 中直接发送 persona 文本,或附带 `.md`/`.txt` 文件。收到后先读取内容并向 owner 回显摘要,请 owner 明确确认;不得从普通任务内容推断 persona。
19
+ - owner 确认后,使用 `ec agent persona --text '<内容>'` 或 `ec agent persona --file '<收到的文件路径>'` 写入自己的 `$PERSONAL_DIR/persona.md`。`--file` 只接受文本文件,不能使用任意路径。
20
+ - persona 是可选环节。owner 未提供、拒绝或暂时跳过时,不得阻塞名片发布和 `ec agent ready`。
12
21
 
13
22
  允许的操作范围:
14
23
  - 为读取现有候选值,可以读取本地 `{{agentMdPath}}`。
24
+ - 为处理可选 persona,可以执行 `ec agent persona show`、`ec agent persona --text <text>` 或 `ec agent persona --file <path>`;写入前仍须取得 owner 对待写入内容的明确确认。
15
25
  - owner 明确确认最终值后,只能编辑上述 agent.md 的 YAML frontmatter,并依次执行下面两个命令:
16
26
  - `ec aid agentmd put {{selfAid}}`
17
27
  - `ec agent ready {{selfAid}}`
@@ -30,9 +40,10 @@ Bootstrap 不另设隐藏状态机;恢复依据是可核对的生命周期和
30
40
  3. 信息缺失、互相冲突或含义不清时,只追问缺失或有歧义的部分;保留此前已经明确或 owner 选择保持的内容。
31
41
  4. owner 在 bootstrap 完成前提出普通工作请求、要求跳过 bootstrap,或要求先执行任务后再设定时:不执行、不分析、不规划、不读取任务相关文件、不搜索、不调用任务工具,也不把任务排队到当前会话。只简短说明必须先完成首次设定,然后回显现有候选值并询问保持/修改,或只追问仍缺失的字段。
32
42
  5. 三项信息齐全后,向 owner 回显最终的 `name`、`description`、`tags`,并请求对这组最终值作明确确认。owner 仅表示“保持现有值”时,先据此形成最终值并回显;未经这一步最终确认,不要修改文件、发布名片或调用 ready。
33
- 6. owner 明确确认最终值后,只编辑本地 agent.md(`{{agentMdPath}}`)YAML frontmatter 中的 `name`、`description`、`tags`,保留其它字段和正文,并检查 YAML 与字段格式有效。
34
- 7. 调用 `ec aid agentmd put {{selfAid}}` 签名并发布 agent.md。只有命令明确成功后,才调用 `ec agent ready {{selfAid}}` 完成 bootstrap。
35
- 8. 任一步骤失败时,不调用 ready,不盲目重复尝试;说明具体失败原因并在修正后继续。
36
- 9. `ec agent ready {{selfAid}}` 必须是 bootstrap 的最后一个操作。成功后系统会结束当前 bootstrap 上下文、创建全新的主会话并发送正式欢迎消息;不要再生成一段完成说明,也不要在旧上下文中继续处理任务。
43
+ 6. 如果 owner 提供 persona 文本或 `.md`/`.txt` 文件,单独回显待写入内容并请求确认;确认后使用 `ec agent persona` 写入 `persona.md`。persona 未确认时保留现状,不影响后续名片流程。
44
+ 7. owner 明确确认最终值后,只编辑本地 agent.md(`{{agentMdPath}}`)YAML frontmatter 中的 `name`、`description`、`tags`,保留其它字段和正文,并检查 YAML 与字段格式有效。
45
+ 8. 调用 `ec aid agentmd put {{selfAid}}` 签名并发布 agent.md。只有命令明确成功后,才调用 `ec agent ready {{selfAid}}` 完成 bootstrap。
46
+ 9. 任一步骤失败时,不调用 ready,不盲目重复尝试;说明具体失败原因并在修正后继续。
47
+ 10. `ec agent ready {{selfAid}}` 必须是 bootstrap 的最后一个操作。成功后系统会结束当前上下文、创建新的主会话并发送欢迎消息;不要在旧上下文中继续处理任务。
37
48
 
38
49
  完成前不要承诺已经进入正常工作状态,也不要尝试与上述流程无关的文件修改、网络通信或系统配置操作。
@@ -22,7 +22,7 @@ chatMode: {{chatMode}} # interactive=同步对话 / proactive=主动推送
22
22
  # 设计意图:避免 agent↔agent 无限循环;某一方不再发送 → 对话自然终止。
23
23
  # 拿不到 self-aid 时可用 ec ctl send "<text>"(自动继承当前 AID 和对端)。
24
24
  # Shell 调用边界:每次工具调用只能执行一条完整的 ec 命令。
25
- # 禁止拼接 command -v。`ec aid` 仅允许对 {{selfAid}} 精确执行 show、lookup、agentmd get;仅 request/bypass 可执行 agentmd put。可选后缀仅限 --format json;禁止 &&、||、;、|、重定向、子 shell、bash -lc/sh -c 或其它脚本。
25
+ # 禁止拼接 command -v。托管 `ec aid` 允许 `show {{selfAid}}`、`lookup <任意合法 AID>`、`agentmd get <任意合法 AID>`;仅 request/bypass 可对 `{{selfAid}}` 执行 `agentmd put`。可选后缀仅限 --format json;禁止 &&、||、;、|、重定向、子 shell、bash -lc/sh -c 或其它脚本。
26
26
  # 不要先做 CLI 探测;直接执行下方的单条 ec 命令,读取 JSON/回执后再决定下一步。
27
27
  # 工具审批拒绝时原样报告并停止,不要通过追加其它命令或提权重试绕过审批。
28
28
  {{/}}
@@ -44,7 +44,7 @@ readonly: true — 禁止写入项目目录及临时目录;如需生成文件
44
44
  # - 每 {{proactiveToolReportInterval}} 次非发送工具调用后,必须先用发送命令汇报当前进展和下一步,否则后续非发送工具会被拒绝
45
45
  {{/}}
46
46
  # 命令速查:
47
- # 每次工具调用只执行一条完整的 ec 命令;禁止 command -v。`ec aid` 仅允许对 {{selfAid}} 精确执行 show、lookup、agentmd get;仅 request/bypass 可执行 agentmd put。可选后缀仅限 --format json;禁止 &&、||、;、|、重定向、子 shell、bash -lc/sh -c 或其它脚本与其串联。
47
+ # 每次工具调用只执行一条完整的 ec 命令;禁止 command -v。托管 `ec aid` 允许 `show {{selfAid}}`、`lookup <任意合法 AID>`、`agentmd get <任意合法 AID>`;仅 request/bypass 可对 `{{selfAid}}` 执行 `agentmd put`。可选后缀仅限 --format json;禁止 &&、||、;、|、重定向、子 shell、bash -lc/sh -c 或其它脚本与其串联。
48
48
  # 审批拒绝时原样报告并停止;必须收到包含 message_id/status 的成功回执后才能声称已发送。
49
49
  {{?chatType=group}}
50
50
  # ec group send {{selfAid}} {{groupId}} "<text>" [--return none|required] [--file <path>] [--mention <aid>]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evolcore",
3
- "version": "0.0.24",
3
+ "version": "0.0.26",
4
4
  "description": "AI Agent gateway connecting Claude, Codex, Gemini, and the bundled ecagent runner to messaging channels with multi-project session management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,14 +13,15 @@
13
13
  "!ecagent/dist/**/*.map",
14
14
  "!dist/**/*.test.js",
15
15
  "!dist/**/*.spec.js",
16
+ "!dist/aun/sender-installation.*",
17
+ "!src/aun/sender-installation.*",
16
18
  "ecagent/LICENSE",
17
19
  "ecagent/NOTICE",
18
20
  "ecagent/README.md",
19
21
  "!dist/cli/mode.js",
20
22
  "bin/",
21
23
  "!dist/experimental/",
22
- "skills/",
23
- "!skills/eclink/IDENTITIES.md",
24
+ "!skills/",
24
25
  "kits/",
25
26
  "!kits/.kits-version",
26
27
  "*.md",
@@ -32,6 +33,7 @@
32
33
  "!ONBOARDING.md",
33
34
  "!TODO.md",
34
35
  "!SKILLS.md",
36
+ "!echo-rtt-fix-handoff.md",
35
37
  "!proxy-setup.md",
36
38
  "!evolcore-install-aun.md"
37
39
  ],
@@ -49,7 +51,7 @@
49
51
  "prepublishOnly": "npm test"
50
52
  },
51
53
  "dependencies": {
52
- "@agentunion/fastaun": "0.5.14",
54
+ "@agentunion/fastaun": "0.5.16",
53
55
  "@anthropic-ai/claude-agent-sdk": "0.3.220",
54
56
  "@modelcontextprotocol/sdk": "^1.29.0",
55
57
  "ajv": "^8.20.0",