evolcore 0.0.3 → 0.0.5
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 +83 -0
- package/README.md +45 -10
- package/bin/ec-safe-output.js +89 -24
- package/dist/agents/baseagent.js +46 -0
- package/dist/agents/claude-runner.js +1 -31
- package/dist/agents/codex-app-server-client.js +68 -0
- package/dist/agents/codex-runner.js +157 -5
- package/dist/agents/runner-types.js +2 -2
- package/dist/aun/aid/agentmd.js +79 -0
- package/dist/aun/aid/encryption-seed-policy.js +29 -0
- package/dist/aun/aid/index.js +1 -1
- package/dist/aun/aid/store.js +2 -5
- package/dist/channels/aun.js +220 -112
- package/dist/channels/daemon.js +18 -4
- package/dist/channels/dingtalk.js +52 -137
- package/dist/channels/feishu.js +56 -4
- package/dist/channels/qqbot.js +23 -1
- package/dist/channels/wechat.js +303 -155
- package/dist/channels/wecom.js +383 -7
- package/dist/cli/aun-commands.js +11 -11
- package/dist/cli/daemon-commands.js +46 -15
- package/dist/cli/handoff-command.js +2 -1
- package/dist/cli/init-channel.js +185 -67
- package/dist/cli/init.js +49 -27
- package/dist/cli/trigger-command.js +92 -11
- package/dist/config/access-policy-domain.js +18 -0
- package/dist/config/access-policy.js +110 -0
- package/dist/config/builtin-role-templates.js +27 -14
- package/dist/config/builtin-roles.js +25 -6
- package/dist/config/config-field-policy.js +17 -5
- package/dist/config/config-manager.js +198 -22
- package/dist/config/config-operation-service.js +35 -38
- package/dist/config/contact-bind-code.js +274 -0
- package/dist/config/contact-book-store.js +173 -5
- package/dist/config/contact-book.js +32 -0
- package/dist/config/contact-operation-service.js +9 -3
- package/dist/config/contact-request-service.js +331 -0
- package/dist/config/peer-role-resolver.js +3 -1
- package/dist/config/schema-registry.js +49 -24
- package/dist/config-store.js +14 -2
- package/dist/core/auth/agent-delegation.js +105 -11
- package/dist/core/auth/authorization-audit.js +6 -0
- package/dist/core/auth/operation-authorizer.js +8 -0
- package/dist/core/auth/operation-catalog.js +51 -3
- package/dist/core/auth/trigger-authorization.js +15 -0
- package/dist/core/bootstrap-service.js +2 -9
- package/dist/core/channel-loader.js +6 -2
- package/dist/core/command/command-handler.js +10 -13
- package/dist/core/command/connect-menu.js +229 -26
- package/dist/core/command/evol-menu-version-gate.js +38 -0
- package/dist/core/command/group-menu.js +421 -0
- package/dist/core/command/menu-handler.js +269 -85
- package/dist/core/command/menu-protocol.js +8 -2
- package/dist/core/command/menu-token-store.js +102 -0
- package/dist/core/command/role-menu.js +16 -0
- package/dist/core/command/slash-gate.js +1 -1
- package/dist/core/command/slash-handler.js +158 -31
- package/dist/core/daemon-file-cache.js +28 -0
- package/dist/core/event-catalog.js +29 -0
- package/dist/core/evolagent-registry.js +4 -39
- package/dist/core/handoff/runtime.js +162 -37
- package/dist/core/handoff/store.js +46 -2
- package/dist/core/handoff/types.js +1 -0
- package/dist/core/inference/text-inference.js +16 -74
- package/dist/core/message/file-markers.js +7 -0
- package/dist/core/message/im-renderer.js +18 -14
- package/dist/core/message/inbound-admission.js +134 -0
- package/dist/core/message/message-bridge.js +616 -74
- package/dist/core/message/message-log.js +1 -0
- package/dist/core/message/message-queue.js +185 -10
- package/dist/core/message/peer-mode.js +7 -8
- package/dist/core/message/response-engine.js +381 -79
- package/dist/core/permission/approval-gateway.js +17 -10
- package/dist/core/permission/ec-command-parser.js +101 -46
- package/dist/core/permission/tool-policy.js +69 -24
- package/dist/core/protected-paths.js +36 -11
- package/dist/core/session/session-fs-store.js +19 -4
- package/dist/core/session/session-manager.js +232 -4
- package/dist/core/session/session-mapper.js +2 -0
- package/dist/core/session/session-renew.js +125 -69
- package/dist/core/session/session-turn-coordinator.js +5 -1
- package/dist/eck/kit-renderer.js +12 -1
- package/dist/eck/message-renderer.js +79 -1
- package/dist/index.js +224 -89
- package/dist/ipc.js +81 -4
- package/dist/paths.js +3 -0
- package/dist/response-system/config-resolver.js +29 -0
- package/dist/response-system/coordinator.js +8 -32
- package/dist/response-system/engines/v1/proactive-flow.js +1 -1
- package/dist/response-system/index.js +1 -0
- package/dist/response-system/modes/single-session/index.js +7 -4
- package/dist/trigger/parser.js +55 -15
- package/dist/trigger/patch.js +4 -1
- package/dist/trigger/scheduler.js +441 -39
- package/dist/utils/cross-platform.js +8 -2
- package/dist/utils/error-dict.json +7 -0
- package/dist/utils/evolcore-version.js +21 -0
- package/dist/utils/logger.js +2 -2
- package/dist/utils/process-introspect.js +19 -3
- package/dist/utils/stable-semver.js +21 -0
- package/dist/utils/stats.js +33 -9
- package/kits/docs/channels/aun.md +4 -13
- package/kits/docs/evolcore/INDEX.md +1 -1
- package/kits/docs/evolcore/config.md +47 -2
- package/kits/docs/evolcore/contact.md +8 -3
- package/kits/docs/evolcore/group-rules.md +46 -4
- package/kits/docs/evolcore/group.md +4 -4
- package/kits/docs/evolcore/msg.md +5 -5
- package/kits/docs/evolcore/trigger.md +25 -8
- package/kits/docs/path-registry.md +36 -17
- package/kits/eck_message_manifest.json +12 -1
- package/kits/migrations/migrate-contact-book-v2.mjs +7 -0
- package/kits/rules/01-overview.md +17 -7
- package/kits/rules/02-navigation.md +38 -18
- package/kits/rules/03-identity.md +28 -24
- package/kits/rules/04-relation.md +44 -28
- package/kits/rules/05-venue.md +31 -15
- package/kits/rules/06-channel.md +11 -7
- package/kits/schemas/_meta.json +18 -7
- package/kits/schemas/agent-config.schema.7.json +303 -0
- package/kits/schemas/agent-config.schema.8.json +304 -0
- package/kits/schemas/agent-config.schema.9.json +364 -0
- package/kits/schemas/contact-book.schema.3.json +67 -0
- package/kits/schemas/daemon.schema.1.json +3 -2
- package/kits/schemas/daemon.schema.2.json +101 -0
- package/kits/schemas/daemon.schema.3.json +123 -0
- package/kits/schemas/defaults.schema.2.json +85 -0
- package/kits/schemas/defaults.schema.3.json +73 -0
- package/kits/schemas/relation-config.schema.6.json +46 -0
- package/kits/schemas/relation-config.schema.7.json +59 -0
- package/kits/schemas/single-session.schema.2.json +57 -0
- package/kits/templates/message-fragments/handoff-context-to-target.md +9 -0
- package/kits/templates/message-fragments/handoff-request-to-target.md +14 -8
- package/kits/templates/message-fragments/handoff-response-to-origin.md +5 -6
- package/kits/templates/roles/admin.json +46 -0
- package/kits/templates/roles/member.json +4 -0
- package/kits/templates/roles/visitor.json +4 -0
- package/kits/templates/system-fragments/channel.md +12 -2
- package/kits/templates/system-fragments/identity.md +3 -1
- package/kits/templates/system-fragments/relation.md +1 -1
- package/kits/templates/system-fragments/session.md +6 -2
- package/package.json +4 -2
- package/MIGRATION-0.5.0.md +0 -378
- package/ROLE_ACCESS_CONTROL.md +0 -174
- package/dist/channels/contact-bind-code.js +0 -134
- package/dist/channels/wecom-card.js +0 -101
- package/dist/channels/wecom-onboarding.js +0 -82
- package/dist/channels/wecom-state.js +0 -191
|
@@ -8,8 +8,25 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import fs from 'fs';
|
|
10
10
|
import { spawnSync } from 'child_process';
|
|
11
|
-
|
|
11
|
+
const isWindows = process.platform === 'win32';
|
|
12
12
|
const isMacOS = process.platform === 'darwin';
|
|
13
|
+
function readLinuxClockTicks() {
|
|
14
|
+
if (process.platform !== 'linux')
|
|
15
|
+
return 100;
|
|
16
|
+
try {
|
|
17
|
+
const result = spawnSync('getconf', ['CLK_TCK'], {
|
|
18
|
+
encoding: 'utf-8',
|
|
19
|
+
timeout: 1000,
|
|
20
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
21
|
+
});
|
|
22
|
+
const value = Number.parseInt(result.stdout?.trim() || '', 10);
|
|
23
|
+
return value > 0 ? value : 100;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return 100;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const linuxClockTicks = readLinuxClockTicks();
|
|
13
30
|
/** 容差:2 秒(覆盖 macOS 秒级精度 + 时钟漂移) */
|
|
14
31
|
export const START_TIME_TOLERANCE_MS = 2000;
|
|
15
32
|
/**
|
|
@@ -72,8 +89,7 @@ function getStartTimeLinux(pid) {
|
|
|
72
89
|
}
|
|
73
90
|
if (isNaN(btimeSec))
|
|
74
91
|
return null;
|
|
75
|
-
|
|
76
|
-
return (btimeSec + starttimeJiffies / clkTck) * 1000;
|
|
92
|
+
return (btimeSec + starttimeJiffies / linuxClockTicks) * 1000;
|
|
77
93
|
}
|
|
78
94
|
// ── macOS ──
|
|
79
95
|
function getStartTimeMacOS(pid) {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const STABLE_SEMVER = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
|
|
2
|
+
export function parseStableSemver(value) {
|
|
3
|
+
if (typeof value !== 'string')
|
|
4
|
+
return null;
|
|
5
|
+
const match = STABLE_SEMVER.exec(value);
|
|
6
|
+
if (!match)
|
|
7
|
+
return null;
|
|
8
|
+
const parsed = [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
9
|
+
if (parsed.some(part => !Number.isSafeInteger(part)))
|
|
10
|
+
return null;
|
|
11
|
+
return parsed;
|
|
12
|
+
}
|
|
13
|
+
export function compareStableSemver(left, right) {
|
|
14
|
+
for (let index = 0; index < 3; index += 1) {
|
|
15
|
+
if (left[index] < right[index])
|
|
16
|
+
return -1;
|
|
17
|
+
if (left[index] > right[index])
|
|
18
|
+
return 1;
|
|
19
|
+
}
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
package/dist/utils/stats.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { formatPeerKey } from '../core/relation/peer-identity.js';
|
|
1
2
|
export class StatsCollector {
|
|
2
3
|
events = [];
|
|
3
4
|
recentErrors = [];
|
|
@@ -136,6 +137,7 @@ export class StatsCollector {
|
|
|
136
137
|
}
|
|
137
138
|
export class AidStatsCollector {
|
|
138
139
|
entries = new Map();
|
|
140
|
+
routePeers = new Map();
|
|
139
141
|
queueStatsProvider;
|
|
140
142
|
/** sessionId → 当前正在跑该 session 的 agent,task:started 写入,task:completed/error 清除 */
|
|
141
143
|
sessionToAgent = new Map();
|
|
@@ -233,10 +235,12 @@ export class AidStatsCollector {
|
|
|
233
235
|
lastReceivedFrom: null,
|
|
234
236
|
lastReceivedEncrypt: null,
|
|
235
237
|
lastReceivedChatmode: null,
|
|
238
|
+
lastReceivedChannel: null,
|
|
236
239
|
lastSentText: null,
|
|
237
240
|
lastSentTo: null,
|
|
238
241
|
lastSentEncrypt: null,
|
|
239
242
|
lastSentChatmode: null,
|
|
243
|
+
lastSentChannel: null,
|
|
240
244
|
lastReceivedKind: null,
|
|
241
245
|
lastSentKind: null,
|
|
242
246
|
uniquePeers: new Set(),
|
|
@@ -256,6 +260,9 @@ export class AidStatsCollector {
|
|
|
256
260
|
}
|
|
257
261
|
return entry;
|
|
258
262
|
}
|
|
263
|
+
routePeerKey(aid, channel, routeId) {
|
|
264
|
+
return `${aid}\u001f${channel}\u001f${routeId}`;
|
|
265
|
+
}
|
|
259
266
|
onTaskStart(aid, encrypt, chatmode) {
|
|
260
267
|
const entry = this.getOrCreate(aid);
|
|
261
268
|
entry.currentTaskStartAt = Date.now();
|
|
@@ -298,25 +305,31 @@ export class AidStatsCollector {
|
|
|
298
305
|
const entry = this.getOrCreate(aid);
|
|
299
306
|
entry.selfName = name;
|
|
300
307
|
}
|
|
301
|
-
recordInbound(aid, fromPeer, byteLength, text, isSystem = false, encrypt, chatmode, kind = 'send') {
|
|
308
|
+
recordInbound(aid, fromPeer, byteLength, text, isSystem = false, encrypt, chatmode, kind = 'send', ctx) {
|
|
302
309
|
const entry = this.getOrCreate(aid);
|
|
310
|
+
const channel = ctx?.channelType || 'aun';
|
|
311
|
+
const peerLabel = ctx?.peerLabel || fromPeer;
|
|
312
|
+
if (ctx?.routeId && fromPeer) {
|
|
313
|
+
this.routePeers.set(this.routePeerKey(aid, channel, ctx.routeId), { peerId: fromPeer, peerLabel });
|
|
314
|
+
}
|
|
303
315
|
if (isSystem) {
|
|
304
316
|
entry.systemReceived++;
|
|
305
317
|
}
|
|
306
318
|
else {
|
|
307
319
|
entry.messagesReceived++;
|
|
308
320
|
entry.lastReceivedAt = Date.now();
|
|
309
|
-
entry.lastReceivedFrom =
|
|
321
|
+
entry.lastReceivedFrom = peerLabel;
|
|
310
322
|
if (text)
|
|
311
323
|
entry.lastReceivedText = text.length > 100 ? text.slice(0, 100) + '…' : text;
|
|
312
324
|
if (encrypt != null)
|
|
313
325
|
entry.lastReceivedEncrypt = encrypt;
|
|
314
326
|
if (chatmode)
|
|
315
327
|
entry.lastReceivedChatmode = chatmode;
|
|
328
|
+
entry.lastReceivedChannel = channel;
|
|
316
329
|
entry.lastReceivedKind = kind;
|
|
317
330
|
// ring buffer:最近 10 轮
|
|
318
331
|
if (text) {
|
|
319
|
-
entry.recentMessages.unshift({ dir: 'in', peer:
|
|
332
|
+
entry.recentMessages.unshift({ dir: 'in', peer: peerLabel, text: text.slice(0, 100), ts: Date.now(), kind, encrypt: encrypt ?? null, chatmode: chatmode ?? null, channel });
|
|
320
333
|
if (entry.recentMessages.length > 10)
|
|
321
334
|
entry.recentMessages.pop();
|
|
322
335
|
}
|
|
@@ -325,30 +338,39 @@ export class AidStatsCollector {
|
|
|
325
338
|
entry.uniquePeers.add(fromPeer);
|
|
326
339
|
// 持久化
|
|
327
340
|
this.onMessage?.({
|
|
328
|
-
ts: Date.now(), agent_aid: aid, peer_key:
|
|
341
|
+
ts: Date.now(), agent_aid: aid, peer_key: formatPeerKey(channel, fromPeer),
|
|
329
342
|
direction: 'in', msg_type: isSystem ? 'system' : 'private',
|
|
330
343
|
bytes: byteLength, encrypted: encrypt, chatmode,
|
|
331
344
|
});
|
|
332
345
|
}
|
|
333
|
-
recordOutbound(aid, toPeer, byteLength, text, isSystem = false, encrypt, chatmode, kind = 'send') {
|
|
346
|
+
recordOutbound(aid, toPeer, byteLength, text, isSystem = false, encrypt, chatmode, kind = 'send', ctx) {
|
|
334
347
|
const entry = this.getOrCreate(aid);
|
|
348
|
+
const channel = ctx?.channelType || 'aun';
|
|
349
|
+
const routePeer = ctx?.routeId
|
|
350
|
+
? this.routePeers.get(this.routePeerKey(aid, channel, ctx.routeId))
|
|
351
|
+
: undefined;
|
|
352
|
+
const stablePeer = routePeer?.peerId || toPeer;
|
|
353
|
+
const peerLabel = ctx?.peerLabel && ctx.peerLabel !== toPeer
|
|
354
|
+
? ctx.peerLabel
|
|
355
|
+
: routePeer?.peerLabel || ctx?.peerLabel || toPeer;
|
|
335
356
|
if (isSystem) {
|
|
336
357
|
entry.systemSent++;
|
|
337
358
|
}
|
|
338
359
|
else {
|
|
339
360
|
entry.messagesSent++;
|
|
340
361
|
entry.lastSentAt = Date.now();
|
|
341
|
-
entry.lastSentTo =
|
|
362
|
+
entry.lastSentTo = peerLabel;
|
|
342
363
|
if (text)
|
|
343
364
|
entry.lastSentText = text.length > 100 ? text.slice(0, 100) + '…' : text;
|
|
344
365
|
if (encrypt != null)
|
|
345
366
|
entry.lastSentEncrypt = encrypt;
|
|
346
367
|
if (chatmode)
|
|
347
368
|
entry.lastSentChatmode = chatmode;
|
|
369
|
+
entry.lastSentChannel = channel;
|
|
348
370
|
entry.lastSentKind = kind;
|
|
349
371
|
// ring buffer:最近 10 轮
|
|
350
372
|
if (text) {
|
|
351
|
-
entry.recentMessages.unshift({ dir: 'out', peer:
|
|
373
|
+
entry.recentMessages.unshift({ dir: 'out', peer: peerLabel, text: text.slice(0, 100), ts: Date.now(), kind, encrypt: encrypt ?? null, chatmode: chatmode ?? null, channel });
|
|
352
374
|
if (entry.recentMessages.length > 10)
|
|
353
375
|
entry.recentMessages.pop();
|
|
354
376
|
}
|
|
@@ -362,10 +384,10 @@ export class AidStatsCollector {
|
|
|
362
384
|
}
|
|
363
385
|
}
|
|
364
386
|
entry.bytesSent += byteLength;
|
|
365
|
-
entry.uniquePeers.add(
|
|
387
|
+
entry.uniquePeers.add(stablePeer);
|
|
366
388
|
// 持久化
|
|
367
389
|
this.onMessage?.({
|
|
368
|
-
ts: Date.now(), agent_aid: aid, peer_key:
|
|
390
|
+
ts: Date.now(), agent_aid: aid, peer_key: formatPeerKey(channel, stablePeer),
|
|
369
391
|
direction: 'out', msg_type: isSystem ? 'system' : 'private',
|
|
370
392
|
bytes: byteLength, encrypted: encrypt, chatmode,
|
|
371
393
|
});
|
|
@@ -391,10 +413,12 @@ export class AidStatsCollector {
|
|
|
391
413
|
lastReceivedFrom: entry.lastReceivedFrom,
|
|
392
414
|
lastReceivedEncrypt: entry.lastReceivedEncrypt,
|
|
393
415
|
lastReceivedChatmode: entry.lastReceivedChatmode,
|
|
416
|
+
lastReceivedChannel: entry.lastReceivedChannel,
|
|
394
417
|
lastSentText: entry.lastSentText,
|
|
395
418
|
lastSentTo: entry.lastSentTo,
|
|
396
419
|
lastSentEncrypt: entry.lastSentEncrypt,
|
|
397
420
|
lastSentChatmode: entry.lastSentChatmode,
|
|
421
|
+
lastSentChannel: entry.lastSentChannel,
|
|
398
422
|
lastReceivedKind: entry.lastReceivedKind,
|
|
399
423
|
lastSentKind: entry.lastSentKind,
|
|
400
424
|
uniquePeerCount: entry.uniquePeers.size,
|
|
@@ -35,19 +35,10 @@ AUN 渠道是**隐式**的——它不写在 `channels[]` 数组里,而是从
|
|
|
35
35
|
|
|
36
36
|
> `owners`/`admins` 用 **AID**,不是渠道原生 ID。
|
|
37
37
|
|
|
38
|
-
###
|
|
38
|
+
### AUN keystore seed
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
```json
|
|
43
|
-
{
|
|
44
|
-
"aun": {
|
|
45
|
-
"encryptionSeed": "<seed>"
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
留空时 SDK 依次回退 `AUN_ENCRYPTION_SEED` 环境变量 → 默认 `'evol'`。
|
|
40
|
+
AUN keystore seed 由 EvolCore 使用固定应用值管理,不再提供配置项或环境变量入口。
|
|
41
|
+
检测到历史自定义值时 daemon 会拒绝启动并提示联系管理人员,避免用错误值加载现有身份。
|
|
51
42
|
|
|
52
43
|
> Gateway 不在配置里手填:连接时从 AID 自动发现(见下)。Keystore 默认落在 `$EVOLCORE_HOME`。
|
|
53
44
|
|
|
@@ -58,7 +49,7 @@ E2EE 加密种子是**进程级**的,所有 agent 共享,不在 agent config
|
|
|
58
49
|
- **身份与信任**:每条入站消息携带发送者 AID,经四级 X.509 证书链(Root CA → Registry CA → Issuer CA → Agent)验签。
|
|
59
50
|
- **agent.md 缓存**:对端名片 `https://<aid>/agent.md` 由 **AUN SDK 自动拉取并缓存**(`AgentMdManager`,带 ETag/TTL,默认 1 天内不重复探测)。缓存落在 **`$EVOLCORE_HOME/AIDs/<aid>/`**,每个 AID 两个文件:`agent.md`(带签名正文)+ `agentmd.json`(元数据:etag/last_modified/checked_at/verify_status)。本端与对端的 agent.md 都缓存于此。
|
|
60
51
|
- 关系层另存一份**派生**的精简身份 `relations/<peerKey>/peer-identity.json`(type/isAgent/name),由 evolcore 从 agent.md 提取,不是 agent.md 本体。
|
|
61
|
-
- **E2EE
|
|
52
|
+
- **E2EE 加密**:可选端到端加密,回复默认跟随对端消息加密状态(密文回密文,明文回明文);keystore seed 由 EvolCore 固定管理。
|
|
62
53
|
- **断线重连**:SDK 内置退避策略自动重连。实时连接状态用 `ec watch aid` 查看(`ec aid` 是身份/证书管理,不显示连接状态)。
|
|
63
54
|
- **群 ID 格式**:当前协议规范使用 `g-{slug}.issuer-domain` canonical 形式,输入也可接受本域简写 `g-{slug}` 或兼容形式 `g-{slug}@issuer-domain`。历史会话里可能仍出现 `group.{issuer}/{group_no}` 一类旧格式,运行时需兼容读取。
|
|
64
55
|
- **群分发模式**:`dispatch_mode=broadcast|mention` 是群级配置,只决定哪些群消息进入 Agent LLM 上下文,不影响 AUN 协议层投递;被过滤消息仍应本地存档。
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
| `ec fs` | AUN 文件系统统一入口 | 上传/下载/看文件/列目录/删文件/配额/群空间 | 任意有渠道场景 | `fs.md` |
|
|
36
36
|
| `ec storage` | 文件存储底层调试入口 | storage 调试/旧命令/底层上传下载 | 任意有渠道场景 | `storage.md` |
|
|
37
37
|
| `ec agent` | EvolAgent 生命周期 | 创建/启停/热重载/改配置 | 管理员(owner/admin) | `agent.md` |
|
|
38
|
-
| `ec contact` | Contact Book 与访问控制 | 拉黑/解除拉黑/查拉黑 |
|
|
38
|
+
| `ec contact` | Contact Book 与访问控制 | 拉黑/解除拉黑/查拉黑 | 读 owner/admin;写仅 owner | `contact.md` |
|
|
39
39
|
| `ec rpc` | 底层 AUN RPC(逃生通道) | 直接调协议方法 | 高级/兜底 | `rpc.md` |
|
|
40
40
|
|
|
41
41
|
## 会话自管理类(不连 AUN,操作当前会话)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
按作用域读写所有配置参数 + 配置快照/回滚/启动历史。触发词:看配置/改配置/查字段/列配置/校验配置/快照/回滚/历史/对比版本/启动记录。
|
|
4
4
|
|
|
5
5
|
> `ec config` 是配置读写的统一 CLI 入口;模型交互由 menu 协议和 slash `/model` 提供。
|
|
6
|
-
>
|
|
6
|
+
> 字段由共享 field policy 决定路由、值类型和访问级别;同一套规则用于 CLI、Menu 和 agent-tool。
|
|
7
7
|
|
|
8
8
|
## 参数读写
|
|
9
9
|
|
|
@@ -114,7 +114,8 @@ ec config schema <name> [version]
|
|
|
114
114
|
| `--process` | 进程级 | `~/.evolcore/daemon.json` |
|
|
115
115
|
| 写操作三者全无 | — | **拒绝**(防误写全局) |
|
|
116
116
|
|
|
117
|
-
`--peer` 取 `channelType#channelId` 或裸 aid(裸 aid 视为 `aun#<aid
|
|
117
|
+
`--peer` 取 `channelType#channelId` 或裸 aid(裸 aid 视为 `aun#<aid>`)。配置提交后开始处理的新
|
|
118
|
+
turn 使用新值;提交前已经开始的 turn 不被打断。
|
|
118
119
|
|
|
119
120
|
## 覆盖链
|
|
120
121
|
|
|
@@ -124,6 +125,49 @@ defaults → agent/config → relation/config
|
|
|
124
125
|
|
|
125
126
|
ConfigManager 只合并上述物理层并返回物理来源。角色策略不进入配置合并链:`permissionMode` 和 `baseagents.*.model` 由消费方按当前角色单独应用。
|
|
126
127
|
|
|
128
|
+
### Agent 消息准入策略
|
|
129
|
+
|
|
130
|
+
消息准入策略保存在 `agents/<aid>/config.json` 的 `access` 字段,但它是 Agent 自身的安全边界,
|
|
131
|
+
不参与 defaults/relation 有效覆盖:
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"access": {
|
|
136
|
+
"policyMode": "contacts",
|
|
137
|
+
"requestLimit": { "maxTimes": 600, "coolDown": 3600 }
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`policyMode` 为 `open | contacts | owners`;`open` 对所有已配置渠道的私聊和群聊入站开放,`contacts`
|
|
143
|
+
将 Agent 已加入并接收到的群聊视为授权,`owners` 仅 Owner 消息开放;群聊成员不按 Contact Book 联系人
|
|
144
|
+
状态逐一过滤。`requestLimit` 只限制准入控制消息的自动回复、申请和绑定码提示,不是渠道准入开关;`coolDown`
|
|
145
|
+
单位为秒。该对象由 Connect 的访问设置入口修改,不通过通用 relation/defaults 覆盖链放宽。
|
|
146
|
+
|
|
147
|
+
### AUN 群规则加载策略
|
|
148
|
+
|
|
149
|
+
`groupRules.mode` 可设为 `load` 或 `ignore`,缺省为 `load`。该字段仅存在于 Agent 和 relation
|
|
150
|
+
层,relation 可覆盖 Agent 默认值,`--default` 不支持。
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Agent 默认值
|
|
154
|
+
ec config set groupRules.mode ignore --self bot.agentid.pub
|
|
155
|
+
|
|
156
|
+
# 当前群覆盖
|
|
157
|
+
ec config set groupRules.mode load \
|
|
158
|
+
--self bot.agentid.pub --peer aun#g-team.agentid.pub
|
|
159
|
+
|
|
160
|
+
# 查看有效值和来源 / 删除群覆盖
|
|
161
|
+
ec config get groupRules.mode \
|
|
162
|
+
--self bot.agentid.pub --peer aun#g-team.agentid.pub --format json
|
|
163
|
+
ec config unset groupRules.mode \
|
|
164
|
+
--self bot.agentid.pub --peer aun#g-team.agentid.pub
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
`ignore` 表示运行时不访问远端群规则、不读本地物化文件、不注入规则正文,但不删除缓存,也不影响
|
|
168
|
+
`ec group rules` 的远端管理命令。配置切换不会自动创建或清空会话。Claude/Codex 从后续新 turn
|
|
169
|
+
按当前值重新组装上下文;其他 runner 的 Menu 写入结果会提示新建或清空群会话后生效。
|
|
170
|
+
|
|
127
171
|
## 权限控制
|
|
128
172
|
|
|
129
173
|
**写权限**(API 层判定):
|
|
@@ -131,6 +175,7 @@ ConfigManager 只合并上述物理层并返回物理来源。角色策略不进
|
|
|
131
175
|
- **角色专用入口**:`roles/index.json` 与 `roles/{roleId}.json` 由角色服务维护;relation 的
|
|
132
176
|
`role` 由角色分配服务维护;`permissionMode` 仅在角色策略中维护
|
|
133
177
|
- **兼容字段**:`enable_rich_content` 仍可读取旧值,但已废弃且不再产生运行时效果
|
|
178
|
+
- **群规则策略**:`groupRules.mode` 仅 Agent owner 或 daemon owner 可 set/unset;其他角色可读取当前 relation 的有效值
|
|
134
179
|
- **仅人可写**:channels / owners / admins / 凭证 / aid / enabled / projects / aun / models.allowed
|
|
135
180
|
- Agent 托管环境写仅人字段被拒
|
|
136
181
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# ec contact — Agent 联系人与访问控制
|
|
2
2
|
|
|
3
|
-
`ec contact` 管理指定 Agent 的 Contact Book
|
|
3
|
+
`ec contact` 管理指定 Agent 的 Contact Book v3。它只接受 AUN AID 主键;拉黑的是该 canonical AID,
|
|
4
|
+
因此会拒绝它在 AUN 以及所有已绑定外部渠道中的私聊入站。角色统一由 relation `config.json role` 管理。
|
|
4
5
|
|
|
5
6
|
## 命令
|
|
6
7
|
|
|
@@ -15,6 +16,8 @@ ec contact list --blocked --self <agent-aid>
|
|
|
15
16
|
## 约束
|
|
16
17
|
|
|
17
18
|
- `<aid>` 和 `--self` 必须是合法 AID。
|
|
19
|
+
- 写入 Agent Owner 时,系统会自动创建该 Owner 的 active 联系人记录。
|
|
20
|
+
- `block/unblock` 只接受已存在的联系人;不存在时返回 `NOT_FOUND`。
|
|
18
21
|
- `block/unblock` 只改变本 Agent 的入站接收策略,不代表对端也拉黑了本 Agent。
|
|
19
22
|
- Agent owner 不能被拉黑。
|
|
20
23
|
- `list --blocked` 只列出当前 blocked contact,并返回 `contactRevision`。
|
|
@@ -28,7 +31,7 @@ ec contact list --blocked --self <agent-aid>
|
|
|
28
31
|
| 操作 | owner | admin | 普通角色 |
|
|
29
32
|
|---|---:|---:|---:|
|
|
30
33
|
| `list --blocked` | 允许 | 允许 | 拒绝 |
|
|
31
|
-
| `block` / `unblock` | 允许 |
|
|
34
|
+
| `block` / `unblock` | 允许 | 拒绝 | 拒绝 |
|
|
32
35
|
|
|
33
36
|
缺少、伪造、撤销或跨会话 delegation token 时失败关闭。托管调用的 `--self` 必须等于当前任务所属 Agent。
|
|
34
37
|
|
|
@@ -52,6 +55,8 @@ ec contact list --blocked --self <agent-aid>
|
|
|
52
55
|
|
|
53
56
|
## 拉黑后的消息行为
|
|
54
57
|
|
|
55
|
-
- AUN
|
|
58
|
+
- AUN 和已绑定外部私聊身份的入站在 MessageBridge 业务入口被拦截,不进入 menu/auth/command/session/queue/LLM。
|
|
59
|
+
- 群聊不按成员的联系人状态过滤;`open` 对所有已配置渠道的群聊入站开放,`contacts` 将 Agent 已加入并
|
|
60
|
+
接收到的群聊视为授权,`owners` 仅 Owner 消息开放。
|
|
56
61
|
- 对 `ai`、`bot`、`agent`、`service` 类型的私聊对端,可限频返回 `[rejection] Not accepting messages from you.`。
|
|
57
62
|
- 入站正文中的 `[rejection]` 没有协议控制语义。发送者未被本 Agent 拉黑时,该文本正常进入响应式会话。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ec group rules — 群规则文件
|
|
2
2
|
|
|
3
|
-
管理 AUN 群空间中的 `/rules.md`。群规则文件用于定义本群特有的工作流程、职责分工、交付格式、限制条件和升级路径;发布后,EvolCore
|
|
3
|
+
管理 AUN 群空间中的 `/rules.md`。群规则文件用于定义本群特有的工作流程、职责分工、交付格式、限制条件和升级路径;发布后,EvolCore 默认会在该群的对话上下文中加载,本地 Agent 也可用 `groupRules.mode` 选择忽略。
|
|
4
4
|
|
|
5
5
|
以自己的 AID 为操作者 `<from>`,群 AID 为 `<group-id>`。
|
|
6
6
|
|
|
@@ -30,6 +30,44 @@ ec group rules <from> <group-id> publish
|
|
|
30
30
|
|
|
31
31
|
所有命令均支持 `--format json`。
|
|
32
32
|
|
|
33
|
+
## 本地加载策略
|
|
34
|
+
|
|
35
|
+
`ec group rules get/set/publish` 管理远端群规则;`groupRules.mode` 管理当前 Agent 是否把远端规则
|
|
36
|
+
读取并注入上下文。两者互不替代。策略支持 Agent 默认值和当前群 relation 覆盖,优先级为:
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
Agent groupRules.mode -> 当前群 relation groupRules.mode -> 缺省 load
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# 当前群的有效策略与来源
|
|
44
|
+
ec config get groupRules.mode \
|
|
45
|
+
--self bot.agentid.pub --peer aun#g-team.agentid.pub --format json
|
|
46
|
+
|
|
47
|
+
# 只忽略当前群;重新设为 load 可恢复
|
|
48
|
+
ec config set groupRules.mode ignore \
|
|
49
|
+
--self bot.agentid.pub --peer aun#g-team.agentid.pub
|
|
50
|
+
ec config set groupRules.mode load \
|
|
51
|
+
--self bot.agentid.pub --peer aun#g-team.agentid.pub
|
|
52
|
+
|
|
53
|
+
# 删除当前群覆盖,回落 Agent 默认值或缺省 load
|
|
54
|
+
ec config unset groupRules.mode \
|
|
55
|
+
--self bot.agentid.pub --peer aun#g-team.agentid.pub
|
|
56
|
+
|
|
57
|
+
# 设置 Agent 默认策略;只能从允许 Agent 级写入的私聊或控制面执行
|
|
58
|
+
ec config set groupRules.mode ignore --self bot.agentid.pub
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
`groupRules.mode` 只能由 Agent owner 或 daemon owner 修改,其他角色仍可读取当前 relation 的有效值。
|
|
62
|
+
在群聊中,即使 owner 也只能修改当前群 relation,不能修改 Agent 默认值。命令沿用既有
|
|
63
|
+
`ec config set/unset` 的授权、selector 和输出语义,不新增 Menu 协议。
|
|
64
|
+
|
|
65
|
+
`ignore` 从配置提交后开始处理的新 turn 生效,并保证不访问远端规则、不读取本地
|
|
66
|
+
`rules.md`、不注入规则正文;旧物化文件会保留,但不能作为回退来源。切回 `load` 后仍须重新完成
|
|
67
|
+
远端元数据校验。配置切换不会清空、新建或 fork 会话,也不会删除已进入恢复会话历史的旧内容。
|
|
68
|
+
Claude/Codex 的后续 turn 会按新策略重新组装上下文;其他 runner 仍保存配置,但 Menu 成功输出会
|
|
69
|
+
提示新建或清空该群会话后生效。
|
|
70
|
+
|
|
33
71
|
## 推荐流程
|
|
34
72
|
|
|
35
73
|
日常更新直接使用 `set`:
|
|
@@ -160,6 +198,7 @@ ec group rules bot.agentid.pub g-team.agentid.pub get --format json
|
|
|
160
198
|
| status | 含义 | 是否加载 |
|
|
161
199
|
|--------|------|----------|
|
|
162
200
|
| `ok` | `get/set/publish` 校验或发布成功 | 是 |
|
|
201
|
+
| `ignored` | 当前 Agent 的 `groupRules.mode=ignore`,本轮未访问远端或本地规则 | 否 |
|
|
163
202
|
| `synced` | 运行时已刷新并物化本地规则 | 是 |
|
|
164
203
|
| `cached` | 本地物化文件仍与已发布元信息一致 | 是 |
|
|
165
204
|
| `missing` | 未发布规则,或 `/rules.md` 不存在 | 否 |
|
|
@@ -181,16 +220,19 @@ ec group rules bot.agentid.pub g-team.agentid.pub get --format json
|
|
|
181
220
|
校验成功后,本地物化为:
|
|
182
221
|
|
|
183
222
|
```text
|
|
184
|
-
$
|
|
223
|
+
$RELATIONS_DIR/<channel>#<urlEncode(groupId)>/rules.md
|
|
185
224
|
```
|
|
186
225
|
|
|
187
226
|
AUN 示例:
|
|
188
227
|
|
|
189
228
|
```text
|
|
190
|
-
$AGENT_DIR/
|
|
229
|
+
$AGENT_DIR/relations/aun#g-team.agentid.pub/rules.md
|
|
191
230
|
```
|
|
192
231
|
|
|
193
|
-
|
|
232
|
+
该本地文件属于**关系层**(群是对端的一种,见 `kits/rules/04-relation.md`),落在
|
|
233
|
+
`agentRelationsDir(selfAid)/<peerKey>/rules.md`(`src/eck/group-rules-sync.ts` 的 `relationPaths`)。
|
|
234
|
+
`$VENUES_DIR` 下的同名文件是已删除模块 `group-venue-sync.ts` 的历史残留,不再有效。
|
|
235
|
+
它只是远端规则的物化副本,不应直接编辑。只有当前处理轮次验证通过并设置 `groupRulesPath` 时,ECK manifest 才会把它注入 system context。
|
|
194
236
|
|
|
195
237
|
## 排障
|
|
196
238
|
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
# 文本(含空格/换行/特殊字符时用引号包起来;纯短词可不包,但多空格会被压成一个)
|
|
13
|
-
ec group send <from> <group-id> "<text>" [--encrypt]
|
|
13
|
+
ec group send <from> <group-id> "<text>" --return none|required [--encrypt]
|
|
14
14
|
|
|
15
15
|
# 文件(--as image|video|voice|file)
|
|
16
|
-
ec group send <from> <group-id> --file <path> [--as <type>] [--text "<说明>"]
|
|
16
|
+
ec group send <from> <group-id> --file <path> --return none|required [--as <type>] [--text "<说明>"]
|
|
17
17
|
|
|
18
18
|
# 自定义 payload
|
|
19
|
-
ec group send <from> <group-id> --payload '<json>'
|
|
19
|
+
ec group send <from> <group-id> --payload '<json>' --return none|required
|
|
20
20
|
|
|
21
21
|
# 拉取群消息(建议带 --app 独立消费通道,避免影响 daemon)
|
|
22
22
|
ec group pull <from> <group-id> [--after-seq <N>] [--limit <N>] [--app <name>]
|
|
@@ -42,7 +42,7 @@ ec group send <from> <group-id> "通知" --mention alice.agentid.pub,bob.agentid
|
|
|
42
42
|
|
|
43
43
|
- `--no-encrypt`:强制明文,优先于 `--encrypt`
|
|
44
44
|
- `--thread <id>`:指定话题 ID
|
|
45
|
-
- `--return <required
|
|
45
|
+
- `--return <none|required>`:跨会话发送必填;Trigger 任务只能使用 `none`
|
|
46
46
|
- `--content-type <mime>`:覆盖文件 MIME
|
|
47
47
|
- `--transcript <text>`:语音转写,仅 `--as voice`
|
|
48
48
|
|
|
@@ -8,16 +8,16 @@
|
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
# 文本(明文)
|
|
11
|
-
ec msg send <from> <to> "<text>"
|
|
11
|
+
ec msg send <from> <to> "<text>" --return none|required
|
|
12
12
|
|
|
13
13
|
# 从文件读取文本内容(用于超长消息或避免 Shell 转义)
|
|
14
|
-
ec msg send <from> <to> --text-from-file <path>
|
|
14
|
+
ec msg send <from> <to> --text-from-file <path> --return none|required
|
|
15
15
|
|
|
16
16
|
# 文本(密文 E2EE)
|
|
17
|
-
ec msg send <from> <to> "<text>" --encrypt
|
|
17
|
+
ec msg send <from> <to> "<text>" --encrypt --return none|required
|
|
18
18
|
|
|
19
19
|
# 强制明文(同时出现时优先于 --encrypt)
|
|
20
|
-
ec msg send <from> <to> "<text>" --no-encrypt
|
|
20
|
+
ec msg send <from> <to> "<text>" --no-encrypt --return none|required
|
|
21
21
|
|
|
22
22
|
# 文件:--as 可选 image|video|voice|file(默认按扩展名推断)
|
|
23
23
|
ec msg send <from> <to> --file <path> [--as <type>]
|
|
@@ -34,7 +34,7 @@ ec msg send <from> <to> --payload '<json>'
|
|
|
34
34
|
- `--encrypt` — 端到端加密
|
|
35
35
|
- `--no-encrypt` — 强制明文发送,优先于 `--encrypt`
|
|
36
36
|
- `--thread <id>` — 指定话题 ID(多话题路由)
|
|
37
|
-
- `--return <required
|
|
37
|
+
- `--return <none|required>` — 跨会话发送必填;`none` 仅补充目标上下文,`required` 将回答回流来源。Trigger 任务只能使用 `none`
|
|
38
38
|
- `--content-type <mime>` — 显式覆盖 MIME(仅 `--file`)
|
|
39
39
|
- `--text <说>` — 附件说明文字(仅 `--file`)
|
|
40
40
|
- `--transcript <text>` — 语音转写(仅 `--as voice`)
|
|
@@ -58,7 +58,23 @@ ec trigger create \
|
|
|
58
58
|
--enable
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
CLI flag 模式必须显式指定 `--target-channel` 和 `--target-channel-id`,并生成 `feedback.strategy=target`。需要 `origin` 或 `silent` feedback 时,用 `/trigger` 或 `--file
|
|
61
|
+
CLI flag 模式必须显式指定 `--exec`、`--target-channel` 和 `--target-channel-id`,并生成 `feedback.strategy=target`。需要 `origin` 或 `silent` feedback 时,用 `/trigger` 或 `--exec <type> --file <trigger.json|trigger-dir>` 导入 Trigger V3 第二阶段 JSON;CLI 会校验 `--exec` 与 JSON 的 `execution.type` 一致。
|
|
62
|
+
|
|
63
|
+
多行或复杂 prompt 使用 `--prompt-file <path>`,文件内容会原样作为 prompt(UTF-8 BOM 会移除)。内联 `--prompt` 最多 4096 个字符;超限时 CLI 会提示改用 `--prompt-file <path>`:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
ec trigger create --cron '0 9 * * *' \
|
|
67
|
+
--exec target-session \
|
|
68
|
+
--prompt-file ./prompts/daily-summary.md \
|
|
69
|
+
--target-channel <channelKey> --target-channel-id <channelId> \
|
|
70
|
+
--name daily-summary --enable
|
|
71
|
+
|
|
72
|
+
ec trigger update <triggerId> --prompt-file ./prompts/daily-summary-v2.md
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`--file` 始终表示导入完整的 `trigger.json` 或 trigger 目录;`--prompt-file` 只表示 prompt 正文。所有 `create` 形式都必须显式指定 `--exec`;`--prompt-file` 与 `--prompt` 互斥,且不能和 `--file` 同时使用。
|
|
76
|
+
|
|
77
|
+
模型通过 Bash 调用 CLI 且用双引号传递 `--prompt` 时,正文中的双引号、反引号和 Shell 变量形式的 `$` 需要分别写成 `\"`、反斜杠+反引号、`\$`。Shell 会在启动 `ec` 时去掉保护反斜杠,Trigger 中保存的仍是原始正文。
|
|
62
78
|
|
|
63
79
|
支持的触发来源:
|
|
64
80
|
|
|
@@ -85,9 +101,9 @@ Trigger V3 第二阶段使用 `execution.type` 区分执行位置:
|
|
|
85
101
|
--exec target-session
|
|
86
102
|
```
|
|
87
103
|
|
|
88
|
-
`target-session`
|
|
104
|
+
`target-session` 把 `--prompt` 或 `--prompt-file` 的内容当作一条 trigger 来源消息投递进目标会话队列,并等待该会话处理完成。创建时必须显式指定 `--exec target-session`,不会再隐式选择该类型。
|
|
89
105
|
|
|
90
|
-
`trigger-session` 在 daemon 内部 trigger 会话执行 prompt,再把最终结果按 feedback
|
|
106
|
+
`trigger-session` 在 daemon 内部 trigger 会话执行 prompt,再把最终结果按 feedback 投递;prompt 可来自 `--prompt` 或 `--prompt-file`:
|
|
91
107
|
|
|
92
108
|
```bash
|
|
93
109
|
--exec trigger-session \
|
|
@@ -107,7 +123,7 @@ Trigger V3 第二阶段使用 `execution.type` 区分执行位置:
|
|
|
107
123
|
--script-args '{"scope":"daily"}'
|
|
108
124
|
```
|
|
109
125
|
|
|
110
|
-
`script` 不使用 `--prompt`。脚本路径必须在 trigger 目录内;通过 `--file` 导入目录时,脚本文件会随 definition
|
|
126
|
+
`script` 不使用 `--prompt` 或 `--prompt-file`;它必须使用 `--script-path` 和 `--script-runtime`。脚本路径必须在 trigger 目录内;通过 `--file` 导入目录时,脚本文件会随 definition 一起上传。已有 script trigger 的 `update --prompt-file` 也会被拒绝。
|
|
111
127
|
|
|
112
128
|
## 目标与反馈
|
|
113
129
|
|
|
@@ -205,18 +221,19 @@ ec trigger rm <triggerId> # delete 的兼容别名
|
|
|
205
221
|
|
|
206
222
|
## 局部更新
|
|
207
223
|
|
|
208
|
-
`update` 是 patch 语义,只提交需要修改的字段;未指定字段(包括长 prompt
|
|
224
|
+
`update` 是 patch 语义,只提交需要修改的字段;未指定字段(包括长 prompt)保持不变。`--prompt-file <path>` 只更新非 script trigger 的 prompt,不接受完整 definition:
|
|
209
225
|
|
|
210
226
|
```bash
|
|
211
227
|
ec trigger update <triggerId> --cron '0 10 * * *'
|
|
212
228
|
ec trigger update <triggerId> --prompt '新的任务内容' --name new-name
|
|
229
|
+
ec trigger update <triggerId> --prompt-file ./prompts/new-task.md
|
|
213
230
|
ec trigger update <triggerId> --cron '0 10 * * *' --if-revision 'sha256:...'
|
|
214
231
|
```
|
|
215
232
|
|
|
216
233
|
可更新参数只保留三组常用字段:
|
|
217
234
|
|
|
218
235
|
- 调度:`--once`、`--delay`、`--at`、`--cron`、`--every`、`--event`、`--tz`
|
|
219
|
-
- 内容:`--prompt
|
|
236
|
+
- 内容:`--prompt` 或 `--prompt-file <path>`、`--name`
|
|
220
237
|
- 执行配置:`--model`、`--effort`、`--permission`
|
|
221
238
|
- 运行边界:`--max-runs`、`--max-duration`、`--concurrency`、`--missed-policy`
|
|
222
239
|
|
|
@@ -257,8 +274,8 @@ logs/trigger-runs.log
|
|
|
257
274
|
复杂 trigger 使用 Trigger V3 第二阶段 JSON:
|
|
258
275
|
|
|
259
276
|
```bash
|
|
260
|
-
ec trigger create --file ./trigger.json --enable
|
|
261
|
-
ec trigger create --file ./trigger-dir --enable
|
|
277
|
+
ec trigger create --exec target-session --file ./trigger.json --enable
|
|
278
|
+
ec trigger create --exec script --file ./trigger-dir --enable
|
|
262
279
|
```
|
|
263
280
|
|
|
264
281
|
当前产品版本是 Trigger V3 第二阶段;其持久化定义版本为 `$schema_version: 3.1`。旧 `$schema_version: 4` 文件加载时会自动规范化为 `3.1`。
|