@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ZaloX Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,185 @@
1
+ # ZaloX 🚀
2
+
3
+ > **Modern Zalo CLI & API Platform** — Automation Unleashed.
4
+
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Built with Bun](https://img.shields.io/badge/Bun-%23000000.svg?style=flat&logo=bun&logoColor=white)](https://bun.sh)
7
+ [![Platform](https://img.shields.io/badge/platform-linux%20%7C%20macos%20%7C%20windows-lightgrey)](https://github.com/lktiep/zalox)
8
+
9
+ **ZaloX** is a powerful, developer-friendly CLI tool and API server for Zalo automation. It replaces paid tools like `zca-cli` with a free, open-source alternative built on top of `zca-js`.
10
+
11
+ ---
12
+
13
+ ## ✨ Features
14
+
15
+ | Feature | ZaloX Free | zca-cli |
16
+ |---------|------------|---------|
17
+ | **Auth** | QR Code & Cookie Login | ✅ |
18
+ | **Messaging** | Text, Link, Reply, Undo, React | ✅ |
19
+ | **Contacts** | List Friends & Groups | 💰 Paid |
20
+ | **Real-time** | Message Listener | 💰 Paid |
21
+ | **Multi-account** | Unlimited Profiles | 💰 Paid |
22
+ | **API Server** | REST API (`zalox serve`) | ❌ |
23
+ | **Webhooks** | HTTP Forwarding | ❌ |
24
+ | **Platform** | Linux, macOS, Windows | Linux only |
25
+
26
+ ---
27
+
28
+ ## 📦 Installation
29
+
30
+ ### NPM (Node.js)
31
+
32
+ ```bash
33
+ npm install -g @jackle.dev/zalox
34
+ ```
35
+ Download the latest binary from [Releases](https://github.com/lktiep/zalox/releases).
36
+
37
+ ```bash
38
+ # Linux / macOS
39
+ chmod +x zalox
40
+ mv zalox /usr/local/bin/
41
+
42
+ # Windows
43
+ # Add zalox.exe to your PATH
44
+ ```
45
+
46
+ ### From Source
47
+ Requires [Bun](https://bun.sh) or Node.js 18+.
48
+
49
+ ```bash
50
+ git clone https://github.com/lktiep/zalox.git
51
+ cd zalox
52
+ bun install
53
+ bun run build
54
+ ```
55
+
56
+ ---
57
+
58
+ ## 🚀 Quick Start
59
+
60
+ 1. **Login**
61
+ ```bash
62
+ zalox auth login
63
+ # Scan the QR code with your Zalo app
64
+ ```
65
+
66
+ 2. **Send Message**
67
+ ```bash
68
+ zalox msg send <user_id> "Hello from ZaloX!"
69
+ ```
70
+
71
+ 3. **List Friends**
72
+ ```bash
73
+ zalox friend list
74
+ ```
75
+
76
+ 4. **Start Listener**
77
+ ```bash
78
+ zalox listen
79
+ ```
80
+
81
+ ---
82
+
83
+ ## 📚 Commands Reference
84
+
85
+ ### Authentication
86
+ - `zalox auth login` - Login via QR code
87
+ - `zalox auth status` - Check current session
88
+ - `zalox auth logout` - Remove credentials
89
+ - `zalox auth profiles` - List all saved profiles
90
+ - `zalox auth use <profile>` - Switch active profile
91
+
92
+ ### Messaging
93
+ - `zalox msg send <id> <text>` - Send text message
94
+ - `zalox msg send-link <id> <url>` - Send link with preview
95
+ - `zalox msg undo <id> <msgId>` - Recall a message
96
+ - `zalox msg react <id> <msgId> <icon>` - React (❤️, 👍, 😂, etc.)
97
+
98
+ ### Contacts
99
+ - `zalox friend list` - List friends
100
+ - `zalox friend find <phone>` - Find user by phone
101
+ - `zalox friend add <id> <msg>` - Send friend request
102
+ - `zalox group list` - List groups
103
+ - `zalox group members <id>` - List group members
104
+ - `zalox group create <name> <id1> <id2>` - Create new group
105
+
106
+ ### Advanced
107
+ - `zalox listen` - Start real-time event listener
108
+ - `zalox serve` - Start REST API Server (Port 3456)
109
+ - `zalox config set webhook.url <url>` - Forward messages to URL
110
+ - `zalox me info` - View detailed account info
111
+
112
+ ---
113
+
114
+ ## 🔌 REST API Server
115
+
116
+ Run `zalox serve` to expose your Zalo account as a local REST API.
117
+
118
+ | Method | Endpoint | Description |
119
+ |--------|----------|-------------|
120
+ | `GET` | `/api/me` | Account info |
121
+ | `GET` | `/api/friends` | List friends |
122
+ | `GET` | `/api/groups` | List groups |
123
+ | `POST` | `/api/messages/send` | Send message |
124
+
125
+ **Example usage:**
126
+ ```bash
127
+ curl -X POST http://localhost:3456/api/messages/send \
128
+ -H "Content-Type: application/json" \
129
+ -d '{"threadId": "123456789", "message": "Hello via API"}'
130
+ ```
131
+
132
+ ---
133
+
134
+ ## 🤖 OpenClaw Plugin
135
+
136
+ ZaloX includes a native **OpenClaw channel plugin** (`plugin/`) that integrates Zalo as a first-class messaging channel — just like Telegram, Discord, or WhatsApp.
137
+
138
+ ### Features
139
+ - 📥 **Inbound:** Receive DMs and group messages from Zalo
140
+ - 📤 **Outbound:** Send text, images, and files
141
+ - ❤️ **Reactions:** Auto heart-react on inbound messages
142
+ - 👥 **Group mentions:** Only replies when @tagged in groups
143
+ - 🔐 **Persistent credentials:** Survives container restarts
144
+ - 📸 **Image upload:** Full support via sharp + zca-js uploadAttachment
145
+
146
+ ### Setup
147
+ 1. Configure in `openclaw.json`:
148
+ ```json
149
+ {
150
+ "plugins": [{ "source": "/path/to/zalox/plugin" }],
151
+ "channels": {
152
+ "zalox": {
153
+ "accounts": { "default": {} },
154
+ "bindings": [{ "match": { "channel": "zalox" }, "agentId": "main" }]
155
+ }
156
+ }
157
+ }
158
+ ```
159
+ 2. Login via QR:
160
+ ```bash
161
+ tsx plugin/scripts/qr-login.ts
162
+ ```
163
+ 3. Restart OpenClaw — Zalo messages now route to your agent!
164
+
165
+ ---
166
+
167
+ ## 🤝 Contributing
168
+
169
+ We welcome contributions! Please see `CONTRIBUTING.md` for details.
170
+
171
+ 1. Fork the repo
172
+ 2. Create your feature branch (`git checkout -b feature/amazing`)
173
+ 3. Commit your changes (`git commit -m 'feat: Add amazing feature'`)
174
+ 4. Push to the branch (`git push origin feature/amazing`)
175
+ 5. Open a Pull Request
176
+
177
+ ---
178
+
179
+ ## ⚖️ Disclaimer
180
+
181
+ This tool is **not affiliated with, endorsed by, or associated with Zalo Group or VNG Corporation**.
182
+ It is an unofficial open-source tool built for educational and development purposes.
183
+ Use responsibly and at your own risk.
184
+
185
+ **License:** MIT
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ZaloX — Admin CLI Commands
3
+ *
4
+ * Server-side license management commands.
5
+ *
6
+ * Commands:
7
+ * zalox admin serve — Start license API server
8
+ * zalox admin gen-key --tier pro — Generate license key
9
+ * zalox admin list-keys — List all keys
10
+ * zalox admin revoke-key <key> — Revoke a key
11
+ * zalox admin transfer-key <key> — Transfer key (reset devices)
12
+ * zalox admin key-info <key> — Show key details
13
+ * zalox admin stats — Dashboard stats
14
+ */
15
+ import type { Command } from 'commander';
16
+ export declare function adminCommands(program: Command): void;
17
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiFzC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgVpD"}
@@ -0,0 +1,359 @@
1
+ /**
2
+ * ZaloX — Admin CLI Commands
3
+ *
4
+ * Server-side license management commands.
5
+ *
6
+ * Commands:
7
+ * zalox admin serve — Start license API server
8
+ * zalox admin gen-key --tier pro — Generate license key
9
+ * zalox admin list-keys — List all keys
10
+ * zalox admin revoke-key <key> — Revoke a key
11
+ * zalox admin transfer-key <key> — Transfer key (reset devices)
12
+ * zalox admin key-info <key> — Show key details
13
+ * zalox admin stats — Dashboard stats
14
+ */
15
+ import chalk from 'chalk';
16
+ import Table from 'cli-table3';
17
+ import { randomBytes } from 'crypto';
18
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
19
+ import { join } from 'path';
20
+ import { homedir } from 'os';
21
+ // ── Store Path ───────────────────────────────────────────
22
+ function getDataDir() {
23
+ return join(homedir(), '.config', 'zalox', 'server');
24
+ }
25
+ function getStorePath() {
26
+ return join(getDataDir(), 'licenses.json');
27
+ }
28
+ function loadStore() {
29
+ const path = getStorePath();
30
+ if (!existsSync(path)) {
31
+ return { keys: {}, version: 1, lastUpdated: new Date().toISOString() };
32
+ }
33
+ try {
34
+ return JSON.parse(readFileSync(path, 'utf-8'));
35
+ }
36
+ catch {
37
+ return { keys: {}, version: 1, lastUpdated: new Date().toISOString() };
38
+ }
39
+ }
40
+ function saveStore(store) {
41
+ const dir = getDataDir();
42
+ if (!existsSync(dir))
43
+ mkdirSync(dir, { recursive: true });
44
+ store.lastUpdated = new Date().toISOString();
45
+ writeFileSync(getStorePath(), JSON.stringify(store, null, 2));
46
+ }
47
+ // ── Key Generation ───────────────────────────────────────
48
+ function generateKey(tier) {
49
+ const random = randomBytes(4).toString('hex').toUpperCase();
50
+ const check = randomBytes(2).toString('hex').toUpperCase();
51
+ return `ZALOX-${tier.toUpperCase()}-${random}-${check}`;
52
+ }
53
+ // ── CLI Commands ─────────────────────────────────────────
54
+ export function adminCommands(program) {
55
+ const admin = program
56
+ .command('admin')
57
+ .description('🔐 License server administration');
58
+ // ── serve ──────────────────────────────────────────────
59
+ admin
60
+ .command('serve')
61
+ .description('Start license API server')
62
+ .option('-p, --port <port>', 'Port', '3456')
63
+ .option('--host <host>', 'Host', '0.0.0.0')
64
+ .option('--admin-token <token>', 'Admin API token (required)')
65
+ .option('--data-dir <dir>', 'Data directory', getDataDir())
66
+ .action(async (opts) => {
67
+ const adminToken = opts.adminToken || process.env.ZALOX_ADMIN_TOKEN;
68
+ if (!adminToken) {
69
+ console.log(chalk.red(' ✖ Admin token required. Use --admin-token or set ZALOX_ADMIN_TOKEN'));
70
+ process.exit(1);
71
+ }
72
+ const { createLicenseApi } = await import('../../server/license-api.js');
73
+ const { serve } = await import('@hono/node-server');
74
+ const app = createLicenseApi({
75
+ dataDir: opts.dataDir,
76
+ adminToken,
77
+ });
78
+ const port = parseInt(opts.port);
79
+ console.log();
80
+ console.log(chalk.green.bold(' 🔑 ZaloX License Server'));
81
+ console.log(chalk.gray(` ─────────────────────────────`));
82
+ console.log(` ${chalk.gray('Port:')} ${chalk.white(port)}`);
83
+ console.log(` ${chalk.gray('Host:')} ${chalk.white(opts.host)}`);
84
+ console.log(` ${chalk.gray('Data:')} ${chalk.white(opts.dataDir)}`);
85
+ console.log(` ${chalk.gray('Admin:')} ${chalk.yellow(adminToken.slice(0, 8) + '...')}`);
86
+ console.log();
87
+ console.log(chalk.gray(' Endpoints:'));
88
+ console.log(chalk.cyan(' POST /api/license/activate'));
89
+ console.log(chalk.cyan(' POST /api/license/verify'));
90
+ console.log(chalk.cyan(' POST /api/license/deactivate'));
91
+ console.log(chalk.yellow(' POST /api/admin/keys/generate [admin]'));
92
+ console.log(chalk.yellow(' GET /api/admin/keys [admin]'));
93
+ console.log(chalk.yellow(' GET /api/admin/keys/:key [admin]'));
94
+ console.log(chalk.yellow(' PATCH /api/admin/keys/:key [admin]'));
95
+ console.log(chalk.yellow(' POST /api/admin/keys/revoke [admin]'));
96
+ console.log(chalk.yellow(' POST /api/admin/keys/transfer [admin]'));
97
+ console.log(chalk.yellow(' DELETE /api/admin/keys/:key [admin]'));
98
+ console.log(chalk.yellow(' GET /api/admin/stats [admin]'));
99
+ console.log();
100
+ serve({ fetch: app.fetch, port, hostname: opts.host });
101
+ });
102
+ // ── gen-key ────────────────────────────────────────────
103
+ admin
104
+ .command('gen-key')
105
+ .description('Generate license key(s)')
106
+ .option('-t, --tier <tier>', 'License tier (starter/pro/team)', 'pro')
107
+ .option('-n, --count <count>', 'Number of keys', '1')
108
+ .option('--owner <name>', 'Owner name')
109
+ .option('--email <email>', 'Owner email')
110
+ .option('--note <note>', 'Note')
111
+ .option('--expires <date>', 'Expiration date (ISO)')
112
+ .option('--max-devices <n>', 'Max devices')
113
+ .option('--payment-ref <ref>', 'Payment reference')
114
+ .action((opts) => {
115
+ const tier = opts.tier;
116
+ if (!['starter', 'pro', 'team'].includes(tier)) {
117
+ console.log(chalk.red(` ✖ Invalid tier "${tier}". Use: starter, pro, team`));
118
+ return;
119
+ }
120
+ const count = Math.min(parseInt(opts.count) || 1, 100);
121
+ const store = loadStore();
122
+ const maxDevices = opts.maxDevices ? parseInt(opts.maxDevices) : (tier === 'team' ? 5 : 1);
123
+ console.log();
124
+ console.log(chalk.green.bold(` 🔑 Generating ${count} ${tier.toUpperCase()} key(s)...`));
125
+ console.log();
126
+ const keys = [];
127
+ for (let i = 0; i < count; i++) {
128
+ let key;
129
+ do {
130
+ key = generateKey(tier);
131
+ } while (store.keys[key]);
132
+ store.keys[key] = {
133
+ key,
134
+ tier,
135
+ status: 'active',
136
+ createdAt: new Date().toISOString(),
137
+ activatedAt: null,
138
+ revokedAt: null,
139
+ expiresAt: opts.expires || null,
140
+ maxDevices,
141
+ devices: [],
142
+ owner: opts.owner || null,
143
+ email: opts.email || null,
144
+ note: opts.note || null,
145
+ paymentRef: opts.paymentRef || null,
146
+ metadata: {},
147
+ };
148
+ keys.push(key);
149
+ }
150
+ saveStore(store);
151
+ // Display
152
+ const prices = { starter: '499,000₫', pro: '999,000₫', team: '2,499,000₫' };
153
+ for (const key of keys) {
154
+ console.log(` ${chalk.yellow('⚡')} ${chalk.white.bold(key)}`);
155
+ }
156
+ console.log();
157
+ console.log(chalk.gray(` Tier: ${chalk.white(tier.toUpperCase())} (${prices[tier]})`));
158
+ console.log(chalk.gray(` Max devices: ${chalk.white(maxDevices)}`));
159
+ if (opts.owner)
160
+ console.log(chalk.gray(` Owner: ${chalk.white(opts.owner)}`));
161
+ if (opts.email)
162
+ console.log(chalk.gray(` Email: ${chalk.white(opts.email)}`));
163
+ if (opts.expires)
164
+ console.log(chalk.gray(` Expires: ${chalk.white(opts.expires)}`));
165
+ if (opts.paymentRef)
166
+ console.log(chalk.gray(` Payment: ${chalk.white(opts.paymentRef)}`));
167
+ console.log(chalk.gray(` Stored: ${getStorePath()}`));
168
+ console.log();
169
+ });
170
+ // ── list-keys ──────────────────────────────────────────
171
+ admin
172
+ .command('list-keys')
173
+ .alias('ls')
174
+ .description('List all license keys')
175
+ .option('-t, --tier <tier>', 'Filter by tier')
176
+ .option('-s, --status <status>', 'Filter by status')
177
+ .option('-q, --query <search>', 'Search in key/owner/email')
178
+ .action((opts) => {
179
+ const store = loadStore();
180
+ let keys = Object.values(store.keys);
181
+ if (opts.tier)
182
+ keys = keys.filter(k => k.tier === opts.tier);
183
+ if (opts.status)
184
+ keys = keys.filter(k => k.status === opts.status);
185
+ if (opts.query) {
186
+ const q = opts.query.toLowerCase();
187
+ keys = keys.filter(k => k.key.toLowerCase().includes(q) ||
188
+ k.owner?.toLowerCase().includes(q) ||
189
+ k.email?.toLowerCase().includes(q));
190
+ }
191
+ keys.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
192
+ if (keys.length === 0) {
193
+ console.log(chalk.yellow('\n No keys found.\n'));
194
+ return;
195
+ }
196
+ console.log();
197
+ console.log(chalk.green.bold(` 📋 License Keys (${keys.length} total)`));
198
+ console.log();
199
+ const table = new Table({
200
+ head: ['Key', 'Tier', 'Status', 'Devices', 'Owner', 'Created'].map(h => chalk.gray(h)),
201
+ style: { 'padding-left': 2 },
202
+ });
203
+ for (const k of keys) {
204
+ const statusColor = {
205
+ active: chalk.blue,
206
+ activated: chalk.green,
207
+ revoked: chalk.red,
208
+ expired: chalk.gray,
209
+ }[k.status] || chalk.white;
210
+ table.push([
211
+ chalk.white(k.key),
212
+ chalk.yellow(k.tier.toUpperCase()),
213
+ statusColor(k.status),
214
+ `${k.devices.length}/${k.maxDevices}`,
215
+ k.owner || chalk.gray('-'),
216
+ new Date(k.createdAt).toLocaleDateString(),
217
+ ]);
218
+ }
219
+ console.log(table.toString());
220
+ console.log();
221
+ });
222
+ // ── key-info ───────────────────────────────────────────
223
+ admin
224
+ .command('key-info <key>')
225
+ .description('Show key details')
226
+ .action((key) => {
227
+ const store = loadStore();
228
+ const license = store.keys[key.toUpperCase()];
229
+ if (!license) {
230
+ console.log(chalk.red(`\n ✖ Key not found: ${key}\n`));
231
+ return;
232
+ }
233
+ console.log();
234
+ console.log(chalk.green.bold(` 🔑 License Details`));
235
+ console.log(chalk.gray(` ─────────────────────────────`));
236
+ console.log(` ${chalk.gray('Key:')} ${chalk.white.bold(license.key)}`);
237
+ console.log(` ${chalk.gray('Tier:')} ${chalk.yellow(license.tier.toUpperCase())}`);
238
+ console.log(` ${chalk.gray('Status:')} ${license.status}`);
239
+ console.log(` ${chalk.gray('Max Devices:')} ${license.maxDevices}`);
240
+ console.log(` ${chalk.gray('Created:')} ${license.createdAt}`);
241
+ if (license.activatedAt)
242
+ console.log(` ${chalk.gray('Activated:')} ${license.activatedAt}`);
243
+ if (license.expiresAt)
244
+ console.log(` ${chalk.gray('Expires:')} ${license.expiresAt}`);
245
+ if (license.revokedAt)
246
+ console.log(` ${chalk.gray('Revoked:')} ${license.revokedAt}`);
247
+ if (license.owner)
248
+ console.log(` ${chalk.gray('Owner:')} ${license.owner}`);
249
+ if (license.email)
250
+ console.log(` ${chalk.gray('Email:')} ${license.email}`);
251
+ if (license.note)
252
+ console.log(` ${chalk.gray('Note:')} ${license.note}`);
253
+ if (license.paymentRef)
254
+ console.log(` ${chalk.gray('Payment:')} ${license.paymentRef}`);
255
+ if (license.devices.length > 0) {
256
+ console.log();
257
+ console.log(chalk.gray(` Activated Devices (${license.devices.length}):`));
258
+ for (const d of license.devices) {
259
+ console.log(` ${chalk.cyan('•')} ${chalk.white(d.deviceCode)} — ${d.hostname || '?'} (${d.platform || '?'})`);
260
+ console.log(` ${chalk.gray(`Activated: ${d.activatedAt} | Last seen: ${d.lastVerifiedAt}`)}`);
261
+ if (d.ip)
262
+ console.log(` ${chalk.gray(`IP: ${d.ip}`)}`);
263
+ }
264
+ }
265
+ console.log();
266
+ });
267
+ // ── revoke-key ─────────────────────────────────────────
268
+ admin
269
+ .command('revoke-key <key>')
270
+ .description('Revoke a license key')
271
+ .action((key) => {
272
+ const store = loadStore();
273
+ const license = store.keys[key.toUpperCase()];
274
+ if (!license) {
275
+ console.log(chalk.red(`\n ✖ Key not found: ${key}\n`));
276
+ return;
277
+ }
278
+ license.status = 'revoked';
279
+ license.revokedAt = new Date().toISOString();
280
+ saveStore(store);
281
+ console.log(chalk.green(`\n ✔ Key ${chalk.white(license.key)} revoked successfully.`));
282
+ console.log(chalk.gray(` ${license.devices.length} device(s) will be blocked on next verify.\n`));
283
+ });
284
+ // ── transfer-key ───────────────────────────────────────
285
+ admin
286
+ .command('transfer-key <key>')
287
+ .description('Transfer key (reset device bindings)')
288
+ .option('--device <code>', 'Remove specific device only')
289
+ .action((key, opts) => {
290
+ const store = loadStore();
291
+ const license = store.keys[key.toUpperCase()];
292
+ if (!license) {
293
+ console.log(chalk.red(`\n ✖ Key not found: ${key}\n`));
294
+ return;
295
+ }
296
+ if (opts.device) {
297
+ const idx = license.devices.findIndex(d => d.deviceCode === opts.device);
298
+ if (idx === -1) {
299
+ console.log(chalk.red(`\n ✖ Device ${opts.device} not found on this key.\n`));
300
+ return;
301
+ }
302
+ license.devices.splice(idx, 1);
303
+ console.log(chalk.green(`\n ✔ Device ${chalk.white(opts.device)} removed from ${chalk.white(license.key)}`));
304
+ }
305
+ else {
306
+ const count = license.devices.length;
307
+ license.devices = [];
308
+ console.log(chalk.green(`\n ✔ All ${count} device(s) removed from ${chalk.white(license.key)}`));
309
+ }
310
+ license.status = license.devices.length > 0 ? 'activated' : 'active';
311
+ saveStore(store);
312
+ console.log(chalk.gray(' Key is ready for new activation.\n'));
313
+ });
314
+ // ── stats ──────────────────────────────────────────────
315
+ admin
316
+ .command('stats')
317
+ .description('Show license statistics')
318
+ .action(() => {
319
+ const store = loadStore();
320
+ const keys = Object.values(store.keys);
321
+ const prices = { starter: 499000, pro: 999000, team: 2499000 };
322
+ const stats = {
323
+ total: keys.length,
324
+ starter: 0, pro: 0, team: 0,
325
+ active: 0, activated: 0, revoked: 0, expired: 0,
326
+ totalDevices: 0,
327
+ revenue: 0,
328
+ };
329
+ for (const k of keys) {
330
+ stats[k.tier]++;
331
+ stats[k.status]++;
332
+ stats.totalDevices += k.devices.length;
333
+ if (k.status !== 'revoked') {
334
+ stats.revenue += prices[k.tier];
335
+ }
336
+ }
337
+ const fmt = (n) => n.toLocaleString('vi-VN') + '₫';
338
+ console.log();
339
+ console.log(chalk.green.bold(' 📊 License Dashboard'));
340
+ console.log(chalk.gray(' ─────────────────────────────'));
341
+ console.log(` ${chalk.gray('Total Keys:')} ${chalk.white.bold(stats.total)}`);
342
+ console.log(` ${chalk.gray('Total Devices:')} ${chalk.white(stats.totalDevices)}`);
343
+ console.log();
344
+ console.log(chalk.gray(' By Tier:'));
345
+ console.log(` Starter: ${chalk.blue(stats.starter)}`);
346
+ console.log(` Pro: ${chalk.yellow(stats.pro)}`);
347
+ console.log(` Team: ${chalk.magenta(stats.team)}`);
348
+ console.log();
349
+ console.log(chalk.gray(' By Status:'));
350
+ console.log(` Active: ${chalk.blue(stats.active)} ${chalk.gray('(generated, not yet activated)')}`);
351
+ console.log(` Activated: ${chalk.green(stats.activated)}`);
352
+ console.log(` Revoked: ${chalk.red(stats.revoked)}`);
353
+ console.log(` Expired: ${chalk.gray(stats.expired)}`);
354
+ console.log();
355
+ console.log(` ${chalk.gray('Est. Revenue:')} ${chalk.green.bold(fmt(stats.revenue))}`);
356
+ console.log();
357
+ });
358
+ }
359
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/cli/commands/admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function authCommands(program: Command): void;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,QAuF5C"}