create-openclaw-bot 5.7.7 → 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 +7 -9
- package/README.vi.md +7 -9
- package/dist/cli.js +41 -32
- package/dist/setup/data/channels.js +1 -1
- package/dist/setup/shared/bot-config-gen.js +3 -15
- package/dist/setup/shared/common-gen.js +1 -1
- package/dist/setup/shared/docker-gen.js +2 -2
- package/dist/setup/shared/workspace-gen.js +2 -2
- package/dist/setup.js +62 -67
- package/package.json +1 -1
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.
|
|
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.
|
|
27
|
+
## 🆕 What's new in v5.7.9
|
|
28
28
|
|
|
29
|
-
-
|
|
30
|
-
- 📦 **Docker Volume & Gateway Deadlock Optimization** — Redesigned the `.openclaw` mount mechanism and implemented `tmpfs` for `plugin-runtime-deps`, entirely preventing I/O lock conditions on Windows/WSL2.
|
|
31
|
-
- 🔄 **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.
|
|
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.
|
|
32
|
+
<summary><b>Previous: What's new in v5.7.8</b></summary>
|
|
35
33
|
|
|
36
|
-
- 🧹 **
|
|
37
|
-
-
|
|
38
|
-
-
|
|
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.
|
|
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.
|
|
27
|
+
## 🆕 Có gì mới trong v5.7.9
|
|
28
28
|
|
|
29
|
-
-
|
|
30
|
-
- 📦 **Tối Ưu Docker Volume & Gateway Deadlock** — Thiết kế lại cơ chế mount thư mục `.openclaw` và 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.
|
|
31
|
-
- 🔄 **9Router Smart-Sync** — Tự động nhận diện và đồ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.
|
|
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 và test để đồng bộ với package mới.
|
|
32
30
|
|
|
33
31
|
<details>
|
|
34
|
-
<summary><b>Trước đó: Có gì mới ở v5.7.
|
|
32
|
+
<summary><b>Trước đó: Có gì mới ở v5.7.8</b></summary>
|
|
35
33
|
|
|
36
|
-
- 🧹 **
|
|
37
|
-
-
|
|
38
|
-
-
|
|
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 và 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 và 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
|
|
621
|
-
const
|
|
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. ${
|
|
638
|
-
: ` 2. ${
|
|
639
|
-
console.log(chalk.white(isVi
|
|
640
|
-
? ` 3.
|
|
641
|
-
: ` 3.
|
|
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
|
-
? '
|
|
650
|
-
: '
|
|
651
|
-
console.log(chalk.white(isVi
|
|
652
|
-
? '
|
|
653
|
-
: '
|
|
654
|
-
console.log(chalk.white(isVi
|
|
655
|
-
?
|
|
656
|
-
:
|
|
657
|
-
|
|
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,11 +2181,8 @@ 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
|
-
: '';
|
|
2174
|
-
const zaloModInstallCmd = hasZaloPersonal(channelKey)
|
|
2175
|
-
? 'ensure_plugin zalo-mod openclaw-zalo-mod'
|
|
2184
|
+
const relayInstallCmd = (isMultiBot && channelKey === 'telegram')
|
|
2185
|
+
? buildRelayPluginInstallCommand('openclaw')
|
|
2176
2186
|
: '';
|
|
2177
2187
|
const deviceApproveLoop = 'while true; do sleep 5; openclaw devices approve --latest 2>/dev/null || true; done >/dev/null 2>&1 &';
|
|
2178
2188
|
|
|
@@ -2188,7 +2198,6 @@ async function main() {
|
|
|
2188
2198
|
selectedModel: modelsPrimary,
|
|
2189
2199
|
agentId,
|
|
2190
2200
|
runtimeCommandParts: [
|
|
2191
|
-
zaloModInstallCmd,
|
|
2192
2201
|
relayInstallCmd,
|
|
2193
2202
|
skillInstallCmd,
|
|
2194
2203
|
deviceApproveLoop,
|
|
@@ -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,
|
|
@@ -305,21 +305,9 @@
|
|
|
305
305
|
|
|
306
306
|
const allow = ['memory-core'];
|
|
307
307
|
|
|
308
|
-
// zalo-mod
|
|
308
|
+
// Zalo Personal channel is native; install openclaw-zalo-mod manually via ClawHub when needed.
|
|
309
309
|
if (isZaloPersonal(channelKey)) {
|
|
310
|
-
allow.push('
|
|
311
|
-
entries['zalo-mod'] = {
|
|
312
|
-
enabled: true,
|
|
313
|
-
config: {
|
|
314
|
-
botName: botName,
|
|
315
|
-
ownerId: "",
|
|
316
|
-
groupNames: {},
|
|
317
|
-
zaloDisplayNames: [botName],
|
|
318
|
-
welcomeEnabled: true,
|
|
319
|
-
spamRepeatN: 3,
|
|
320
|
-
spamWindowSeconds: 300,
|
|
321
|
-
},
|
|
322
|
-
};
|
|
310
|
+
allow.push('zalouser');
|
|
323
311
|
}
|
|
324
312
|
|
|
325
313
|
const plugins = { entries };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
(function (root) {
|
|
3
|
-
const OPENCLAW_NPM_SPEC = 'openclaw@2026.4
|
|
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: '
|
|
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
|
|
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,
|
|
@@ -1743,21 +1743,9 @@ if (typeof exports !== 'undefined' && workspaceRoot.__openclawWorkspace) {
|
|
|
1743
1743
|
|
|
1744
1744
|
const allow = ['memory-core'];
|
|
1745
1745
|
|
|
1746
|
-
// zalo-mod
|
|
1746
|
+
// Zalo Personal channel is native; install openclaw-zalo-mod manually via ClawHub when needed.
|
|
1747
1747
|
if (isZaloPersonal(channelKey)) {
|
|
1748
|
-
allow.push('
|
|
1749
|
-
entries['zalo-mod'] = {
|
|
1750
|
-
enabled: true,
|
|
1751
|
-
config: {
|
|
1752
|
-
botName: botName,
|
|
1753
|
-
ownerId: "",
|
|
1754
|
-
groupNames: {},
|
|
1755
|
-
zaloDisplayNames: [botName],
|
|
1756
|
-
welcomeEnabled: true,
|
|
1757
|
-
spamRepeatN: 3,
|
|
1758
|
-
spamWindowSeconds: 300,
|
|
1759
|
-
},
|
|
1760
|
-
};
|
|
1748
|
+
allow.push('zalouser');
|
|
1761
1749
|
}
|
|
1762
1750
|
|
|
1763
1751
|
const plugins = { entries };
|
|
@@ -2746,7 +2734,7 @@ if(touched){console.log('[patch-9router] Applied Codex compatibility patch.');}e
|
|
|
2746
2734
|
const runtimeScriptB64 = encodeBase64Utf8(runtimeScript);
|
|
2747
2735
|
const dockerfile = `FROM node:22-slim
|
|
2748
2736
|
|
|
2749
|
-
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/*
|
|
2750
2738
|
${browserInstallLines}
|
|
2751
2739
|
ARG OPENCLAW_VER="${openClawNpmSpec}"
|
|
2752
2740
|
ARG CACHE_BUST=""
|
|
@@ -3019,7 +3007,6 @@ function buildNativeScriptCtx(options) {
|
|
|
3019
3007
|
const p = PLUGINS.find((x) => x.id === pid);
|
|
3020
3008
|
if (p) allPlugins.push(p.package);
|
|
3021
3009
|
});
|
|
3022
|
-
if (ch && ch.hasZaloPersonal) allPlugins.push('openclaw-zalo-mod');
|
|
3023
3010
|
if (isMultiBot && state.channel === 'telegram') allPlugins.push(relayPluginSpec);
|
|
3024
3011
|
const uniquePlugins = [...new Set(allPlugins)];
|
|
3025
3012
|
const pluginCmd = uniquePlugins.length > 0 ? uniquePlugins.map(function(pkg) { return 'call npm exec -- openclaw plugins install ' + pkg + ' || echo [WARN] Plugin ' + pkg + ' cai dat that bai (co the do rate limit). Ban co the cai thu cong sau.'; }).join('\r\n') : '';
|
|
@@ -3817,21 +3804,31 @@ New-Item -ItemType Directory -Force -Path "$projectDir" | Out-Null
|
|
|
3817
3804
|
ps += `Write-Host "" -ForegroundColor White\n`;
|
|
3818
3805
|
ps += `Write-Host "${isVi ? 'Huong dan dang nhap Zalo:' : 'Zalo login instructions:'}" -ForegroundColor White\n`;
|
|
3819
3806
|
ps += `Write-Host " ${isVi ? '1. cd docker\\\\openclaw' : '1. cd docker\\\\openclaw'}" -ForegroundColor White\n`;
|
|
3820
|
-
ps += `Write-Host " ${isVi ?
|
|
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`;
|
|
3821
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`;
|
|
3822
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`;
|
|
3823
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`;
|
|
3824
3812
|
ps += `Write-Host " ${isVi ? '5. Doi thay chu Login successful trong terminal' : '5. Wait for Login successful in terminal'}" -ForegroundColor White\n`;
|
|
3825
|
-
ps += `Write-Host " ${isVi ? '6.
|
|
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`;
|
|
3826
3815
|
ps += `Write-Host "" -ForegroundColor White\n`;
|
|
3827
|
-
ps += `Write-Host "${isVi ? 'Dung
|
|
3828
|
-
ps += `& docker
|
|
3829
|
-
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`;
|
|
3830
3818
|
ps += `Write-Host "${isVi ? 'Dang chay lenh login...' : 'Running login command...'}" -ForegroundColor Yellow\n`;
|
|
3831
|
-
ps += `& docker
|
|
3819
|
+
ps += `& docker compose run --rm --no-deps ai-bot openclaw channels login --channel zalouser --verbose\n`;
|
|
3832
3820
|
ps += `Write-Host "" -ForegroundColor White\n`;
|
|
3833
|
-
ps += `Write-Host "${isVi ? '
|
|
3834
|
-
ps += `& docker compose
|
|
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`;
|
|
3835
3832
|
}
|
|
3836
3833
|
|
|
3837
3834
|
ps += `} catch { Write-Host $_.Exception.Message -ForegroundColor Red }\nRead-Host "${isVi ? 'Nhan Enter de thoat' : 'Press Enter to exit'}"\n`;
|
|
@@ -3876,9 +3873,10 @@ echo ""
|
|
|
3876
3873
|
const containerName = 'openclaw-bot';
|
|
3877
3874
|
const qrPath = '/tmp/openclaw/openclaw-zalouser-qr-default.png';
|
|
3878
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`;
|
|
3879
|
-
script += `echo "${isVi ? 'Huong dan dang nhap Zalo:' : 'Zalo login instructions:'}"\necho " ${isVi ? '1. cd docker/openclaw' : '1. cd docker/openclaw'}"\necho " 2. docker
|
|
3880
|
-
script += `docker
|
|
3881
|
-
script += `
|
|
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`;
|
|
3882
3880
|
}
|
|
3883
3881
|
|
|
3884
3882
|
return script;
|
|
@@ -4138,20 +4136,29 @@ function generateMacOsSh(ctx) {
|
|
|
4138
4136
|
sh.push('echo "=== DANG NHAP ZALO ==="');
|
|
4139
4137
|
sh.push('echo "Doi container khoi dong 10 giay..."');
|
|
4140
4138
|
sh.push('sleep 10');
|
|
4141
|
-
sh.push('echo "Dung
|
|
4142
|
-
sh.push(
|
|
4143
|
-
sh.push('sleep 3');
|
|
4139
|
+
sh.push('echo "Dung app container de login one-shot..."');
|
|
4140
|
+
sh.push('$COMPOSE stop ai-bot');
|
|
4144
4141
|
sh.push('echo "Huong dan dang nhap Zalo:"');
|
|
4145
4142
|
sh.push(`echo " 1. cd docker/openclaw"`);
|
|
4146
|
-
sh.push(`echo " 2. docker
|
|
4147
|
-
sh.push(`echo " 3.
|
|
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}"`);
|
|
4148
4146
|
sh.push(`echo " Hoac chay: docker cp ${containerName}:${qrPath} ./zalo-qr.png"`);
|
|
4149
|
-
sh.push('echo "
|
|
4150
|
-
sh.push('echo "
|
|
4151
|
-
sh.push('echo "
|
|
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"');
|
|
4152
4150
|
sh.push('echo ""');
|
|
4153
|
-
sh.push(
|
|
4154
|
-
sh.push(
|
|
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');
|
|
4155
4162
|
}
|
|
4156
4163
|
sh.push('echo "\u2705 Bot dang chay via Docker. Xem log: docker logs -f openclaw-bot"');
|
|
4157
4164
|
scriptContent = sh.filter(Boolean).join('\n');
|
|
@@ -5855,7 +5862,6 @@ Write-Host "Chrome se tu dong bat Debug Mode moi khi ban dang nhap Windows (dela
|
|
|
5855
5862
|
};
|
|
5856
5863
|
clawConfig.plugins = {
|
|
5857
5864
|
entries: {
|
|
5858
|
-
...(ch.hasZaloPersonal ? { 'zalo-mod': { enabled: true, config: { botName: botName, ownerId: "", groupNames: {}, zaloDisplayNames: [botName], welcomeEnabled: true, spamRepeatN: 3, spamWindowSeconds: 300 } } } : {}),
|
|
5859
5865
|
'memory-core': {
|
|
5860
5866
|
config: { dreaming: { enabled: state.config.skills.includes('memory') } },
|
|
5861
5867
|
},
|
|
@@ -5869,20 +5875,6 @@ Write-Host "Chrome se tu dong bat Debug Mode moi khi ban dang nhap Windows (dela
|
|
|
5869
5875
|
if (!plugin || plugin.hidden) return;
|
|
5870
5876
|
pluginEntries[plugin.package || pid] = { enabled: true };
|
|
5871
5877
|
});
|
|
5872
|
-
if (ch.hasZaloPersonal) {
|
|
5873
|
-
pluginEntries['zalo-mod'] = {
|
|
5874
|
-
enabled: true,
|
|
5875
|
-
config: {
|
|
5876
|
-
botName: botName,
|
|
5877
|
-
ownerId: "",
|
|
5878
|
-
groupNames: {},
|
|
5879
|
-
zaloDisplayNames: [botName],
|
|
5880
|
-
welcomeEnabled: true,
|
|
5881
|
-
spamRepeatN: 3,
|
|
5882
|
-
spamWindowSeconds: 300
|
|
5883
|
-
}
|
|
5884
|
-
};
|
|
5885
|
-
}
|
|
5886
5878
|
pluginEntries['memory-core'] = {
|
|
5887
5879
|
config: { dreaming: { enabled: state.config.skills.includes('memory') } },
|
|
5888
5880
|
};
|
|
@@ -5922,7 +5914,6 @@ model:
|
|
|
5922
5914
|
// 3. Dockerfile + docker-compose.yml
|
|
5923
5915
|
const allPlugins = [];
|
|
5924
5916
|
if (ch.pluginInstall) allPlugins.push(ch.pluginInstall);
|
|
5925
|
-
if (ch.hasZaloPersonal) allPlugins.push('openclaw-zalo-mod');
|
|
5926
5917
|
state.config.plugins.forEach((pid) => {
|
|
5927
5918
|
const plug = PLUGINS.find((p) => p.id === pid);
|
|
5928
5919
|
if (plug) allPlugins.push(plug.package);
|
|
@@ -5938,7 +5929,6 @@ model:
|
|
|
5938
5929
|
const relayPluginInstallCmd = isMultiBot ? buildRelayPluginInstallCommand('openclaw') : '';
|
|
5939
5930
|
const pluginRuntimeSpecs = allPlugins.filter((p) => p && p !== '@openclaw/zalouser');
|
|
5940
5931
|
const pluginIdForSpec = (spec) => {
|
|
5941
|
-
if (String(spec).includes('zalo-mod')) return 'zalo-mod';
|
|
5942
5932
|
return String(spec).replace(/^@openclaw\//, '').replace(/^openclaw-/, '');
|
|
5943
5933
|
};
|
|
5944
5934
|
const pluginInstallCmd = [
|
|
@@ -5960,7 +5950,7 @@ model:
|
|
|
5960
5950
|
runtimeCommandParts: [
|
|
5961
5951
|
pluginInstallCmd,
|
|
5962
5952
|
'while true; do sleep 5; openclaw devices approve --latest 2>/dev/null || true; done >/dev/null 2>&1 &'
|
|
5963
|
-
],
|
|
5953
|
+
].filter(Boolean),
|
|
5964
5954
|
plainSingleExtraHosts: true,
|
|
5965
5955
|
multiOllamaNumParallel: 1,
|
|
5966
5956
|
singleOllamaNumParallel: 1,
|
|
@@ -6620,33 +6610,38 @@ fi
|
|
|
6620
6610
|
// ========== Zalo Personal Login Guide (post-setup) ==========
|
|
6621
6611
|
function generateZaloOnboardGuide() {
|
|
6622
6612
|
const lang = document.getElementById('cfg-language')?.value || 'vi';
|
|
6623
|
-
setOutput('out-zalo-onboard-cmd', `docker compose
|
|
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`);
|
|
6624
6617
|
|
|
6625
6618
|
if (lang === 'vi') {
|
|
6626
6619
|
setOutput('out-zalo-onboard-guide', `┌─────────────────────────────────────────────────────┐
|
|
6627
6620
|
│ Chạy lệnh bên trái để OpenClaw tạo QR đăng nhập. │
|
|
6628
6621
|
├─────────────────────────────────────────────────────┤
|
|
6629
6622
|
│ 1. Đảm bảo container/gateway đã chạy xong. │
|
|
6630
|
-
│ 2.
|
|
6623
|
+
│ 2. Stop ai-bot, login bằng compose run one-shot. │
|
|
6631
6624
|
│ 3. OpenClaw sẽ in ra đường dẫn file QR trong /tmp. │
|
|
6632
6625
|
│ 4. Copy file QR ra ngoài nếu cần: │
|
|
6633
|
-
│ docker
|
|
6626
|
+
│ docker cp openclaw-bot:/tmp/openclaw/ │
|
|
6634
6627
|
│ openclaw-zalouser-qr-default.png . │
|
|
6635
6628
|
│ 5. Mở ảnh QR → quét bằng app Zalo → xác nhận. │
|
|
6636
|
-
│ 6.
|
|
6629
|
+
│ 6. Start lại: docker compose up -d --force-recreate│
|
|
6630
|
+
│ 7. Chạy channels status --probe, phải thấy running.│
|
|
6637
6631
|
└─────────────────────────────────────────────────────┘`);
|
|
6638
6632
|
} else {
|
|
6639
6633
|
setOutput('out-zalo-onboard-guide', `┌─────────────────────────────────────────────────────┐
|
|
6640
6634
|
│ Run the command on the left to generate a Zalo QR. │
|
|
6641
6635
|
├─────────────────────────────────────────────────────┤
|
|
6642
6636
|
│ 1. Make sure the container/gateway is already up. │
|
|
6643
|
-
│ 2.
|
|
6637
|
+
│ 2. Stop ai-bot; login with compose run one-shot. │
|
|
6644
6638
|
│ 3. OpenClaw prints the QR image path under /tmp. │
|
|
6645
6639
|
│ 4. Copy the QR out if needed: │
|
|
6646
|
-
│ docker
|
|
6640
|
+
│ docker cp openclaw-bot:/tmp/openclaw/ │
|
|
6647
6641
|
│ openclaw-zalouser-qr-default.png . │
|
|
6648
6642
|
│ 5. Open the image → scan with Zalo mobile app. │
|
|
6649
|
-
│ 6.
|
|
6643
|
+
│ 6. Start again: docker compose up -d --force-re... │
|
|
6644
|
+
│ 7. Run channels status --probe; it should run. │
|
|
6650
6645
|
└─────────────────────────────────────────────────────┘`);
|
|
6651
6646
|
}
|
|
6652
6647
|
}
|