@ecat/weixin-bot-cli 0.1.0

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.
Files changed (81) hide show
  1. package/LICENSE +27 -0
  2. package/README.md +77 -0
  3. package/dist/api/api.d.ts +47 -0
  4. package/dist/api/api.js +233 -0
  5. package/dist/api/api.js.map +1 -0
  6. package/dist/api/config-cache.d.ts +18 -0
  7. package/dist/api/config-cache.js +64 -0
  8. package/dist/api/config-cache.js.map +1 -0
  9. package/dist/api/session-guard.d.ts +15 -0
  10. package/dist/api/session-guard.js +49 -0
  11. package/dist/api/session-guard.js.map +1 -0
  12. package/dist/api/types.d.ts +201 -0
  13. package/dist/api/types.js +35 -0
  14. package/dist/api/types.js.map +1 -0
  15. package/dist/auth/accounts.d.ts +30 -0
  16. package/dist/auth/accounts.js +158 -0
  17. package/dist/auth/accounts.js.map +1 -0
  18. package/dist/auth/login-qr.d.ts +31 -0
  19. package/dist/auth/login-qr.js +235 -0
  20. package/dist/auth/login-qr.js.map +1 -0
  21. package/dist/cdn/aes-ecb.d.ts +6 -0
  22. package/dist/cdn/aes-ecb.js +19 -0
  23. package/dist/cdn/aes-ecb.js.map +1 -0
  24. package/dist/cdn/cdn-upload.d.ts +17 -0
  25. package/dist/cdn/cdn-upload.js +73 -0
  26. package/dist/cdn/cdn-upload.js.map +1 -0
  27. package/dist/cdn/cdn-url.d.ts +13 -0
  28. package/dist/cdn/cdn-url.js +14 -0
  29. package/dist/cdn/cdn-url.js.map +1 -0
  30. package/dist/cdn/pic-decrypt.d.ts +9 -0
  31. package/dist/cdn/pic-decrypt.js +89 -0
  32. package/dist/cdn/pic-decrypt.js.map +1 -0
  33. package/dist/cdn/upload.d.ts +42 -0
  34. package/dist/cdn/upload.js +106 -0
  35. package/dist/cdn/upload.js.map +1 -0
  36. package/dist/cli.d.ts +2 -0
  37. package/dist/cli.js +127 -0
  38. package/dist/cli.js.map +1 -0
  39. package/dist/config/config-schema.d.ts +16 -0
  40. package/dist/config/config-schema.js +17 -0
  41. package/dist/config/config-schema.js.map +1 -0
  42. package/dist/media/media-download.d.ts +18 -0
  43. package/dist/media/media-download.js +95 -0
  44. package/dist/media/media-download.js.map +1 -0
  45. package/dist/media/mime.d.ts +6 -0
  46. package/dist/media/mime.js +73 -0
  47. package/dist/media/mime.js.map +1 -0
  48. package/dist/media/silk-transcode.d.ts +8 -0
  49. package/dist/media/silk-transcode.js +64 -0
  50. package/dist/media/silk-transcode.js.map +1 -0
  51. package/dist/messaging/debug-mode.d.ts +9 -0
  52. package/dist/messaging/debug-mode.js +63 -0
  53. package/dist/messaging/debug-mode.js.map +1 -0
  54. package/dist/messaging/inbound.d.ts +69 -0
  55. package/dist/messaging/inbound.js +201 -0
  56. package/dist/messaging/inbound.js.map +1 -0
  57. package/dist/messaging/send-media.d.ts +21 -0
  58. package/dist/messaging/send-media.js +54 -0
  59. package/dist/messaging/send-media.js.map +1 -0
  60. package/dist/messaging/send.d.ts +70 -0
  61. package/dist/messaging/send.js +203 -0
  62. package/dist/messaging/send.js.map +1 -0
  63. package/dist/monitor/monitor.d.ts +12 -0
  64. package/dist/monitor/monitor.js +145 -0
  65. package/dist/monitor/monitor.js.map +1 -0
  66. package/dist/storage/state-dir.d.ts +2 -0
  67. package/dist/storage/state-dir.js +8 -0
  68. package/dist/storage/state-dir.js.map +1 -0
  69. package/dist/storage/sync-buf.d.ts +20 -0
  70. package/dist/storage/sync-buf.js +64 -0
  71. package/dist/storage/sync-buf.js.map +1 -0
  72. package/dist/util/logger.d.ts +14 -0
  73. package/dist/util/logger.js +119 -0
  74. package/dist/util/logger.js.map +1 -0
  75. package/dist/util/random.d.ts +10 -0
  76. package/dist/util/random.js +16 -0
  77. package/dist/util/random.js.map +1 -0
  78. package/dist/util/redact.d.ts +20 -0
  79. package/dist/util/redact.js +54 -0
  80. package/dist/util/redact.js.map +1 -0
  81. package/package.json +38 -0
@@ -0,0 +1,16 @@
1
+ import crypto from "node:crypto";
2
+ /**
3
+ * Generate a prefixed unique ID using timestamp + crypto random bytes.
4
+ * Format: `{prefix}:{timestamp}-{8-char hex}`
5
+ */
6
+ export function generateId(prefix) {
7
+ return `${prefix}:${Date.now()}-${crypto.randomBytes(4).toString("hex")}`;
8
+ }
9
+ /**
10
+ * Generate a temporary file name with random suffix.
11
+ * Format: `{prefix}-{timestamp}-{8-char hex}{ext}`
12
+ */
13
+ export function tempFileName(prefix, ext) {
14
+ return `${prefix}-${Date.now()}-${crypto.randomBytes(4).toString("hex")}${ext}`;
15
+ }
16
+ //# sourceMappingURL=random.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/util/random.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,GAAW;IACtD,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC;AAClF,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Truncate a string, appending a length indicator when trimmed.
3
+ * Returns `""` for empty/undefined input.
4
+ */
5
+ export declare function truncate(s: string | undefined, max: number): string;
6
+ /**
7
+ * Redact a token/secret: show only the first few chars + total length.
8
+ * Returns `"(none)"` when absent.
9
+ */
10
+ export declare function redactToken(token: string | undefined, prefixLen?: number): string;
11
+ /**
12
+ * Truncate a JSON body string to `maxLen` chars for safe logging.
13
+ * Redacts known sensitive fields before truncating.
14
+ */
15
+ export declare function redactBody(body: string | undefined, maxLen?: number): string;
16
+ /**
17
+ * Strip query string (which often contains signatures/tokens) from a URL,
18
+ * keeping only origin + pathname.
19
+ */
20
+ export declare function redactUrl(rawUrl: string): string;
@@ -0,0 +1,54 @@
1
+ const DEFAULT_BODY_MAX_LEN = 200;
2
+ const DEFAULT_TOKEN_PREFIX_LEN = 6;
3
+ /**
4
+ * Truncate a string, appending a length indicator when trimmed.
5
+ * Returns `""` for empty/undefined input.
6
+ */
7
+ export function truncate(s, max) {
8
+ if (!s)
9
+ return "";
10
+ if (s.length <= max)
11
+ return s;
12
+ return `${s.slice(0, max)}…(len=${s.length})`;
13
+ }
14
+ /**
15
+ * Redact a token/secret: show only the first few chars + total length.
16
+ * Returns `"(none)"` when absent.
17
+ */
18
+ export function redactToken(token, prefixLen = DEFAULT_TOKEN_PREFIX_LEN) {
19
+ if (!token)
20
+ return "(none)";
21
+ if (token.length <= prefixLen)
22
+ return `****(len=${token.length})`;
23
+ return `${token.slice(0, prefixLen)}…(len=${token.length})`;
24
+ }
25
+ /** Field names whose values should be masked in logged JSON bodies. */
26
+ const SENSITIVE_FIELDS = /\b(context_token|bot_token|token|authorization|Authorization)\b/;
27
+ /**
28
+ * Truncate a JSON body string to `maxLen` chars for safe logging.
29
+ * Redacts known sensitive fields before truncating.
30
+ */
31
+ export function redactBody(body, maxLen = DEFAULT_BODY_MAX_LEN) {
32
+ if (!body)
33
+ return "(empty)";
34
+ // Mask values of known sensitive JSON keys: "key":"value" → "key":"<redacted>"
35
+ const redacted = body.replace(/"(context_token|bot_token|token|authorization|Authorization)"\s*:\s*"[^"]*"/g, '"$1":"<redacted>"');
36
+ if (redacted.length <= maxLen)
37
+ return redacted;
38
+ return `${redacted.slice(0, maxLen)}…(truncated, totalLen=${redacted.length})`;
39
+ }
40
+ /**
41
+ * Strip query string (which often contains signatures/tokens) from a URL,
42
+ * keeping only origin + pathname.
43
+ */
44
+ export function redactUrl(rawUrl) {
45
+ try {
46
+ const u = new URL(rawUrl);
47
+ const base = `${u.origin}${u.pathname}`;
48
+ return u.search ? `${base}?<redacted>` : base;
49
+ }
50
+ catch {
51
+ return truncate(rawUrl, 80);
52
+ }
53
+ }
54
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/util/redact.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAEnC;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,CAAqB,EAAE,GAAW;IACzD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAyB,EAAE,SAAS,GAAG,wBAAwB;IACzF,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,YAAY,KAAK,CAAC,MAAM,GAAG,CAAC;IAClE,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,KAAK,CAAC,MAAM,GAAG,CAAC;AAC9D,CAAC;AAED,uEAAuE;AACvE,MAAM,gBAAgB,GAAG,iEAAiE,CAAC;AAE3F;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAwB,EAAE,MAAM,GAAG,oBAAoB;IAChF,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAC3B,8EAA8E,EAC9E,mBAAmB,CACpB,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,QAAQ,CAAC;IAC/C,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,yBAAyB,QAAQ,CAAC,MAAM,GAAG,CAAC;AACjF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@ecat/weixin-bot-cli",
3
+ "publishConfig": {
4
+ "access": "public"
5
+ },
6
+ "version": "0.1.0",
7
+ "description": "Weixin Bot CLI",
8
+ "license": "MIT",
9
+ "author": "ecat",
10
+ "type": "module",
11
+ "bin": {
12
+ "weixin-bot-cli": "./dist/cli.js"
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "engines": {
18
+ "node": ">=22"
19
+ },
20
+ "dependencies": {
21
+ "commander": "^13.1.0",
22
+ "qrcode-terminal": "0.12.0",
23
+ "silk-wasm": "^3.7.1",
24
+ "zod": "4.3.6"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^25.5.0",
28
+ "@vitest/coverage-v8": "^3.1.0",
29
+ "typescript": "^5.8.0",
30
+ "vitest": "^3.1.0"
31
+ },
32
+ "ilink_appid": "bot",
33
+ "scripts": {
34
+ "test": "vitest run --coverage",
35
+ "typecheck": "tsc --noEmit",
36
+ "build": "tsc"
37
+ }
38
+ }