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.
- package/CHANGELOG.md +25 -0
- package/bin/codex-managed-acl.ps1 +43 -0
- package/dist/agents/baseagent-availability.js +68 -0
- package/dist/agents/claude-runner.js +123 -22
- package/dist/agents/codex/app-server-client.js +63 -26
- package/dist/agents/codex-runner.js +316 -411
- package/dist/agents/ecagent-runner.js +170 -25
- package/dist/agents/gemini-runner.js +6 -0
- package/dist/agents/runner-types.js +50 -2
- package/dist/aun/aid/agentmd.js +73 -31
- package/dist/aun/aid/client.js +1 -1
- package/dist/aun/aid/control-aid.js +180 -1
- package/dist/aun/aid/identity.js +3 -3
- package/dist/aun/group/history.js +303 -0
- package/dist/aun/group/identity.js +43 -0
- package/dist/aun/group/index.js +5 -0
- package/dist/aun/{msg/group.js → group/operations.js} +161 -38
- package/dist/aun/{menu-client.js → menu/client.js} +12 -7
- package/dist/aun/menu/index.js +2 -0
- package/dist/aun/menu/transport.js +49 -0
- package/dist/aun/msg/index.js +2 -1
- package/dist/aun/msg/managed-operation.js +84 -18
- package/dist/aun/msg/mention-schema.js +51 -0
- package/dist/aun/msg/p2p.js +13 -8
- package/dist/aun/msg/upload.js +43 -88
- package/dist/aun/outbox.js +29 -7
- package/dist/aun/rpc/client.js +1 -0
- package/dist/aun/storage/client.js +39 -50
- package/dist/channels/aun.js +522 -233
- package/dist/channels/daemon.js +10 -6
- package/dist/cli/agent-command.js +108 -6
- package/dist/cli/agent-create.js +515 -2
- package/dist/cli/agent.js +109 -8
- package/dist/cli/aun-commands.js +191 -42
- package/dist/cli/config.js +8 -5
- package/dist/cli/contact.js +2 -2
- package/dist/cli/ctl-command.js +2 -2
- package/dist/cli/daemon-commands.js +35 -23
- package/dist/cli/diag.js +2 -2
- package/dist/cli/fs-command.js +3 -3
- package/dist/cli/handoff-command.js +6 -6
- package/dist/cli/index.js +8 -2
- package/dist/cli/init.js +34 -1
- package/dist/cli/managed-command-guard.js +2 -1
- package/dist/cli/menu-client.js +9 -5
- package/dist/cli/model.js +3 -3
- package/dist/cli/queue-command.js +2 -2
- package/dist/cli/response.js +2 -2
- package/dist/cli/restart-monitor.js +16 -2
- package/dist/cli/task-command.js +59 -0
- package/dist/cli/task-context.js +97 -49
- package/dist/cli/trigger-command.js +20 -10
- package/dist/config/builtin-roles.js +10 -0
- package/dist/config/config-field-policy.js +11 -0
- package/dist/config/config-manager.js +32 -4
- package/dist/config/config-operation-service.js +20 -5
- package/dist/config/contact-book-store.js +1 -1
- package/dist/config/contact-book.js +1 -1
- package/dist/config/contact-operation-service.js +1 -1
- package/dist/config/peer-role-resolver.js +1 -1
- package/dist/config/resolved-config-op.js +3 -0
- package/dist/config-store.js +1 -1
- package/dist/core/agent-application-service.js +5 -0
- package/dist/core/audit/event-key.js +17 -2
- package/dist/core/audit/log-integrity.js +34 -8
- package/dist/core/auth/agent-delegation.js +48 -14
- package/dist/core/auth/auth-gateway.js +2 -0
- package/dist/core/auth/authorization-audit.js +34 -38
- package/dist/core/auth/operation-authorizer.js +67 -5
- package/dist/core/auth/operation-catalog.js +110 -0
- package/dist/core/auth/remote-access-store.js +115 -9
- package/dist/core/bootstrap-messages.js +66 -7
- package/dist/core/bootstrap-service.js +110 -19
- package/dist/core/command/agent-control.js +88 -7
- package/dist/core/command/agent-storage-menu.js +443 -0
- package/dist/core/command/cli-intent-parser.js +19 -0
- package/dist/core/command/command-handler.js +76 -39
- package/dist/core/command/data-root-resolver.js +273 -0
- package/dist/core/command/group-menu.js +7 -2
- package/dist/core/command/menu-catalog.js +34 -4
- package/dist/core/command/menu-handler.js +348 -77
- package/dist/core/command/menu-protocol.js +40 -6
- package/dist/core/command/role-menu.js +2 -2
- package/dist/core/command/slash-handler.js +37 -22
- package/dist/core/event-catalog.js +4 -0
- package/dist/core/evolagent-registry.js +28 -2
- package/dist/core/group/invite-service.js +924 -0
- package/dist/core/interaction-router.js +22 -8
- package/dist/core/message/im-renderer.js +76 -15
- package/dist/core/message/message-bridge.js +94 -11
- package/dist/core/message/message-log.js +5 -3
- package/dist/core/message/message-queue.js +73 -41
- package/dist/core/message/response-engine.js +709 -117
- package/dist/core/permission/approval-gateway.js +36 -3
- package/dist/core/permission/ec-command-parser.js +61 -29
- package/dist/core/permission/protected-paths.js +134 -16
- package/dist/core/permission/sandbox-runtime.js +72 -3
- package/dist/core/permission/tool-error-code.js +15 -0
- package/dist/core/permission/tool-policy.js +7 -7
- package/dist/core/relation/peer-identity.js +57 -6
- package/dist/core/relation/shared-data.js +106 -0
- package/dist/core/role/runtime-policy.js +64 -0
- package/dist/core/runtime-lock.js +10 -26
- package/dist/core/session/runner-task-history.js +170 -0
- package/dist/core/session/session-manager.js +34 -6
- package/dist/core/session/session-mapper.js +41 -0
- package/dist/core/session/session-turn-coordinator.js +37 -7
- package/dist/core/session/session-turns.js +48 -7
- package/dist/core/task/task-recovery-service.js +176 -0
- package/dist/core/task/task-resume-operation.js +32 -0
- package/dist/eck/group-rules-sync.js +5 -3
- package/dist/eck/kit-renderer.js +1 -0
- package/dist/index.js +308 -54
- package/dist/ipc.js +141 -15
- package/dist/paths.js +17 -4
- package/dist/product.js +2 -0
- package/dist/trigger/event-source.js +19 -0
- package/dist/trigger/feedback.js +233 -40
- package/dist/trigger/parser.js +55 -5
- package/dist/trigger/patch.js +9 -0
- package/dist/trigger/scheduler.js +30 -4
- package/dist/trigger/validation.js +20 -3
- package/dist/utils/ecweb-utils.js +1 -0
- package/dist/utils/error-utils.js +40 -2
- package/dist/utils/logger.js +23 -13
- package/dist/utils/tool-summary.js +59 -3
- package/dist/utils/welcome.js +174 -1
- package/ecagent/dist/harness/agent-harness.js +3 -0
- package/ecagent/dist/harness/session/jsonl-storage.js +21 -2
- package/kits/docs/INDEX.md +0 -6
- package/kits/docs/channels/aun.md +15 -2
- package/kits/docs/channels/feishu.md +1 -1
- package/kits/docs/context-assembly.md +29 -17
- package/kits/docs/evolcore/INDEX.md +8 -3
- package/kits/docs/evolcore/agent-create.md +39 -7
- package/kits/docs/evolcore/agent.md +33 -1
- package/kits/docs/evolcore/aid.md +9 -1
- package/kits/docs/evolcore/config.md +40 -1
- package/kits/docs/evolcore/group-collaboration.md +1 -1
- package/kits/docs/evolcore/group.md +117 -2
- package/kits/docs/evolcore/menu-client.md +16 -0
- package/kits/docs/evolcore/msg.md +3 -0
- package/kits/docs/evolcore/storage.md +3 -0
- package/kits/docs/evolcore/task.md +14 -0
- package/kits/docs/evolcore/trigger.md +51 -3
- package/kits/docs/venues/group.md +5 -0
- package/kits/eck_manifest.json +27 -0
- package/kits/rules/01-overview.md +11 -7
- package/kits/rules/04-relation.md +2 -1
- package/kits/rules/05-venue.md +1 -1
- package/kits/rules/06-channel.md +6 -4
- package/kits/schemas/agent-config.schema.12.json +25 -1
- package/kits/schemas/daemon.schema.6.json +2 -2
- package/kits/schemas/defaults.schema.5.json +1 -1
- package/kits/schemas/relation-config.schema.1.json +1 -1
- package/kits/schemas/relation-config.schema.5.json +1 -1
- package/kits/schemas/role-config.schema.1.json +14 -0
- package/kits/templates/roles/member.json +5 -0
- package/kits/templates/roles/visitor.json +5 -0
- package/kits/templates/system-fragments/baseagent.md +1 -1
- package/kits/templates/system-fragments/bootstrap.md +26 -9
- package/kits/templates/system-fragments/channel.md +8 -44
- package/kits/templates/system-fragments/commands.md +10 -2
- package/kits/templates/system-fragments/group-unread-history.md +7 -0
- package/kits/templates/system-fragments/reply.md +56 -0
- package/package.json +7 -3
- package/dist/aun/group-identity.js +0 -9
- /package/dist/aun/{group-fs-download.js → group/fs-download.js} +0 -0
- /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(
|
|
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
|
-
|
|
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.
|
|
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]
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
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,
|
|
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
|