@okclaw-build/cli 1.0.0-beta.4 → 1.0.0-beta.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/commands/check.js +22 -6
  2. package/dist/commands/check.js.map +1 -1
  3. package/dist/commands/edit.d.ts +2 -7
  4. package/dist/commands/edit.js +28 -15
  5. package/dist/commands/edit.js.map +1 -1
  6. package/dist/commands/feed.d.ts +0 -9
  7. package/dist/commands/feed.js +80 -103
  8. package/dist/commands/feed.js.map +1 -1
  9. package/dist/commands/install.js +57 -9
  10. package/dist/commands/install.js.map +1 -1
  11. package/dist/commands/service.js +65 -12
  12. package/dist/commands/service.js.map +1 -1
  13. package/dist/commands/show.d.ts +13 -0
  14. package/dist/commands/show.js +70 -0
  15. package/dist/commands/show.js.map +1 -0
  16. package/dist/commands/skill.d.ts +1 -0
  17. package/dist/commands/skill.js +114 -0
  18. package/dist/commands/skill.js.map +1 -0
  19. package/dist/commands/uninstall.d.ts +1 -0
  20. package/dist/commands/uninstall.js +46 -0
  21. package/dist/commands/uninstall.js.map +1 -0
  22. package/dist/index.js +88 -5
  23. package/dist/index.js.map +1 -1
  24. package/dist/installers/base.d.ts +1 -0
  25. package/dist/installers/channel.d.ts +16 -1
  26. package/dist/installers/channel.js +139 -8
  27. package/dist/installers/channel.js.map +1 -1
  28. package/dist/installers/openclaw.d.ts +15 -0
  29. package/dist/installers/openclaw.js +171 -8
  30. package/dist/installers/openclaw.js.map +1 -1
  31. package/dist/installers/openviking-purge.d.ts +52 -0
  32. package/dist/installers/openviking-purge.js +380 -0
  33. package/dist/installers/openviking-purge.js.map +1 -0
  34. package/dist/installers/openviking.js +1 -2
  35. package/dist/installers/openviking.js.map +1 -1
  36. package/dist/installers/skill.d.ts +2 -0
  37. package/dist/installers/skill.js +35 -5
  38. package/dist/installers/skill.js.map +1 -1
  39. package/dist/output/mode.d.ts +11 -0
  40. package/dist/output/mode.js +27 -0
  41. package/dist/output/mode.js.map +1 -0
  42. package/dist/output/ndjson.d.ts +57 -0
  43. package/dist/output/ndjson.js +136 -0
  44. package/dist/output/ndjson.js.map +1 -0
  45. package/dist/utils/constants.d.ts +0 -2
  46. package/dist/utils/constants.js +1 -4
  47. package/dist/utils/constants.js.map +1 -1
  48. package/dist/utils/deps.d.ts +0 -5
  49. package/dist/utils/deps.js +1 -88
  50. package/dist/utils/deps.js.map +1 -1
  51. package/dist/utils/logger.d.ts +10 -0
  52. package/dist/utils/logger.js +31 -4
  53. package/dist/utils/logger.js.map +1 -1
  54. package/dist/utils/mirror.js +14 -0
  55. package/dist/utils/mirror.js.map +1 -1
  56. package/dist/utils/openclaw-config-cli.d.ts +19 -0
  57. package/dist/utils/openclaw-config-cli.js +81 -0
  58. package/dist/utils/openclaw-config-cli.js.map +1 -0
  59. package/dist/utils/openclaw-daemon.d.ts +23 -0
  60. package/dist/utils/openclaw-daemon.js +38 -0
  61. package/dist/utils/openclaw-daemon.js.map +1 -0
  62. package/dist/utils/shell.d.ts +12 -2
  63. package/dist/utils/shell.js +66 -3
  64. package/dist/utils/shell.js.map +1 -1
  65. package/package.json +3 -2
@@ -2,6 +2,7 @@ import { existsSync, mkdirSync, rmSync, readFileSync, writeFileSync } from 'node
2
2
  import { shell, shellCapture } from '../utils/shell.js';
3
3
  import { ensureCommand, checkDiskSpace } from '../utils/deps.js';
4
4
  import { info, warn } from '../utils/logger.js';
5
+ import { stopDaemonForExclusiveAccess } from '../utils/openclaw-daemon.js';
5
6
  import { CHANNEL_NPM_PACKAGES, BUNDLED_PLUGINS, OKCLAW_TMP_DIR, OPENCLAW_HOME, NPM_REGISTRY } from '../utils/constants.js';
6
7
  export class ChannelInstaller {
7
8
  channelName;
@@ -17,21 +18,53 @@ export class ChannelInstaller {
17
18
  info(`${this.channelName} is bundled with openclaw, skipping install (config only).`);
18
19
  return;
19
20
  }
20
- // Remove existing plugin to avoid "plugin already exists" error
21
- this.removeExistingPlugin();
21
+ // Stop the openclaw gateway daemon before touching extensions/<name> or
22
+ // openclaw.json. The daemon has a file watcher that writes its own metadata
23
+ // back into openclaw.json on every config change, which races with our
24
+ // cleanup/install/configure writes:
25
+ // - rmSync extensions/<name>/node_modules/.cache/jiti vs daemon writing
26
+ // fresh transpile cache → ENOTEMPTY
27
+ // - openclaw plugins install hash check vs daemon reload write →
28
+ // ConfigMutationConflictError: config changed since last load
29
+ // The bootstrap orchestrator (commands/install.ts) is responsible for
30
+ // restarting the daemon after the full component install pipeline finishes.
31
+ await stopDaemonForExclusiveAccess(`${this.channelName} install`);
32
+ // Clean up any stale state (both the extension dir AND config entries) so openclaw's
33
+ // config validation passes when `openclaw plugins install` runs.
34
+ this.cleanupStaleState();
22
35
  if (packageUrl) {
23
36
  await this.installFromLocalPackage(packageUrl);
24
37
  }
25
38
  else {
26
39
  await this.installViaNpmPack(version);
27
40
  }
41
+ // Verify install actually landed — otherwise configure() would write channels.<name>
42
+ // into openclaw.json against a non-existent plugin and brick the runtime.
43
+ this.verifyInstalled();
28
44
  // Add to plugins.allow so openclaw trusts this plugin
29
45
  await this.addToPluginsAllow();
46
+ // Add to plugins.load.paths so the gateway actually scans this plugin dir on
47
+ // startup. `openclaw plugins install <tgz>`(archive 模式)只写 plugins.installs
48
+ // metadata,不会自动维护 load.paths;不补这一步会让 gateway ready (0 plugins,...)。
49
+ await this.addToLoadPaths();
30
50
  info(`${this.channelName}@${version} installed.`);
31
51
  }
52
+ verifyInstalled() {
53
+ const pluginDir = `${OPENCLAW_HOME}/extensions/${this.channelName}`;
54
+ if (!existsSync(pluginDir)) {
55
+ throw new Error(`Install verification failed: ${pluginDir} not found after "openclaw plugins install". ` +
56
+ `The install command may have silently skipped due to stale config; aborting before configure() runs.`);
57
+ }
58
+ }
32
59
  async configure(config) {
33
60
  if (!config || Object.keys(config).length === 0)
34
61
  return;
62
+ // configure() runs N back-to-back `openclaw config set` commands; every one
63
+ // does a hash-checked atomic replace on openclaw.json. If the daemon was
64
+ // restarted between install() and configure() its file-watcher write will
65
+ // race the next config set and raise ConfigMutationConflictError. Re-stop
66
+ // here so configure() sees the same exclusive-access window install() did.
67
+ await stopDaemonForExclusiveAccess(`${this.channelName} configure`);
35
68
  // All channel configs go to channels.<name> (both bundled and external plugins)
36
69
  // plugins.entries is managed by openclaw plugins install, we don't touch it
37
70
  const configPrefix = `channels.${this.channelName}`;
@@ -40,13 +73,78 @@ export class ChannelInstaller {
40
73
  info(`${this.channelName} configured.`);
41
74
  }
42
75
  // ---- private ----
43
- removeExistingPlugin() {
76
+ /**
77
+ * Clean up both filesystem state (extensions/<name>) and openclaw.json state
78
+ * (plugins.entries/installs/allow.<name> + channels.<name>) for this channel,
79
+ * atomically. Partial cleanup — e.g., rm-ing the dir but leaving the JSON refs —
80
+ * leaves openclaw's config validation broken and poisons all subsequent
81
+ * `openclaw ...` commands ("unknown channel id: <name>").
82
+ */
83
+ cleanupStaleState() {
44
84
  const pluginDir = `${OPENCLAW_HOME}/extensions/${this.channelName}`;
45
- if (existsSync(pluginDir)) {
46
- info(`Removing existing plugin at ${pluginDir}...`);
85
+ const configFile = `${OPENCLAW_HOME}/openclaw.json`;
86
+ const hadDir = existsSync(pluginDir);
87
+ const hadJsonRef = this.hasJsonRef(configFile);
88
+ if (!hadDir && !hadJsonRef)
89
+ return;
90
+ info(`Cleaning stale state for ${this.channelName} (dir=${hadDir}, jsonRefs=${hadJsonRef})`);
91
+ if (hadJsonRef) {
92
+ try {
93
+ const cfg = JSON.parse(readFileSync(configFile, 'utf8'));
94
+ if (cfg.channels)
95
+ delete cfg.channels[this.channelName];
96
+ if (cfg.plugins?.entries)
97
+ delete cfg.plugins.entries[this.channelName];
98
+ if (cfg.plugins?.installs)
99
+ delete cfg.plugins.installs[this.channelName];
100
+ if (Array.isArray(cfg.plugins?.allow)) {
101
+ cfg.plugins.allow = cfg.plugins.allow.filter((p) => p !== this.channelName);
102
+ }
103
+ // Also strip any plugins.load.paths entry pointing at the channel's
104
+ // extension dir. Without this the dir gets rm'd below but the json keeps
105
+ // a stale reference, so the next `openclaw config validate` (run inside
106
+ // `openclaw plugins install`) fails with "plugin path not found",
107
+ // bricking the install AND every subsequent openclaw config command.
108
+ const pluginPathSuffix = `/extensions/${this.channelName}`;
109
+ if (Array.isArray(cfg.plugins?.load?.paths)) {
110
+ cfg.plugins.load.paths = cfg.plugins.load.paths.filter((p) => (typeof p !== 'string'
111
+ || (!p.endsWith(pluginPathSuffix) && !p.endsWith(`${pluginPathSuffix}/`))));
112
+ }
113
+ writeFileSync(configFile, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
114
+ }
115
+ catch (e) {
116
+ warn(`Failed to clean openclaw.json: ${e}`);
117
+ }
118
+ }
119
+ if (hadDir) {
47
120
  rmSync(pluginDir, { recursive: true, force: true });
48
121
  }
49
122
  }
123
+ hasJsonRef(configFile) {
124
+ if (!existsSync(configFile))
125
+ return false;
126
+ try {
127
+ const cfg = JSON.parse(readFileSync(configFile, 'utf8'));
128
+ if (cfg.channels?.[this.channelName])
129
+ return true;
130
+ if (cfg.plugins?.entries?.[this.channelName])
131
+ return true;
132
+ if (cfg.plugins?.installs?.[this.channelName])
133
+ return true;
134
+ if (Array.isArray(cfg.plugins?.allow) && cfg.plugins.allow.includes(this.channelName))
135
+ return true;
136
+ // load.paths can leak even when nothing else does — must trigger cleanup
137
+ // so the stale path gets stripped before `openclaw plugins install` runs.
138
+ const pluginPathSuffix = `/extensions/${this.channelName}`;
139
+ if (Array.isArray(cfg.plugins?.load?.paths) && cfg.plugins.load.paths.some((p) => (typeof p === 'string' && (p.endsWith(pluginPathSuffix) || p.endsWith(`${pluginPathSuffix}/`)))))
140
+ return true;
141
+ }
142
+ catch {
143
+ // corrupted JSON — let cleanup run anyway
144
+ return true;
145
+ }
146
+ return false;
147
+ }
50
148
  async installFromLocalPackage(packageUrl) {
51
149
  mkdirSync(OKCLAW_TMP_DIR, { recursive: true });
52
150
  const archive = `${OKCLAW_TMP_DIR}/${this.channelName}-plugin.tgz`;
@@ -109,6 +207,39 @@ export class ChannelInstaller {
109
207
  warn(`Failed to update plugins.allow: ${e}`);
110
208
  }
111
209
  }
210
+ /**
211
+ * Push the absolute extension dir into plugins.load.paths so the gateway
212
+ * scans it on startup. Idempotent — dedup against trailing-slash variants
213
+ * (e.g. `/.../dingtalk` vs `/.../dingtalk/` both count as the same entry).
214
+ */
215
+ async addToLoadPaths() {
216
+ const configFile = `${OPENCLAW_HOME}/openclaw.json`;
217
+ if (!existsSync(configFile))
218
+ return;
219
+ const pluginPath = `${OPENCLAW_HOME}/extensions/${this.channelName}`;
220
+ const stripTrailingSlash = (p) => p.replace(/\/+$/, '');
221
+ const targetNormalized = stripTrailingSlash(pluginPath);
222
+ try {
223
+ const cfg = JSON.parse(readFileSync(configFile, 'utf8'));
224
+ if (!cfg.plugins)
225
+ cfg.plugins = {};
226
+ if (!cfg.plugins.load)
227
+ cfg.plugins.load = {};
228
+ if (!Array.isArray(cfg.plugins.load.paths))
229
+ cfg.plugins.load.paths = [];
230
+ const exists = cfg.plugins.load.paths.some((p) => (typeof p === 'string' && stripTrailingSlash(p) === targetNormalized));
231
+ if (exists) {
232
+ info(`plugins.load.paths already contains ${pluginPath}, skipping write`);
233
+ return;
234
+ }
235
+ cfg.plugins.load.paths.push(pluginPath);
236
+ writeFileSync(configFile, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
237
+ info(`Added ${pluginPath} to plugins.load.paths`);
238
+ }
239
+ catch (e) {
240
+ warn(`Failed to update plugins.load.paths: ${e}`);
241
+ }
242
+ }
112
243
  async applyConfig(obj, prefix) {
113
244
  for (const [key, value] of Object.entries(obj)) {
114
245
  if (value === null || value === undefined)
@@ -119,9 +250,9 @@ export class ChannelInstaller {
119
250
  }
120
251
  else {
121
252
  const strVal = String(value).replace(/'/g, "'\\''");
122
- await shell(`openclaw config set '${path}' '${strVal}'`).catch(() => {
123
- warn(`Failed to set ${path}`);
124
- });
253
+ // Let errors propagate — silently skipping a config set leaves openclaw.json
254
+ // in a half-written state that breaks config validation at runtime.
255
+ await shell(`openclaw config set '${path}' -- '${strVal}'`);
125
256
  }
126
257
  }
127
258
  }
@@ -1 +1 @@
1
- {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/installers/channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/installers/channel.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,17 @@
1
1
  import type { Installer } from './base.js';
2
+ type BackupFs = {
3
+ existsSync(path: string): boolean;
4
+ mkdirSync(path: string, options?: {
5
+ recursive?: boolean;
6
+ }): unknown;
7
+ cpSync(src: string, dest: string, options?: {
8
+ recursive?: boolean;
9
+ }): unknown;
10
+ statSync(path: string): {
11
+ isDirectory(): boolean;
12
+ };
13
+ };
14
+ export declare function backupOpenclawUserData(now?: Date, fsOps?: BackupFs): string | null;
2
15
  export declare class OpenclawInstaller implements Installer {
3
16
  checkDeps(): Promise<void>;
4
17
  install(version: string): Promise<void>;
@@ -15,4 +28,6 @@ export declare class OpenclawInstaller implements Installer {
15
28
  * Sets agents.defaults.model to first provider's first model
16
29
  */
17
30
  configure(config: Record<string, unknown>): Promise<void>;
31
+ uninstall(): Promise<void>;
18
32
  }
33
+ export {};
@@ -1,9 +1,69 @@
1
- import { readFileSync, writeFileSync, existsSync, cpSync, mkdirSync } from 'node:fs';
2
- import { shell, shellRetry } from '../utils/shell.js';
1
+ import { readFileSync, writeFileSync, existsSync, cpSync, mkdirSync, rmSync, statSync } from 'node:fs';
2
+ import { shell, shellRetry, shellCapture } from '../utils/shell.js';
3
3
  import { ensureNodeVersion, checkDiskSpace } from '../utils/deps.js';
4
4
  import { info, warn } from '../utils/logger.js';
5
- import { OPENCLAW_HOME, OKCLAW_BACKUP_DIR, NPM_REGISTRY } from '../utils/constants.js';
5
+ import { stopDaemonForExclusiveAccess } from '../utils/openclaw-daemon.js';
6
+ import { OPENCLAW_HOME, OPENCLAW_WORKSPACE, OKCLAW_BACKUP_DIR, NPM_REGISTRY } from '../utils/constants.js';
7
+ import { purgePhaseB } from './openviking-purge.js';
6
8
  const OPENCLAW_CONFIG = `${OPENCLAW_HOME}/openclaw.json`;
9
+ const LEGACY_OPENCLAW_WORKSPACE = '/root/openclaw/workspace';
10
+ const OPENCLAW_USER_DATA_FILES = [
11
+ 'MEMORY.md',
12
+ 'USER.md',
13
+ 'IDENTITY.md',
14
+ 'SOUL.md',
15
+ 'TOOLS.md',
16
+ 'AGENTS.md',
17
+ ];
18
+ const realBackupFs = { existsSync, mkdirSync, cpSync, statSync };
19
+ function formatBackupTimestamp(now) {
20
+ return now.toISOString().replace(/\.\d{3}Z$/, 'Z').replace(/:/g, '');
21
+ }
22
+ function copyIfExists(fsOps, src, dest, recursive = false) {
23
+ if (!fsOps.existsSync(src))
24
+ return false;
25
+ fsOps.cpSync(src, dest, recursive ? { recursive: true } : undefined);
26
+ return true;
27
+ }
28
+ export function backupOpenclawUserData(now = new Date(), fsOps = realBackupFs) {
29
+ const backupDir = `${OKCLAW_BACKUP_DIR}/openclaw-user-data-${formatBackupTimestamp(now)}`;
30
+ const workspaces = Array.from(new Set([OPENCLAW_WORKSPACE, LEGACY_OPENCLAW_WORKSPACE]));
31
+ let copiedItems = 0;
32
+ let copiedWorkspaces = 0;
33
+ for (const workspace of workspaces) {
34
+ if (!fsOps.existsSync(workspace))
35
+ continue;
36
+ const workspaceBackupName = copiedWorkspaces === 0 ? 'workspace' : 'workspace-root-openclaw';
37
+ const workspaceBackupDir = `${backupDir}/${workspaceBackupName}`;
38
+ let workspaceDirCreated = false;
39
+ const ensureWorkspaceBackupDir = () => {
40
+ if (workspaceDirCreated)
41
+ return;
42
+ fsOps.mkdirSync(workspaceBackupDir, { recursive: true });
43
+ workspaceDirCreated = true;
44
+ };
45
+ for (const file of OPENCLAW_USER_DATA_FILES) {
46
+ const src = `${workspace}/${file}`;
47
+ if (!fsOps.existsSync(src))
48
+ continue;
49
+ ensureWorkspaceBackupDir();
50
+ if (copyIfExists(fsOps, src, `${workspaceBackupDir}/${file}`)) {
51
+ copiedItems += 1;
52
+ }
53
+ }
54
+ const skillsDir = `${workspace}/skills`;
55
+ if (fsOps.existsSync(skillsDir) && fsOps.statSync(skillsDir).isDirectory()) {
56
+ ensureWorkspaceBackupDir();
57
+ if (copyIfExists(fsOps, skillsDir, `${workspaceBackupDir}/skills`, true)) {
58
+ copiedItems += 1;
59
+ }
60
+ }
61
+ if (workspaceDirCreated) {
62
+ copiedWorkspaces += 1;
63
+ }
64
+ }
65
+ return copiedItems > 0 ? backupDir : null;
66
+ }
7
67
  export class OpenclawInstaller {
8
68
  async checkDeps() {
9
69
  await checkDiskSpace(500);
@@ -25,12 +85,42 @@ export class OpenclawInstaller {
25
85
  info('Running native module builds...');
26
86
  await shell(`rm -f $(npm root -g)/openclaw/node_modules/@matrix-org/matrix-sdk-crypto-nodejs/download-lib.js 2>/dev/null || true`);
27
87
  await shell(`cd $(npm root -g)/openclaw && npm rebuild --no-audit --no-fund 2>&1 || true`);
28
- // Set gateway.mode=local so gateway can start without --allow-unconfigured
29
- await shell("openclaw config set gateway.mode local").catch(() => { });
30
- info('Registering openclaw gateway as system service...');
31
- await shell('openclaw gateway install --force').catch(() => {
32
- warn('gateway install skipped (may not be supported on this platform)');
88
+ // OpenViking purge phase B: after the new openclaw CLI is installed, but
89
+ // before onboard reads config. No residue means purgePhaseB returns quickly.
90
+ info('Running openviking purge phase B (config + extensions cleanup)...');
91
+ await purgePhaseB();
92
+ // Initialize openclaw non-interactively. Replaces an older
93
+ // `openclaw config set gateway.mode local` call that targeted a config key
94
+ // removed in current openclaw — the silent catch was hiding the failure and
95
+ // leaving gateway in a half-configured state that kept asking for device pairing.
96
+ info('Initializing openclaw (non-interactive)...');
97
+ // openclaw 要求 headless 调用显式承认风险(默认模式,不锁定 local/remote)。
98
+ // 见 https://docs.openclaw.ai/security
99
+ // --skip-health:部署阶段会在 onboard 之后单独起 gateway 进程,
100
+ // 这里跳过健康检查,避免在 daemon 尚未启动时误判失败。
101
+ await shell('openclaw onboard --non-interactive --accept-risk --skip-health');
102
+ // Some hosts have an openclaw gateway daemon already running (e.g.
103
+ // re-install on a host that previously hosted a shrimp, or systemd unit
104
+ // installed on a prior install pulls it back). When that daemon is up,
105
+ // its config-file watcher writes its own metadata back into openclaw.json
106
+ // on every change, racing the `openclaw config set` atomic write hash
107
+ // check below and producing ConfigMutationConflictError. Stop the daemon
108
+ // before mutating openclaw.json; the bootstrap orchestrator restarts it
109
+ // after the full install pipeline completes.
110
+ await stopDaemonForExclusiveAccess('openclaw deployment defaults');
111
+ info('Applying openclaw deployment defaults...');
112
+ await shell('openclaw config unset plugins.slots.contextEngine').catch(() => {
113
+ warn('Failed to unset legacy contextEngine slot, continuing...');
114
+ });
115
+ // openclaw 2026.4.26 起,bundled plugin 注册路径变了:dist/extensions/memory-core
116
+ // 物理存在但不会被自动注册进 plugin registry,这里 set 会以
117
+ // "plugin not found: memory-core" 失败。当前没找到 v2026.4.26 下注册它的官方手段
118
+ // (doctor/onboard/postinstall 都不补),先 catch 住不让整个安装挂掉,让 onboard
119
+ // 留下的默认 memory slot 跑起来;后续找到正解再去掉这层兜底。
120
+ await shell('openclaw config set plugins.slots.memory memory-core').catch(() => {
121
+ warn('Failed to set memory slot to memory-core (plugin not registered), continuing...');
33
122
  });
123
+ await shell('openclaw config set tools.profile full');
34
124
  info(`openclaw@${version} installed.`);
35
125
  }
36
126
  /**
@@ -48,6 +138,19 @@ export class OpenclawInstaller {
48
138
  async configure(config) {
49
139
  if (Object.keys(config).length === 0)
50
140
  return;
141
+ // Same race as install(): the daemon's file watcher writes its own
142
+ // metadata back into openclaw.json on every change. configure() does
143
+ // a writeFileSync (line below) followed by `openclaw config set
144
+ // agents.defaults.model.primary`; without stopping the daemon first
145
+ // the daemon can either:
146
+ // - race the cli atomic write hash check → ConfigMutationConflictError
147
+ // - silently overwrite cli-written fields with its own stale snapshot
148
+ // (cli writes channels.dingtalk.clientSecret → daemon reload picks
149
+ // up an older view that didn't have it → daemon rewrites the
150
+ // channels block without clientSecret)
151
+ // The latter form looks like a successful deploy with mysteriously
152
+ // missing config fields. Stop the daemon for the entire configure().
153
+ await stopDaemonForExclusiveAccess('openclaw provider config');
51
154
  info('Configuring openclaw models & providers...');
52
155
  let openclawConfig = {};
53
156
  if (existsSync(OPENCLAW_CONFIG)) {
@@ -100,5 +203,65 @@ export class OpenclawInstaller {
100
203
  }
101
204
  info('openclaw configured.');
102
205
  }
206
+ async uninstall() {
207
+ info('Stopping openclaw...');
208
+ // okclaw command may not exist (CLI early state), tolerate
209
+ await shell(`okclaw stop 2>/dev/null || true`).catch(() => { });
210
+ const userDataBackupDir = backupOpenclawUserData();
211
+ if (userDataBackupDir) {
212
+ info(`Backed up openclaw user data to ${userDataBackupDir}`);
213
+ }
214
+ else {
215
+ info('No openclaw user data found to back up before uninstall.');
216
+ }
217
+ // 先让 openclaw 自己卸掉 systemd user unit(stop + disable + 删 .service 文件),
218
+ // 否则 pkill + npm uninstall 只删二进制,service 文件留着仍指向旧路径,新版装完
219
+ // systemd 会在旧 ExecStart 上无限 restart 直到下次手工 restart。
220
+ await shell(`openclaw gateway uninstall 2>/dev/null || true`).catch(() => { });
221
+ // 兜底杀掉残留的 gateway 进程。这里不要宽匹配 "openclaw",否则会把
222
+ // 当前正在执行 uninstall 的 CLI 进程自己也一起杀掉,后续卸载步骤会中断。
223
+ await shell(`pkill -9 -f 'openclaw-gateway' 2>/dev/null || true`).catch(() => { });
224
+ // 多 package manager 容忍:主机可能用 npm / pnpm / yarn 任一装过 openclaw,
225
+ // 没装的包管理器跑也 tolerate,各自清各自的 store。
226
+ // 见 P5 真机排障:测试主机 which openclaw 指向 /root/.local/share/pnpm/openclaw,
227
+ // 单跑 npm uninstall 清不掉 pnpm 位置 → verifier 在 sudo 下(PATH 不含 pnpm bin)
228
+ // 假阴性通过,但用户 shell 仍能跑。
229
+ info('Uninstalling openclaw via known package managers (best-effort)...');
230
+ await shell(`npm uninstall -g openclaw --no-audit --no-fund 2>/dev/null || true`).catch(() => { });
231
+ await shell(`pnpm rm -g openclaw 2>/dev/null || true`).catch(() => { });
232
+ await shell(`yarn global remove openclaw 2>/dev/null || true`).catch(() => { });
233
+ // openclaw 可能自己写过 /usr/local/bin/openclaw 这类 PATH 入口,
234
+ // 这一层不受 npm uninstall 管辖,所以这里额外清理。
235
+ await shell(`rm -f /usr/local/bin/openclaw 2>/dev/null || true`).catch(() => { });
236
+ // 兜底扫描:用增广 PATH(涵盖 pnpm / yarn / user-local / nvm 各全局 bin)跑
237
+ // command -v 定位任意残留,循环 rm 直到找不到。覆盖:
238
+ // - sudo secure_path 剔除了 ~/.local/share/pnpm 导致 verifier 假阴性
239
+ // - symlink 链(bin → 真文件 → 再有一层 symlink)
240
+ // - 未来新增 pm 装到新位置(npm cache / corepack 等)
241
+ const PATH_AUG = '/usr/local/bin:/usr/bin:/bin:/root/.local/share/pnpm:/root/.yarn/bin:/root/.local/bin';
242
+ info('Scanning & removing any leftover openclaw binaries...');
243
+ for (let i = 0; i < 3; i++) {
244
+ const scan = await shellCapture(`PATH="${PATH_AUG}:$PATH" command -v openclaw || true`);
245
+ const leftover = (scan.stdout ?? '').trim();
246
+ if (!leftover)
247
+ break;
248
+ info(` found leftover: ${leftover}, removing`);
249
+ // 命令里路径用单引号包住,防空格 / 特殊字符;内部 ' 转义成 '\''
250
+ const safe = leftover.replace(/'/g, `'\\''`);
251
+ await shell(`rm -f '${safe}' 2>/dev/null || true`).catch(() => { });
252
+ }
253
+ info('Verifying openclaw fully removed...');
254
+ const check = await shellCapture(`PATH="${PATH_AUG}:$PATH" command -v openclaw || true`);
255
+ const resolvedPath = (check.stdout ?? '').trim();
256
+ if (resolvedPath) {
257
+ throw new Error(`openclaw still found after uninstall: ${resolvedPath}`);
258
+ }
259
+ info(`Removing ${OPENCLAW_HOME}...`);
260
+ rmSync(OPENCLAW_HOME, { recursive: true, force: true });
261
+ if (existsSync(OPENCLAW_HOME)) {
262
+ throw new Error(`${OPENCLAW_HOME} still exists after removal`);
263
+ }
264
+ info('openclaw uninstalled.');
265
+ }
103
266
  }
104
267
  //# sourceMappingURL=openclaw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/installers/openclaw.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/installers/openclaw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export declare const PURGE_PATHS: readonly string[];
2
+ export interface Detection {
3
+ installed: boolean;
4
+ signals: {
5
+ configHasPlugin: boolean;
6
+ extensionsDir: string[];
7
+ runningPid?: number;
8
+ venvDir: boolean;
9
+ envFile: boolean;
10
+ serverHome: boolean;
11
+ dataDir: boolean;
12
+ };
13
+ }
14
+ export interface DetectDeps {
15
+ fileExists: (path: string) => boolean;
16
+ readOpenclawConfig: () => Record<string, unknown> | undefined;
17
+ pgrepOpenviking: () => number | undefined;
18
+ }
19
+ export interface PhaseADeps extends DetectDeps {
20
+ shell: (cmd: string) => Promise<void> | void;
21
+ cpSync: (src: string, dst: string) => void;
22
+ mkdirpSync: (path: string) => void;
23
+ writeFile: (path: string, content: string) => void;
24
+ hostname: () => string;
25
+ now: () => Date;
26
+ }
27
+ export interface PhaseBDeps extends DetectDeps {
28
+ configGet: (path: string) => unknown | undefined;
29
+ configSet: (path: string, valueJson: string) => void;
30
+ configUnset: (path: string) => void;
31
+ configValidate: () => boolean;
32
+ readFile?: (path: string) => string;
33
+ cpSync: (src: string, dst: string) => void;
34
+ renameSync: (src: string, dst: string) => void;
35
+ mkdirpSync: (path: string) => void;
36
+ lstat: (path: string) => {
37
+ isSymbolicLink: () => boolean;
38
+ } | undefined;
39
+ findLatestBackupDir: () => string | undefined;
40
+ purgePaths?: readonly string[];
41
+ now: () => Date;
42
+ }
43
+ export type PhaseAResult = {
44
+ skipped: true;
45
+ } | {
46
+ skipped: false;
47
+ backupDir: string;
48
+ };
49
+ export declare function detectOpenviking(deps?: Partial<DetectDeps>): Detection;
50
+ export declare function purgePhaseA(detection: Detection, deps?: Partial<PhaseADeps>): Promise<PhaseAResult>;
51
+ export declare function assertPurged(deps?: Partial<PhaseBDeps>): void;
52
+ export declare function purgePhaseB(deps?: Partial<PhaseBDeps>): Promise<void>;