@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.
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/cli/commands/admin.d.ts +17 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +359 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +3 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +88 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/autoreply.d.ts +12 -0
- package/dist/cli/commands/autoreply.d.ts.map +1 -0
- package/dist/cli/commands/autoreply.js +162 -0
- package/dist/cli/commands/autoreply.js.map +1 -0
- package/dist/cli/commands/bulk.d.ts +9 -0
- package/dist/cli/commands/bulk.d.ts.map +1 -0
- package/dist/cli/commands/bulk.js +169 -0
- package/dist/cli/commands/bulk.js.map +1 -0
- package/dist/cli/commands/config.d.ts +14 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +122 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/conv.d.ts +3 -0
- package/dist/cli/commands/conv.d.ts.map +1 -0
- package/dist/cli/commands/conv.js +229 -0
- package/dist/cli/commands/conv.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +13 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +102 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/export.d.ts +10 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +98 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/friend.d.ts +13 -0
- package/dist/cli/commands/friend.d.ts.map +1 -0
- package/dist/cli/commands/friend.js +337 -0
- package/dist/cli/commands/friend.js.map +1 -0
- package/dist/cli/commands/group-settings.d.ts +11 -0
- package/dist/cli/commands/group-settings.d.ts.map +1 -0
- package/dist/cli/commands/group-settings.js +154 -0
- package/dist/cli/commands/group-settings.js.map +1 -0
- package/dist/cli/commands/group.d.ts +14 -0
- package/dist/cli/commands/group.d.ts.map +1 -0
- package/dist/cli/commands/group.js +365 -0
- package/dist/cli/commands/group.js.map +1 -0
- package/dist/cli/commands/license.d.ts +13 -0
- package/dist/cli/commands/license.d.ts.map +1 -0
- package/dist/cli/commands/license.js +218 -0
- package/dist/cli/commands/license.js.map +1 -0
- package/dist/cli/commands/listen.d.ts +3 -0
- package/dist/cli/commands/listen.d.ts.map +1 -0
- package/dist/cli/commands/listen.js +177 -0
- package/dist/cli/commands/listen.js.map +1 -0
- package/dist/cli/commands/me.d.ts +9 -0
- package/dist/cli/commands/me.d.ts.map +1 -0
- package/dist/cli/commands/me.js +135 -0
- package/dist/cli/commands/me.js.map +1 -0
- package/dist/cli/commands/msg.d.ts +11 -0
- package/dist/cli/commands/msg.d.ts.map +1 -0
- package/dist/cli/commands/msg.js +255 -0
- package/dist/cli/commands/msg.js.map +1 -0
- package/dist/cli/commands/profile.d.ts +3 -0
- package/dist/cli/commands/profile.d.ts.map +1 -0
- package/dist/cli/commands/profile.js +50 -0
- package/dist/cli/commands/profile.js.map +1 -0
- package/dist/cli/commands/schedule.d.ts +12 -0
- package/dist/cli/commands/schedule.d.ts.map +1 -0
- package/dist/cli/commands/schedule.js +175 -0
- package/dist/cli/commands/schedule.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +87 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/template.d.ts +12 -0
- package/dist/cli/commands/template.d.ts.map +1 -0
- package/dist/cli/commands/template.js +163 -0
- package/dist/cli/commands/template.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +116 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +63 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +144 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/core/autoreply.d.ts +57 -0
- package/dist/core/autoreply.d.ts.map +1 -0
- package/dist/core/autoreply.js +159 -0
- package/dist/core/autoreply.js.map +1 -0
- package/dist/core/bulk.d.ts +36 -0
- package/dist/core/bulk.d.ts.map +1 -0
- package/dist/core/bulk.js +117 -0
- package/dist/core/bulk.js.map +1 -0
- package/dist/core/client.d.ts +8 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +91 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/daemon.d.ts +30 -0
- package/dist/core/daemon.d.ts.map +1 -0
- package/dist/core/daemon.js +213 -0
- package/dist/core/daemon.js.map +1 -0
- package/dist/core/dm-commands.d.ts +41 -0
- package/dist/core/dm-commands.d.ts.map +1 -0
- package/dist/core/dm-commands.js +313 -0
- package/dist/core/dm-commands.js.map +1 -0
- package/dist/core/export.d.ts +20 -0
- package/dist/core/export.d.ts.map +1 -0
- package/dist/core/export.js +92 -0
- package/dist/core/export.js.map +1 -0
- package/dist/core/gate.d.ts +39 -0
- package/dist/core/gate.d.ts.map +1 -0
- package/dist/core/gate.js +75 -0
- package/dist/core/gate.js.map +1 -0
- package/dist/core/group-settings.d.ts +35 -0
- package/dist/core/group-settings.d.ts.map +1 -0
- package/dist/core/group-settings.js +70 -0
- package/dist/core/group-settings.js.map +1 -0
- package/dist/core/index.d.ts +22 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/license.d.ts +103 -0
- package/dist/core/license.d.ts.map +1 -0
- package/dist/core/license.js +444 -0
- package/dist/core/license.js.map +1 -0
- package/dist/core/scheduler.d.ts +45 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +203 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/templates.d.ts +35 -0
- package/dist/core/templates.d.ts.map +1 -0
- package/dist/core/templates.js +107 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/core/types.d.ts +57 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -0
- package/dist/server/api.d.ts +2 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +79 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/index.d.ts +16 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +48 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/license-api.d.ts +55 -0
- package/dist/server/license-api.d.ts.map +1 -0
- package/dist/server/license-api.js +496 -0
- package/dist/server/license-api.js.map +1 -0
- package/dist/server/middleware.d.ts +18 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +92 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/webhook.d.ts +10 -0
- package/dist/server/webhook.d.ts.map +1 -0
- package/dist/server/webhook.js +53 -0
- package/dist/server/webhook.js.map +1 -0
- package/dist/server/ws.d.ts +66 -0
- package/dist/server/ws.d.ts.map +1 -0
- package/dist/server/ws.js +203 -0
- package/dist/server/ws.js.map +1 -0
- package/dist/utils/cache.d.ts +35 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +78 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/config.d.ts +16 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +88 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +51 -0
- package/dist/utils/logger.js.map +1 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|