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 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.3-0EA5E9?style=for-the-badge" alt="Version 5.16.3" /></a>
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.3
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 with a reaction**: an icon lands on your message right away, so you can see the bot picked it up while the answer is still being written. It runs in the channel layer, so it **costs no tokens**. On by default for new Zalo bots; change or disable it via `messages.ackReaction` in `openclaw.json`. Needs Zalo Connect 3.0.15+.
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.3-0EA5E9?style=for-the-badge" alt="Version 5.16.3" /></a>
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.3
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
- if (hostOcMajorMinorCache !== null) return hostOcMajorMinorCache;
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
- const out = await runCapture('openclaw', args, { cwd: projectDir, env: nativeEnv(projectDir), shell: false, timeout: 120000 });
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
- await ensureNativePlugins(projectDir).catch((e) => sendLog(`[native] plugin bootstrap skipped: ${e.message}`));
3496
-
3497
- // Config migrations BEFORE the first boot toosame ordering the container entrypoint uses
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/2026learning-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
- const mode = isGit ? 'git' : 'github';
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
- contextLimits: { toolResultMaxChars: 12000 },
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-openclaw-bot",
3
- "version": "5.16.3",
3
+ "version": "5.16.5",
4
4
  "description": "Interactive CLI installer for OpenClaw Bot",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {