evolcore 0.0.29 → 0.0.30

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 (68) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/agents/codex-runner.js +61 -14
  3. package/dist/aun/aid/agentmd.js +224 -19
  4. package/dist/aun/aid/index.js +2 -1
  5. package/dist/aun/aid/managed-operation.js +70 -4
  6. package/dist/aun/group/index.js +1 -0
  7. package/dist/{core → aun}/group/invite-service.js +4 -4
  8. package/dist/channels/daemon.js +1 -1
  9. package/dist/cli/agent-command.js +7 -7
  10. package/dist/cli/aun-commands.js +97 -37
  11. package/dist/cli/data-command.js +2 -1
  12. package/dist/cli/managed-command-guard.js +2 -2
  13. package/dist/cli/model.js +1 -1
  14. package/dist/cli/response.js +1 -1
  15. package/dist/cli/trigger-command.js +52 -29
  16. package/dist/config/boot-log.js +95 -1
  17. package/dist/config/builtin-roles.js +1 -0
  18. package/dist/config/peer-role-resolver.js +21 -0
  19. package/dist/core/agent-ipc-registration.js +409 -0
  20. package/dist/core/agent-runtime.js +435 -0
  21. package/dist/core/auth/delegation-authorization.js +58 -0
  22. package/dist/core/auth/operation-catalog.js +8 -0
  23. package/dist/core/bootstrap-service.js +65 -1
  24. package/dist/core/channel-runtime.js +435 -0
  25. package/dist/core/command/command-handler.js +4 -1
  26. package/dist/core/daemon-bootstrap.js +151 -0
  27. package/dist/core/daemon-control.js +205 -0
  28. package/dist/core/daemon-lifecycle.js +225 -0
  29. package/dist/core/data-migration.js +4 -1
  30. package/dist/core/handoff/ipc-registration.js +156 -0
  31. package/dist/core/ipc-registration.js +457 -0
  32. package/dist/core/memory/consolidation-trigger.js +8 -0
  33. package/dist/core/memory/consolidation.js +838 -0
  34. package/dist/core/message/aun-ipc-sender.js +226 -0
  35. package/dist/core/message/outbound.js +165 -0
  36. package/dist/core/permission/approval-gateway.js +13 -0
  37. package/dist/core/permission/ec-command-parser.js +80 -35
  38. package/dist/core/permission/sandbox-runtime.js +23 -2
  39. package/dist/core/permission/tool-error-code.js +1 -0
  40. package/dist/core/permission/tool-policy.js +61 -24
  41. package/dist/core/session/session-idle-monitor.js +17 -0
  42. package/dist/index.js +352 -4841
  43. package/dist/ipc.js +2 -1
  44. package/dist/stats/db.js +24 -0
  45. package/dist/stats/index.js +1 -1
  46. package/dist/stats/writer.js +25 -1
  47. package/dist/trigger/application-service.js +157 -0
  48. package/dist/trigger/authorization.js +371 -0
  49. package/dist/trigger/ipc-service.js +406 -0
  50. package/dist/trigger/local-files.js +133 -0
  51. package/dist/trigger/manager.js +235 -22
  52. package/dist/trigger/scheduler.js +30 -5
  53. package/dist/trigger/script-executor.js +176 -39
  54. package/dist/trigger/script-sandbox.js +458 -0
  55. package/dist/trigger/system-definitions.js +188 -0
  56. package/dist/trigger/validation.js +0 -3
  57. package/dist/utils/aid-bind.js +1 -1
  58. package/dist/utils/evolcore-version.js +74 -0
  59. package/dist/utils/logger.js +16 -0
  60. package/kits/docs/evolcore/INDEX.md +1 -1
  61. package/kits/docs/evolcore/aid.md +9 -1
  62. package/kits/docs/evolcore/model.md +3 -2
  63. package/kits/docs/evolcore/rpc.md +4 -0
  64. package/kits/docs/evolcore/trigger.md +15 -1
  65. package/kits/schemas/relation-config.schema.9.json +1 -1
  66. package/kits/templates/system-fragments/commands.md +0 -1
  67. package/package.json +1 -1
  68. package/dist/core/memory/launch-consolidation.js +0 -395
@@ -5,7 +5,7 @@ import { randomUUID } from 'crypto';
5
5
  import { logger } from '../../utils/logger.js';
6
6
  import { resolveRoot } from '../../paths.js';
7
7
  import { containsHClassReference, containsAgentScopeReference, containsLClassReference, checkProtectedPathAccess, getExistingHClassMaskTargets, hClassGrantIncludesProtectedPath, isHClassPath, isSameOrDescendant, isLClassPath, lClassGrantIncludesProtectedPath, resolveProtectedCandidate, resolveProtectedCandidateWithoutFinalSymlink, } from './protected-paths.js';
8
- import { classifyEvolcoreShellCommand, hasCodexCmdCarrierEcIntent, hasPowerShellCredentialAssignment, parseCodexToolCommand, parseBoundedOutputShellCommand, parseShellApplyPatchInvocation, parseLiteralShellArgv, resolveCodexShellCarrierArgv, resolveCodexShellCarrierString, } from './ec-command-parser.js';
8
+ import { classifyEvolcoreShellCommand, hasCodexCmdCarrierEcIntent, hasPowerShellCredentialAssignment, normalizeEvolcoreCommandArgv, parseCodexToolCommand, parseBoundedOutputShellCommand, parseShellApplyPatchInvocation, parseLiteralShellArgv, resolveCodexShellCarrierArgv, resolveCodexShellCarrierString, } from './ec-command-parser.js';
9
9
  import { analyzeReadonlyShellQuery, } from './readonly-shell-query.js';
10
10
  /** Resolve the session-owned temporary root supplied by the execution host. */
11
11
  export function resolveManagedTempDir(env = process.env) {
@@ -2416,12 +2416,15 @@ export function evaluateToolPreflight(toolName, input, context) {
2416
2416
  const parsedCodex = context.sessionId ? parseCodexToolCommand(input, parserOptions) : null;
2417
2417
  const applyPatch = parseShellApplyPatchInvocation(input, parserOptions, parsedCodex?.ok ? parsedCodex.argv : undefined);
2418
2418
  if (applyPatch.kind === 'invalid') {
2419
+ const invalidArgument = applyPatch.errorDetailCode === 'INVALID_ARGUMENT';
2419
2420
  return {
2420
2421
  behavior: 'deny',
2421
2422
  input,
2422
- message: '文件修改 patch 无法安全解析:' + applyPatch.reason,
2423
- policyCode: 'apply_patch_unparseable',
2424
- errorDetailCode: 'APPLY_PATCH_UNPARSEABLE',
2423
+ message: invalidArgument
2424
+ ? 'apply_patch 参数格式错误:需要一个完整补丁文档(以 *** Begin Patch 开头、以 *** End Patch 结尾),普通命令行参数不是补丁;这不是权限不足。'
2425
+ : '文件修改 patch 无法安全解析:' + applyPatch.reason,
2426
+ policyCode: invalidArgument ? 'apply_patch_invalid_argument' : 'apply_patch_unparseable',
2427
+ errorDetailCode: invalidArgument ? 'INVALID_ARGUMENT' : 'APPLY_PATCH_UNPARSEABLE',
2425
2428
  };
2426
2429
  }
2427
2430
  if (applyPatch.kind === 'file-change') {
@@ -2466,7 +2469,36 @@ export function evaluateToolPreflight(toolName, input, context) {
2466
2469
  policyCode: 'delegation_token_unbound',
2467
2470
  };
2468
2471
  }
2469
- const argv = parsedCodex?.ok ? parsedCodex.argv : null;
2472
+ const shellDialect = stringShellCarrier?.dialect
2473
+ ?? (hasCodexCmdCarrierEcIntent(input) ? 'cmd' : undefined);
2474
+ const hasPowerShellCarrierAssignment = stringShellCarrier?.dialect === 'powershell'
2475
+ && hasPowerShellCredentialAssignment(stringShellCarrier.command);
2476
+ const ecCommand = hasPowerShellCarrierAssignment && parsedCodex
2477
+ ? parsedCodex.ok && parsedCodex.argv[0] === 'ec'
2478
+ ? { kind: 'literal' }
2479
+ : {
2480
+ kind: 'composite',
2481
+ issue: parsedCodex.ok ? 'shell-composition' : parsedCodex.issue,
2482
+ }
2483
+ : classifyEvolcoreShellCommand(policyCommand, shellDialect
2484
+ ? { dialect: shellDialect, ...parserOptions }
2485
+ : parserOptions);
2486
+ const classifiedEcArgv = ecCommand.kind === 'bounded-output' || ecCommand.kind === 'cd-prefixed'
2487
+ ? ecCommand.command.argv
2488
+ : null;
2489
+ const argv = parsedCodex?.ok
2490
+ ? parsedCodex.argv
2491
+ : classifiedEcArgv ? normalizeEvolcoreCommandArgv(classifiedEcArgv) : null;
2492
+ const managedAidArgs = argv?.[0] === 'ec' && argv[1] === 'aid'
2493
+ ? argv.slice(2)
2494
+ : undefined;
2495
+ const managedAidHelpEnd = managedAidArgs?.indexOf('--') ?? -1;
2496
+ const managedAidHelpArgs = managedAidArgs?.slice(0, managedAidHelpEnd < 0 ? undefined : managedAidHelpEnd) ?? [];
2497
+ const isManagedAidHelp = managedAidArgs !== undefined && (managedAidArgs.length === 0
2498
+ || managedAidHelpArgs.some(arg => arg === '--help' || arg === '-h')
2499
+ || managedAidHelpArgs[0] === 'help'
2500
+ || (managedAidHelpArgs[0] === 'agentmd'
2501
+ && (managedAidArgs.length === 1 || managedAidHelpArgs[1] === 'help')));
2470
2502
  const managedAidArgv = argv?.at(-2) === '--format' && argv.at(-1) === 'json'
2471
2503
  ? argv.slice(0, -2)
2472
2504
  : argv;
@@ -2494,6 +2526,16 @@ export function evaluateToolPreflight(toolName, input, context) {
2494
2526
  && managedAidArgv[2] === 'agentmd'
2495
2527
  && managedAidArgv[3] === 'put'
2496
2528
  && ownAid;
2529
+ const isSelfAgentMdSet = !!managedAidArgv
2530
+ && managedAidArgv.length === 7
2531
+ && managedAidArgv[0] === 'ec'
2532
+ && managedAidArgv[1] === 'aid'
2533
+ && managedAidArgv[2] === 'agentmd'
2534
+ && managedAidArgv[3] === 'set'
2535
+ && !!context.selfAid
2536
+ && managedAidArgv[4]?.replace(/^@/, '') === context.selfAid.replace(/^@/, '')
2537
+ && ['name', 'type', 'description', 'version', 'tags'].includes(managedAidArgv[5] ?? '')
2538
+ && managedAidArgv[6] !== undefined;
2497
2539
  const avatarFileIndex = managedAidArgv?.indexOf('--file') ?? -1;
2498
2540
  const avatarUrlIndex = managedAidArgv?.indexOf('--url') ?? -1;
2499
2541
  const avatarSourceIndex = avatarFileIndex >= 0 ? avatarFileIndex : avatarUrlIndex;
@@ -2509,35 +2551,30 @@ export function evaluateToolPreflight(toolName, input, context) {
2509
2551
  && !managedAidArgv[5].startsWith('-');
2510
2552
  const canPublishSelfAgentMd = isSelfAgentMdPublish
2511
2553
  && ['request', 'bypass'].includes(context.permissionMode ?? '');
2554
+ const canSetSelfAgentMd = isSelfAgentMdSet
2555
+ && ['request', 'bypass'].includes(context.permissionMode ?? '');
2512
2556
  const canUploadSelfAvatar = isSelfAvatarUpload
2513
2557
  && ['request', 'bypass'].includes(context.permissionMode ?? '');
2514
- const isAllowedManagedAidCommand = isManagedAidPublicRead || isSelfManagedAidShow || canPublishSelfAgentMd || canUploadSelfAvatar;
2515
- if (context.sessionId && /^\s*ec\s+aid(?:\s|$)/i.test(policyCommand) && !isAllowedManagedAidCommand) {
2558
+ const isAllowedManagedAidCommand = isManagedAidPublicRead
2559
+ || isSelfManagedAidShow
2560
+ || canPublishSelfAgentMd
2561
+ || canSetSelfAgentMd
2562
+ || canUploadSelfAvatar;
2563
+ if (context.sessionId && managedAidArgs !== undefined
2564
+ && !isManagedAidHelp && !isAllowedManagedAidCommand) {
2516
2565
  return {
2517
2566
  behavior: 'deny',
2518
2567
  input,
2519
2568
  message: isSelfAgentMdPublish && (context.permissionMode === 'readonly' || context.permissionMode === 'auto')
2520
2569
  ? `🔒 ${context.permissionMode} 模式禁止发布 agent.md;请切换到 request 或 bypass 后再执行 \`ec aid agentmd put <当前 self AID>\`。`
2521
- : isSelfAvatarUpload && (context.permissionMode === 'readonly' || context.permissionMode === 'auto')
2522
- ? `🔒 ${context.permissionMode} 模式禁止上传头像;请切换到 request 或 bypass 后再执行 \`ec aid avatar <当前 self AID> (--file <path> 或 --url <https-url>)\`。`
2523
- : '🔒 EvolCore 托管会话允许 `ec aid show <当前 self AID>`、`ec aid lookup <任意合法 AID>` 或 `ec aid agentmd get <任意合法 AID>`;`ec aid agentmd put` 及 `ec aid avatar` 还要求针对当前 self AID 且处于 request 或 bypass。可选后缀仅限 `--format json`。禁止列举本地身份、切换身份或对其它 AID 执行 show/put/avatar。',
2570
+ : isSelfAgentMdSet && (context.permissionMode === 'readonly' || context.permissionMode === 'auto')
2571
+ ? `🔒 ${context.permissionMode} 模式禁止修改 agent.md;请切换到 request 或 bypass 后再执行 \`ec aid agentmd set <当前 self AID> <field> <value>\`。`
2572
+ : isSelfAvatarUpload && (context.permissionMode === 'readonly' || context.permissionMode === 'auto')
2573
+ ? `🔒 ${context.permissionMode} 模式禁止上传头像;请切换到 request 或 bypass 后再执行 \`ec aid avatar <当前 self AID> (--file <path> 或 --url <https-url>)\`。`
2574
+ : '🔒 EvolCore 托管会话允许 `ec aid show <当前 self AID>`、`ec aid lookup <任意合法 AID>` 或 `ec aid agentmd get <任意合法 AID>`;`ec aid agentmd put/set` 及 `ec aid avatar` 还要求针对当前 self AID 且处于 request 或 bypass。可选后缀仅限 `--format json`。禁止列举本地身份、切换身份或对其它 AID 执行 show/put/set/avatar。',
2524
2575
  policyCode: 'managed_ec_aid_scope_forbidden',
2525
2576
  };
2526
2577
  }
2527
- const shellDialect = stringShellCarrier?.dialect
2528
- ?? (hasCodexCmdCarrierEcIntent(input) ? 'cmd' : undefined);
2529
- const hasPowerShellCarrierAssignment = stringShellCarrier?.dialect === 'powershell'
2530
- && hasPowerShellCredentialAssignment(stringShellCarrier.command);
2531
- const ecCommand = hasPowerShellCarrierAssignment && parsedCodex
2532
- ? parsedCodex.ok && parsedCodex.argv[0] === 'ec'
2533
- ? { kind: 'literal' }
2534
- : {
2535
- kind: 'composite',
2536
- issue: parsedCodex.ok ? 'shell-composition' : parsedCodex.issue,
2537
- }
2538
- : classifyEvolcoreShellCommand(policyCommand, shellDialect
2539
- ? { dialect: shellDialect, ...parserOptions }
2540
- : parserOptions);
2541
2578
  if (ecCommand.kind === 'literal') {
2542
2579
  return { behavior: 'allow', input, reason: 'ec-command' };
2543
2580
  }
@@ -1,9 +1,26 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
+ import { ConfigTarget, read as readConfig } from '../../config/config-manager.js';
4
+ import { formatPeerKey } from '../relation/peer-identity.js';
3
5
  import { logger } from '../../utils/logger.js';
4
6
  import { atomicWriteJson } from './session-fs-store.js';
5
7
  import { createRootCausation } from '../causation/context.js';
6
8
  export const MIN_SESSION_IDLE_SECONDS = 30;
9
+ export function readRelationSessionIdleSeconds(session) {
10
+ if (!session.selfAID || !session.channelId)
11
+ return undefined;
12
+ try {
13
+ const relation = readConfig(ConfigTarget.Relation, {
14
+ self: session.selfAID,
15
+ peerKey: formatPeerKey(session.channelType || session.channel, session.channelId),
16
+ }, { cache: true, expand: true });
17
+ return relation?.sessionIdleSec;
18
+ }
19
+ catch (error) {
20
+ logger.warn(`[SessionIdleMonitor] Failed to read relation config for ${session.id}: ${error instanceof Error ? error.message : String(error)}`);
21
+ return undefined;
22
+ }
23
+ }
7
24
  /**
8
25
  * Publishes one session:idle event after a runner task ends, using the
9
26
  * per-session relation configuration as the idle period.