@workclaw/openclaw-workclaw 1.0.333 → 1.0.336
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.
|
@@ -27,21 +27,68 @@ async function writeConfigFile(newConfig, cfg, log) {
|
|
|
27
27
|
try {
|
|
28
28
|
const runtime = getWorkclawRuntime();
|
|
29
29
|
const configApi = runtime.config;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
logger.info(`[智小途-配置] 准备写入配置 (channels/openclaw-workclaw/accounts): ${JSON.stringify(newConfig?.channels?.["openclaw-workclaw"]?.accounts, null, 2)}`);
|
|
31
|
+
logger.info(`[智小途-配置] 准备写入配置 (models): ${JSON.stringify(newConfig?.models, null, 2)}`);
|
|
32
|
+
let followUp;
|
|
33
|
+
if (configApi.mutateConfigFile) {
|
|
34
|
+
followUp = await configApi.mutateConfigFile({
|
|
35
|
+
mutate: (draft) => {
|
|
36
|
+
deepMerge(draft, newConfig);
|
|
37
|
+
},
|
|
38
|
+
afterWrite: "none"
|
|
39
|
+
// 插件内部操作,不需要自动重启
|
|
33
40
|
});
|
|
34
|
-
logger.info(`[智小途-配置]
|
|
41
|
+
logger.info(`[智小途-配置] 配置写入成功(使用 mutateConfigFile)`);
|
|
42
|
+
if (followUp?.followUp) {
|
|
43
|
+
logger.info(`[智小途-配置] 写者意图: ${followUp.followUp}`);
|
|
44
|
+
handleConfigFollowUp(followUp, log);
|
|
45
|
+
}
|
|
46
|
+
} else if (configApi.replaceConfigFile) {
|
|
47
|
+
followUp = await configApi.replaceConfigFile(newConfig, "none");
|
|
48
|
+
logger.info(`[智小途-配置] 配置写入成功(使用 replaceConfigFile)`);
|
|
49
|
+
if (followUp?.followUp) {
|
|
50
|
+
logger.info(`[智小途-配置] 写者意图: ${followUp.followUp}`);
|
|
51
|
+
handleConfigFollowUp(followUp, log);
|
|
52
|
+
}
|
|
53
|
+
} else if (configApi.writeConfigFile) {
|
|
54
|
+
await configApi.writeConfigFile(newConfig);
|
|
55
|
+
logger.info(`[智小途-配置] 配置写入成功(使用 writeConfigFile - 兼容模式)`);
|
|
35
56
|
} else {
|
|
36
|
-
|
|
37
|
-
logger.info(`[智小途-配置] 通过 runtime.config.writeConfigFile 写入配置`);
|
|
57
|
+
throw new Error("No config write API available");
|
|
38
58
|
}
|
|
39
|
-
|
|
59
|
+
deepMerge(cfg, newConfig);
|
|
40
60
|
} catch (err) {
|
|
41
61
|
logger.error(`[智小途-配置] 写入配置失败: ${String(err)}`);
|
|
42
62
|
throw err;
|
|
43
63
|
}
|
|
44
64
|
}
|
|
65
|
+
function deepMerge(target, source) {
|
|
66
|
+
if (source == null || typeof source !== "object")
|
|
67
|
+
return;
|
|
68
|
+
for (const key of Object.keys(source)) {
|
|
69
|
+
const sourceValue = source[key];
|
|
70
|
+
const targetValue = target[key];
|
|
71
|
+
if (sourceValue != null && typeof sourceValue === "object" && !Array.isArray(sourceValue) && targetValue != null && typeof targetValue === "object" && !Array.isArray(targetValue)) {
|
|
72
|
+
deepMerge(targetValue, sourceValue);
|
|
73
|
+
} else {
|
|
74
|
+
target[key] = sourceValue;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function handleConfigFollowUp(followUp, log) {
|
|
79
|
+
switch (followUp.strategy) {
|
|
80
|
+
case "auto":
|
|
81
|
+
log?.info?.("[智小途-配置] 框架将在适当时机自动重启");
|
|
82
|
+
break;
|
|
83
|
+
case "restart":
|
|
84
|
+
log?.info?.("[智小途-配置] 需要重启才能使配置生效");
|
|
85
|
+
break;
|
|
86
|
+
case "none":
|
|
87
|
+
default:
|
|
88
|
+
log?.info?.("[智小途-配置] 配置已立即生效,无需重启");
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
45
92
|
function loadOpenConversationId(accountId, userId) {
|
|
46
93
|
const statePath = getStateFilePath();
|
|
47
94
|
const key = `${accountId}:${userId}`;
|
|
@@ -12,6 +12,12 @@ interface ConfigLogger {
|
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* 将新配置写入 openclaw.json 文件。
|
|
15
|
+
*
|
|
16
|
+
* 正确的实现方式:
|
|
17
|
+
* 1. 优先使用 mutateConfigFile(官方推荐)
|
|
18
|
+
* 2. 必须指定 afterWrite 策略
|
|
19
|
+
* 3. 处理返回值中的 followUp 意图
|
|
20
|
+
* 4. 使用深合并策略处理嵌套属性
|
|
15
21
|
*/
|
|
16
22
|
export declare function writeConfigFile(newConfig: any, cfg: any, log?: ConfigLogger): Promise<void>;
|
|
17
23
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-writer.d.ts","sourceRoot":"","sources":["../../../src/gateway/config-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B;
|
|
1
|
+
{"version":3,"file":"config-writer.d.ts","sourceRoot":"","sources":["../../../src/gateway/config-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B;AA+DD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,GAAG,EACd,GAAG,EAAE,GAAG,EACR,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAsDf;AAoDD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAavF;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,EAC1B,GAAG,EAAE,GAAG,EACR,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAmBf;AA4DD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE;IACN,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,EACD,GAAG,EAAE,GAAG,EACR,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,GAAG,EAAE,GAAG,EACR,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,GAAG,EAAE,GAAG,EACR,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAkBf"}
|