@openclaw-china/shared 0.1.39 → 2026.3.3

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.39",
3
+ "version": "2026.3.3",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./src/index.ts"
@@ -620,15 +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
- const asrEnabled = await prompter.askConfirm(
629
- "启用 ASR(支持入站语音自动转文字)",
630
- toBoolean(existingAsr.enabled, false)
631
- );
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
+ );
632
632
 
633
633
  const asr: ConfigRecord = {
634
634
  enabled: asrEnabled,
@@ -652,12 +652,12 @@ async function configureQQBot(prompter: SetupPrompter, cfg: ConfigRoot): Promise
652
652
  });
653
653
  }
654
654
 
655
- return mergeChannelConfig(cfg, "qqbot", {
656
- appId,
657
- clientSecret,
658
- asr,
659
- });
660
- }
655
+ return mergeChannelConfig(cfg, "qqbot", {
656
+ appId,
657
+ clientSecret,
658
+ asr,
659
+ });
660
+ }
661
661
 
662
662
  async function configureSingleChannel(
663
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
+ });