evolcore 0.0.2 → 0.0.3

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 (124) hide show
  1. package/CHANGELOG.md +44 -793
  2. package/dist/agents/claude-runner.js +197 -17
  3. package/dist/agents/codex-runner.js +46 -3
  4. package/dist/aun/outbox.js +8 -0
  5. package/dist/channels/aun.js +21 -4
  6. package/dist/channels/contact-bind-code.js +134 -0
  7. package/dist/channels/dingtalk.js +979 -149
  8. package/dist/channels/feishu.js +130 -54
  9. package/dist/channels/wecom-card.js +101 -0
  10. package/dist/channels/wecom-onboarding.js +82 -0
  11. package/dist/channels/wecom-state.js +191 -0
  12. package/dist/channels/wecom.js +755 -163
  13. package/dist/cli/agent-command.js +2 -1
  14. package/dist/cli/aun-commands.js +88 -33
  15. package/dist/cli/bench.js +2 -2
  16. package/dist/cli/contact.js +71 -0
  17. package/dist/cli/ctl-command.js +2 -2
  18. package/dist/cli/daemon-commands.js +77 -214
  19. package/dist/cli/handoff-command.js +2 -2
  20. package/dist/cli/help.js +9 -5
  21. package/dist/cli/index.js +132 -116
  22. package/dist/cli/init-channel.js +92 -97
  23. package/dist/cli/init.js +63 -26
  24. package/dist/cli/model.js +2 -1
  25. package/dist/cli/net-check.js +2 -2
  26. package/dist/cli/queue-command.js +30 -6
  27. package/dist/cli/raw-key-input.js +25 -0
  28. package/dist/cli/response.js +5 -6
  29. package/dist/cli/restart-monitor.js +25 -1
  30. package/dist/cli/stats.js +6 -4
  31. package/dist/cli/trigger-command.js +55 -15
  32. package/dist/cli/version.js +6 -1
  33. package/dist/config/builtin-role-templates.js +22 -10
  34. package/dist/config/builtin-roles.js +7 -1
  35. package/dist/config/config-manager.js +221 -17
  36. package/dist/config/contact-alias.js +68 -0
  37. package/dist/config/contact-book-store.js +454 -0
  38. package/dist/config/contact-book-v2-startup.js +35 -0
  39. package/dist/config/contact-book.js +156 -303
  40. package/dist/config/contact-operation-service.js +110 -0
  41. package/dist/config/peer-role-resolver.js +133 -54
  42. package/dist/config/role-ranks.js +18 -0
  43. package/dist/config/role-service.js +16 -19
  44. package/dist/config/role-store.js +16 -5
  45. package/dist/config/roles.js +10 -1
  46. package/dist/config-store.js +0 -2
  47. package/dist/core/auth/authorization-audit.js +10 -1
  48. package/dist/core/auth/operation-authorizer.js +2 -0
  49. package/dist/core/auth/operation-catalog.js +56 -0
  50. package/dist/core/command/command-handler.js +105 -10
  51. package/dist/core/command/connect-menu.js +374 -0
  52. package/dist/core/command/menu-handler.js +114 -16
  53. package/dist/core/command/role-menu.js +128 -29
  54. package/dist/core/command/slash-handler.js +28 -18
  55. package/dist/core/daemon-file-cache.js +12 -6
  56. package/dist/core/event-catalog.js +70 -0
  57. package/dist/core/evolagent-registry.js +0 -1
  58. package/dist/core/evolagent.js +20 -9
  59. package/dist/core/message/im-renderer.js +2 -0
  60. package/dist/core/message/message-bridge.js +79 -8
  61. package/dist/core/message/message-queue.js +10 -0
  62. package/dist/core/message/message-utils.js +8 -2
  63. package/dist/core/message/response-engine.js +269 -25
  64. package/dist/core/message/send-receipt.js +24 -0
  65. package/dist/core/message/stream-debouncer.js +11 -2
  66. package/dist/core/permission/tool-policy.js +47 -15
  67. package/dist/core/protected-paths.js +2 -0
  68. package/dist/core/session/session-fs-store.js +44 -3
  69. package/dist/core/session/session-manager.js +61 -5
  70. package/dist/index.js +62 -6
  71. package/dist/ipc.js +34 -5
  72. package/dist/stats/billing.js +20 -8
  73. package/dist/trigger/manager.js +3 -0
  74. package/dist/trigger/parser.js +77 -2
  75. package/dist/trigger/patch.js +8 -1
  76. package/dist/trigger/scheduler.js +3 -1
  77. package/dist/trigger/validation.js +13 -0
  78. package/dist/utils/aid-bind.js +43 -29
  79. package/dist/utils/instance-registry.js +14 -7
  80. package/dist/utils/log-writer.js +46 -0
  81. package/dist/utils/media-cache.js +4 -1
  82. package/dist/utils/model-prices.jsonl +6 -3
  83. package/dist/utils/restart-safety.js +31 -0
  84. package/dist/utils/system-memory.js +62 -0
  85. package/kits/docs/INDEX.md +2 -1
  86. package/kits/docs/evolcore/INDEX.md +5 -3
  87. package/kits/docs/evolcore/agent.md +9 -1
  88. package/kits/docs/evolcore/aid.md +5 -2
  89. package/kits/docs/evolcore/contact.md +57 -0
  90. package/kits/docs/evolcore/fs.md +9 -0
  91. package/kits/docs/evolcore/group.md +12 -3
  92. package/kits/docs/evolcore/model.md +4 -1
  93. package/kits/docs/evolcore/msg.md +9 -3
  94. package/kits/docs/evolcore/response.md +16 -21
  95. package/kits/docs/evolcore/rpc.md +2 -0
  96. package/kits/docs/evolcore/stats.md +15 -2
  97. package/kits/docs/evolcore/storage.md +1 -0
  98. package/kits/docs/evolcore/trigger.md +17 -2
  99. package/kits/eck_manifest.json +12 -0
  100. package/kits/migrations/migrate-contact-book-v2.mjs +747 -0
  101. package/kits/schemas/_meta.json +7 -4
  102. package/kits/schemas/agent-config.schema.6.json +322 -0
  103. package/kits/schemas/contact-book.schema.2.json +43 -0
  104. package/kits/schemas/relation-config.schema.5.json +47 -0
  105. package/kits/schemas/role-config.schema.1.json +1 -0
  106. package/kits/schemas/role-registry.schema.1.json +2 -2
  107. package/kits/templates/roles/admin.json +1 -0
  108. package/kits/templates/roles/member.json +1 -0
  109. package/kits/templates/roles/owner.json +1 -0
  110. package/kits/templates/roles/visitor.json +1 -0
  111. package/kits/templates/system-fragments/commands.md +3 -1
  112. package/package.json +4 -4
  113. package/assets/brand/evolcore/README.md +0 -19
  114. package/assets/brand/evolcore/evolcore-app-icon.png +0 -0
  115. package/assets/brand/evolcore/evolcore-app-icon.svg +0 -13
  116. package/assets/brand/evolcore/evolcore-brand-board.png +0 -0
  117. package/assets/brand/evolcore/evolcore-brand-board.svg +0 -126
  118. package/assets/brand/evolcore/evolcore-logo-kit.zip +0 -0
  119. package/assets/brand/evolcore/evolcore-logo-reverse.png +0 -0
  120. package/assets/brand/evolcore/evolcore-logo-reverse.svg +0 -14
  121. package/assets/brand/evolcore/evolcore-logo.png +0 -0
  122. package/assets/brand/evolcore/evolcore-logo.svg +0 -14
  123. package/assets/brand/evolcore/evolcore-mark.png +0 -0
  124. package/assets/brand/evolcore/evolcore-mark.svg +0 -10
@@ -25,7 +25,8 @@ function formatBytes(bytes) {
25
25
  export async function cmdAgent(args) {
26
26
  const sub = args[0];
27
27
  const formatJson = getArgValue(args, '--format') === 'json';
28
- if (!sub || isHelpFlag(sub)) {
28
+ const commands = new Set(['list', 'show', 'new', 'enable', 'disable', 'get', 'set', 'rename', 'ready', 'reload', 'delete']);
29
+ if (!sub || isHelpFlag(sub) || (wantsHelp(args) && !commands.has(sub))) {
29
30
  console.log(`用法: ec agent <command>
30
31
 
31
32
  Commands:
@@ -31,6 +31,7 @@ Commands:
31
31
 
32
32
  Options:
33
33
  --format json 输出 JSON 格式
34
+ --aun-path <path> 指定 AUN keystore 根(默认 EVOLCORE_HOME,可由 AUN_HOME 设置)
34
35
  --help, -h 各子命令均支持,查看详细用法
35
36
 
36
37
  示例:
@@ -169,12 +170,14 @@ Options:
169
170
  }
170
171
  if (sub === 'new') {
171
172
  if (wantsHelp(args)) {
172
- console.log(`用法: ec aid new <完整AID> [--force]
173
+ console.log(`用法: ec aid new <完整AID> [--force] [--format json]
173
174
 
174
175
  创建新 AID 身份:生成 ECDSA 密钥对、向 Issuer 申请证书、构建并上传初始 agent.md。
175
176
 
176
177
  选项:
177
178
  --force 强制重新注册,覆盖已存在的身份(即使签名验证失败)
179
+ --format json 输出 JSON
180
+ --aun-path <path> 指定 AUN keystore 根
178
181
 
179
182
  例: ec aid new reviewer.agentid.pub
180
183
  ec aid new reviewer.agentid.pub --force`);
@@ -183,23 +186,35 @@ Options:
183
186
  const aid = args[1];
184
187
  const force = args.includes('--force');
185
188
  if (!aid) {
186
- console.error('用法: ec aid new <完整AID> [--force]\n例: ec aid new reviewer.agentid.pub');
189
+ if (formatJson)
190
+ console.log(JSON.stringify({ ok: false, code: 'MISSING_AID', error: 'missing AID' }));
191
+ else
192
+ console.error('用法: ec aid new <完整AID> [--force]\n例: ec aid new reviewer.agentid.pub');
187
193
  process.exit(1);
188
194
  }
189
195
  if (!isValidAid(aid)) {
190
- console.error(`❌ 无效 AID 格式: ${aid}`);
196
+ if (formatJson)
197
+ console.log(JSON.stringify({ ok: false, code: 'INVALID_AID', error: `invalid AID: ${aid}` }));
198
+ else
199
+ console.error(`❌ 无效 AID 格式: ${aid}`);
191
200
  process.exit(1);
192
201
  }
193
202
  try {
194
203
  const result = await aidCreate(aid, { aunPath, force });
204
+ let agentmdUploaded = result.alreadyExisted;
205
+ let agentmdError;
195
206
  if (!result.alreadyExisted) {
196
207
  const content = buildInitialAgentMd({ aid });
197
208
  try {
198
209
  await agentmdPut(content, { aid, aunPath });
199
- console.log('✓ agent.md 已发布');
210
+ agentmdUploaded = true;
211
+ if (!formatJson)
212
+ console.log('✓ agent.md 已发布');
200
213
  }
201
214
  catch (e) {
202
- console.warn(`⚠ agent.md 发布失败(首次连接将自动重试): ${String(e.message || e).slice(0, 100)}`);
215
+ agentmdError = String(e.message || e).slice(0, 100);
216
+ if (!formatJson)
217
+ console.warn(`⚠ agent.md 发布失败(首次连接将自动重试): ${agentmdError}`);
203
218
  }
204
219
  }
205
220
  try {
@@ -211,17 +226,34 @@ Options:
211
226
  }
212
227
  catch { }
213
228
  const verb = result.alreadyExisted ? '已存在且有效' : (force ? '已重新创建' : '已创建');
214
- console.log(`✓ ${aid} ${verb}`);
215
- console.log(' 如需上线 AUN 通道,运行 ec agent new ' + aid);
229
+ if (formatJson) {
230
+ console.log(JSON.stringify({
231
+ ok: true,
232
+ aid,
233
+ alreadyExisted: result.alreadyExisted,
234
+ agentmdUploaded,
235
+ ...(agentmdError ? { agentmdError } : {}),
236
+ }, null, 2));
237
+ }
238
+ else {
239
+ console.log(`✓ ${aid} ${verb}`);
240
+ console.log(' 如需上线 AUN 通道,运行 ec agent new ' + aid);
241
+ }
216
242
  }
217
243
  catch (e) {
218
244
  if (e.code === 'AID_INVALID') {
219
- console.error(`❌ ${e.message}`);
245
+ if (formatJson)
246
+ console.log(JSON.stringify({ ok: false, code: 'AID_INVALID', error: e.message }));
247
+ else
248
+ console.error(`❌ ${e.message}`);
220
249
  process.exit(1);
221
250
  }
222
251
  if (e.code === -32052 || e.constructor?.name === 'IdentityConflictError') {
223
- console.error(`❌ AID ${aid} 已在服务端注册,但本地密钥无法匹配。\n` +
224
- `该 AID 可能由其他设备创建,无法在本地恢复。请选择其他名称。`);
252
+ const error = `AID ${aid} 已在服务端注册,但本地密钥无法匹配;该 AID 可能由其他设备创建,无法在本地恢复`;
253
+ if (formatJson)
254
+ console.log(JSON.stringify({ ok: false, code: 'IDENTITY_CONFLICT', error }));
255
+ else
256
+ console.error(`❌ ${error}。请选择其他名称。`);
225
257
  process.exit(1);
226
258
  }
227
259
  throw e;
@@ -249,6 +281,7 @@ Options:
249
281
  --yes 跳过 dry-run,立即执行
250
282
  --skip-pki --unrecoverable 时跳过 PKI 探测,仅依据本地 sign+verify 失败判断(危险,可能误删可恢复 AID)
251
283
  --format json 输出 JSON 格式
284
+ --aun-path <path> 指定 AUN keystore 根
252
285
 
253
286
  示例:
254
287
  ec aid delete old.agentid.pub
@@ -279,10 +312,16 @@ Options:
279
312
  }
280
313
  const deleted = aidDelete(aid, { aunPath });
281
314
  if (deleted) {
282
- console.log(`✓ ${aid} 已删除`);
315
+ if (formatJson)
316
+ console.log(JSON.stringify({ ok: true, aid, deleted: true }, null, 2));
317
+ else
318
+ console.log(`✓ ${aid} 已删除`);
283
319
  }
284
320
  else {
285
- console.error(`❌ 本地不存在: ${aid}`);
321
+ if (formatJson)
322
+ console.log(JSON.stringify({ ok: false, aid, deleted: false, error: 'not found' }, null, 2));
323
+ else
324
+ console.error(`❌ 本地不存在: ${aid}`);
286
325
  process.exit(1);
287
326
  }
288
327
  return;
@@ -505,7 +544,7 @@ Options:
505
544
  }
506
545
  // ==================== RPC ====================
507
546
  export async function cmdRpc(args) {
508
- if (args.length === 0 || isHelpFlag(args[0])) {
547
+ if (args.length === 0 || wantsHelp(args)) {
509
548
  console.log(`用法: ec rpc --as <aid> --params <params>
510
549
 
511
550
  通用 AUN RPC 调用。
@@ -520,6 +559,7 @@ export async function cmdRpc(args) {
520
559
  Options:
521
560
  --app <name> 指定应用 slot(独立消费通道)。仅对 message.pull / group.pull
522
561
  等消费类方法有意义——隔离 seq 游标与消息过滤;默认与 daemon 共享通道。
562
+ --aun-path <path> 指定 AUN keystore 根
523
563
 
524
564
  示例:
525
565
  ec rpc --as alice.agentid.pub --params '{"method":"message.send","params":{"to":"bob.agentid.pub","payload":{"type":"text","text":"hello"}}}'
@@ -589,7 +629,7 @@ export async function cmdStorage(args) {
589
629
  const sub = args[0];
590
630
  const aunPath = resolveAunPath(args);
591
631
  const formatJson = getArgValue(args, '--format') === 'json';
592
- if (!sub || isHelpFlag(sub)) {
632
+ if (!sub || wantsHelp(args)) {
593
633
  console.log(`用法: ec storage <command> <aid> [options]
594
634
 
595
635
  Commands:
@@ -601,6 +641,11 @@ Commands:
601
641
 
602
642
  <url> 格式: [https://]<owner-aid>/<path>
603
643
 
644
+ Options:
645
+ --public 上传后公开可读(仅 upload)
646
+ --format json 输出 JSON
647
+ --aun-path <path> 指定 AUN keystore 根
648
+
604
649
  示例:
605
650
  ec storage upload myaid.agentid.pub ./doc.txt notes/doc.txt
606
651
  ec storage upload myaid.agentid.pub ./pic.png images/pic.png --public
@@ -741,9 +786,8 @@ export async function cmdMsg(args) {
741
786
  const sub = args[0];
742
787
  const aunPath = resolveAunPath(args);
743
788
  const formatJson = getArgValue(args, '--format') === 'json';
744
- const appIdx = args.indexOf('--app');
745
- const appSlot = appIdx >= 0 ? args[appIdx + 1] : undefined;
746
- if (!sub || isHelpFlag(sub)) {
789
+ const appSlot = getArgValue(args, '--app');
790
+ if (!sub || isHelpFlag(sub) || (wantsHelp(args) && sub !== 'history')) {
747
791
  console.log(`用法: ec msg <command> <from-aid> [args...] [options]
748
792
 
749
793
  Commands:
@@ -761,6 +805,7 @@ Commands:
761
805
  Options:
762
806
  --text-from-file <path> 从文件读取文本(UTF-8),用于超长消息或避免 Shell 转义
763
807
  --app <name> 指定应用 slot(独立消费通道,不影响 daemon)
808
+ --aun-path <path> 指定 AUN keystore 根
764
809
  --format json 输出 JSON 格式
765
810
  --encrypt 启用端到端加密(密文发送)
766
811
  --no-encrypt 强制明文发送(优先于 --encrypt)
@@ -769,10 +814,13 @@ Options:
769
814
  --before <time> 只返回该时间之前的历史
770
815
  --after <time> 只返回该时间之后的历史
771
816
  --direction <value> 历史方向:in|out|all
772
- --return <required|none> 跨会话回流策略(一期仅支持 required;跨会话默认 required
817
+ --return <required|none> 跨会话回流策略(跨会话默认 required)
773
818
  --content-type <mime> 显式覆盖 MIME(仅 --file 模式)
819
+ --as <type> 附件类型:image|video|voice|file(仅 --file 模式)
774
820
  --text <说明> 附件说明文字(仅 --file 模式)
775
821
  --transcript <text> 语音转写(仅 --as voice)
822
+ --title <text> 链接标题(仅 --link 模式)
823
+ --description <text> 链接描述(仅 --link 模式)
776
824
  -- end-of-options:其后所有参数按正文处理
777
825
  (用于发送恰好等于某 flag 的文本,如 send a b -- --encrypt)
778
826
 
@@ -1180,9 +1228,9 @@ export async function cmdGroup(args) {
1180
1228
  const sub = args[0];
1181
1229
  const aunPath = resolveAunPath(args);
1182
1230
  const formatJson = getArgValue(args, '--format') === 'json';
1183
- const appIdx = args.indexOf('--app');
1184
- const appSlot = appIdx >= 0 ? args[appIdx + 1] : undefined;
1185
- if (!sub || isHelpFlag(sub) || (args.length === 2 && isHelpFlag(args[1]))) {
1231
+ const appSlot = getArgValue(args, '--app');
1232
+ const rulesActionHelp = sub === 'rules' && isHelpFlag(args[3]);
1233
+ if (!sub || isHelpFlag(sub) || (wantsHelp(args) && !rulesActionHelp)) {
1186
1234
  console.log(`用法: ec group <command> <from-aid> [args...] [options]
1187
1235
 
1188
1236
  消息:
@@ -1193,7 +1241,8 @@ export async function cmdGroup(args) {
1193
1241
  ack <from> <group-id> <seq> [--app <name>] 确认已读
1194
1242
 
1195
1243
  群管理:
1196
- create <from> <name> [--visibility public|private] [--description D] [--join-mode M] 创建群
1244
+ create <from> <name> [--visibility public|private] [--description D]
1245
+ [--join-mode open|approval|invite_only|closed] 创建群
1197
1246
  list <from> [--size N] 列出我加入的群
1198
1247
  info <from> <group-id> 查看群详情
1199
1248
  update <from> <group-id> [--name N] [--description D] 修改群信息
@@ -1219,6 +1268,7 @@ export async function cmdGroup(args) {
1219
1268
 
1220
1269
  Options:
1221
1270
  --app <name> 指定应用 slot(独立消费通道,不影响 daemon)
1271
+ --aun-path <path> 指定 AUN keystore 根
1222
1272
  --format json 输出 JSON 格式
1223
1273
  --encrypt 启用端到端加密(仅 send)
1224
1274
  --no-encrypt 强制明文发送(优先于 --encrypt;仅 send)
@@ -1226,6 +1276,11 @@ Options:
1226
1276
  --return <required|none> 跨会话回流策略(仅 send)
1227
1277
  --mention <aid> 发送时 @ 某个成员(可多次,或用逗号分隔多个 aid)
1228
1278
  --mention-all 发送时 @ 所有人
1279
+ --content-type <mime> 显式覆盖 MIME(仅 --file 模式)
1280
+ --as <type> 附件类型:image|video|voice|file(仅 --file 模式)
1281
+ --text <说明> 附件说明文字(仅 --file 模式)
1282
+ --transcript <text> 语音转写(仅 --as voice)
1283
+ --group-id <aid> 指定自定义群 AID(仅 create)
1229
1284
  -- end-of-options:其后所有参数按正文处理
1230
1285
  (用于发送恰好等于某 flag 的文本,如 send a g -- --encrypt)
1231
1286
 
@@ -1426,10 +1481,8 @@ Options:
1426
1481
  if (!appSlot) {
1427
1482
  console.warn('⚠ 警告: 未传 --app,当前与 daemon 共享 evolcore 消费通道。pull 会看到/影响 daemon 的消息消费;如需独立消费请用 --app <name>');
1428
1483
  }
1429
- const afterSeqStr = getArgValue(args, '--after-seq');
1430
- const limitStr = getArgValue(args, '--limit');
1431
- const afterSeq = afterSeqStr !== undefined ? Number(afterSeqStr) : undefined;
1432
- const limit = limitStr !== undefined ? Number(limitStr) : undefined;
1484
+ const afterSeq = parseNumberFlag('--after-seq', '--after-seq');
1485
+ const limit = parseNumberFlag('--limit', '--limit');
1433
1486
  const result = await groupPull({ from, groupId, afterSeq, limit, ...commonOpts });
1434
1487
  outputResult(result, () => {
1435
1488
  const r = result;
@@ -1475,12 +1528,17 @@ Options:
1475
1528
  console.error(`❌ --visibility 必须是 public 或 private`);
1476
1529
  process.exit(1);
1477
1530
  }
1531
+ const joinMode = getArgValue(args, '--join-mode');
1532
+ if (joinMode && !['open', 'approval', 'invite_only', 'closed'].includes(joinMode)) {
1533
+ console.error('❌ --join-mode 必须是 open|approval|invite_only|closed');
1534
+ process.exit(1);
1535
+ }
1478
1536
  const result = await groupCreate({
1479
1537
  from,
1480
1538
  name,
1481
1539
  visibility,
1482
1540
  description: getArgValue(args, '--description'),
1483
- joinMode: getArgValue(args, '--join-mode'),
1541
+ joinMode: joinMode,
1484
1542
  groupId: getArgValue(args, '--group-id'),
1485
1543
  ...commonOpts,
1486
1544
  });
@@ -1493,8 +1551,7 @@ Options:
1493
1551
  return;
1494
1552
  }
1495
1553
  if (sub === 'list') {
1496
- const sizeStr = getArgValue(args, '--size');
1497
- const size = sizeStr !== undefined ? Number(sizeStr) : undefined;
1554
+ const size = parseNumberFlag('--size', '--size');
1498
1555
  const result = await groupList({ from, size, ...commonOpts });
1499
1556
  outputResult(result, () => {
1500
1557
  const r = result;
@@ -1755,12 +1812,10 @@ Options:
1755
1812
  }
1756
1813
  if (sub === 'members') {
1757
1814
  const groupId = requireGroupId();
1758
- const pageStr = getArgValue(args, '--page');
1759
- const sizeStr = getArgValue(args, '--size');
1760
1815
  const result = await groupMembers({
1761
1816
  from, groupId,
1762
- page: pageStr !== undefined ? Number(pageStr) : undefined,
1763
- size: sizeStr !== undefined ? Number(sizeStr) : undefined,
1817
+ page: parseNumberFlag('--page', '--page'),
1818
+ size: parseNumberFlag('--size', '--size'),
1764
1819
  ...commonOpts,
1765
1820
  });
1766
1821
  outputResult(result, () => {
package/dist/cli/bench.js CHANGED
@@ -9,7 +9,7 @@ import { resolveControlIssuer } from '../aun/aid/control-aid.js';
9
9
  import { msgSend, msgPull } from '../aun/msg/index.js';
10
10
  import { getPackageRoot, aunPath as defaultAunPath } from '../paths.js';
11
11
  import { getAidStore, loadClient, SLOT } from '../aun/aid/store.js';
12
- import { isHelpFlag, getArgValue } from './help.js';
12
+ import { isHelpFlag, wantsHelp, getArgValue } from './help.js';
13
13
  const execFileAsync = promisify(execFile);
14
14
  // ==================== ANSI ====================
15
15
  const GREEN = '\x1b[32m';
@@ -370,7 +370,7 @@ async function cliAuth(aid, slotId) {
370
370
  }
371
371
  // ==================== Main Command ====================
372
372
  export async function cmdBench(args) {
373
- if (isHelpFlag(args[0])) {
373
+ if (isHelpFlag(args[0]) || wantsHelp(args)) {
374
374
  console.log(`用法: ec bench [options]
375
375
 
376
376
  AUN 消息系统性能基准测试。使用多个本地 AID 并发互发消息,
@@ -0,0 +1,71 @@
1
+ import { resolvePaths } from '../paths.js';
2
+ import { executeResolvedContactCommand, resolveContactCommand, } from '../config/contact-operation-service.js';
3
+ import { ipcQuery } from '../ipc.js';
4
+ import { AGENT_DELEGATION_TOKEN_ENV } from '../core/auth/agent-delegation.js';
5
+ import { getArgValue, isHelpFlag, wantsHelp } from './help.js';
6
+ export async function cmdContact(args) {
7
+ if (args.length === 0 || isHelpFlag(args[0]) || wantsHelp(args)) {
8
+ printHelp();
9
+ return;
10
+ }
11
+ const json = getArgValue(args, '--format') === 'json';
12
+ if (process.env.EVOLCORE_SESSION_ID) {
13
+ const result = await runManaged(args, json);
14
+ output(result, json);
15
+ return;
16
+ }
17
+ const resolved = resolveContactCommand(args);
18
+ if (!resolved.ok)
19
+ fail(resolved.reason, resolved.code);
20
+ const result = await executeResolvedContactCommand(resolved.command);
21
+ if (!result.ok)
22
+ fail(result.error, result.code, result.data);
23
+ output(result, json);
24
+ }
25
+ function output(value, json) {
26
+ if (json)
27
+ console.log(JSON.stringify(value));
28
+ else
29
+ console.log(JSON.stringify(value, null, 2));
30
+ }
31
+ async function runManaged(args, json) {
32
+ const sessionId = process.env.EVOLCORE_SESSION_ID;
33
+ const delegationToken = process.env[AGENT_DELEGATION_TOKEN_ENV];
34
+ if (!delegationToken)
35
+ fail(`${AGENT_DELEGATION_TOKEN_ENV} is not set for the active task`, 'DELEGATION_REQUIRED');
36
+ let response = null;
37
+ try {
38
+ response = await ipcQuery(resolvePaths().socket, {
39
+ type: 'contact.op',
40
+ argv: ['contact', ...args],
41
+ sessionId,
42
+ delegationToken,
43
+ }, 10_000);
44
+ }
45
+ catch { }
46
+ if (!response)
47
+ fail('Unable to connect to the evolcore daemon', 'DAEMON_UNAVAILABLE');
48
+ if (!response.ok || !response.result) {
49
+ fail(response.error || 'contact operation failed', response.code || 'CONTACT_AUTH_FAILED', response.data);
50
+ }
51
+ return response.result;
52
+ }
53
+ function fail(message, code = 'INVALID_ARGUMENT', data) {
54
+ const error = new Error(message);
55
+ error.code = code;
56
+ if (data !== undefined)
57
+ error.data = data;
58
+ throw error;
59
+ }
60
+ function printHelp() {
61
+ console.log(`Usage:
62
+ ec contact block <primaryId> --self <agent-aid>
63
+ ec contact unblock <primaryId> --self <agent-aid>
64
+ ec contact list --blocked --self <agent-aid>
65
+
66
+ Options:
67
+ --self <agent-aid> 必填,本端 agent AID
68
+ --blocked list 必填,仅列出已拉黑联系人
69
+ --format json 输出 JSON
70
+ --help, -h 显示帮助`);
71
+ }
@@ -1,6 +1,6 @@
1
1
  import { resolvePaths } from '../paths.js';
2
2
  import { ipcQuery } from '../ipc.js';
3
- import { isHelpFlag } from './help.js';
3
+ import { isHelpFlag, wantsHelp } from './help.js';
4
4
  import { AGENT_DELEGATION_TOKEN_ENV } from '../core/auth/agent-delegation.js';
5
5
  // ==================== Ctl ====================
6
6
  const CTL_HELP = `用法: ec ctl <command> [args...]
@@ -30,7 +30,7 @@ export async function cmdCtl(args) {
30
30
  process.exit(1);
31
31
  }
32
32
  // help 不需要连接服务。
33
- if (isHelpFlag(args[0])) {
33
+ if (isHelpFlag(args[0]) || wantsHelp(args)) {
34
34
  console.log(CTL_HELP);
35
35
  return;
36
36
  }