create-openclaw-bot 5.7.8 → 5.7.9

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/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  # 🦞 OpenClaw Setup
4
4
 
5
5
  <p align="center">
6
- <a href="https://github.com/tuanminhhole/openclaw-setup/releases"><img src="https://img.shields.io/badge/RELEASE-v5.7.8-0EA5E9?style=for-the-badge" alt="Version 5.7.8" /></a>
6
+ <a href="https://github.com/tuanminhhole/openclaw-setup/releases"><img src="https://img.shields.io/badge/RELEASE-v5.7.9-0EA5E9?style=for-the-badge" alt="Version 5.7.9" /></a>
7
7
  <a href="https://github.com/tuanminhhole/openclaw-setup?tab=MIT-1-ov-file"><img src="https://img.shields.io/badge/LICENSE-MIT-success?style=for-the-badge" alt="MIT License" /></a>
8
8
  <a href="https://www.npmjs.com/package/create-openclaw-bot"><img src="https://img.shields.io/npm/v/create-openclaw-bot?style=for-the-badge&label=CLI&color=2563EB&logo=npm&logoColor=white" alt="NPM Version" /></a>
9
9
  <a href="https://github.com/tuanminhhole/openclaw-setup/stargazers"><img src="https://img.shields.io/github/stars/tuanminhhole/openclaw-setup?style=for-the-badge&color=eab308&logo=github&logoColor=white" alt="GitHub Stars" /></a>
@@ -24,18 +24,16 @@ An interactive **CLI tool** and **Setup Wizard** to deploy your own free AI Bot
24
24
 
25
25
  ---
26
26
 
27
- ## 🆕 What's new in v5.7.8
27
+ ## 🆕 What's new in v5.7.9
28
28
 
29
- - 🧹 **Zalo Mod Plugin Cleanup** — Removed auto-injection of `zalo-mod` into generated configs. The plugin now must be installed manually via ClawHub, eliminating persistent installation loops and Docker permission conflicts.
30
- - 🔧 **Cleaner Docker Build** — `openclaw-zalo-mod` is no longer baked into the Docker image during build or runtime entrypoint, reducing image size and startup errors.
31
- - 📝 **Standardized Release Workflow** — Added `.agent/workflows/update.md` as the canonical release checklist for this repo.
29
+ - 🔧 **Rename Zalo Plugin Reference** — Updated internal string references from `zalo-mod` to `openclaw-zalo-mod` to align with the new NPM package identity.
32
30
 
33
31
  <details>
34
- <summary><b>Previous: What's new in v5.7.7</b></summary>
32
+ <summary><b>Previous: What's new in v5.7.8</b></summary>
35
33
 
36
- - 🛠️ **Infrastructure & Zalo Bot Stabilization** — Automatically pins `openclaw@2026.4.15` across all deployment scripts, eliminating gateway crashes caused by version mismatch when installing Zalo Personal.
37
- - 📦 **Docker Volume & Gateway Deadlock Optimization** Redesigned the `.openclaw` mount mechanism and implemented `tmpfs` for `plugin-runtime-deps`, preventing I/O lock conditions on Windows/WSL2.
38
- - 🔄 **9Router Smart-Sync** — Automatically detects and syncs models (Gemini, Claude, GPT) from active AI providers directly into the `smart-route` combination every time the system starts up.
34
+ - 🧹 **Zalo Mod Plugin Cleanup** — Removed auto-injection of `zalo-mod` into generated configs. The plugin now must be installed manually via ClawHub, eliminating persistent installation loops and Docker permission conflicts.
35
+ - 🔧 **Cleaner Docker Build** `openclaw-zalo-mod` is no longer baked into the Docker image during build or runtime entrypoint, reducing image size and startup errors.
36
+ - 📝 **Standardized Release Workflow** — Added `.agent/workflows/update.md` as the canonical release checklist for this repo.
39
37
 
40
38
  ## </details>
41
39
 
package/README.vi.md CHANGED
@@ -3,7 +3,7 @@
3
3
  # 🦞 OpenClaw Setup
4
4
 
5
5
  <p align="center">
6
- <a href="https://github.com/tuanminhhole/openclaw-setup/releases"><img src="https://img.shields.io/badge/RELEASE-v5.7.8-0EA5E9?style=for-the-badge" alt="Version 5.7.8" /></a>
6
+ <a href="https://github.com/tuanminhhole/openclaw-setup/releases"><img src="https://img.shields.io/badge/RELEASE-v5.7.9-0EA5E9?style=for-the-badge" alt="Version 5.7.9" /></a>
7
7
  <a href="https://github.com/tuanminhhole/openclaw-setup?tab=MIT-1-ov-file"><img src="https://img.shields.io/badge/LICENSE-MIT-success?style=for-the-badge" alt="MIT License" /></a>
8
8
  <a href="https://www.npmjs.com/package/create-openclaw-bot"><img src="https://img.shields.io/npm/v/create-openclaw-bot?style=for-the-badge&label=CLI&color=2563EB&logo=npm&logoColor=white" alt="NPM Version" /></a>
9
9
  <a href="https://github.com/tuanminhhole/openclaw-setup/stargazers"><img src="https://img.shields.io/github/stars/tuanminhhole/openclaw-setup?style=for-the-badge&color=eab308&logo=github&logoColor=white" alt="GitHub Stars" /></a>
@@ -24,18 +24,16 @@ Công cụ **CLI tương tác** và **Setup Wizard** để tự triển khai Bot
24
24
 
25
25
  ---
26
26
 
27
- ## 🆕 Có gì mới trong v5.7.8
27
+ ## 🆕 Có gì mới trong v5.7.9
28
28
 
29
- - 🧹 **Dọn dẹp Plugin Zalo Mod** — Gỡ bỏ auto-inject `zalo-mod` khỏi config được generate. Plugin giờ phải cài thủ công qua ClawHub, loại bỏ vòng lặp cài đặt liên tục và xung đột quyền trong Docker.
30
- - 🔧 **Docker Build Sạch Hơn** — `openclaw-zalo-mod` không còn được nhúng vào Docker image khi build hoặc trong entrypoint runtime, giảm kích thước image và lỗi khởi động.
31
- - 📝 **Chuẩn Hóa Workflow Release** — Thêm `.agent/workflows/update.md` làm checklist release chuẩn cho repo này.
29
+ - 🔧 **Cập nhật tham chiếu Plugin Zalo** — Đổi tên `zalo-mod` thành `openclaw-zalo-mod` trong các chuỗi sinh cấu hình test để đồng bộ với package mới.
32
30
 
33
31
  <details>
34
- <summary><b>Trước đó: Có gì mới ở v5.7.7</b></summary>
32
+ <summary><b>Trước đó: Có gì mới ở v5.7.8</b></summary>
35
33
 
36
- - 🛠️ **Ổn Định Infrastructure & Zalo Bot** — Tự động ghim `openclaw@2026.4.15` cho mọi nền tảng, loại bỏ hoàn toàn các lỗi crash do lệch version khi cài Zalo Personal.
37
- - 📦 **Tối Ưu Docker Volume & Gateway Deadlock** — Thiết kế lại chế mount thư mục `.openclaw` triển khai `tmpfs` cho `plugin-runtime-deps`, triệt để ngăn chặn tình trạng I/O lock trên Windows/WSL2.
38
- - 🔄 **9Router Smart-Sync** — Tự động nhận diện đồng bộ danh sách models (Gemini, Claude, GPT) từ các AI provider đang kích hoạt trực tiếp vào combo `smart-route` mỗi khi khởi động hệ thống.
34
+ - 🧹 **Dọn dẹp Plugin Zalo Mod** — Gỡ bỏ auto-inject `zalo-mod` khỏi config được generate. Plugin giờ phải cài thủ công qua ClawHub, loại bỏ vòng lặp cài đặt liên tục xung đột quyền trong Docker.
35
+ - 🔧 **Docker Build Sạch Hơn** — `openclaw-zalo-mod` không còn được nhúng vào Docker image khi build hoặc trong entrypoint runtime, giảm kích thước image lỗi khởi động.
36
+ - 📝 **Chuẩn Hóa Workflow Release** — Thêm `.agent/workflows/update.md` làm checklist release chuẩn cho repo này.
39
37
 
40
38
  ## </details>
41
39
 
package/dist/cli.js CHANGED
@@ -21,9 +21,9 @@ function loadSharedModule(modulePath, globalName) {
21
21
  }
22
22
 
23
23
  const {
24
- OPENCLAW_NPM_SPEC,
25
- OPENCLAW_RUNTIME_PACKAGES,
26
- NINE_ROUTER_PROXY_API_KEY,
24
+ OPENCLAW_NPM_SPEC,
25
+ OPENCLAW_RUNTIME_PACKAGES,
26
+ NINE_ROUTER_PROXY_API_KEY,
27
27
  NINE_ROUTER_API_BASE_URL,
28
28
  SMART_ROUTE_PROVIDER_MODELS,
29
29
  SMART_ROUTE_PROVIDER_ORDER,
@@ -615,10 +615,14 @@ function printNativeDashboardAccessInfo({ isVi, providerKey, projectDir, gateway
615
615
  }
616
616
  }
617
617
 
618
- function printZaloPersonalLoginInfo({ isVi, deployMode, projectDir }) {
619
- const nativeCmd = 'openclaw channels login --channel zalouser --verbose';
620
- const dockerCmd = 'docker exec -it openclaw-bot openclaw channels login --channel zalouser --verbose';
621
- const cmd = deployMode === 'native' ? nativeCmd : dockerCmd;
618
+ function printZaloPersonalLoginInfo({ isVi, deployMode, projectDir }) {
619
+ const nativeCmd = 'openclaw channels login --channel zalouser --verbose';
620
+ const dockerCmd = 'docker compose run --rm --no-deps ai-bot openclaw channels login --channel zalouser --verbose';
621
+ const dockerStopCmd = 'docker compose stop ai-bot';
622
+ const dockerStartCmd = 'docker compose up -d --force-recreate ai-bot';
623
+ const dockerStatusCmd = 'docker compose exec ai-bot openclaw channels status --probe';
624
+ const dockerReloginCmd = 'docker compose run --rm --no-deps ai-bot openclaw channels logout --channel zalouser && docker compose run --rm --no-deps ai-bot openclaw channels login --channel zalouser --verbose';
625
+ const cmd = deployMode === 'native' ? nativeCmd : dockerCmd;
622
626
  const qrPath = deployMode === 'native'
623
627
  ? path.join(os.tmpdir(), 'openclaw', 'openclaw-zalouser-qr-default.png')
624
628
  : '/tmp/openclaw/openclaw-zalouser-qr-default.png';
@@ -630,31 +634,40 @@ function printZaloPersonalLoginInfo({ isVi, deployMode, projectDir }) {
630
634
 
631
635
  console.log(chalk.yellow(`\n📱 ${isVi ? 'Đăng nhập Zalo Personal (1 lần):' : 'Zalo Personal login (one time):'}`));
632
636
  if (deployMode === 'docker') {
633
- console.log(chalk.white(isVi
634
- ? ` 1. cd ${projectDir}/docker/openclaw`
635
- : ` 1. cd ${projectDir}/docker/openclaw`));
636
- console.log(chalk.white(isVi
637
- ? ` 2. ${cmd}`
638
- : ` 2. ${cmd}`));
639
- console.log(chalk.white(isVi
640
- ? ` 3. Tìm file QR trong container: ${qrPath}`
641
- : ` 3. Find QR image in container: ${qrPath}`));
637
+ console.log(chalk.white(isVi
638
+ ? ` 1. cd ${projectDir}/docker/openclaw`
639
+ : ` 1. cd ${projectDir}/docker/openclaw`));
640
+ console.log(chalk.white(isVi
641
+ ? ` 2. ${dockerStopCmd}`
642
+ : ` 2. ${dockerStopCmd}`));
643
+ console.log(chalk.white(isVi
644
+ ? ` 3. ${cmd}`
645
+ : ` 3. ${cmd}`));
646
+ console.log(chalk.white(isVi
647
+ ? ` 4. Tìm file QR trong container: ${qrPath}`
648
+ : ` 4. Find QR image in container: ${qrPath}`));
642
649
  console.log(chalk.gray(isVi
643
650
  ? ` → Mở Docker Desktop > container openclaw-bot > tab Files > tìm file trên`
644
651
  : ` → Open Docker Desktop > container openclaw-bot > Files tab > find file above`));
645
652
  console.log(chalk.gray(isVi
646
653
  ? ` → Hoặc chạy: ${copyCmd}`
647
654
  : ` → Or run: ${copyCmd}`));
648
- console.log(chalk.white(isVi
649
- ? ' 4. Mở app Zalo > Quét QR > quét mã trong file QR'
650
- : ' 4. Open Zalo app > Scan QR > scan the QR image'));
651
- console.log(chalk.white(isVi
652
- ? ' 5. Đợi thấy "Login successful" trong terminal'
653
- : ' 5. Wait for "Login successful" in terminal'));
654
- console.log(chalk.white(isVi
655
- ? ' 6. docker compose restart'
656
- : ' 6. docker compose restart'));
657
- } else {
655
+ console.log(chalk.white(isVi
656
+ ? ' 5. Mở app Zalo > Quét QR > quét mã trong file QR'
657
+ : ' 5. Open Zalo app > Scan QR > scan the QR image'));
658
+ console.log(chalk.white(isVi
659
+ ? ' 6. Đợi thấy "Login successful" trong terminal'
660
+ : ' 6. Wait for "Login successful" in terminal'));
661
+ console.log(chalk.white(isVi
662
+ ? ` 7. ${dockerStartCmd}`
663
+ : ` 7. ${dockerStartCmd}`));
664
+ console.log(chalk.white(isVi
665
+ ? ` 8. ${dockerStatusCmd} # phải thấy: running`
666
+ : ` 8. ${dockerStatusCmd} # should show: running`));
667
+ console.log(chalk.gray(isVi
668
+ ? ` Nếu probe báo chưa auth: ${dockerReloginCmd}`
669
+ : ` If the probe says unauthenticated: ${dockerReloginCmd}`));
670
+ } else {
658
671
  console.log(chalk.white(` cd ${projectDir} ${process.platform === 'win32' ? ';' : '&&'} ${cmd}`));
659
672
  console.log(chalk.gray(isVi
660
673
  ? ` → File QR sẽ tạo tại: ${qrPath}`
@@ -2168,9 +2181,9 @@ async function main() {
2168
2181
  const skillInstallCmd = skillSlugs.length > 0
2169
2182
  ? skillSlugs.map(s => `ensure_skill ${s}`).join('\n')
2170
2183
  : '';
2171
- const relayInstallCmd = (isMultiBot && channelKey === 'telegram')
2172
- ? buildRelayPluginInstallCommand('openclaw')
2173
- : '';
2184
+ const relayInstallCmd = (isMultiBot && channelKey === 'telegram')
2185
+ ? buildRelayPluginInstallCommand('openclaw')
2186
+ : '';
2174
2187
  const deviceApproveLoop = 'while true; do sleep 5; openclaw devices approve --latest 2>/dev/null || true; done >/dev/null 2>&1 &';
2175
2188
 
2176
2189
  // buildDockerArtifacts joins runtimeCommandParts with spaces, then appends 'openclaw gateway run'
@@ -82,7 +82,7 @@
82
82
  historyLimit: 50,
83
83
  },
84
84
  },
85
- pluginInstall: '@openclaw/zalouser',
85
+ pluginInstall: '',
86
86
  },
87
87
  };
88
88
 
@@ -189,7 +189,7 @@
189
189
  cfg.skills = { entries: skillEntries };
190
190
  }
191
191
 
192
- // ── plugins (memory-core dreaming + zalo-mod) ────────────────────────────
192
+ // ── plugins (memory-core dreaming + openclaw-zalo-mod) ────────────────────────────
193
193
  const pluginsConfig = buildPluginsConfig({
194
194
  channelKey,
195
195
  selectedSkills,
@@ -1,6 +1,6 @@
1
1
  // @ts-nocheck
2
2
  (function (root) {
3
- const OPENCLAW_NPM_SPEC = 'openclaw@2026.4.15';
3
+ const OPENCLAW_NPM_SPEC = 'openclaw@2026.5.4';
4
4
  const OPENCLAW_RUNTIME_PACKAGES = 'grammy @grammyjs/runner @grammyjs/transformer-throttler @buape/carbon @larksuiteoapi/node-sdk @slack/web-api';
5
5
  const NINE_ROUTER_NPM_SPEC = '9router@latest';
6
6
  const NINE_ROUTER_PORT = 20128;
@@ -186,7 +186,7 @@ if(touched){console.log('[patch-9router] Applied Codex compatibility patch.');}e
186
186
 
187
187
  } = options;
188
188
 
189
- const browserAptExtra = hasBrowser ? ' xvfb socat' : '';
189
+ const browserAptExtra = hasBrowser ? ' xvfb socat' : '';
190
190
  const browserInstallLines = hasBrowser && emitBrowserInstall
191
191
  ? [
192
192
  '',
@@ -264,7 +264,7 @@ if(touched){console.log('[patch-9router] Applied Codex compatibility patch.');}e
264
264
  const runtimeScriptB64 = encodeBase64Utf8(runtimeScript);
265
265
  const dockerfile = `FROM node:22-slim
266
266
 
267
- RUN apt-get update && apt-get install -y git curl${browserAptExtra} && rm -rf /var/lib/apt/lists/*
267
+ RUN apt-get update && apt-get install -y git curl python3${browserAptExtra} && rm -rf /var/lib/apt/lists/*
268
268
  ${browserInstallLines}
269
269
  ARG OPENCLAW_VER="${openClawNpmSpec}"
270
270
  ARG CACHE_BUST=""
@@ -348,8 +348,8 @@ const CDP_URL = 'http://127.0.0.1:9222';
348
348
 
349
349
  const zaloModSection = hasZaloMod
350
350
  ? (isVi
351
- ? `\n\n## 💬 Zalo Group — Slash Commands (xử lý bởi plugin)\n\nPlugin \`zalo-mod\` tự động xử lý các slash command sau trong group. Bot KHÔNG cần reply cho chúng:\n\n| Command | Mô tả |\n|---------|-------|\n| \`/rules status\` | Xem cấu hình bot |\n| \`/rules silent-on/off\` | Bật/tắt silent mode |\n| \`/rules welcome-on/off\` | Bật/tắt welcome message |\n| \`/rules tracking-on/off\` | Bật/tắt ghi log chat |\n| \`/noi-quy\` | Hiện nội quy group |\n| \`/menu\` | Danh sách lệnh |\n| \`/groupid\` | Scan và cập nhật config |\n| \`/report\` | Báo cáo hoạt động group |\n\n### Zalo Sticker & Media\n- Sticker Zalo gửi dạng JSON → plugin tự convert thành \`[Sticker]\`\n- Ảnh/video/file trong group: zalouser channel chỉ forward text, media bị drop`
352
- : `\n\n## 💬 Zalo Group — Slash Commands (handled by plugin)\n\nThe \`zalo-mod\` plugin automatically handles these slash commands in group. Bot does NOT need to reply:\n\n| Command | Description |\n|---------|-------------|\n| \`/rules status\` | View bot config |\n| \`/rules silent-on/off\` | Toggle silent mode |\n| \`/rules welcome-on/off\` | Toggle welcome message |\n| \`/rules tracking-on/off\` | Toggle chat logging |\n| \`/noi-quy\` | Show group rules |\n| \`/menu\` | List commands |\n| \`/groupid\` | Scan and update config |\n| \`/report\` | Group activity report |\n\n### Zalo Sticker & Media\n- Zalo stickers arrive as JSON → plugin auto-converts to \`[Sticker]\`\n- Images/videos/files in groups: zalouser channel only forwards text, media is dropped`)
351
+ ? `\n\n## 💬 Zalo Group — Slash Commands (xử lý bởi plugin)\n\nPlugin \`openclaw-zalo-mod\` tự động xử lý các slash command sau trong group. Bot KHÔNG cần reply cho chúng:\n\n| Command | Mô tả |\n|---------|-------|\n| \`/rules status\` | Xem cấu hình bot |\n| \`/rules silent-on/off\` | Bật/tắt silent mode |\n| \`/rules welcome-on/off\` | Bật/tắt welcome message |\n| \`/rules tracking-on/off\` | Bật/tắt ghi log chat |\n| \`/noi-quy\` | Hiện nội quy group |\n| \`/menu\` | Danh sách lệnh |\n| \`/groupid\` | Scan và cập nhật config |\n| \`/report\` | Báo cáo hoạt động group |\n\n### Zalo Sticker & Media\n- Sticker Zalo gửi dạng JSON → plugin tự convert thành \`[Sticker]\`\n- Ảnh/video/file trong group: zalouser channel chỉ forward text, media bị drop`
352
+ : `\n\n## 💬 Zalo Group — Slash Commands (handled by plugin)\n\nThe \`openclaw-zalo-mod\` plugin automatically handles these slash commands in group. Bot does NOT need to reply:\n\n| Command | Description |\n|---------|-------------|\n| \`/rules status\` | View bot config |\n| \`/rules silent-on/off\` | Toggle silent mode |\n| \`/rules welcome-on/off\` | Toggle welcome message |\n| \`/rules tracking-on/off\` | Toggle chat logging |\n| \`/noi-quy\` | Show group rules |\n| \`/menu\` | List commands |\n| \`/groupid\` | Scan and update config |\n| \`/report\` | Group activity report |\n\n### Zalo Sticker & Media\n- Zalo stickers arrive as JSON → plugin auto-converts to \`[Sticker]\`\n- Images/videos/files in groups: zalouser channel only forwards text, media is dropped`)
353
353
  : '';
354
354
 
355
355
  const dmOverride = isVi
package/dist/setup.js CHANGED
@@ -297,7 +297,7 @@
297
297
  historyLimit: 50,
298
298
  },
299
299
  },
300
- pluginInstall: '@openclaw/zalouser',
300
+ pluginInstall: '',
301
301
  },
302
302
  };
303
303
 
@@ -619,7 +619,7 @@
619
619
  // ── Shared runtime constants, relay helpers, auth profile builders (setup/shared/common-gen.js)
620
620
  // @ts-nocheck
621
621
  (function (root) {
622
- const OPENCLAW_NPM_SPEC = 'openclaw@2026.4.15';
622
+ const OPENCLAW_NPM_SPEC = 'openclaw@2026.5.4';
623
623
  const OPENCLAW_RUNTIME_PACKAGES = 'grammy @grammyjs/runner @grammyjs/transformer-throttler @buape/carbon @larksuiteoapi/node-sdk @slack/web-api';
624
624
  const NINE_ROUTER_NPM_SPEC = '9router@latest';
625
625
  const NINE_ROUTER_PORT = 20128;
@@ -1284,8 +1284,8 @@ const CDP_URL = 'http://127.0.0.1:9222';
1284
1284
 
1285
1285
  const zaloModSection = hasZaloMod
1286
1286
  ? (isVi
1287
- ? `\n\n## 💬 Zalo Group — Slash Commands (xử lý bởi plugin)\n\nPlugin \`zalo-mod\` tự động xử lý các slash command sau trong group. Bot KHÔNG cần reply cho chúng:\n\n| Command | Mô tả |\n|---------|-------|\n| \`/rules status\` | Xem cấu hình bot |\n| \`/rules silent-on/off\` | Bật/tắt silent mode |\n| \`/rules welcome-on/off\` | Bật/tắt welcome message |\n| \`/rules tracking-on/off\` | Bật/tắt ghi log chat |\n| \`/noi-quy\` | Hiện nội quy group |\n| \`/menu\` | Danh sách lệnh |\n| \`/groupid\` | Scan và cập nhật config |\n| \`/report\` | Báo cáo hoạt động group |\n\n### Zalo Sticker & Media\n- Sticker Zalo gửi dạng JSON → plugin tự convert thành \`[Sticker]\`\n- Ảnh/video/file trong group: zalouser channel chỉ forward text, media bị drop`
1288
- : `\n\n## 💬 Zalo Group — Slash Commands (handled by plugin)\n\nThe \`zalo-mod\` plugin automatically handles these slash commands in group. Bot does NOT need to reply:\n\n| Command | Description |\n|---------|-------------|\n| \`/rules status\` | View bot config |\n| \`/rules silent-on/off\` | Toggle silent mode |\n| \`/rules welcome-on/off\` | Toggle welcome message |\n| \`/rules tracking-on/off\` | Toggle chat logging |\n| \`/noi-quy\` | Show group rules |\n| \`/menu\` | List commands |\n| \`/groupid\` | Scan and update config |\n| \`/report\` | Group activity report |\n\n### Zalo Sticker & Media\n- Zalo stickers arrive as JSON → plugin auto-converts to \`[Sticker]\`\n- Images/videos/files in groups: zalouser channel only forwards text, media is dropped`)
1287
+ ? `\n\n## 💬 Zalo Group — Slash Commands (xử lý bởi plugin)\n\nPlugin \`openclaw-zalo-mod\` tự động xử lý các slash command sau trong group. Bot KHÔNG cần reply cho chúng:\n\n| Command | Mô tả |\n|---------|-------|\n| \`/rules status\` | Xem cấu hình bot |\n| \`/rules silent-on/off\` | Bật/tắt silent mode |\n| \`/rules welcome-on/off\` | Bật/tắt welcome message |\n| \`/rules tracking-on/off\` | Bật/tắt ghi log chat |\n| \`/noi-quy\` | Hiện nội quy group |\n| \`/menu\` | Danh sách lệnh |\n| \`/groupid\` | Scan và cập nhật config |\n| \`/report\` | Báo cáo hoạt động group |\n\n### Zalo Sticker & Media\n- Sticker Zalo gửi dạng JSON → plugin tự convert thành \`[Sticker]\`\n- Ảnh/video/file trong group: zalouser channel chỉ forward text, media bị drop`
1288
+ : `\n\n## 💬 Zalo Group — Slash Commands (handled by plugin)\n\nThe \`openclaw-zalo-mod\` plugin automatically handles these slash commands in group. Bot does NOT need to reply:\n\n| Command | Description |\n|---------|-------------|\n| \`/rules status\` | View bot config |\n| \`/rules silent-on/off\` | Toggle silent mode |\n| \`/rules welcome-on/off\` | Toggle welcome message |\n| \`/rules tracking-on/off\` | Toggle chat logging |\n| \`/noi-quy\` | Show group rules |\n| \`/menu\` | List commands |\n| \`/groupid\` | Scan and update config |\n| \`/report\` | Group activity report |\n\n### Zalo Sticker & Media\n- Zalo stickers arrive as JSON → plugin auto-converts to \`[Sticker]\`\n- Images/videos/files in groups: zalouser channel only forwards text, media is dropped`)
1289
1289
  : '';
1290
1290
 
1291
1291
  const dmOverride = isVi
@@ -1627,7 +1627,7 @@ if (typeof exports !== 'undefined' && workspaceRoot.__openclawWorkspace) {
1627
1627
  cfg.skills = { entries: skillEntries };
1628
1628
  }
1629
1629
 
1630
- // ── plugins (memory-core dreaming + zalo-mod) ────────────────────────────
1630
+ // ── plugins (memory-core dreaming + openclaw-zalo-mod) ────────────────────────────
1631
1631
  const pluginsConfig = buildPluginsConfig({
1632
1632
  channelKey,
1633
1633
  selectedSkills,
@@ -2734,7 +2734,7 @@ if(touched){console.log('[patch-9router] Applied Codex compatibility patch.');}e
2734
2734
  const runtimeScriptB64 = encodeBase64Utf8(runtimeScript);
2735
2735
  const dockerfile = `FROM node:22-slim
2736
2736
 
2737
- RUN apt-get update && apt-get install -y git curl${browserAptExtra} && rm -rf /var/lib/apt/lists/*
2737
+ RUN apt-get update && apt-get install -y git curl python3${browserAptExtra} && rm -rf /var/lib/apt/lists/*
2738
2738
  ${browserInstallLines}
2739
2739
  ARG OPENCLAW_VER="${openClawNpmSpec}"
2740
2740
  ARG CACHE_BUST=""
@@ -3804,21 +3804,31 @@ New-Item -ItemType Directory -Force -Path "$projectDir" | Out-Null
3804
3804
  ps += `Write-Host "" -ForegroundColor White\n`;
3805
3805
  ps += `Write-Host "${isVi ? 'Huong dan dang nhap Zalo:' : 'Zalo login instructions:'}" -ForegroundColor White\n`;
3806
3806
  ps += `Write-Host " ${isVi ? '1. cd docker\\\\openclaw' : '1. cd docker\\\\openclaw'}" -ForegroundColor White\n`;
3807
- ps += `Write-Host " ${isVi ? `2. docker exec -it ${containerName} openclaw channels login --channel zalouser --verbose` : `2. docker exec -it ${containerName} openclaw channels login --channel zalouser --verbose`}" -ForegroundColor White\n`;
3807
+ ps += `Write-Host " ${isVi ? '2. docker compose stop ai-bot' : '2. docker compose stop ai-bot'}" -ForegroundColor White\n`;
3808
+ ps += `Write-Host " ${isVi ? '3. docker compose run --rm --no-deps ai-bot openclaw channels login --channel zalouser --verbose' : '3. docker compose run --rm --no-deps ai-bot openclaw channels login --channel zalouser --verbose'}" -ForegroundColor White\n`;
3808
3809
  ps += `Write-Host " ${isVi ? `3. Mo Docker Desktop > container ${containerName} > tab Files > tim file: ${qrPath}` : `3. Open Docker Desktop > container ${containerName} > Files tab > find: ${qrPath}`}" -ForegroundColor White\n`;
3809
3810
  ps += `Write-Host " ${isVi ? ` Hoac chay: docker cp ${containerName}:${qrPath} ./zalo-qr.png` : ` Or run: docker cp ${containerName}:${qrPath} ./zalo-qr.png`}" -ForegroundColor White\n`;
3810
3811
  ps += `Write-Host " ${isVi ? '4. Mo app Zalo > Quet QR > quet ma trong file QR' : '4. Open Zalo app > Scan QR > scan the QR image'}" -ForegroundColor White\n`;
3811
3812
  ps += `Write-Host " ${isVi ? '5. Doi thay chu Login successful trong terminal' : '5. Wait for Login successful in terminal'}" -ForegroundColor White\n`;
3812
- ps += `Write-Host " ${isVi ? '6. Restart container: docker compose restart' : '6. Restart container: docker compose restart'}" -ForegroundColor White\n`;
3813
+ ps += `Write-Host " ${isVi ? '6. docker compose up -d --force-recreate ai-bot' : '6. docker compose up -d --force-recreate ai-bot'}" -ForegroundColor White\n`;
3814
+ ps += `Write-Host " ${isVi ? '7. Kiem tra: docker compose exec ai-bot openclaw channels status --probe (phai thay running)' : '7. Verify: docker compose exec ai-bot openclaw channels status --probe (should show running)'}" -ForegroundColor White\n`;
3813
3815
  ps += `Write-Host "" -ForegroundColor White\n`;
3814
- ps += `Write-Host "${isVi ? 'Dung gateway de login...' : 'Stopping gateway for login...'}" -ForegroundColor Yellow\\n`;
3815
- ps += `& docker exec ${containerName} openclaw gateway stop 2>$null\\n`;
3816
- ps += `Start-Sleep -Seconds 3\\n`;
3816
+ ps += `Write-Host "${isVi ? 'Dung app container de login one-shot...' : 'Stopping the app container for one-shot login...'}" -ForegroundColor Yellow\\n`;
3817
+ ps += `& docker compose stop ai-bot\\n`;
3817
3818
  ps += `Write-Host "${isVi ? 'Dang chay lenh login...' : 'Running login command...'}" -ForegroundColor Yellow\n`;
3818
- ps += `& docker exec -it ${containerName} openclaw channels login --channel zalouser --verbose\n`;
3819
+ ps += `& docker compose run --rm --no-deps ai-bot openclaw channels login --channel zalouser --verbose\n`;
3819
3820
  ps += `Write-Host "" -ForegroundColor White\n`;
3820
- ps += `Write-Host "${isVi ? 'Restart container de ap dung...' : 'Restarting container to apply...'}" -ForegroundColor Green\n`;
3821
- ps += `& docker compose restart\n`;
3821
+ ps += `Write-Host "${isVi ? 'Recreate app container de nap session Zalo...' : 'Recreating the app container to load the Zalo session...'}" -ForegroundColor Green\n`;
3822
+ ps += `& docker compose up -d --force-recreate ai-bot\n`;
3823
+ ps += `Start-Sleep -Seconds 30\n`;
3824
+ ps += `$statusOut = (& docker compose exec ai-bot openclaw channels status --probe) -join "\n"\n`;
3825
+ ps += `Write-Host $statusOut\n`;
3826
+ ps += `if ($statusOut -notmatch 'running') {\n`;
3827
+ ps += ` Write-Host "${isVi ? 'Channel chua running, recreate container ai-bot...' : 'Channel is not running; recreating ai-bot container...'}" -ForegroundColor Yellow\n`;
3828
+ ps += ` & docker compose up -d --force-recreate ai-bot\n`;
3829
+ ps += ` Start-Sleep -Seconds 30\n`;
3830
+ ps += ` & docker compose exec ai-bot openclaw channels status --probe\n`;
3831
+ ps += `}\n`;
3822
3832
  }
3823
3833
 
3824
3834
  ps += `} catch { Write-Host $_.Exception.Message -ForegroundColor Red }\nRead-Host "${isVi ? 'Nhan Enter de thoat' : 'Press Enter to exit'}"\n`;
@@ -3863,9 +3873,10 @@ echo ""
3863
3873
  const containerName = 'openclaw-bot';
3864
3874
  const qrPath = '/tmp/openclaw/openclaw-zalouser-qr-default.png';
3865
3875
  script += `\necho ""\necho "${isVi ? '=== DANG NHAP ZALO ===' : '=== ZALO LOGIN ==='}"\necho "${isVi ? 'Doi container khoi dong 10 giay...' : 'Waiting 10s for container to start...'}"\nsleep 10\n`;
3866
- script += `echo "${isVi ? 'Huong dan dang nhap Zalo:' : 'Zalo login instructions:'}"\necho " ${isVi ? '1. cd docker/openclaw' : '1. cd docker/openclaw'}"\necho " 2. docker exec -it ${containerName} openclaw channels login --channel zalouser --verbose"\necho " ${isVi ? `3. Tim file QR trong container: ${qrPath}` : `3. Find QR image in container: ${qrPath}`}"\necho " ${isVi ? ` Hoac chay: docker cp ${containerName}:${qrPath} ./zalo-qr.png` : ` Or run: docker cp ${containerName}:${qrPath} ./zalo-qr.png`}"\necho " ${isVi ? '4. Mo app Zalo > Quet QR > quet ma' : '4. Open Zalo app > Scan QR > scan'}"\necho " ${isVi ? '5. Doi thay Login successful' : '5. Wait for Login successful'}"\necho " ${isVi ? '6. Restart: docker compose restart' : '6. Restart: docker compose restart'}"\necho ""\n`;
3867
- script += `docker exec -it ${containerName} openclaw channels login --channel zalouser --verbose\n`;
3868
- script += `echo "${isVi ? 'Restart container...' : 'Restarting container...'}"\ndocker compose restart\n`;
3876
+ script += `echo "${isVi ? 'Huong dan dang nhap Zalo:' : 'Zalo login instructions:'}"\necho " ${isVi ? '1. cd docker/openclaw' : '1. cd docker/openclaw'}"\necho " ${isVi ? '2. docker compose stop ai-bot' : '2. docker compose stop ai-bot'}"\necho " 3. docker compose run --rm --no-deps ai-bot openclaw channels login --channel zalouser --verbose"\necho " ${isVi ? `4. Tim file QR trong container: ${qrPath}` : `4. Find QR image in container: ${qrPath}`}"\necho " ${isVi ? ` Hoac chay: docker cp ${containerName}:${qrPath} ./zalo-qr.png` : ` Or run: docker cp ${containerName}:${qrPath} ./zalo-qr.png`}"\necho " ${isVi ? '5. Mo app Zalo > Quet QR > quet ma' : '5. Open Zalo app > Scan QR > scan'}"\necho " ${isVi ? '6. Doi thay Login successful' : '6. Wait for Login successful'}"\necho " ${isVi ? '7. Start lai: docker compose up -d --force-recreate ai-bot' : '7. Start again: docker compose up -d --force-recreate ai-bot'}"\necho " ${isVi ? '8. Kiem tra: docker compose exec ai-bot openclaw channels status --probe (phai thay running)' : '8. Verify: docker compose exec ai-bot openclaw channels status --probe (should show running)'}"\necho ""\n`;
3877
+ script += `docker compose stop ai-bot\n`;
3878
+ script += `docker compose run --rm --no-deps ai-bot openclaw channels login --channel zalouser --verbose\n`;
3879
+ script += `echo "${isVi ? 'Recreate container de nap session Zalo...' : 'Recreating container to load the Zalo session...'}"\ndocker compose up -d --force-recreate ai-bot\nsleep 30\nSTATUS="$(docker compose exec ai-bot openclaw channels status --probe || true)"\necho "$STATUS"\nif ! printf '%s' "$STATUS" | grep -q running; then\n echo "${isVi ? 'Channel van chua running. Hay logout/login lai bang compose run one-shot.' : 'Channel is still not running. Re-run logout/login with compose run one-shot.'}"\nfi\n`;
3869
3880
  }
3870
3881
 
3871
3882
  return script;
@@ -4125,20 +4136,29 @@ function generateMacOsSh(ctx) {
4125
4136
  sh.push('echo "=== DANG NHAP ZALO ==="');
4126
4137
  sh.push('echo "Doi container khoi dong 10 giay..."');
4127
4138
  sh.push('sleep 10');
4128
- sh.push('echo "Dung gateway de login..."');
4129
- sh.push(`docker exec ${containerName} openclaw gateway stop 2>/dev/null || true`);
4130
- sh.push('sleep 3');
4139
+ sh.push('echo "Dung app container de login one-shot..."');
4140
+ sh.push('$COMPOSE stop ai-bot');
4131
4141
  sh.push('echo "Huong dan dang nhap Zalo:"');
4132
4142
  sh.push(`echo " 1. cd docker/openclaw"`);
4133
- sh.push(`echo " 2. docker exec -it ${containerName} openclaw channels login --channel zalouser --verbose"`);
4134
- sh.push(`echo " 3. Tim file QR trong container: ${qrPath}"`);
4143
+ sh.push(`echo " 2. docker compose stop ai-bot"`);
4144
+ sh.push(`echo " 3. docker compose run --rm --no-deps ai-bot openclaw channels login --channel zalouser --verbose"`);
4145
+ sh.push(`echo " 4. Tim file QR trong container: ${qrPath}"`);
4135
4146
  sh.push(`echo " Hoac chay: docker cp ${containerName}:${qrPath} ./zalo-qr.png"`);
4136
- sh.push('echo " 4. Mo app Zalo > Quet QR > quet ma"');
4137
- sh.push('echo " 5. Doi thay Login successful"');
4138
- sh.push('echo " 6. Restart: $COMPOSE restart"');
4147
+ sh.push('echo " 5. Mo app Zalo > Quet QR > quet ma"');
4148
+ sh.push('echo " 6. Doi thay Login successful"');
4149
+ sh.push('echo " 7. Script se recreate container de nap session Zalo vua tao"');
4139
4150
  sh.push('echo ""');
4140
- sh.push(`docker exec -it ${containerName} openclaw channels login --channel zalouser --verbose || true`);
4141
- sh.push('$COMPOSE restart');
4151
+ sh.push(`$COMPOSE run --rm --no-deps ai-bot openclaw channels login --channel zalouser --verbose || true`);
4152
+ sh.push(`$COMPOSE up -d --force-recreate ai-bot`);
4153
+ sh.push('sleep 30');
4154
+ sh.push(`STATUS="$($COMPOSE exec ai-bot openclaw channels status --probe || true)"`);
4155
+ sh.push('echo "$STATUS"');
4156
+ sh.push('if ! printf "%s" "$STATUS" | grep -q running; then');
4157
+ sh.push(' echo "Channel chua running, recreate container ai-bot..."');
4158
+ sh.push(' $COMPOSE up -d --force-recreate ai-bot');
4159
+ sh.push(' sleep 30');
4160
+ sh.push(` $COMPOSE exec ai-bot openclaw channels status --probe || true`);
4161
+ sh.push('fi');
4142
4162
  }
4143
4163
  sh.push('echo "\u2705 Bot dang chay via Docker. Xem log: docker logs -f openclaw-bot"');
4144
4164
  scriptContent = sh.filter(Boolean).join('\n');
@@ -5930,7 +5950,7 @@ model:
5930
5950
  runtimeCommandParts: [
5931
5951
  pluginInstallCmd,
5932
5952
  'while true; do sleep 5; openclaw devices approve --latest 2>/dev/null || true; done >/dev/null 2>&1 &'
5933
- ],
5953
+ ].filter(Boolean),
5934
5954
  plainSingleExtraHosts: true,
5935
5955
  multiOllamaNumParallel: 1,
5936
5956
  singleOllamaNumParallel: 1,
@@ -6590,33 +6610,38 @@ fi
6590
6610
  // ========== Zalo Personal Login Guide (post-setup) ==========
6591
6611
  function generateZaloOnboardGuide() {
6592
6612
  const lang = document.getElementById('cfg-language')?.value || 'vi';
6593
- setOutput('out-zalo-onboard-cmd', `docker compose exec -it ai-bot openclaw channels login --channel zalouser --verbose`);
6613
+ setOutput('out-zalo-onboard-cmd', `docker compose stop ai-bot
6614
+ docker compose run --rm --no-deps ai-bot openclaw channels login --channel zalouser --verbose
6615
+ docker compose up -d --force-recreate ai-bot
6616
+ docker compose exec ai-bot openclaw channels status --probe`);
6594
6617
 
6595
6618
  if (lang === 'vi') {
6596
6619
  setOutput('out-zalo-onboard-guide', `┌─────────────────────────────────────────────────────┐
6597
6620
  │ Chạy lệnh bên trái để OpenClaw tạo QR đăng nhập. │
6598
6621
  ├─────────────────────────────────────────────────────┤
6599
6622
  │ 1. Đảm bảo container/gateway đã chạy xong. │
6600
- │ 2. Chạy lệnh login để tạo QR cho zalouser.
6623
+ │ 2. Stop ai-bot, login bằng compose run one-shot.
6601
6624
  │ 3. OpenClaw sẽ in ra đường dẫn file QR trong /tmp. │
6602
6625
  │ 4. Copy file QR ra ngoài nếu cần: │
6603
- │ docker compose cp ai-bot:/tmp/openclaw/
6626
+ │ docker cp openclaw-bot:/tmp/openclaw/
6604
6627
  │ openclaw-zalouser-qr-default.png . │
6605
6628
  │ 5. Mở ảnh QR → quét bằng app Zalo → xác nhận. │
6606
- │ 6. Sau khi login xong, restart bot nếu cần.
6629
+ │ 6. Start lại: docker compose up -d --force-recreate
6630
+ │ 7. Chạy channels status --probe, phải thấy running.│
6607
6631
  └─────────────────────────────────────────────────────┘`);
6608
6632
  } else {
6609
6633
  setOutput('out-zalo-onboard-guide', `┌─────────────────────────────────────────────────────┐
6610
6634
  │ Run the command on the left to generate a Zalo QR. │
6611
6635
  ├─────────────────────────────────────────────────────┤
6612
6636
  │ 1. Make sure the container/gateway is already up. │
6613
- │ 2. Run the login command for zalouser.
6637
+ │ 2. Stop ai-bot; login with compose run one-shot.
6614
6638
  │ 3. OpenClaw prints the QR image path under /tmp. │
6615
6639
  │ 4. Copy the QR out if needed: │
6616
- │ docker compose cp ai-bot:/tmp/openclaw/
6640
+ │ docker cp openclaw-bot:/tmp/openclaw/
6617
6641
  │ openclaw-zalouser-qr-default.png . │
6618
6642
  │ 5. Open the image → scan with Zalo mobile app. │
6619
- │ 6. Restart the bot afterwards if needed.
6643
+ │ 6. Start again: docker compose up -d --force-re...
6644
+ │ 7. Run channels status --probe; it should run. │
6620
6645
  └─────────────────────────────────────────────────────┘`);
6621
6646
  }
6622
6647
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-openclaw-bot",
3
- "version": "5.7.8",
3
+ "version": "5.7.9",
4
4
  "description": "Interactive CLI installer for OpenClaw Bot",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {