@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,229 @@
1
+ import chalk from 'chalk';
2
+ import Table from 'cli-table3';
3
+ import { getApi } from '../../core/client.js';
4
+ import { logger } from '../../utils/logger.js';
5
+ import { ThreadType } from 'zca-js';
6
+ // ── Register command ────────────────────────────────────
7
+ export function convCommands(program) {
8
+ const conv = program.command('conv').description('Conversation management');
9
+ conv
10
+ .command('list')
11
+ .description('List recent conversations (pinned + unread)')
12
+ .option('-l, --limit <n>', 'Number of conversations', '20')
13
+ .option('-j, --json', 'Output as JSON')
14
+ .action(async (opts) => {
15
+ try {
16
+ const api = await getApi();
17
+ const limit = parseInt(opts.limit) || 20;
18
+ // Gather conversation data from available APIs
19
+ const [pinned, unread, groups] = await Promise.allSettled([
20
+ api.getPinConversations(),
21
+ api.getUnreadMark(),
22
+ api.getAllGroups(),
23
+ ]);
24
+ const conversations = [];
25
+ // Pinned conversations
26
+ if (pinned.status === 'fulfilled' && pinned.value?.conversations) {
27
+ for (const id of pinned.value.conversations) {
28
+ conversations.push({
29
+ id,
30
+ type: 'user',
31
+ pinned: true,
32
+ unread: false,
33
+ });
34
+ }
35
+ }
36
+ // Unread user conversations
37
+ if (unread.status === 'fulfilled' && unread.value?.data) {
38
+ for (const item of unread.value.data.convsUser || []) {
39
+ const existing = conversations.find((c) => String(c.id) === String(item.id));
40
+ if (existing) {
41
+ existing.unread = true;
42
+ existing.lastMsgId = item.cliMsgId;
43
+ existing.timestamp = item.ts;
44
+ }
45
+ else {
46
+ conversations.push({
47
+ id: String(item.id),
48
+ type: 'user',
49
+ pinned: false,
50
+ unread: true,
51
+ lastMsgId: item.cliMsgId,
52
+ timestamp: item.ts,
53
+ });
54
+ }
55
+ }
56
+ // Unread group conversations
57
+ for (const item of unread.value.data.convsGroup || []) {
58
+ const existing = conversations.find((c) => String(c.id) === String(item.id));
59
+ if (existing) {
60
+ existing.unread = true;
61
+ existing.type = 'group';
62
+ existing.lastMsgId = item.cliMsgId;
63
+ existing.timestamp = item.ts;
64
+ }
65
+ else {
66
+ conversations.push({
67
+ id: String(item.id),
68
+ type: 'group',
69
+ pinned: false,
70
+ unread: true,
71
+ lastMsgId: item.cliMsgId,
72
+ timestamp: item.ts,
73
+ });
74
+ }
75
+ }
76
+ }
77
+ // Add known groups
78
+ if (groups.status === 'fulfilled' && groups.value?.gridVerMap) {
79
+ for (const groupId of Object.keys(groups.value.gridVerMap)) {
80
+ if (!conversations.find((c) => c.id === groupId)) {
81
+ conversations.push({
82
+ id: groupId,
83
+ type: 'group',
84
+ pinned: false,
85
+ unread: false,
86
+ });
87
+ }
88
+ }
89
+ }
90
+ // Sort: pinned first, then unread, then by timestamp
91
+ conversations.sort((a, b) => {
92
+ if (a.pinned !== b.pinned)
93
+ return a.pinned ? -1 : 1;
94
+ if (a.unread !== b.unread)
95
+ return a.unread ? -1 : 1;
96
+ return (b.timestamp || 0) - (a.timestamp || 0);
97
+ });
98
+ const limited = conversations.slice(0, limit);
99
+ if (opts.json) {
100
+ console.log(JSON.stringify(limited, null, 2));
101
+ return;
102
+ }
103
+ const table = new Table({
104
+ head: ['#', 'Thread ID', 'Type', 'Status'].map((h) => chalk.cyan.bold(h)),
105
+ style: { head: [], border: [] },
106
+ });
107
+ limited.forEach((c, i) => {
108
+ const badges = [];
109
+ if (c.pinned)
110
+ badges.push(chalk.yellow('📌'));
111
+ if (c.unread)
112
+ badges.push(chalk.red('🔴'));
113
+ const typeLabel = c.type === 'group' ? chalk.blue('group') : chalk.green('user');
114
+ table.push([
115
+ String(i + 1),
116
+ c.id,
117
+ typeLabel,
118
+ badges.join(' ') || chalk.dim('—'),
119
+ ]);
120
+ });
121
+ console.log(`\n${table.toString()}`);
122
+ logger.info(`Showing ${limited.length} of ${conversations.length} conversations`);
123
+ console.log(chalk.dim('\nTip: Use "zalox conv history <threadId>" to see messages\n'));
124
+ }
125
+ catch (err) {
126
+ logger.error(`Failed to list conversations: ${err.message}`);
127
+ process.exit(1);
128
+ }
129
+ });
130
+ conv
131
+ .command('history <threadId>')
132
+ .description('Get message history for a conversation')
133
+ .option('-l, --limit <n>', 'Number of messages to fetch', '20')
134
+ .option('-g, --group', 'Group conversation')
135
+ .option('-j, --json', 'Output as JSON')
136
+ .action(async (threadId, opts) => {
137
+ try {
138
+ const api = await getApi();
139
+ const limit = parseInt(opts.limit) || 20;
140
+ const threadType = opts.group ? ThreadType.Group : ThreadType.User;
141
+ // Use the listener to request old messages
142
+ const listener = api.listener;
143
+ const messages = [];
144
+ let resolved = false;
145
+ const messagePromise = new Promise((resolve) => {
146
+ const timeout = setTimeout(() => {
147
+ if (!resolved) {
148
+ resolved = true;
149
+ resolve();
150
+ }
151
+ }, 10000);
152
+ listener.on('old_messages', (msgs, type) => {
153
+ if (type === threadType) {
154
+ for (const msg of msgs) {
155
+ if (msg.threadId === threadId) {
156
+ messages.push(msg);
157
+ }
158
+ }
159
+ // Give a moment for all chunks to arrive
160
+ setTimeout(() => {
161
+ if (!resolved) {
162
+ resolved = true;
163
+ clearTimeout(timeout);
164
+ resolve();
165
+ }
166
+ }, 2000);
167
+ }
168
+ });
169
+ listener.on('connected', () => {
170
+ // Request old messages once connected
171
+ listener.requestOldMessages(threadType);
172
+ });
173
+ listener.on('error', (err) => {
174
+ logger.debug(`Listener error during history fetch: ${err}`);
175
+ if (!resolved) {
176
+ resolved = true;
177
+ clearTimeout(timeout);
178
+ resolve();
179
+ }
180
+ });
181
+ });
182
+ // Start listener
183
+ listener.start();
184
+ logger.info(`Fetching history for ${threadId}...`);
185
+ await messagePromise;
186
+ listener.stop();
187
+ // Filter and limit
188
+ const filtered = messages.slice(-limit);
189
+ if (opts.json) {
190
+ console.log(JSON.stringify(filtered.map((m) => ({
191
+ msgId: m.data.msgId,
192
+ from: m.data.uidFrom,
193
+ fromName: m.data.dName || null,
194
+ content: typeof m.data.content === 'string' ? m.data.content : m.data.content,
195
+ timestamp: parseInt(m.data.ts) || null,
196
+ isSelf: m.isSelf,
197
+ })), null, 2));
198
+ return;
199
+ }
200
+ if (filtered.length === 0) {
201
+ logger.warn('No messages found. The thread may be empty or the ID may be incorrect.');
202
+ logger.info('Tip: For group conversations, add --group flag');
203
+ return;
204
+ }
205
+ console.log();
206
+ console.log(chalk.bold.cyan(`💬 Message History — ${threadId}`));
207
+ console.log(chalk.gray('─'.repeat(50)));
208
+ for (const msg of filtered) {
209
+ const ts = msg.data.ts
210
+ ? new Date(parseInt(msg.data.ts)).toLocaleString('vi-VN')
211
+ : '—';
212
+ const sender = msg.data.dName || msg.data.uidFrom;
213
+ const content = typeof msg.data.content === 'string'
214
+ ? msg.data.content
215
+ : JSON.stringify(msg.data.content);
216
+ const selfTag = msg.isSelf ? chalk.dim(' (you)') : '';
217
+ console.log(`${chalk.gray(ts)} ${chalk.green.bold(sender)}${selfTag}: ${content}`);
218
+ }
219
+ console.log(chalk.gray('─'.repeat(50)));
220
+ logger.info(`${filtered.length} messages shown`);
221
+ console.log();
222
+ }
223
+ catch (err) {
224
+ logger.error(`Failed to get history: ${err.message}`);
225
+ process.exit(1);
226
+ }
227
+ });
228
+ }
229
+ //# sourceMappingURL=conv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conv.js","sourceRoot":"","sources":["../../../src/cli/commands/conv.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,2DAA2D;AAE3D,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE5E,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,IAAI,CAAC;SAC1D,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAEzC,+CAA+C;YAC/C,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;gBACxD,GAAG,CAAC,mBAAmB,EAAE;gBACzB,GAAG,CAAC,aAAa,EAAE;gBACnB,GAAG,CAAC,YAAY,EAAE;aACnB,CAAC,CAAC;YAEH,MAAM,aAAa,GAOd,EAAE,CAAC;YAER,uBAAuB;YACvB,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC;gBACjE,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;oBAC5C,aAAa,CAAC,IAAI,CAAC;wBACjB,EAAE;wBACF,IAAI,EAAE,MAAM;wBACZ,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,KAAK;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,4BAA4B;YAC5B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;gBACxD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;oBACrD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC7E,IAAI,QAAQ,EAAE,CAAC;wBACb,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;wBACvB,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;wBACnC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACN,aAAa,CAAC,IAAI,CAAC;4BACjB,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;4BACnB,IAAI,EAAE,MAAM;4BACZ,MAAM,EAAE,KAAK;4BACb,MAAM,EAAE,IAAI;4BACZ,SAAS,EAAE,IAAI,CAAC,QAAQ;4BACxB,SAAS,EAAE,IAAI,CAAC,EAAE;yBACnB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,6BAA6B;gBAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;oBACtD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC7E,IAAI,QAAQ,EAAE,CAAC;wBACb,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;wBACvB,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC;wBACxB,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;wBACnC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACN,aAAa,CAAC,IAAI,CAAC;4BACjB,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;4BACnB,IAAI,EAAE,OAAO;4BACb,MAAM,EAAE,KAAK;4BACb,MAAM,EAAE,IAAI;4BACZ,SAAS,EAAE,IAAI,CAAC,QAAQ;4BACxB,SAAS,EAAE,IAAI,CAAC,EAAE;yBACnB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC;gBAC9D,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC3D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;wBACjD,aAAa,CAAC,IAAI,CAAC;4BACjB,EAAE,EAAE,OAAO;4BACX,IAAI,EAAE,OAAO;4BACb,MAAM,EAAE,KAAK;4BACb,MAAM,EAAE,KAAK;yBACd,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,qDAAqD;YACrD,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;oBAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;oBAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAE9C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;gBACtB,IAAI,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACzE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;aAChC,CAAC,CAAC;YAEH,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAa,EAAE,CAAC;gBAC5B,IAAI,CAAC,CAAC,MAAM;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9C,IAAI,CAAC,CAAC,MAAM;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC3C,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAEjF,KAAK,CAAC,IAAI,CAAC;oBACT,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,EAAE;oBACJ,SAAS;oBACT,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;iBACnC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,OAAO,aAAa,CAAC,MAAM,gBAAgB,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;QACzF,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,iBAAiB,EAAE,6BAA6B,EAAE,IAAI,CAAC;SAC9D,MAAM,CAAC,aAAa,EAAE,oBAAoB,CAAC;SAC3C,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,IAAI,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;YAEnE,2CAA2C;YAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YAE9B,MAAM,QAAQ,GAAU,EAAE,CAAC;YAC3B,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,MAAM,cAAc,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACnD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,QAAQ,GAAG,IAAI,CAAC;wBAChB,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,EAAE,KAAK,CAAC,CAAC;gBAEV,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;oBACzC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;wBACxB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;4BACvB,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gCAC9B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4BACrB,CAAC;wBACH,CAAC;wBACD,yCAAyC;wBACzC,UAAU,CAAC,GAAG,EAAE;4BACd,IAAI,CAAC,QAAQ,EAAE,CAAC;gCACd,QAAQ,GAAG,IAAI,CAAC;gCAChB,YAAY,CAAC,OAAO,CAAC,CAAC;gCACtB,OAAO,EAAE,CAAC;4BACZ,CAAC;wBACH,CAAC,EAAE,IAAI,CAAC,CAAC;oBACX,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;oBAC5B,sCAAsC;oBACtC,QAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;gBAC1C,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC3B,MAAM,CAAC,KAAK,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;oBAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,QAAQ,GAAG,IAAI,CAAC;wBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,iBAAiB;YACjB,QAAQ,CAAC,KAAK,EAAE,CAAC;YAEjB,MAAM,CAAC,IAAI,CAAC,wBAAwB,QAAQ,KAAK,CAAC,CAAC;YAEnD,MAAM,cAAc,CAAC;YACrB,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEhB,mBAAmB;YACnB,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;YAExC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK;oBACnB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;oBACpB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI;oBAC9B,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO;oBAC7E,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI;oBACtC,MAAM,EAAE,CAAC,CAAC,MAAM;iBACjB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACf,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;gBACtF,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAExC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE;oBACpB,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC;oBACzD,CAAC,CAAC,GAAG,CAAC;gBACR,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBAClD,MAAM,OAAO,GACX,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ;oBAClC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO;oBAClB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEtD,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO,KAAK,OAAO,EAAE,CACvE,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,iBAAiB,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,0BAA0B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * ZaloX CLI — Daemon Command
3
+ *
4
+ * `zalox daemon` starts the all-in-one background service:
5
+ * - Message listener
6
+ * - Auto-reply engine
7
+ * - Scheduler
8
+ *
9
+ * Runs standalone — no AI agent required.
10
+ */
11
+ import type { Command } from 'commander';
12
+ export declare function daemonCommands(program: Command): void;
13
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+FrD"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * ZaloX CLI — Daemon Command
3
+ *
4
+ * `zalox daemon` starts the all-in-one background service:
5
+ * - Message listener
6
+ * - Auto-reply engine
7
+ * - Scheduler
8
+ *
9
+ * Runs standalone — no AI agent required.
10
+ */
11
+ import chalk from 'chalk';
12
+ import { startDaemon } from '../../core/daemon.js';
13
+ export function daemonCommands(program) {
14
+ program
15
+ .command('daemon')
16
+ .description('🤖 Start ZaloX daemon (listener + auto-reply + scheduler)')
17
+ .option('--no-auto-reply', 'Disable auto-reply engine')
18
+ .option('--no-scheduler', 'Disable scheduler')
19
+ .option('-v, --verbose', 'Verbose output')
20
+ .option('--port <port>', 'Also start REST API on this port')
21
+ .option('--owner <zaloId>', 'Owner Zalo ID (only owner can use DM commands)')
22
+ .action(async (opts) => {
23
+ try {
24
+ await startDaemon({
25
+ autoReply: opts.autoReply !== false,
26
+ scheduler: opts.scheduler !== false,
27
+ verbose: opts.verbose || false,
28
+ port: opts.port ? parseInt(opts.port) : 0,
29
+ ownerId: opts.owner || undefined,
30
+ });
31
+ }
32
+ catch (err) {
33
+ console.error(chalk.red(`\n ✗ Daemon failed: ${err.message}`));
34
+ process.exit(1);
35
+ }
36
+ });
37
+ program
38
+ .command('status')
39
+ .description('📊 Show daemon/license status')
40
+ .action(async () => {
41
+ // Import dynamically to avoid loading everything for a status check
42
+ const { validateLicense, generateDeviceCode } = await import('../../core/license.js');
43
+ const { listRules } = await import('../../core/autoreply.js');
44
+ const { listJobs } = await import('../../core/scheduler.js');
45
+ const { listTemplates } = await import('../../core/templates.js');
46
+ const status = validateLicense();
47
+ const rules = listRules();
48
+ const jobs = listJobs();
49
+ const templates = listTemplates();
50
+ const activeJobs = jobs.filter(j => j.enabled);
51
+ const activeRules = rules.filter(r => r.enabled);
52
+ console.log();
53
+ console.log(chalk.bold(' 📊 ZaloX Status'));
54
+ console.log(chalk.gray(' ─────────────────────────────'));
55
+ // License
56
+ const tierColors = {
57
+ free: chalk.gray,
58
+ starter: chalk.cyan,
59
+ pro: chalk.yellow,
60
+ team: chalk.magenta,
61
+ };
62
+ const color = tierColors[status.tier] || chalk.white;
63
+ console.log(` License: ${color(status.tier.toUpperCase())} ${status.valid ? chalk.green('✓') : chalk.red('✗')}`);
64
+ console.log(` Device: ${chalk.gray(generateDeviceCode())}`);
65
+ // Data
66
+ console.log();
67
+ console.log(` Templates: ${chalk.cyan(String(templates.length))}`);
68
+ console.log(` Auto-rules: ${chalk.cyan(String(activeRules.length))}/${rules.length} active`);
69
+ console.log(` Sched. jobs: ${chalk.cyan(String(activeJobs.length))}/${jobs.length} active`);
70
+ // Next scheduled
71
+ if (activeJobs.length > 0) {
72
+ const next = activeJobs
73
+ .filter(j => j.nextRunAt)
74
+ .sort((a, b) => new Date(a.nextRunAt).getTime() - new Date(b.nextRunAt).getTime());
75
+ if (next.length > 0) {
76
+ const nextJob = next[0];
77
+ console.log(` Next send: ${chalk.yellow(nextJob.nextRunAt)} → ${nextJob.threadId}`);
78
+ }
79
+ }
80
+ // Features overview
81
+ console.log();
82
+ console.log(chalk.bold(' 🔓 Features'));
83
+ console.log(chalk.gray(' ─────────────────────────────'));
84
+ const feats = [
85
+ ['Listener', true],
86
+ ['Auto-restart', status.features.listenerAutoRestart],
87
+ ['Send Images', status.features.sendImages],
88
+ ['Send Files', status.features.sendFiles],
89
+ ['Auto-reply', status.features.autoReply],
90
+ ['Templates', status.features.templates],
91
+ ['Scheduling', status.features.scheduling],
92
+ ['REST API', status.features.restApi],
93
+ ['Bulk Send', status.features.bulkSend],
94
+ ['Export', status.features.export],
95
+ ];
96
+ for (const [name, enabled] of feats) {
97
+ console.log(` ${enabled ? chalk.green('✓') : chalk.red('✗')} ${name}`);
98
+ }
99
+ console.log();
100
+ });
101
+ }
102
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * ZaloX CLI — Export Commands
3
+ *
4
+ * zalox export friends — Export friends to JSON/CSV
5
+ * zalox export groups — Export groups to JSON/CSV
6
+ * zalox export conversations — Export conversations to JSON/CSV
7
+ */
8
+ import type { Command } from 'commander';
9
+ export declare function exportCommands(program: Command): void;
10
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyFrD"}
@@ -0,0 +1,98 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { writeFileSync } from 'fs';
4
+ import { gateCheck } from '../../core/gate.js';
5
+ import { exportFriends, exportGroups, exportConversations, } from '../../core/export.js';
6
+ import { getApi } from '../../core/client.js';
7
+ import { printSuccess, printError } from '../output.js';
8
+ export function exportCommands(program) {
9
+ const exp = program
10
+ .command('export')
11
+ .description('Export data to JSON or CSV');
12
+ // ── export friends ────────────────────────────────────
13
+ exp
14
+ .command('friends')
15
+ .description('Export friends list')
16
+ .option('-f, --format <format>', 'Output format: json or csv', 'json')
17
+ .option('-o, --output <path>', 'Output file path')
18
+ .action(async (opts) => {
19
+ if (!gateCheck('export'))
20
+ return;
21
+ const spinner = ora('Exporting friends…').start();
22
+ try {
23
+ const api = await getApi();
24
+ const data = await exportFriends(api, opts.format);
25
+ spinner.stop();
26
+ if (opts.output) {
27
+ writeFileSync(opts.output, data);
28
+ printSuccess(`Friends exported to ${chalk.bold(opts.output)}`);
29
+ }
30
+ else {
31
+ console.log(data);
32
+ }
33
+ }
34
+ catch (err) {
35
+ spinner.fail('Failed to export friends');
36
+ printError(err.message || String(err));
37
+ process.exit(1);
38
+ }
39
+ });
40
+ // ── export groups ─────────────────────────────────────
41
+ exp
42
+ .command('groups')
43
+ .description('Export groups list')
44
+ .option('-f, --format <format>', 'Output format: json or csv', 'json')
45
+ .option('-o, --output <path>', 'Output file path')
46
+ .action(async (opts) => {
47
+ if (!gateCheck('export'))
48
+ return;
49
+ const spinner = ora('Exporting groups…').start();
50
+ try {
51
+ const api = await getApi();
52
+ const data = await exportGroups(api, opts.format);
53
+ spinner.stop();
54
+ if (opts.output) {
55
+ writeFileSync(opts.output, data);
56
+ printSuccess(`Groups exported to ${chalk.bold(opts.output)}`);
57
+ }
58
+ else {
59
+ console.log(data);
60
+ }
61
+ }
62
+ catch (err) {
63
+ spinner.fail('Failed to export groups');
64
+ printError(err.message || String(err));
65
+ process.exit(1);
66
+ }
67
+ });
68
+ // ── export conversations ──────────────────────────────
69
+ exp
70
+ .command('conversations')
71
+ .description('Export recent conversations')
72
+ .option('-f, --format <format>', 'Output format: json or csv', 'json')
73
+ .option('-o, --output <path>', 'Output file path')
74
+ .option('-l, --limit <n>', 'Number of conversations', '100')
75
+ .action(async (opts) => {
76
+ if (!gateCheck('export'))
77
+ return;
78
+ const spinner = ora('Exporting conversations…').start();
79
+ try {
80
+ const api = await getApi();
81
+ const data = await exportConversations(api, opts.format, parseInt(opts.limit));
82
+ spinner.stop();
83
+ if (opts.output) {
84
+ writeFileSync(opts.output, data);
85
+ printSuccess(`Conversations exported to ${chalk.bold(opts.output)}`);
86
+ }
87
+ else {
88
+ console.log(data);
89
+ }
90
+ }
91
+ catch (err) {
92
+ spinner.fail('Failed to export conversations');
93
+ printError(err.message || String(err));
94
+ process.exit(1);
95
+ }
96
+ });
97
+ }
98
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * ZaloX CLI — Friends Commands
3
+ *
4
+ * zalox friend list — List all friends
5
+ * zalox friend info <userId> — Get friend details
6
+ * zalox friend add <phone> — Send friend request
7
+ * zalox friend remove <userId> — Remove friend
8
+ * zalox friend online — Show online friends
9
+ * zalox friend requests — Show pending friend requests
10
+ */
11
+ import type { Command } from "commander";
12
+ export declare function registerFriendCommands(program: Command): void;
13
+ //# sourceMappingURL=friend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"friend.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/friend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyX7D"}