evolcore 0.0.35 → 0.0.37

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 (224) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +6 -0
  3. package/bin/install-codex-managed-hooks.mjs +20 -3
  4. package/dist/agents/baseagent-availability.js +1 -1
  5. package/dist/agents/baseagent.js +88 -0
  6. package/dist/agents/claude-runner.js +59 -12
  7. package/dist/agents/codex/app-server-client.js +18 -1
  8. package/dist/agents/codex-runner.js +262 -21
  9. package/dist/agents/ecagent-runner.js +47 -11
  10. package/dist/agents/gemini-runner.js +36 -12
  11. package/dist/aun/aid/client.js +4 -3
  12. package/dist/aun/aid/control-aid.js +270 -8
  13. package/dist/aun/aid/identity.js +6 -3
  14. package/dist/aun/aid/ownership-operation.js +58 -0
  15. package/dist/aun/aid/store.js +1 -0
  16. package/dist/aun/group/fs-download.js +67 -2
  17. package/dist/aun/group/history.js +20 -5
  18. package/dist/aun/group/operations.js +8 -2
  19. package/dist/aun/menu/client.js +39 -2
  20. package/dist/aun/menu/transport.js +1 -1
  21. package/dist/aun/msg/history.js +43 -4
  22. package/dist/aun/msg/managed-operation.js +30 -53
  23. package/dist/aun/msg/p2p.js +51 -15
  24. package/dist/aun/outbox.js +4 -0
  25. package/dist/channels/aun.js +260 -73
  26. package/dist/channels/daemon.js +6 -4
  27. package/dist/channels/feishu.js +3 -0
  28. package/dist/cli/agent-command.js +161 -223
  29. package/dist/cli/agent-create.js +190 -223
  30. package/dist/cli/agent.js +3 -1
  31. package/dist/cli/aid-bind-command.js +53 -0
  32. package/dist/cli/aun-commands.js +384 -91
  33. package/dist/cli/bench.js +1 -1
  34. package/dist/cli/cli-argv.js +74 -0
  35. package/dist/cli/daemon-commands.js +105 -74
  36. package/dist/cli/diag.js +1 -1
  37. package/dist/cli/fs-command.js +18 -19
  38. package/dist/cli/getmeta-command.js +159 -6
  39. package/dist/cli/index.js +6 -12
  40. package/dist/cli/init-channel.js +8 -55
  41. package/dist/cli/init.js +125 -218
  42. package/dist/cli/queue-command.js +11 -8
  43. package/dist/cli/restart-monitor.js +177 -85
  44. package/dist/cli/session-command.js +1 -1
  45. package/dist/cli/stats.js +7 -5
  46. package/dist/cli/thread-command.js +103 -30
  47. package/dist/cli/trigger-command.js +1 -1
  48. package/dist/cli/watch-msg-diag.js +1 -0
  49. package/dist/config/access-policy.js +2 -2
  50. package/dist/config/boot-log.js +14 -11
  51. package/dist/config/config-field-policy.js +9 -1
  52. package/dist/config/config-manager.js +176 -90
  53. package/dist/config/config-operation-service.js +7 -14
  54. package/dist/config/contact-book-store.js +142 -26
  55. package/dist/config/contact-book.js +4 -2
  56. package/dist/config/lifecycle.js +1 -1
  57. package/dist/config/owner-config.js +96 -0
  58. package/dist/config/peer-role-resolver.js +12 -18
  59. package/dist/config/providers-config.js +382 -0
  60. package/dist/config/providers-import.js +74 -0
  61. package/dist/config/providers-management.js +328 -0
  62. package/dist/config/providers.js +22 -0
  63. package/dist/config/resolved-config-op.js +17 -14
  64. package/dist/config/snapshot.js +28 -16
  65. package/dist/config-store.js +18 -14
  66. package/dist/core/agent-ipc-registration.js +21 -63
  67. package/dist/core/agent-runtime.js +16 -5
  68. package/dist/core/auth/agent-delegation.js +199 -25
  69. package/dist/core/auth/auth-gateway.js +44 -2
  70. package/dist/core/auth/authorization-denial.js +1 -1
  71. package/dist/core/auth/debug-context.js +2 -1
  72. package/dist/core/auth/delegation-authorization.js +2 -2
  73. package/dist/core/auth/delegation-diagnostics.js +4 -1
  74. package/dist/core/auth/operation-authorizer.js +10 -1
  75. package/dist/core/auth/operation-catalog.js +19 -1
  76. package/dist/core/bootstrap-service.js +43 -20
  77. package/dist/core/channel-loader.js +0 -1
  78. package/dist/core/channel-runtime.js +30 -4
  79. package/dist/core/command/agent-control.js +196 -37
  80. package/dist/core/command/cli-intent-parser.js +60 -4
  81. package/dist/core/command/command-handler.js +212 -60
  82. package/dist/core/command/connect-menu.js +1 -0
  83. package/dist/core/command/diag-service.js +5 -4
  84. package/dist/core/command/file-search.js +368 -0
  85. package/dist/core/command/menu-catalog.js +2 -1
  86. package/dist/core/command/menu-handler.js +292 -107
  87. package/dist/core/command/menu-protocol.js +23 -0
  88. package/dist/core/command/role-menu.js +7 -19
  89. package/dist/core/command/skill-slash.js +130 -25
  90. package/dist/core/command/slash-handler.js +101 -53
  91. package/dist/core/command/topic-slash.js +16 -5
  92. package/dist/core/daemon-bootstrap.js +7 -1
  93. package/dist/core/daemon-control.js +19 -1
  94. package/dist/core/daemon-lifecycle.js +2 -1
  95. package/dist/core/event-catalog.js +2 -0
  96. package/dist/core/evolagent-registry.js +13 -2
  97. package/dist/core/evolagent.js +3 -6
  98. package/dist/core/handoff/ipc-registration.js +2 -2
  99. package/dist/core/handoff/runtime.js +40 -6
  100. package/dist/core/handoff/store.js +1 -0
  101. package/dist/core/inference/text-inference.js +95 -6
  102. package/dist/core/ipc-registration.js +43 -24
  103. package/dist/core/memory/consolidation-context.js +4 -1
  104. package/dist/core/memory/consolidation.js +25 -14
  105. package/dist/core/message/aun-ipc-sender.js +296 -88
  106. package/dist/core/message/aun-request-registry.js +226 -0
  107. package/dist/core/message/create-status.js +33 -4
  108. package/dist/core/message/message-bridge.js +62 -13
  109. package/dist/core/message/message-log.js +0 -1
  110. package/dist/core/message/message-queue.js +4 -1
  111. package/dist/core/message/message-utils.js +8 -1
  112. package/dist/core/message/peer-mode.js +17 -9
  113. package/dist/core/message/response-engine.js +266 -124
  114. package/dist/core/message/retry-scheduler.js +11 -8
  115. package/dist/core/model/catalog-service.js +60 -18
  116. package/dist/core/model/model-catalog.js +112 -9
  117. package/dist/core/model/model-fallback.js +94 -26
  118. package/dist/core/ownership/owner-resolver.js +687 -0
  119. package/dist/core/permission/approval-gateway.js +196 -62
  120. package/dist/core/permission/ec-command-parser.js +138 -25
  121. package/dist/core/permission/filesystem-approval-scope.js +141 -0
  122. package/dist/core/permission/protected-paths.js +14 -1
  123. package/dist/core/permission/sandbox-runtime.js +171 -18
  124. package/dist/core/permission/tool-policy.js +13 -2
  125. package/dist/core/role/runtime-policy.js +3 -4
  126. package/dist/core/session/session-idle-monitor.js +10 -8
  127. package/dist/core/session/session-manager.js +72 -45
  128. package/dist/core/session/session-mapper.js +18 -7
  129. package/dist/core/session/session-renew.js +5 -4
  130. package/dist/core/session/session-title.js +2 -1
  131. package/dist/core/session/session-turn-coordinator.js +4 -2
  132. package/dist/core/skill/index-generator.js +2 -16
  133. package/dist/core/task/task-recovery-service.js +15 -2
  134. package/dist/core/thread/command-parser.js +28 -13
  135. package/dist/core/thread/index.js +1 -0
  136. package/dist/core/thread/ipc-operation.js +11 -8
  137. package/dist/core/thread/thread-operation.js +79 -44
  138. package/dist/core/thread/thread-route.js +54 -6
  139. package/dist/core/thread/thread-service.js +236 -45
  140. package/dist/core/thread/topic-id.js +248 -0
  141. package/dist/eck/kit-renderer.js +1 -1
  142. package/dist/eck/message-renderer.js +12 -2
  143. package/dist/index.js +50 -27
  144. package/dist/ipc.js +59 -6
  145. package/dist/paths.js +1 -0
  146. package/dist/product.js +1 -0
  147. package/dist/response-system/engines/v1/proactive-flow.js +10 -3
  148. package/dist/stats/db.js +8 -0
  149. package/dist/stats/writer.js +26 -4
  150. package/dist/trigger/authorization.js +48 -3
  151. package/dist/trigger/feedback.js +28 -10
  152. package/dist/trigger/ipc-service.js +86 -10
  153. package/dist/trigger/local-files.js +55 -23
  154. package/dist/trigger/scheduler.js +57 -11
  155. package/dist/trigger/system-definitions.js +1 -0
  156. package/dist/trigger/validation.js +44 -15
  157. package/dist/utils/aid-bind.js +17 -297
  158. package/dist/utils/avatar-upload.js +16 -4
  159. package/dist/utils/cross-platform.js +115 -36
  160. package/dist/utils/ecweb-supervisor.js +1 -1
  161. package/dist/utils/ecweb-utils.js +8 -1
  162. package/dist/utils/error-utils.js +44 -6
  163. package/dist/utils/instance-registry.js +12 -2
  164. package/dist/utils/npm-ops.js +102 -27
  165. package/dist/utils/package-version-info.js +72 -27
  166. package/dist/utils/restart-safety.js +50 -0
  167. package/dist/utils/upgrade-jobs.js +304 -0
  168. package/dist/utils/windows-autostart.js +17 -10
  169. package/kits/docs/INDEX.md +5 -0
  170. package/kits/docs/aun/ABILITY_CALLING.md +239 -0
  171. package/kits/docs/evolcore/INDEX.md +14 -3
  172. package/kits/docs/evolcore/agent-create.md +55 -141
  173. package/kits/docs/evolcore/agent.md +38 -16
  174. package/kits/docs/evolcore/aid.md +34 -0
  175. package/kits/docs/evolcore/config.md +20 -1
  176. package/kits/docs/evolcore/event.md +2 -2
  177. package/kits/docs/evolcore/fs.md +18 -2
  178. package/kits/docs/evolcore/group-collaboration.md +13 -246
  179. package/kits/docs/evolcore/group.md +2 -1
  180. package/kits/docs/evolcore/memory-consolidation-batches.md +1 -1
  181. package/kits/docs/evolcore/menu-protocol.md +65 -1
  182. package/kits/docs/evolcore/msg.md +64 -2
  183. package/kits/docs/evolcore/skill.md +86 -0
  184. package/kits/docs/evolcore/stats.md +6 -0
  185. package/kits/docs/evolcore/task.md +2 -0
  186. package/kits/docs/evolcore/thread-chain.md +145 -51
  187. package/kits/docs/evolcore/trigger.md +48 -3
  188. package/kits/eck_manifest.json +21 -0
  189. package/kits/eck_message_manifest.json +4 -4
  190. package/kits/migrations/migrate-role-config-v5.mjs +20 -7
  191. package/kits/rules/01-overview.md +2 -1
  192. package/kits/rules/03-identity.md +3 -1
  193. package/kits/rules/04-relation.md +1 -1
  194. package/kits/rules/07-memory-and-thread.md +1 -1
  195. package/kits/schemas/_meta.json +16 -1
  196. package/kits/schemas/agent-config.schema.13.json +44 -2
  197. package/kits/schemas/contact-book.schema.3.json +5 -0
  198. package/kits/schemas/daemon.schema.6.json +3 -1
  199. package/kits/schemas/daemon.schema.8.json +329 -0
  200. package/kits/schemas/defaults.schema.5.json +39 -3
  201. package/kits/schemas/providers.schema.1.json +76 -0
  202. package/kits/schemas/relation-config.schema.9.json +5 -1
  203. package/kits/skills/.switches.json +28 -0
  204. package/kits/skills/aid-ability/SKILL.md +214 -0
  205. package/kits/skills/ec-agent-create/SKILL.md +162 -0
  206. package/kits/skills/ec-group/SKILL.md +2 -1
  207. package/kits/skills/ec-group-collaboration/SKILL.md +228 -0
  208. package/kits/skills/ec-identity/SKILL.md +143 -0
  209. package/kits/skills/ec-skill/scripts/cli.mjs +36 -3
  210. package/kits/skills/ec-skill/scripts/skill.mjs +202 -15
  211. package/kits/skills/ec-trigger/SKILL.md +167 -0
  212. package/kits/skills/ec-trigger/references/examples.md +153 -0
  213. package/kits/skills/thread-ops/SKILL.md +108 -420
  214. package/kits/templates/message-fragments/thread-context.md +1 -2
  215. package/kits/templates/message-fragments/trigger-thread-check.md +1 -1
  216. package/kits/templates/roles/member.json +1 -1
  217. package/kits/templates/roles/visitor.json +1 -0
  218. package/kits/templates/system-fragments/bootstrap.md +1 -0
  219. package/kits/templates/system-fragments/channel.md +2 -1
  220. package/kits/templates/system-fragments/commands.md +5 -4
  221. package/kits/templates/system-fragments/identity.md +2 -0
  222. package/kits/templates/system-fragments/session.md +1 -1
  223. package/kits/templates/system-fragments/venue.md +1 -1
  224. package/package.json +4 -3
@@ -11,6 +11,7 @@ import { ipcQuery } from '../../ipc.js';
11
11
  import { readDelegationCredential } from '../../core/auth/agent-delegation.js';
12
12
  import { loadDaemonConfig } from '../../config-store.js';
13
13
  import { normalizeAunMentionEntries, withAunAttention } from './mention-schema.js';
14
+ import { isTopicThreadId } from '../../core/thread/topic-id.js';
14
15
  const DAEMON_SEND_TIMEOUT_GRACE_MS = 10_000;
15
16
  const DEFAULT_IDLE_TIMEOUT_MS = 120_000;
16
17
  const MAX_TIMER_MS = 2_147_483_647;
@@ -27,7 +28,7 @@ function readDaemonConfigForSend() {
27
28
  return {};
28
29
  }
29
30
  }
30
- export function daemonTaskSendIpcTimeoutMs(file = false) {
31
+ export function daemonTaskSendIpcTimeoutMs(file = false, requestTimeoutMs) {
31
32
  let idleTimeoutMs = DEFAULT_IDLE_TIMEOUT_MS;
32
33
  // Use the ConfigStore read path so managed tasks never open daemon.json
33
34
  // directly. The daemon-owned config reader handles missing, invalid, and
@@ -36,7 +37,7 @@ export function daemonTaskSendIpcTimeoutMs(file = false) {
36
37
  if (typeof seconds === 'number' && Number.isFinite(seconds) && seconds > 0) {
37
38
  idleTimeoutMs = seconds * 1000;
38
39
  }
39
- return Math.min(MAX_TIMER_MS, Math.max(file ? 120_000 : 5_000, idleTimeoutMs + DAEMON_SEND_TIMEOUT_GRACE_MS));
40
+ return Math.min(MAX_TIMER_MS, Math.max(file ? 120_000 : 5_000, idleTimeoutMs + DAEMON_SEND_TIMEOUT_GRACE_MS, (requestTimeoutMs ?? 0) + DAEMON_SEND_TIMEOUT_GRACE_MS));
40
41
  }
41
42
  export function resolveAunMessageEncrypt(explicit) {
42
43
  if (typeof explicit === 'boolean')
@@ -59,6 +60,9 @@ function buildSimplePayload(body) {
59
60
  }
60
61
  }
61
62
  }
63
+ function isRawPayloadBody(body) {
64
+ return body.mode === 'payload';
65
+ }
62
66
  function messageLogContent(body) {
63
67
  return body.mode === 'text' ? body.text
64
68
  : body.mode === 'link' ? `[link] ${body.url}`
@@ -67,8 +71,13 @@ function messageLogContent(body) {
67
71
  }
68
72
  function applyRoutingPayloadFields(payload, args, runtimeContext, includeRuntimeRef = true) {
69
73
  const threadId = msgSendThreadId(args, payload, runtimeContext);
70
- if (threadId)
74
+ // 主话题的规范 id(`main:<a>:<b>`)是本端身份,不进线上报文:主话题的线上
75
+ // 形态就是"不带 thread_id",对端按无话题落到同一条关系的主话题。
76
+ // `args.thread` 可能是历史写法(裸对端 AID / `<peer>/<id>`),同样只放行话题。
77
+ if (isTopicThreadId(threadId))
71
78
  payload.thread_id = threadId;
79
+ else if (payload.thread_id !== undefined)
80
+ delete payload.thread_id;
72
81
  if (!includeRuntimeRef)
73
82
  return;
74
83
  const refMessageId = runtimeRefMessageIdForMsgSend({ from: args.from, runtime: runtimeContext });
@@ -125,21 +134,24 @@ async function tryDaemonMsgSend(args, payload, runtimeContext, file) {
125
134
  if (args.slotId || args.aunPath) {
126
135
  return { ok: false, code: 'INVALID_DELEGATION', error: 'Task sends cannot override the daemon AUN connection' };
127
136
  }
128
- const thread = msgSendThreadId(args, payload, runtimeContext);
137
+ const thread = args.body.mode === 'payload' ? undefined : msgSendThreadId(args, payload, runtimeContext);
129
138
  const response = await ipcQuery(resolvePaths().socket, {
130
139
  type: 'aun-msg-send',
131
140
  aid: args.from,
132
141
  to: args.to,
133
142
  scope: 'msg',
134
143
  ...(payload ? { payload } : { file }),
144
+ rawPayload: args.body.mode === 'payload',
135
145
  encrypt: args.encrypt,
146
+ returnPolicy: args.returnPolicy,
147
+ timeoutMs: args.timeoutMs,
136
148
  thread,
137
149
  handoffContext: args.handoffContext,
138
150
  originSessionId: runtimeContext.sessionId,
139
151
  originMessageId: runtimeContext.messageId,
140
152
  delegationToken: readDelegationCredential(),
141
153
  log: msgSendLogMetadata(args, payload, runtimeContext),
142
- }, daemonTaskSendIpcTimeoutMs(!!file), { throwOnError: true });
154
+ }, daemonTaskSendIpcTimeoutMs(!!file, args.returnPolicy === 'required' ? (args.timeoutMs ?? 60_000) : undefined), { throwOnError: true });
143
155
  return response ?? {
144
156
  ok: false,
145
157
  code: 'AUN_DAEMON_UNAVAILABLE',
@@ -154,9 +166,14 @@ async function daemonMsgSendResult(args, payload, runtimeContext, daemonResult)
154
166
  code: daemonResult.code,
155
167
  handoff_id: daemonResult.handoff_id,
156
168
  target_session_id: daemonResult.target_session_id,
169
+ request_id: daemonResult.request_id,
170
+ request_state: daemonResult.request_state,
157
171
  };
158
172
  }
159
- if (!daemonResult.message_id && !daemonResult.handoff_id) {
173
+ const completedRequest = args.returnPolicy === 'required' && !!daemonResult.request_id
174
+ && daemonResult.request_state === 'completed' && !!daemonResult.response
175
+ && typeof daemonResult.response === 'object' && !Array.isArray(daemonResult.response);
176
+ if (!daemonResult.message_id && !daemonResult.handoff_id && !completedRequest) {
160
177
  return { ok: false, error: 'daemon AUN message send returned no message_id' };
161
178
  }
162
179
  const sent = {
@@ -168,8 +185,12 @@ async function daemonMsgSendResult(args, payload, runtimeContext, daemonResult)
168
185
  timestamp: daemonResult.timestamp,
169
186
  status: daemonResult.status,
170
187
  delivery_mode: daemonResult.delivery_mode,
188
+ request_id: daemonResult.request_id,
189
+ request_state: daemonResult.request_state,
190
+ response: daemonResult.response,
191
+ transport_error: daemonResult.transport_error,
171
192
  };
172
- if (!daemonResult.handoff_id && !daemonResult.log_written) {
193
+ if (sent.message_id && !daemonResult.handoff_id && !daemonResult.log_written) {
173
194
  await appendMsgSendOutboundLog(args, sent, {
174
195
  payload,
175
196
  runtimeContext,
@@ -227,11 +248,14 @@ export async function msgSend(args) {
227
248
  try {
228
249
  let payload;
229
250
  if (args.body.mode !== 'file') {
230
- payload = withAunAttention(buildSimplePayload(args.body));
231
- if (Object.prototype.hasOwnProperty.call(payload, 'mentions')) {
251
+ payload = args.body.mode === 'payload'
252
+ ? buildSimplePayload(args.body)
253
+ : withAunAttention(buildSimplePayload(args.body));
254
+ if (args.body.mode !== 'payload' && Object.prototype.hasOwnProperty.call(payload, 'mentions')) {
232
255
  payload.mentions = normalizeAunMentionEntries(payload.mentions);
233
256
  }
234
- applyRoutingPayloadFields(payload, args, runtimeContext, false);
257
+ if (!isRawPayloadBody(args.body))
258
+ applyRoutingPayloadFields(payload, args, runtimeContext, false);
235
259
  const daemonResult = await tryDaemonMsgSend(args, payload, runtimeContext);
236
260
  if (daemonResult)
237
261
  return daemonMsgSendResult(args, payload, runtimeContext, daemonResult);
@@ -248,6 +272,13 @@ export async function msgSend(args) {
248
272
  return daemonMsgSendResult(args, { type: args.body.as || 'file' }, runtimeContext, daemonResult);
249
273
  }
250
274
  }
275
+ if (args.returnPolicy === 'required') {
276
+ return {
277
+ ok: false,
278
+ code: 'REQUEST_WAIT_REQUIRES_DAEMON',
279
+ error: 'request/reply waiting requires a managed EvolCore daemon session',
280
+ };
281
+ }
251
282
  conn = await createShortConnection(args.from, { aunPath: args.aunPath, slotId: args.slotId });
252
283
  if (args.body.mode === 'file') {
253
284
  const built = await uploadFileAndBuildPayload(conn, args.from, args.body.filePath, {
@@ -302,15 +333,20 @@ export async function msgSend(args) {
302
333
  payload = buildSimplePayload(args.body);
303
334
  }
304
335
  // 4. 写入 payload.chatmode
305
- payload.chatmode = chatmode;
336
+ if (args.body.mode !== 'payload')
337
+ payload.chatmode = chatmode;
306
338
  // 5. 写入 payload.thread_id/ref_message_id(如果指定)
307
- applyRoutingPayloadFields(payload, args, runtimeContext, false);
308
- applyRoutingPayloadFields(payload, args, runtimeContext);
309
- if (Object.prototype.hasOwnProperty.call(payload, 'mentions')) {
339
+ if (args.body.mode !== 'payload') {
340
+ if (!isRawPayloadBody(args.body))
341
+ applyRoutingPayloadFields(payload, args, runtimeContext, false);
342
+ applyRoutingPayloadFields(payload, args, runtimeContext);
343
+ }
344
+ if (args.body.mode !== 'payload' && Object.prototype.hasOwnProperty.call(payload, 'mentions')) {
310
345
  payload.mentions = normalizeAunMentionEntries(payload.mentions);
311
346
  }
312
347
  const encrypt = resolveAunMessageEncrypt(args.encrypt);
313
- payload = withAunAttention(payload);
348
+ if (args.body.mode !== 'payload')
349
+ payload = withAunAttention(payload);
314
350
  const sendParams = { to: args.to, payload, encrypt };
315
351
  const result = await conn.call('message.send', sendParams);
316
352
  const messageId = typeof result?.message_id === 'string' && result.message_id.trim()
@@ -229,6 +229,10 @@ export function removeInteractionCards(aid, requestId, queue = 'default') {
229
229
  export function load(aid, queue = 'default') {
230
230
  return readEntries(aid, queue).filter(e => !e.terminal && !e.deliveryResult && !isExpired(e));
231
231
  }
232
+ export function findInteractionCards(aid, requestId) {
233
+ return readEntries(aid).filter(entry => entry.postSend?.type === 'register_interaction_card'
234
+ && entry.postSend.requestId === requestId);
235
+ }
232
236
  export function findByDedupeKey(aid, dedupeKey, opts = {}, queue = 'default') {
233
237
  const entries = opts.includeTerminal
234
238
  ? readEntries(aid, queue).filter(entry => !isExpired(entry))