evolcore 0.0.26 → 0.0.27

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 (169) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/bin/codex-managed-acl.ps1 +43 -0
  3. package/dist/agents/baseagent-availability.js +68 -0
  4. package/dist/agents/claude-runner.js +123 -22
  5. package/dist/agents/codex/app-server-client.js +63 -26
  6. package/dist/agents/codex-runner.js +316 -411
  7. package/dist/agents/ecagent-runner.js +170 -25
  8. package/dist/agents/gemini-runner.js +6 -0
  9. package/dist/agents/runner-types.js +50 -2
  10. package/dist/aun/aid/agentmd.js +73 -31
  11. package/dist/aun/aid/client.js +1 -1
  12. package/dist/aun/aid/control-aid.js +180 -1
  13. package/dist/aun/aid/identity.js +3 -3
  14. package/dist/aun/group/history.js +303 -0
  15. package/dist/aun/group/identity.js +43 -0
  16. package/dist/aun/group/index.js +5 -0
  17. package/dist/aun/{msg/group.js → group/operations.js} +161 -38
  18. package/dist/aun/{menu-client.js → menu/client.js} +12 -7
  19. package/dist/aun/menu/index.js +2 -0
  20. package/dist/aun/menu/transport.js +49 -0
  21. package/dist/aun/msg/index.js +2 -1
  22. package/dist/aun/msg/managed-operation.js +84 -18
  23. package/dist/aun/msg/mention-schema.js +51 -0
  24. package/dist/aun/msg/p2p.js +13 -8
  25. package/dist/aun/msg/upload.js +43 -88
  26. package/dist/aun/outbox.js +29 -7
  27. package/dist/aun/rpc/client.js +1 -0
  28. package/dist/aun/storage/client.js +39 -50
  29. package/dist/channels/aun.js +522 -233
  30. package/dist/channels/daemon.js +10 -6
  31. package/dist/cli/agent-command.js +108 -6
  32. package/dist/cli/agent-create.js +515 -2
  33. package/dist/cli/agent.js +109 -8
  34. package/dist/cli/aun-commands.js +191 -42
  35. package/dist/cli/config.js +8 -5
  36. package/dist/cli/contact.js +2 -2
  37. package/dist/cli/ctl-command.js +2 -2
  38. package/dist/cli/daemon-commands.js +35 -23
  39. package/dist/cli/diag.js +2 -2
  40. package/dist/cli/fs-command.js +3 -3
  41. package/dist/cli/handoff-command.js +6 -6
  42. package/dist/cli/index.js +8 -2
  43. package/dist/cli/init.js +34 -1
  44. package/dist/cli/managed-command-guard.js +2 -1
  45. package/dist/cli/menu-client.js +9 -5
  46. package/dist/cli/model.js +3 -3
  47. package/dist/cli/queue-command.js +2 -2
  48. package/dist/cli/response.js +2 -2
  49. package/dist/cli/restart-monitor.js +16 -2
  50. package/dist/cli/task-command.js +59 -0
  51. package/dist/cli/task-context.js +97 -49
  52. package/dist/cli/trigger-command.js +20 -10
  53. package/dist/config/builtin-roles.js +10 -0
  54. package/dist/config/config-field-policy.js +11 -0
  55. package/dist/config/config-manager.js +32 -4
  56. package/dist/config/config-operation-service.js +20 -5
  57. package/dist/config/contact-book-store.js +1 -1
  58. package/dist/config/contact-book.js +1 -1
  59. package/dist/config/contact-operation-service.js +1 -1
  60. package/dist/config/peer-role-resolver.js +1 -1
  61. package/dist/config/resolved-config-op.js +3 -0
  62. package/dist/config-store.js +1 -1
  63. package/dist/core/agent-application-service.js +5 -0
  64. package/dist/core/audit/event-key.js +17 -2
  65. package/dist/core/audit/log-integrity.js +34 -8
  66. package/dist/core/auth/agent-delegation.js +48 -14
  67. package/dist/core/auth/auth-gateway.js +2 -0
  68. package/dist/core/auth/authorization-audit.js +34 -38
  69. package/dist/core/auth/operation-authorizer.js +67 -5
  70. package/dist/core/auth/operation-catalog.js +110 -0
  71. package/dist/core/auth/remote-access-store.js +115 -9
  72. package/dist/core/bootstrap-messages.js +66 -7
  73. package/dist/core/bootstrap-service.js +110 -19
  74. package/dist/core/command/agent-control.js +88 -7
  75. package/dist/core/command/agent-storage-menu.js +443 -0
  76. package/dist/core/command/cli-intent-parser.js +19 -0
  77. package/dist/core/command/command-handler.js +76 -39
  78. package/dist/core/command/data-root-resolver.js +273 -0
  79. package/dist/core/command/group-menu.js +7 -2
  80. package/dist/core/command/menu-catalog.js +34 -4
  81. package/dist/core/command/menu-handler.js +348 -77
  82. package/dist/core/command/menu-protocol.js +40 -6
  83. package/dist/core/command/role-menu.js +2 -2
  84. package/dist/core/command/slash-handler.js +37 -22
  85. package/dist/core/event-catalog.js +4 -0
  86. package/dist/core/evolagent-registry.js +28 -2
  87. package/dist/core/group/invite-service.js +924 -0
  88. package/dist/core/interaction-router.js +22 -8
  89. package/dist/core/message/im-renderer.js +76 -15
  90. package/dist/core/message/message-bridge.js +94 -11
  91. package/dist/core/message/message-log.js +5 -3
  92. package/dist/core/message/message-queue.js +73 -41
  93. package/dist/core/message/response-engine.js +709 -117
  94. package/dist/core/permission/approval-gateway.js +36 -3
  95. package/dist/core/permission/ec-command-parser.js +61 -29
  96. package/dist/core/permission/protected-paths.js +134 -16
  97. package/dist/core/permission/sandbox-runtime.js +72 -3
  98. package/dist/core/permission/tool-error-code.js +15 -0
  99. package/dist/core/permission/tool-policy.js +7 -7
  100. package/dist/core/relation/peer-identity.js +57 -6
  101. package/dist/core/relation/shared-data.js +106 -0
  102. package/dist/core/role/runtime-policy.js +64 -0
  103. package/dist/core/runtime-lock.js +10 -26
  104. package/dist/core/session/runner-task-history.js +170 -0
  105. package/dist/core/session/session-manager.js +34 -6
  106. package/dist/core/session/session-mapper.js +41 -0
  107. package/dist/core/session/session-turn-coordinator.js +37 -7
  108. package/dist/core/session/session-turns.js +48 -7
  109. package/dist/core/task/task-recovery-service.js +176 -0
  110. package/dist/core/task/task-resume-operation.js +32 -0
  111. package/dist/eck/group-rules-sync.js +5 -3
  112. package/dist/eck/kit-renderer.js +1 -0
  113. package/dist/index.js +308 -54
  114. package/dist/ipc.js +141 -15
  115. package/dist/paths.js +17 -4
  116. package/dist/product.js +2 -0
  117. package/dist/trigger/event-source.js +19 -0
  118. package/dist/trigger/feedback.js +233 -40
  119. package/dist/trigger/parser.js +55 -5
  120. package/dist/trigger/patch.js +9 -0
  121. package/dist/trigger/scheduler.js +30 -4
  122. package/dist/trigger/validation.js +20 -3
  123. package/dist/utils/ecweb-utils.js +1 -0
  124. package/dist/utils/error-utils.js +40 -2
  125. package/dist/utils/logger.js +23 -13
  126. package/dist/utils/tool-summary.js +59 -3
  127. package/dist/utils/welcome.js +174 -1
  128. package/ecagent/dist/harness/agent-harness.js +3 -0
  129. package/ecagent/dist/harness/session/jsonl-storage.js +21 -2
  130. package/kits/docs/INDEX.md +0 -6
  131. package/kits/docs/channels/aun.md +15 -2
  132. package/kits/docs/channels/feishu.md +1 -1
  133. package/kits/docs/context-assembly.md +29 -17
  134. package/kits/docs/evolcore/INDEX.md +8 -3
  135. package/kits/docs/evolcore/agent-create.md +39 -7
  136. package/kits/docs/evolcore/agent.md +33 -1
  137. package/kits/docs/evolcore/aid.md +9 -1
  138. package/kits/docs/evolcore/config.md +40 -1
  139. package/kits/docs/evolcore/group-collaboration.md +1 -1
  140. package/kits/docs/evolcore/group.md +117 -2
  141. package/kits/docs/evolcore/menu-client.md +16 -0
  142. package/kits/docs/evolcore/msg.md +3 -0
  143. package/kits/docs/evolcore/storage.md +3 -0
  144. package/kits/docs/evolcore/task.md +14 -0
  145. package/kits/docs/evolcore/trigger.md +51 -3
  146. package/kits/docs/venues/group.md +5 -0
  147. package/kits/eck_manifest.json +27 -0
  148. package/kits/rules/01-overview.md +11 -7
  149. package/kits/rules/04-relation.md +2 -1
  150. package/kits/rules/05-venue.md +1 -1
  151. package/kits/rules/06-channel.md +6 -4
  152. package/kits/schemas/agent-config.schema.12.json +25 -1
  153. package/kits/schemas/daemon.schema.6.json +2 -2
  154. package/kits/schemas/defaults.schema.5.json +1 -1
  155. package/kits/schemas/relation-config.schema.1.json +1 -1
  156. package/kits/schemas/relation-config.schema.5.json +1 -1
  157. package/kits/schemas/role-config.schema.1.json +14 -0
  158. package/kits/templates/roles/member.json +5 -0
  159. package/kits/templates/roles/visitor.json +5 -0
  160. package/kits/templates/system-fragments/baseagent.md +1 -1
  161. package/kits/templates/system-fragments/bootstrap.md +26 -9
  162. package/kits/templates/system-fragments/channel.md +8 -44
  163. package/kits/templates/system-fragments/commands.md +10 -2
  164. package/kits/templates/system-fragments/group-unread-history.md +7 -0
  165. package/kits/templates/system-fragments/reply.md +56 -0
  166. package/package.json +7 -3
  167. package/dist/aun/group-identity.js +0 -9
  168. /package/dist/aun/{group-fs-download.js → group/fs-download.js} +0 -0
  169. /package/dist/aun/{msg/group-index.js → group/index-rpc.js} +0 -0
@@ -4,6 +4,7 @@ import { logger } from '../../utils/logger.js';
4
4
  import { LogicalQueueBridge } from './logical-queue-bridge.js';
5
5
  import { normalizeCausation } from '../causation/context.js';
6
6
  import { KeyedFairMutex } from '../handoff/mutex.js';
7
+ import { ExecutionTimeoutError, OrphanedTargetSessionError, isExecutionFailure } from '../../utils/error-utils.js';
7
8
  const DEFAULT_AGENT_NAME = '<unknown>';
8
9
  const RESTART_RESUME_CONTENT = 'evolcore 服务已重启,请继续之前未完成的任务。';
9
10
  export class MessageQueue {
@@ -52,7 +53,7 @@ export class MessageQueue {
52
53
  setInterruptCallback(callback) {
53
54
  this.interruptCallback = callback;
54
55
  }
55
- triggerInterrupt(queueKey, sessionKey, baseagent, evolagentName, reason) {
56
+ triggerInterrupt(queueKey, sessionKey, baseagent, evolagentName, reason, timeout) {
56
57
  const existing = this.interruptBarriers.get(queueKey);
57
58
  if (existing)
58
59
  return existing;
@@ -61,7 +62,9 @@ export class MessageQueue {
61
62
  this.activeTerminalReasons.set(queueKey, reason);
62
63
  let interruption;
63
64
  try {
64
- interruption = Promise.resolve(this.interruptCallback(sessionKey, baseagent, evolagentName, reason));
65
+ interruption = Promise.resolve(timeout
66
+ ? this.interruptCallback(sessionKey, baseagent, evolagentName, reason, timeout)
67
+ : this.interruptCallback(sessionKey, baseagent, evolagentName, reason));
65
68
  }
66
69
  catch (error) {
67
70
  interruption = Promise.reject(error);
@@ -980,7 +983,8 @@ export class MessageQueue {
980
983
  this.persistQueuesImmediate();
981
984
  }
982
985
  else if (message.messageId) {
983
- void this.cancelActiveAndWait(message.messageId, message.selfAID).finally(() => {
986
+ const timeout = isExecutionFailure(options?.signal?.reason) ? options.signal.reason : undefined;
987
+ void this.cancelActiveAndWait(message.messageId, message.selfAID, timeout).finally(() => {
984
988
  this.forgetProcessed(sessionKey, message);
985
989
  settleReject(error);
986
990
  });
@@ -1262,7 +1266,9 @@ export class MessageQueue {
1262
1266
  return result;
1263
1267
  }
1264
1268
  isMergeBarrier(message) {
1265
- return !!message.executionPermissionOverride
1269
+ return !!message.taskRecovery
1270
+ || !!message.asyncQuestionAnswer
1271
+ || !!message.executionPermissionOverride
1266
1272
  || !!message.handoffDelivery
1267
1273
  || !!message.triggerMeta
1268
1274
  || !!message.causation?.trigger?.path.length;
@@ -1525,12 +1531,14 @@ export class MessageQueue {
1525
1531
  return cancellation.found;
1526
1532
  }
1527
1533
  /** Cancel an active message and wait until the runner interrupt barrier settles. */
1528
- async cancelActiveAndWait(messageId, selfAID) {
1529
- const cancellation = this.beginActiveCancellation(messageId, selfAID);
1534
+ async cancelActiveAndWait(messageId, selfAID, cause) {
1535
+ const cancellation = this.beginActiveCancellation(messageId, selfAID, cause);
1530
1536
  await cancellation.barrier;
1531
1537
  return cancellation.found;
1532
1538
  }
1533
- beginActiveCancellation(messageId, selfAID) {
1539
+ beginActiveCancellation(messageId, selfAID, cause) {
1540
+ const reason = cause instanceof ExecutionTimeoutError ? 'timeout'
1541
+ : cause instanceof OrphanedTargetSessionError ? 'execution_error' : cause ?? 'recalled';
1534
1542
  for (const [queueKey, activeState] of this.activeStates.entries()) {
1535
1543
  if (!activeState.messageIds.has(messageId))
1536
1544
  continue;
@@ -1558,18 +1566,20 @@ export class MessageQueue {
1558
1566
  }
1559
1567
  const sessionKey = this.sessionKeyFromQueueKey(queueKey);
1560
1568
  const agentName = this.processingAgent.get(queueKey);
1561
- logger.info(`[Queue] Recalled active message ${messageId}, interrupting session ${sessionKey}`);
1562
- this.eventBus?.publish({
1563
- type: 'task:interrupted',
1564
- sessionId: sessionKey,
1565
- reason: 'recalled',
1566
- agentName,
1567
- taskId: activeState?.taskId,
1568
- generation: activeState?.generation,
1569
- causation: active?.message.causation,
1570
- });
1569
+ logger.info(`[Queue] Cancelled active message ${messageId}, interrupting session ${sessionKey}: ${reason}`);
1570
+ // TimeoutController owns the failure event and outbound timeout terminal.
1571
+ if (reason !== 'timeout' && reason !== 'execution_error')
1572
+ this.eventBus?.publish({
1573
+ type: 'task:interrupted',
1574
+ sessionId: sessionKey,
1575
+ reason,
1576
+ agentName,
1577
+ taskId: activeState?.taskId,
1578
+ generation: activeState?.generation,
1579
+ causation: active?.message.causation,
1580
+ });
1571
1581
  const barrier = this.interruptCallback
1572
- ? this.triggerInterrupt(queueKey, sessionKey, activeState.baseagent, agentName, 'recalled')
1582
+ ? this.triggerInterrupt(queueKey, sessionKey, activeState.baseagent, agentName, reason, isExecutionFailure(cause) ? cause : undefined)
1573
1583
  : Promise.resolve();
1574
1584
  return { found: true, barrier };
1575
1585
  }
@@ -1603,33 +1613,11 @@ export class MessageQueue {
1603
1613
  }
1604
1614
  let releasePromise;
1605
1615
  const promise = new Promise(resolve => { releasePromise = resolve; });
1606
- let queued = 0;
1607
- let active = false;
1608
- let dispatching = false;
1609
- for (const [queueKey, queue] of this.queues.entries()) {
1610
- if (!this.matchesSession(queueKey, sessionKey))
1611
- continue;
1612
- queued += this.queueRawMessageCount(queue);
1613
- if (this.processing.has(queueKey) || this.activeBatches.has(queueKey))
1614
- active = true;
1615
- if (this.processing.has(queueKey) && !this.activeBatches.has(queueKey))
1616
- dispatching = true;
1617
- }
1618
- for (const queueKey of this.activeBatches.keys()) {
1619
- if (this.matchesSession(queueKey, sessionKey))
1620
- active = true;
1621
- }
1622
1616
  const state = {
1623
1617
  promise,
1624
1618
  releasePromise,
1625
1619
  holders: 1,
1626
- snapshot: {
1627
- prequeue: this.prequeueReservations.get(sessionKey) ?? 0,
1628
- active,
1629
- queued,
1630
- dispatching,
1631
- cutoff: this.enqueueSequence,
1632
- },
1620
+ snapshot: this.getSessionSnapshot(sessionKey),
1633
1621
  };
1634
1622
  this.externalLocks.set(sessionKey, state);
1635
1623
  let released = false;
@@ -1648,6 +1636,50 @@ export class MessageQueue {
1648
1636
  },
1649
1637
  };
1650
1638
  }
1639
+ /** Live admission state, including work that arrived after an older gate. */
1640
+ getMessageState(sessionId, messageId, selfAid) {
1641
+ for (const [key, queue] of this.queues) {
1642
+ if (this.matchesSession(key, sessionId) && queue.some(item => this.partsOf(item)
1643
+ .some(part => this.partMatchesMessage(part, messageId, selfAid, key))))
1644
+ return { state: 'queued' };
1645
+ }
1646
+ for (const [key, item] of this.activeBatches) {
1647
+ if (this.matchesSession(key, sessionId) && this.partsOf(item)
1648
+ .some(part => this.partMatchesMessage(part, messageId, selfAid, key))) {
1649
+ return { state: 'active' };
1650
+ }
1651
+ }
1652
+ return { state: 'missing' };
1653
+ }
1654
+ /** Live admission state, including work that arrived after an older gate. */
1655
+ getSessionSnapshot(sessionKey) {
1656
+ let queued = 0;
1657
+ let active = false;
1658
+ let dispatching = false;
1659
+ const activeTaskIds = new Set();
1660
+ for (const [queueKey, queue] of this.queues.entries()) {
1661
+ if (!this.matchesSession(queueKey, sessionKey))
1662
+ continue;
1663
+ queued += this.queueRawMessageCount(queue);
1664
+ if (this.processing.has(queueKey) || this.activeBatches.has(queueKey))
1665
+ active = true;
1666
+ if (this.processing.has(queueKey) && !this.activeBatches.has(queueKey))
1667
+ dispatching = true;
1668
+ }
1669
+ for (const queueKey of this.activeBatches.keys()) {
1670
+ if (!this.matchesSession(queueKey, sessionKey))
1671
+ continue;
1672
+ active = true;
1673
+ const taskId = this.activeStates.get(queueKey)?.taskId;
1674
+ if (taskId)
1675
+ activeTaskIds.add(taskId);
1676
+ }
1677
+ return {
1678
+ prequeue: this.prequeueReservations.get(sessionKey) ?? 0,
1679
+ active, queued, dispatching, cutoff: this.enqueueSequence,
1680
+ activeTaskIds: [...activeTaskIds],
1681
+ };
1682
+ }
1651
1683
  /**
1652
1684
  * Mark an admitted message before it enters debounce or other pre-queue
1653
1685
  * work. The returned release is idempotent so callers can use it both from