@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,313 @@
1
+ /**
2
+ * ZaloX — DM Command Handler
3
+ *
4
+ * When running in daemon mode (standalone, no AI agent),
5
+ * the bot can respond to DM commands from the owner.
6
+ *
7
+ * Commands via Zalo DM:
8
+ * /help — Show available commands
9
+ * /status — Show bot status
10
+ * /rules — List auto-reply rules
11
+ * /rules on|off <id> — Toggle a rule
12
+ * /jobs — List scheduled jobs
13
+ * /jobs on|off <id> — Toggle a job
14
+ * /gs — List group settings
15
+ * /gs <groupId> autoReply on|off — Toggle group auto-reply
16
+ * /gs <groupId> welcome <text> — Set welcome message
17
+ * /send <id> <message> — Send message to someone
18
+ * /send-group <id> <message> — Send to group
19
+ * /broadcast <message> — Send to all friends (bulk)
20
+ * /templates — List templates
21
+ * /template send <name> <id> — Send template
22
+ * /friends — Friend count & recent online
23
+ * /groups — Group list
24
+ */
25
+ import { ThreadType } from 'zca-js';
26
+ import { listRules, toggleRule } from './autoreply.js';
27
+ import { listJobs, toggleJob } from './scheduler.js';
28
+ import { getAllGroupSettings, setGroupSettings, getGroupSettings } from './group-settings.js';
29
+ import { listTemplates, getTemplate, renderTemplate } from './templates.js';
30
+ import { validateLicense, generateDeviceCode } from './license.js';
31
+ import { getDaemonStats } from './daemon.js';
32
+ /**
33
+ * Process a DM message as a bot command.
34
+ * Returns { handled: true, response } if it was a command.
35
+ * Returns { handled: false } if it's not a command (pass to auto-reply or agent).
36
+ */
37
+ export async function handleDmCommand(message, ctx) {
38
+ const text = message.trim();
39
+ // Only handle messages starting with /
40
+ if (!text.startsWith('/')) {
41
+ return { handled: false };
42
+ }
43
+ // Owner check
44
+ if (ctx.ownerId && ctx.senderId !== ctx.ownerId) {
45
+ return { handled: true, response: '🔒 Bạn không có quyền sử dụng lệnh bot.' };
46
+ }
47
+ const parts = text.slice(1).split(/\s+/);
48
+ const cmd = parts[0]?.toLowerCase();
49
+ const args = parts.slice(1);
50
+ switch (cmd) {
51
+ case 'help':
52
+ case 'h':
53
+ return { handled: true, response: helpText() };
54
+ case 'status':
55
+ case 'st':
56
+ return { handled: true, response: statusText() };
57
+ case 'rules':
58
+ case 'r':
59
+ return handleRulesCommand(args);
60
+ case 'jobs':
61
+ case 'j':
62
+ return handleJobsCommand(args);
63
+ case 'gs':
64
+ return handleGroupSettingsCommand(args);
65
+ case 'templates':
66
+ case 'tmpl':
67
+ return handleTemplatesCommand();
68
+ case 'template':
69
+ return await handleTemplateSendCommand(args, ctx);
70
+ case 'send':
71
+ return await handleSendCommand(args, ctx, false);
72
+ case 'send-group':
73
+ case 'sg':
74
+ return await handleSendCommand(args, ctx, true);
75
+ case 'friends':
76
+ return { handled: true, response: '👥 Dùng CLI: zalox friend list\n(Chức năng friend count qua DM sắp có)' };
77
+ case 'groups':
78
+ return { handled: true, response: '👥 Dùng CLI: zalox group list\n(Chức năng group list qua DM sắp có)' };
79
+ default:
80
+ return { handled: true, response: `❓ Lệnh không hợp lệ: /${cmd}\nGõ /help để xem danh sách lệnh.` };
81
+ }
82
+ }
83
+ // ── /help ────────────────────────────────────────────
84
+ function helpText() {
85
+ return `🤖 ZaloX Bot Commands
86
+
87
+ 📊 Thông tin:
88
+ /status — Trạng thái bot
89
+ /rules — Danh sách auto-reply
90
+ /jobs — Danh sách lịch gửi
91
+ /gs — Cài đặt nhóm
92
+ /templates — Danh sách template
93
+
94
+ ⚙️ Quản lý:
95
+ /rules on|off <id> — Bật/tắt rule
96
+ /jobs on|off <id> — Bật/tắt job
97
+ /gs <groupId> autoReply on|off
98
+ /gs <groupId> welcome <text>
99
+
100
+ 📤 Gửi tin:
101
+ /send <userId> <message>
102
+ /send-group <groupId> <message>
103
+ /template send <name> <userId>
104
+
105
+ 💡 Gõ /help để xem lại.`;
106
+ }
107
+ // ── /status ──────────────────────────────────────────
108
+ function statusText() {
109
+ const license = validateLicense();
110
+ const stats = getDaemonStats();
111
+ const device = generateDeviceCode();
112
+ const uptime = formatUptime(stats.startedAt);
113
+ const rules = listRules();
114
+ const jobs = listJobs();
115
+ const activeRules = rules.filter(r => r.enabled).length;
116
+ const activeJobs = jobs.filter(j => j.enabled).length;
117
+ return `📊 ZaloX Status
118
+
119
+ 🔑 License: ${license.tier.toUpperCase()} ${license.valid ? '✅' : '❌'}
120
+ 📱 Device: ${device}
121
+ ⏱️ Uptime: ${uptime}
122
+
123
+ 📨 Tin nhắn nhận: ${stats.messagesReceived}
124
+ 🤖 Auto-reply đã gửi: ${stats.autoRepliesSent}
125
+ 📅 Scheduled đã gửi: ${stats.scheduledSent}
126
+ ❌ Lỗi: ${stats.errors}
127
+
128
+ 📋 Rules: ${activeRules}/${rules.length} active
129
+ 📅 Jobs: ${activeJobs}/${jobs.length} active`;
130
+ }
131
+ // ── /rules ───────────────────────────────────────────
132
+ function handleRulesCommand(args) {
133
+ // /rules on|off <id>
134
+ if (args.length >= 2 && (args[0] === 'on' || args[0] === 'off')) {
135
+ const id = args[1];
136
+ const result = toggleRule(id);
137
+ if (!result) {
138
+ return { handled: true, response: `❌ Rule "${id}" không tồn tại.` };
139
+ }
140
+ return { handled: true, response: `${result.enabled ? '✅' : '⏸️'} Rule "${result.name}" đã ${result.enabled ? 'BẬT' : 'TẮT'}.` };
141
+ }
142
+ // /rules — list
143
+ const rules = listRules();
144
+ if (rules.length === 0) {
145
+ return { handled: true, response: '📋 Chưa có auto-reply rule nào.\nTạo qua CLI: zalox autoreply add ...' };
146
+ }
147
+ const lines = rules.map((r, i) => {
148
+ const status = r.enabled ? '🟢' : '🔴';
149
+ const scope = r.scope === 'all' ? '' : ` [${r.scope}]`;
150
+ return `${status} ${r.id} — "${r.name}" (${r.trigger.type}: "${r.trigger.pattern}")${scope}`;
151
+ });
152
+ return { handled: true, response: `📋 Auto-Reply Rules (${rules.length}):\n\n${lines.join('\n')}\n\nBật/tắt: /rules on|off <id>` };
153
+ }
154
+ // ── /jobs ────────────────────────────────────────────
155
+ function handleJobsCommand(args) {
156
+ // /jobs on|off <id>
157
+ if (args.length >= 2 && (args[0] === 'on' || args[0] === 'off')) {
158
+ const id = args[1];
159
+ const result = toggleJob(id);
160
+ if (!result) {
161
+ return { handled: true, response: `❌ Job "${id}" không tồn tại.` };
162
+ }
163
+ return { handled: true, response: `${result.enabled ? '✅' : '⏸️'} Job ${result.id} đã ${result.enabled ? 'BẬT' : 'TẮT'}.` };
164
+ }
165
+ // /jobs — list
166
+ const jobs = listJobs();
167
+ if (jobs.length === 0) {
168
+ return { handled: true, response: '📅 Chưa có scheduled job nào.\nTạo qua CLI: zalox schedule add ...' };
169
+ }
170
+ const lines = jobs.map(j => {
171
+ const status = j.enabled ? '🟢' : '🔴';
172
+ const type = j.repeat ? `cron: ${j.repeat}` : `at: ${j.scheduleAt}`;
173
+ const msg = j.message.length > 30 ? j.message.substring(0, 30) + '...' : j.message;
174
+ const next = j.nextRunAt ? `\n Next: ${j.nextRunAt}` : '';
175
+ return `${status} ${j.id} → ${j.threadId} (${type})\n "${msg}"${next}`;
176
+ });
177
+ return { handled: true, response: `📅 Scheduled Jobs (${jobs.length}):\n\n${lines.join('\n\n')}\n\nBật/tắt: /jobs on|off <id>` };
178
+ }
179
+ // ── /gs ──────────────────────────────────────────────
180
+ function handleGroupSettingsCommand(args) {
181
+ // /gs — list all
182
+ if (args.length === 0) {
183
+ const all = getAllGroupSettings();
184
+ const groupIds = Object.keys(all);
185
+ if (groupIds.length === 0) {
186
+ return { handled: true, response: '⚙️ Chưa có cài đặt nhóm nào.\nSet qua: /gs <groupId> autoReply on' };
187
+ }
188
+ const lines = groupIds.map(gid => {
189
+ const gs = all[gid];
190
+ const ar = gs.autoReplyEnabled ? '🟢 AR' : '🔴 AR';
191
+ const as = gs.antiSpamEnabled ? '🟢 AS' : '🔴 AS';
192
+ const wm = gs.welcomeMessage ? '✅ WM' : '—';
193
+ return `${gid}: ${ar} | ${as} | ${wm}${gs.notes ? ` | 📝 ${gs.notes}` : ''}`;
194
+ });
195
+ return { handled: true, response: `⚙️ Group Settings (${groupIds.length}):\n\n${lines.join('\n')}\n\nAR=AutoReply, AS=AntiSpam, WM=Welcome` };
196
+ }
197
+ // /gs <groupId> <key> <value>
198
+ if (args.length >= 3) {
199
+ const groupId = args[0];
200
+ const key = args[1].toLowerCase();
201
+ const value = args.slice(2).join(' ');
202
+ const current = getGroupSettings(groupId);
203
+ switch (key) {
204
+ case 'autoreply':
205
+ case 'ar':
206
+ setGroupSettings(groupId, { ...current, autoReplyEnabled: value === 'on' || value === 'true' });
207
+ return { handled: true, response: `✅ Group ${groupId}: auto-reply ${value === 'on' || value === 'true' ? 'BẬT' : 'TẮT'}` };
208
+ case 'welcome':
209
+ case 'wm':
210
+ setGroupSettings(groupId, { ...current, welcomeMessage: value });
211
+ return { handled: true, response: `✅ Group ${groupId}: welcome message set\n"${value}"` };
212
+ case 'antispam':
213
+ case 'as':
214
+ setGroupSettings(groupId, { ...current, antiSpamEnabled: value === 'on' || value === 'true' });
215
+ return { handled: true, response: `✅ Group ${groupId}: anti-spam ${value === 'on' || value === 'true' ? 'BẬT' : 'TẮT'}` };
216
+ case 'notes':
217
+ setGroupSettings(groupId, { ...current, notes: value });
218
+ return { handled: true, response: `✅ Group ${groupId}: notes updated` };
219
+ default:
220
+ return { handled: true, response: `❓ Key không hợp lệ: ${key}\nCó thể dùng: autoReply, welcome, antiSpam, notes` };
221
+ }
222
+ }
223
+ // /gs <groupId> — show one group
224
+ if (args.length === 1) {
225
+ const groupId = args[0];
226
+ const gs = getGroupSettings(groupId);
227
+ return {
228
+ handled: true,
229
+ response: `⚙️ Group ${groupId}:
230
+ Auto-reply: ${gs.autoReplyEnabled ? '🟢 ON' : '🔴 OFF'}
231
+ Anti-spam: ${gs.antiSpamEnabled ? '🟢 ON' : '🔴 OFF'}
232
+ Welcome: ${gs.welcomeMessage || '(không set)'}
233
+ Notes: ${gs.notes || '(không có)'}
234
+
235
+ Set: /gs ${groupId} autoReply on|off`,
236
+ };
237
+ }
238
+ return { handled: true, response: '⚙️ Usage: /gs [groupId] [key] [value]' };
239
+ }
240
+ // ── /templates ───────────────────────────────────────
241
+ function handleTemplatesCommand() {
242
+ const templates = listTemplates();
243
+ if (templates.length === 0) {
244
+ return { handled: true, response: '📄 Chưa có template nào.\nTạo qua CLI: zalox template create ...' };
245
+ }
246
+ const lines = templates.map(t => {
247
+ const vars = t.variables.length > 0 ? ` (vars: ${t.variables.join(', ')})` : '';
248
+ const preview = t.content.length > 40 ? t.content.substring(0, 40) + '...' : t.content;
249
+ return `📄 ${t.name}${vars}\n "${preview}"`;
250
+ });
251
+ return { handled: true, response: `📄 Templates (${templates.length}):\n\n${lines.join('\n\n')}\n\nGửi: /template send <name> <threadId>` };
252
+ }
253
+ // ── /template send ───────────────────────────────────
254
+ async function handleTemplateSendCommand(args, ctx) {
255
+ // /template send <name> <threadId> [--var key=val ...]
256
+ if (args.length < 3 || args[0] !== 'send') {
257
+ return { handled: true, response: '📄 Usage: /template send <name> <threadId> [key=val ...]' };
258
+ }
259
+ const name = args[1];
260
+ const threadId = args[2];
261
+ const template = getTemplate(name);
262
+ if (!template) {
263
+ return { handled: true, response: `❌ Template "${name}" không tồn tại.` };
264
+ }
265
+ // Parse vars from remaining args (key=val format)
266
+ const vars = {};
267
+ for (let i = 3; i < args.length; i++) {
268
+ const [k, ...v] = args[i].split('=');
269
+ if (k && v.length > 0) {
270
+ vars[k] = v.join('=');
271
+ }
272
+ }
273
+ const rendered = renderTemplate(template, vars);
274
+ try {
275
+ await ctx.api.sendMessage(rendered, threadId, ThreadType.User);
276
+ return { handled: true, response: `✅ Template "${name}" đã gửi tới ${threadId}` };
277
+ }
278
+ catch (err) {
279
+ return { handled: true, response: `❌ Gửi thất bại: ${err.message}` };
280
+ }
281
+ }
282
+ // ── /send ────────────────────────────────────────────
283
+ async function handleSendCommand(args, ctx, isGroup) {
284
+ if (args.length < 2) {
285
+ return { handled: true, response: `📤 Usage: /${isGroup ? 'send-group' : 'send'} <threadId> <message>` };
286
+ }
287
+ const threadId = args[0];
288
+ const message = args.slice(1).join(' ');
289
+ const type = isGroup ? ThreadType.Group : ThreadType.User;
290
+ try {
291
+ await ctx.api.sendMessage(message, threadId, type);
292
+ return { handled: true, response: `✅ Đã gửi tới ${threadId}: "${message.substring(0, 50)}${message.length > 50 ? '...' : ''}"` };
293
+ }
294
+ catch (err) {
295
+ return { handled: true, response: `❌ Gửi thất bại: ${err.message}` };
296
+ }
297
+ }
298
+ // ── Helpers ──────────────────────────────────────────
299
+ function formatUptime(startedAt) {
300
+ const ms = Date.now() - new Date(startedAt).getTime();
301
+ const secs = Math.floor(ms / 1000);
302
+ const mins = Math.floor(secs / 60);
303
+ const hours = Math.floor(mins / 60);
304
+ const days = Math.floor(hours / 24);
305
+ if (days > 0)
306
+ return `${days}d ${hours % 24}h ${mins % 60}m`;
307
+ if (hours > 0)
308
+ return `${hours}h ${mins % 60}m`;
309
+ if (mins > 0)
310
+ return `${mins}m ${secs % 60}s`;
311
+ return `${secs}s`;
312
+ }
313
+ //# sourceMappingURL=dm-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dm-commands.js","sourceRoot":"","sources":["../../src/core/dm-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ZaloX — Export System
3
+ *
4
+ * Export friends, groups, and conversations to JSON or CSV.
5
+ */
6
+ import type { API } from 'zca-js';
7
+ export type ExportFormat = 'json' | 'csv';
8
+ /**
9
+ * Export friends list.
10
+ */
11
+ export declare function exportFriends(api: API, format: ExportFormat): Promise<string>;
12
+ /**
13
+ * Export groups list.
14
+ */
15
+ export declare function exportGroups(api: API, format: ExportFormat): Promise<string>;
16
+ /**
17
+ * Export recent conversations.
18
+ */
19
+ export declare function exportConversations(api: API, format: ExportFormat, limit?: number): Promise<string>;
20
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/core/export.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAIlC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC;AA6B1C;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,YAAY,EACpB,KAAK,GAAE,MAAY,GAClB,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * ZaloX — Export System
3
+ *
4
+ * Export friends, groups, and conversations to JSON or CSV.
5
+ */
6
+ // ── Helpers ──────────────────────────────────────────────
7
+ function escapeCsvField(value) {
8
+ if (value.includes(',') || value.includes('"') || value.includes('\n')) {
9
+ return `"${value.replace(/"/g, '""')}"`;
10
+ }
11
+ return value;
12
+ }
13
+ function arrayToCsv(headers, rows) {
14
+ const lines = [];
15
+ lines.push(headers.map(escapeCsvField).join(','));
16
+ for (const row of rows) {
17
+ const values = headers.map((h) => {
18
+ const val = row[h];
19
+ if (val === null || val === undefined)
20
+ return '';
21
+ return escapeCsvField(String(val));
22
+ });
23
+ lines.push(values.join(','));
24
+ }
25
+ return lines.join('\n');
26
+ }
27
+ // ── Core Functions ───────────────────────────────────────
28
+ /**
29
+ * Export friends list.
30
+ */
31
+ export async function exportFriends(api, format) {
32
+ const friends = await api.getAllFriends();
33
+ const data = friends.map((f) => ({
34
+ userId: f.userId || '',
35
+ displayName: f.displayName || '',
36
+ zaloName: f.zaloName || '',
37
+ phoneNumber: f.phoneNumber || '',
38
+ gender: f.gender !== undefined ? (f.gender === 0 ? 'Male' : 'Female') : '',
39
+ isActive: f.isActive ? 'Yes' : 'No',
40
+ avatar: f.avatar || '',
41
+ }));
42
+ if (format === 'csv') {
43
+ return arrayToCsv(['userId', 'displayName', 'zaloName', 'phoneNumber', 'gender', 'isActive', 'avatar'], data);
44
+ }
45
+ return JSON.stringify(data, null, 2);
46
+ }
47
+ /**
48
+ * Export groups list.
49
+ */
50
+ export async function exportGroups(api, format) {
51
+ const result = await api.getAllGroups();
52
+ const groupIds = Object.keys(result.gridVerMap || {});
53
+ if (groupIds.length === 0) {
54
+ return format === 'csv' ? 'groupId,name,totalMember,maxMember,creatorId' : '[]';
55
+ }
56
+ const groupInfo = await api.getGroupInfo(groupIds);
57
+ const groups = Object.values(groupInfo.gridInfoMap || {});
58
+ const data = groups.map((g) => ({
59
+ groupId: g.groupId || '',
60
+ name: g.name || '',
61
+ totalMember: g.totalMember ?? 0,
62
+ maxMember: g.maxMember ?? 0,
63
+ creatorId: g.creatorId || '',
64
+ desc: g.desc || '',
65
+ createdTime: g.createdTime ? new Date(g.createdTime).toISOString() : '',
66
+ }));
67
+ if (format === 'csv') {
68
+ return arrayToCsv(['groupId', 'name', 'totalMember', 'maxMember', 'creatorId', 'desc', 'createdTime'], data);
69
+ }
70
+ return JSON.stringify(data, null, 2);
71
+ }
72
+ /**
73
+ * Export recent conversations.
74
+ */
75
+ export async function exportConversations(api, format, limit = 100) {
76
+ const result = await api.getRecentMessages?.(limit) ||
77
+ await api.getConversations?.(limit) || [];
78
+ const conversations = (Array.isArray(result) ? result : result?.data || []);
79
+ const data = conversations.map((c) => ({
80
+ threadId: c.threadId || c.idTo || '',
81
+ lastMessage: typeof c.content === 'string' ? c.content : JSON.stringify(c.content || ''),
82
+ timestamp: c.ts ? new Date(parseInt(c.ts)).toISOString() : '',
83
+ type: c.type === 1 ? 'group' : 'user',
84
+ senderId: c.uidFrom || '',
85
+ senderName: c.dName || '',
86
+ }));
87
+ if (format === 'csv') {
88
+ return arrayToCsv(['threadId', 'lastMessage', 'timestamp', 'type', 'senderId', 'senderName'], data);
89
+ }
90
+ return JSON.stringify(data, null, 2);
91
+ }
92
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/core/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * ZaloX — Feature Gate Middleware
3
+ *
4
+ * Wrap CLI commands with license checks.
5
+ * Shows friendly upgrade message when feature is locked.
6
+ */
7
+ import { type FeatureName, type GateResult } from '../core/license.js';
8
+ /**
9
+ * Gate a CLI action behind a feature flag.
10
+ * If feature is not allowed, prints error and exits.
11
+ *
12
+ * Usage:
13
+ * .action(gate('restApi', (opts) => { ... }))
14
+ */
15
+ export declare function gate<T extends (...args: unknown[]) => unknown>(feature: FeatureName, action: T): T;
16
+ /**
17
+ * Gate with a numeric limit check.
18
+ *
19
+ * Usage:
20
+ * const gate = gateLimit('maxProfiles', currentProfileCount);
21
+ * if (!gate.allowed) { ... }
22
+ */
23
+ export declare function gateLimit(feature: FeatureName, currentCount: number): GateResult;
24
+ /**
25
+ * Inline gate check — returns boolean, prints error if blocked.
26
+ *
27
+ * Usage:
28
+ * if (!gateCheck('sendImages')) return;
29
+ */
30
+ export declare function gateCheck(feature: FeatureName): boolean;
31
+ /**
32
+ * Silent gate check — returns boolean without printing.
33
+ */
34
+ export declare function isFeatureEnabled(feature: FeatureName): boolean;
35
+ /**
36
+ * Get current tier name.
37
+ */
38
+ export declare function getCurrentTier(): string;
39
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/core/gate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAC5D,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,CAAC,GACR,CAAC,CASH;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,UAAU,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAOvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * ZaloX — Feature Gate Middleware
3
+ *
4
+ * Wrap CLI commands with license checks.
5
+ * Shows friendly upgrade message when feature is locked.
6
+ */
7
+ import chalk from 'chalk';
8
+ import { checkFeature, checkLimit, validateLicense, } from '../core/license.js';
9
+ /**
10
+ * Gate a CLI action behind a feature flag.
11
+ * If feature is not allowed, prints error and exits.
12
+ *
13
+ * Usage:
14
+ * .action(gate('restApi', (opts) => { ... }))
15
+ */
16
+ export function gate(feature, action) {
17
+ return ((...args) => {
18
+ const result = checkFeature(feature);
19
+ if (!result.allowed) {
20
+ printGateError(result);
21
+ process.exit(1);
22
+ }
23
+ return action(...args);
24
+ });
25
+ }
26
+ /**
27
+ * Gate with a numeric limit check.
28
+ *
29
+ * Usage:
30
+ * const gate = gateLimit('maxProfiles', currentProfileCount);
31
+ * if (!gate.allowed) { ... }
32
+ */
33
+ export function gateLimit(feature, currentCount) {
34
+ return checkLimit(feature, currentCount);
35
+ }
36
+ /**
37
+ * Inline gate check — returns boolean, prints error if blocked.
38
+ *
39
+ * Usage:
40
+ * if (!gateCheck('sendImages')) return;
41
+ */
42
+ export function gateCheck(feature) {
43
+ const result = checkFeature(feature);
44
+ if (!result.allowed) {
45
+ printGateError(result);
46
+ return false;
47
+ }
48
+ return true;
49
+ }
50
+ /**
51
+ * Silent gate check — returns boolean without printing.
52
+ */
53
+ export function isFeatureEnabled(feature) {
54
+ return checkFeature(feature).allowed;
55
+ }
56
+ /**
57
+ * Get current tier name.
58
+ */
59
+ export function getCurrentTier() {
60
+ return validateLicense().tier;
61
+ }
62
+ // ── Error display ─────────────────────────────────────
63
+ function printGateError(result) {
64
+ console.log();
65
+ console.log(chalk.red(` 🔒 Feature locked: ${result.feature}`));
66
+ console.log(chalk.gray(` ${result.reason}`));
67
+ console.log();
68
+ if (result.upgradeHint) {
69
+ console.log(chalk.yellow(` ⚡ ${result.upgradeHint}`));
70
+ }
71
+ console.log(chalk.gray(' See all features: zalox license features'));
72
+ console.log(chalk.gray(' Buy license: https://zalox.shrimpfarm.vn/pricing'));
73
+ console.log();
74
+ }
75
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/core/gate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,eAAe,GAGhB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAClB,OAAoB,EACpB,MAAS;IAET,OAAO,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACzB,CAAC,CAAM,CAAC;AACV,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,OAAoB,EAAE,YAAoB;IAClE,OAAO,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,OAAoB;IAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACnD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,eAAe,EAAE,CAAC,IAAI,CAAC;AAChC,CAAC;AAED,yDAAyD;AAEzD,SAAS,cAAc,CAAC,MAAkB;IACxC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ZaloX — Group Settings
3
+ *
4
+ * Per-group configuration for auto-reply, welcome messages, anti-spam, etc.
5
+ * Settings stored in ~/.openclaw/zalox/group-settings.json
6
+ */
7
+ export interface GroupSettingsEntry {
8
+ autoReplyEnabled: boolean;
9
+ welcomeMessage?: string;
10
+ antiSpamEnabled: boolean;
11
+ antiSpamKeywords?: string[];
12
+ scheduledMessages?: string[];
13
+ customRules?: string[];
14
+ notes?: string;
15
+ }
16
+ export interface GroupSettings {
17
+ [groupId: string]: GroupSettingsEntry;
18
+ }
19
+ /**
20
+ * Get settings for a specific group.
21
+ */
22
+ export declare function getGroupSettings(groupId: string): GroupSettingsEntry;
23
+ /**
24
+ * Update settings for a specific group.
25
+ */
26
+ export declare function setGroupSettings(groupId: string, update: Partial<GroupSettingsEntry>): GroupSettingsEntry;
27
+ /**
28
+ * Get all group settings.
29
+ */
30
+ export declare function getAllGroupSettings(): GroupSettings;
31
+ /**
32
+ * Delete settings for a specific group.
33
+ */
34
+ export declare function deleteGroupSettings(groupId: string): boolean;
35
+ //# sourceMappingURL=group-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-settings.d.ts","sourceRoot":"","sources":["../../src/core/group-settings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAAC;CACvC;AAyBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAQpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAClC,kBAAkB,CASpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAM5D"}