





















@@ -1572,6 +1572,40 @@ export function createConfigIO(
15721572};
15731573}
157415741575+function createValidationPluginMetadataSnapshotLoader(params: {
1576+effectiveConfigRaw: unknown;
1577+env: NodeJS.ProcessEnv;
1578+}): {
1579+load: (config: OpenClawConfig) => PluginMetadataSnapshot;
1580+getSnapshot: () => PluginMetadataSnapshot | undefined;
1581+} {
1582+let pluginMetadataSnapshot: PluginMetadataSnapshot | undefined;
1583+return {
1584+load: (config) => {
1585+if (pluginMetadataSnapshot) {
1586+return pluginMetadataSnapshot;
1587+}
1588+const metadataConfig = retainRuntimeOnlyShippedPluginInstallConfigRecords(
1589+config,
1590+params.effectiveConfigRaw,
1591+);
1592+const defaultAgentId = resolveDefaultAgentId(metadataConfig);
1593+pluginMetadataSnapshot = resolvePluginMetadataSnapshot({
1594+config: metadataConfig,
1595+workspaceDir: resolveAgentWorkspaceDir(metadataConfig, defaultAgentId, params.env),
1596+env: params.env,
1597+allowWorkspaceScopedCurrent: true,
1598+pluginIdScope: createConfigValidationMetadataPluginIdScope({
1599+config: metadataConfig,
1600+env: params.env,
1601+}),
1602+});
1603+return pluginMetadataSnapshot;
1604+},
1605+getSnapshot: () => pluginMetadataSnapshot,
1606+};
1607+}
1608+15751609function resolveRuntimePreflightSourceConfig(candidate: OpenClawConfig): OpenClawConfig {
15761610const env = { ...deps.env } as NodeJS.ProcessEnv;
15771611const resolvedIncludes = resolveConfigIncludesForRead(candidate, configPath, {
@@ -1656,32 +1690,14 @@ export function createConfigIO(
16561690);
16571691const effectiveConfigRaw = installMigration.config;
16581692const validationConfigRaw = installMigration.validationConfig ?? effectiveConfigRaw;
1659-let pluginMetadataSnapshot: PluginMetadataSnapshot | undefined;
1660-const loadValidationPluginMetadataSnapshot = (config: OpenClawConfig) => {
1661-if (pluginMetadataSnapshot) {
1662-return pluginMetadataSnapshot;
1663-}
1664-const metadataConfig = retainRuntimeOnlyShippedPluginInstallConfigRecords(
1665-config,
1666-effectiveConfigRaw,
1667-);
1668-const defaultAgentId = resolveDefaultAgentId(metadataConfig);
1669-pluginMetadataSnapshot = resolvePluginMetadataSnapshot({
1670-config: metadataConfig,
1671-workspaceDir: resolveAgentWorkspaceDir(metadataConfig, defaultAgentId, candidateEnv),
1672-env: candidateEnv,
1673-allowWorkspaceScopedCurrent: true,
1674-pluginIdScope: createConfigValidationMetadataPluginIdScope({
1675-config: metadataConfig,
1676-env: candidateEnv,
1677-}),
1678-});
1679-return pluginMetadataSnapshot;
1680-};
1693+const validationPluginMetadata = createValidationPluginMetadataSnapshotLoader({
1694+ effectiveConfigRaw,
1695+env: candidateEnv,
1696+});
16811697const validated = validateConfigObjectWithPlugins(validationConfigRaw, {
16821698env: candidateEnv,
16831699pluginValidation: overrides.pluginValidation,
1684-loadPluginMetadataSnapshot: loadValidationPluginMetadataSnapshot,
1700+loadPluginMetadataSnapshot: validationPluginMetadata.load,
16851701sourceRaw: parsed,
16861702preservedLegacyRootKeys: overrides.preservedLegacyRootKeys,
16871703});
@@ -1762,32 +1778,14 @@ export function createConfigIO(
17621778if (preValidationDuplicates.length > 0) {
17631779throw new DuplicateAgentDirError(preValidationDuplicates);
17641780}
1765-let pluginMetadataSnapshot: PluginMetadataSnapshot | undefined;
1766-const loadValidationPluginMetadataSnapshot = (config: OpenClawConfig) => {
1767-if (pluginMetadataSnapshot) {
1768-return pluginMetadataSnapshot;
1769-}
1770-const metadataConfig = retainRuntimeOnlyShippedPluginInstallConfigRecords(
1771-config,
1772-effectiveConfigRaw,
1773-);
1774-const defaultAgentId = resolveDefaultAgentId(metadataConfig);
1775-pluginMetadataSnapshot = resolvePluginMetadataSnapshot({
1776-config: metadataConfig,
1777-workspaceDir: resolveAgentWorkspaceDir(metadataConfig, defaultAgentId, deps.env),
1778-env: deps.env,
1779-allowWorkspaceScopedCurrent: true,
1780-pluginIdScope: createConfigValidationMetadataPluginIdScope({
1781-config: metadataConfig,
1782-env: deps.env,
1783-}),
1784-});
1785-return pluginMetadataSnapshot;
1786-};
1781+const validationPluginMetadata = createValidationPluginMetadataSnapshotLoader({
1782+ effectiveConfigRaw,
1783+env: deps.env,
1784+});
17871785const validated = validateConfigObjectWithPlugins(validationConfigRaw, {
17881786env: deps.env,
17891787pluginValidation: overrides.pluginValidation,
1790-loadPluginMetadataSnapshot: loadValidationPluginMetadataSnapshot,
1788+loadPluginMetadataSnapshot: validationPluginMetadata.load,
17911789sourceRaw: snapshotParsed,
17921790preservedLegacyRootKeys: overrides.preservedLegacyRootKeys,
17931791});
@@ -1850,7 +1848,7 @@ export function createConfigIO(
18501848}
18511849const cfg = retainRuntimeOnlyShippedPluginInstallConfigRecords(
18521850materializeRuntimeConfig(validated.config, "load", {
1853-manifestRegistry: pluginMetadataSnapshot?.manifestRegistry,
1851+manifestRegistry: validationPluginMetadata.getSnapshot()?.manifestRegistry,
18541852}),
18551853effectiveConfigRaw,
18561854);
@@ -2030,33 +2028,15 @@ export function createConfigIO(
20302028 ? hashConfigRaw(installMigration.persistedRootRaw)
20312029 : hash;
20322030fallbackSourceConfig = coerceConfig(effectiveConfigRaw);
2033-let pluginMetadataSnapshot: PluginMetadataSnapshot | undefined;
2034-const loadValidationPluginMetadataSnapshot = (config: OpenClawConfig) => {
2035-if (pluginMetadataSnapshot) {
2036-return pluginMetadataSnapshot;
2037-}
2038-const metadataConfig = retainRuntimeOnlyShippedPluginInstallConfigRecords(
2039-config,
2040-effectiveConfigRaw,
2041-);
2042-const defaultAgentId = resolveDefaultAgentId(metadataConfig);
2043-pluginMetadataSnapshot = resolvePluginMetadataSnapshot({
2044-config: metadataConfig,
2045-workspaceDir: resolveAgentWorkspaceDir(metadataConfig, defaultAgentId, deps.env),
2046-env: deps.env,
2047-allowWorkspaceScopedCurrent: true,
2048-pluginIdScope: createConfigValidationMetadataPluginIdScope({
2049-config: metadataConfig,
2050-env: deps.env,
2051-}),
2052-});
2053-return pluginMetadataSnapshot;
2054-};
2031+const validationPluginMetadata = createValidationPluginMetadataSnapshotLoader({
2032+ effectiveConfigRaw,
2033+env: deps.env,
2034+});
20552035const validated = await deps.measure("config.snapshot.read.validate", () =>
20562036validateConfigObjectWithPlugins(validationConfigRaw, {
20572037env: deps.env,
20582038pluginValidation: overrides.pluginValidation,
2059-loadPluginMetadataSnapshot: loadValidationPluginMetadataSnapshot,
2039+loadPluginMetadataSnapshot: validationPluginMetadata.load,
20602040sourceRaw: effectiveParsed,
20612041preservedLegacyRootKeys: overrides.preservedLegacyRootKeys,
20622042}),
@@ -2135,7 +2115,7 @@ export function createConfigIO(
21352115const snapshotConfig = await deps.measure("config.snapshot.read.materialize", () =>
21362116retainRuntimeOnlyShippedPluginInstallConfigRecords(
21372117materializeRuntimeConfig(validated.config, "snapshot", {
2138-manifestRegistry: pluginMetadataSnapshot?.manifestRegistry,
2118+manifestRegistry: validationPluginMetadata.getSnapshot()?.manifestRegistry,
21392119}),
21402120effectiveConfigRaw,
21412121),
@@ -2162,7 +2142,7 @@ export function createConfigIO(
21622142envSnapshotForRestore: readResolution.envSnapshotForRestore,
21632143 includeFileHashesForWrite,
21642144 includeFileTargetsForWrite,
2165- pluginMetadataSnapshot,
2145+pluginMetadataSnapshot: validationPluginMetadata.getSnapshot(),
21662146},
21672147{ observe: !callerRejectedSuspiciousRecovery },
21682148),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。