evolcore 0.0.1 → 0.0.2
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 +813 -0
- package/LICENSE +21 -0
- package/MIGRATION-0.5.0.md +378 -0
- package/README.md +318 -14
- package/ROLE_ACCESS_CONTROL.md +174 -0
- package/assets/.env.template +4 -0
- package/assets/brand/evolcore/README.md +19 -0
- package/assets/brand/evolcore/evolcore-app-icon.png +0 -0
- package/assets/brand/evolcore/evolcore-app-icon.svg +13 -0
- package/assets/brand/evolcore/evolcore-brand-board.png +0 -0
- package/assets/brand/evolcore/evolcore-brand-board.svg +126 -0
- package/assets/brand/evolcore/evolcore-logo-kit.zip +0 -0
- package/assets/brand/evolcore/evolcore-logo-reverse.png +0 -0
- package/assets/brand/evolcore/evolcore-logo-reverse.svg +14 -0
- package/assets/brand/evolcore/evolcore-logo.png +0 -0
- package/assets/brand/evolcore/evolcore-logo.svg +14 -0
- package/assets/brand/evolcore/evolcore-mark.png +0 -0
- package/assets/brand/evolcore/evolcore-mark.svg +10 -0
- package/bin/ec-safe-output.js +161 -0
- package/bin/ec.js +29 -0
- package/dist/agents/baseagent.js +163 -0
- package/dist/agents/claude-runner.js +2385 -0
- package/dist/agents/codex-app-server-client.js +448 -0
- package/dist/agents/codex-runner.js +2639 -0
- package/dist/agents/gemini-runner.js +666 -0
- package/dist/agents/runner-types.js +75 -0
- package/dist/aun/aid/agentmd.js +216 -0
- package/dist/aun/aid/client.js +132 -0
- package/dist/aun/aid/control-aid.js +91 -0
- package/dist/aun/aid/identity.js +518 -0
- package/dist/aun/aid/index.js +4 -0
- package/dist/aun/aid/store.js +74 -0
- package/dist/aun/aid/types.js +1 -0
- package/dist/aun/aid/validation.js +21 -0
- package/dist/aun/group-identity.js +10 -0
- package/dist/aun/msg/group-index.js +6 -0
- package/dist/aun/msg/group.js +1231 -0
- package/dist/aun/msg/history.js +123 -0
- package/dist/aun/msg/index.js +5 -0
- package/dist/aun/msg/p2p.js +393 -0
- package/dist/aun/msg/payload-type.js +27 -0
- package/dist/aun/msg/upload.js +137 -0
- package/dist/aun/outbox.js +160 -0
- package/dist/aun/rpc/caller.js +42 -0
- package/dist/aun/rpc/connection.js +25 -0
- package/dist/aun/rpc/index.js +2 -0
- package/dist/aun/service-proxy.js +225 -0
- package/dist/aun/storage/download.js +29 -0
- package/dist/aun/storage/index.js +3 -0
- package/dist/aun/storage/manage.js +10 -0
- package/dist/aun/storage/upload.js +68 -0
- package/dist/channels/aun.js +4147 -0
- package/dist/channels/daemon.js +422 -0
- package/dist/channels/dingtalk.js +649 -0
- package/dist/channels/feishu.js +1789 -0
- package/dist/channels/qqbot.js +409 -0
- package/dist/channels/wechat.js +817 -0
- package/dist/channels/wecom.js +565 -0
- package/dist/cli/agent-command.js +641 -0
- package/dist/cli/agent.js +1059 -0
- package/dist/cli/aun-commands.js +1948 -0
- package/dist/cli/bench.js +1228 -0
- package/dist/cli/cli-argv.js +66 -0
- package/dist/cli/code-stats.js +329 -0
- package/dist/cli/command-log.js +82 -0
- package/dist/cli/config-selector.js +69 -0
- package/dist/cli/config.js +261 -0
- package/dist/cli/ctl-command.js +62 -0
- package/dist/cli/daemon-commands.js +2887 -0
- package/dist/cli/fs-command.js +1447 -0
- package/dist/cli/handoff-command.js +302 -0
- package/dist/cli/help.js +31 -0
- package/dist/cli/index.js +358 -0
- package/dist/cli/init-channel.js +1377 -0
- package/dist/cli/init.js +553 -0
- package/dist/cli/link-rules.js +240 -0
- package/dist/cli/model.js +590 -0
- package/dist/cli/net-check.js +723 -0
- package/dist/cli/queue-command.js +126 -0
- package/dist/cli/response.js +345 -0
- package/dist/cli/restart-monitor.js +456 -0
- package/dist/cli/stats.js +607 -0
- package/dist/cli/task-context.js +80 -0
- package/dist/cli/trigger-command.js +505 -0
- package/dist/cli/version.js +88 -0
- package/dist/cli/watch-logs.js +33 -0
- package/dist/cli/watch-msg.js +673 -0
- package/dist/config/boot-log.js +266 -0
- package/dist/config/builtin-role-templates.js +30 -0
- package/dist/config/builtin-roles.js +85 -0
- package/dist/config/config-batch-get.js +11 -0
- package/dist/config/config-field-policy.js +261 -0
- package/dist/config/config-manager.js +916 -0
- package/dist/config/config-operation-service.js +384 -0
- package/dist/config/contact-book.js +371 -0
- package/dist/config/gateway-config.js +858 -0
- package/dist/config/lifecycle.js +17 -0
- package/dist/config/mention-mode.js +27 -0
- package/dist/config/merge.js +161 -0
- package/dist/config/owner-policy.js +4 -0
- package/dist/config/peer-role-resolver.js +139 -0
- package/dist/config/resolved-config-op.js +483 -0
- package/dist/config/role-config-v4-startup.js +32 -0
- package/dist/config/role-config-v5-startup.js +27 -0
- package/dist/config/role-schema.js +105 -0
- package/dist/config/role-service.js +159 -0
- package/dist/config/role-store.js +204 -0
- package/dist/config/roles.js +55 -0
- package/dist/config/schema-registry.js +154 -0
- package/dist/config/snapshot.js +598 -0
- package/dist/config-store.js +503 -0
- package/dist/core/auth/agent-delegation.js +111 -0
- package/dist/core/auth/auth-gateway.js +166 -0
- package/dist/core/auth/authenticated-actor.js +6 -0
- package/dist/core/auth/authorization-audit.js +110 -0
- package/dist/core/auth/operation-authorizer.js +718 -0
- package/dist/core/auth/operation-catalog.js +675 -0
- package/dist/core/baseagent-loader.js +54 -0
- package/dist/core/bootstrap-service.js +175 -0
- package/dist/core/capability/capability-manager.js +316 -0
- package/dist/core/capability/providers/claude-capability-provider.js +176 -0
- package/dist/core/capability/providers/codex-capability-provider.js +148 -0
- package/dist/core/capability/providers/gemini-capability-provider.js +10 -0
- package/dist/core/capability/types.js +27 -0
- package/dist/core/causation/audit.js +103 -0
- package/dist/core/causation/aun-association.js +111 -0
- package/dist/core/causation/context.js +93 -0
- package/dist/core/causation/index.js +4 -0
- package/dist/core/causation/types.js +2 -0
- package/dist/core/channel-loader.js +277 -0
- package/dist/core/command/agent-control.js +616 -0
- package/dist/core/command/cli-intent-parser.js +225 -0
- package/dist/core/command/command-handler.js +1638 -0
- package/dist/core/command/menu-handler.js +3354 -0
- package/dist/core/command/menu-protocol.js +247 -0
- package/dist/core/command/role-menu.js +1524 -0
- package/dist/core/command/slash-gate.js +148 -0
- package/dist/core/command/slash-handler.js +3056 -0
- package/dist/core/daemon-file-cache.js +216 -0
- package/dist/core/event-bus.js +32 -0
- package/dist/core/event-catalog.js +740 -0
- package/dist/core/evolagent-registry.js +546 -0
- package/dist/core/evolagent.js +331 -0
- package/dist/core/handoff/dispatcher.js +229 -0
- package/dist/core/handoff/mutex.js +46 -0
- package/dist/core/handoff/runtime.js +324 -0
- package/dist/core/handoff/store.js +537 -0
- package/dist/core/handoff/types.js +12 -0
- package/dist/core/inference/text-inference.js +173 -0
- package/dist/core/interaction-registration.js +10 -0
- package/dist/core/interaction-router.js +278 -0
- package/dist/core/message/create-status.js +67 -0
- package/dist/core/message/im-renderer.js +657 -0
- package/dist/core/message/items-formatter.js +76 -0
- package/dist/core/message/logical-queue-bridge.js +123 -0
- package/dist/core/message/message-bridge.js +803 -0
- package/dist/core/message/message-cache.js +56 -0
- package/dist/core/message/message-log.js +339 -0
- package/dist/core/message/message-processor.js +4 -0
- package/dist/core/message/message-queue.js +1436 -0
- package/dist/core/message/message-utils.js +70 -0
- package/dist/core/message/peer-mode.js +105 -0
- package/dist/core/message/pending-hints.js +232 -0
- package/dist/core/message/response-depth.js +33 -0
- package/dist/core/message/response-engine.js +3776 -0
- package/dist/core/message/response-snapshot.js +83 -0
- package/dist/core/message/stream-debouncer.js +130 -0
- package/dist/core/message/stream-idle-monitor.js +124 -0
- package/dist/core/model/config-scope.js +162 -0
- package/dist/core/model/field-scope.js +78 -0
- package/dist/core/model/model-catalog.js +227 -0
- package/dist/core/model/model-diagnostics.js +182 -0
- package/dist/core/model/model-permission.js +90 -0
- package/dist/core/permission/approval-gateway.js +1017 -0
- package/dist/core/permission/ec-command-parser.js +347 -0
- package/dist/core/permission/execution-sandbox.js +16 -0
- package/dist/core/permission/index.js +6 -0
- package/dist/core/permission/mode.js +24 -0
- package/dist/core/permission/sandbox-runtime.js +265 -0
- package/dist/core/permission/tool-policy.js +987 -0
- package/dist/core/permission/unix-socket-policy.js +99 -0
- package/dist/core/protected-paths.js +330 -0
- package/dist/core/relation/peer-identity.js +222 -0
- package/dist/core/relation/peer-key.js +1 -0
- package/dist/core/role/runtime-policy.js +141 -0
- package/dist/core/session/adapters/claude-session-file-adapter.js +218 -0
- package/dist/core/session/adapters/codex-session-file-adapter.js +333 -0
- package/dist/core/session/adapters/gemini-session-file-adapter.js +181 -0
- package/dist/core/session/session-file-adapter.js +7 -0
- package/dist/core/session/session-file-health.js +45 -0
- package/dist/core/session/session-fs-store.js +232 -0
- package/dist/core/session/session-key.js +24 -0
- package/dist/core/session/session-manager.js +1587 -0
- package/dist/core/session/session-mapper.js +100 -0
- package/dist/core/session/session-renew.js +314 -0
- package/dist/core/session/session-title.js +128 -0
- package/dist/core/session/session-turn-coordinator.js +205 -0
- package/dist/core/session/session-turns.js +67 -0
- package/dist/core/system-channels.js +29 -0
- package/dist/eck/baseagent-caps.js +18 -0
- package/dist/eck/detect.js +47 -0
- package/dist/eck/group-rules-sync.js +345 -0
- package/dist/eck/init.js +77 -0
- package/dist/eck/kit-renderer.js +359 -0
- package/dist/eck/manifest-engine.js +446 -0
- package/dist/eck/message-renderer.js +199 -0
- package/dist/eck/rules-loader.js +28 -0
- package/dist/index.js +2870 -4
- package/dist/ipc.js +748 -0
- package/dist/paths.js +262 -0
- package/dist/product.js +18 -0
- package/dist/response-system/context-builder.js +71 -0
- package/dist/response-system/coordinator.js +117 -0
- package/dist/response-system/decision-executor.js +86 -0
- package/dist/response-system/engines/v1/index.js +21 -0
- package/dist/response-system/engines/v1/interactive-flow.js +27 -0
- package/dist/response-system/engines/v1/proactive-flow.js +137 -0
- package/dist/response-system/engines/v1/types.js +1 -0
- package/dist/response-system/extensions.js +41 -0
- package/dist/response-system/index.js +6 -0
- package/dist/response-system/modes/index.js +7 -0
- package/dist/response-system/modes/single-session/index.js +72 -0
- package/dist/response-system/queues/fifo-queue.js +44 -0
- package/dist/response-system/queues/index.js +6 -0
- package/dist/response-system/queues/lifo-queue.js +42 -0
- package/dist/response-system/queues/priority-queue.js +63 -0
- package/dist/response-system/registry.js +97 -0
- package/dist/response-system/resolver.js +37 -0
- package/dist/response-system/selector.js +23 -0
- package/dist/response-system/types.js +7 -0
- package/dist/stats/billing.js +151 -0
- package/dist/stats/budget.js +93 -0
- package/dist/stats/db.js +403 -0
- package/dist/stats/eck-vars.js +89 -0
- package/dist/stats/index.js +11 -0
- package/dist/stats/normalizer.js +80 -0
- package/dist/stats/price-resolver.js +138 -0
- package/dist/stats/query.js +763 -0
- package/dist/stats/role-budget.js +168 -0
- package/dist/stats/writer.js +151 -0
- package/dist/trigger/anomaly-store.js +258 -0
- package/dist/trigger/audit.js +152 -0
- package/dist/trigger/event-source.js +119 -0
- package/dist/trigger/feedback.js +685 -0
- package/dist/trigger/history.js +290 -0
- package/dist/trigger/manager.js +291 -0
- package/dist/trigger/parser.js +520 -0
- package/dist/trigger/patch.js +148 -0
- package/dist/trigger/scheduler.js +1600 -0
- package/dist/trigger/script-executor.js +155 -0
- package/dist/trigger/state.js +145 -0
- package/dist/trigger/types.js +1 -0
- package/dist/trigger/validation.js +621 -0
- package/dist/types.js +12 -0
- package/dist/utils/aid-bind.js +299 -0
- package/dist/utils/atomic-write.js +95 -0
- package/dist/utils/avatar-upload.js +123 -0
- package/dist/utils/cross-platform.js +297 -0
- package/dist/utils/ecweb-utils.js +73 -0
- package/dist/utils/error-dict.json +153 -0
- package/dist/utils/error-utils.js +349 -0
- package/dist/utils/instance-registry.js +437 -0
- package/dist/utils/locale.js +21 -0
- package/dist/utils/log-writer.js +224 -0
- package/dist/utils/logger.js +89 -0
- package/dist/utils/markdown-to-plain-text.js +20 -0
- package/dist/utils/media-cache.js +271 -0
- package/dist/utils/model-prices.jsonl +17 -0
- package/dist/utils/npm-ops.js +210 -0
- package/dist/utils/process-introspect.js +133 -0
- package/dist/utils/process-tree-stats.js +271 -0
- package/dist/utils/project-path.js +74 -0
- package/dist/utils/stats.js +410 -0
- package/dist/utils/tool-summary.js +284 -0
- package/dist/utils/welcome.js +268 -0
- package/kits/docs/GUIDE.md +20 -0
- package/kits/docs/INDEX.md +65 -0
- package/kits/docs/aun/CHEATSHEET.md +19 -0
- package/kits/docs/aun/SYNC_PROTOCOL.md +15 -0
- package/kits/docs/channels/aun.md +65 -0
- package/kits/docs/channels/feishu.md +56 -0
- package/kits/docs/context-assembly.md +366 -0
- package/kits/docs/eck_templates/GUIDE.template.md +22 -0
- package/kits/docs/eck_templates/INDEX.template.md +28 -0
- package/kits/docs/eck_templates/path-registry.template.md +33 -0
- package/kits/docs/eck_templates/runtime.template.md +19 -0
- package/kits/docs/evolcore/INDEX.md +66 -0
- package/kits/docs/evolcore/agent.md +69 -0
- package/kits/docs/evolcore/aid.md +49 -0
- package/kits/docs/evolcore/config.md +149 -0
- package/kits/docs/evolcore/ctl.md +46 -0
- package/kits/docs/evolcore/event.md +216 -0
- package/kits/docs/evolcore/fs-architecture.md +1215 -0
- package/kits/docs/evolcore/fs.md +101 -0
- package/kits/docs/evolcore/group-fs.md +17 -0
- package/kits/docs/evolcore/group-rules.md +226 -0
- package/kits/docs/evolcore/group.md +141 -0
- package/kits/docs/evolcore/model.md +47 -0
- package/kits/docs/evolcore/msg.md +130 -0
- package/kits/docs/evolcore/response.md +80 -0
- package/kits/docs/evolcore/rpc.md +35 -0
- package/kits/docs/evolcore/self-summary.md +29 -0
- package/kits/docs/evolcore/stats.md +70 -0
- package/kits/docs/evolcore/storage.md +49 -0
- package/kits/docs/evolcore/trigger.md +524 -0
- package/kits/docs/identity/AID_PROFILE_SPEC.md +26 -0
- package/kits/docs/identity/PATH_OPS.md +16 -0
- package/kits/docs/identity/ROLE_DETAIL.md +23 -0
- package/kits/docs/identity/identity-tools.md +26 -0
- package/kits/docs/path-registry.md +43 -0
- package/kits/docs/prompt-loading-architecture.md +266 -0
- package/kits/docs/venues/aun-group.md +45 -0
- package/kits/docs/venues/aun-private.md +10 -0
- package/kits/docs/venues/client-desktop.md +10 -0
- package/kits/docs/venues/client-mobile.md +10 -0
- package/kits/docs/venues/feishu-group.md +13 -0
- package/kits/docs/venues/feishu-private.md +9 -0
- package/kits/docs/venues/group.md +25 -0
- package/kits/docs/venues/private.md +10 -0
- package/kits/eck_manifest.auxiliary.json +43 -0
- package/kits/eck_manifest.json +191 -0
- package/kits/eck_message_manifest.json +63 -0
- package/kits/migrations/README-role-config-v4.md +32 -0
- package/kits/migrations/migrate-role-config-v4.mjs +623 -0
- package/kits/migrations/migrate-role-config-v5.mjs +346 -0
- package/kits/migrations/rename-config-file.mjs +99 -0
- package/kits/rules/01-overview.md +142 -0
- package/kits/rules/02-navigation.md +76 -0
- package/kits/rules/03-identity.md +34 -0
- package/kits/rules/04-relation.md +59 -0
- package/kits/rules/05-venue.md +44 -0
- package/kits/rules/06-channel.md +59 -0
- package/kits/schemas/_meta.json +29 -0
- package/kits/schemas/agent-config.schema.1.json +177 -0
- package/kits/schemas/agent-config.schema.2.json +239 -0
- package/kits/schemas/agent-config.schema.3.json +119 -0
- package/kits/schemas/agent-config.schema.4.json +208 -0
- package/kits/schemas/agent-config.schema.5.json +326 -0
- package/kits/schemas/contact-book.schema.1.json +36 -0
- package/kits/schemas/daemon.schema.1.json +90 -0
- package/kits/schemas/defaults.schema.1.json +81 -0
- package/kits/schemas/menu-exec-schema-commands.md +208 -0
- package/kits/schemas/migrations/README.md +28 -0
- package/kits/schemas/relation-config.schema.1.json +158 -0
- package/kits/schemas/relation-config.schema.2.json +73 -0
- package/kits/schemas/relation-config.schema.3.json +50 -0
- package/kits/schemas/relation-config.schema.4.json +47 -0
- package/kits/schemas/role-config.schema.1.json +200 -0
- package/kits/schemas/role-registry.schema.1.json +35 -0
- package/kits/schemas/single-session.schema.1.json +31 -0
- package/kits/templates/bootstrap-welcome.md +15 -0
- package/kits/templates/message-fragments/handoff-request-to-target.md +13 -0
- package/kits/templates/message-fragments/handoff-response-to-origin.md +10 -0
- package/kits/templates/message-fragments/inject-default.md +2 -0
- package/kits/templates/message-fragments/item.md +2 -0
- package/kits/templates/roles/admin.json +8 -0
- package/kits/templates/roles/member.json +40 -0
- package/kits/templates/roles/owner.json +8 -0
- package/kits/templates/roles/visitor.json +39 -0
- package/kits/templates/system-fragments/baseagent.md +14 -0
- package/kits/templates/system-fragments/bootstrap.md +16 -0
- package/kits/templates/system-fragments/channel.md +48 -0
- package/kits/templates/system-fragments/commands.md +26 -0
- package/kits/templates/system-fragments/identity.md +11 -0
- package/kits/templates/system-fragments/relation.md +19 -0
- package/kits/templates/system-fragments/session.md +53 -0
- package/kits/templates/system-fragments/venue.md +31 -0
- package/package.json +50 -15
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { resolvePaths } from '../paths.js';
|
|
4
|
+
import { ipcQuery } from '../ipc.js';
|
|
5
|
+
import { isHelpFlag } from './help.js';
|
|
6
|
+
import { AGENT_DELEGATION_TOKEN_ENV } from '../core/auth/agent-delegation.js';
|
|
7
|
+
import { readTaskRuntimeContextFromEnv } from './task-context.js';
|
|
8
|
+
import { normalizeTriggerDefinition, resolveScriptPath, } from '../trigger/validation.js';
|
|
9
|
+
export async function cmdTrigger(args) {
|
|
10
|
+
const sub = args[0];
|
|
11
|
+
if (!sub || isHelpFlag(sub)) {
|
|
12
|
+
printHelp();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (sub === 'template') {
|
|
16
|
+
handleTemplate(args.slice(1));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const rest = args.slice(1);
|
|
20
|
+
const json = hasFlag(rest, '--json') || flagValue(rest, '--format') === 'json';
|
|
21
|
+
try {
|
|
22
|
+
switch (sub) {
|
|
23
|
+
case 'list':
|
|
24
|
+
await listTriggers(rest, json);
|
|
25
|
+
return;
|
|
26
|
+
case 'show':
|
|
27
|
+
await showTrigger(rest, json);
|
|
28
|
+
return;
|
|
29
|
+
case 'history':
|
|
30
|
+
await showHistory(rest, json);
|
|
31
|
+
return;
|
|
32
|
+
case 'create':
|
|
33
|
+
await createTrigger(rest, json);
|
|
34
|
+
return;
|
|
35
|
+
case 'update':
|
|
36
|
+
await updateTrigger(rest, json);
|
|
37
|
+
return;
|
|
38
|
+
case 'enable':
|
|
39
|
+
case 'disable':
|
|
40
|
+
await setEnabled(rest, sub === 'enable', json);
|
|
41
|
+
return;
|
|
42
|
+
case 'cancel':
|
|
43
|
+
await cancelTrigger(rest, json);
|
|
44
|
+
return;
|
|
45
|
+
case 'delete':
|
|
46
|
+
case 'remove':
|
|
47
|
+
case 'rm':
|
|
48
|
+
await deleteTrigger(rest, json);
|
|
49
|
+
return;
|
|
50
|
+
case 'run':
|
|
51
|
+
await runTrigger(rest, json);
|
|
52
|
+
return;
|
|
53
|
+
default:
|
|
54
|
+
throw new Error(`unknown trigger subcommand: ${sub}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (json)
|
|
59
|
+
console.log(JSON.stringify({ ok: false, error: err?.message || String(err) }, null, 2));
|
|
60
|
+
else
|
|
61
|
+
console.error(err?.message || String(err));
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function printHelp() {
|
|
66
|
+
console.log(`用法: ec trigger <subcommand>
|
|
67
|
+
|
|
68
|
+
命令:
|
|
69
|
+
list [--agent <aid>] [--all] [--json]
|
|
70
|
+
show [--agent <aid>] <triggerId> [--json]
|
|
71
|
+
history [--agent <aid>] [triggerId] [--limit <n>] [--json]
|
|
72
|
+
create --file <trigger.json|trigger-dir> [--enable] [--json]
|
|
73
|
+
OR
|
|
74
|
+
create [--agent <aid>] --cron <expr>|--event <pattern> --prompt <text> [--enable] [其他flag]
|
|
75
|
+
update [--agent <aid>] <triggerId> <参数...> [--if-revision <sha256:...>] [--json]
|
|
76
|
+
enable [--agent <aid>] <triggerId>
|
|
77
|
+
disable [--agent <aid>] <triggerId>
|
|
78
|
+
cancel [--agent <aid>] <triggerId> (disable 的兼容别名)
|
|
79
|
+
delete [--agent <aid>] <triggerId>
|
|
80
|
+
run [--agent <aid>] <triggerId> [--dry-run] [--json]
|
|
81
|
+
template list|show <name> [--json]
|
|
82
|
+
|
|
83
|
+
Create 参数模式支持:
|
|
84
|
+
--once | --delay <时长> | --at <ISO时间> | --cron <表达式> | --every <时长> | --event <事件模式>
|
|
85
|
+
--exec <script|trigger-session|target-session>
|
|
86
|
+
--prompt <文本>
|
|
87
|
+
--script-path <路径> --script-runtime <node|python|bash>
|
|
88
|
+
--feedback <target|origin|silent> (create 参数模式仅支持 target)
|
|
89
|
+
--model <模型> --effort <low|medium|high|xhigh|max>
|
|
90
|
+
--max-runs <次数> --max-duration <时长: 30s|15m|2h|1d>
|
|
91
|
+
--permission <readonly|auto|request|bypass>(省略则继承当前身份配置)
|
|
92
|
+
--tz <时区> (仅 cron)
|
|
93
|
+
--target-channel <channelKey> --target-channel-id <ID> (AUN 可简写为 aun)
|
|
94
|
+
--target-session <main|thread> [--target-thread-id <threadId>]
|
|
95
|
+
--trigger-thread <per-run|by-trigger>
|
|
96
|
+
--name <名称>
|
|
97
|
+
|
|
98
|
+
Update 仅支持常用字段:
|
|
99
|
+
--once | --delay | --at | --cron | --every | --event [--tz]
|
|
100
|
+
--prompt <文本> --name <名称>
|
|
101
|
+
--model <模型> --effort <强度> --permission <权限模式|inherit>(inherit 清除覆盖)
|
|
102
|
+
--max-runs <次数> --max-duration <时长>
|
|
103
|
+
--concurrency <forbid|replace|allow> --missed-policy <skip|run-once|run-all>
|
|
104
|
+
|
|
105
|
+
省略 --agent 时使用当前 agent AID;仅在跨身份操作或无会话上下文时需要显式指定。`);
|
|
106
|
+
}
|
|
107
|
+
async function listTriggers(args, json) {
|
|
108
|
+
const agentAid = resolveAgentAid(args);
|
|
109
|
+
const res = await request({ type: 'trigger.list', agentAid, all: hasFlag(args, '--all') });
|
|
110
|
+
if (json)
|
|
111
|
+
return printJson(res);
|
|
112
|
+
const triggers = res.triggers;
|
|
113
|
+
if (triggers.length === 0) {
|
|
114
|
+
console.log('(无 trigger)');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
for (const t of triggers) {
|
|
118
|
+
console.log(`${t.enabled ? 'on ' : 'off'} ${t.id} ${t.name} ${sourceLabel(t)}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function showTrigger(args, json) {
|
|
122
|
+
const agentAid = resolveAgentAid(args);
|
|
123
|
+
const triggerId = positional(args, 0, ['--agent']);
|
|
124
|
+
const res = await request({ type: 'trigger.show', agentAid, triggerId });
|
|
125
|
+
if (json)
|
|
126
|
+
return printJson(res);
|
|
127
|
+
const t = res.definition;
|
|
128
|
+
console.log(`${t.name} (${t.id})`);
|
|
129
|
+
console.log(`agent: ${t.agentAid}`);
|
|
130
|
+
console.log(`enabled: ${t.enabled}`);
|
|
131
|
+
console.log(`source: ${sourceLabel(t)}`);
|
|
132
|
+
if (t.limits?.maxRuns !== undefined || t.limits?.maxDuration !== undefined) {
|
|
133
|
+
console.log(`limits: ${[
|
|
134
|
+
t.limits.maxRuns !== undefined ? `maxRuns=${t.limits.maxRuns}` : undefined,
|
|
135
|
+
t.limits.maxDuration !== undefined ? `maxDuration=${t.limits.maxDuration}` : undefined,
|
|
136
|
+
].filter(Boolean).join(', ')}`);
|
|
137
|
+
}
|
|
138
|
+
const limitState = res.limitState;
|
|
139
|
+
if (limitState) {
|
|
140
|
+
const parts = [
|
|
141
|
+
`runCount=${limitState.runCount}`,
|
|
142
|
+
`startedAt=${new Date(limitState.startedAt).toISOString()}`,
|
|
143
|
+
limitState.disabledReason ? `disabledReason=${limitState.disabledReason}` : undefined,
|
|
144
|
+
].filter(Boolean);
|
|
145
|
+
if (t.limits?.maxDuration) {
|
|
146
|
+
const expiresAt = limitState.startedAt + limitDurationMs(t.limits.maxDuration);
|
|
147
|
+
parts.push(`expiresAt=${new Date(expiresAt).toISOString()}`);
|
|
148
|
+
}
|
|
149
|
+
console.log(`limit state: ${parts.join(', ')}`);
|
|
150
|
+
}
|
|
151
|
+
console.log(`execution: ${t.execution.type}`);
|
|
152
|
+
if (t.execution.type === 'script')
|
|
153
|
+
console.log(`script: ${scriptCommandLabel(t.execution.script)}`);
|
|
154
|
+
console.log(`model: ${t.execution.model ?? 'inherit'}`);
|
|
155
|
+
console.log(`effort: ${t.execution.effort ?? 'inherit'}`);
|
|
156
|
+
console.log(`permission: ${t.execution.permissionMode ?? 'inherit'}`);
|
|
157
|
+
console.log(`feedback: ${t.feedback.strategy}${t.feedback.target ? ` -> ${t.feedback.target.channelKey}/${t.feedback.target.channelId}/${t.feedback.target.session}` : ''}`);
|
|
158
|
+
const active = Array.isArray(res.active) ? res.active : [];
|
|
159
|
+
console.log(`active runs: ${active.length}`);
|
|
160
|
+
const recent = Array.isArray(res.recentRuns) ? res.recentRuns : [];
|
|
161
|
+
if (recent.length > 0) {
|
|
162
|
+
console.log('recent:');
|
|
163
|
+
for (const r of recent.slice(0, 5)) {
|
|
164
|
+
console.log(` ${r.status.padEnd(9)} ${r.reason ?? ''} ${new Date(r.finishedAt).toISOString()} ${r.runId}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async function showHistory(args, json) {
|
|
169
|
+
const agentAid = resolveAgentAid(args);
|
|
170
|
+
const triggerId = optionalPositional(args, 0, ['--agent', '--limit', '--format']);
|
|
171
|
+
const rawLimit = flagValue(args, '--limit');
|
|
172
|
+
const limit = rawLimit === undefined ? 100 : Number(rawLimit);
|
|
173
|
+
if (!Number.isInteger(limit) || limit <= 0 || limit > 10_000) {
|
|
174
|
+
throw new Error('--limit 必须是 1 到 10000 的整数');
|
|
175
|
+
}
|
|
176
|
+
const res = await request({ type: 'trigger.history', agentAid, triggerId, limit });
|
|
177
|
+
if (json)
|
|
178
|
+
return printJson(res);
|
|
179
|
+
const events = Array.isArray(res.events) ? res.events : [];
|
|
180
|
+
if (events.length === 0) {
|
|
181
|
+
console.log('(无 trigger history)');
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
for (const event of events) {
|
|
185
|
+
const timestamp = new Date(event.timestamp).toISOString();
|
|
186
|
+
const detail = event.audit
|
|
187
|
+
? `${event.audit.status} ${event.audit.runId}`
|
|
188
|
+
: event.legacyRecord
|
|
189
|
+
? `${event.legacyRecord.name ?? ''} ${event.legacyRecord.doneReason ?? ''}`.trim()
|
|
190
|
+
: `${event.definition?.name ?? ''} ${event.revision ?? ''}`.trim();
|
|
191
|
+
console.log(`${timestamp} ${event.type.padEnd(18)} ${event.triggerId} ${detail}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
async function createTrigger(args, json) {
|
|
195
|
+
// Support two modes: --file (full JSON) or flags (parser-based)
|
|
196
|
+
if (hasFlag(args, '--file')) {
|
|
197
|
+
const file = requireFlag(args, '--file');
|
|
198
|
+
const { definition, files } = loadDefinitionWithFiles(file);
|
|
199
|
+
const res = await request({
|
|
200
|
+
type: 'trigger.create',
|
|
201
|
+
definition,
|
|
202
|
+
files,
|
|
203
|
+
enable: hasFlag(args, '--enable') ? true : undefined,
|
|
204
|
+
}, 30_000);
|
|
205
|
+
if (json)
|
|
206
|
+
return printJson(res);
|
|
207
|
+
console.log(`✓ created ${res.trigger.id} (${res.trigger.name})`);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// Flag mode: use parser
|
|
211
|
+
const { parseTriggerSet } = await import('../trigger/parser.js');
|
|
212
|
+
const flagStr = args.filter(a => a !== '--enable' && a !== '--json' && !a.startsWith('--format')).join(' ');
|
|
213
|
+
const parseResult = parseTriggerSet(flagStr);
|
|
214
|
+
if (!parseResult.ok) {
|
|
215
|
+
throw new Error(parseResult.error);
|
|
216
|
+
}
|
|
217
|
+
const parsed = parseResult.value;
|
|
218
|
+
const agentAid = parsed.agentId ?? resolveAgentAid(args);
|
|
219
|
+
if (parsed.feedbackStrategy !== 'target') {
|
|
220
|
+
throw new Error('CLI flag 模式仅支持 --feedback target;origin/silent 请使用 /trigger 或 --file 导入 Trigger V3 第二阶段 JSON');
|
|
221
|
+
}
|
|
222
|
+
if (!parsed.targetChannel || !parsed.targetChannelId) {
|
|
223
|
+
throw new Error('CLI flag 模式需要显式指定 --target-channel <channelKey> --target-channel-id <id>');
|
|
224
|
+
}
|
|
225
|
+
const now = Date.now();
|
|
226
|
+
if (parsed.targetSession === 'thread' && !parsed.targetThreadId) {
|
|
227
|
+
throw new Error('--target-session thread 需要 --target-thread-id');
|
|
228
|
+
}
|
|
229
|
+
const script = parsed.scriptPath ? {
|
|
230
|
+
path: parsed.scriptPath,
|
|
231
|
+
runtime: parsed.scriptRuntime,
|
|
232
|
+
args: parsed.scriptArgs,
|
|
233
|
+
timeoutMs: parsed.scriptTimeoutMs ?? 30_000,
|
|
234
|
+
} : undefined;
|
|
235
|
+
const definition = {
|
|
236
|
+
$schema_version: 3.1,
|
|
237
|
+
agentAid,
|
|
238
|
+
name: parsed.name || `trigger-${now.toString(36)}`,
|
|
239
|
+
enabled: hasFlag(args, '--enable'),
|
|
240
|
+
createdAt: now,
|
|
241
|
+
updatedAt: now,
|
|
242
|
+
source: sourceFromParsed(parsed),
|
|
243
|
+
execution: {
|
|
244
|
+
type: parsed.executionType,
|
|
245
|
+
...(script ? { script } : { prompt: parsed.prompt }),
|
|
246
|
+
...(parsed.model ? { model: parsed.model } : {}),
|
|
247
|
+
...(parsed.effort ? { effort: parsed.effort } : {}),
|
|
248
|
+
...(parsed.permissionMode ? { permissionMode: parsed.permissionMode } : {}),
|
|
249
|
+
...(parsed.executionType === 'trigger_session' ? { thread: parsed.triggerThread ?? 'by_trigger' } : {}),
|
|
250
|
+
onError: 'retry',
|
|
251
|
+
noopSentinel: '[[NOOP]]',
|
|
252
|
+
},
|
|
253
|
+
feedback: {
|
|
254
|
+
strategy: 'target',
|
|
255
|
+
target: {
|
|
256
|
+
channelKey: parsed.targetChannel,
|
|
257
|
+
channelId: parsed.targetChannelId,
|
|
258
|
+
session: parsed.targetSession,
|
|
259
|
+
...(parsed.targetSession === 'thread' ? { threadId: parsed.targetThreadId } : {}),
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
reliability: { concurrency: 'forbid', missedPolicy: 'run_once', retry: { maxAttempts: 0, backoffMs: 30_000 } },
|
|
263
|
+
limits: limitsFromParsed(parsed),
|
|
264
|
+
};
|
|
265
|
+
const res = await request({
|
|
266
|
+
type: 'trigger.create',
|
|
267
|
+
definition,
|
|
268
|
+
files: [],
|
|
269
|
+
enable: hasFlag(args, '--enable') ? true : undefined,
|
|
270
|
+
}, 30_000);
|
|
271
|
+
if (json)
|
|
272
|
+
return printJson(res);
|
|
273
|
+
console.log(`✓ created ${res.trigger.id} (${res.trigger.name})`);
|
|
274
|
+
}
|
|
275
|
+
function sourceFromParsed(parsed) {
|
|
276
|
+
if (parsed.scheduleType === 'once')
|
|
277
|
+
return { type: 'once' };
|
|
278
|
+
if (parsed.scheduleType === 'delay')
|
|
279
|
+
return { type: 'delay', afterMs: Number(parsed.scheduleValue) };
|
|
280
|
+
if (parsed.scheduleType === 'at')
|
|
281
|
+
return { type: 'at', at: parsed.scheduleValue };
|
|
282
|
+
if (parsed.scheduleType === 'cron') {
|
|
283
|
+
const src = { type: 'cron', expression: parsed.scheduleValue };
|
|
284
|
+
if (parsed.timezone)
|
|
285
|
+
src.timezone = parsed.timezone;
|
|
286
|
+
return src;
|
|
287
|
+
}
|
|
288
|
+
if (parsed.scheduleType === 'interval')
|
|
289
|
+
return { type: 'interval', everyMs: Number(parsed.scheduleValue) };
|
|
290
|
+
if (parsed.scheduleType === 'event')
|
|
291
|
+
return { type: 'event', eventPattern: parsed.scheduleValue };
|
|
292
|
+
throw new Error(`unsupported scheduleType: ${parsed.scheduleType}`);
|
|
293
|
+
}
|
|
294
|
+
function limitsFromParsed(parsed) {
|
|
295
|
+
const limits = {};
|
|
296
|
+
if (parsed.maxRuns !== undefined)
|
|
297
|
+
limits.maxRuns = parsed.maxRuns;
|
|
298
|
+
if (parsed.maxDuration !== undefined)
|
|
299
|
+
limits.maxDuration = parsed.maxDuration;
|
|
300
|
+
return Object.keys(limits).length > 0 ? limits : undefined;
|
|
301
|
+
}
|
|
302
|
+
function limitDurationMs(value) {
|
|
303
|
+
const amount = Number(value.slice(0, -1));
|
|
304
|
+
const unit = value.slice(-1);
|
|
305
|
+
if (unit === 'd')
|
|
306
|
+
return amount * 86_400_000;
|
|
307
|
+
if (unit === 'h')
|
|
308
|
+
return amount * 3_600_000;
|
|
309
|
+
if (unit === 'm')
|
|
310
|
+
return amount * 60_000;
|
|
311
|
+
return amount * 1_000;
|
|
312
|
+
}
|
|
313
|
+
function scriptCommandLabel(script) {
|
|
314
|
+
const args = Array.isArray(script.args) ? script.args.map(arg => shellQuoteArg(String(arg))).join(' ') : '';
|
|
315
|
+
const command = shellQuoteArg(script.path);
|
|
316
|
+
return `${script.runtime} ${command}${args ? ` ${args}` : ''}`;
|
|
317
|
+
}
|
|
318
|
+
function shellQuoteArg(value) {
|
|
319
|
+
if (!value)
|
|
320
|
+
return "''";
|
|
321
|
+
return /[\s"'\\]/.test(value) ? `"${value.replace(/(["\\$`])/g, '\\$1')}"` : value;
|
|
322
|
+
}
|
|
323
|
+
async function updateTrigger(args, json) {
|
|
324
|
+
const agentAid = resolveAgentAid(args);
|
|
325
|
+
const triggerId = positional(args, 0, ['--agent', '--format', '--if-revision']);
|
|
326
|
+
const { parseTriggerUpdateArgv } = await import('../trigger/parser.js');
|
|
327
|
+
const parsed = parseTriggerUpdateArgv(triggerId, triggerUpdateArgs(args));
|
|
328
|
+
if (!parsed.ok)
|
|
329
|
+
throw new Error(parsed.error);
|
|
330
|
+
const expectedRevision = flagValue(args, '--if-revision');
|
|
331
|
+
const res = await request({
|
|
332
|
+
type: 'trigger.update',
|
|
333
|
+
agentAid,
|
|
334
|
+
triggerId,
|
|
335
|
+
patch: parsed.value,
|
|
336
|
+
...(expectedRevision ? { expectedRevision } : {}),
|
|
337
|
+
}, 30_000);
|
|
338
|
+
if (json)
|
|
339
|
+
return printJson(res);
|
|
340
|
+
console.log(`✓ updated ${res.trigger.id} (${res.trigger.name})`);
|
|
341
|
+
}
|
|
342
|
+
function triggerUpdateArgs(args) {
|
|
343
|
+
const out = [];
|
|
344
|
+
let skippedTriggerId = false;
|
|
345
|
+
for (let i = 0; i < args.length; i++) {
|
|
346
|
+
const arg = args[i];
|
|
347
|
+
if (arg === '--json')
|
|
348
|
+
continue;
|
|
349
|
+
if (arg.startsWith('--format=') || arg.startsWith('--agent=') || arg.startsWith('--if-revision='))
|
|
350
|
+
continue;
|
|
351
|
+
if (arg === '--format' || arg === '--agent' || arg === '--if-revision') {
|
|
352
|
+
i += 1;
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
if (!skippedTriggerId && !arg.startsWith('-')) {
|
|
356
|
+
skippedTriggerId = true;
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
out.push(arg);
|
|
360
|
+
}
|
|
361
|
+
return out;
|
|
362
|
+
}
|
|
363
|
+
async function setEnabled(args, enabled, json) {
|
|
364
|
+
const agentAid = resolveAgentAid(args);
|
|
365
|
+
const triggerId = positional(args, 0, ['--agent']);
|
|
366
|
+
const res = await request({ type: 'trigger.setEnabled', agentAid, triggerId, enabled });
|
|
367
|
+
if (json)
|
|
368
|
+
return printJson(res);
|
|
369
|
+
console.log(`✓ ${enabled ? 'enabled' : 'disabled'} ${res.trigger.id}`);
|
|
370
|
+
}
|
|
371
|
+
async function cancelTrigger(args, json) {
|
|
372
|
+
const agentAid = resolveAgentAid(args);
|
|
373
|
+
const triggerId = positional(args, 0, ['--agent']);
|
|
374
|
+
const res = await request({ type: 'trigger.cancel', agentAid, triggerId });
|
|
375
|
+
if (json)
|
|
376
|
+
return printJson(res);
|
|
377
|
+
console.log(`✓ disabled ${res.trigger.id}`);
|
|
378
|
+
}
|
|
379
|
+
async function deleteTrigger(args, json) {
|
|
380
|
+
const agentAid = resolveAgentAid(args);
|
|
381
|
+
const triggerId = positional(args, 0, ['--agent']);
|
|
382
|
+
const res = await request({ type: 'trigger.delete', agentAid, triggerId });
|
|
383
|
+
if (json)
|
|
384
|
+
return printJson(res);
|
|
385
|
+
console.log(`✓ deleted ${res.trigger.id}`);
|
|
386
|
+
}
|
|
387
|
+
async function runTrigger(args, json) {
|
|
388
|
+
const agentAid = resolveAgentAid(args);
|
|
389
|
+
const triggerId = positional(args, 0, ['--agent']);
|
|
390
|
+
const res = await request({ type: 'trigger.run', agentAid, triggerId, dryRun: hasFlag(args, '--dry-run') }, 120_000);
|
|
391
|
+
if (json)
|
|
392
|
+
return printJson(res);
|
|
393
|
+
const result = res.result;
|
|
394
|
+
console.log(`${result.status}${result.reason ? ` (${result.reason})` : ''}: ${result.runId}`);
|
|
395
|
+
if (result.error)
|
|
396
|
+
console.log(result.error);
|
|
397
|
+
}
|
|
398
|
+
function handleTemplate(args) {
|
|
399
|
+
const sub = args[0] || 'list';
|
|
400
|
+
const json = hasFlag(args, '--json') || flagValue(args, '--format') === 'json';
|
|
401
|
+
if (sub === 'list') {
|
|
402
|
+
if (json)
|
|
403
|
+
printJson({ ok: true, templates: [] });
|
|
404
|
+
else
|
|
405
|
+
console.log('(无内置 trigger template)');
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
if (sub === 'show') {
|
|
409
|
+
const name = args.find(a => !a.startsWith('-') && a !== 'show');
|
|
410
|
+
if (!name)
|
|
411
|
+
throw new Error('missing template name');
|
|
412
|
+
if (json)
|
|
413
|
+
printJson({ ok: false, error: `template not found: ${name}` });
|
|
414
|
+
else
|
|
415
|
+
console.log(`template not found: ${name}`);
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
throw new Error(`unknown template subcommand: ${sub}`);
|
|
419
|
+
}
|
|
420
|
+
async function request(cmd, timeoutMs = 10_000) {
|
|
421
|
+
const actorSessionId = process.env.EVOLCORE_SESSION_ID;
|
|
422
|
+
const delegationToken = process.env[AGENT_DELEGATION_TOKEN_ENV];
|
|
423
|
+
let controlToken;
|
|
424
|
+
if (!actorSessionId) {
|
|
425
|
+
try {
|
|
426
|
+
controlToken = fs.readFileSync(resolvePaths().controlToken, 'utf8').trim() || undefined;
|
|
427
|
+
}
|
|
428
|
+
catch { }
|
|
429
|
+
}
|
|
430
|
+
const res = await ipcQuery(resolvePaths().socket, actorSessionId ? { ...cmd, actorSessionId, delegationToken } : { ...cmd, controlToken }, timeoutMs);
|
|
431
|
+
if (!res)
|
|
432
|
+
throw new Error('错误: 无法连接 evolcore 服务');
|
|
433
|
+
if (res.ok === false || res.error)
|
|
434
|
+
throw new Error(res.error || 'trigger command failed');
|
|
435
|
+
return res;
|
|
436
|
+
}
|
|
437
|
+
function loadDefinitionWithFiles(inputPath) {
|
|
438
|
+
const stat = fs.statSync(inputPath);
|
|
439
|
+
const baseDir = stat.isDirectory() ? inputPath : path.dirname(inputPath);
|
|
440
|
+
const jsonPath = stat.isDirectory() ? path.join(inputPath, 'trigger.json') : inputPath;
|
|
441
|
+
const definition = normalizeTriggerDefinition(JSON.parse(fs.readFileSync(jsonPath, 'utf-8')));
|
|
442
|
+
const files = [];
|
|
443
|
+
if (definition.execution.type === 'script') {
|
|
444
|
+
const scriptAbs = resolveScriptPath(baseDir, definition.execution.script.path);
|
|
445
|
+
const relativePath = path.relative(baseDir, scriptAbs).replace(/\\/g, '/');
|
|
446
|
+
files.push({ relativePath, contentBase64: fs.readFileSync(scriptAbs).toString('base64') });
|
|
447
|
+
}
|
|
448
|
+
return { definition, files };
|
|
449
|
+
}
|
|
450
|
+
function sourceLabel(t) {
|
|
451
|
+
switch (t.source.type) {
|
|
452
|
+
case 'once': return 'once';
|
|
453
|
+
case 'delay': return `delay ${t.source.afterMs}ms`;
|
|
454
|
+
case 'at': return `at ${t.source.at}`;
|
|
455
|
+
case 'cron': return `cron ${t.source.expression}${t.source.timezone ? ` (${t.source.timezone})` : ''}`;
|
|
456
|
+
case 'interval': return `interval ${t.source.everyMs}ms`;
|
|
457
|
+
case 'event': return `event ${t.source.eventPattern}`;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
function resolveAgentAid(args) {
|
|
461
|
+
const aid = (flagValue(args, '--agent')
|
|
462
|
+
?? process.env.EVOLCORE_SELF_AID
|
|
463
|
+
?? readTaskRuntimeContextFromEnv()?.selfAid)?.trim();
|
|
464
|
+
if (!aid) {
|
|
465
|
+
throw new Error('missing --agent and no current agent context');
|
|
466
|
+
}
|
|
467
|
+
return aid;
|
|
468
|
+
}
|
|
469
|
+
function requireFlag(args, name) {
|
|
470
|
+
const value = flagValue(args, name);
|
|
471
|
+
if (!value)
|
|
472
|
+
throw new Error(`missing ${name}`);
|
|
473
|
+
return value;
|
|
474
|
+
}
|
|
475
|
+
function flagValue(args, name) {
|
|
476
|
+
const idx = args.indexOf(name);
|
|
477
|
+
if (idx >= 0 && idx + 1 < args.length)
|
|
478
|
+
return args[idx + 1];
|
|
479
|
+
const prefixed = args.find(a => a.startsWith(`${name}=`));
|
|
480
|
+
return prefixed ? prefixed.slice(name.length + 1) : undefined;
|
|
481
|
+
}
|
|
482
|
+
function hasFlag(args, name) {
|
|
483
|
+
return args.includes(name);
|
|
484
|
+
}
|
|
485
|
+
function positional(args, index, flagsWithValue) {
|
|
486
|
+
const value = optionalPositional(args, index, flagsWithValue);
|
|
487
|
+
if (!value)
|
|
488
|
+
throw new Error('missing triggerId');
|
|
489
|
+
return value;
|
|
490
|
+
}
|
|
491
|
+
function optionalPositional(args, index, flagsWithValue) {
|
|
492
|
+
const skip = new Set();
|
|
493
|
+
for (const flag of flagsWithValue) {
|
|
494
|
+
const idx = args.indexOf(flag);
|
|
495
|
+
if (idx >= 0) {
|
|
496
|
+
skip.add(idx);
|
|
497
|
+
skip.add(idx + 1);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
const values = args.filter((a, i) => !skip.has(i) && !a.startsWith('-'));
|
|
501
|
+
return values[index];
|
|
502
|
+
}
|
|
503
|
+
function printJson(value) {
|
|
504
|
+
console.log(JSON.stringify(value, null, 2));
|
|
505
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ec version — 显示所有组件版本和构建时间戳,便于诊断。
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
import { MAIN_PACKAGE_NAME, PRODUCT_DISPLAY_NAME, WEB_PACKAGE_NAME } from '../product.js';
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const PACKAGE_ROOT = path.resolve(__dirname, '../..');
|
|
10
|
+
const RESET = '\x1b[0m';
|
|
11
|
+
const BOLD = '\x1b[1m';
|
|
12
|
+
const DIM = '\x1b[2m';
|
|
13
|
+
const GREEN = '\x1b[32m';
|
|
14
|
+
const CYAN = '\x1b[36m';
|
|
15
|
+
function readPkgJson(dir) {
|
|
16
|
+
const f = path.join(dir, 'package.json');
|
|
17
|
+
if (!fs.existsSync(f))
|
|
18
|
+
return null;
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(fs.readFileSync(f, 'utf-8'));
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function getFileModTime(filePath) {
|
|
27
|
+
try {
|
|
28
|
+
const stat = fs.statSync(filePath);
|
|
29
|
+
return stat.mtime.toISOString().replace('T', ' ').slice(0, 19);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function findInstalledVersion(pkgName) {
|
|
36
|
+
// 从 PACKAGE_ROOT/node_modules 查找
|
|
37
|
+
const dir = path.join(PACKAGE_ROOT, 'node_modules', ...pkgName.split('/'));
|
|
38
|
+
const pkg = readPkgJson(dir);
|
|
39
|
+
if (!pkg)
|
|
40
|
+
return null;
|
|
41
|
+
// 取 dist/index.js 修改时间作为构建时间戳参考
|
|
42
|
+
const mainFile = path.join(dir, 'dist', 'index.js');
|
|
43
|
+
const ts = getFileModTime(mainFile) || getFileModTime(path.join(dir, 'index.js'));
|
|
44
|
+
return { name: pkg.name || pkgName, version: pkg.version || '?', buildTs: ts || undefined, path: dir };
|
|
45
|
+
}
|
|
46
|
+
export function handleVersion(args) {
|
|
47
|
+
const isJson = args.includes('--format') && args.includes('json') || args.includes('--json');
|
|
48
|
+
// 主包
|
|
49
|
+
const mainPkg = readPkgJson(PACKAGE_ROOT);
|
|
50
|
+
const mainEntry = path.join(PACKAGE_ROOT, 'dist', 'cli', 'index.js');
|
|
51
|
+
const mainTs = getFileModTime(mainEntry);
|
|
52
|
+
// ecweb 包
|
|
53
|
+
const ecwebDir = path.join(PACKAGE_ROOT, 'ecweb');
|
|
54
|
+
const ecwebPkg = readPkgJson(ecwebDir);
|
|
55
|
+
const ecwebEntry = path.join(ecwebDir, 'dist', 'index.js');
|
|
56
|
+
const ecwebTs = getFileModTime(ecwebEntry);
|
|
57
|
+
const ecwebStaticTs = getFileModTime(path.join(ecwebDir, 'dist', 'static', 'index.html'));
|
|
58
|
+
// 关键依赖
|
|
59
|
+
const deps = [
|
|
60
|
+
'@agentunion/fastaun',
|
|
61
|
+
'ws',
|
|
62
|
+
];
|
|
63
|
+
const components = [
|
|
64
|
+
{ name: MAIN_PACKAGE_NAME, version: mainPkg?.version || '?', built: mainTs || undefined, note: 'main package' },
|
|
65
|
+
{ name: WEB_PACKAGE_NAME, version: ecwebPkg?.version || '?', built: ecwebTs || undefined, note: `static: ${ecwebStaticTs || '?'}` },
|
|
66
|
+
];
|
|
67
|
+
for (const dep of deps) {
|
|
68
|
+
const info = findInstalledVersion(dep);
|
|
69
|
+
if (info) {
|
|
70
|
+
components.push({ name: info.name, version: info.version, built: info.buildTs || undefined });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Node.js 版本
|
|
74
|
+
components.push({ name: 'node', version: process.version, note: process.platform + '/' + process.arch });
|
|
75
|
+
if (isJson) {
|
|
76
|
+
console.log(JSON.stringify(components, null, 2));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
console.log(`\n${BOLD}🔧 ${PRODUCT_DISPLAY_NAME} Component Versions${RESET}\n`);
|
|
80
|
+
const nameW = Math.max(...components.map(c => c.name.length), 8);
|
|
81
|
+
const verW = Math.max(...components.map(c => c.version.length), 7);
|
|
82
|
+
for (const c of components) {
|
|
83
|
+
const builtStr = c.built ? `${DIM}built: ${c.built}${RESET}` : '';
|
|
84
|
+
const noteStr = c.note ? `${DIM}(${c.note})${RESET}` : '';
|
|
85
|
+
console.log(` ${CYAN}${c.name.padEnd(nameW)}${RESET} ${GREEN}${c.version.padEnd(verW)}${RESET} ${builtStr} ${noteStr}`);
|
|
86
|
+
}
|
|
87
|
+
console.log();
|
|
88
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
/** 去掉轮转后缀("daemon-20260518-21.log" → "daemon";"ts-sdk-2026-05-27.log" → "ts-sdk")。入参可为文件名或绝对路径。 */
|
|
3
|
+
export function shortLogName(file) {
|
|
4
|
+
return path.basename(file, '.log')
|
|
5
|
+
.replace(/-\d{8}-\d{2}$/, '') // -YYYYMMDD-HH(按小时轮转)
|
|
6
|
+
.replace(/-\d{4}-\d{2}-\d{2}$/, ''); // -YYYY-MM-DD(按日轮转,如 ts-sdk)
|
|
7
|
+
}
|
|
8
|
+
/** 从 .log 文件名列表推导去重、字母序的类型列表。 */
|
|
9
|
+
export function deriveLogTypes(files) {
|
|
10
|
+
const set = new Set();
|
|
11
|
+
for (const f of files) {
|
|
12
|
+
if (!f.endsWith('.log'))
|
|
13
|
+
continue;
|
|
14
|
+
set.add(shortLogName(f));
|
|
15
|
+
}
|
|
16
|
+
return [...set].sort();
|
|
17
|
+
}
|
|
18
|
+
/** 计算预勾集合:saved 为 undefined → 全勾;否则只勾命中 saved 的类型(新类型不勾)。 */
|
|
19
|
+
export function computePreChecked(types, saved) {
|
|
20
|
+
if (saved === undefined)
|
|
21
|
+
return new Set(types);
|
|
22
|
+
const savedSet = new Set(saved);
|
|
23
|
+
return new Set(types.filter(t => savedSet.has(t)));
|
|
24
|
+
}
|
|
25
|
+
/** 返回 requested 中不在 available 里的无效类型。 */
|
|
26
|
+
export function validateLogTypes(requested, available) {
|
|
27
|
+
const set = new Set(available);
|
|
28
|
+
return requested.filter(t => !set.has(t));
|
|
29
|
+
}
|
|
30
|
+
/** 只保留类型命中 filterTypes 的文件路径。 */
|
|
31
|
+
export function filterLogFiles(files, filterTypes) {
|
|
32
|
+
return files.filter(f => filterTypes.has(shortLogName(f)));
|
|
33
|
+
}
|