























@@ -4,6 +4,7 @@ import {
44resolveConfigWriteAfterWrite,
55transformConfigFileWithRetry,
66type ConfigMutationCommit,
7+type ConfigReplaceResult,
78type ConfigMutationResult,
89type ConfigMutationContext,
910type ConfigTransformResult,
@@ -27,7 +28,10 @@ function mergeUnsetPaths(
2728return merged.length > 0 ? merged : undefined;
2829}
293030-type ConfigCommit = (config: OpenClawConfig, writeOptions?: ConfigWriteOptions) => Promise<void>;
31+type ConfigCommit = (
32+config: OpenClawConfig,
33+writeOptions?: ConfigWriteOptions,
34+) => Promise<ConfigReplaceResult | void>;
3135const PLUGIN_SOURCE_CHANGED_RESTART_REASON = "plugin source changed";
32363337function mergeAfterWrite(
@@ -49,7 +53,7 @@ async function commitPluginInstallRecordsWithWriter(params: {
4953nextConfig: OpenClawConfig;
5054writeOptions?: ConfigWriteOptions;
5155commit: ConfigCommit;
52-}): Promise<void> {
56+}): Promise<ConfigReplaceResult | void> {
5357const previousInstallRecords =
5458params.previousInstallRecords ?? (await loadInstalledPluginIndexInstallRecords());
5559await writePersistedInstalledPluginIndexInstallRecords(params.nextInstallRecords);
@@ -58,7 +62,7 @@ async function commitPluginInstallRecordsWithWriter(params: {
5862previousInstallRecords,
5963params.nextInstallRecords,
6064);
61-await params.commit(params.nextConfig, {
65+return await params.commit(params.nextConfig, {
6266 ...params.writeOptions,
6367 ...(installRecordsChanged && params.writeOptions?.afterWrite === undefined
6468 ? { afterWrite: { mode: "restart", reason: PLUGIN_SOURCE_CHANGED_RESTART_REASON } }
@@ -90,7 +94,7 @@ export async function commitPluginInstallRecordsWithConfig(params: {
9094await commitPluginInstallRecordsWithWriter({
9195 ...params,
9296commit: async (nextConfig, writeOptions) => {
93-await replaceConfigFile({
97+return await replaceConfigFile({
9498 nextConfig,
9599 ...(params.baseHash !== undefined ? { baseHash: params.baseHash } : {}),
96100 ...(writeOptions ? { writeOptions } : {}),
@@ -107,18 +111,18 @@ export async function commitConfigWriteWithPendingPluginInstalls(params: {
107111config: OpenClawConfig;
108112installRecords: Record<string, PluginInstallRecord>;
109113movedInstallRecords: boolean;
114+persistedHash: string | null;
110115}> {
111116const pendingInstallRecords = params.nextConfig.plugins?.installs ?? {};
112117if (Object.keys(pendingInstallRecords).length === 0) {
113-if (params.writeOptions) {
114-await params.commit(params.nextConfig, params.writeOptions);
115-} else {
116-await params.commit(params.nextConfig);
117-}
118+const committed = params.writeOptions
119+ ? await params.commit(params.nextConfig, params.writeOptions)
120+ : await params.commit(params.nextConfig);
118121return {
119122config: params.nextConfig,
120123installRecords: {},
121124movedInstallRecords: false,
125+persistedHash: committed?.persistedHash ?? null,
122126};
123127}
124128@@ -128,7 +132,7 @@ export async function commitConfigWriteWithPendingPluginInstalls(params: {
128132 ...pendingInstallRecords,
129133};
130134const strippedConfig = withoutPluginInstallRecords(params.nextConfig);
131-await commitPluginInstallRecordsWithWriter({
135+const committed = await commitPluginInstallRecordsWithWriter({
132136 previousInstallRecords,
133137 nextInstallRecords,
134138nextConfig: strippedConfig,
@@ -139,6 +143,7 @@ export async function commitConfigWriteWithPendingPluginInstalls(params: {
139143config: strippedConfig,
140144installRecords: nextInstallRecords,
141145movedInstallRecords: true,
146+persistedHash: committed?.persistedHash ?? null,
142147};
143148}
144149@@ -150,12 +155,13 @@ export async function commitConfigWithPendingPluginInstalls(params: {
150155config: OpenClawConfig;
151156installRecords: Record<string, PluginInstallRecord>;
152157movedInstallRecords: boolean;
158+persistedHash: string | null;
153159}> {
154160return await commitConfigWriteWithPendingPluginInstalls({
155161nextConfig: params.nextConfig,
156162 ...(params.writeOptions ? { writeOptions: params.writeOptions } : {}),
157163commit: async (nextConfig, writeOptions) => {
158-await replaceConfigFile({
164+return await replaceConfigFile({
159165 nextConfig,
160166 ...(params.baseHash !== undefined ? { baseHash: params.baseHash } : {}),
161167 ...(writeOptions ? { writeOptions } : {}),
@@ -173,7 +179,7 @@ export async function transformConfigWithPendingPluginInstalls<T = void>(
173179 nextConfig,
174180 ...(writeOptions ? { writeOptions: mergeAfterWrite(writeOptions, params.afterWrite) } : {}),
175181commit: async (config, commitWriteOptions) => {
176-await replaceConfigFile({
182+return await replaceConfigFile({
177183nextConfig: config,
178184 snapshot,
179185writeOptions: commitWriteOptions ?? {},
@@ -189,6 +195,7 @@ export async function transformConfigWithPendingPluginInstalls<T = void>(
189195);
190196return {
191197config: committed.config,
198+persistedHash: committed.persistedHash,
192199 afterWrite,
193200};
194201};
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。