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.
- package/CHANGELOG.md +7 -0
- package/dist/agents/codex-runner.js +61 -14
- package/dist/aun/aid/agentmd.js +224 -19
- package/dist/aun/aid/index.js +2 -1
- package/dist/aun/aid/managed-operation.js +70 -4
- package/dist/aun/group/index.js +1 -0
- package/dist/{core → aun}/group/invite-service.js +4 -4
- package/dist/channels/daemon.js +1 -1
- package/dist/cli/agent-command.js +7 -7
- package/dist/cli/aun-commands.js +97 -37
- package/dist/cli/data-command.js +2 -1
- package/dist/cli/managed-command-guard.js +2 -2
- package/dist/cli/model.js +1 -1
- package/dist/cli/response.js +1 -1
- package/dist/cli/trigger-command.js +52 -29
- package/dist/config/boot-log.js +95 -1
- package/dist/config/builtin-roles.js +1 -0
- package/dist/config/peer-role-resolver.js +21 -0
- package/dist/core/agent-ipc-registration.js +409 -0
- package/dist/core/agent-runtime.js +435 -0
- package/dist/core/auth/delegation-authorization.js +58 -0
- package/dist/core/auth/operation-catalog.js +8 -0
- package/dist/core/bootstrap-service.js +65 -1
- package/dist/core/channel-runtime.js +435 -0
- package/dist/core/command/command-handler.js +4 -1
- package/dist/core/daemon-bootstrap.js +151 -0
- package/dist/core/daemon-control.js +205 -0
- package/dist/core/daemon-lifecycle.js +225 -0
- package/dist/core/data-migration.js +4 -1
- package/dist/core/handoff/ipc-registration.js +156 -0
- package/dist/core/ipc-registration.js +457 -0
- package/dist/core/memory/consolidation-trigger.js +8 -0
- package/dist/core/memory/consolidation.js +838 -0
- package/dist/core/message/aun-ipc-sender.js +226 -0
- package/dist/core/message/outbound.js +165 -0
- package/dist/core/permission/approval-gateway.js +13 -0
- package/dist/core/permission/ec-command-parser.js +80 -35
- package/dist/core/permission/sandbox-runtime.js +23 -2
- package/dist/core/permission/tool-error-code.js +1 -0
- package/dist/core/permission/tool-policy.js +61 -24
- package/dist/core/session/session-idle-monitor.js +17 -0
- package/dist/index.js +352 -4841
- package/dist/ipc.js +2 -1
- package/dist/stats/db.js +24 -0
- package/dist/stats/index.js +1 -1
- package/dist/stats/writer.js +25 -1
- package/dist/trigger/application-service.js +157 -0
- package/dist/trigger/authorization.js +371 -0
- package/dist/trigger/ipc-service.js +406 -0
- package/dist/trigger/local-files.js +133 -0
- package/dist/trigger/manager.js +235 -22
- package/dist/trigger/scheduler.js +30 -5
- package/dist/trigger/script-executor.js +176 -39
- package/dist/trigger/script-sandbox.js +458 -0
- package/dist/trigger/system-definitions.js +188 -0
- package/dist/trigger/validation.js +0 -3
- package/dist/utils/aid-bind.js +1 -1
- package/dist/utils/evolcore-version.js +74 -0
- package/dist/utils/logger.js +16 -0
- package/kits/docs/evolcore/INDEX.md +1 -1
- package/kits/docs/evolcore/aid.md +9 -1
- package/kits/docs/evolcore/model.md +3 -2
- package/kits/docs/evolcore/rpc.md +4 -0
- package/kits/docs/evolcore/trigger.md +15 -1
- package/kits/schemas/relation-config.schema.9.json +1 -1
- package/kits/templates/system-fragments/commands.md +0 -1
- package/package.json +1 -1
- 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:
|
|
2423
|
-
|
|
2424
|
-
|
|
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
|
|
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
|
|
2515
|
-
|
|
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
|
-
:
|
|
2522
|
-
? `🔒 ${context.permissionMode}
|
|
2523
|
-
:
|
|
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.
|