@openclaw-china/shared 2026.3.19 → 2026.3.21

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw-china/shared",
3
- "version": "2026.3.19",
3
+ "version": "2026.3.21",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./src/index.ts"
@@ -209,6 +209,7 @@ describe("china setup wechat-mp", () => {
209
209
  .mockResolvedValueOnce("wechat-mp")
210
210
  .mockResolvedValueOnce("safe")
211
211
  .mockResolvedValueOnce("passive");
212
+ confirmMock.mockResolvedValueOnce(true); // renderMarkdown enabled (default)
212
213
  textMock
213
214
  .mockResolvedValueOnce("/wechat-mp")
214
215
  .mockResolvedValueOnce("wx-test-appid")
@@ -232,6 +233,83 @@ describe("china setup wechat-mp", () => {
232
233
  expect(wechatMpConfig?.messageMode).toBe("safe");
233
234
  expect(wechatMpConfig?.replyMode).toBe("passive");
234
235
  expect(wechatMpConfig?.welcomeText).toBe("欢迎关注");
236
+ expect(wechatMpConfig?.renderMarkdown).toBe(true);
237
+ });
238
+
239
+ it("stores activeDeliveryMode when replyMode is active", async () => {
240
+ selectMock
241
+ .mockResolvedValueOnce("wechat-mp")
242
+ .mockResolvedValueOnce("safe")
243
+ .mockResolvedValueOnce("active")
244
+ .mockResolvedValueOnce("split");
245
+ textMock
246
+ .mockResolvedValueOnce("/wechat-mp-active")
247
+ .mockResolvedValueOnce("wx-active-appid")
248
+ .mockResolvedValueOnce("wx-active-secret")
249
+ .mockResolvedValueOnce("active-token")
250
+ .mockResolvedValueOnce("active-aes-key")
251
+ .mockResolvedValueOnce("welcome");
252
+
253
+ const { writeConfigFile } = await runSetup({}, ["wechat-mp"]);
254
+
255
+ expect(writeConfigFile).toHaveBeenCalledTimes(1);
256
+ const savedConfig = writeConfigFile.mock.calls[0]?.[0] as ConfigRoot;
257
+ const wechatMpConfig = savedConfig.channels?.["wechat-mp"];
258
+
259
+ expect(wechatMpConfig?.enabled).toBe(true);
260
+ expect(wechatMpConfig?.replyMode).toBe("active");
261
+ expect(wechatMpConfig?.activeDeliveryMode).toBe("split");
262
+ });
263
+
264
+ it("stores renderMarkdown when explicitly disabled", async () => {
265
+ selectMock
266
+ .mockResolvedValueOnce("wechat-mp")
267
+ .mockResolvedValueOnce("safe")
268
+ .mockResolvedValueOnce("active")
269
+ .mockResolvedValueOnce("merged");
270
+ confirmMock.mockResolvedValueOnce(false); // Disable renderMarkdown
271
+ textMock
272
+ .mockResolvedValueOnce("/wechat-mp-no-md")
273
+ .mockResolvedValueOnce("wx-no-md-appid")
274
+ .mockResolvedValueOnce("wx-no-md-secret")
275
+ .mockResolvedValueOnce("no-md-token")
276
+ .mockResolvedValueOnce("no-md-aes-key")
277
+ .mockResolvedValueOnce("welcome");
278
+
279
+ const { writeConfigFile } = await runSetup({}, ["wechat-mp"]);
280
+
281
+ expect(writeConfigFile).toHaveBeenCalledTimes(1);
282
+ const savedConfig = writeConfigFile.mock.calls[0]?.[0] as ConfigRoot;
283
+ const wechatMpConfig = savedConfig.channels?.["wechat-mp"];
284
+
285
+ expect(wechatMpConfig?.enabled).toBe(true);
286
+ expect(wechatMpConfig?.activeDeliveryMode).toBe("merged");
287
+ expect(wechatMpConfig?.renderMarkdown).toBe(false);
288
+ });
289
+
290
+ it("defaults renderMarkdown to true when not explicitly disabled", async () => {
291
+ selectMock
292
+ .mockResolvedValueOnce("wechat-mp")
293
+ .mockResolvedValueOnce("safe")
294
+ .mockResolvedValueOnce("passive");
295
+ confirmMock.mockResolvedValueOnce(true); // Keep renderMarkdown enabled (default)
296
+ textMock
297
+ .mockResolvedValueOnce("/wechat-mp-default-md")
298
+ .mockResolvedValueOnce("wx-default-appid")
299
+ .mockResolvedValueOnce("wx-default-secret")
300
+ .mockResolvedValueOnce("default-token")
301
+ .mockResolvedValueOnce("default-aes-key")
302
+ .mockResolvedValueOnce("welcome");
303
+
304
+ const { writeConfigFile } = await runSetup({}, ["wechat-mp"]);
305
+
306
+ expect(writeConfigFile).toHaveBeenCalledTimes(1);
307
+ const savedConfig = writeConfigFile.mock.calls[0]?.[0] as ConfigRoot;
308
+ const wechatMpConfig = savedConfig.channels?.["wechat-mp"];
309
+
310
+ expect(wechatMpConfig?.enabled).toBe(true);
311
+ // setup writes the value explicitly, even when it's the default true
312
+ expect(wechatMpConfig?.renderMarkdown).toBe(true);
235
313
  });
236
314
  });
237
315
 
@@ -757,6 +757,24 @@ async function configureWechatMp(prompter: SetupPrompter, cfg: ConfigRoot): Prom
757
757
  ],
758
758
  (toTrimmedString(existing.replyMode) as "passive" | "active" | undefined) ?? "passive"
759
759
  );
760
+
761
+ let activeDeliveryMode: "merged" | "split" | undefined;
762
+ if (replyMode === "active") {
763
+ activeDeliveryMode = await prompter.askSelect<"merged" | "split">(
764
+ "主动发送模式(activeDeliveryMode)",
765
+ [
766
+ { value: "split", label: "split(逐块发送,推荐)" },
767
+ { value: "merged", label: "merged(合并后单次发送)" },
768
+ ],
769
+ (toTrimmedString(existing.activeDeliveryMode) as "merged" | "split" | undefined) ?? "split"
770
+ );
771
+ }
772
+
773
+ const renderMarkdown = await prompter.askConfirm(
774
+ "启用 Markdown 渲染(推荐开启)",
775
+ toBoolean(existing.renderMarkdown, true)
776
+ );
777
+
760
778
  const welcomeText = await prompter.askText({
761
779
  label: "欢迎语(可选)",
762
780
  defaultValue: toTrimmedString(existing.welcomeText),
@@ -771,6 +789,8 @@ async function configureWechatMp(prompter: SetupPrompter, cfg: ConfigRoot): Prom
771
789
  encodingAESKey: messageMode === "plain" ? undefined : encodingAESKey,
772
790
  messageMode,
773
791
  replyMode,
792
+ activeDeliveryMode,
793
+ renderMarkdown,
774
794
  welcomeText: welcomeText || undefined,
775
795
  });
776
796
  }