@workclaw/openclaw-workclaw 1.0.335 → 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.
@@ -29,14 +29,66 @@ async function writeConfigFile(newConfig, cfg, log) {
29
29
  const configApi = runtime.config;
30
30
  logger.info(`[智小途-配置] 准备写入配置 (channels/openclaw-workclaw/accounts): ${JSON.stringify(newConfig?.channels?.["openclaw-workclaw"]?.accounts, null, 2)}`);
31
31
  logger.info(`[智小途-配置] 准备写入配置 (models): ${JSON.stringify(newConfig?.models, null, 2)}`);
32
- await configApi.writeConfigFile(newConfig);
33
- logger.info(`[智小途-配置] 配置写入成功`);
34
- Object.assign(cfg, newConfig);
32
+ let followUp;
33
+ if (configApi.mutateConfigFile) {
34
+ followUp = await configApi.mutateConfigFile({
35
+ mutate: (draft) => {
36
+ deepMerge(draft, newConfig);
37
+ },
38
+ afterWrite: "none"
39
+ // 插件内部操作,不需要自动重启
40
+ });
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 - 兼容模式)`);
56
+ } else {
57
+ throw new Error("No config write API available");
58
+ }
59
+ deepMerge(cfg, newConfig);
35
60
  } catch (err) {
36
61
  logger.error(`[智小途-配置] 写入配置失败: ${String(err)}`);
37
62
  throw err;
38
63
  }
39
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
+ }
40
92
  function loadOpenConversationId(accountId, userId) {
41
93
  const statePath = getStateFilePath();
42
94
  const key = `${accountId}:${userId}`;
@@ -13,10 +13,11 @@ interface ConfigLogger {
13
13
  /**
14
14
  * 将新配置写入 openclaw.json 文件。
15
15
  *
16
- * 注意:
17
- * 1. newConfig 已经是完整的配置对象(调用方已通过 { ...cfg, ... } 构建)
18
- * 2. 直接使用 writeConfigFile 而不是 mutateConfigFile,因为后者的 mutate 回调有嵌套属性更新问题
19
- * 3. writeConfigFile 虽然标记为 deprecated,但仍是官方插件使用的兼容方法,仅打印警告不影响功能
16
+ * 正确的实现方式:
17
+ * 1. 优先使用 mutateConfigFile(官方推荐)
18
+ * 2. 必须指定 afterWrite 策略
19
+ * 3. 处理返回值中的 followUp 意图
20
+ * 4. 使用深合并策略处理嵌套属性
20
21
  */
21
22
  export declare function writeConfigFile(newConfig: any, cfg: any, log?: ConfigLogger): Promise<void>;
22
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;AAsCD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,GAAG,EACd,GAAG,EAAE,GAAG,EACR,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;;;;;;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"}
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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workclaw/openclaw-workclaw",
3
3
  "type": "module",
4
- "version": "1.0.335",
4
+ "version": "1.0.336",
5
5
  "description": "智小途企业通讯平台 OpenClaw 渠道插件",
6
6
  "license": "MIT",
7
7
  "keywords": [