create-openclaw-bot 5.16.3 → 5.16.5
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 +24 -3
- package/README.vi.md +23 -2
- package/dist/server/local-server.js +49 -7
- package/dist/setup/shared/bot-config-gen.js +3 -1
- package/dist/setup/shared/docker-gen.js +8 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*Run one command → open the dashboard → your bot is live. Windows · macOS · Linux · VPS — Docker-powered, auto-installed for you.*
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<a href="https://github.com/tuanminhhole/openclaw-setup/releases"><img src="https://img.shields.io/badge/RELEASE-v5.16.
|
|
10
|
+
<a href="https://github.com/tuanminhhole/openclaw-setup/releases"><img src="https://img.shields.io/badge/RELEASE-v5.16.5-0EA5E9?style=for-the-badge" alt="Version 5.16.5" /></a>
|
|
11
11
|
<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>
|
|
12
12
|
<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>
|
|
13
13
|
<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>
|
|
@@ -37,15 +37,36 @@
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
-
## 🆕 What's New in v5.16.
|
|
40
|
+
## 🆕 What's New in v5.16.5
|
|
41
|
+
|
|
42
|
+
- 🩹 **Native installs on OpenClaw 2026.8 are smooth from the first run** - this wave patches the remaining chain of issues measured on fresh customer machines: generated configs pass the new strict checks 100%, install steps run in the right order, and restarts/plugin installs no longer get blocked midway.
|
|
43
|
+
- 🔑 **9Router login works on Docker**: the new 9Router blocks the default password for "remote" access - and inside Docker every request counts as remote, so 123456 could never log in. It works now (still change the password once you're in).
|
|
44
|
+
- 🧹 **Deleting a project fully removes the old 9Router**: it used to keep running in the background holding the port, silently forking the next install onto a different port - now removal is clean and reinstalls land on the standard port.
|
|
45
|
+
- 🔌 **Native machines auto-install the web-search plugin** (DuckDuckGo) with its capability consent - no more boot loops over a missing nod.
|
|
46
|
+
|
|
47
|
+
<details>
|
|
48
|
+
<summary><b>Previous: What's new in v5.16.3</b></summary>
|
|
49
|
+
|
|
50
|
+
- 🚑 **The big OpenClaw 2026.8.1 catch-up**: fresh installs run smoothly (Docker and native, Windows/macOS/Linux), and existing machines heal themselves on upgrade - stale config cleaned, data relocated, and the old file that could mute the bot retired automatically.
|
|
51
|
+
- 🤖 **The bot stops claiming "I can't see the file"**: files sent through chat come with clear directions for the AI.
|
|
52
|
+
- 🔁 **9Router comes back on its own** after a server reboot or UI maintenance.
|
|
53
|
+
- 🔄 **The in-app "Update" button really updates** on standard server installs.
|
|
54
|
+
- 🧭 **One setup build manages both generations** (2026.7 and 2026.8).
|
|
55
|
+
|
|
56
|
+
</details>
|
|
57
|
+
|
|
58
|
+
<details>
|
|
59
|
+
<summary><b>Previous: What's new in v5.15.3</b></summary>
|
|
41
60
|
|
|
42
61
|
- 🖥️ **"Control PC" — let the bot open Chrome & apps on your machine**: a new toggle on each bot card turns on the ability for the bot to open Chrome or an allow-listed app (TeamViewer, Zalo, …) on the computer running it. **Off by default**, token-gated, allow-list only, desktop-only.
|
|
43
62
|
- 🌐 **Browsing works out of the box on every OS**: the bot drives your real Chrome on a desktop (your logged-in profile, so sites don't flag it) and starts its own headless Chromium on a server — no more "no browser available" just because Chrome wasn't running.
|
|
44
63
|
|
|
64
|
+
</details>
|
|
65
|
+
|
|
45
66
|
<details>
|
|
46
67
|
<summary><b>Previous: What's new in v5.14.1</b></summary>
|
|
47
68
|
|
|
48
|
-
- 🦞 **Zalo bots acknowledge your message
|
|
69
|
+
- 🦞 **Zalo bots react to acknowledge your message**: an icon appears on the message you just sent, so you know the bot received it while it is still writing the reply. Runs at the chat-channel layer, so it **costs no tokens**. On by default for new Zalo bots; change the icon or turn it off via `messages.ackReaction` in `openclaw.json`. Needs Zalo Connect 3.0.15+.
|
|
49
70
|
|
|
50
71
|
</details>
|
|
51
72
|
|
package/README.vi.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*Chạy một lệnh → mở dashboard → bot lên sóng. Windows · macOS · Linux · VPS — chạy trên Docker, tự cài giúp bạn.*
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<a href="https://github.com/tuanminhhole/openclaw-setup/releases"><img src="https://img.shields.io/badge/RELEASE-v5.16.
|
|
10
|
+
<a href="https://github.com/tuanminhhole/openclaw-setup/releases"><img src="https://img.shields.io/badge/RELEASE-v5.16.5-0EA5E9?style=for-the-badge" alt="Version 5.16.5" /></a>
|
|
11
11
|
<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>
|
|
12
12
|
<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>
|
|
13
13
|
<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>
|
|
@@ -37,11 +37,32 @@
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
-
## 🆕 Có gì mới trong v5.16.
|
|
40
|
+
## 🆕 Có gì mới trong v5.16.5
|
|
41
|
+
|
|
42
|
+
- 🩹 **Cài native trên OpenClaw 2026.8 mượt từ phát đầu** - đợt này vá nốt chuỗi lỗi đo được khi dựng máy khách mới: cấu hình sinh ra sạch 100% với bộ soát khắt khe của OpenClaw mới, các bước cài tự chạy đúng thứ tự, và mọi thao tác khởi động lại/cài plugin không còn bị chặn giữa chừng.
|
|
43
|
+
- 🔑 **Đăng nhập 9Router hoạt động trên Docker**: bản 9Router mới chặn mật khẩu mặc định với truy cập "từ xa" - mà trong Docker thì mọi truy cập đều bị tính là từ xa, nên trước đây không cách nào vào được bằng 123456. Giờ đăng nhập bình thường (vào rồi vẫn nên đổi mật khẩu).
|
|
44
|
+
- 🧹 **Xoá project gỡ sạch 9Router cũ**: trước đây 9Router cũ còn chạy ngầm giữ cổng, làm lần cài mới tự tách sang cổng khác mà không ai hay - giờ xoá là sạch, cài lại đúng cổng chuẩn.
|
|
45
|
+
- 🔌 **Máy native tự cài đủ plugin tìm kiếm web** (DuckDuckGo) kèm xác nhận quyền - hết cảnh bot khởi động vòng lặp vì thiếu một cái gật đầu.
|
|
46
|
+
|
|
47
|
+
<details>
|
|
48
|
+
<summary><b>Trước đó: Có gì mới trong v5.16.3</b></summary>
|
|
49
|
+
|
|
50
|
+
- 🚑 **Theo kịp OpenClaw 2026.8.1**: cài mới chạy mượt (đủ Docker lẫn native, Windows/macOS/Linux), máy cũ tự được chữa khi nâng cấp - tự dọn cấu hình lỗi thời, tự dời dữ liệu, tự gỡ file cũ từng khiến bot "câm".
|
|
51
|
+
- 🤖 **Bot hết chối "không thấy file"**: file khách gửi qua chat được chỉ đường tận nơi cho AI.
|
|
52
|
+
- 🔁 **9Router tự sống lại** sau khi máy chủ khởi động lại hay giao diện bảo trì.
|
|
53
|
+
- 🔄 **Nút "Cập nhật" trong giao diện cập nhật thật** trên máy chủ cài kiểu chuẩn.
|
|
54
|
+
- 🧭 **Một bản setup quản được cả máy đời cũ (2026.7) lẫn đời mới (2026.8)**.
|
|
55
|
+
|
|
56
|
+
</details>
|
|
57
|
+
|
|
58
|
+
<details>
|
|
59
|
+
<summary><b>Trước đó: Có gì mới trong v5.15.3</b></summary>
|
|
41
60
|
|
|
42
61
|
- 🖥️ **"Điều khiển máy" — cho bot mở Chrome & ứng dụng trên máy bạn**: nút mới trên thẻ mỗi bot, bật lên là bot mở được Chrome hoặc app trong danh sách cho phép (TeamViewer, Zalo, …) trên máy đang chạy bot. **Mặc định TẮT**, cần token, chỉ giới hạn danh sách bạn khai, chỉ dùng trên máy có màn hình.
|
|
43
62
|
- 🌐 **Duyệt web chạy ngay trên mọi hệ điều hành**: máy để bàn thì bot dùng **Chrome thật** (profile đã đăng nhập, web ít nghi là bot), server thì tự mở Chromium headless — hết cảnh "không có trình duyệt" chỉ vì chưa mở Chrome.
|
|
44
63
|
|
|
64
|
+
</details>
|
|
65
|
+
|
|
45
66
|
<details>
|
|
46
67
|
<summary><b>Trước đó: Có gì mới trong v5.14.1</b></summary>
|
|
47
68
|
|
|
@@ -48,7 +48,11 @@ function specMajorMinor(spec) {
|
|
|
48
48
|
}
|
|
49
49
|
let hostOcMajorMinorCache = null;
|
|
50
50
|
async function hostOpenclawMajorMinor() {
|
|
51
|
-
|
|
51
|
+
// Cache only a REAL version: during bot creation this is first called before
|
|
52
|
+
// `npm i -g openclaw` has run, and caching that 0 forever made prepareNativeStateHome
|
|
53
|
+
// skip the 2026.8 state-home move — daemon install then failed with "non-default
|
|
54
|
+
// state dir" (measured on a fresh native install, 03/09/2026).
|
|
55
|
+
if (hostOcMajorMinorCache) return hostOcMajorMinorCache;
|
|
52
56
|
const r = await runCapture('openclaw', ['--version'], { shell: false }).catch(() => null);
|
|
53
57
|
hostOcMajorMinorCache = specMajorMinor(r && (r.stdout || r.stderr));
|
|
54
58
|
return hostOcMajorMinorCache;
|
|
@@ -2939,7 +2943,20 @@ function migrationLeaseDeadline(text = '') {
|
|
|
2939
2943
|
async function ocDaemon(projectDir, verb, extraArgs = []) {
|
|
2940
2944
|
const args = ['daemon', verb, ...extraArgs];
|
|
2941
2945
|
sendLog(`$ openclaw ${args.join(' ')}`);
|
|
2942
|
-
|
|
2946
|
+
// openclaw 2026.8.x refuses EVERY `daemon *` verb (not just install) while OPENCLAW_HOME is
|
|
2947
|
+
// set — "service management skipped: non-default state dir" (measured 03/09/2026: the
|
|
2948
|
+
// post-plugin-install restart failed on a fresh native host). On the 2026.8 layout the
|
|
2949
|
+
// state already lives at ~/.openclaw, so run daemon verbs with the plain account HOME and
|
|
2950
|
+
// no OPENCLAW_* overrides; STOP even suggests --force for the operator gateway, so pass it.
|
|
2951
|
+
let env = nativeEnv(projectDir);
|
|
2952
|
+
if ((await hostOpenclawMajorMinor()) >= 202608) {
|
|
2953
|
+
env = { ...env };
|
|
2954
|
+
delete env.OPENCLAW_HOME;
|
|
2955
|
+
delete env.OPENCLAW_STATE_DIR;
|
|
2956
|
+
env.HOME = os.homedir();
|
|
2957
|
+
}
|
|
2958
|
+
if (verb === 'stop' && !extraArgs.includes('--force')) args.push('--force');
|
|
2959
|
+
const out = await runCapture('openclaw', args, { cwd: projectDir, env, shell: false, timeout: 120000 });
|
|
2943
2960
|
const text = `${out.stdout || ''}\n${out.stderr || ''}`;
|
|
2944
2961
|
for (const line of text.split(/\r?\n/).map((l) => l.trimEnd()).filter(Boolean)) sendLog(line);
|
|
2945
2962
|
return { ...out, text };
|
|
@@ -3274,6 +3291,10 @@ async function ensureNativePlugins(projectDir, { restart = false } = {}) {
|
|
|
3274
3291
|
// actually declares the channel (mirrors docker-gen's `if (zaloBackend === 'zalo-connect')`).
|
|
3275
3292
|
const wanted = new Set(['learning-memory']);
|
|
3276
3293
|
if (cfg?.channels?.[ZALO_CHANNEL_ID] || cfg?.plugins?.entries?.[ZALO_PLUGIN_ID]) wanted.add(ZALO_PLUGIN_ID);
|
|
3294
|
+
// openclaw >=2026.8 unbundled duckduckgo AND refuses to report ready while the config
|
|
3295
|
+
// declares a plugin that lacks capability consent — the docker entrypoint ensures it,
|
|
3296
|
+
// native must too (measured 03/09/2026: fresh install crash-looped on this).
|
|
3297
|
+
if (cfg?.plugins?.entries?.duckduckgo) wanted.add('duckduckgo');
|
|
3277
3298
|
const installed = [];
|
|
3278
3299
|
for (const id of wanted) {
|
|
3279
3300
|
const dir = join(projectDir, '.openclaw', 'extensions', id);
|
|
@@ -3492,12 +3513,13 @@ async function startNativeRuntime({ projectDir, osChoice = '', gatewayPort, rout
|
|
|
3492
3513
|
// Plugins BEFORE the gateway's first boot — the container entrypoint installs them ahead of the
|
|
3493
3514
|
// gateway for the same reason: a gateway that boots with its plugins already on disk loads them
|
|
3494
3515
|
// straight away, needs no follow-up restart, and prints no "plugin not found" warnings.
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
//
|
|
3498
|
-
// (migrate, then start), so an adopted pre-existing project boots on the upgraded config.
|
|
3516
|
+
// Config migrations FIRST: `openclaw plugins install` validates the config, so a config
|
|
3517
|
+
// still carrying pre-2026.8 keys makes every plugin install fail before migrations ran
|
|
3518
|
+
// (measured on a fresh native install, 03/09/2026 — learning-memory refused to install).
|
|
3499
3519
|
await runNativeConfigMigrations(projectDir).catch(() => {});
|
|
3500
3520
|
|
|
3521
|
+
await ensureNativePlugins(projectDir).catch((e) => sendLog(`[native] plugin bootstrap skipped: ${e.message}`));
|
|
3522
|
+
|
|
3501
3523
|
// Managed service = auto-restart (KeepAlive/Restart=always) and start-at-login, the native
|
|
3502
3524
|
// equivalent of docker's `restart: always`. --force so re-running install updates the port.
|
|
3503
3525
|
const env = nativeEnv(projectDir);
|
|
@@ -3544,6 +3566,13 @@ async function removeNativeRuntime(projectDir) {
|
|
|
3544
3566
|
if (!isNativeProject(projectDir)) return false;
|
|
3545
3567
|
const env = nativeEnv(projectDir);
|
|
3546
3568
|
await run('openclaw', ['daemon', 'uninstall'], { cwd: projectDir, env }).catch((e) => sendLog(`[native] daemon uninstall: ${e.message}`));
|
|
3569
|
+
// The 9router systemd unit has Restart=always: killing the listener alone brings it (or an
|
|
3570
|
+
// orphaned child) back, the port stays busy, and the NEXT install silently forks off to a
|
|
3571
|
+
// new router port that no ssh tunnel or oc-web table points at (measured 03/09/2026).
|
|
3572
|
+
if (process.platform === 'linux') {
|
|
3573
|
+
await run('systemctl', ['--user', 'disable', '--now', 'openclaw-9router.service'], {}).catch(() => {});
|
|
3574
|
+
await run('systemctl', ['--user', 'disable', '--now', 'openclaw-9router-sync.service'], {}).catch(() => {});
|
|
3575
|
+
}
|
|
3547
3576
|
const routerPort = (readNativeMeta(projectDir) || {}).routerPort || NATIVE_DEFAULT_ROUTER_PORT;
|
|
3548
3577
|
await killListenerOnPort(routerPort);
|
|
3549
3578
|
return true;
|
|
@@ -6088,6 +6117,8 @@ const PLUGIN_NPM_SPEC = {
|
|
|
6088
6117
|
// learning-memory ships on ClawHub as `openclaw-learning-memory` (manifest id is
|
|
6089
6118
|
// `learning-memory`, used as the config key). Install by the full package spec.
|
|
6090
6119
|
'learning-memory': 'clawhub:openclaw-learning-memory',
|
|
6120
|
+
// duckduckgo is openclaw's own external plugin on npm, not a ClawHub package.
|
|
6121
|
+
'duckduckgo': '@openclaw/duckduckgo-plugin',
|
|
6091
6122
|
};
|
|
6092
6123
|
const pluginInstallSpec = (id) => PLUGIN_NPM_SPEC[id] || `clawhub:${id}`;
|
|
6093
6124
|
|
|
@@ -6869,7 +6900,13 @@ async function handler(req, res, rootProjectDir) {
|
|
|
6869
6900
|
if (url.pathname === '/api/setup/update' && req.method === 'POST') {
|
|
6870
6901
|
const installerDir = resolve(__dirname, '../..');
|
|
6871
6902
|
const isGit = existsSync(resolve(installerDir, '.git'));
|
|
6872
|
-
|
|
6903
|
+
// npm -g install: the new-host template installs create-openclaw-bot globally and runs
|
|
6904
|
+
// the UI as a systemd user service. Without its own branch this fell into the "github"
|
|
6905
|
+
// relaunch path, which only restarted the OLD version (measured on vps_c-thu, 02/09/2026).
|
|
6906
|
+
// npx installs also live under node_modules, so exclude the _npx cache explicitly.
|
|
6907
|
+
const isNpx = /[\\/]_npx[\\/]/.test(installerDir);
|
|
6908
|
+
const isGlobalNpm = !isGit && !isNpx && /[\\/]node_modules[\\/]create-openclaw-bot[\\/]?$/.test(installerDir);
|
|
6909
|
+
const mode = isGit ? 'git' : (isGlobalNpm ? 'npm-global' : 'github');
|
|
6873
6910
|
setImmediate(async () => {
|
|
6874
6911
|
try {
|
|
6875
6912
|
if (isGit) {
|
|
@@ -6883,6 +6920,11 @@ async function handler(req, res, rootProjectDir) {
|
|
|
6883
6920
|
await run('npm', ['run', 'build'], { cwd: installerDir }).catch((e) =>
|
|
6884
6921
|
sendLog(`[update-setup] build skipped: ${e.message}`));
|
|
6885
6922
|
}
|
|
6923
|
+
} else if (isGlobalNpm) {
|
|
6924
|
+
// Pull the latest from npm in place, then exit — the service manager (or the
|
|
6925
|
+
// respawn path for a hand-run UI) relaunches onto the freshly installed dist.
|
|
6926
|
+
sendLog('[update-setup] Global npm install detected — npm i -g create-openclaw-bot@latest…');
|
|
6927
|
+
await run('npm', ['i', '-g', 'create-openclaw-bot@latest', '--no-audit', '--no-fund'], { cwd: installerDir });
|
|
6886
6928
|
} else {
|
|
6887
6929
|
// Ephemeral `npx github:…` install: nothing to pull in place — the relaunch
|
|
6888
6930
|
// re-runs `npx github:…`, which fetches the latest from GitHub.
|
|
@@ -141,7 +141,9 @@
|
|
|
141
141
|
// and poisons the session until a manual reset. 12k chars (~3k tokens) per
|
|
142
142
|
// result keeps per-source content substantial while making that runaway
|
|
143
143
|
// impossible. Applies to persisted results + overflow recovery.
|
|
144
|
-
|
|
144
|
+
// No contextLimits.toolResultMaxChars: openclaw 2026.8.x strict schema rejects the
|
|
145
|
+
// key outright (measured on a fresh native install, 03/09/2026) — the runaway-turn
|
|
146
|
+
// protection it provided is handled by the 2026.8 runtime itself.
|
|
145
147
|
// Agent-TURN budget (seconds). 120 was too short for multi-step cloud turns (OCR +
|
|
146
148
|
// file gen + tool calls). 900 = OpenClaw's own native default and the practical max
|
|
147
149
|
// we use. This is the turn budget — a DIFFERENT layer from 9router's per-request
|
|
@@ -562,6 +562,10 @@ ${indentBlock(docker9RouterEntrypointScript, 8)}
|
|
|
562
562
|
- PORT=${routerPort}
|
|
563
563
|
- HOSTNAME=0.0.0.0
|
|
564
564
|
- CI=true
|
|
565
|
+
# 9router blocks the default password for "remote" access, and inside Docker every
|
|
566
|
+
# host request arrives via the bridge network, so it always counts as remote — without
|
|
567
|
+
# this the user can NEVER log in with the documented default (measured 02/09/2026).
|
|
568
|
+
- INITIAL_PASSWORD=123456
|
|
565
569
|
volumes:
|
|
566
570
|
- 9router-data:/root/.9router
|
|
567
571
|
- ./sync.js:/tmp/sync.js:ro
|
|
@@ -656,6 +660,10 @@ ${indentBlock(docker9RouterEntrypointScript, 8)}
|
|
|
656
660
|
- PORT=${routerPort}
|
|
657
661
|
- HOSTNAME=0.0.0.0
|
|
658
662
|
- CI=true
|
|
663
|
+
# 9router blocks the default password for "remote" access, and inside Docker every
|
|
664
|
+
# host request arrives via the bridge network, so it always counts as remote — without
|
|
665
|
+
# this the user can NEVER log in with the documented default (measured 02/09/2026).
|
|
666
|
+
- INITIAL_PASSWORD=123456
|
|
659
667
|
volumes:
|
|
660
668
|
- 9router-data:/root/.9router
|
|
661
669
|
- ./sync.js:/tmp/sync.js:ro
|