@jackle.dev/zalox 1.0.1

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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/dist/cli/commands/admin.d.ts +17 -0
  4. package/dist/cli/commands/admin.d.ts.map +1 -0
  5. package/dist/cli/commands/admin.js +359 -0
  6. package/dist/cli/commands/admin.js.map +1 -0
  7. package/dist/cli/commands/auth.d.ts +3 -0
  8. package/dist/cli/commands/auth.d.ts.map +1 -0
  9. package/dist/cli/commands/auth.js +88 -0
  10. package/dist/cli/commands/auth.js.map +1 -0
  11. package/dist/cli/commands/autoreply.d.ts +12 -0
  12. package/dist/cli/commands/autoreply.d.ts.map +1 -0
  13. package/dist/cli/commands/autoreply.js +162 -0
  14. package/dist/cli/commands/autoreply.js.map +1 -0
  15. package/dist/cli/commands/bulk.d.ts +9 -0
  16. package/dist/cli/commands/bulk.d.ts.map +1 -0
  17. package/dist/cli/commands/bulk.js +169 -0
  18. package/dist/cli/commands/bulk.js.map +1 -0
  19. package/dist/cli/commands/config.d.ts +14 -0
  20. package/dist/cli/commands/config.d.ts.map +1 -0
  21. package/dist/cli/commands/config.js +122 -0
  22. package/dist/cli/commands/config.js.map +1 -0
  23. package/dist/cli/commands/conv.d.ts +3 -0
  24. package/dist/cli/commands/conv.d.ts.map +1 -0
  25. package/dist/cli/commands/conv.js +229 -0
  26. package/dist/cli/commands/conv.js.map +1 -0
  27. package/dist/cli/commands/daemon.d.ts +13 -0
  28. package/dist/cli/commands/daemon.d.ts.map +1 -0
  29. package/dist/cli/commands/daemon.js +102 -0
  30. package/dist/cli/commands/daemon.js.map +1 -0
  31. package/dist/cli/commands/export.d.ts +10 -0
  32. package/dist/cli/commands/export.d.ts.map +1 -0
  33. package/dist/cli/commands/export.js +98 -0
  34. package/dist/cli/commands/export.js.map +1 -0
  35. package/dist/cli/commands/friend.d.ts +13 -0
  36. package/dist/cli/commands/friend.d.ts.map +1 -0
  37. package/dist/cli/commands/friend.js +337 -0
  38. package/dist/cli/commands/friend.js.map +1 -0
  39. package/dist/cli/commands/group-settings.d.ts +11 -0
  40. package/dist/cli/commands/group-settings.d.ts.map +1 -0
  41. package/dist/cli/commands/group-settings.js +154 -0
  42. package/dist/cli/commands/group-settings.js.map +1 -0
  43. package/dist/cli/commands/group.d.ts +14 -0
  44. package/dist/cli/commands/group.d.ts.map +1 -0
  45. package/dist/cli/commands/group.js +365 -0
  46. package/dist/cli/commands/group.js.map +1 -0
  47. package/dist/cli/commands/license.d.ts +13 -0
  48. package/dist/cli/commands/license.d.ts.map +1 -0
  49. package/dist/cli/commands/license.js +218 -0
  50. package/dist/cli/commands/license.js.map +1 -0
  51. package/dist/cli/commands/listen.d.ts +3 -0
  52. package/dist/cli/commands/listen.d.ts.map +1 -0
  53. package/dist/cli/commands/listen.js +177 -0
  54. package/dist/cli/commands/listen.js.map +1 -0
  55. package/dist/cli/commands/me.d.ts +9 -0
  56. package/dist/cli/commands/me.d.ts.map +1 -0
  57. package/dist/cli/commands/me.js +135 -0
  58. package/dist/cli/commands/me.js.map +1 -0
  59. package/dist/cli/commands/msg.d.ts +11 -0
  60. package/dist/cli/commands/msg.d.ts.map +1 -0
  61. package/dist/cli/commands/msg.js +255 -0
  62. package/dist/cli/commands/msg.js.map +1 -0
  63. package/dist/cli/commands/profile.d.ts +3 -0
  64. package/dist/cli/commands/profile.d.ts.map +1 -0
  65. package/dist/cli/commands/profile.js +50 -0
  66. package/dist/cli/commands/profile.js.map +1 -0
  67. package/dist/cli/commands/schedule.d.ts +12 -0
  68. package/dist/cli/commands/schedule.d.ts.map +1 -0
  69. package/dist/cli/commands/schedule.js +175 -0
  70. package/dist/cli/commands/schedule.js.map +1 -0
  71. package/dist/cli/commands/serve.d.ts +3 -0
  72. package/dist/cli/commands/serve.d.ts.map +1 -0
  73. package/dist/cli/commands/serve.js +87 -0
  74. package/dist/cli/commands/serve.js.map +1 -0
  75. package/dist/cli/commands/template.d.ts +12 -0
  76. package/dist/cli/commands/template.d.ts.map +1 -0
  77. package/dist/cli/commands/template.js +163 -0
  78. package/dist/cli/commands/template.js.map +1 -0
  79. package/dist/cli/index.d.ts +3 -0
  80. package/dist/cli/index.d.ts.map +1 -0
  81. package/dist/cli/index.js +116 -0
  82. package/dist/cli/index.js.map +1 -0
  83. package/dist/cli/output.d.ts +63 -0
  84. package/dist/cli/output.d.ts.map +1 -0
  85. package/dist/cli/output.js +144 -0
  86. package/dist/cli/output.js.map +1 -0
  87. package/dist/core/autoreply.d.ts +57 -0
  88. package/dist/core/autoreply.d.ts.map +1 -0
  89. package/dist/core/autoreply.js +159 -0
  90. package/dist/core/autoreply.js.map +1 -0
  91. package/dist/core/bulk.d.ts +36 -0
  92. package/dist/core/bulk.d.ts.map +1 -0
  93. package/dist/core/bulk.js +117 -0
  94. package/dist/core/bulk.js.map +1 -0
  95. package/dist/core/client.d.ts +8 -0
  96. package/dist/core/client.d.ts.map +1 -0
  97. package/dist/core/client.js +91 -0
  98. package/dist/core/client.js.map +1 -0
  99. package/dist/core/daemon.d.ts +30 -0
  100. package/dist/core/daemon.d.ts.map +1 -0
  101. package/dist/core/daemon.js +213 -0
  102. package/dist/core/daemon.js.map +1 -0
  103. package/dist/core/dm-commands.d.ts +41 -0
  104. package/dist/core/dm-commands.d.ts.map +1 -0
  105. package/dist/core/dm-commands.js +313 -0
  106. package/dist/core/dm-commands.js.map +1 -0
  107. package/dist/core/export.d.ts +20 -0
  108. package/dist/core/export.d.ts.map +1 -0
  109. package/dist/core/export.js +92 -0
  110. package/dist/core/export.js.map +1 -0
  111. package/dist/core/gate.d.ts +39 -0
  112. package/dist/core/gate.d.ts.map +1 -0
  113. package/dist/core/gate.js +75 -0
  114. package/dist/core/gate.js.map +1 -0
  115. package/dist/core/group-settings.d.ts +35 -0
  116. package/dist/core/group-settings.d.ts.map +1 -0
  117. package/dist/core/group-settings.js +70 -0
  118. package/dist/core/group-settings.js.map +1 -0
  119. package/dist/core/index.d.ts +22 -0
  120. package/dist/core/index.d.ts.map +1 -0
  121. package/dist/core/index.js +12 -0
  122. package/dist/core/index.js.map +1 -0
  123. package/dist/core/license.d.ts +103 -0
  124. package/dist/core/license.d.ts.map +1 -0
  125. package/dist/core/license.js +444 -0
  126. package/dist/core/license.js.map +1 -0
  127. package/dist/core/scheduler.d.ts +45 -0
  128. package/dist/core/scheduler.d.ts.map +1 -0
  129. package/dist/core/scheduler.js +203 -0
  130. package/dist/core/scheduler.js.map +1 -0
  131. package/dist/core/templates.d.ts +35 -0
  132. package/dist/core/templates.d.ts.map +1 -0
  133. package/dist/core/templates.js +107 -0
  134. package/dist/core/templates.js.map +1 -0
  135. package/dist/core/types.d.ts +57 -0
  136. package/dist/core/types.d.ts.map +1 -0
  137. package/dist/core/types.js +10 -0
  138. package/dist/core/types.js.map +1 -0
  139. package/dist/server/api.d.ts +2 -0
  140. package/dist/server/api.d.ts.map +1 -0
  141. package/dist/server/api.js +79 -0
  142. package/dist/server/api.js.map +1 -0
  143. package/dist/server/index.d.ts +16 -0
  144. package/dist/server/index.d.ts.map +1 -0
  145. package/dist/server/index.js +48 -0
  146. package/dist/server/index.js.map +1 -0
  147. package/dist/server/license-api.d.ts +55 -0
  148. package/dist/server/license-api.d.ts.map +1 -0
  149. package/dist/server/license-api.js +496 -0
  150. package/dist/server/license-api.js.map +1 -0
  151. package/dist/server/middleware.d.ts +18 -0
  152. package/dist/server/middleware.d.ts.map +1 -0
  153. package/dist/server/middleware.js +92 -0
  154. package/dist/server/middleware.js.map +1 -0
  155. package/dist/server/webhook.d.ts +10 -0
  156. package/dist/server/webhook.d.ts.map +1 -0
  157. package/dist/server/webhook.js +53 -0
  158. package/dist/server/webhook.js.map +1 -0
  159. package/dist/server/ws.d.ts +66 -0
  160. package/dist/server/ws.d.ts.map +1 -0
  161. package/dist/server/ws.js +203 -0
  162. package/dist/server/ws.js.map +1 -0
  163. package/dist/utils/cache.d.ts +35 -0
  164. package/dist/utils/cache.d.ts.map +1 -0
  165. package/dist/utils/cache.js +78 -0
  166. package/dist/utils/cache.js.map +1 -0
  167. package/dist/utils/config.d.ts +16 -0
  168. package/dist/utils/config.d.ts.map +1 -0
  169. package/dist/utils/config.js +88 -0
  170. package/dist/utils/config.js.map +1 -0
  171. package/dist/utils/logger.d.ts +17 -0
  172. package/dist/utils/logger.d.ts.map +1 -0
  173. package/dist/utils/logger.js +51 -0
  174. package/dist/utils/logger.js.map +1 -0
  175. package/package.json +74 -0
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ZaloX — Modern Zalo CLI & API Platform
4
+ * Built on zca-js (MIT) — https://github.com/RFS-ADRENO/zca-js
5
+ */
6
+ import { Command } from 'commander';
7
+ import chalk from 'chalk';
8
+ import { authCommands } from './commands/auth.js';
9
+ import { registerMsgCommands } from './commands/msg.js';
10
+ import { registerFriendCommands } from './commands/friend.js';
11
+ import { registerGroupCommands } from './commands/group.js';
12
+ import { listenCommands } from './commands/listen.js';
13
+ import { convCommands } from './commands/conv.js';
14
+ import { serveCommands } from './commands/serve.js';
15
+ import { configCommands } from './commands/config.js';
16
+ import { registerMeCommands } from './commands/me.js';
17
+ import { licenseCommands } from './commands/license.js';
18
+ import { templateCommands } from './commands/template.js';
19
+ import { scheduleCommands } from './commands/schedule.js';
20
+ import { autoreplyCommands } from './commands/autoreply.js';
21
+ import { bulkCommands } from './commands/bulk.js';
22
+ import { exportCommands } from './commands/export.js';
23
+ import { daemonCommands } from './commands/daemon.js';
24
+ import { groupSettingsCommands } from './commands/group-settings.js';
25
+ import { adminCommands } from './commands/admin.js';
26
+ const VERSION = '1.0.0';
27
+ const program = new Command();
28
+ program
29
+ .name('zalox')
30
+ .description('🚀 ZaloX — Modern Zalo CLI & API Platform')
31
+ .version(VERSION, '-v, --version')
32
+ .option('-p, --profile <name>', 'Use a specific account profile')
33
+ .option('-j, --json', 'Output in JSON format')
34
+ .enablePositionalOptions()
35
+ .passThroughOptions()
36
+ .option('--verbose', 'Enable verbose logging');
37
+ // Register all command groups
38
+ authCommands(program);
39
+ registerMsgCommands(program);
40
+ registerFriendCommands(program);
41
+ registerGroupCommands(program);
42
+ listenCommands(program);
43
+ convCommands(program);
44
+ serveCommands(program);
45
+ configCommands(program);
46
+ registerMeCommands(program);
47
+ licenseCommands(program);
48
+ templateCommands(program);
49
+ scheduleCommands(program);
50
+ autoreplyCommands(program);
51
+ bulkCommands(program);
52
+ exportCommands(program);
53
+ daemonCommands(program);
54
+ groupSettingsCommands(program);
55
+ adminCommands(program);
56
+ // Default action: show help
57
+ program.action(() => {
58
+ console.log(`
59
+ ${chalk.cyan('╔═══════════════════════════════╗')}
60
+ ${chalk.cyan('║')} ${chalk.bold.white('ZaloX')} ${chalk.gray(`v${VERSION}`)} ${chalk.cyan('║')}
61
+ ${chalk.cyan('║')} ${chalk.gray('Zalo Automation, Unleashed.')} ${chalk.cyan(' ║')}
62
+ ${chalk.cyan('╚═══════════════════════════════╝')}
63
+ `);
64
+ program.outputHelp();
65
+ });
66
+ program.addHelpText('after', `
67
+ ${chalk.gray('Examples:')}
68
+ ${chalk.cyan('$')} zalox auth login Login via QR code
69
+ ${chalk.cyan('$')} zalox auth status Check login status
70
+ ${chalk.cyan('$')} zalox me Your Zalo profile
71
+ ${chalk.cyan('$')} zalox friend list List all friends
72
+ ${chalk.cyan('$')} zalox group list List all groups
73
+ ${chalk.cyan('$')} zalox msg send <id> "Hello" Send a message
74
+ ${chalk.cyan('$')} zalox conv list Recent conversations
75
+ ${chalk.cyan('$')} zalox listen Real-time event listener
76
+ ${chalk.cyan('$')} zalox listen --json Listen with JSON output
77
+ ${chalk.cyan('$')} zalox serve Start REST API server ${chalk.yellow('[Pro]')}
78
+ ${chalk.cyan('$')} zalox daemon Start all-in-one daemon 🤖
79
+ ${chalk.cyan('$')} zalox status Show status overview
80
+ ${chalk.cyan('$')} zalox config show Show configuration
81
+ ${chalk.cyan('$')} zalox license status Check license
82
+ ${chalk.cyan('$')} zalox license features Feature comparison
83
+
84
+ ${chalk.gray('Templates & Automation:')}
85
+ ${chalk.cyan('$')} zalox template create hi "Hello {{name}}!" ${chalk.yellow('[Starter+]')}
86
+ ${chalk.cyan('$')} zalox template send hi <id> --var name=John ${chalk.yellow('[Starter+]')}
87
+ ${chalk.cyan('$')} zalox schedule add <id> "Hi" --at "2026-02-12 09:00" ${chalk.yellow('[Pro+]')}
88
+ ${chalk.cyan('$')} zalox schedule add <id> "GM" --cron "0 8 * * *" ${chalk.yellow('[Pro+]')}
89
+ ${chalk.cyan('$')} zalox schedule run ${chalk.yellow('[Pro+]')}
90
+ ${chalk.cyan('$')} zalox autoreply add faq --trigger "giá" --response "..." ${chalk.yellow('[Pro+]')}
91
+ ${chalk.cyan('$')} zalox autoreply test "giá sản phẩm" ${chalk.yellow('[Pro+]')}
92
+ ${chalk.cyan('$')} zalox bulk send --friends --message "Happy NY!" ${chalk.yellow('[Pro+]')}
93
+ ${chalk.cyan('$')} zalox bulk usage ${chalk.yellow('[Pro+]')}
94
+ ${chalk.cyan('$')} zalox export friends --format csv -o out.csv ${chalk.yellow('[Pro+]')}
95
+ ${chalk.cyan('$')} zalox export groups --format json ${chalk.yellow('[Pro+]')}
96
+
97
+ ${chalk.gray('Group Settings:')}
98
+ ${chalk.cyan('$')} zalox gs list Show all group settings
99
+ ${chalk.cyan('$')} zalox gs show <id> Show settings for a group
100
+ ${chalk.cyan('$')} zalox gs set <id> welcome "Hi!" Set welcome message
101
+ ${chalk.cyan('$')} zalox gs set <id> autoReply on Toggle auto-reply
102
+ ${chalk.cyan('$')} zalox gs set <id> antiSpam on Toggle anti-spam
103
+ ${chalk.cyan('$')} zalox gs reset <id> Reset to defaults
104
+
105
+ ${chalk.gray('Multi-account:')}
106
+ ${chalk.cyan('$')} zalox auth login -p work Login with "work" profile
107
+ ${chalk.cyan('$')} zalox auth use work Switch to "work" profile
108
+ ${chalk.cyan('$')} zalox -p work friend list Use "work" for one command
109
+
110
+ ${chalk.yellow('⚠ Not affiliated with Zalo or VNG Corporation.')}
111
+ `);
112
+ program.parseAsync(process.argv).catch((err) => {
113
+ console.error(chalk.red(`\n✗ ${err.message || err}\n`));
114
+ process.exit(1);
115
+ });
116
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { User } from "zca-js";
2
+ /**
3
+ * Render a table with headers and rows
4
+ */
5
+ export declare function formatTable(headers: string[], rows: string[][]): string;
6
+ /**
7
+ * Pretty-print JSON with colors
8
+ */
9
+ export declare function formatJson(data: unknown): string;
10
+ /**
11
+ * Pretty-print a message event
12
+ */
13
+ export declare function formatMessage(msg: {
14
+ threadId: string;
15
+ isSelf: boolean;
16
+ type: number;
17
+ data: {
18
+ uidFrom: string;
19
+ dName?: string;
20
+ content: unknown;
21
+ ts: string;
22
+ msgId: string;
23
+ msgType: string;
24
+ };
25
+ }): string;
26
+ /**
27
+ * Pretty-print a user
28
+ */
29
+ export declare function formatUser(user: Partial<User>): string;
30
+ /**
31
+ * Pretty-print a group
32
+ */
33
+ export declare function formatGroup(group: {
34
+ groupId?: string;
35
+ name?: string;
36
+ desc?: string;
37
+ totalMember?: number;
38
+ maxMember?: number;
39
+ creatorId?: string;
40
+ createdTime?: number;
41
+ avt?: string;
42
+ }): string;
43
+ /**
44
+ * Print success message
45
+ */
46
+ export declare function printSuccess(msg: string): void;
47
+ /**
48
+ * Print error message
49
+ */
50
+ export declare function printError(msg: string): void;
51
+ /**
52
+ * Print warning message
53
+ */
54
+ export declare function printWarn(msg: string): void;
55
+ /**
56
+ * Print info message
57
+ */
58
+ export declare function printInfo(msg: string): void;
59
+ /**
60
+ * Truncate a string to maxLen, adding "…" if truncated
61
+ */
62
+ export declare function truncate(str: string, maxLen?: number): string;
63
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnC;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CA0BvE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,GAAG,MAAM,CAsBT;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAwBtD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,CAoBT;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAGjE"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * ZaloX Output Formatting Utilities
3
+ */
4
+ import Table from "cli-table3";
5
+ import chalk from "chalk";
6
+ /**
7
+ * Render a table with headers and rows
8
+ */
9
+ export function formatTable(headers, rows) {
10
+ const table = new Table({
11
+ head: headers.map((h) => chalk.cyan.bold(h)),
12
+ style: { head: [], border: [] },
13
+ chars: {
14
+ top: "─",
15
+ "top-mid": "┬",
16
+ "top-left": "┌",
17
+ "top-right": "┐",
18
+ bottom: "─",
19
+ "bottom-mid": "┴",
20
+ "bottom-left": "└",
21
+ "bottom-right": "┘",
22
+ left: "│",
23
+ "left-mid": "├",
24
+ mid: "─",
25
+ "mid-mid": "┼",
26
+ right: "│",
27
+ "right-mid": "┤",
28
+ middle: "│",
29
+ },
30
+ });
31
+ for (const row of rows) {
32
+ table.push(row);
33
+ }
34
+ return table.toString();
35
+ }
36
+ /**
37
+ * Pretty-print JSON with colors
38
+ */
39
+ export function formatJson(data) {
40
+ return JSON.stringify(data, null, 2);
41
+ }
42
+ /**
43
+ * Pretty-print a message event
44
+ */
45
+ export function formatMessage(msg) {
46
+ const ts = new Date(parseInt(msg.data.ts)).toLocaleTimeString();
47
+ const sender = msg.data.dName || msg.data.uidFrom;
48
+ const threadType = msg.type === 1 ? "group" : "user";
49
+ const selfTag = msg.isSelf ? chalk.gray(" (self)") : "";
50
+ const content = typeof msg.data.content === "string"
51
+ ? msg.data.content
52
+ : JSON.stringify(msg.data.content);
53
+ return (chalk.gray(`[${ts}]`) +
54
+ " " +
55
+ chalk.blue(`[${threadType}:${msg.threadId}]`) +
56
+ " " +
57
+ chalk.green.bold(sender) +
58
+ selfTag +
59
+ chalk.gray(": ") +
60
+ content +
61
+ " " +
62
+ chalk.gray(`(msgId: ${msg.data.msgId})`));
63
+ }
64
+ /**
65
+ * Pretty-print a user
66
+ */
67
+ export function formatUser(user) {
68
+ const lines = [];
69
+ lines.push(chalk.bold.cyan("👤 User Info"));
70
+ lines.push(chalk.gray("─".repeat(40)));
71
+ if (user.userId)
72
+ lines.push(` ${chalk.bold("ID:")} ${user.userId}`);
73
+ if (user.displayName)
74
+ lines.push(` ${chalk.bold("Display:")} ${user.displayName}`);
75
+ if (user.zaloName)
76
+ lines.push(` ${chalk.bold("Zalo Name:")} ${user.zaloName}`);
77
+ if (user.phoneNumber)
78
+ lines.push(` ${chalk.bold("Phone:")} ${user.phoneNumber}`);
79
+ if (user.gender !== undefined)
80
+ lines.push(` ${chalk.bold("Gender:")} ${user.gender === 0 ? "Male" : "Female"}`);
81
+ if (user.status)
82
+ lines.push(` ${chalk.bold("Status:")} ${user.status}`);
83
+ if (user.avatar)
84
+ lines.push(` ${chalk.bold("Avatar:")} ${user.avatar}`);
85
+ if (user.isFr !== undefined)
86
+ lines.push(` ${chalk.bold("Is Friend:")} ${user.isFr === 1 ? chalk.green("Yes") : chalk.red("No")}`);
87
+ return lines.join("\n");
88
+ }
89
+ /**
90
+ * Pretty-print a group
91
+ */
92
+ export function formatGroup(group) {
93
+ const lines = [];
94
+ lines.push(chalk.bold.cyan("👥 Group Info"));
95
+ lines.push(chalk.gray("─".repeat(40)));
96
+ if (group.groupId)
97
+ lines.push(` ${chalk.bold("ID:")} ${group.groupId}`);
98
+ if (group.name)
99
+ lines.push(` ${chalk.bold("Name:")} ${group.name}`);
100
+ if (group.desc)
101
+ lines.push(` ${chalk.bold("Description:")} ${group.desc}`);
102
+ if (group.totalMember !== undefined)
103
+ lines.push(` ${chalk.bold("Members:")} ${group.totalMember}${group.maxMember ? `/${group.maxMember}` : ""}`);
104
+ if (group.creatorId)
105
+ lines.push(` ${chalk.bold("Creator:")} ${group.creatorId}`);
106
+ if (group.createdTime)
107
+ lines.push(` ${chalk.bold("Created:")} ${new Date(group.createdTime).toLocaleString()}`);
108
+ if (group.avt)
109
+ lines.push(` ${chalk.bold("Avatar:")} ${group.avt}`);
110
+ return lines.join("\n");
111
+ }
112
+ /**
113
+ * Print success message
114
+ */
115
+ export function printSuccess(msg) {
116
+ console.log(chalk.green("✓ ") + msg);
117
+ }
118
+ /**
119
+ * Print error message
120
+ */
121
+ export function printError(msg) {
122
+ console.error(chalk.red("✗ ") + msg);
123
+ }
124
+ /**
125
+ * Print warning message
126
+ */
127
+ export function printWarn(msg) {
128
+ console.log(chalk.yellow("⚠ ") + msg);
129
+ }
130
+ /**
131
+ * Print info message
132
+ */
133
+ export function printInfo(msg) {
134
+ console.log(chalk.blue("ℹ ") + msg);
135
+ }
136
+ /**
137
+ * Truncate a string to maxLen, adding "…" if truncated
138
+ */
139
+ export function truncate(str, maxLen = 50) {
140
+ if (str.length <= maxLen)
141
+ return str;
142
+ return str.slice(0, maxLen - 1) + "…";
143
+ }
144
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * ZaloX — Auto-Reply System
3
+ *
4
+ * Rule-based auto-reply with trigger matching (contains, exact, regex, startsWith).
5
+ * Rules stored in ~/.openclaw/zalox/autoreplies.json
6
+ */
7
+ export interface AutoReplyRule {
8
+ id: string;
9
+ name: string;
10
+ trigger: {
11
+ type: 'contains' | 'exact' | 'regex' | 'startsWith';
12
+ pattern: string;
13
+ caseSensitive?: boolean;
14
+ };
15
+ response: string;
16
+ templateId?: string;
17
+ scope: 'all' | 'dm' | 'group';
18
+ groupIds?: string[];
19
+ enabled: boolean;
20
+ priority: number;
21
+ cooldownMs?: number;
22
+ createdAt: string;
23
+ }
24
+ export interface MatchContext {
25
+ threadId: string;
26
+ senderId: string;
27
+ senderName?: string;
28
+ isGroup: boolean;
29
+ }
30
+ /**
31
+ * Add a new auto-reply rule.
32
+ */
33
+ export declare function addRule(rule: Omit<AutoReplyRule, 'id' | 'createdAt'>): AutoReplyRule;
34
+ /**
35
+ * List all auto-reply rules.
36
+ */
37
+ export declare function listRules(): AutoReplyRule[];
38
+ /**
39
+ * Remove a rule by ID.
40
+ */
41
+ export declare function removeRule(id: string): boolean;
42
+ /**
43
+ * Toggle a rule's enabled state.
44
+ */
45
+ export declare function toggleRule(id: string): AutoReplyRule | null;
46
+ /**
47
+ * Match incoming message against all rules.
48
+ * Returns the highest-priority matching rule, respecting scope and cooldown.
49
+ */
50
+ export declare function matchRules(message: string, context: MatchContext): AutoReplyRule | null;
51
+ /**
52
+ * Render auto-reply response with context variables.
53
+ */
54
+ export declare function renderResponse(response: string, context: MatchContext & {
55
+ message: string;
56
+ }): string;
57
+ //# sourceMappingURL=autoreply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoreply.d.ts","sourceRoot":"","sources":["../../src/core/autoreply.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QACP,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,CAAC;QACpD,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AA6BD;;GAEG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAC5C,aAAa,CAYf;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,aAAa,EAAE,CAE3C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAM9C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAO3D;AAsCD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,GACpB,aAAa,GAAG,IAAI,CA0CtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAC1C,MAAM,CAMR"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * ZaloX — Auto-Reply System
3
+ *
4
+ * Rule-based auto-reply with trigger matching (contains, exact, regex, startsWith).
5
+ * Rules stored in ~/.openclaw/zalox/autoreplies.json
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
8
+ import { join } from 'path';
9
+ import { randomUUID } from 'crypto';
10
+ import { getConfigDir, ensureConfigDir } from '../utils/config.js';
11
+ // ── Cooldown tracker (in-memory) ─────────────────────────
12
+ const cooldowns = new Map(); // "ruleId:senderId" → lastReplyTs
13
+ // ── Helpers ──────────────────────────────────────────────
14
+ function getRulesPath() {
15
+ return join(getConfigDir(), 'autoreplies.json');
16
+ }
17
+ function loadRules() {
18
+ const path = getRulesPath();
19
+ if (!existsSync(path))
20
+ return [];
21
+ try {
22
+ return JSON.parse(readFileSync(path, 'utf-8'));
23
+ }
24
+ catch {
25
+ return [];
26
+ }
27
+ }
28
+ function saveRules(rules) {
29
+ ensureConfigDir();
30
+ writeFileSync(getRulesPath(), JSON.stringify(rules, null, 2));
31
+ }
32
+ // ── Core Functions ───────────────────────────────────────
33
+ /**
34
+ * Add a new auto-reply rule.
35
+ */
36
+ export function addRule(rule) {
37
+ const rules = loadRules();
38
+ const newRule = {
39
+ ...rule,
40
+ id: randomUUID().split('-')[0],
41
+ createdAt: new Date().toISOString(),
42
+ };
43
+ rules.push(newRule);
44
+ saveRules(rules);
45
+ return newRule;
46
+ }
47
+ /**
48
+ * List all auto-reply rules.
49
+ */
50
+ export function listRules() {
51
+ return loadRules().sort((a, b) => a.priority - b.priority);
52
+ }
53
+ /**
54
+ * Remove a rule by ID.
55
+ */
56
+ export function removeRule(id) {
57
+ const rules = loadRules();
58
+ const filtered = rules.filter((r) => r.id !== id);
59
+ if (filtered.length === rules.length)
60
+ return false;
61
+ saveRules(filtered);
62
+ return true;
63
+ }
64
+ /**
65
+ * Toggle a rule's enabled state.
66
+ */
67
+ export function toggleRule(id) {
68
+ const rules = loadRules();
69
+ const rule = rules.find((r) => r.id === id);
70
+ if (!rule)
71
+ return null;
72
+ rule.enabled = !rule.enabled;
73
+ saveRules(rules);
74
+ return rule;
75
+ }
76
+ /**
77
+ * Test if a message triggers a rule.
78
+ */
79
+ function testTrigger(trigger, message) {
80
+ const msg = trigger.caseSensitive ? message : message.toLowerCase();
81
+ const pattern = trigger.caseSensitive
82
+ ? trigger.pattern
83
+ : trigger.pattern.toLowerCase();
84
+ switch (trigger.type) {
85
+ case 'contains':
86
+ return msg.includes(pattern);
87
+ case 'exact':
88
+ return msg === pattern;
89
+ case 'startsWith':
90
+ return msg.startsWith(pattern);
91
+ case 'regex': {
92
+ try {
93
+ // Support /pattern/flags format
94
+ const regexMatch = trigger.pattern.match(/^\/(.+)\/([gimsuy]*)$/);
95
+ const regex = regexMatch
96
+ ? new RegExp(regexMatch[1], regexMatch[2])
97
+ : new RegExp(trigger.pattern, trigger.caseSensitive ? '' : 'i');
98
+ return regex.test(message);
99
+ }
100
+ catch {
101
+ return false;
102
+ }
103
+ }
104
+ default:
105
+ return false;
106
+ }
107
+ }
108
+ /**
109
+ * Match incoming message against all rules.
110
+ * Returns the highest-priority matching rule, respecting scope and cooldown.
111
+ */
112
+ export function matchRules(message, context) {
113
+ const rules = listRules(); // sorted by priority
114
+ for (const rule of rules) {
115
+ if (!rule.enabled)
116
+ continue;
117
+ // Check scope
118
+ if (rule.scope === 'dm' && context.isGroup)
119
+ continue;
120
+ if (rule.scope === 'group' && !context.isGroup)
121
+ continue;
122
+ // Check specific group filter
123
+ if (rule.groupIds &&
124
+ rule.groupIds.length > 0 &&
125
+ context.isGroup &&
126
+ !rule.groupIds.includes(context.threadId)) {
127
+ continue;
128
+ }
129
+ // Check cooldown
130
+ if (rule.cooldownMs) {
131
+ const key = `${rule.id}:${context.senderId}`;
132
+ const lastReply = cooldowns.get(key);
133
+ if (lastReply && Date.now() - lastReply < rule.cooldownMs) {
134
+ continue;
135
+ }
136
+ }
137
+ // Test trigger
138
+ if (testTrigger(rule.trigger, message)) {
139
+ // Record cooldown
140
+ if (rule.cooldownMs) {
141
+ const key = `${rule.id}:${context.senderId}`;
142
+ cooldowns.set(key, Date.now());
143
+ }
144
+ return rule;
145
+ }
146
+ }
147
+ return null;
148
+ }
149
+ /**
150
+ * Render auto-reply response with context variables.
151
+ */
152
+ export function renderResponse(response, context) {
153
+ return response
154
+ .replace(/\{\{senderName\}\}/g, context.senderName || context.senderId)
155
+ .replace(/\{\{message\}\}/g, context.message)
156
+ .replace(/\{\{threadId\}\}/g, context.threadId)
157
+ .replace(/\{\{senderId\}\}/g, context.senderId);
158
+ }
159
+ //# sourceMappingURL=autoreply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoreply.js","sourceRoot":"","sources":["../../src/core/autoreply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * ZaloX — Bulk Send System
3
+ *
4
+ * Multi-recipient message sending with rate limiting per license tier.
5
+ * Daily usage tracked in ~/.openclaw/zalox/bulk-usage.json
6
+ */
7
+ import type { API } from 'zca-js';
8
+ export interface BulkSendOptions {
9
+ threadIds: string[];
10
+ message: string;
11
+ templateId?: string;
12
+ templateVars?: Record<string, string>;
13
+ isGroup?: boolean;
14
+ delayMs?: number;
15
+ }
16
+ export interface BulkSendResult {
17
+ total: number;
18
+ sent: number;
19
+ failed: number;
20
+ results: {
21
+ threadId: string;
22
+ ok: boolean;
23
+ error?: string;
24
+ }[];
25
+ }
26
+ interface BulkUsage {
27
+ date: string;
28
+ count: number;
29
+ }
30
+ export declare function getBulkUsage(): BulkUsage;
31
+ /**
32
+ * Send a message to multiple recipients with rate limiting.
33
+ */
34
+ export declare function bulkSend(api: API, options: BulkSendOptions, onProgress?: (sent: number, total: number) => void): Promise<BulkSendResult>;
35
+ export {};
36
+ //# sourceMappingURL=bulk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.d.ts","sourceRoot":"","sources":["../../src/core/bulk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAOlC,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9D;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAYD,wBAAgB,YAAY,IAAI,SAAS,CAexC;AAiBD;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,eAAe,EACxB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACjD,OAAO,CAAC,cAAc,CAAC,CAyEzB"}