@openclaw-china/shared 0.1.37 → 0.1.39

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": "0.1.37",
3
+ "version": "0.1.39",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./src/index.ts"
@@ -620,23 +620,15 @@ async function configureQQBot(prompter: SetupPrompter, cfg: ConfigRoot): Promise
620
620
  defaultValue: toTrimmedString(existing.appId),
621
621
  required: true,
622
622
  });
623
- const clientSecret = await prompter.askSecret({
624
- label: "QQBot clientSecret",
625
- existingValue: toTrimmedString(existing.clientSecret),
626
- required: true,
627
- });
628
- clackNote(
629
- "QQ 的 Markdown 体验很好,但需要先申请开通,详情请查看配置文档。",
630
- "提示"
631
- );
632
- const markdownSupport = await prompter.askConfirm(
633
- "启用 Markdown 支持",
634
- toBoolean(existing.markdownSupport, false)
635
- );
636
- const asrEnabled = await prompter.askConfirm(
637
- "启用 ASR(支持入站语音自动转文字)",
638
- toBoolean(existingAsr.enabled, false)
639
- );
623
+ const clientSecret = await prompter.askSecret({
624
+ label: "QQBot clientSecret",
625
+ existingValue: toTrimmedString(existing.clientSecret),
626
+ required: true,
627
+ });
628
+ const asrEnabled = await prompter.askConfirm(
629
+ "启用 ASR(支持入站语音自动转文字)",
630
+ toBoolean(existingAsr.enabled, false)
631
+ );
640
632
 
641
633
  const asr: ConfigRecord = {
642
634
  enabled: asrEnabled,
@@ -660,13 +652,12 @@ async function configureQQBot(prompter: SetupPrompter, cfg: ConfigRoot): Promise
660
652
  });
661
653
  }
662
654
 
663
- return mergeChannelConfig(cfg, "qqbot", {
664
- appId,
665
- clientSecret,
666
- markdownSupport,
667
- asr,
668
- });
669
- }
655
+ return mergeChannelConfig(cfg, "qqbot", {
656
+ appId,
657
+ clientSecret,
658
+ asr,
659
+ });
660
+ }
670
661
 
671
662
  async function configureSingleChannel(
672
663
  channel: ChannelId,
package/src/cli/index.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from "./china-setup.js";
2
- export * from "./install-hint.js";
1
+ export * from "./china-setup.js";
2
+ export * from "./install-hint.js";
@@ -1,141 +1,141 @@
1
- /**
2
- * Unit Tests for File Utilities
3
- *
4
- * Feature: dingtalk-media-receive
5
- * Validates: Requirements 5.1-5.8, 6.1-6.6
6
- */
7
-
8
- import { describe, it, expect } from "vitest";
9
- import { resolveFileCategory, resolveExtension } from "./file-utils.js";
10
-
11
- describe("resolveFileCategory", () => {
12
- // Image categorization (Requirement 5.1)
13
- it("should categorize image MIME types", () => {
14
- expect(resolveFileCategory("image/jpeg")).toBe("image");
15
- expect(resolveFileCategory("image/png")).toBe("image");
16
- expect(resolveFileCategory("image/gif")).toBe("image");
17
- expect(resolveFileCategory("image/webp")).toBe("image");
18
- expect(resolveFileCategory("image/bmp")).toBe("image");
19
- });
20
-
21
- // Audio categorization (Requirement 5.2)
22
- it("should categorize audio MIME types", () => {
23
- expect(resolveFileCategory("audio/mpeg")).toBe("audio");
24
- expect(resolveFileCategory("audio/wav")).toBe("audio");
25
- expect(resolveFileCategory("audio/ogg")).toBe("audio");
26
- expect(resolveFileCategory("audio/amr")).toBe("audio");
27
- });
28
-
29
- // Video categorization (Requirement 5.3)
30
- it("should categorize video MIME types", () => {
31
- expect(resolveFileCategory("video/mp4")).toBe("video");
32
- expect(resolveFileCategory("video/quicktime")).toBe("video");
33
- expect(resolveFileCategory("video/webm")).toBe("video");
34
- });
35
-
36
- // Document categorization (Requirement 5.4)
37
- it("should categorize document MIME types", () => {
38
- expect(resolveFileCategory("application/pdf")).toBe("document");
39
- expect(resolveFileCategory("application/msword")).toBe("document");
40
- expect(resolveFileCategory("text/plain")).toBe("document");
41
- expect(resolveFileCategory("text/markdown")).toBe("document");
42
- });
43
-
44
- // Archive categorization (Requirement 5.5)
45
- it("should categorize archive MIME types", () => {
46
- expect(resolveFileCategory("application/zip")).toBe("archive");
47
- expect(resolveFileCategory("application/x-rar-compressed")).toBe("archive");
48
- expect(resolveFileCategory("application/x-7z-compressed")).toBe("archive");
49
- });
50
-
51
- // Code categorization (Requirement 5.6)
52
- it("should categorize code MIME types", () => {
53
- expect(resolveFileCategory("application/json")).toBe("code");
54
- expect(resolveFileCategory("text/html")).toBe("code");
55
- expect(resolveFileCategory("text/css")).toBe("code");
56
- expect(resolveFileCategory("text/javascript")).toBe("code");
57
- });
58
-
59
- // Extension fallback (Requirement 5.8)
60
- it("should use extension fallback when MIME type is unknown", () => {
61
- expect(resolveFileCategory("application/octet-stream", "photo.jpg")).toBe("image");
62
- expect(resolveFileCategory("application/octet-stream", "song.mp3")).toBe("audio");
63
- expect(resolveFileCategory("application/octet-stream", "movie.mp4")).toBe("video");
64
- expect(resolveFileCategory("application/octet-stream", "doc.pdf")).toBe("document");
65
- expect(resolveFileCategory("application/octet-stream", "archive.zip")).toBe("archive");
66
- expect(resolveFileCategory("application/octet-stream", "script.py")).toBe("code");
67
- });
68
-
69
- // Other category (Requirement 5.7)
70
- it("should return 'other' for unknown types", () => {
71
- expect(resolveFileCategory("application/octet-stream")).toBe("other");
72
- expect(resolveFileCategory("application/unknown")).toBe("other");
73
- expect(resolveFileCategory("application/octet-stream", "file.xyz")).toBe("other");
74
- });
75
-
76
- // MIME type normalization
77
- it("should handle MIME types with parameters", () => {
78
- expect(resolveFileCategory("image/jpeg; charset=utf-8")).toBe("image");
79
- expect(resolveFileCategory("text/plain; charset=utf-8")).toBe("document");
80
- });
81
- });
82
-
83
- describe("resolveExtension", () => {
84
- // Image extensions (Requirement 6.1)
85
- it("should resolve image MIME types to extensions", () => {
86
- expect(resolveExtension("image/jpeg")).toBe(".jpg");
87
- expect(resolveExtension("image/png")).toBe(".png");
88
- expect(resolveExtension("image/gif")).toBe(".gif");
89
- expect(resolveExtension("image/webp")).toBe(".webp");
90
- expect(resolveExtension("image/bmp")).toBe(".bmp");
91
- });
92
-
93
- // Audio extensions (Requirement 6.2)
94
- it("should resolve audio MIME types to extensions", () => {
95
- expect(resolveExtension("audio/mpeg")).toBe(".mp3");
96
- expect(resolveExtension("audio/wav")).toBe(".wav");
97
- expect(resolveExtension("audio/ogg")).toBe(".ogg");
98
- expect(resolveExtension("audio/amr")).toBe(".amr");
99
- expect(resolveExtension("audio/x-m4a")).toBe(".m4a");
100
- });
101
-
102
- // Video extensions (Requirement 6.3)
103
- it("should resolve video MIME types to extensions", () => {
104
- expect(resolveExtension("video/mp4")).toBe(".mp4");
105
- expect(resolveExtension("video/quicktime")).toBe(".mov");
106
- expect(resolveExtension("video/x-msvideo")).toBe(".avi");
107
- expect(resolveExtension("video/webm")).toBe(".webm");
108
- });
109
-
110
- // Document extensions (Requirement 6.4)
111
- it("should resolve document MIME types to extensions", () => {
112
- expect(resolveExtension("application/pdf")).toBe(".pdf");
113
- expect(resolveExtension("application/msword")).toBe(".doc");
114
- expect(resolveExtension("application/vnd.openxmlformats-officedocument.wordprocessingml.document")).toBe(".docx");
115
- });
116
-
117
- // Default extension (Requirement 6.5)
118
- it("should return .bin for unknown MIME types", () => {
119
- expect(resolveExtension("application/unknown")).toBe(".bin");
120
- expect(resolveExtension("application/octet-stream")).toBe(".bin");
121
- });
122
-
123
- // fileName precedence (Requirement 6.6)
124
- it("should use fileName extension when provided", () => {
125
- expect(resolveExtension("application/octet-stream", "photo.jpg")).toBe(".jpg");
126
- expect(resolveExtension("image/png", "custom.jpeg")).toBe(".jpeg");
127
- expect(resolveExtension("application/unknown", "document.pdf")).toBe(".pdf");
128
- });
129
-
130
- // MIME type normalization
131
- it("should handle MIME types with parameters", () => {
132
- expect(resolveExtension("image/jpeg; charset=utf-8")).toBe(".jpg");
133
- expect(resolveExtension("audio/mpeg; bitrate=320")).toBe(".mp3");
134
- });
135
-
136
- // Edge cases
137
- it("should handle fileName without extension", () => {
138
- expect(resolveExtension("image/jpeg", "photo")).toBe(".jpg");
139
- expect(resolveExtension("application/unknown", "noext")).toBe(".bin");
140
- });
141
- });
1
+ /**
2
+ * Unit Tests for File Utilities
3
+ *
4
+ * Feature: dingtalk-media-receive
5
+ * Validates: Requirements 5.1-5.8, 6.1-6.6
6
+ */
7
+
8
+ import { describe, it, expect } from "vitest";
9
+ import { resolveFileCategory, resolveExtension } from "./file-utils.js";
10
+
11
+ describe("resolveFileCategory", () => {
12
+ // Image categorization (Requirement 5.1)
13
+ it("should categorize image MIME types", () => {
14
+ expect(resolveFileCategory("image/jpeg")).toBe("image");
15
+ expect(resolveFileCategory("image/png")).toBe("image");
16
+ expect(resolveFileCategory("image/gif")).toBe("image");
17
+ expect(resolveFileCategory("image/webp")).toBe("image");
18
+ expect(resolveFileCategory("image/bmp")).toBe("image");
19
+ });
20
+
21
+ // Audio categorization (Requirement 5.2)
22
+ it("should categorize audio MIME types", () => {
23
+ expect(resolveFileCategory("audio/mpeg")).toBe("audio");
24
+ expect(resolveFileCategory("audio/wav")).toBe("audio");
25
+ expect(resolveFileCategory("audio/ogg")).toBe("audio");
26
+ expect(resolveFileCategory("audio/amr")).toBe("audio");
27
+ });
28
+
29
+ // Video categorization (Requirement 5.3)
30
+ it("should categorize video MIME types", () => {
31
+ expect(resolveFileCategory("video/mp4")).toBe("video");
32
+ expect(resolveFileCategory("video/quicktime")).toBe("video");
33
+ expect(resolveFileCategory("video/webm")).toBe("video");
34
+ });
35
+
36
+ // Document categorization (Requirement 5.4)
37
+ it("should categorize document MIME types", () => {
38
+ expect(resolveFileCategory("application/pdf")).toBe("document");
39
+ expect(resolveFileCategory("application/msword")).toBe("document");
40
+ expect(resolveFileCategory("text/plain")).toBe("document");
41
+ expect(resolveFileCategory("text/markdown")).toBe("document");
42
+ });
43
+
44
+ // Archive categorization (Requirement 5.5)
45
+ it("should categorize archive MIME types", () => {
46
+ expect(resolveFileCategory("application/zip")).toBe("archive");
47
+ expect(resolveFileCategory("application/x-rar-compressed")).toBe("archive");
48
+ expect(resolveFileCategory("application/x-7z-compressed")).toBe("archive");
49
+ });
50
+
51
+ // Code categorization (Requirement 5.6)
52
+ it("should categorize code MIME types", () => {
53
+ expect(resolveFileCategory("application/json")).toBe("code");
54
+ expect(resolveFileCategory("text/html")).toBe("code");
55
+ expect(resolveFileCategory("text/css")).toBe("code");
56
+ expect(resolveFileCategory("text/javascript")).toBe("code");
57
+ });
58
+
59
+ // Extension fallback (Requirement 5.8)
60
+ it("should use extension fallback when MIME type is unknown", () => {
61
+ expect(resolveFileCategory("application/octet-stream", "photo.jpg")).toBe("image");
62
+ expect(resolveFileCategory("application/octet-stream", "song.mp3")).toBe("audio");
63
+ expect(resolveFileCategory("application/octet-stream", "movie.mp4")).toBe("video");
64
+ expect(resolveFileCategory("application/octet-stream", "doc.pdf")).toBe("document");
65
+ expect(resolveFileCategory("application/octet-stream", "archive.zip")).toBe("archive");
66
+ expect(resolveFileCategory("application/octet-stream", "script.py")).toBe("code");
67
+ });
68
+
69
+ // Other category (Requirement 5.7)
70
+ it("should return 'other' for unknown types", () => {
71
+ expect(resolveFileCategory("application/octet-stream")).toBe("other");
72
+ expect(resolveFileCategory("application/unknown")).toBe("other");
73
+ expect(resolveFileCategory("application/octet-stream", "file.xyz")).toBe("other");
74
+ });
75
+
76
+ // MIME type normalization
77
+ it("should handle MIME types with parameters", () => {
78
+ expect(resolveFileCategory("image/jpeg; charset=utf-8")).toBe("image");
79
+ expect(resolveFileCategory("text/plain; charset=utf-8")).toBe("document");
80
+ });
81
+ });
82
+
83
+ describe("resolveExtension", () => {
84
+ // Image extensions (Requirement 6.1)
85
+ it("should resolve image MIME types to extensions", () => {
86
+ expect(resolveExtension("image/jpeg")).toBe(".jpg");
87
+ expect(resolveExtension("image/png")).toBe(".png");
88
+ expect(resolveExtension("image/gif")).toBe(".gif");
89
+ expect(resolveExtension("image/webp")).toBe(".webp");
90
+ expect(resolveExtension("image/bmp")).toBe(".bmp");
91
+ });
92
+
93
+ // Audio extensions (Requirement 6.2)
94
+ it("should resolve audio MIME types to extensions", () => {
95
+ expect(resolveExtension("audio/mpeg")).toBe(".mp3");
96
+ expect(resolveExtension("audio/wav")).toBe(".wav");
97
+ expect(resolveExtension("audio/ogg")).toBe(".ogg");
98
+ expect(resolveExtension("audio/amr")).toBe(".amr");
99
+ expect(resolveExtension("audio/x-m4a")).toBe(".m4a");
100
+ });
101
+
102
+ // Video extensions (Requirement 6.3)
103
+ it("should resolve video MIME types to extensions", () => {
104
+ expect(resolveExtension("video/mp4")).toBe(".mp4");
105
+ expect(resolveExtension("video/quicktime")).toBe(".mov");
106
+ expect(resolveExtension("video/x-msvideo")).toBe(".avi");
107
+ expect(resolveExtension("video/webm")).toBe(".webm");
108
+ });
109
+
110
+ // Document extensions (Requirement 6.4)
111
+ it("should resolve document MIME types to extensions", () => {
112
+ expect(resolveExtension("application/pdf")).toBe(".pdf");
113
+ expect(resolveExtension("application/msword")).toBe(".doc");
114
+ expect(resolveExtension("application/vnd.openxmlformats-officedocument.wordprocessingml.document")).toBe(".docx");
115
+ });
116
+
117
+ // Default extension (Requirement 6.5)
118
+ it("should return .bin for unknown MIME types", () => {
119
+ expect(resolveExtension("application/unknown")).toBe(".bin");
120
+ expect(resolveExtension("application/octet-stream")).toBe(".bin");
121
+ });
122
+
123
+ // fileName precedence (Requirement 6.6)
124
+ it("should use fileName extension when provided", () => {
125
+ expect(resolveExtension("application/octet-stream", "photo.jpg")).toBe(".jpg");
126
+ expect(resolveExtension("image/png", "custom.jpeg")).toBe(".jpeg");
127
+ expect(resolveExtension("application/unknown", "document.pdf")).toBe(".pdf");
128
+ });
129
+
130
+ // MIME type normalization
131
+ it("should handle MIME types with parameters", () => {
132
+ expect(resolveExtension("image/jpeg; charset=utf-8")).toBe(".jpg");
133
+ expect(resolveExtension("audio/mpeg; bitrate=320")).toBe(".mp3");
134
+ });
135
+
136
+ // Edge cases
137
+ it("should handle fileName without extension", () => {
138
+ expect(resolveExtension("image/jpeg", "photo")).toBe(".jpg");
139
+ expect(resolveExtension("application/unknown", "noext")).toBe(".bin");
140
+ });
141
+ });