evolcore 0.0.2 → 0.0.4
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 +93 -778
- 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 +198 -48
- package/dist/agents/codex-app-server-client.js +68 -0
- package/dist/agents/codex-runner.js +203 -8
- 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/aun/outbox.js +8 -0
- package/dist/channels/aun.js +241 -116
- package/dist/channels/daemon.js +18 -4
- package/dist/channels/dingtalk.js +1005 -260
- package/dist/channels/feishu.js +184 -56
- package/dist/channels/qqbot.js +23 -1
- package/dist/channels/wechat.js +303 -155
- package/dist/channels/wecom.js +1132 -164
- package/dist/cli/agent-command.js +2 -1
- package/dist/cli/aun-commands.js +98 -43
- package/dist/cli/bench.js +2 -2
- package/dist/cli/contact.js +71 -0
- package/dist/cli/ctl-command.js +2 -2
- package/dist/cli/daemon-commands.js +77 -214
- package/dist/cli/handoff-command.js +4 -3
- package/dist/cli/help.js +9 -5
- package/dist/cli/index.js +132 -116
- package/dist/cli/init-channel.js +242 -129
- package/dist/cli/init.js +70 -31
- package/dist/cli/model.js +2 -1
- package/dist/cli/net-check.js +2 -2
- package/dist/cli/queue-command.js +30 -6
- package/dist/cli/raw-key-input.js +25 -0
- package/dist/cli/response.js +5 -6
- package/dist/cli/restart-monitor.js +25 -1
- package/dist/cli/stats.js +6 -4
- package/dist/cli/trigger-command.js +146 -25
- package/dist/cli/version.js +6 -1
- package/dist/config/access-policy-domain.js +38 -0
- package/dist/config/access-policy.js +134 -0
- package/dist/config/builtin-role-templates.js +42 -17
- package/dist/config/builtin-roles.js +31 -6
- package/dist/config/config-field-policy.js +17 -5
- package/dist/config/config-manager.js +409 -29
- package/dist/config/config-operation-service.js +35 -38
- package/dist/config/contact-alias.js +68 -0
- package/dist/config/contact-bind-code.js +274 -0
- package/dist/config/contact-book-store.js +622 -0
- package/dist/config/contact-book-v2-startup.js +35 -0
- package/dist/config/contact-book.js +185 -300
- package/dist/config/contact-operation-service.js +116 -0
- package/dist/config/contact-request-service.js +331 -0
- package/dist/config/peer-role-resolver.js +136 -55
- package/dist/config/role-ranks.js +18 -0
- package/dist/config/role-service.js +16 -19
- package/dist/config/role-store.js +16 -5
- package/dist/config/roles.js +10 -1
- package/dist/config/schema-registry.js +49 -24
- package/dist/config-store.js +14 -4
- package/dist/core/auth/agent-delegation.js +105 -11
- package/dist/core/auth/authorization-audit.js +16 -1
- package/dist/core/auth/operation-authorizer.js +10 -0
- package/dist/core/auth/operation-catalog.js +105 -1
- 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 +113 -21
- package/dist/core/command/connect-menu.js +599 -0
- 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 +382 -100
- 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 +128 -29
- package/dist/core/command/slash-gate.js +1 -1
- package/dist/core/command/slash-handler.js +186 -49
- package/dist/core/daemon-file-cache.js +40 -6
- package/dist/core/event-catalog.js +99 -0
- package/dist/core/evolagent-registry.js +4 -40
- package/dist/core/evolagent.js +20 -9
- 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 +20 -14
- package/dist/core/message/inbound-admission.js +124 -0
- package/dist/core/message/message-bridge.js +670 -57
- package/dist/core/message/message-log.js +1 -0
- package/dist/core/message/message-queue.js +195 -10
- package/dist/core/message/message-utils.js +8 -2
- package/dist/core/message/peer-mode.js +7 -8
- package/dist/core/message/response-engine.js +642 -96
- package/dist/core/message/send-receipt.js +24 -0
- package/dist/core/message/stream-debouncer.js +11 -2
- 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 +115 -38
- package/dist/core/protected-paths.js +38 -11
- package/dist/core/session/session-fs-store.js +44 -3
- package/dist/core/session/session-manager.js +86 -8
- 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 +285 -94
- package/dist/ipc.js +114 -8
- 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/stats/billing.js +20 -8
- package/dist/trigger/manager.js +3 -0
- package/dist/trigger/parser.js +126 -11
- package/dist/trigger/patch.js +12 -2
- package/dist/trigger/scheduler.js +444 -40
- package/dist/trigger/validation.js +13 -0
- package/dist/utils/aid-bind.js +43 -29
- package/dist/utils/error-dict.json +7 -0
- package/dist/utils/evolcore-version.js +21 -0
- package/dist/utils/instance-registry.js +14 -7
- package/dist/utils/log-writer.js +46 -0
- package/dist/utils/logger.js +2 -2
- package/dist/utils/media-cache.js +4 -1
- package/dist/utils/model-prices.jsonl +6 -3
- package/dist/utils/restart-safety.js +31 -0
- package/dist/utils/stable-semver.js +21 -0
- package/dist/utils/stats.js +33 -9
- package/dist/utils/system-memory.js +62 -0
- package/kits/docs/INDEX.md +2 -1
- package/kits/docs/channels/aun.md +4 -13
- package/kits/docs/evolcore/INDEX.md +5 -3
- package/kits/docs/evolcore/agent.md +9 -1
- package/kits/docs/evolcore/aid.md +5 -2
- package/kits/docs/evolcore/config.md +47 -2
- package/kits/docs/evolcore/contact.md +61 -0
- package/kits/docs/evolcore/fs.md +9 -0
- package/kits/docs/evolcore/group-rules.md +46 -4
- package/kits/docs/evolcore/group.md +15 -6
- package/kits/docs/evolcore/model.md +4 -1
- package/kits/docs/evolcore/msg.md +12 -6
- package/kits/docs/evolcore/response.md +16 -21
- package/kits/docs/evolcore/rpc.md +2 -0
- package/kits/docs/evolcore/stats.md +15 -2
- package/kits/docs/evolcore/storage.md +1 -0
- package/kits/docs/evolcore/trigger.md +42 -10
- package/kits/docs/path-registry.md +36 -17
- package/kits/eck_manifest.json +12 -0
- package/kits/eck_message_manifest.json +12 -1
- package/kits/migrations/migrate-contact-book-v2.mjs +754 -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 +21 -7
- package/kits/schemas/agent-config.schema.6.json +322 -0
- 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 +374 -0
- package/kits/schemas/contact-book.schema.2.json +43 -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.5.json +47 -0
- package/kits/schemas/relation-config.schema.6.json +46 -0
- package/kits/schemas/relation-config.schema.7.json +59 -0
- package/kits/schemas/role-config.schema.1.json +1 -0
- package/kits/schemas/role-registry.schema.1.json +2 -2
- 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 +47 -0
- package/kits/templates/roles/member.json +5 -0
- package/kits/templates/roles/owner.json +1 -0
- package/kits/templates/roles/visitor.json +5 -0
- package/kits/templates/system-fragments/channel.md +12 -2
- package/kits/templates/system-fragments/commands.md +3 -1
- 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 +7 -5
- package/MIGRATION-0.5.0.md +0 -378
- package/ROLE_ACCESS_CONTROL.md +0 -174
- package/assets/brand/evolcore/README.md +0 -19
- package/assets/brand/evolcore/evolcore-app-icon.png +0 -0
- package/assets/brand/evolcore/evolcore-app-icon.svg +0 -13
- package/assets/brand/evolcore/evolcore-brand-board.png +0 -0
- package/assets/brand/evolcore/evolcore-brand-board.svg +0 -126
- 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 +0 -14
- package/assets/brand/evolcore/evolcore-logo.png +0 -0
- package/assets/brand/evolcore/evolcore-logo.svg +0 -14
- package/assets/brand/evolcore/evolcore-mark.png +0 -0
- package/assets/brand/evolcore/evolcore-mark.svg +0 -10
package/dist/trigger/parser.js
CHANGED
|
@@ -5,6 +5,14 @@ const TRIGGER_UPDATE_FLAGS = new Set([
|
|
|
5
5
|
'model', 'effort', 'permission',
|
|
6
6
|
'max-runs', 'max-duration', 'concurrency', 'missed-policy',
|
|
7
7
|
]);
|
|
8
|
+
const TRIGGER_CREATE_FLAGS = new Set([
|
|
9
|
+
'once', 'delay', 'at', 'cron', 'every', 'event', 'tz',
|
|
10
|
+
'exec', 'prompt', 'name', 'agent',
|
|
11
|
+
'script-path', 'script-runtime', 'script-args', 'script-timeout',
|
|
12
|
+
'feedback', 'target-channel', 'target-channel-id', 'target-session', 'target-thread-id',
|
|
13
|
+
'trigger-thread', 'baseagent',
|
|
14
|
+
'model', 'effort', 'permission', 'max-runs', 'max-duration',
|
|
15
|
+
]);
|
|
8
16
|
// Note: unquoted multi-word values (e.g. --prompt=hello world) are not supported.
|
|
9
17
|
// The second word would be treated as an unknown token. Always quote multi-word values:
|
|
10
18
|
// --prompt "hello world" or --prompt='hello world'
|
|
@@ -19,6 +27,34 @@ function parseFlags(args) {
|
|
|
19
27
|
}
|
|
20
28
|
return flags;
|
|
21
29
|
}
|
|
30
|
+
function promptSyntaxError(args) {
|
|
31
|
+
const match = /--prompt(?:\s+|=|$)/.exec(args);
|
|
32
|
+
if (!match)
|
|
33
|
+
return undefined;
|
|
34
|
+
const rest = args.slice((match.index ?? 0) + match[0].length).trimStart();
|
|
35
|
+
const quote = rest[0];
|
|
36
|
+
if (quote !== '"' && quote !== "'")
|
|
37
|
+
return undefined;
|
|
38
|
+
for (let index = 1; index < rest.length; index++) {
|
|
39
|
+
if (rest[index] === '\\') {
|
|
40
|
+
index += 1;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (rest[index] === quote)
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return '--prompt 引号未闭合;复杂内容建议改用 --prompt-file <path>';
|
|
47
|
+
}
|
|
48
|
+
function inlinePromptPresent(args) {
|
|
49
|
+
if (Array.isArray(args))
|
|
50
|
+
return args.some(arg => arg === '--prompt' || arg.startsWith('--prompt='));
|
|
51
|
+
return /--prompt(?:\s+|=|$)/.test(args);
|
|
52
|
+
}
|
|
53
|
+
function withPromptFileHint(error, args, opts = {}) {
|
|
54
|
+
if (!inlinePromptPresent(args) || opts.allowLongPrompt || error.includes('--prompt-file'))
|
|
55
|
+
return error;
|
|
56
|
+
return `${error};复杂内容建议改用 --prompt-file <path>`;
|
|
57
|
+
}
|
|
22
58
|
export function parseDuration(s) {
|
|
23
59
|
const m = /^([1-9]\d*)([dhms])$/.exec(s.trim().toLowerCase());
|
|
24
60
|
if (!m)
|
|
@@ -103,6 +139,14 @@ function parseModelFlag(flags) {
|
|
|
103
139
|
return { ok: false, error: '--model 不能为空' };
|
|
104
140
|
return { ok: true, value: raw };
|
|
105
141
|
}
|
|
142
|
+
function parseBaseagentFlag(flags) {
|
|
143
|
+
if (!flags.has('baseagent'))
|
|
144
|
+
return { ok: true };
|
|
145
|
+
const raw = flags.get('baseagent');
|
|
146
|
+
if (!raw || raw === true || !raw.trim())
|
|
147
|
+
return { ok: false, error: '--baseagent 不能为空' };
|
|
148
|
+
return { ok: true, value: raw.trim() };
|
|
149
|
+
}
|
|
106
150
|
function parseEffortFlag(flags) {
|
|
107
151
|
if (!flags.has('effort'))
|
|
108
152
|
return { ok: true };
|
|
@@ -251,6 +295,12 @@ function commonParsed(flags, opts = {}) {
|
|
|
251
295
|
const deprecated = rejectDeprecatedFlags(flags);
|
|
252
296
|
if (deprecated)
|
|
253
297
|
return { ok: false, error: deprecated };
|
|
298
|
+
if (!opts.update) {
|
|
299
|
+
for (const flag of flags.keys()) {
|
|
300
|
+
if (!TRIGGER_CREATE_FLAGS.has(flag))
|
|
301
|
+
return { ok: false, error: `create 不支持参数 --${flag}` };
|
|
302
|
+
}
|
|
303
|
+
}
|
|
254
304
|
const source = parseSourceFlags(flags, opts);
|
|
255
305
|
if (!source.ok)
|
|
256
306
|
return source;
|
|
@@ -281,6 +331,9 @@ function commonParsed(flags, opts = {}) {
|
|
|
281
331
|
const model = parseModelFlag(flags);
|
|
282
332
|
if (!model.ok)
|
|
283
333
|
return model;
|
|
334
|
+
const baseagent = parseBaseagentFlag(flags);
|
|
335
|
+
if (!baseagent.ok)
|
|
336
|
+
return baseagent;
|
|
284
337
|
const effort = parseEffortFlag(flags);
|
|
285
338
|
if (!effort.ok)
|
|
286
339
|
return effort;
|
|
@@ -301,9 +354,10 @@ function commonParsed(flags, opts = {}) {
|
|
|
301
354
|
}
|
|
302
355
|
const prompt = flags.get('prompt');
|
|
303
356
|
if (prompt === true)
|
|
304
|
-
return { ok: false, error: '--prompt
|
|
305
|
-
if (typeof prompt === 'string' && prompt.length > 4096)
|
|
306
|
-
return { ok: false, error: '--prompt 超过 4096
|
|
357
|
+
return { ok: false, error: '--prompt 不能为空;复杂内容建议改用 --prompt-file <path>' };
|
|
358
|
+
if (typeof prompt === 'string' && prompt.length > 4096 && !opts.allowLongPrompt) {
|
|
359
|
+
return { ok: false, error: '--prompt 超过 4096 字符限制;复杂内容建议改用 --prompt-file <path>' };
|
|
360
|
+
}
|
|
307
361
|
const scriptPath = flags.get('script-path');
|
|
308
362
|
if (scriptPath === true)
|
|
309
363
|
return { ok: false, error: '--script-path 不能为空' };
|
|
@@ -326,7 +380,13 @@ function commonParsed(flags, opts = {}) {
|
|
|
326
380
|
if ((targetChannel === undefined) !== (targetChannelId === undefined)) {
|
|
327
381
|
return { ok: false, error: '--target-channel 与 --target-channel-id 必须同时指定或同时省略' };
|
|
328
382
|
}
|
|
329
|
-
|
|
383
|
+
if (!opts.update && !execution.value) {
|
|
384
|
+
return { ok: false, error: '创建 trigger 必须显式指定 --exec script|trigger-session|target-session' };
|
|
385
|
+
}
|
|
386
|
+
const inferredExecution = execution.value;
|
|
387
|
+
if (baseagent.value && inferredExecution !== 'trigger_session') {
|
|
388
|
+
return { ok: false, error: '--baseagent 仅适用于 --exec trigger-session' };
|
|
389
|
+
}
|
|
330
390
|
if (inferredExecution === 'script') {
|
|
331
391
|
if (!scriptPath && !opts.update)
|
|
332
392
|
return { ok: false, error: '--exec script 需要 --script-path' };
|
|
@@ -357,6 +417,7 @@ function commonParsed(flags, opts = {}) {
|
|
|
357
417
|
scriptArgs,
|
|
358
418
|
scriptTimeoutMs: scriptTimeout.value,
|
|
359
419
|
triggerThread: triggerThread.value,
|
|
420
|
+
baseagent: baseagent.value,
|
|
360
421
|
maxRuns: maxRuns.value,
|
|
361
422
|
maxDuration: maxDuration.value,
|
|
362
423
|
model: model.value,
|
|
@@ -366,10 +427,13 @@ function commonParsed(flags, opts = {}) {
|
|
|
366
427
|
};
|
|
367
428
|
}
|
|
368
429
|
export function parseTriggerSet(args) {
|
|
430
|
+
const syntaxError = promptSyntaxError(args);
|
|
431
|
+
if (syntaxError)
|
|
432
|
+
return { ok: false, error: syntaxError };
|
|
369
433
|
const flags = parseFlags(args);
|
|
370
434
|
const parsed = commonParsed(flags);
|
|
371
435
|
if (!parsed.ok)
|
|
372
|
-
return parsed;
|
|
436
|
+
return { ok: false, error: withPromptFileHint(parsed.error, args) };
|
|
373
437
|
const value = parsed.value;
|
|
374
438
|
return {
|
|
375
439
|
ok: true,
|
|
@@ -391,6 +455,46 @@ export function parseTriggerSet(args) {
|
|
|
391
455
|
scriptArgs: value.scriptArgs,
|
|
392
456
|
scriptTimeoutMs: value.scriptTimeoutMs,
|
|
393
457
|
triggerThread: value.triggerThread,
|
|
458
|
+
baseagent: value.baseagent,
|
|
459
|
+
maxRuns: value.maxRuns,
|
|
460
|
+
maxDuration: value.maxDuration,
|
|
461
|
+
model: value.model,
|
|
462
|
+
effort: value.effort,
|
|
463
|
+
permissionMode: value.permissionMode,
|
|
464
|
+
},
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
/** CLI argv parser. Unlike the slash-command string parser, this preserves
|
|
468
|
+
* shell-quoted values such as `--prompt "multi word text"` as one token. */
|
|
469
|
+
export function parseTriggerSetArgv(args, opts = {}) {
|
|
470
|
+
const parsedFlags = flagsFromArgv(args, 'create');
|
|
471
|
+
if (!parsedFlags.ok)
|
|
472
|
+
return { ok: false, error: withPromptFileHint(parsedFlags.error, args, opts) };
|
|
473
|
+
const parsed = commonParsed(parsedFlags.flags, opts);
|
|
474
|
+
if (!parsed.ok)
|
|
475
|
+
return { ok: false, error: withPromptFileHint(parsed.error, args, opts) };
|
|
476
|
+
const value = parsed.value;
|
|
477
|
+
return {
|
|
478
|
+
ok: true,
|
|
479
|
+
value: {
|
|
480
|
+
scheduleType: value.scheduleType,
|
|
481
|
+
scheduleValue: value.scheduleValue ?? '',
|
|
482
|
+
timezone: value.timezone,
|
|
483
|
+
executionType: value.inferredExecution,
|
|
484
|
+
feedbackStrategy: value.feedbackStrategy,
|
|
485
|
+
targetChannel: value.targetChannel,
|
|
486
|
+
targetChannelId: value.targetChannelId,
|
|
487
|
+
targetSession: value.targetSession,
|
|
488
|
+
targetThreadId: value.targetThreadId,
|
|
489
|
+
agentId: value.agentId,
|
|
490
|
+
name: value.name,
|
|
491
|
+
prompt: value.prompt,
|
|
492
|
+
scriptPath: value.scriptPath,
|
|
493
|
+
scriptRuntime: value.scriptRuntime,
|
|
494
|
+
scriptArgs: value.scriptArgs,
|
|
495
|
+
scriptTimeoutMs: value.scriptTimeoutMs,
|
|
496
|
+
triggerThread: value.triggerThread,
|
|
497
|
+
baseagent: value.baseagent,
|
|
394
498
|
maxRuns: value.maxRuns,
|
|
395
499
|
maxDuration: value.maxDuration,
|
|
396
500
|
model: value.model,
|
|
@@ -422,15 +526,26 @@ export function parseTriggerUpdate(args) {
|
|
|
422
526
|
}
|
|
423
527
|
if (!rest)
|
|
424
528
|
return { ok: false, error: '至少需要指定一个修改参数(如 --prompt、--delay、--event 等)' };
|
|
529
|
+
const syntaxError = promptSyntaxError(rest);
|
|
530
|
+
if (syntaxError)
|
|
531
|
+
return { ok: false, error: syntaxError };
|
|
425
532
|
const flags = parseFlags(rest);
|
|
426
|
-
|
|
533
|
+
const parsed = parseTriggerUpdateFlags(nameOrId, flags);
|
|
534
|
+
return parsed.ok ? parsed : { ok: false, error: withPromptFileHint(parsed.error, rest) };
|
|
535
|
+
}
|
|
536
|
+
export function parseTriggerUpdateArgv(nameOrId, args, opts = {}) {
|
|
537
|
+
const parsedFlags = flagsFromArgv(args, 'update');
|
|
538
|
+
if (!parsedFlags.ok)
|
|
539
|
+
return { ok: false, error: withPromptFileHint(parsedFlags.error, args, opts) };
|
|
540
|
+
const parsed = parseTriggerUpdateFlags(nameOrId, parsedFlags.flags, opts);
|
|
541
|
+
return parsed.ok ? parsed : { ok: false, error: withPromptFileHint(parsed.error, args, opts) };
|
|
427
542
|
}
|
|
428
|
-
|
|
543
|
+
function flagsFromArgv(args, command) {
|
|
429
544
|
const flags = new Map();
|
|
430
545
|
for (let i = 0; i < args.length; i++) {
|
|
431
546
|
const arg = args[i];
|
|
432
547
|
if (!arg.startsWith('--'))
|
|
433
|
-
return { ok: false, error: `无法识别
|
|
548
|
+
return { ok: false, error: `无法识别 ${command} 参数: ${arg}` };
|
|
434
549
|
const equals = arg.indexOf('=');
|
|
435
550
|
if (equals > 2) {
|
|
436
551
|
flags.set(arg.slice(2, equals), arg.slice(equals + 1));
|
|
@@ -446,16 +561,16 @@ export function parseTriggerUpdateArgv(nameOrId, args) {
|
|
|
446
561
|
flags.set(key, true);
|
|
447
562
|
}
|
|
448
563
|
}
|
|
449
|
-
return
|
|
564
|
+
return { ok: true, flags };
|
|
450
565
|
}
|
|
451
|
-
function parseTriggerUpdateFlags(nameOrId, flags) {
|
|
566
|
+
function parseTriggerUpdateFlags(nameOrId, flags, opts = {}) {
|
|
452
567
|
if (flags.size === 0)
|
|
453
568
|
return { ok: false, error: '至少需要指定一个修改参数(如 --prompt、--delay、--event 等)' };
|
|
454
569
|
for (const flag of flags.keys()) {
|
|
455
570
|
if (!TRIGGER_UPDATE_FLAGS.has(flag))
|
|
456
571
|
return { ok: false, error: `update 不支持参数 --${flag}` };
|
|
457
572
|
}
|
|
458
|
-
const parsed = commonParsed(flags, { update: true });
|
|
573
|
+
const parsed = commonParsed(flags, { update: true, ...opts });
|
|
459
574
|
if (!parsed.ok)
|
|
460
575
|
return parsed;
|
|
461
576
|
const value = parsed.value;
|
package/dist/trigger/patch.js
CHANGED
|
@@ -13,7 +13,7 @@ const PATCH_KEYS = new Set([
|
|
|
13
13
|
'concurrency',
|
|
14
14
|
'missedPolicy',
|
|
15
15
|
]);
|
|
16
|
-
export function applyTriggerPatch(definition, input) {
|
|
16
|
+
export function applyTriggerPatch(definition, input, opts = {}) {
|
|
17
17
|
if (!input || typeof input !== 'object' || Array.isArray(input)) {
|
|
18
18
|
throw new Error('trigger patch must be an object');
|
|
19
19
|
}
|
|
@@ -30,6 +30,9 @@ export function applyTriggerPatch(definition, input) {
|
|
|
30
30
|
updated.name = String(patch.name);
|
|
31
31
|
applySourcePatch(updated, patch);
|
|
32
32
|
if (patch.prompt !== undefined) {
|
|
33
|
+
if (opts.fromPromptFile && updated.execution.type === 'script') {
|
|
34
|
+
throw new Error('script 类型 trigger 不支持 --prompt-file;请修改脚本文件后重新创建 trigger');
|
|
35
|
+
}
|
|
33
36
|
if (updated.execution.type === 'script')
|
|
34
37
|
updated.feedback.onReply = { template: String(patch.prompt) };
|
|
35
38
|
else
|
|
@@ -80,7 +83,7 @@ export function replaceEditableTriggerDefinition(existing, input) {
|
|
|
80
83
|
throw new Error('trigger definition update must be an object');
|
|
81
84
|
}
|
|
82
85
|
const editable = input;
|
|
83
|
-
|
|
86
|
+
const replacement = normalizeTriggerDefinition({
|
|
84
87
|
...editable,
|
|
85
88
|
$schema_version: TRIGGER_SCHEMA_VERSION,
|
|
86
89
|
id: existing.id,
|
|
@@ -90,6 +93,13 @@ export function replaceEditableTriggerDefinition(existing, input) {
|
|
|
90
93
|
updatedAt: existing.updatedAt,
|
|
91
94
|
origin: existing.origin,
|
|
92
95
|
});
|
|
96
|
+
assertBaseagentImmutable(existing, replacement);
|
|
97
|
+
return replacement;
|
|
98
|
+
}
|
|
99
|
+
function assertBaseagentImmutable(existing, updated) {
|
|
100
|
+
if (existing.execution.baseagent !== updated.execution.baseagent) {
|
|
101
|
+
throw new Error('execution.baseagent is immutable; create a new Trigger to use another baseagent');
|
|
102
|
+
}
|
|
93
103
|
}
|
|
94
104
|
function applySourcePatch(updated, patch) {
|
|
95
105
|
const previous = updated.source;
|