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
package/dist/cli/net-check.js
CHANGED
|
@@ -635,28 +635,28 @@ export async function cmdNet(args) {
|
|
|
635
635
|
const formatJson = args.includes('--format') && args.includes('json');
|
|
636
636
|
const kickTest = args.includes('--kick-test');
|
|
637
637
|
if (isHelpFlag(sub) || wantsHelp(args)) {
|
|
638
|
-
console.log(`用法: ec net check [<aid>] [--format json] [--kick-test]
|
|
639
|
-
|
|
640
|
-
检查 AUN 网络链路连通性(11 步逐层诊断)。
|
|
641
|
-
|
|
642
|
-
步骤:
|
|
643
|
-
1. DNS (AID) AID 域名解析
|
|
644
|
-
2. Discovery .well-known/aun-gateway 获取网关地址
|
|
645
|
-
3. DNS (Gateway) 网关域名解析
|
|
646
|
-
4. TCP 网关端口连接
|
|
647
|
-
5. TLS TLS 握手 + 证书验证
|
|
648
|
-
6. WSS WebSocket 升级握手
|
|
649
|
-
7. Auth AID 认证(login1 + login2 → token)
|
|
650
|
-
8. Session 会话建立
|
|
651
|
-
9. Ping meta.ping RPC
|
|
652
|
-
10. Echo self-to-self 消息收发
|
|
653
|
-
11. KickTest 踢人测试 / extra_info 验证(可选)
|
|
654
|
-
|
|
655
|
-
参数:
|
|
656
|
-
<aid> 要检查的 AID(可选,默认取前 3 个本地 AID)
|
|
657
|
-
|
|
658
|
-
选项:
|
|
659
|
-
--format json JSON 格式输出
|
|
638
|
+
console.log(`用法: ec net check [<aid>] [--format json] [--kick-test]
|
|
639
|
+
|
|
640
|
+
检查 AUN 网络链路连通性(11 步逐层诊断)。
|
|
641
|
+
|
|
642
|
+
步骤:
|
|
643
|
+
1. DNS (AID) AID 域名解析
|
|
644
|
+
2. Discovery .well-known/aun-gateway 获取网关地址
|
|
645
|
+
3. DNS (Gateway) 网关域名解析
|
|
646
|
+
4. TCP 网关端口连接
|
|
647
|
+
5. TLS TLS 握手 + 证书验证
|
|
648
|
+
6. WSS WebSocket 升级握手
|
|
649
|
+
7. Auth AID 认证(login1 + login2 → token)
|
|
650
|
+
8. Session 会话建立
|
|
651
|
+
9. Ping meta.ping RPC
|
|
652
|
+
10. Echo self-to-self 消息收发
|
|
653
|
+
11. KickTest 踢人测试 / extra_info 验证(可选)
|
|
654
|
+
|
|
655
|
+
参数:
|
|
656
|
+
<aid> 要检查的 AID(可选,默认取前 3 个本地 AID)
|
|
657
|
+
|
|
658
|
+
选项:
|
|
659
|
+
--format json JSON 格式输出
|
|
660
660
|
--kick-test 启用踢人测试(会断开 daemon 长连接,daemon 会自动重连)`);
|
|
661
661
|
return;
|
|
662
662
|
}
|
|
@@ -4,35 +4,35 @@ import { AGENT_DELEGATION_TOKEN_ENV } from '../core/auth/agent-delegation.js';
|
|
|
4
4
|
import { getArgValue, isHelpFlag, wantsHelp } from './help.js';
|
|
5
5
|
export async function cmdQueue(args) {
|
|
6
6
|
if (args.length === 0 || isHelpFlag(args[0]) || wantsHelp(args)) {
|
|
7
|
-
console.log(`用法: ec queue --agent <aid> [选项]
|
|
8
|
-
|
|
9
|
-
查询与操作 EvolAgent 的消息队列。
|
|
10
|
-
|
|
11
|
-
查询:
|
|
12
|
-
--agent <aid> 必填,目标 agent(如 mybot.agentid.pub)
|
|
13
|
-
--after <time> 只显示 adapter 接收时间晚于该值的消息(epoch ms 或 ISO)
|
|
14
|
-
--before <time> 只显示 adapter 接收时间早于该值的消息(epoch ms 或 ISO)
|
|
15
|
-
--showid 显示 messageId
|
|
16
|
-
--full 显示完整消息内容(不截断)
|
|
17
|
-
--format json 以 JSON 格式输出
|
|
18
|
-
|
|
19
|
-
JSON 时间字段:
|
|
20
|
-
receivedAt adapter 收到消息时间(epoch ms)
|
|
21
|
-
enqueuedAt 实际进入队列时间(epoch ms)
|
|
22
|
-
queueWaitMs 排队等待时长(ms)
|
|
23
|
-
processingStartedAt 开始处理时间(epoch ms,active)
|
|
24
|
-
|
|
25
|
-
操作:
|
|
26
|
-
--clear 清空该 agent 的所有待处理消息
|
|
27
|
-
--cancel <messageId> 取消指定消息
|
|
28
|
-
--interrupt --sessionkey <key> 打断指定 session 的处理中任务
|
|
29
|
-
|
|
30
|
-
示例:
|
|
31
|
-
ec queue --agent mybot.agentid.pub
|
|
32
|
-
ec queue --agent mybot.agentid.pub --after 2026-08-19T12:00:00+08:00
|
|
33
|
-
ec queue --agent mybot.agentid.pub --showid
|
|
34
|
-
ec queue --agent mybot.agentid.pub --clear
|
|
35
|
-
ec queue --agent mybot.agentid.pub --cancel msg_d4e5f6
|
|
7
|
+
console.log(`用法: ec queue --agent <aid> [选项]
|
|
8
|
+
|
|
9
|
+
查询与操作 EvolAgent 的消息队列。
|
|
10
|
+
|
|
11
|
+
查询:
|
|
12
|
+
--agent <aid> 必填,目标 agent(如 mybot.agentid.pub)
|
|
13
|
+
--after <time> 只显示 adapter 接收时间晚于该值的消息(epoch ms 或 ISO)
|
|
14
|
+
--before <time> 只显示 adapter 接收时间早于该值的消息(epoch ms 或 ISO)
|
|
15
|
+
--showid 显示 messageId
|
|
16
|
+
--full 显示完整消息内容(不截断)
|
|
17
|
+
--format json 以 JSON 格式输出
|
|
18
|
+
|
|
19
|
+
JSON 时间字段:
|
|
20
|
+
receivedAt adapter 收到消息时间(epoch ms)
|
|
21
|
+
enqueuedAt 实际进入队列时间(epoch ms)
|
|
22
|
+
queueWaitMs 排队等待时长(ms)
|
|
23
|
+
processingStartedAt 开始处理时间(epoch ms,active)
|
|
24
|
+
|
|
25
|
+
操作:
|
|
26
|
+
--clear 清空该 agent 的所有待处理消息
|
|
27
|
+
--cancel <messageId> 取消指定消息
|
|
28
|
+
--interrupt --sessionkey <key> 打断指定 session 的处理中任务
|
|
29
|
+
|
|
30
|
+
示例:
|
|
31
|
+
ec queue --agent mybot.agentid.pub
|
|
32
|
+
ec queue --agent mybot.agentid.pub --after 2026-08-19T12:00:00+08:00
|
|
33
|
+
ec queue --agent mybot.agentid.pub --showid
|
|
34
|
+
ec queue --agent mybot.agentid.pub --clear
|
|
35
|
+
ec queue --agent mybot.agentid.pub --cancel msg_d4e5f6
|
|
36
36
|
ec queue --agent mybot.agentid.pub --interrupt --sessionkey feishu#oc_abc123#main`);
|
|
37
37
|
return;
|
|
38
38
|
}
|
package/dist/cli/response.js
CHANGED
|
@@ -191,36 +191,36 @@ function sourceLabel(target) {
|
|
|
191
191
|
default: return String(target);
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
|
-
const HELP = `用法: ec response <command> [options]
|
|
195
|
-
|
|
196
|
-
Commands:
|
|
197
|
-
list 列出所有响应模式(内置 + 元数据)
|
|
198
|
-
current 显示当前作用域生效的模式 + 参数
|
|
199
|
-
info <mode-id> 查看单个模式详情(场景/配置参数)
|
|
200
|
-
set <mode-id> 设置响应模式
|
|
201
|
-
reset 清除指定作用域的 responseMode 设置
|
|
202
|
-
config <mode-id> 查看指定模式的配置参数
|
|
203
|
-
config set <k> <v> 修改模式配置参数(--mode 指定模式)
|
|
204
|
-
|
|
205
|
-
作用域(由参数决定,越具体越优先:关系 > agent):
|
|
206
|
-
--self <aid> agent级 → config.json
|
|
207
|
-
--self <aid> --peer <X> 关系级 → relations/<peerKey>/config.json
|
|
208
|
-
|
|
209
|
-
Options:
|
|
210
|
-
--self <aid> 本端 AID
|
|
211
|
-
--peer <X> 对端:channelType#channelId 或裸 aid(裸 aid 视为 aun#<aid>)
|
|
212
|
-
--mode <id> 模式 id(config set 专用)
|
|
213
|
-
--format json 输出 JSON
|
|
214
|
-
--help, -h 各子命令均支持
|
|
215
|
-
|
|
216
|
-
示例:
|
|
217
|
-
ec response list
|
|
218
|
-
ec response current --self bot.agentid.pub
|
|
219
|
-
ec response info single-session
|
|
220
|
-
ec response set single-session --self bot.agentid.pub
|
|
221
|
-
ec response set single-session --self bot.agentid.pub --peer aun#team.group.com
|
|
222
|
-
ec response config single-session --self bot.agentid.pub
|
|
223
|
-
ec response config set tool_use_reminder false --mode single-session --self bot.agentid.pub
|
|
194
|
+
const HELP = `用法: ec response <command> [options]
|
|
195
|
+
|
|
196
|
+
Commands:
|
|
197
|
+
list 列出所有响应模式(内置 + 元数据)
|
|
198
|
+
current 显示当前作用域生效的模式 + 参数
|
|
199
|
+
info <mode-id> 查看单个模式详情(场景/配置参数)
|
|
200
|
+
set <mode-id> 设置响应模式
|
|
201
|
+
reset 清除指定作用域的 responseMode 设置
|
|
202
|
+
config <mode-id> 查看指定模式的配置参数
|
|
203
|
+
config set <k> <v> 修改模式配置参数(--mode 指定模式)
|
|
204
|
+
|
|
205
|
+
作用域(由参数决定,越具体越优先:关系 > agent):
|
|
206
|
+
--self <aid> agent级 → config.json
|
|
207
|
+
--self <aid> --peer <X> 关系级 → relations/<peerKey>/config.json
|
|
208
|
+
|
|
209
|
+
Options:
|
|
210
|
+
--self <aid> 本端 AID
|
|
211
|
+
--peer <X> 对端:channelType#channelId 或裸 aid(裸 aid 视为 aun#<aid>)
|
|
212
|
+
--mode <id> 模式 id(config set 专用)
|
|
213
|
+
--format json 输出 JSON
|
|
214
|
+
--help, -h 各子命令均支持
|
|
215
|
+
|
|
216
|
+
示例:
|
|
217
|
+
ec response list
|
|
218
|
+
ec response current --self bot.agentid.pub
|
|
219
|
+
ec response info single-session
|
|
220
|
+
ec response set single-session --self bot.agentid.pub
|
|
221
|
+
ec response set single-session --self bot.agentid.pub --peer aun#team.group.com
|
|
222
|
+
ec response config single-session --self bot.agentid.pub
|
|
223
|
+
ec response config set tool_use_reminder false --mode single-session --self bot.agentid.pub
|
|
224
224
|
ec response reset --self bot.agentid.pub --peer alice.agentid.pub`;
|
|
225
225
|
// ── list ────────────────────────────────────────────────────────────────
|
|
226
226
|
function cmdList(args, formatJson) {
|
|
@@ -15,6 +15,7 @@ import { shouldSuppressRealRestart } from '../utils/restart-safety.js';
|
|
|
15
15
|
import { rotateStdoutLog } from '../utils/log-writer.js';
|
|
16
16
|
import { inspectDataMigrationRequirement } from '../core/data-migration.js';
|
|
17
17
|
import { DAEMON_SHUTDOWN_TIMEOUT_MS, requestDaemonShutdown } from './daemon-commands.js';
|
|
18
|
+
import { getProcessStartTime, startTimeMatches } from '../utils/process-introspect.js';
|
|
18
19
|
const execFileAsync = promisify(execFile);
|
|
19
20
|
/**
|
|
20
21
|
* The package this monitor operates on, which is not always the one it runs
|
|
@@ -43,6 +44,15 @@ function cleanEnv() {
|
|
|
43
44
|
delete process.env[key];
|
|
44
45
|
}
|
|
45
46
|
}
|
|
47
|
+
function isPidReused(pid, expectedStartedAt) {
|
|
48
|
+
if (expectedStartedAt === undefined)
|
|
49
|
+
return false;
|
|
50
|
+
const actualStartedAt = getProcessStartTime(pid);
|
|
51
|
+
return actualStartedAt !== null && !startTimeMatches(expectedStartedAt, actualStartedAt);
|
|
52
|
+
}
|
|
53
|
+
function reportPidReused(pid, log) {
|
|
54
|
+
log(`Process ${pid} no longer refers to the recorded daemon; treating the original process as exited`);
|
|
55
|
+
}
|
|
46
56
|
export async function cmdRestartMonitor() {
|
|
47
57
|
// Defense in depth: a unit test that accidentally executes the real restart
|
|
48
58
|
// path must not detach a persistent daemon from the test worker.
|
|
@@ -117,9 +127,11 @@ export async function cmdRestartMonitor() {
|
|
|
117
127
|
}
|
|
118
128
|
// Test daemons live in one temporary HOME per test, so the current HOME's
|
|
119
129
|
// instance registry cannot see them. Their strict environment markers make
|
|
120
|
-
// them safe to reap globally on every real restart.
|
|
130
|
+
// them safe to reap globally on every real restart. Keep one process-table
|
|
131
|
+
// snapshot for both orphan categories; each Windows CIM scan is expensive.
|
|
132
|
+
const orphanSnapshot = findOrphanProcesses();
|
|
121
133
|
{
|
|
122
|
-
const leakedTestDaemons =
|
|
134
|
+
const leakedTestDaemons = orphanSnapshot.filter(o => o.confirmedTestDaemon);
|
|
123
135
|
if (leakedTestDaemons.length > 0) {
|
|
124
136
|
const killed = killOrphans(leakedTestDaemons);
|
|
125
137
|
log(`Cleaned ${killed.length} leaked test daemon(s): ${killed.join(', ')}`);
|
|
@@ -130,7 +142,7 @@ export async function cmdRestartMonitor() {
|
|
|
130
142
|
// still alive. Refuse to create a second daemon when an unregistered process
|
|
131
143
|
// from this package is found; a duplicate would connect AUN and kick the
|
|
132
144
|
// existing session before failing on IPC/port ownership.
|
|
133
|
-
const runtimeOrphans =
|
|
145
|
+
const runtimeOrphans = orphanSnapshot.filter(o => {
|
|
134
146
|
if (o.confirmedTestDaemon)
|
|
135
147
|
return false;
|
|
136
148
|
const homeMatches = o.evolcoreHome && normalizePath(o.evolcoreHome) === normalizePath(p.root);
|
|
@@ -165,6 +177,7 @@ export async function cmdRestartMonitor() {
|
|
|
165
177
|
const aliveMains = oldStatus.mains.filter(m => m.alive);
|
|
166
178
|
if (aliveMains.length > 0) {
|
|
167
179
|
const oldPids = aliveMains.map(m => m.record.pid);
|
|
180
|
+
const expectedStarts = new Map(aliveMains.map(m => [m.record.pid, m.record.startedAt]));
|
|
168
181
|
log(`Monitoring ${oldPids.length} main process(es): ${oldPids.join(', ')}`);
|
|
169
182
|
const gracefulPid = await requestDaemonShutdown(p.socket, DAEMON_SHUTDOWN_TIMEOUT_MS, 'restart-monitor', new Set(oldPids));
|
|
170
183
|
// 没有收到 IPC shutdown 确认的进程才走信号兜底
|
|
@@ -177,15 +190,39 @@ export async function cmdRestartMonitor() {
|
|
|
177
190
|
}
|
|
178
191
|
}
|
|
179
192
|
const exited = await Promise.all(oldPids.map(async (oldPid) => {
|
|
193
|
+
const expectedStartedAt = expectedStarts.get(oldPid);
|
|
194
|
+
if (isPidReused(oldPid, expectedStartedAt)) {
|
|
195
|
+
reportPidReused(oldPid, log);
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
180
198
|
if (await platform.waitForProcessExit(oldPid, 30_000)) {
|
|
199
|
+
if (isPidReused(oldPid, expectedStartedAt)) {
|
|
200
|
+
reportPidReused(oldPid, log);
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
181
203
|
log(`Process ${oldPid} has exited`);
|
|
182
204
|
return true;
|
|
183
205
|
}
|
|
184
|
-
|
|
206
|
+
if (isPidReused(oldPid, expectedStartedAt)) {
|
|
207
|
+
reportPidReused(oldPid, log);
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
const state = platform.getProcessState(oldPid);
|
|
211
|
+
log(`ERROR: Process ${oldPid} still running after 30s${state ? ` (state=${state})` : ''}, force killing`);
|
|
212
|
+
if (isPidReused(oldPid, expectedStartedAt)) {
|
|
213
|
+
reportPidReused(oldPid, log);
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
185
216
|
platform.killProcess(oldPid, true);
|
|
186
217
|
const forced = await platform.waitForProcessExit(oldPid, 5_000);
|
|
187
|
-
if (
|
|
188
|
-
|
|
218
|
+
if (isPidReused(oldPid, expectedStartedAt)) {
|
|
219
|
+
reportPidReused(oldPid, log);
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
if (!forced) {
|
|
223
|
+
const finalState = platform.getProcessState(oldPid);
|
|
224
|
+
log(`ERROR: Process ${oldPid} survived forced termination${finalState ? ` (state=${finalState})` : ''}`);
|
|
225
|
+
}
|
|
189
226
|
return forced;
|
|
190
227
|
}));
|
|
191
228
|
if (exited.some(result => !result)) {
|
|
@@ -194,7 +231,9 @@ export async function cmdRestartMonitor() {
|
|
|
194
231
|
cleanupPendingFile(pendingFile, log);
|
|
195
232
|
process.exit(1);
|
|
196
233
|
}
|
|
197
|
-
|
|
234
|
+
// waitForProcessExit above already observed the old daemon exit. A fixed
|
|
235
|
+
// three-second delay only serialized the restart path and was not needed
|
|
236
|
+
// for instance-file cleanup.
|
|
198
237
|
cleanupInstances();
|
|
199
238
|
}
|
|
200
239
|
// 版本检查与自动升级
|
|
@@ -202,7 +241,10 @@ export async function cmdRestartMonitor() {
|
|
|
202
241
|
// 升级会原地替换整包,先留一个可回退的产物副本。备份放 EVOLCORE_HOME 而非包目录:
|
|
203
242
|
// Linux/macOS 的全局目录常常不可写,而 HOME 一定可写。
|
|
204
243
|
const upgradeBackup = await backupDistForUpgrade(p, log);
|
|
205
|
-
const upgrade = await
|
|
244
|
+
const [upgrade, ecwebUpgrade] = await Promise.all([
|
|
245
|
+
tryUpgrade(),
|
|
246
|
+
tryUpgradeGlobalPkg(() => resolveGlobalPkg(WEB_PACKAGE_NAME), WEB_PACKAGE_NAME),
|
|
247
|
+
]);
|
|
206
248
|
let upgradeRolledBack;
|
|
207
249
|
switch (upgrade.status) {
|
|
208
250
|
case 'upgraded':
|
|
@@ -243,8 +285,8 @@ export async function cmdRestartMonitor() {
|
|
|
243
285
|
await notifyDaemonOwners(p, `⚠️ evolcore 升级失败,使用当前版本继续\n${upgrade.error ?? ''}`.trim(), log);
|
|
244
286
|
break;
|
|
245
287
|
}
|
|
246
|
-
// EC Web
|
|
247
|
-
|
|
288
|
+
// EC Web 是独立全局包,已安装时单独检查升级;与 EvolCore registry
|
|
289
|
+
// 查询并行执行,npm 安装阶段由 npm-ops 的全局锁串行化。
|
|
248
290
|
switch (ecwebUpgrade.status) {
|
|
249
291
|
case 'upgraded':
|
|
250
292
|
log(`✅ ${WEB_PACKAGE_NAME} upgraded: ${ecwebUpgrade.from} → ${ecwebUpgrade.to}`);
|
|
@@ -710,6 +752,11 @@ async function revertToPreviousBuild(log) {
|
|
|
710
752
|
* back up or the copy failed — the caller then knows rollback is unavailable.
|
|
711
753
|
*/
|
|
712
754
|
async function backupDistForUpgrade(p, log) {
|
|
755
|
+
// Linked/source checkouts cannot be upgraded by npm. Copying dist/ here was
|
|
756
|
+
// pure restart overhead and made every source restart rewrite the artifact
|
|
757
|
+
// tree even when no build was needed.
|
|
758
|
+
if (fs.existsSync(path.join(targetPackageRoot(), 'src')))
|
|
759
|
+
return null;
|
|
713
760
|
const distDir = path.join(targetPackageRoot(), 'dist');
|
|
714
761
|
if (!distArtifactIsUsable(distDir))
|
|
715
762
|
return null;
|
|
@@ -851,36 +898,36 @@ async function invokeClaude(claudePath, p, attempt, maxAttempts, timeout, log) {
|
|
|
851
898
|
const selfHealLog = p.selfHealLog;
|
|
852
899
|
const stdoutLog = path.join(p.logs, 'stdout.log');
|
|
853
900
|
const selfHealExists = fs.existsSync(selfHealLog) ? '存在,请先阅读之前的修复记录' : '不存在(首次修复)';
|
|
854
|
-
const prompt = `EvolCore 服务启动失败,需要你诊断并修复。这是第 ${attempt}/${maxAttempts} 次自动修复尝试。
|
|
855
|
-
|
|
856
|
-
关键信息:
|
|
857
|
-
- 项目目录:${projectDir}
|
|
858
|
-
- EVOLCORE_HOME:${p.root}
|
|
859
|
-
- 错误日志:${stdoutLog}
|
|
860
|
-
- 主日志:${p.logs}/daemon-*.log(按小时切片,读最新的那个,包含 config 校验失败等关键错误)
|
|
861
|
-
- 修复记录:${selfHealLog}(${selfHealExists})
|
|
862
|
-
|
|
863
|
-
⚠️ 重要诊断技巧:
|
|
864
|
-
- stdout.log 可能是空的(进程秒退时 logger 输出不会到 stdout),一定要同时读 daemon-*.log 最新文件
|
|
865
|
-
- 必须实际运行进程来复现错误:\`EVOLCORE_HOME=${p.root} node dist/index.js 2>&1\`,观察输出和退出码
|
|
866
|
-
- 检查是否有旧进程仍在运行:\`ps aux | grep 'node.*dist/index.js' | grep -v grep\`,旧进程可能占用端口或锁文件
|
|
867
|
-
- 可以运行 \`EVOLCORE_HOME=${p.root} node dist/cli/index.js diagnose\` 快速检查配置和数据库
|
|
868
|
-
- 如果进程无任何输出就 exit(1),说明是 process.exit(1) 被显式调用,搜索源码中所有 process.exit(1) 位置
|
|
869
|
-
- 配置文件使用双 rename 原子写(foo.json → foo.json_ → foo.json__),崩溃时可从 foo.json_ 恢复
|
|
870
|
-
|
|
871
|
-
请执行以下步骤:
|
|
872
|
-
1. 读取 ${stdoutLog} 和 ${p.logs}/daemon-*.log(最新文件)的最后 50 行
|
|
873
|
-
2. 运行 \`EVOLCORE_HOME=${p.root} node dist/index.js 2>&1\` 复现错误(设置 10 秒超时)
|
|
874
|
-
3. 如果 ${selfHealLog} 存在,先阅读之前的修复记录,避免重复尝试已失败的方案
|
|
875
|
-
4. 根据实际复现的错误修复代码
|
|
876
|
-
5. 执行 npm run build 确认编译通过
|
|
877
|
-
6. 验证修复:启动服务确认 ready.signal 已写入,然后执行 \`EVOLCORE_HOME=${p.root} node dist/cli/index.js stop\` 优雅停止(restart-monitor 会负责最终启动)
|
|
878
|
-
7. 将本次修复内容追加到 ${selfHealLog},格式:
|
|
879
|
-
## 第 ${attempt} 次修复 - {时间}
|
|
880
|
-
- 错误原因:...
|
|
881
|
-
- 修复方案:...
|
|
882
|
-
- 修改文件:...
|
|
883
|
-
|
|
901
|
+
const prompt = `EvolCore 服务启动失败,需要你诊断并修复。这是第 ${attempt}/${maxAttempts} 次自动修复尝试。
|
|
902
|
+
|
|
903
|
+
关键信息:
|
|
904
|
+
- 项目目录:${projectDir}
|
|
905
|
+
- EVOLCORE_HOME:${p.root}
|
|
906
|
+
- 错误日志:${stdoutLog}
|
|
907
|
+
- 主日志:${p.logs}/daemon-*.log(按小时切片,读最新的那个,包含 config 校验失败等关键错误)
|
|
908
|
+
- 修复记录:${selfHealLog}(${selfHealExists})
|
|
909
|
+
|
|
910
|
+
⚠️ 重要诊断技巧:
|
|
911
|
+
- stdout.log 可能是空的(进程秒退时 logger 输出不会到 stdout),一定要同时读 daemon-*.log 最新文件
|
|
912
|
+
- 必须实际运行进程来复现错误:\`EVOLCORE_HOME=${p.root} node dist/index.js 2>&1\`,观察输出和退出码
|
|
913
|
+
- 检查是否有旧进程仍在运行:\`ps aux | grep 'node.*dist/index.js' | grep -v grep\`,旧进程可能占用端口或锁文件
|
|
914
|
+
- 可以运行 \`EVOLCORE_HOME=${p.root} node dist/cli/index.js diagnose\` 快速检查配置和数据库
|
|
915
|
+
- 如果进程无任何输出就 exit(1),说明是 process.exit(1) 被显式调用,搜索源码中所有 process.exit(1) 位置
|
|
916
|
+
- 配置文件使用双 rename 原子写(foo.json → foo.json_ → foo.json__),崩溃时可从 foo.json_ 恢复
|
|
917
|
+
|
|
918
|
+
请执行以下步骤:
|
|
919
|
+
1. 读取 ${stdoutLog} 和 ${p.logs}/daemon-*.log(最新文件)的最后 50 行
|
|
920
|
+
2. 运行 \`EVOLCORE_HOME=${p.root} node dist/index.js 2>&1\` 复现错误(设置 10 秒超时)
|
|
921
|
+
3. 如果 ${selfHealLog} 存在,先阅读之前的修复记录,避免重复尝试已失败的方案
|
|
922
|
+
4. 根据实际复现的错误修复代码
|
|
923
|
+
5. 执行 npm run build 确认编译通过
|
|
924
|
+
6. 验证修复:启动服务确认 ready.signal 已写入,然后执行 \`EVOLCORE_HOME=${p.root} node dist/cli/index.js stop\` 优雅停止(restart-monitor 会负责最终启动)
|
|
925
|
+
7. 将本次修复内容追加到 ${selfHealLog},格式:
|
|
926
|
+
## 第 ${attempt} 次修复 - {时间}
|
|
927
|
+
- 错误原因:...
|
|
928
|
+
- 修复方案:...
|
|
929
|
+
- 修改文件:...
|
|
930
|
+
|
|
884
931
|
注意:只修复导致启动失败的问题,不要做额外的重构或优化。`;
|
|
885
932
|
try {
|
|
886
933
|
log(`Invoking claude CLI (attempt ${attempt}, timeout ${timeout / 60000}min)...`);
|
package/dist/cli/stats.js
CHANGED
|
@@ -6,52 +6,52 @@ import { wantsHelp } from './help.js';
|
|
|
6
6
|
import { readBestTaskRuntimeContext } from './task-context.js';
|
|
7
7
|
import { queryAggregated, querySessionTurns, queryContextBreakdown, queryTopPeers, queryTopModels, queryMessageAggregated, queryPeerList, querySummary, queryPeerDaily, queryTaskModelCalls, querySessionModelCalls } from '../stats/query.js';
|
|
8
8
|
import { getBudgetStatus } from '../stats/budget.js';
|
|
9
|
-
const HELP = `ec stats — Token 用量与费用统计
|
|
10
|
-
|
|
11
|
-
Usage: ec stats [options]
|
|
12
|
-
|
|
13
|
-
时间范围:
|
|
14
|
-
(无参数) 今日概览
|
|
15
|
-
--today 同上
|
|
16
|
-
--hour 最近 24 小时,按小时分组
|
|
17
|
-
--week 本周
|
|
18
|
-
--month 本月
|
|
19
|
-
--from <date> --to <date> 任意区间(YYYY-MM-DD)
|
|
20
|
-
|
|
21
|
-
维度过滤(可组合):
|
|
22
|
-
--agent <aid> 指定 agent
|
|
23
|
-
--peer <X> 对端(裸 AID 自动前缀 aun#,或 channel#id 格式)
|
|
24
|
-
--model <model-id> 指定模型
|
|
25
|
-
--session <id> 指定会话
|
|
26
|
-
|
|
27
|
-
聚合粒度:
|
|
28
|
-
--by hour|day|week|month|model|peer|agent
|
|
29
|
-
|
|
30
|
-
快捷视图:
|
|
31
|
-
--session <id> 单个会话明细
|
|
32
|
-
--session <id> --last 会话最后一轮用量 + 累计(等价 status.completed)
|
|
33
|
-
--context <id> 会话 context breakdown 细目
|
|
34
|
-
--budget 预算状态
|
|
35
|
-
--top-peers [--limit N] 对端排行
|
|
36
|
-
--top-models [--limit N] 模型排行
|
|
37
|
-
--traffic 消息收发条数与字节数
|
|
38
|
-
--sql "<query>" 直接执行只读 SQL
|
|
39
|
-
--rebuild 全量重建日聚合表 usage_daily(运维兜底/排查)
|
|
40
|
-
--peers [--limit N] 私聊对端列表(带累计 token/calls/活跃日)
|
|
41
|
-
--groups [--limit N] 群聊列表(同上)
|
|
42
|
-
--summary 指定时间范围总消耗汇总(token/USD/CNY)
|
|
43
|
-
--peer-detail <id> 指定对端 AID 或 peer_key,按天返回消耗明细
|
|
44
|
-
--task-calls <taskId> 一个 task 的逐次大模型调用明细
|
|
45
|
-
--session-calls <id> 一个会话的逐次大模型调用明细
|
|
46
|
-
|
|
47
|
-
输出格式:
|
|
48
|
-
--format json JSON 输出
|
|
49
|
-
--help, -h 显示此帮助
|
|
50
|
-
|
|
51
|
-
示例:
|
|
52
|
-
ec stats
|
|
53
|
-
ec stats --month --agent bot.agentid.pub
|
|
54
|
-
ec stats --peer alice.aid.pub
|
|
9
|
+
const HELP = `ec stats — Token 用量与费用统计
|
|
10
|
+
|
|
11
|
+
Usage: ec stats [options]
|
|
12
|
+
|
|
13
|
+
时间范围:
|
|
14
|
+
(无参数) 今日概览
|
|
15
|
+
--today 同上
|
|
16
|
+
--hour 最近 24 小时,按小时分组
|
|
17
|
+
--week 本周
|
|
18
|
+
--month 本月
|
|
19
|
+
--from <date> --to <date> 任意区间(YYYY-MM-DD)
|
|
20
|
+
|
|
21
|
+
维度过滤(可组合):
|
|
22
|
+
--agent <aid> 指定 agent
|
|
23
|
+
--peer <X> 对端(裸 AID 自动前缀 aun#,或 channel#id 格式)
|
|
24
|
+
--model <model-id> 指定模型
|
|
25
|
+
--session <id> 指定会话
|
|
26
|
+
|
|
27
|
+
聚合粒度:
|
|
28
|
+
--by hour|day|week|month|model|peer|agent
|
|
29
|
+
|
|
30
|
+
快捷视图:
|
|
31
|
+
--session <id> 单个会话明细
|
|
32
|
+
--session <id> --last 会话最后一轮用量 + 累计(等价 status.completed)
|
|
33
|
+
--context <id> 会话 context breakdown 细目
|
|
34
|
+
--budget 预算状态
|
|
35
|
+
--top-peers [--limit N] 对端排行
|
|
36
|
+
--top-models [--limit N] 模型排行
|
|
37
|
+
--traffic 消息收发条数与字节数
|
|
38
|
+
--sql "<query>" 直接执行只读 SQL
|
|
39
|
+
--rebuild 全量重建日聚合表 usage_daily(运维兜底/排查)
|
|
40
|
+
--peers [--limit N] 私聊对端列表(带累计 token/calls/活跃日)
|
|
41
|
+
--groups [--limit N] 群聊列表(同上)
|
|
42
|
+
--summary 指定时间范围总消耗汇总(token/USD/CNY)
|
|
43
|
+
--peer-detail <id> 指定对端 AID 或 peer_key,按天返回消耗明细
|
|
44
|
+
--task-calls <taskId> 一个 task 的逐次大模型调用明细
|
|
45
|
+
--session-calls <id> 一个会话的逐次大模型调用明细
|
|
46
|
+
|
|
47
|
+
输出格式:
|
|
48
|
+
--format json JSON 输出
|
|
49
|
+
--help, -h 显示此帮助
|
|
50
|
+
|
|
51
|
+
示例:
|
|
52
|
+
ec stats
|
|
53
|
+
ec stats --month --agent bot.agentid.pub
|
|
54
|
+
ec stats --peer alice.aid.pub
|
|
55
55
|
ec stats --session abc123 --format json`;
|
|
56
56
|
const RESET = '\x1b[0m';
|
|
57
57
|
const BOLD = '\x1b[1m';
|
|
@@ -246,11 +246,11 @@ export async function handleStats(args) {
|
|
|
246
246
|
const batch = allEvents.slice(i, i + batchSize);
|
|
247
247
|
for (const event of batch) {
|
|
248
248
|
const prices = resolvePrices(home, event); // 不传 gatewayPricing,全走本地 JSONL
|
|
249
|
-
db.prepare(`
|
|
250
|
-
UPDATE usage_events
|
|
251
|
-
SET cost_official_usd = ?, cost_official_cny = ?,
|
|
252
|
-
cost_gateway_usd = ?, cost_gateway_cny = ?
|
|
253
|
-
WHERE id = ?
|
|
249
|
+
db.prepare(`
|
|
250
|
+
UPDATE usage_events
|
|
251
|
+
SET cost_official_usd = ?, cost_official_cny = ?,
|
|
252
|
+
cost_gateway_usd = ?, cost_gateway_cny = ?
|
|
253
|
+
WHERE id = ?
|
|
254
254
|
`).run(prices.official?.usd ?? null, prices.official?.cny ?? null, prices.gateway?.usd ?? null, prices.gateway?.cny ?? null, event.id);
|
|
255
255
|
updated++;
|
|
256
256
|
}
|
|
@@ -81,62 +81,62 @@ export async function cmdTrigger(args) {
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
function printHelp() {
|
|
84
|
-
console.log(`用法: ec trigger <subcommand>
|
|
85
|
-
|
|
86
|
-
命令:
|
|
87
|
-
list [--agent <aid>] [--all] [--json]
|
|
88
|
-
show [--agent <aid>] <triggerId> [--json]
|
|
89
|
-
history [--agent <aid>] [triggerId] [--limit <n>] [--json]
|
|
90
|
-
create --exec <script|trigger-session|target-session> --file <trigger.json|trigger-dir> [--enable] [--json]
|
|
91
|
-
OR
|
|
92
|
-
create [--agent <aid>] --exec <script|trigger-session|target-session> --cron <expr>|--event <pattern> (--prompt <text>|--prompt-file <path>) [--enable] [其他flag]
|
|
93
|
-
set ... (create 的兼容别名)
|
|
94
|
-
update [--agent <aid>] <triggerId> <参数...> [--if-revision <sha256:...>] [--json]
|
|
95
|
-
enable [--agent <aid>] <triggerId>
|
|
96
|
-
disable [--agent <aid>] <triggerId>
|
|
97
|
-
cancel [--agent <aid>] <triggerId> (disable 的兼容别名)
|
|
98
|
-
delete|remove|rm [--agent <aid>] <triggerId>
|
|
99
|
-
run [--agent <aid>] <triggerId> [--dry-run] [--json]
|
|
100
|
-
template list|show <name> [--json]
|
|
101
|
-
|
|
102
|
-
Create 参数模式支持:
|
|
103
|
-
--once | --delay <时长> | --at <ISO时间> | --cron <表达式> | --every <时长> | --event <事件模式>
|
|
104
|
-
--exec <script|trigger-session|target-session> (必填)
|
|
105
|
-
--prompt <文本> | --prompt-file <路径>
|
|
106
|
-
Shell 双引号内的双引号、反引号和变量形式的美元符号都需在前面加反斜杠;trigger 保存的是还原后的原文
|
|
107
|
-
--script-path <路径> --script-runtime <node|python|bash>
|
|
108
|
-
--script-args <JSON> --script-timeout <时长>
|
|
109
|
-
--feedback <target> (origin/silent 仅可通过 --file 导入)
|
|
110
|
-
--baseagent <name> (仅 --exec trigger-session)
|
|
111
|
-
--model <模型> --effort <low|medium|high|xhigh|max>
|
|
112
|
-
--max-runs <次数> --max-duration <时长: 30s|15m|2h|1d>
|
|
113
|
-
--permission <readonly|auto|request|bypass|fullaccess>(省略则继承当前身份配置;fullaccess 仅 daemon-owner 且 feature flag 开启时可用)
|
|
114
|
-
--tz <时区> (仅 cron)
|
|
115
|
-
--target-channel <channelKey> --target-channel-id <ID> (AUN 可简写为 aun)
|
|
116
|
-
--target-chat-type <private|group> (AUN 目标必填;channelId 同时作为群聊 ID)
|
|
117
|
-
--target-session <main|thread> [--target-thread-id <threadId>]
|
|
118
|
-
--trigger-thread <by-run|by-trigger> (兼容旧值 per-run)
|
|
119
|
-
--name <名称>
|
|
120
|
-
|
|
121
|
-
通用输出参数:
|
|
122
|
-
--json | --format json
|
|
123
|
-
|
|
124
|
-
Update 参数:
|
|
125
|
-
--once | --delay | --at | --cron | --every | --event [--tz]
|
|
126
|
-
--prompt <文本> | --prompt-file <路径> --script-file <路径> --name <名称>
|
|
127
|
-
--description <文本> (空字符串删除)
|
|
128
|
-
--model <模型> --effort <强度> --permission <权限模式|inherit>(inherit 清除覆盖)
|
|
129
|
-
--max-runs <次数> --max-duration <时长>
|
|
130
|
-
--concurrency <forbid|replace|allow> --missed-policy <skip|run-once|run-all>
|
|
131
|
-
--feedback <origin|target|silent>
|
|
132
|
-
--target-channel <channelKey> --target-channel-id <ID> (必须同时指定)
|
|
133
|
-
--target-chat-type <private|group> --target-session <main|thread> [--target-thread-id <threadId>]
|
|
134
|
-
--trigger-thread <by-run|by-trigger> --baseagent <name> (仅 trigger_session 之间)
|
|
135
|
-
--on-error <fail|retry> --noop-sentinel <文本>
|
|
136
|
-
--retry-attempts <次数> --retry-backoff <毫秒>
|
|
137
|
-
--script-runtime <node|python|bash> --script-args <JSON> --script-timeout <时长>
|
|
138
|
-
|
|
139
|
-
省略 --agent 时使用当前 agent AID;无会话上下文或跨身份操作时需要显式指定。
|
|
84
|
+
console.log(`用法: ec trigger <subcommand>
|
|
85
|
+
|
|
86
|
+
命令:
|
|
87
|
+
list [--agent <aid>] [--all] [--json]
|
|
88
|
+
show [--agent <aid>] <triggerId> [--json]
|
|
89
|
+
history [--agent <aid>] [triggerId] [--limit <n>] [--json]
|
|
90
|
+
create --exec <script|trigger-session|target-session> --file <trigger.json|trigger-dir> [--enable] [--json]
|
|
91
|
+
OR
|
|
92
|
+
create [--agent <aid>] --exec <script|trigger-session|target-session> --cron <expr>|--event <pattern> (--prompt <text>|--prompt-file <path>) [--enable] [其他flag]
|
|
93
|
+
set ... (create 的兼容别名)
|
|
94
|
+
update [--agent <aid>] <triggerId> <参数...> [--if-revision <sha256:...>] [--json]
|
|
95
|
+
enable [--agent <aid>] <triggerId>
|
|
96
|
+
disable [--agent <aid>] <triggerId>
|
|
97
|
+
cancel [--agent <aid>] <triggerId> (disable 的兼容别名)
|
|
98
|
+
delete|remove|rm [--agent <aid>] <triggerId>
|
|
99
|
+
run [--agent <aid>] <triggerId> [--dry-run] [--json]
|
|
100
|
+
template list|show <name> [--json]
|
|
101
|
+
|
|
102
|
+
Create 参数模式支持:
|
|
103
|
+
--once | --delay <时长> | --at <ISO时间> | --cron <表达式> | --every <时长> | --event <事件模式>
|
|
104
|
+
--exec <script|trigger-session|target-session> (必填)
|
|
105
|
+
--prompt <文本> | --prompt-file <路径>
|
|
106
|
+
Shell 双引号内的双引号、反引号和变量形式的美元符号都需在前面加反斜杠;trigger 保存的是还原后的原文
|
|
107
|
+
--script-path <路径> --script-runtime <node|python|bash>
|
|
108
|
+
--script-args <JSON> --script-timeout <时长>
|
|
109
|
+
--feedback <target> (origin/silent 仅可通过 --file 导入)
|
|
110
|
+
--baseagent <name> (仅 --exec trigger-session)
|
|
111
|
+
--model <模型> --effort <low|medium|high|xhigh|max>
|
|
112
|
+
--max-runs <次数> --max-duration <时长: 30s|15m|2h|1d>
|
|
113
|
+
--permission <readonly|auto|request|bypass|fullaccess>(省略则继承当前身份配置;fullaccess 仅 daemon-owner 且 feature flag 开启时可用)
|
|
114
|
+
--tz <时区> (仅 cron)
|
|
115
|
+
--target-channel <channelKey> --target-channel-id <ID> (AUN 可简写为 aun)
|
|
116
|
+
--target-chat-type <private|group> (AUN 目标必填;channelId 同时作为群聊 ID)
|
|
117
|
+
--target-session <main|thread> [--target-thread-id <threadId>]
|
|
118
|
+
--trigger-thread <by-run|by-trigger> (兼容旧值 per-run)
|
|
119
|
+
--name <名称>
|
|
120
|
+
|
|
121
|
+
通用输出参数:
|
|
122
|
+
--json | --format json
|
|
123
|
+
|
|
124
|
+
Update 参数:
|
|
125
|
+
--once | --delay | --at | --cron | --every | --event [--tz]
|
|
126
|
+
--prompt <文本> | --prompt-file <路径> --script-file <路径> --name <名称>
|
|
127
|
+
--description <文本> (空字符串删除)
|
|
128
|
+
--model <模型> --effort <强度> --permission <权限模式|inherit>(inherit 清除覆盖)
|
|
129
|
+
--max-runs <次数> --max-duration <时长>
|
|
130
|
+
--concurrency <forbid|replace|allow> --missed-policy <skip|run-once|run-all>
|
|
131
|
+
--feedback <origin|target|silent>
|
|
132
|
+
--target-channel <channelKey> --target-channel-id <ID> (必须同时指定)
|
|
133
|
+
--target-chat-type <private|group> --target-session <main|thread> [--target-thread-id <threadId>]
|
|
134
|
+
--trigger-thread <by-run|by-trigger> --baseagent <name> (仅 trigger_session 之间)
|
|
135
|
+
--on-error <fail|retry> --noop-sentinel <文本>
|
|
136
|
+
--retry-attempts <次数> --retry-backoff <毫秒>
|
|
137
|
+
--script-runtime <node|python|bash> --script-args <JSON> --script-timeout <时长>
|
|
138
|
+
|
|
139
|
+
省略 --agent 时使用当前 agent AID;无会话上下文或跨身份操作时需要显式指定。
|
|
140
140
|
任务会话中的跨身份操作仅允许目标 Agent 上具备 owner/admin 权限的调用者执行 list/show/history;创建、修改、启停、删除和运行仍只允许当前 Agent。`);
|
|
141
141
|
}
|
|
142
142
|
async function listTriggers(args, json) {
|
|
@@ -34,6 +34,7 @@ export function getManagementCommandPermissions(role) {
|
|
|
34
34
|
'contact.read': { allow: true, scopes: ['agent'] },
|
|
35
35
|
'contact.add': { allow: true, scopes: ['relation'], constraints: { ownPeerOnly: true, privateOnly: true } },
|
|
36
36
|
'contact.block': { allow: true, scopes: ['agent'], constraints: { requireAgentAdmin: true } },
|
|
37
|
+
'contact.review': { allow: true, scopes: ['agent'], constraints: { requireAgentAdmin: true } },
|
|
37
38
|
'connect.write': { allow: true, scopes: ['agent'], constraints: { requireAgentAdmin: true } },
|
|
38
39
|
'connect.access.write': { allow: true, scopes: ['agent'], constraints: { requireAgentOwner: true } },
|
|
39
40
|
'role.assign': { allow: true, scopes: ['agent'] },
|