evolcore 0.0.25 → 0.0.27
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 +632 -565
- package/LICENSE +21 -21
- package/README.md +455 -455
- package/bin/codex-managed-acl.ps1 +203 -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-availability.js +68 -0
- package/dist/agents/baseagent.js +96 -46
- package/dist/agents/claude-runner.js +172 -33
- package/dist/agents/codex/app-server-client.js +76 -31
- package/dist/agents/codex/catalog.js +1 -1
- package/dist/agents/codex/diagnostics.js +34 -1
- package/dist/agents/codex-runner.js +434 -446
- package/dist/agents/ecagent-runner.js +174 -34
- package/dist/agents/gemini-runner.js +8 -7
- package/dist/agents/runner-types.js +75 -19
- package/dist/aun/aid/agentmd.js +151 -36
- package/dist/aun/aid/client.js +1 -1
- package/dist/aun/aid/control-aid.js +180 -1
- package/dist/aun/aid/identity.js +4 -4
- package/dist/aun/aid/index.js +1 -1
- package/dist/aun/aid/store.js +17 -13
- package/dist/aun/group/history.js +303 -0
- package/dist/aun/group/identity.js +43 -0
- package/dist/aun/group/index.js +5 -0
- package/dist/aun/{msg/group.js → group/operations.js} +162 -39
- package/dist/aun/{menu-client.js → menu/client.js} +85 -6
- package/dist/aun/menu/index.js +2 -0
- package/dist/aun/menu/transport.js +49 -0
- package/dist/aun/msg/index.js +2 -1
- package/dist/aun/msg/managed-operation.js +85 -19
- package/dist/aun/msg/mention-schema.js +51 -0
- package/dist/aun/msg/p2p.js +19 -9
- package/dist/aun/msg/upload.js +43 -80
- package/dist/aun/outbox.js +29 -7
- package/dist/aun/rpc/client.js +1 -0
- package/dist/aun/storage/client.js +39 -50
- package/dist/channels/aun.js +842 -318
- package/dist/channels/daemon.js +10 -6
- package/dist/cli/agent-command.js +212 -89
- package/dist/cli/agent-create.js +626 -11
- package/dist/cli/agent.js +125 -13
- package/dist/cli/aun-commands.js +487 -337
- package/dist/cli/bench.js +20 -20
- package/dist/cli/config.js +55 -33
- package/dist/cli/contact.js +72 -15
- package/dist/cli/ctl-command.js +24 -24
- package/dist/cli/daemon-commands.js +140 -63
- package/dist/cli/diag.js +31 -0
- package/dist/cli/fs-command.js +70 -70
- package/dist/cli/handoff-command.js +46 -14
- package/dist/cli/index.js +91 -79
- package/dist/cli/init.js +34 -1
- package/dist/cli/link-rules.js +21 -21
- package/dist/cli/managed-command-guard.js +5 -1
- package/dist/cli/menu-client.js +51 -32
- package/dist/cli/model.js +3 -3
- package/dist/cli/net-check.js +22 -22
- package/dist/cli/queue-command.js +31 -31
- package/dist/cli/response.js +32 -32
- package/dist/cli/restart-monitor.js +103 -42
- package/dist/cli/stats.js +51 -51
- package/dist/cli/task-command.js +59 -0
- package/dist/cli/task-context.js +97 -49
- package/dist/cli/trigger-command.js +74 -64
- package/dist/config/builtin-roles.js +11 -0
- package/dist/config/config-field-policy.js +11 -0
- package/dist/config/config-manager.js +32 -4
- package/dist/config/config-operation-service.js +160 -0
- package/dist/config/contact-book-store.js +1 -1
- package/dist/config/contact-book.js +1 -1
- package/dist/config/contact-operation-service.js +97 -8
- package/dist/config/peer-role-resolver.js +1 -1
- package/dist/config/resolved-config-op.js +30 -7
- package/dist/config-store.js +1 -1
- package/dist/core/agent-application-service.js +7 -1
- package/dist/core/audit/event-key.js +17 -2
- package/dist/core/audit/log-integrity.js +34 -8
- package/dist/core/auth/agent-delegation.js +48 -14
- package/dist/core/auth/auth-gateway.js +2 -0
- package/dist/core/auth/authorization-audit.js +53 -49
- package/dist/core/auth/operation-authorizer.js +90 -7
- package/dist/core/auth/operation-catalog.js +145 -4
- package/dist/core/auth/remote-access-store.js +155 -10
- package/dist/core/bootstrap-messages.js +66 -7
- package/dist/core/bootstrap-service.js +111 -20
- package/dist/core/command/agent-control.js +88 -7
- package/dist/core/command/agent-storage-menu.js +443 -0
- package/dist/core/command/cli-intent-parser.js +19 -0
- package/dist/core/command/command-handler.js +159 -65
- package/dist/core/command/data-root-resolver.js +273 -0
- package/dist/core/command/diag-service.js +118 -0
- package/dist/core/command/group-menu.js +7 -2
- package/dist/core/command/menu-catalog.js +46 -7
- package/dist/core/command/menu-handler.js +392 -100
- package/dist/core/command/menu-protocol.js +45 -6
- package/dist/core/command/menu-token-store.js +41 -8
- package/dist/core/command/role-menu.js +2 -2
- package/dist/core/command/slash-gate.js +34 -4
- package/dist/core/command/slash-handler.js +123 -43
- package/dist/core/event-catalog.js +4 -0
- package/dist/core/evolagent-registry.js +28 -2
- package/dist/core/group/invite-service.js +924 -0
- package/dist/core/handoff/runtime.js +205 -27
- package/dist/core/handoff/store.js +193 -4
- package/dist/core/interaction-router.js +22 -8
- package/dist/core/message/im-renderer.js +146 -34
- package/dist/core/message/message-bridge.js +163 -20
- package/dist/core/message/message-log.js +5 -3
- package/dist/core/message/message-queue.js +99 -41
- package/dist/core/message/message-utils.js +1 -0
- package/dist/core/message/response-engine.js +755 -144
- 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/approval-gateway.js +36 -3
- package/dist/core/permission/ec-command-parser.js +112 -41
- package/dist/core/permission/protected-paths.js +134 -16
- package/dist/core/permission/sandbox-runtime.js +108 -17
- package/dist/core/permission/tool-error-code.js +15 -0
- package/dist/core/permission/tool-policy.js +9 -8
- package/dist/core/relation/peer-identity.js +57 -6
- package/dist/core/relation/shared-data.js +106 -0
- package/dist/core/role/runtime-policy.js +64 -0
- package/dist/core/runtime-lock.js +10 -26
- package/dist/core/session/runner-task-history.js +170 -0
- package/dist/core/session/session-manager.js +34 -6
- package/dist/core/session/session-mapper.js +41 -0
- package/dist/core/session/session-turn-coordinator.js +37 -7
- package/dist/core/session/session-turns.js +48 -7
- package/dist/core/task/task-recovery-service.js +176 -0
- package/dist/core/task/task-resume-operation.js +32 -0
- package/dist/eck/group-rules-sync.js +5 -3
- package/dist/eck/kit-renderer.js +1 -0
- package/dist/index.js +588 -217
- package/dist/ipc.js +193 -15
- package/dist/paths.js +17 -4
- package/dist/product.js +2 -0
- 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/trigger/event-source.js +19 -0
- package/dist/trigger/feedback.js +233 -40
- package/dist/trigger/parser.js +55 -5
- package/dist/trigger/patch.js +9 -0
- package/dist/trigger/scheduler.js +30 -4
- package/dist/trigger/validation.js +20 -3
- package/dist/utils/cross-platform.js +30 -1
- package/dist/utils/ecweb-utils.js +1 -0
- package/dist/utils/error-dict.json +160 -160
- package/dist/utils/error-utils.js +61 -2
- package/dist/utils/evolcore-version.js +129 -0
- package/dist/utils/logger.js +26 -14
- 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/tool-summary.js +59 -3
- package/dist/utils/welcome.js +196 -23
- package/ecagent/LICENSE +21 -21
- package/ecagent/NOTICE +11 -11
- package/ecagent/README.md +61 -61
- package/ecagent/dist/harness/agent-harness.js +3 -0
- 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/ecagent/dist/harness/session/jsonl-storage.js +21 -2
- package/kits/docs/GUIDE.md +20 -20
- package/kits/docs/INDEX.md +60 -66
- package/kits/docs/aun/CHEATSHEET.md +19 -19
- package/kits/docs/aun/SYNC_PROTOCOL.md +15 -15
- package/kits/docs/channels/aun.md +69 -56
- package/kits/docs/channels/feishu.md +56 -56
- package/kits/docs/context-assembly.md +379 -367
- 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 +76 -71
- package/kits/docs/evolcore/agent-create.md +202 -165
- package/kits/docs/evolcore/agent.md +99 -67
- package/kits/docs/evolcore/aid.md +68 -60
- package/kits/docs/evolcore/codex-windows-sandbox.md +146 -146
- package/kits/docs/evolcore/config.md +241 -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 +244 -244
- package/kits/docs/evolcore/group-fs.md +17 -17
- package/kits/docs/evolcore/group-rules.md +251 -251
- package/kits/docs/evolcore/group.md +267 -152
- package/kits/docs/evolcore/menu-client.md +58 -34
- package/kits/docs/evolcore/model.md +50 -50
- package/kits/docs/evolcore/msg.md +169 -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 +53 -50
- package/kits/docs/evolcore/task.md +14 -0
- package/kits/docs/evolcore/trigger.md +623 -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 +42 -25
- package/kits/docs/venues/private.md +10 -10
- package/kits/eck_manifest.auxiliary.json +43 -43
- package/kits/eck_manifest.json +217 -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 +166 -162
- package/kits/rules/02-navigation.md +96 -96
- package/kits/rules/03-identity.md +36 -36
- package/kits/rules/04-relation.md +76 -75
- package/kits/rules/05-venue.md +60 -60
- package/kits/rules/06-channel.md +65 -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 +451 -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 +215 -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 +101 -96
- package/kits/templates/roles/owner.json +9 -9
- package/kits/templates/roles/visitor.json +90 -85
- package/kits/templates/system-fragments/baseagent.md +14 -14
- package/kits/templates/system-fragments/bootstrap.md +53 -34
- package/kits/templates/system-fragments/channel.md +28 -64
- package/kits/templates/system-fragments/commands.md +36 -28
- package/kits/templates/system-fragments/group-unread-history.md +7 -0
- package/kits/templates/system-fragments/identity.md +13 -13
- package/kits/templates/system-fragments/relation.md +19 -19
- package/kits/templates/system-fragments/reply.md +56 -0
- package/kits/templates/system-fragments/session.md +59 -59
- package/kits/templates/system-fragments/venue.md +31 -31
- package/package.json +104 -98
- package/dist/aun/group-identity.js +0 -9
- /package/dist/aun/{group-fs-download.js → group/fs-download.js} +0 -0
- /package/dist/aun/{msg/group-index.js → group/index-rpc.js} +0 -0
package/dist/channels/daemon.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ExecutionTimeoutError } from '../utils/error-utils.js';
|
|
1
2
|
import { normalizeExecutionMode } from '../trigger/validation.js';
|
|
2
3
|
import { resolvePeerRoleDetail } from '../config/peer-role-resolver.js';
|
|
3
4
|
const DEFAULT_WATCHDOG_MS = 11 * 60 * 1000;
|
|
@@ -349,7 +350,7 @@ export class DaemonChannel {
|
|
|
349
350
|
watchdogMs: this.watchdogMs,
|
|
350
351
|
}))
|
|
351
352
|
return;
|
|
352
|
-
this.cancelDeliveryInBackground(slot);
|
|
353
|
+
this.cancelDeliveryInBackground(slot, new ExecutionTimeoutError('daemon_watchdog_timeout', this.watchdogMs));
|
|
353
354
|
this.settleTerminal(runId, slot);
|
|
354
355
|
}
|
|
355
356
|
resetWatchdog(runId, slot) {
|
|
@@ -373,20 +374,23 @@ export class DaemonChannel {
|
|
|
373
374
|
totalExecutionMs,
|
|
374
375
|
}))
|
|
375
376
|
return;
|
|
376
|
-
this.cancelDeliveryInBackground(slot);
|
|
377
|
+
this.cancelDeliveryInBackground(slot, new ExecutionTimeoutError('daemon_total_execution_timeout', totalExecutionMs));
|
|
377
378
|
this.settleTerminal(runId, slot);
|
|
378
379
|
}
|
|
379
|
-
cancelDeliveryInBackground(slot) {
|
|
380
|
-
const cancellation = this.cancelDelivery(slot.messageId);
|
|
380
|
+
cancelDeliveryInBackground(slot, timeout) {
|
|
381
|
+
const cancellation = this.cancelDelivery(slot.messageId, timeout);
|
|
381
382
|
slot.cancellationBarrier = cancellation;
|
|
382
383
|
void cancellation.then(() => undefined, () => undefined);
|
|
383
384
|
}
|
|
384
|
-
async cancelDelivery(messageId) {
|
|
385
|
+
async cancelDelivery(messageId, timeout) {
|
|
385
386
|
const queue = this.messageQueue;
|
|
386
387
|
if (queue.cancel?.(messageId))
|
|
387
388
|
return;
|
|
388
389
|
if (queue.cancelActiveAndWait) {
|
|
389
|
-
|
|
390
|
+
if (timeout)
|
|
391
|
+
await queue.cancelActiveAndWait(messageId, undefined, timeout);
|
|
392
|
+
else
|
|
393
|
+
await queue.cancelActiveAndWait(messageId);
|
|
390
394
|
return;
|
|
391
395
|
}
|
|
392
396
|
queue.cancelActive?.(messageId);
|
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
|
+
import { MAIN_CLI_BIN, SELF_AID_ENV, SESSION_ID_ENV } from '../product.js';
|
|
2
3
|
import { getArgValue, isHelpFlag, wantsHelp } from './help.js';
|
|
3
4
|
import { isHostChinese } from '../utils/locale.js';
|
|
4
5
|
import { readTaskRuntimeContextFromEnv } from './task-context.js';
|
|
6
|
+
import { parseAgentWelcomeArgs } from './agent-create.js';
|
|
7
|
+
function printBootstrapDeliveries(result) {
|
|
8
|
+
for (const delivery of result?.deliveries ?? []) {
|
|
9
|
+
if (delivery.status === 'sent')
|
|
10
|
+
console.log(` ${delivery.owner}: 消息已被网关接受 (${delivery.messageId})`);
|
|
11
|
+
else if (delivery.status === 'queued')
|
|
12
|
+
console.log(` ${delivery.owner}: 消息已入队,等待重试 (${delivery.outboxId})`);
|
|
13
|
+
else if (delivery.status === 'failed')
|
|
14
|
+
console.error(` ${delivery.owner}: 消息发送失败 [${delivery.code ?? 'unknown'}] ${delivery.error}`);
|
|
15
|
+
else
|
|
16
|
+
console.log(` ${delivery.owner}: 没有消息投递记录`);
|
|
17
|
+
}
|
|
18
|
+
if (result?.error)
|
|
19
|
+
console.error(` 消息状态异常: ${result.error}`);
|
|
20
|
+
}
|
|
5
21
|
function formatTimeAgo(ms) {
|
|
6
22
|
const sec = Math.floor(ms / 1000);
|
|
7
23
|
if (sec < 60)
|
|
@@ -26,7 +42,7 @@ function formatBytes(bytes) {
|
|
|
26
42
|
export async function cmdAgent(args) {
|
|
27
43
|
const sub = args[0];
|
|
28
44
|
const formatJson = getArgValue(args, '--format') === 'json';
|
|
29
|
-
const commands = new Set(['list', 'show', 'new', 'enable', 'disable', 'get', 'set', 'persona', 'rename', 'ready', 'reload', 'delete']);
|
|
45
|
+
const commands = new Set(['list', 'show', 'new', 'initialize', 'enable', 'disable', 'get', 'set', 'persona', 'welcome', 'rename', 'ready', 'reload', 'delete']);
|
|
30
46
|
if (sub === 'create') {
|
|
31
47
|
const error = { ok: false, code: 'INVALID_COMMAND', error: '`ec agent create` is not a command; use `ec agent new`.' };
|
|
32
48
|
if (formatJson)
|
|
@@ -37,46 +53,79 @@ export async function cmdAgent(args) {
|
|
|
37
53
|
return;
|
|
38
54
|
}
|
|
39
55
|
if (!sub || isHelpFlag(sub) || (wantsHelp(args) && !commands.has(sub))) {
|
|
40
|
-
console.log(`用法: ec agent <command>
|
|
41
|
-
|
|
42
|
-
Commands:
|
|
43
|
-
list 列出所有 agent
|
|
44
|
-
show <aid> 查看 agent 详情(身份 + 配置 + 连接 + 会话 + 路径)
|
|
45
|
-
new [aid] 交互式创建 agent
|
|
46
|
-
new <aid> --non-interactive ... 非交互式创建
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
console.log(`用法: ec agent <command>
|
|
57
|
+
|
|
58
|
+
Commands:
|
|
59
|
+
list 列出所有 agent
|
|
60
|
+
show <aid> 查看 agent 详情(身份 + 配置 + 连接 + 会话 + 路径)
|
|
61
|
+
new [aid] 交互式创建 agent
|
|
62
|
+
new <aid> --non-interactive ... 非交互式创建
|
|
63
|
+
new <aid> --initialize ... 创建并激活(隐含非交互)
|
|
64
|
+
initialize <aid> --resume 恢复一次性初始化
|
|
65
|
+
enable <aid> 启用 agent
|
|
66
|
+
disable <aid> 停用 agent
|
|
67
|
+
get <aid> <key> 读取单个配置字段(支持点路径)
|
|
50
68
|
set <aid> <key> <val> 修改单个配置字段(支持点路径)
|
|
51
69
|
persona show 查看当前 Agent 的 persona.md
|
|
52
70
|
persona --text <text> 用文本设置当前 Agent 的 persona.md
|
|
53
71
|
persona --file <path> 用 .md/.txt 文件设置当前 Agent 的 persona.md
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
ec agent
|
|
67
|
-
ec agent
|
|
68
|
-
ec agent
|
|
72
|
+
welcome show 查看已确认的 Bootstrap welcome 文案
|
|
73
|
+
welcome --text <text> 保存 Owner 已确认的 Bootstrap welcome 文案
|
|
74
|
+
rename <aid> <name> 修改 agent.md 中的显示名称
|
|
75
|
+
ready <aid> 标记 bootstrap 完成,进入 active 状态
|
|
76
|
+
reload [aid] 热重载配置(无参数=全量 resync)
|
|
77
|
+
delete <aid> [--purge] 删除 agent
|
|
78
|
+
|
|
79
|
+
Options:
|
|
80
|
+
--format json 输出 JSON 格式
|
|
81
|
+
--help, -h 各子命令均支持,查看详细用法
|
|
82
|
+
|
|
83
|
+
示例:
|
|
84
|
+
ec agent list
|
|
85
|
+
ec agent show mybot.agentid.pub
|
|
86
|
+
ec agent new mybot.agentid.pub
|
|
87
|
+
ec agent enable mybot.agentid.pub
|
|
88
|
+
ec agent get mybot.agentid.pub active_baseagent
|
|
69
89
|
ec agent set mybot.agentid.pub active_baseagent codex
|
|
70
90
|
ec agent persona --text "你是一名严谨的诊断工程师。"
|
|
71
|
-
ec agent rename mybot.agentid.pub "New Name"
|
|
72
|
-
ec agent ready mybot.agentid.pub
|
|
91
|
+
ec agent rename mybot.agentid.pub "New Name"
|
|
92
|
+
ec agent ready mybot.agentid.pub
|
|
73
93
|
ec agent delete mybot.agentid.pub --purge`);
|
|
74
94
|
return;
|
|
75
95
|
}
|
|
76
|
-
|
|
96
|
+
if ((sub === 'new' && args.includes('--initialize')) || sub === 'initialize') {
|
|
97
|
+
if (wantsHelp(args)) {
|
|
98
|
+
console.log('ec agent new <aid> --initialize --name <name> --description <text> --tags <json> [--owner <aid> | --owners <json>] [--persona-file <path> | --persona-text <text>] [--wait 0..300] [--dry-run] [--format json]\nec agent initialize <aid> --resume [--wait 0..300] [--format json]\n--initialize implies --non-interactive; waits for activation (default 60 seconds).');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const { runInitializationCommand } = await import('./agent-create.js');
|
|
103
|
+
const result = await runInitializationCommand(args);
|
|
104
|
+
if (formatJson)
|
|
105
|
+
console.log(JSON.stringify(result, null, 2));
|
|
106
|
+
else if (result.dryRun)
|
|
107
|
+
console.log(JSON.stringify(result, null, 2));
|
|
108
|
+
else if (result.ok)
|
|
109
|
+
console.log(`✓ ${result.aid} initialized (active)`);
|
|
110
|
+
else
|
|
111
|
+
console.error(`[${result.code}] ${result.error ?? result.phase ?? 'Initialization failed'}`);
|
|
112
|
+
if (!result.ok)
|
|
113
|
+
process.exitCode = result.code === 'INITIALIZE_PENDING' ? 2 : 1;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
const result = { ok: false, code: 'INVALID_ARGS', error: error instanceof Error ? error.message : String(error) };
|
|
117
|
+
if (formatJson)
|
|
118
|
+
console.log(JSON.stringify(result));
|
|
119
|
+
else
|
|
120
|
+
console.error(result.error);
|
|
121
|
+
process.exitCode = 1;
|
|
122
|
+
}
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const { agentList, agentShow, agentCreateInteractive, agentCreateNonInteractive, agentReload, agentEnable, agentDisable, agentGet, agentSet, agentPersona, agentWelcome, agentRename, agentDelete, agentReady, runManagedAgentOperation, } = await import('./agent.js');
|
|
77
126
|
const { parseAgentOwnerArgs, parseAgentTags, resolveAgentCreatePlan, validateAgentCreatePlan } = await import('./agent-create.js');
|
|
78
|
-
if (process.env.EVOLCORE_SESSION_ID && !wantsHelp(args) && !new Set(['get', 'set', 'persona', 'ready']).has(sub)) {
|
|
79
|
-
if (sub === 'new' && !args.includes('--non-interactive')) {
|
|
127
|
+
if (process.env.EVOLCORE_SESSION_ID && !wantsHelp(args) && !new Set(['get', 'set', 'persona', 'welcome', 'ready']).has(sub)) {
|
|
128
|
+
if (sub === 'new' && !args.includes('--non-interactive') && !args.includes('--initialize')) {
|
|
80
129
|
const error = {
|
|
81
130
|
ok: false,
|
|
82
131
|
code: 'MANAGED_NON_INTERACTIVE_REQUIRED',
|
|
@@ -137,8 +186,8 @@ Options:
|
|
|
137
186
|
// --- list ---
|
|
138
187
|
if (sub === 'list') {
|
|
139
188
|
if (wantsHelp(args)) {
|
|
140
|
-
console.log(`用法: ec agent list [--format json]
|
|
141
|
-
|
|
189
|
+
console.log(`用法: ec agent list [--format json]
|
|
190
|
+
|
|
142
191
|
列出所有 agent,显示名称、状态、渠道、项目、基座、最后活跃时间。`);
|
|
143
192
|
return;
|
|
144
193
|
}
|
|
@@ -208,27 +257,31 @@ Options:
|
|
|
208
257
|
// --- new ---
|
|
209
258
|
if (sub === 'new') {
|
|
210
259
|
if (wantsHelp(args)) {
|
|
211
|
-
console.log(`用法: ec agent new [aid] 交互式创建
|
|
212
|
-
ec agent new <aid> --non-interactive [选项]
|
|
213
|
-
|
|
214
|
-
非交互模式选项:
|
|
215
|
-
--
|
|
216
|
-
--
|
|
217
|
-
|
|
260
|
+
console.log(`用法: ec agent new [aid] 交互式创建
|
|
261
|
+
ec agent new <aid> --non-interactive [选项]
|
|
262
|
+
|
|
263
|
+
非交互模式选项:
|
|
264
|
+
--initialize 使用显式名片直接完成初始化(隐含 --non-interactive)
|
|
265
|
+
--persona-file <path> 初始化人格 .md/.txt(或 --persona-text <text>)
|
|
266
|
+
--wait <seconds> 初始化等待 0–300 秒,默认 60
|
|
267
|
+
--project <path> 默认: 当前目录
|
|
268
|
+
--baseagent <claude|codex|gemini|ecagent>
|
|
269
|
+
默认: defaults 配置,否则检测本机可用基座
|
|
218
270
|
--owner <aid> 默认: daemon.json 第一个 owner
|
|
219
271
|
--owners <json-array> 多个 Owner;与 --owner 互斥
|
|
220
272
|
--handoff <context> 当前任务的 Bootstrap 上下文
|
|
221
|
-
--name <display-name> 默认: package.json name,否则目录名
|
|
273
|
+
--name <display-name> 默认: package.json name,否则目录名
|
|
222
274
|
--description <text> 默认: package.json description,否则使用 EvolCore 默认描述
|
|
275
|
+
--type <type> 主体类型: human|agent|group|service|device|org|host(默认 agent)
|
|
223
276
|
--tags <json-array> 3 到 6 个标签,例如 '["coding","diagnostics","logs"]'
|
|
224
|
-
--dry-run 只预览最终参数,不注册 AID、不写文件
|
|
225
|
-
--force 覆盖已有 config.json
|
|
226
|
-
--format json 输出 JSON
|
|
227
|
-
|
|
228
|
-
示例:
|
|
229
|
-
ec agent new mybot.agentid.pub
|
|
230
|
-
ec agent new mybot.agentid.pub --non-interactive
|
|
231
|
-
ec agent new mybot.agentid.pub --non-interactive --dry-run --format json
|
|
277
|
+
--dry-run 只预览最终参数,不注册 AID、不写文件
|
|
278
|
+
--force 覆盖已有 config.json
|
|
279
|
+
--format json 输出 JSON
|
|
280
|
+
|
|
281
|
+
示例:
|
|
282
|
+
ec agent new mybot.agentid.pub
|
|
283
|
+
ec agent new mybot.agentid.pub --non-interactive
|
|
284
|
+
ec agent new mybot.agentid.pub --non-interactive --dry-run --format json
|
|
232
285
|
ec agent new mybot.agentid.pub --non-interactive --project ../project --baseagent claude`);
|
|
233
286
|
return;
|
|
234
287
|
}
|
|
@@ -286,6 +339,7 @@ Options:
|
|
|
286
339
|
handoff: getArg('--handoff'),
|
|
287
340
|
name: getArg('--name'),
|
|
288
341
|
description: getArg('--description'),
|
|
342
|
+
type: getArg('--type'),
|
|
289
343
|
tags,
|
|
290
344
|
force: args.includes('--force'),
|
|
291
345
|
});
|
|
@@ -324,6 +378,7 @@ Options:
|
|
|
324
378
|
owners: plan.owners,
|
|
325
379
|
name: plan.name,
|
|
326
380
|
description: plan.description,
|
|
381
|
+
type: plan.type,
|
|
327
382
|
tags: plan.tags,
|
|
328
383
|
force: args.includes('--force'),
|
|
329
384
|
});
|
|
@@ -351,6 +406,15 @@ Options:
|
|
|
351
406
|
: result.hotLoadError
|
|
352
407
|
? ` ✗ 热重载失败:${result.hotLoadError}`
|
|
353
408
|
: ' ⚠ 服务未运行,下次 ec start 时生效');
|
|
409
|
+
if (result.ownerContactsSynced?.length) {
|
|
410
|
+
console.log(` ✓ 已同步 Owner 联系人: ${result.ownerContactsSynced.join(', ')}`);
|
|
411
|
+
}
|
|
412
|
+
if (result.ownerContactsSkipped?.length) {
|
|
413
|
+
console.log(` ⚠ 无本地联系人簿,跳过 Owner: ${result.ownerContactsSkipped.join(', ')}`);
|
|
414
|
+
}
|
|
415
|
+
if (result.ownerContactSyncErrors?.length) {
|
|
416
|
+
console.log(` ⚠ Owner 联系人同步失败: ${result.ownerContactSyncErrors.join('; ')}`);
|
|
417
|
+
}
|
|
354
418
|
if (result.ownerBoundAid) {
|
|
355
419
|
console.log(` ✓ agent owner 已绑定: ${result.ownerBoundAid}`);
|
|
356
420
|
}
|
|
@@ -385,6 +449,15 @@ Options:
|
|
|
385
449
|
: result.hotLoadError
|
|
386
450
|
? ` ✗ 热重载失败:${result.hotLoadError}`
|
|
387
451
|
: ' ⚠ 服务未运行,下次 ec start 时生效');
|
|
452
|
+
if (result.ownerContactsSynced?.length) {
|
|
453
|
+
console.log(` ✓ 已同步 Owner 联系人: ${result.ownerContactsSynced.join(', ')}`);
|
|
454
|
+
}
|
|
455
|
+
if (result.ownerContactsSkipped?.length) {
|
|
456
|
+
console.log(` ⚠ 无本地联系人簿,跳过 Owner: ${result.ownerContactsSkipped.join(', ')}`);
|
|
457
|
+
}
|
|
458
|
+
if (result.ownerContactSyncErrors?.length) {
|
|
459
|
+
console.log(` ⚠ Owner 联系人同步失败: ${result.ownerContactSyncErrors.join('; ')}`);
|
|
460
|
+
}
|
|
388
461
|
if (result.ownerBoundAid) {
|
|
389
462
|
console.log(` ✓ agent owner 已绑定: ${result.ownerBoundAid}`);
|
|
390
463
|
}
|
|
@@ -420,11 +493,11 @@ Options:
|
|
|
420
493
|
// --- reload ---
|
|
421
494
|
if (sub === 'reload') {
|
|
422
495
|
if (wantsHelp(args)) {
|
|
423
|
-
console.log(`用法: ec agent reload [aid] [--force] [--format json]
|
|
424
|
-
|
|
425
|
-
热重载 agent 配置。
|
|
426
|
-
无参数 全量 resync(扫磁盘,新增上线、删除下线、修改热更新)
|
|
427
|
-
<aid> 仅热重载指定 agent
|
|
496
|
+
console.log(`用法: ec agent reload [aid] [--force] [--format json]
|
|
497
|
+
|
|
498
|
+
热重载 agent 配置。
|
|
499
|
+
无参数 全量 resync(扫磁盘,新增上线、删除下线、修改热更新)
|
|
500
|
+
<aid> 仅热重载指定 agent
|
|
428
501
|
--force 中断目标 Agent 的运行中任务并清空排队任务后重载(仅与 <aid> 同用)`);
|
|
429
502
|
return;
|
|
430
503
|
}
|
|
@@ -456,9 +529,9 @@ Options:
|
|
|
456
529
|
// --- enable ---
|
|
457
530
|
if (sub === 'enable') {
|
|
458
531
|
if (wantsHelp(args)) {
|
|
459
|
-
console.log(`用法: ec agent enable <aid> [--force] [--format json]
|
|
460
|
-
|
|
461
|
-
启用 agent。若服务运行中会热重载,否则下次 ec start 时生效。
|
|
532
|
+
console.log(`用法: ec agent enable <aid> [--force] [--format json]
|
|
533
|
+
|
|
534
|
+
启用 agent。若服务运行中会热重载,否则下次 ec start 时生效。
|
|
462
535
|
--force 中断目标 Agent 的运行中任务并清空排队任务后重载`);
|
|
463
536
|
return;
|
|
464
537
|
}
|
|
@@ -488,9 +561,9 @@ Options:
|
|
|
488
561
|
// --- disable ---
|
|
489
562
|
if (sub === 'disable') {
|
|
490
563
|
if (wantsHelp(args)) {
|
|
491
|
-
console.log(`用法: ec agent disable <aid> [--force] [--format json]
|
|
492
|
-
|
|
493
|
-
停用 agent。若服务运行中会热重载离线,否则在配置中标记为禁用。
|
|
564
|
+
console.log(`用法: ec agent disable <aid> [--force] [--format json]
|
|
565
|
+
|
|
566
|
+
停用 agent。若服务运行中会热重载离线,否则在配置中标记为禁用。
|
|
494
567
|
--force 中断目标 Agent 的运行中任务并清空排队任务后重载`);
|
|
495
568
|
return;
|
|
496
569
|
}
|
|
@@ -596,16 +669,65 @@ Options:
|
|
|
596
669
|
console.log(result.content ?? '(persona.md 不存在)');
|
|
597
670
|
return;
|
|
598
671
|
}
|
|
672
|
+
if (sub === 'welcome') {
|
|
673
|
+
if (args.length === 2 && isHelpFlag(args[1])) {
|
|
674
|
+
console.log(`用法: ${MAIN_CLI_BIN} agent welcome show [--format json]
|
|
675
|
+
${MAIN_CLI_BIN} agent welcome --text <text> [--format json]
|
|
676
|
+
|
|
677
|
+
读取或保存当前 Agent 在 Bootstrap 中经 Owner 确认的 welcome 文案。文案固定保存到 personal/welcome.md。`);
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
let text;
|
|
681
|
+
try {
|
|
682
|
+
({ text } = parseAgentWelcomeArgs(args.slice(1)));
|
|
683
|
+
}
|
|
684
|
+
catch (error) {
|
|
685
|
+
const result = { ok: false, code: 'INVALID_ARGS', error: error.message };
|
|
686
|
+
if (formatJson)
|
|
687
|
+
console.log(JSON.stringify(result));
|
|
688
|
+
else
|
|
689
|
+
console.error(`❌ ${result.error}`);
|
|
690
|
+
process.exitCode = 1;
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
const taskAid = process.env[SESSION_ID_ENV] ? (readTaskRuntimeContextFromEnv()?.selfAid || '') : '';
|
|
694
|
+
const aid = taskAid || process.env[SELF_AID_ENV] || '';
|
|
695
|
+
if (!aid) {
|
|
696
|
+
const result = { ok: false, code: 'INVALID_ARGS', error: '无法确定当前 Agent AID' };
|
|
697
|
+
if (formatJson)
|
|
698
|
+
console.log(JSON.stringify(result));
|
|
699
|
+
else
|
|
700
|
+
console.error(`❌ ${result.error}`);
|
|
701
|
+
process.exitCode = 1;
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
const result = await agentWelcome(aid, { text });
|
|
705
|
+
if (!result.ok) {
|
|
706
|
+
if (formatJson)
|
|
707
|
+
console.log(JSON.stringify(result));
|
|
708
|
+
else
|
|
709
|
+
console.error(`❌ ${result.error}`);
|
|
710
|
+
process.exitCode = 1;
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
if (formatJson)
|
|
714
|
+
console.log(JSON.stringify(result, null, 2));
|
|
715
|
+
else if (result.saved)
|
|
716
|
+
console.log(`✓ ${aid} welcome.md 已保存`);
|
|
717
|
+
else
|
|
718
|
+
console.log(result.content ?? '(welcome.md 不存在)');
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
599
721
|
if (sub === 'get') {
|
|
600
722
|
if (wantsHelp(args)) {
|
|
601
|
-
console.log(`用法: ec agent get <aid> <key> [--format json]
|
|
602
|
-
|
|
603
|
-
读取单个配置字段。key 支持点路径,如 "channels.aun.enabled"。
|
|
604
|
-
托管任务通过 daemon 统一鉴权;无会话的本机 CLI 走控制面。
|
|
605
|
-
|
|
606
|
-
示例:
|
|
607
|
-
ec agent get mybot.agentid.pub active_baseagent
|
|
608
|
-
ec agent get mybot.agentid.pub observable
|
|
723
|
+
console.log(`用法: ec agent get <aid> <key> [--format json]
|
|
724
|
+
|
|
725
|
+
读取单个配置字段。key 支持点路径,如 "channels.aun.enabled"。
|
|
726
|
+
托管任务通过 daemon 统一鉴权;无会话的本机 CLI 走控制面。
|
|
727
|
+
|
|
728
|
+
示例:
|
|
729
|
+
ec agent get mybot.agentid.pub active_baseagent
|
|
730
|
+
ec agent get mybot.agentid.pub observable
|
|
609
731
|
ec agent get mybot.agentid.pub channels.aun.enabled`);
|
|
610
732
|
return;
|
|
611
733
|
}
|
|
@@ -637,15 +759,15 @@ Options:
|
|
|
637
759
|
// --- set ---
|
|
638
760
|
if (sub === 'set') {
|
|
639
761
|
if (wantsHelp(args)) {
|
|
640
|
-
console.log(`用法: ec agent set <aid> <key> <value> [--format json]
|
|
641
|
-
|
|
642
|
-
修改单个配置字段。key 支持点路径。本机控制面会尝试热重载;托管任务如需重载须另行执行 agent reload。
|
|
643
|
-
托管任务通过 daemon 统一鉴权;无会话的本机 CLI 走控制面。
|
|
644
|
-
|
|
645
|
-
示例:
|
|
646
|
-
ec agent set mybot.agentid.pub active_baseagent codex
|
|
647
|
-
ec agent set mybot.agentid.pub observable true
|
|
648
|
-
ec agent set mybot.agentid.pub observable false
|
|
762
|
+
console.log(`用法: ec agent set <aid> <key> <value> [--format json]
|
|
763
|
+
|
|
764
|
+
修改单个配置字段。key 支持点路径。本机控制面会尝试热重载;托管任务如需重载须另行执行 agent reload。
|
|
765
|
+
托管任务通过 daemon 统一鉴权;无会话的本机 CLI 走控制面。
|
|
766
|
+
|
|
767
|
+
示例:
|
|
768
|
+
ec agent set mybot.agentid.pub active_baseagent codex
|
|
769
|
+
ec agent set mybot.agentid.pub observable true
|
|
770
|
+
ec agent set mybot.agentid.pub observable false
|
|
649
771
|
ec agent set mybot.agentid.pub channels.aun.enabled true`);
|
|
650
772
|
return;
|
|
651
773
|
}
|
|
@@ -677,8 +799,8 @@ Options:
|
|
|
677
799
|
// --- ready ---
|
|
678
800
|
if (sub === 'ready') {
|
|
679
801
|
if (wantsHelp(args)) {
|
|
680
|
-
console.log(`用法: ec agent ready <aid> [--format json]
|
|
681
|
-
|
|
802
|
+
console.log(`用法: ec agent ready <aid> [--format json]
|
|
803
|
+
|
|
682
804
|
标记 agent bootstrap 已完成,将 lifecycle 切换为 active。该命令允许 agent 在工具调用中自报完成。`);
|
|
683
805
|
return;
|
|
684
806
|
}
|
|
@@ -701,17 +823,18 @@ Options:
|
|
|
701
823
|
console.log(JSON.stringify(result, null, 2));
|
|
702
824
|
}
|
|
703
825
|
else {
|
|
704
|
-
console.log(`✓ ${aid} lifecycle=active${result.reloaded ? ' (runtime updated)' : '
|
|
826
|
+
console.log(`✓ ${aid} lifecycle=active${result.reloaded ? ' (runtime updated)' : ''}`);
|
|
827
|
+
printBootstrapDeliveries(result.welcome);
|
|
705
828
|
}
|
|
706
829
|
return;
|
|
707
830
|
}
|
|
708
831
|
// --- delete ---
|
|
709
832
|
if (sub === 'delete') {
|
|
710
833
|
if (wantsHelp(args)) {
|
|
711
|
-
console.log(`用法: ec agent delete <aid> [--purge] [--format json]
|
|
712
|
-
|
|
713
|
-
删除 agent 的配置。
|
|
714
|
-
--purge 同时清除该 agent 的会话、消息、日志等运行时数据
|
|
834
|
+
console.log(`用法: ec agent delete <aid> [--purge] [--format json]
|
|
835
|
+
|
|
836
|
+
删除 agent 的配置。
|
|
837
|
+
--purge 同时清除该 agent 的会话、消息、日志等运行时数据
|
|
715
838
|
默认 仅删除 config.json,运行时数据保留`);
|
|
716
839
|
return;
|
|
717
840
|
}
|
|
@@ -742,8 +865,8 @@ Options:
|
|
|
742
865
|
// --- show ---
|
|
743
866
|
if (sub === 'show') {
|
|
744
867
|
if (wantsHelp(args)) {
|
|
745
|
-
console.log(`用法: ec agent show <aid> [--format json]
|
|
746
|
-
|
|
868
|
+
console.log(`用法: ec agent show <aid> [--format json]
|
|
869
|
+
|
|
747
870
|
查看 agent 详情:身份、配置、连接状态、会话路径等。`);
|
|
748
871
|
return;
|
|
749
872
|
}
|
|
@@ -772,8 +895,8 @@ Options:
|
|
|
772
895
|
// --- rename ---
|
|
773
896
|
if (sub === 'rename') {
|
|
774
897
|
if (wantsHelp(args)) {
|
|
775
|
-
console.log(`用法: ec agent rename <aid> <name> [--format json]
|
|
776
|
-
|
|
898
|
+
console.log(`用法: ec agent rename <aid> <name> [--format json]
|
|
899
|
+
|
|
777
900
|
修改本地 AIDs/<aid>/agent.md 中的 name 字段。`);
|
|
778
901
|
return;
|
|
779
902
|
}
|
|
@@ -819,7 +942,7 @@ Options:
|
|
|
819
942
|
printAgentShowHuman(result);
|
|
820
943
|
}
|
|
821
944
|
function printAgentShowHuman(result) {
|
|
822
|
-
console.log(`${result.aid} (${result.status})\n`);
|
|
945
|
+
console.log(`${result.aid} (${result.status}, lifecycle=${result.lifecycle || 'unknown'})\n`);
|
|
823
946
|
if (result.identity.name || result.identity.description) {
|
|
824
947
|
console.log(' Identity');
|
|
825
948
|
if (result.identity.name)
|