@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,88 @@
1
+ import { existsSync, readFileSync } from 'fs';
2
+ import { loginQR } from '../../core/client.js';
3
+ import { getConfig, saveConfig, getConfigDir, listProfileFiles, getProfilePath } from '../../utils/config.js';
4
+ import { logger } from '../../utils/logger.js';
5
+ export function authCommands(program) {
6
+ const auth = program.command('auth').description('Authentication commands');
7
+ auth
8
+ .command('login')
9
+ .description('Login via QR code')
10
+ .option('-p, --profile <name>', 'Profile name', 'default')
11
+ .action(async (opts) => {
12
+ try {
13
+ await loginQR(opts.profile);
14
+ const config = getConfig();
15
+ config.activeProfile = opts.profile;
16
+ saveConfig(config);
17
+ }
18
+ catch (err) {
19
+ logger.error(err.message);
20
+ process.exit(1);
21
+ }
22
+ });
23
+ auth
24
+ .command('status')
25
+ .description('Check authentication status (offline — does NOT create a session)')
26
+ .action(async () => {
27
+ try {
28
+ const config = getConfig();
29
+ const profile = program.opts().profile || config.activeProfile || 'default';
30
+ const profilePath = getProfilePath(profile);
31
+ if (!existsSync(profilePath)) {
32
+ logger.error(`Not logged in (no credentials for profile "${profile}")`);
33
+ process.exit(1);
34
+ }
35
+ // Read credentials file to verify it's valid JSON with required fields
36
+ const creds = JSON.parse(readFileSync(profilePath, 'utf-8'));
37
+ if (!creds.cookie || !creds.imei || !creds.userAgent) {
38
+ logger.error(`Credentials incomplete for profile "${profile}"`);
39
+ process.exit(1);
40
+ }
41
+ // Report authenticated WITHOUT calling login (no WebSocket/session created)
42
+ logger.success(`Authenticated (profile: ${profile})`);
43
+ console.log(JSON.stringify({ authenticated: true, profile }, null, 2));
44
+ }
45
+ catch (err) {
46
+ logger.error(`Not logged in: ${err.message}`);
47
+ process.exit(1);
48
+ }
49
+ });
50
+ auth
51
+ .command('logout')
52
+ .description('Clear saved credentials')
53
+ .option('-p, --profile <name>', 'Profile name')
54
+ .action(async (opts) => {
55
+ const config = getConfig();
56
+ const profile = opts.profile || config.activeProfile;
57
+ if (config.profiles[profile]) {
58
+ delete config.profiles[profile].credentials;
59
+ logger.success(`Logged out from profile "${profile}"`);
60
+ }
61
+ else {
62
+ logger.warn(`Profile "${profile}" not found`);
63
+ }
64
+ });
65
+ auth
66
+ .command('profiles')
67
+ .description('List all profiles')
68
+ .action(() => {
69
+ const config = getConfig();
70
+ const profiles = listProfileFiles();
71
+ console.log(`\nActive: ${config.activeProfile}\n`);
72
+ for (const name of profiles) {
73
+ const active = name === config.activeProfile ? ' ←' : '';
74
+ console.log(` ✓ ${name}${active}`);
75
+ }
76
+ console.log(`\nConfig: ${getConfigDir()}\n`);
77
+ });
78
+ auth
79
+ .command('use <name>')
80
+ .description('Switch active profile')
81
+ .action((name) => {
82
+ const config = getConfig();
83
+ config.activeProfile = name;
84
+ saveConfig(config);
85
+ logger.success(`Switched to profile "${name}"`);
86
+ });
87
+ }
88
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ZaloX CLI — Auto-Reply Commands
3
+ *
4
+ * zalox autoreply list — List all rules
5
+ * zalox autoreply add <name> — Add a rule
6
+ * zalox autoreply remove <id> — Remove a rule
7
+ * zalox autoreply toggle <id> — Enable/disable a rule
8
+ * zalox autoreply test <message> — Test which rule matches
9
+ */
10
+ import type { Command } from 'commander';
11
+ export declare function autoreplyCommands(program: Command): void;
12
+ //# sourceMappingURL=autoreply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoreply.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/autoreply.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyKxD"}
@@ -0,0 +1,162 @@
1
+ import chalk from 'chalk';
2
+ import Table from 'cli-table3';
3
+ import { gateCheck } from '../../core/gate.js';
4
+ import { addRule, listRules, removeRule, toggleRule, matchRules, } from '../../core/autoreply.js';
5
+ import { printSuccess, printError, formatJson } from '../output.js';
6
+ export function autoreplyCommands(program) {
7
+ const ar = program
8
+ .command('autoreply')
9
+ .description('Auto-reply rules for incoming messages');
10
+ // ── autoreply list ────────────────────────────────────
11
+ ar
12
+ .command('list')
13
+ .description('List all auto-reply rules')
14
+ .option('-j, --json', 'Output as JSON')
15
+ .action((opts) => {
16
+ if (!gateCheck('autoReply'))
17
+ return;
18
+ const rules = listRules();
19
+ if (opts.json) {
20
+ console.log(formatJson(rules));
21
+ return;
22
+ }
23
+ if (rules.length === 0) {
24
+ console.log(chalk.gray(' No auto-reply rules yet.'));
25
+ console.log(chalk.cyan(' $ zalox autoreply add greeting --trigger "hello" --response "Hi there!"'));
26
+ return;
27
+ }
28
+ const table = new Table({
29
+ head: [
30
+ chalk.cyan.bold('ID'),
31
+ chalk.cyan.bold('Name'),
32
+ chalk.cyan.bold('Trigger'),
33
+ chalk.cyan.bold('Response'),
34
+ chalk.cyan.bold('Scope'),
35
+ chalk.cyan.bold('Status'),
36
+ ],
37
+ style: { head: [], border: [] },
38
+ });
39
+ for (const r of rules) {
40
+ const trigger = `${r.trigger.type}: ${r.trigger.pattern.length > 20 ? r.trigger.pattern.substring(0, 20) + '…' : r.trigger.pattern}`;
41
+ const response = r.templateId
42
+ ? chalk.yellow(`[template: ${r.templateId}]`)
43
+ : (r.response.length > 25 ? r.response.substring(0, 25) + '…' : r.response);
44
+ const status = r.enabled
45
+ ? chalk.green('●')
46
+ : chalk.gray('○');
47
+ table.push([
48
+ chalk.gray(r.id),
49
+ r.name,
50
+ trigger,
51
+ response,
52
+ r.scope,
53
+ status,
54
+ ]);
55
+ }
56
+ console.log(table.toString());
57
+ console.log(chalk.gray(` Total: ${rules.length} rules (sorted by priority)`));
58
+ });
59
+ // ── autoreply add ─────────────────────────────────────
60
+ ar
61
+ .command('add')
62
+ .description('Add an auto-reply rule')
63
+ .argument('<name>', 'Rule name')
64
+ .requiredOption('--trigger <pattern>', 'Trigger pattern')
65
+ .requiredOption('--response <text>', 'Response text (supports {{senderName}}, {{message}})')
66
+ .option('--type <type>', 'Trigger type: contains, exact, regex, startsWith', 'contains')
67
+ .option('--scope <scope>', 'Scope: all, dm, group', 'all')
68
+ .option('--priority <n>', 'Priority (lower = higher)', '10')
69
+ .option('--cooldown <ms>', 'Cooldown in milliseconds')
70
+ .option('--case-sensitive', 'Case-sensitive matching', false)
71
+ .option('--groups <ids...>', 'Specific group IDs only')
72
+ .action((name, opts) => {
73
+ if (!gateCheck('autoReply'))
74
+ return;
75
+ try {
76
+ const rule = addRule({
77
+ name,
78
+ trigger: {
79
+ type: opts.type,
80
+ pattern: opts.trigger,
81
+ caseSensitive: opts.caseSensitive,
82
+ },
83
+ response: opts.response,
84
+ scope: opts.scope,
85
+ groupIds: opts.groups,
86
+ enabled: true,
87
+ priority: parseInt(opts.priority),
88
+ cooldownMs: opts.cooldown ? parseInt(opts.cooldown) : undefined,
89
+ });
90
+ printSuccess(`Rule "${rule.name}" created (id: ${rule.id})`);
91
+ console.log(chalk.gray(` Trigger: ${rule.trigger.type} "${rule.trigger.pattern}"`));
92
+ console.log(chalk.gray(` Response: ${rule.response}`));
93
+ console.log(chalk.gray(` Scope: ${rule.scope} | Priority: ${rule.priority}`));
94
+ }
95
+ catch (err) {
96
+ printError(err.message || String(err));
97
+ process.exit(1);
98
+ }
99
+ });
100
+ // ── autoreply remove ──────────────────────────────────
101
+ ar
102
+ .command('remove')
103
+ .description('Remove an auto-reply rule')
104
+ .argument('<id>', 'Rule ID')
105
+ .action((id) => {
106
+ if (!gateCheck('autoReply'))
107
+ return;
108
+ if (removeRule(id)) {
109
+ printSuccess(`Rule ${id} removed`);
110
+ }
111
+ else {
112
+ printError(`Rule "${id}" not found`);
113
+ process.exit(1);
114
+ }
115
+ });
116
+ // ── autoreply toggle ──────────────────────────────────
117
+ ar
118
+ .command('toggle')
119
+ .description('Enable or disable a rule')
120
+ .argument('<id>', 'Rule ID')
121
+ .action((id) => {
122
+ if (!gateCheck('autoReply'))
123
+ return;
124
+ const rule = toggleRule(id);
125
+ if (rule) {
126
+ printSuccess(`Rule "${rule.name}" is now ${rule.enabled ? chalk.green('enabled') : chalk.gray('disabled')}`);
127
+ }
128
+ else {
129
+ printError(`Rule "${id}" not found`);
130
+ process.exit(1);
131
+ }
132
+ });
133
+ // ── autoreply test ────────────────────────────────────
134
+ ar
135
+ .command('test')
136
+ .description('Test which rule matches a message')
137
+ .argument('<message>', 'Message text to test')
138
+ .option('--scope <scope>', 'Simulate scope: dm or group', 'dm')
139
+ .action((message, opts) => {
140
+ if (!gateCheck('autoReply'))
141
+ return;
142
+ const context = {
143
+ threadId: 'test-thread',
144
+ senderId: 'test-user',
145
+ senderName: 'Test User',
146
+ isGroup: opts.scope === 'group',
147
+ };
148
+ const matched = matchRules(message, context);
149
+ if (matched) {
150
+ console.log(chalk.green('\n ✓ Matched rule:'));
151
+ console.log(chalk.bold(` Name: ${matched.name} (${matched.id})`));
152
+ console.log(` Trigger: ${matched.trigger.type} "${matched.trigger.pattern}"`);
153
+ console.log(` Response: ${matched.response}`);
154
+ console.log(` Priority: ${matched.priority}`);
155
+ console.log();
156
+ }
157
+ else {
158
+ console.log(chalk.yellow('\n No rule matched this message.\n'));
159
+ }
160
+ });
161
+ }
162
+ //# sourceMappingURL=autoreply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoreply.js","sourceRoot":"","sources":["../../../src/cli/commands/autoreply.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,EAAE,GAAG,OAAO;SACf,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,wCAAwC,CAAC,CAAC;IAEzD,yDAAyD;IACzD,EAAE;SACC,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;SACtC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAAE,OAAO;QAEpC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAE1B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CACxF,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,IAAI,EAAE;gBACJ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC1B;YACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;SAChC,CAAC,CAAC;QAEH,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrI,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU;gBAC3B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,UAAU,GAAG,CAAC;gBAC7C,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC9E,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO;gBACtB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;gBAClB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEpB,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,CAAC,CAAC,IAAI;gBACN,OAAO;gBACP,QAAQ;gBACR,CAAC,CAAC,KAAK;gBACP,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,MAAM,6BAA6B,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEL,yDAAyD;IACzD,EAAE;SACC,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,wBAAwB,CAAC;SACrC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;SAC/B,cAAc,CAAC,qBAAqB,EAAE,iBAAiB,CAAC;SACxD,cAAc,CAAC,mBAAmB,EAAE,sDAAsD,CAAC;SAC3F,MAAM,CAAC,eAAe,EAAE,kDAAkD,EAAE,UAAU,CAAC;SACvF,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,EAAE,KAAK,CAAC;SACzD,MAAM,CAAC,gBAAgB,EAAE,2BAA2B,EAAE,IAAI,CAAC;SAC3D,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,CAAC;SACrD,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,KAAK,CAAC;SAC5D,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,CAAC,IAAY,EAAE,IAAI,EAAE,EAAE;QAC7B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAAE,OAAO;QAEpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC;gBACnB,IAAI;gBACJ,OAAO,EAAE;oBACP,IAAI,EAAE,IAAI,CAAC,IAAqD;oBAChE,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,aAAa,EAAE,IAAI,CAAC,aAAa;iBAClC;gBACD,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAA+B;gBAC3C,QAAQ,EAAE,IAAI,CAAC,MAAM;gBACrB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACjC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;aAChE,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,IAAI,CAAC,IAAI,kBAAkB,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,UAAU,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,yDAAyD;IACzD,EAAE;SACC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2BAA2B,CAAC;SACxC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;SAC3B,MAAM,CAAC,CAAC,EAAU,EAAE,EAAE;QACrB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAAE,OAAO;QAEpC,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;YACnB,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,yDAAyD;IACzD,EAAE;SACC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;SAC3B,MAAM,CAAC,CAAC,EAAU,EAAE,EAAE;QACrB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAAE,OAAO;QAEpC,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,IAAI,EAAE,CAAC;YACT,YAAY,CACV,SAAS,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAC/F,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,yDAAyD;IACzD,EAAE;SACC,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mCAAmC,CAAC;SAChD,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;SAC7C,MAAM,CAAC,iBAAiB,EAAE,6BAA6B,EAAE,IAAI,CAAC;SAC9D,MAAM,CAAC,CAAC,OAAe,EAAE,IAAI,EAAE,EAAE;QAChC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAAE,OAAO;QAEpC,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,WAAW;YACrB,UAAU,EAAE,WAAW;YACvB,OAAO,EAAE,IAAI,CAAC,KAAK,KAAK,OAAO;SAChC,CAAC;QAEF,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE7C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * ZaloX CLI — Bulk Send Commands
3
+ *
4
+ * zalox bulk send <threadIds...> — Send to multiple recipients
5
+ * zalox bulk usage — Show daily usage
6
+ */
7
+ import type { Command } from 'commander';
8
+ export declare function bulkCommands(program: Command): void;
9
+ //# sourceMappingURL=bulk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/bulk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0KnD"}
@@ -0,0 +1,169 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { existsSync, readFileSync } from 'fs';
4
+ import { gateCheck } from '../../core/gate.js';
5
+ import { bulkSend, getBulkUsage } from '../../core/bulk.js';
6
+ import { getTemplate } from '../../core/templates.js';
7
+ import { getApi } from '../../core/client.js';
8
+ import { validateLicense } from '../../core/license.js';
9
+ import { readCacheAny, CACHE_KEYS } from '../../utils/cache.js';
10
+ import { getConfig } from '../../utils/config.js';
11
+ import { printSuccess, printError, formatJson } from '../output.js';
12
+ export function bulkCommands(program) {
13
+ const bulk = program
14
+ .command('bulk')
15
+ .description('Bulk send messages to multiple recipients');
16
+ // ── bulk send ─────────────────────────────────────────
17
+ bulk
18
+ .command('send')
19
+ .description('Send a message to multiple threads')
20
+ .argument('[threadIds...]', 'Thread IDs')
21
+ .option('-m, --message <text>', 'Message text')
22
+ .option('--template <name>', 'Use a template')
23
+ .option('--var <pairs...>', 'Template variable values (key=value)')
24
+ .option('--file <path>', 'Read thread IDs from file (one per line)')
25
+ .option('--friends', 'Send to all friends', false)
26
+ .option('-g, --group', 'Send to group threads', false)
27
+ .option('--delay <ms>', 'Delay between sends in ms', '1000')
28
+ .option('-j, --json', 'Output as JSON')
29
+ .action(async (threadIds, opts) => {
30
+ if (!gateCheck('bulkSend'))
31
+ return;
32
+ // Resolve thread IDs
33
+ let ids = [...(threadIds || [])];
34
+ // Read from file
35
+ if (opts.file) {
36
+ if (!existsSync(opts.file)) {
37
+ printError(`File not found: ${opts.file}`);
38
+ process.exit(1);
39
+ }
40
+ const fileIds = readFileSync(opts.file, 'utf-8')
41
+ .split('\n')
42
+ .map((l) => l.trim())
43
+ .filter((l) => l && !l.startsWith('#'));
44
+ ids.push(...fileIds);
45
+ }
46
+ // Send to all friends
47
+ if (opts.friends) {
48
+ const config = getConfig();
49
+ const profile = program.opts().profile || config.activeProfile || 'default';
50
+ const cachedFriends = readCacheAny(profile, CACHE_KEYS.FRIENDS);
51
+ if (cachedFriends && cachedFriends.length > 0) {
52
+ const friendIds = cachedFriends
53
+ .map((f) => f.userId)
54
+ .filter(Boolean);
55
+ ids.push(...friendIds);
56
+ }
57
+ else {
58
+ // Must fetch friends live
59
+ const spinner = ora('Loading friends list…').start();
60
+ try {
61
+ const api = await getApi();
62
+ const friends = await api.getAllFriends();
63
+ spinner.stop();
64
+ const friendIds = friends
65
+ .map((f) => f.userId)
66
+ .filter(Boolean);
67
+ ids.push(...friendIds);
68
+ }
69
+ catch (err) {
70
+ spinner.fail('Failed to load friends');
71
+ printError(err.message || String(err));
72
+ process.exit(1);
73
+ }
74
+ }
75
+ }
76
+ // Deduplicate
77
+ ids = [...new Set(ids)];
78
+ if (ids.length === 0) {
79
+ printError('No thread IDs specified. Provide IDs, --file, or --friends');
80
+ process.exit(1);
81
+ }
82
+ // Resolve message
83
+ let message = opts.message || '';
84
+ let templateId;
85
+ let templateVars;
86
+ if (opts.template) {
87
+ const tmpl = getTemplate(opts.template);
88
+ if (!tmpl) {
89
+ printError(`Template "${opts.template}" not found`);
90
+ process.exit(1);
91
+ }
92
+ templateId = tmpl.id;
93
+ if (!message)
94
+ message = `[template: ${tmpl.name}]`;
95
+ }
96
+ if (!message && !templateId) {
97
+ printError('Must provide --message or --template');
98
+ process.exit(1);
99
+ }
100
+ if (opts.var) {
101
+ templateVars = {};
102
+ for (const pair of opts.var) {
103
+ const eqIdx = pair.indexOf('=');
104
+ if (eqIdx > 0) {
105
+ templateVars[pair.substring(0, eqIdx)] = pair.substring(eqIdx + 1);
106
+ }
107
+ }
108
+ }
109
+ const spinner = ora(`Sending to ${ids.length} recipients…`).start();
110
+ try {
111
+ const api = await getApi();
112
+ const result = await bulkSend(api, {
113
+ threadIds: ids,
114
+ message,
115
+ templateId,
116
+ templateVars,
117
+ isGroup: opts.group,
118
+ delayMs: parseInt(opts.delay),
119
+ }, (sent, total) => {
120
+ spinner.text = `Sending… ${sent}/${total}`;
121
+ });
122
+ spinner.stop();
123
+ if (opts.json) {
124
+ console.log(formatJson(result));
125
+ return;
126
+ }
127
+ console.log();
128
+ printSuccess(`Bulk send complete: ${result.sent}/${result.total} sent`);
129
+ if (result.failed > 0) {
130
+ printError(`${result.failed} failed`);
131
+ for (const r of result.results.filter((r) => !r.ok)) {
132
+ console.log(chalk.gray(` ✗ ${r.threadId}: ${r.error}`));
133
+ }
134
+ }
135
+ console.log();
136
+ }
137
+ catch (err) {
138
+ spinner.fail('Bulk send failed');
139
+ printError(err.message || String(err));
140
+ process.exit(1);
141
+ }
142
+ });
143
+ // ── bulk usage ────────────────────────────────────────
144
+ bulk
145
+ .command('usage')
146
+ .description('Show daily bulk send usage')
147
+ .option('-j, --json', 'Output as JSON')
148
+ .action((opts) => {
149
+ if (!gateCheck('bulkSend'))
150
+ return;
151
+ const usage = getBulkUsage();
152
+ const license = validateLicense();
153
+ const limit = license.features.bulkSendLimit;
154
+ const limitStr = limit === -1 ? '∞' : String(limit);
155
+ if (opts.json) {
156
+ console.log(formatJson({ ...usage, limit }));
157
+ return;
158
+ }
159
+ console.log();
160
+ console.log(chalk.bold.cyan(' 📊 Bulk Send Usage'));
161
+ console.log(chalk.gray(' ' + '─'.repeat(30)));
162
+ console.log(` ${chalk.bold('Date:')} ${usage.date}`);
163
+ console.log(` ${chalk.bold('Sent:')} ${usage.count} / ${limitStr}`);
164
+ console.log(` ${chalk.bold('Remaining:')} ${limit === -1 ? '∞' : Math.max(0, limit - usage.count)}`);
165
+ console.log(` ${chalk.bold('Tier:')} ${license.tier}`);
166
+ console.log();
167
+ });
168
+ }
169
+ //# sourceMappingURL=bulk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.js","sourceRoot":"","sources":["../../../src/cli/commands/bulk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Command } from 'commander';
2
+ interface ZaloXExtendedSettings {
3
+ 'output.format': 'pretty' | 'json';
4
+ 'output.color': boolean;
5
+ 'webhook.url': string;
6
+ 'webhook.secret': string;
7
+ 'listen.filter': string;
8
+ [key: string]: unknown;
9
+ }
10
+ export declare function loadSettings(): ZaloXExtendedSettings;
11
+ export declare function saveSettings(settings: ZaloXExtendedSettings): void;
12
+ export declare function configCommands(program: Command): void;
13
+ export {};
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,UAAU,qBAAqB;IAC7B,eAAe,EAAE,QAAQ,GAAG,MAAM,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAgBD,wBAAgB,YAAY,IAAI,qBAAqB,CAWpD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAGlE;AAmBD,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAkF9C"}
@@ -0,0 +1,122 @@
1
+ import chalk from 'chalk';
2
+ import { getConfig, getConfigDir, ensureConfigDir } from '../../utils/config.js';
3
+ import { logger } from '../../utils/logger.js';
4
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
5
+ import { join } from 'path';
6
+ const SETTINGS_FILE = join(getConfigDir(), 'settings.json');
7
+ const DEFAULT_SETTINGS = {
8
+ 'output.format': 'pretty',
9
+ 'output.color': true,
10
+ 'webhook.url': '',
11
+ 'webhook.secret': '',
12
+ 'listen.filter': '',
13
+ };
14
+ const VALID_KEYS = Object.keys(DEFAULT_SETTINGS);
15
+ // ── Settings helpers ────────────────────────────────────
16
+ export function loadSettings() {
17
+ ensureConfigDir();
18
+ if (!existsSync(SETTINGS_FILE)) {
19
+ return { ...DEFAULT_SETTINGS };
20
+ }
21
+ try {
22
+ const raw = readFileSync(SETTINGS_FILE, 'utf-8');
23
+ return { ...DEFAULT_SETTINGS, ...JSON.parse(raw) };
24
+ }
25
+ catch {
26
+ return { ...DEFAULT_SETTINGS };
27
+ }
28
+ }
29
+ export function saveSettings(settings) {
30
+ ensureConfigDir();
31
+ writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 2));
32
+ }
33
+ function parseBool(val) {
34
+ return ['true', '1', 'yes', 'on'].includes(val.toLowerCase());
35
+ }
36
+ function parseValue(key, val) {
37
+ if (key === 'output.color')
38
+ return parseBool(val);
39
+ if (key === 'output.format') {
40
+ if (!['pretty', 'json'].includes(val)) {
41
+ throw new Error(`Invalid format "${val}". Must be "pretty" or "json".`);
42
+ }
43
+ return val;
44
+ }
45
+ return val;
46
+ }
47
+ // ── Register command ────────────────────────────────────
48
+ export function configCommands(program) {
49
+ const config = program.command('config').description('Configuration management');
50
+ config
51
+ .command('show')
52
+ .description('Show current config')
53
+ .action(() => {
54
+ const settings = loadSettings();
55
+ const mainConfig = getConfig();
56
+ console.log(chalk.bold.cyan('\n⚙️ ZaloX Configuration\n'));
57
+ console.log(chalk.gray('─'.repeat(45)));
58
+ // Main config
59
+ console.log(chalk.bold('\n📋 Profile'));
60
+ console.log(` ${chalk.dim('Active profile:')} ${chalk.green(mainConfig.activeProfile)}`);
61
+ console.log(` ${chalk.dim('Profiles:')} ${Object.keys(mainConfig.profiles).join(', ') || chalk.dim('none')}`);
62
+ // Settings
63
+ console.log(chalk.bold('\n🎨 Output'));
64
+ console.log(` ${chalk.dim('output.format:')} ${chalk.yellow(settings['output.format'])}`);
65
+ console.log(` ${chalk.dim('output.color:')} ${settings['output.color'] ? chalk.green('true') : chalk.red('false')}`);
66
+ console.log(chalk.bold('\n👂 Listener & Webhooks'));
67
+ console.log(` ${chalk.dim('webhook.url:')} ${settings['webhook.url'] || chalk.dim('not set')}`);
68
+ console.log(` ${chalk.dim('webhook.secret:')} ${settings['webhook.secret'] ? '********' : chalk.dim('not set')}`);
69
+ console.log(` ${chalk.dim('listen.filter:')} ${settings['listen.filter'] || chalk.dim('all events')}`);
70
+ console.log(chalk.bold('\n📁 Paths'));
71
+ console.log(` ${chalk.dim('Config dir:')} ${getConfigDir()}`);
72
+ console.log(` ${chalk.dim('Settings file:')} ${SETTINGS_FILE}`);
73
+ console.log();
74
+ });
75
+ config
76
+ .command('get <key>')
77
+ .description('Get a config value')
78
+ .action((key) => {
79
+ const settings = loadSettings();
80
+ if (!(key in settings)) {
81
+ logger.error(`Unknown config key: ${key}`);
82
+ logger.info(`Valid keys: ${VALID_KEYS.join(', ')}`);
83
+ process.exit(1);
84
+ }
85
+ const val = settings[key];
86
+ console.log(val === '' ? chalk.dim('(not set)') : String(val));
87
+ });
88
+ config
89
+ .command('set <key> <value>')
90
+ .description('Set a config value')
91
+ .action((key, value) => {
92
+ if (!VALID_KEYS.includes(key)) {
93
+ logger.error(`Unknown config key: ${key}`);
94
+ logger.info(`Valid keys: ${VALID_KEYS.join(', ')}`);
95
+ process.exit(1);
96
+ }
97
+ try {
98
+ const settings = loadSettings();
99
+ settings[key] = parseValue(key, value);
100
+ saveSettings(settings);
101
+ logger.success(`${key} = ${value}`);
102
+ }
103
+ catch (err) {
104
+ logger.error(err.message);
105
+ process.exit(1);
106
+ }
107
+ });
108
+ config
109
+ .command('reset')
110
+ .description('Reset all settings to defaults')
111
+ .action(() => {
112
+ saveSettings({ ...DEFAULT_SETTINGS });
113
+ logger.success('Configuration reset to defaults');
114
+ });
115
+ config
116
+ .command('path')
117
+ .description('Show config file path')
118
+ .action(() => {
119
+ console.log(getConfigDir());
120
+ });
121
+ }
122
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function convCommands(program: Command): void;
3
+ //# sourceMappingURL=conv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conv.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/conv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,QA6P5C"}