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.
Files changed (206) hide show
  1. package/CHANGELOG.md +93 -778
  2. package/README.md +45 -10
  3. package/bin/ec-safe-output.js +89 -24
  4. package/dist/agents/baseagent.js +46 -0
  5. package/dist/agents/claude-runner.js +198 -48
  6. package/dist/agents/codex-app-server-client.js +68 -0
  7. package/dist/agents/codex-runner.js +203 -8
  8. package/dist/agents/runner-types.js +2 -2
  9. package/dist/aun/aid/agentmd.js +79 -0
  10. package/dist/aun/aid/encryption-seed-policy.js +29 -0
  11. package/dist/aun/aid/index.js +1 -1
  12. package/dist/aun/aid/store.js +2 -5
  13. package/dist/aun/outbox.js +8 -0
  14. package/dist/channels/aun.js +241 -116
  15. package/dist/channels/daemon.js +18 -4
  16. package/dist/channels/dingtalk.js +1005 -260
  17. package/dist/channels/feishu.js +184 -56
  18. package/dist/channels/qqbot.js +23 -1
  19. package/dist/channels/wechat.js +303 -155
  20. package/dist/channels/wecom.js +1132 -164
  21. package/dist/cli/agent-command.js +2 -1
  22. package/dist/cli/aun-commands.js +98 -43
  23. package/dist/cli/bench.js +2 -2
  24. package/dist/cli/contact.js +71 -0
  25. package/dist/cli/ctl-command.js +2 -2
  26. package/dist/cli/daemon-commands.js +77 -214
  27. package/dist/cli/handoff-command.js +4 -3
  28. package/dist/cli/help.js +9 -5
  29. package/dist/cli/index.js +132 -116
  30. package/dist/cli/init-channel.js +242 -129
  31. package/dist/cli/init.js +70 -31
  32. package/dist/cli/model.js +2 -1
  33. package/dist/cli/net-check.js +2 -2
  34. package/dist/cli/queue-command.js +30 -6
  35. package/dist/cli/raw-key-input.js +25 -0
  36. package/dist/cli/response.js +5 -6
  37. package/dist/cli/restart-monitor.js +25 -1
  38. package/dist/cli/stats.js +6 -4
  39. package/dist/cli/trigger-command.js +146 -25
  40. package/dist/cli/version.js +6 -1
  41. package/dist/config/access-policy-domain.js +38 -0
  42. package/dist/config/access-policy.js +134 -0
  43. package/dist/config/builtin-role-templates.js +42 -17
  44. package/dist/config/builtin-roles.js +31 -6
  45. package/dist/config/config-field-policy.js +17 -5
  46. package/dist/config/config-manager.js +409 -29
  47. package/dist/config/config-operation-service.js +35 -38
  48. package/dist/config/contact-alias.js +68 -0
  49. package/dist/config/contact-bind-code.js +274 -0
  50. package/dist/config/contact-book-store.js +622 -0
  51. package/dist/config/contact-book-v2-startup.js +35 -0
  52. package/dist/config/contact-book.js +185 -300
  53. package/dist/config/contact-operation-service.js +116 -0
  54. package/dist/config/contact-request-service.js +331 -0
  55. package/dist/config/peer-role-resolver.js +136 -55
  56. package/dist/config/role-ranks.js +18 -0
  57. package/dist/config/role-service.js +16 -19
  58. package/dist/config/role-store.js +16 -5
  59. package/dist/config/roles.js +10 -1
  60. package/dist/config/schema-registry.js +49 -24
  61. package/dist/config-store.js +14 -4
  62. package/dist/core/auth/agent-delegation.js +105 -11
  63. package/dist/core/auth/authorization-audit.js +16 -1
  64. package/dist/core/auth/operation-authorizer.js +10 -0
  65. package/dist/core/auth/operation-catalog.js +105 -1
  66. package/dist/core/auth/trigger-authorization.js +15 -0
  67. package/dist/core/bootstrap-service.js +2 -9
  68. package/dist/core/channel-loader.js +6 -2
  69. package/dist/core/command/command-handler.js +113 -21
  70. package/dist/core/command/connect-menu.js +599 -0
  71. package/dist/core/command/evol-menu-version-gate.js +38 -0
  72. package/dist/core/command/group-menu.js +421 -0
  73. package/dist/core/command/menu-handler.js +382 -100
  74. package/dist/core/command/menu-protocol.js +8 -2
  75. package/dist/core/command/menu-token-store.js +102 -0
  76. package/dist/core/command/role-menu.js +128 -29
  77. package/dist/core/command/slash-gate.js +1 -1
  78. package/dist/core/command/slash-handler.js +186 -49
  79. package/dist/core/daemon-file-cache.js +40 -6
  80. package/dist/core/event-catalog.js +99 -0
  81. package/dist/core/evolagent-registry.js +4 -40
  82. package/dist/core/evolagent.js +20 -9
  83. package/dist/core/handoff/runtime.js +162 -37
  84. package/dist/core/handoff/store.js +46 -2
  85. package/dist/core/handoff/types.js +1 -0
  86. package/dist/core/inference/text-inference.js +16 -74
  87. package/dist/core/message/file-markers.js +7 -0
  88. package/dist/core/message/im-renderer.js +20 -14
  89. package/dist/core/message/inbound-admission.js +124 -0
  90. package/dist/core/message/message-bridge.js +670 -57
  91. package/dist/core/message/message-log.js +1 -0
  92. package/dist/core/message/message-queue.js +195 -10
  93. package/dist/core/message/message-utils.js +8 -2
  94. package/dist/core/message/peer-mode.js +7 -8
  95. package/dist/core/message/response-engine.js +642 -96
  96. package/dist/core/message/send-receipt.js +24 -0
  97. package/dist/core/message/stream-debouncer.js +11 -2
  98. package/dist/core/permission/approval-gateway.js +17 -10
  99. package/dist/core/permission/ec-command-parser.js +101 -46
  100. package/dist/core/permission/tool-policy.js +115 -38
  101. package/dist/core/protected-paths.js +38 -11
  102. package/dist/core/session/session-fs-store.js +44 -3
  103. package/dist/core/session/session-manager.js +86 -8
  104. package/dist/core/session/session-mapper.js +2 -0
  105. package/dist/core/session/session-renew.js +125 -69
  106. package/dist/core/session/session-turn-coordinator.js +5 -1
  107. package/dist/eck/kit-renderer.js +12 -1
  108. package/dist/eck/message-renderer.js +79 -1
  109. package/dist/index.js +285 -94
  110. package/dist/ipc.js +114 -8
  111. package/dist/paths.js +3 -0
  112. package/dist/response-system/config-resolver.js +29 -0
  113. package/dist/response-system/coordinator.js +8 -32
  114. package/dist/response-system/engines/v1/proactive-flow.js +1 -1
  115. package/dist/response-system/index.js +1 -0
  116. package/dist/response-system/modes/single-session/index.js +7 -4
  117. package/dist/stats/billing.js +20 -8
  118. package/dist/trigger/manager.js +3 -0
  119. package/dist/trigger/parser.js +126 -11
  120. package/dist/trigger/patch.js +12 -2
  121. package/dist/trigger/scheduler.js +444 -40
  122. package/dist/trigger/validation.js +13 -0
  123. package/dist/utils/aid-bind.js +43 -29
  124. package/dist/utils/error-dict.json +7 -0
  125. package/dist/utils/evolcore-version.js +21 -0
  126. package/dist/utils/instance-registry.js +14 -7
  127. package/dist/utils/log-writer.js +46 -0
  128. package/dist/utils/logger.js +2 -2
  129. package/dist/utils/media-cache.js +4 -1
  130. package/dist/utils/model-prices.jsonl +6 -3
  131. package/dist/utils/restart-safety.js +31 -0
  132. package/dist/utils/stable-semver.js +21 -0
  133. package/dist/utils/stats.js +33 -9
  134. package/dist/utils/system-memory.js +62 -0
  135. package/kits/docs/INDEX.md +2 -1
  136. package/kits/docs/channels/aun.md +4 -13
  137. package/kits/docs/evolcore/INDEX.md +5 -3
  138. package/kits/docs/evolcore/agent.md +9 -1
  139. package/kits/docs/evolcore/aid.md +5 -2
  140. package/kits/docs/evolcore/config.md +47 -2
  141. package/kits/docs/evolcore/contact.md +61 -0
  142. package/kits/docs/evolcore/fs.md +9 -0
  143. package/kits/docs/evolcore/group-rules.md +46 -4
  144. package/kits/docs/evolcore/group.md +15 -6
  145. package/kits/docs/evolcore/model.md +4 -1
  146. package/kits/docs/evolcore/msg.md +12 -6
  147. package/kits/docs/evolcore/response.md +16 -21
  148. package/kits/docs/evolcore/rpc.md +2 -0
  149. package/kits/docs/evolcore/stats.md +15 -2
  150. package/kits/docs/evolcore/storage.md +1 -0
  151. package/kits/docs/evolcore/trigger.md +42 -10
  152. package/kits/docs/path-registry.md +36 -17
  153. package/kits/eck_manifest.json +12 -0
  154. package/kits/eck_message_manifest.json +12 -1
  155. package/kits/migrations/migrate-contact-book-v2.mjs +754 -0
  156. package/kits/rules/01-overview.md +17 -7
  157. package/kits/rules/02-navigation.md +38 -18
  158. package/kits/rules/03-identity.md +28 -24
  159. package/kits/rules/04-relation.md +44 -28
  160. package/kits/rules/05-venue.md +31 -15
  161. package/kits/rules/06-channel.md +11 -7
  162. package/kits/schemas/_meta.json +21 -7
  163. package/kits/schemas/agent-config.schema.6.json +322 -0
  164. package/kits/schemas/agent-config.schema.7.json +303 -0
  165. package/kits/schemas/agent-config.schema.8.json +304 -0
  166. package/kits/schemas/agent-config.schema.9.json +374 -0
  167. package/kits/schemas/contact-book.schema.2.json +43 -0
  168. package/kits/schemas/contact-book.schema.3.json +67 -0
  169. package/kits/schemas/daemon.schema.1.json +3 -2
  170. package/kits/schemas/daemon.schema.2.json +101 -0
  171. package/kits/schemas/daemon.schema.3.json +123 -0
  172. package/kits/schemas/defaults.schema.2.json +85 -0
  173. package/kits/schemas/defaults.schema.3.json +73 -0
  174. package/kits/schemas/relation-config.schema.5.json +47 -0
  175. package/kits/schemas/relation-config.schema.6.json +46 -0
  176. package/kits/schemas/relation-config.schema.7.json +59 -0
  177. package/kits/schemas/role-config.schema.1.json +1 -0
  178. package/kits/schemas/role-registry.schema.1.json +2 -2
  179. package/kits/schemas/single-session.schema.2.json +57 -0
  180. package/kits/templates/message-fragments/handoff-context-to-target.md +9 -0
  181. package/kits/templates/message-fragments/handoff-request-to-target.md +14 -8
  182. package/kits/templates/message-fragments/handoff-response-to-origin.md +5 -6
  183. package/kits/templates/roles/admin.json +47 -0
  184. package/kits/templates/roles/member.json +5 -0
  185. package/kits/templates/roles/owner.json +1 -0
  186. package/kits/templates/roles/visitor.json +5 -0
  187. package/kits/templates/system-fragments/channel.md +12 -2
  188. package/kits/templates/system-fragments/commands.md +3 -1
  189. package/kits/templates/system-fragments/identity.md +3 -1
  190. package/kits/templates/system-fragments/relation.md +1 -1
  191. package/kits/templates/system-fragments/session.md +6 -2
  192. package/package.json +7 -5
  193. package/MIGRATION-0.5.0.md +0 -378
  194. package/ROLE_ACCESS_CONTROL.md +0 -174
  195. package/assets/brand/evolcore/README.md +0 -19
  196. package/assets/brand/evolcore/evolcore-app-icon.png +0 -0
  197. package/assets/brand/evolcore/evolcore-app-icon.svg +0 -13
  198. package/assets/brand/evolcore/evolcore-brand-board.png +0 -0
  199. package/assets/brand/evolcore/evolcore-brand-board.svg +0 -126
  200. package/assets/brand/evolcore/evolcore-logo-kit.zip +0 -0
  201. package/assets/brand/evolcore/evolcore-logo-reverse.png +0 -0
  202. package/assets/brand/evolcore/evolcore-logo-reverse.svg +0 -14
  203. package/assets/brand/evolcore/evolcore-logo.png +0 -0
  204. package/assets/brand/evolcore/evolcore-logo.svg +0 -14
  205. package/assets/brand/evolcore/evolcore-mark.png +0 -0
  206. package/assets/brand/evolcore/evolcore-mark.svg +0 -10
@@ -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
- const inferredExecution = execution.value ?? (scriptPath ? 'script' : 'target_session');
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
- return parseTriggerUpdateFlags(nameOrId, flags);
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
- export function parseTriggerUpdateArgv(nameOrId, args) {
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: `无法识别 update 参数: ${arg}` };
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 parseTriggerUpdateFlags(nameOrId, flags);
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;
@@ -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
- return normalizeTriggerDefinition({
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;