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.
Files changed (148) hide show
  1. package/CHANGELOG.md +83 -0
  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 +1 -31
  6. package/dist/agents/codex-app-server-client.js +68 -0
  7. package/dist/agents/codex-runner.js +157 -5
  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/channels/aun.js +220 -112
  14. package/dist/channels/daemon.js +18 -4
  15. package/dist/channels/dingtalk.js +52 -137
  16. package/dist/channels/feishu.js +56 -4
  17. package/dist/channels/qqbot.js +23 -1
  18. package/dist/channels/wechat.js +303 -155
  19. package/dist/channels/wecom.js +383 -7
  20. package/dist/cli/aun-commands.js +11 -11
  21. package/dist/cli/daemon-commands.js +46 -15
  22. package/dist/cli/handoff-command.js +2 -1
  23. package/dist/cli/init-channel.js +185 -67
  24. package/dist/cli/init.js +49 -27
  25. package/dist/cli/trigger-command.js +92 -11
  26. package/dist/config/access-policy-domain.js +18 -0
  27. package/dist/config/access-policy.js +110 -0
  28. package/dist/config/builtin-role-templates.js +27 -14
  29. package/dist/config/builtin-roles.js +25 -6
  30. package/dist/config/config-field-policy.js +17 -5
  31. package/dist/config/config-manager.js +198 -22
  32. package/dist/config/config-operation-service.js +35 -38
  33. package/dist/config/contact-bind-code.js +274 -0
  34. package/dist/config/contact-book-store.js +173 -5
  35. package/dist/config/contact-book.js +32 -0
  36. package/dist/config/contact-operation-service.js +9 -3
  37. package/dist/config/contact-request-service.js +331 -0
  38. package/dist/config/peer-role-resolver.js +3 -1
  39. package/dist/config/schema-registry.js +49 -24
  40. package/dist/config-store.js +14 -2
  41. package/dist/core/auth/agent-delegation.js +105 -11
  42. package/dist/core/auth/authorization-audit.js +6 -0
  43. package/dist/core/auth/operation-authorizer.js +8 -0
  44. package/dist/core/auth/operation-catalog.js +51 -3
  45. package/dist/core/auth/trigger-authorization.js +15 -0
  46. package/dist/core/bootstrap-service.js +2 -9
  47. package/dist/core/channel-loader.js +6 -2
  48. package/dist/core/command/command-handler.js +10 -13
  49. package/dist/core/command/connect-menu.js +229 -26
  50. package/dist/core/command/evol-menu-version-gate.js +38 -0
  51. package/dist/core/command/group-menu.js +421 -0
  52. package/dist/core/command/menu-handler.js +269 -85
  53. package/dist/core/command/menu-protocol.js +8 -2
  54. package/dist/core/command/menu-token-store.js +102 -0
  55. package/dist/core/command/role-menu.js +16 -0
  56. package/dist/core/command/slash-gate.js +1 -1
  57. package/dist/core/command/slash-handler.js +158 -31
  58. package/dist/core/daemon-file-cache.js +28 -0
  59. package/dist/core/event-catalog.js +29 -0
  60. package/dist/core/evolagent-registry.js +4 -39
  61. package/dist/core/handoff/runtime.js +162 -37
  62. package/dist/core/handoff/store.js +46 -2
  63. package/dist/core/handoff/types.js +1 -0
  64. package/dist/core/inference/text-inference.js +16 -74
  65. package/dist/core/message/file-markers.js +7 -0
  66. package/dist/core/message/im-renderer.js +18 -14
  67. package/dist/core/message/inbound-admission.js +134 -0
  68. package/dist/core/message/message-bridge.js +616 -74
  69. package/dist/core/message/message-log.js +1 -0
  70. package/dist/core/message/message-queue.js +185 -10
  71. package/dist/core/message/peer-mode.js +7 -8
  72. package/dist/core/message/response-engine.js +381 -79
  73. package/dist/core/permission/approval-gateway.js +17 -10
  74. package/dist/core/permission/ec-command-parser.js +101 -46
  75. package/dist/core/permission/tool-policy.js +69 -24
  76. package/dist/core/protected-paths.js +36 -11
  77. package/dist/core/session/session-fs-store.js +19 -4
  78. package/dist/core/session/session-manager.js +232 -4
  79. package/dist/core/session/session-mapper.js +2 -0
  80. package/dist/core/session/session-renew.js +125 -69
  81. package/dist/core/session/session-turn-coordinator.js +5 -1
  82. package/dist/eck/kit-renderer.js +12 -1
  83. package/dist/eck/message-renderer.js +79 -1
  84. package/dist/index.js +224 -89
  85. package/dist/ipc.js +81 -4
  86. package/dist/paths.js +3 -0
  87. package/dist/response-system/config-resolver.js +29 -0
  88. package/dist/response-system/coordinator.js +8 -32
  89. package/dist/response-system/engines/v1/proactive-flow.js +1 -1
  90. package/dist/response-system/index.js +1 -0
  91. package/dist/response-system/modes/single-session/index.js +7 -4
  92. package/dist/trigger/parser.js +55 -15
  93. package/dist/trigger/patch.js +4 -1
  94. package/dist/trigger/scheduler.js +441 -39
  95. package/dist/utils/cross-platform.js +8 -2
  96. package/dist/utils/error-dict.json +7 -0
  97. package/dist/utils/evolcore-version.js +21 -0
  98. package/dist/utils/logger.js +2 -2
  99. package/dist/utils/process-introspect.js +19 -3
  100. package/dist/utils/stable-semver.js +21 -0
  101. package/dist/utils/stats.js +33 -9
  102. package/kits/docs/channels/aun.md +4 -13
  103. package/kits/docs/evolcore/INDEX.md +1 -1
  104. package/kits/docs/evolcore/config.md +47 -2
  105. package/kits/docs/evolcore/contact.md +8 -3
  106. package/kits/docs/evolcore/group-rules.md +46 -4
  107. package/kits/docs/evolcore/group.md +4 -4
  108. package/kits/docs/evolcore/msg.md +5 -5
  109. package/kits/docs/evolcore/trigger.md +25 -8
  110. package/kits/docs/path-registry.md +36 -17
  111. package/kits/eck_message_manifest.json +12 -1
  112. package/kits/migrations/migrate-contact-book-v2.mjs +7 -0
  113. package/kits/rules/01-overview.md +17 -7
  114. package/kits/rules/02-navigation.md +38 -18
  115. package/kits/rules/03-identity.md +28 -24
  116. package/kits/rules/04-relation.md +44 -28
  117. package/kits/rules/05-venue.md +31 -15
  118. package/kits/rules/06-channel.md +11 -7
  119. package/kits/schemas/_meta.json +18 -7
  120. package/kits/schemas/agent-config.schema.7.json +303 -0
  121. package/kits/schemas/agent-config.schema.8.json +304 -0
  122. package/kits/schemas/agent-config.schema.9.json +364 -0
  123. package/kits/schemas/contact-book.schema.3.json +67 -0
  124. package/kits/schemas/daemon.schema.1.json +3 -2
  125. package/kits/schemas/daemon.schema.2.json +101 -0
  126. package/kits/schemas/daemon.schema.3.json +123 -0
  127. package/kits/schemas/defaults.schema.2.json +85 -0
  128. package/kits/schemas/defaults.schema.3.json +73 -0
  129. package/kits/schemas/relation-config.schema.6.json +46 -0
  130. package/kits/schemas/relation-config.schema.7.json +59 -0
  131. package/kits/schemas/single-session.schema.2.json +57 -0
  132. package/kits/templates/message-fragments/handoff-context-to-target.md +9 -0
  133. package/kits/templates/message-fragments/handoff-request-to-target.md +14 -8
  134. package/kits/templates/message-fragments/handoff-response-to-origin.md +5 -6
  135. package/kits/templates/roles/admin.json +46 -0
  136. package/kits/templates/roles/member.json +4 -0
  137. package/kits/templates/roles/visitor.json +4 -0
  138. package/kits/templates/system-fragments/channel.md +12 -2
  139. package/kits/templates/system-fragments/identity.md +3 -1
  140. package/kits/templates/system-fragments/relation.md +1 -1
  141. package/kits/templates/system-fragments/session.md +6 -2
  142. package/package.json +4 -2
  143. package/MIGRATION-0.5.0.md +0 -378
  144. package/ROLE_ACCESS_CONTROL.md +0 -174
  145. package/dist/channels/contact-bind-code.js +0 -134
  146. package/dist/channels/wecom-card.js +0 -101
  147. package/dist/channels/wecom-onboarding.js +0 -82
  148. package/dist/channels/wecom-state.js +0 -191
@@ -0,0 +1,134 @@
1
+ import { AccessPolicyError, readAccessPolicy, } from '../../config/access-policy.js';
2
+ import { isAcceptedContact, resolveContactView, resolvePrincipal, } from '../../config/contact-book.js';
3
+ export function evaluateInboundAdmissionPreflight(input) {
4
+ const selfAid = String(input.selfAid || '').trim();
5
+ const channelType = String(input.channelType || '').trim().toLowerCase();
6
+ const actorId = String(input.actorId || '').trim();
7
+ const context = {
8
+ selfAid,
9
+ channelKey: input.channelKey,
10
+ channelType,
11
+ chatType: input.chatType,
12
+ actorId,
13
+ trustedHandoffEcho: input.trustedHandoffEcho === true,
14
+ isOwner: false,
15
+ };
16
+ if (context.trustedHandoffEcho)
17
+ return { allow: true, context };
18
+ if (!selfAid)
19
+ return { allow: false, reason: 'invalid_identity', context };
20
+ if (input.chatType === 'private') {
21
+ const principal = resolvePrincipal(selfAid, channelType, actorId, input.channelKey);
22
+ context.principal = principal;
23
+ context.primaryId = principal.principalId;
24
+ if (principal.principalStatus === 'conflict') {
25
+ return { allow: false, reason: 'identity_conflict', context };
26
+ }
27
+ if (principal.principalStatus === 'error') {
28
+ return { allow: false, reason: 'identity_resolution_error', context };
29
+ }
30
+ if (channelType === 'aun' && principal.principalStatus !== 'native_aid') {
31
+ return { allow: false, reason: 'invalid_identity', context };
32
+ }
33
+ if (principal.principalId) {
34
+ try {
35
+ const contact = resolveContactView(selfAid, principal.principalId);
36
+ context.contactStatus = contact.status;
37
+ context.contactSource = contact.source;
38
+ context.isOwner = contact.isOwner;
39
+ if (contact.blocked)
40
+ return { allow: false, reason: 'blocked', context };
41
+ }
42
+ catch {
43
+ return { allow: false, reason: 'identity_resolution_error', context };
44
+ }
45
+ }
46
+ }
47
+ else {
48
+ // Group admission is based on group membership in `contacts` mode, but
49
+ // owners mode still needs to identify an Owner sender. Resolve only the
50
+ // canonical identity needed for that distinction; group messages do not
51
+ // use contact status or private-channel blocking rules.
52
+ try {
53
+ const principal = resolvePrincipal(selfAid, channelType, actorId, input.channelKey);
54
+ if (principal.principalId) {
55
+ context.primaryId = principal.principalId;
56
+ context.isOwner = resolveContactView(selfAid, principal.principalId).isOwner;
57
+ }
58
+ }
59
+ catch {
60
+ // Open/contacts group admission remains membership-based even when a
61
+ // native identity cannot be resolved through the contact book.
62
+ }
63
+ }
64
+ try {
65
+ context.policy = readAccessPolicy(selfAid);
66
+ }
67
+ catch (error) {
68
+ if (error instanceof AccessPolicyError && error.code === 'restricted_mode_without_owner') {
69
+ return { allow: false, reason: 'restricted_mode_without_owner', context };
70
+ }
71
+ return { allow: false, reason: 'invalid_access_policy', context };
72
+ }
73
+ return { allow: true, context };
74
+ }
75
+ export function evaluateOrdinaryInboundAdmission(context) {
76
+ if (context.trustedHandoffEcho)
77
+ return { allow: true, reason: 'trusted_handoff', context };
78
+ const policy = context.policy;
79
+ if (!policy)
80
+ return { allow: false, reason: 'invalid_access_policy', context };
81
+ if (context.chatType === 'group') {
82
+ if (context.isOwner)
83
+ return { allow: true, reason: 'owner', context };
84
+ if (policy.policyMode === 'open' || policy.policyMode === 'contacts') {
85
+ return { allow: true, reason: 'group_channel_allowed', context };
86
+ }
87
+ return { allow: false, reason: 'owners', context };
88
+ }
89
+ if (context.isOwner)
90
+ return { allow: true, reason: 'owner', context };
91
+ if (policy.policyMode === 'open')
92
+ return { allow: true, reason: 'open', context };
93
+ if (policy.policyMode === 'owners')
94
+ return { allow: false, reason: 'owners', context };
95
+ if (context.primaryId && isAcceptedContact(context.selfAid, context.primaryId)) {
96
+ return { allow: true, reason: 'contact', context };
97
+ }
98
+ return { allow: false, reason: 'contact_required', context };
99
+ }
100
+ const principalReplyBuckets = new Map();
101
+ const channelReplyBuckets = new Map();
102
+ const PRINCIPAL_REPLY_MAX = 3;
103
+ const PRINCIPAL_REPLY_WINDOW_MS = 60 * 60 * 1000;
104
+ /** Atomically consume both admission-control reply budgets. */
105
+ export function consumeAdmissionReplyBudget(context, now = Date.now()) {
106
+ const principalKey = `${context.selfAid}\0${context.primaryId || context.actorId || '<unknown>'}`;
107
+ const channelKey = `${context.selfAid}\0${context.channelKey}`;
108
+ const policy = context.policy;
109
+ const maxTimes = policy?.requestLimit.maxTimes ?? 600;
110
+ const coolDownMs = (policy?.requestLimit.coolDown ?? 60 * 60) * 1000;
111
+ if (!canConsume(principalReplyBuckets.get(principalKey), PRINCIPAL_REPLY_MAX, PRINCIPAL_REPLY_WINDOW_MS, now)) {
112
+ return false;
113
+ }
114
+ if (!canConsume(channelReplyBuckets.get(channelKey), maxTimes, coolDownMs, now))
115
+ return false;
116
+ consume(principalReplyBuckets, principalKey, PRINCIPAL_REPLY_WINDOW_MS, now);
117
+ consume(channelReplyBuckets, channelKey, coolDownMs, now);
118
+ return true;
119
+ }
120
+ export function clearAdmissionReplyBudgets() {
121
+ principalReplyBuckets.clear();
122
+ channelReplyBuckets.clear();
123
+ }
124
+ function canConsume(bucket, limit, windowMs, now) {
125
+ return !bucket || now - bucket.windowStart >= windowMs || bucket.count < limit;
126
+ }
127
+ function consume(buckets, key, windowMs, now) {
128
+ const bucket = buckets.get(key);
129
+ if (!bucket || now - bucket.windowStart >= windowMs) {
130
+ buckets.set(key, { count: 1, windowStart: now });
131
+ return;
132
+ }
133
+ bucket.count += 1;
134
+ }