@okclaw-build/cli 1.0.0-beta.5 → 1.0.0-beta.50

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 (85) hide show
  1. package/dist/commands/backup.d.ts +16 -0
  2. package/dist/commands/backup.js +72 -0
  3. package/dist/commands/backup.js.map +1 -0
  4. package/dist/commands/check.js +22 -6
  5. package/dist/commands/check.js.map +1 -1
  6. package/dist/commands/edit.d.ts +2 -7
  7. package/dist/commands/edit.js +27 -15
  8. package/dist/commands/edit.js.map +1 -1
  9. package/dist/commands/feed.js +63 -19
  10. package/dist/commands/feed.js.map +1 -1
  11. package/dist/commands/install.js +57 -9
  12. package/dist/commands/install.js.map +1 -1
  13. package/dist/commands/migration.d.ts +1 -0
  14. package/dist/commands/migration.js +205 -0
  15. package/dist/commands/migration.js.map +1 -0
  16. package/dist/commands/restore.d.ts +16 -0
  17. package/dist/commands/restore.js +67 -0
  18. package/dist/commands/restore.js.map +1 -0
  19. package/dist/commands/service.js +56 -13
  20. package/dist/commands/service.js.map +1 -1
  21. package/dist/commands/show.d.ts +13 -0
  22. package/dist/commands/show.js +70 -0
  23. package/dist/commands/show.js.map +1 -0
  24. package/dist/commands/skill.d.ts +1 -0
  25. package/dist/commands/skill.js +114 -0
  26. package/dist/commands/skill.js.map +1 -0
  27. package/dist/commands/uninstall.d.ts +1 -0
  28. package/dist/commands/uninstall.js +46 -0
  29. package/dist/commands/uninstall.js.map +1 -0
  30. package/dist/index.js +100 -7
  31. package/dist/index.js.map +1 -1
  32. package/dist/installers/base.d.ts +1 -0
  33. package/dist/installers/channel.d.ts +16 -1
  34. package/dist/installers/channel.js +143 -9
  35. package/dist/installers/channel.js.map +1 -1
  36. package/dist/installers/openclaw.d.ts +10 -2
  37. package/dist/installers/openclaw.js +140 -51
  38. package/dist/installers/openclaw.js.map +1 -1
  39. package/dist/installers/openviking-purge.d.ts +52 -0
  40. package/dist/installers/openviking-purge.js +380 -0
  41. package/dist/installers/openviking-purge.js.map +1 -0
  42. package/dist/installers/openviking.js +1 -2
  43. package/dist/installers/openviking.js.map +1 -1
  44. package/dist/installers/skill.d.ts +2 -0
  45. package/dist/installers/skill.js +35 -5
  46. package/dist/installers/skill.js.map +1 -1
  47. package/dist/migration/archive.d.ts +14 -0
  48. package/dist/migration/archive.js +84 -0
  49. package/dist/migration/archive.js.map +1 -0
  50. package/dist/migration/crypto.d.ts +16 -0
  51. package/dist/migration/crypto.js +56 -0
  52. package/dist/migration/crypto.js.map +1 -0
  53. package/dist/migration/manifest.d.ts +39 -0
  54. package/dist/migration/manifest.js +140 -0
  55. package/dist/migration/manifest.js.map +1 -0
  56. package/dist/openclaw-user-data.d.ts +66 -0
  57. package/dist/openclaw-user-data.js +283 -0
  58. package/dist/openclaw-user-data.js.map +1 -0
  59. package/dist/output/mode.d.ts +11 -0
  60. package/dist/output/mode.js +27 -0
  61. package/dist/output/mode.js.map +1 -0
  62. package/dist/output/ndjson.d.ts +57 -0
  63. package/dist/output/ndjson.js +136 -0
  64. package/dist/output/ndjson.js.map +1 -0
  65. package/dist/utils/constants.d.ts +8 -5
  66. package/dist/utils/constants.js +32 -7
  67. package/dist/utils/constants.js.map +1 -1
  68. package/dist/utils/deps.d.ts +34 -3
  69. package/dist/utils/deps.js +62 -100
  70. package/dist/utils/deps.js.map +1 -1
  71. package/dist/utils/logger.d.ts +10 -0
  72. package/dist/utils/logger.js +31 -4
  73. package/dist/utils/logger.js.map +1 -1
  74. package/dist/utils/mirror.js +14 -0
  75. package/dist/utils/mirror.js.map +1 -1
  76. package/dist/utils/openclaw-config-cli.d.ts +19 -0
  77. package/dist/utils/openclaw-config-cli.js +81 -0
  78. package/dist/utils/openclaw-config-cli.js.map +1 -0
  79. package/dist/utils/openclaw-daemon.d.ts +58 -0
  80. package/dist/utils/openclaw-daemon.js +154 -0
  81. package/dist/utils/openclaw-daemon.js.map +1 -0
  82. package/dist/utils/shell.d.ts +12 -2
  83. package/dist/utils/shell.js +80 -5
  84. package/dist/utils/shell.js.map +1 -1
  85. package/package.json +3 -2
@@ -1,8 +1,12 @@
1
- import { readFileSync, writeFileSync, existsSync, cpSync, mkdirSync } from 'node:fs';
2
- import { shell, shellRetry } from '../utils/shell.js';
1
+ import { existsSync, cpSync, mkdirSync, rmSync } 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 { stopDaemonForExclusiveAccess, stopGateway, cleanupGatewayServiceFiles, } from '../utils/openclaw-daemon.js';
5
6
  import { OPENCLAW_HOME, OKCLAW_BACKUP_DIR, NPM_REGISTRY } from '../utils/constants.js';
7
+ import { purgePhaseB } from './openviking-purge.js';
8
+ import { backupOpenclawUserData } from '../openclaw-user-data.js';
9
+ export { backupOpenclawUserData } from '../openclaw-user-data.js';
6
10
  const OPENCLAW_CONFIG = `${OPENCLAW_HOME}/openclaw.json`;
7
11
  export class OpenclawInstaller {
8
12
  async checkDeps() {
@@ -25,12 +29,47 @@ export class OpenclawInstaller {
25
29
  info('Running native module builds...');
26
30
  await shell(`rm -f $(npm root -g)/openclaw/node_modules/@matrix-org/matrix-sdk-crypto-nodejs/download-lib.js 2>/dev/null || true`);
27
31
  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)');
32
+ // OpenViking purge phase B: after the new openclaw CLI is installed, but
33
+ // before onboard reads config. No residue means purgePhaseB returns quickly.
34
+ info('Running openviking purge phase B (config + extensions cleanup)...');
35
+ await purgePhaseB();
36
+ // Initialize openclaw non-interactively. Replaces an older
37
+ // `openclaw config set gateway.mode local` call that targeted a config key
38
+ // removed in current openclaw — the silent catch was hiding the failure and
39
+ // leaving gateway in a half-configured state that kept asking for device pairing.
40
+ info('Initializing openclaw (non-interactive)...');
41
+ // openclaw 要求 headless 调用显式承认风险(默认模式,不锁定 local/remote)。
42
+ // 见 https://docs.openclaw.ai/security
43
+ // --skip-health:部署阶段会在 onboard 之后单独起 gateway 进程,
44
+ // 这里跳过健康检查,避免在 daemon 尚未启动时误判失败。
45
+ await shell('openclaw onboard --non-interactive --accept-risk --skip-health');
46
+ // Some hosts have an openclaw gateway daemon already running (e.g.
47
+ // re-install on a host that previously hosted a shrimp, or systemd unit
48
+ // installed on a prior install pulls it back). When that daemon is up,
49
+ // its config-file watcher writes its own metadata back into openclaw.json
50
+ // on every change, racing the `openclaw config set` atomic write hash
51
+ // check below and producing ConfigMutationConflictError. Stop the daemon
52
+ // before mutating openclaw.json; the bootstrap orchestrator restarts it
53
+ // after the full install pipeline completes.
54
+ await stopDaemonForExclusiveAccess('openclaw deployment defaults');
55
+ info('Applying openclaw deployment defaults...');
56
+ await shell('openclaw config unset plugins.slots.contextEngine').catch(() => {
57
+ warn('Failed to unset legacy contextEngine slot, continuing...');
33
58
  });
59
+ // openclaw 2026.4.26 起,bundled plugin 注册路径变了:dist/extensions/memory-core
60
+ // 物理存在但不会被自动注册进 plugin registry,这里 set 会以
61
+ // "plugin not found: memory-core" 失败。当前没找到 v2026.4.26 下注册它的官方手段
62
+ // (doctor/onboard/postinstall 都不补),先 catch 住不让整个安装挂掉,让 onboard
63
+ // 留下的默认 memory slot 跑起来;后续找到正解再去掉这层兜底。
64
+ await shell('openclaw config set plugins.slots.memory memory-core').catch(() => {
65
+ warn('Failed to set memory slot to memory-core (plugin not registered), continuing...');
66
+ });
67
+ // OKClaw 部署的 OpenClaw 实例不需要主动 agent heartbeat;设为 0m
68
+ // 是持久关闭,必须在 gateway 启动前写入配置。
69
+ await shell('openclaw config set agents.defaults.heartbeat.every "0m"').catch(() => {
70
+ warn('Failed to disable OpenClaw heartbeat, continuing...');
71
+ });
72
+ await shell('openclaw config set tools.profile full');
34
73
  info(`openclaw@${version} installed.`);
35
74
  }
36
75
  /**
@@ -42,63 +81,113 @@ export class OpenclawInstaller {
42
81
  * }
43
82
  * }
44
83
  *
45
- * Merges into openclaw.json -> models.providers
46
- * Sets agents.defaults.model to first provider's first model
84
+ * REPLACES openclaw.json -> models.providers entirely. The old merge
85
+ * semantics left stale providers behind on every deploy: switching from
86
+ * deepseek to qwen would still leave deepseek under models.providers.
87
+ * models.providers is a protected map in openclaw — full replacement
88
+ * requires the --replace flag, otherwise `openclaw config set` refuses
89
+ * to drop existing keys.
90
+ *
91
+ * Sets agents.defaults.model.primary to the first provider's first model.
47
92
  */
48
93
  async configure(config) {
49
94
  if (Object.keys(config).length === 0)
50
95
  return;
96
+ // `openclaw config set` does a hash-checked atomic replace on
97
+ // openclaw.json; if the daemon's file-watcher writes its own snapshot
98
+ // back mid-flight the cli set either fails with
99
+ // ConfigMutationConflictError or silently overwrites cli-written
100
+ // fields with a stale view (e.g. dingtalk.clientSecret disappears
101
+ // after a successful-looking deploy). Stop the daemon for the entire
102
+ // configure() window.
103
+ await stopDaemonForExclusiveAccess('openclaw provider config');
51
104
  info('Configuring openclaw models & providers...');
52
- let openclawConfig = {};
53
- if (existsSync(OPENCLAW_CONFIG)) {
54
- try {
55
- openclawConfig = JSON.parse(readFileSync(OPENCLAW_CONFIG, 'utf8'));
56
- }
57
- catch {
58
- warn('Failed to parse existing openclaw.json, starting fresh for models section.');
59
- }
60
- }
61
- // Ensure models.providers exists
62
- if (!openclawConfig.models || typeof openclawConfig.models !== 'object') {
63
- openclawConfig.models = { mode: 'merge', providers: {} };
64
- }
65
- const models = openclawConfig.models;
66
- if (!models.providers || typeof models.providers !== 'object') {
67
- models.providers = {};
68
- }
69
- const existingProviders = models.providers;
70
- // Merge providers and find default model
105
+ // Default model = first provider's first model id
71
106
  let defaultModel = '';
72
107
  for (const [providerName, providerConfig] of Object.entries(config)) {
73
- existingProviders[providerName] = providerConfig;
74
- info(`Added provider: ${providerName}`);
75
- if (!defaultModel) {
76
- const pc = providerConfig;
77
- const modelList = pc.models;
78
- if (modelList?.[0]?.id) {
79
- defaultModel = `${providerName}/${modelList[0].id}`;
80
- }
108
+ const pc = providerConfig;
109
+ const modelList = pc.models;
110
+ if (modelList?.[0]?.id) {
111
+ defaultModel = `${providerName}/${modelList[0].id}`;
112
+ break;
81
113
  }
82
114
  }
83
- // Write config
84
- mkdirSync(OPENCLAW_HOME, { recursive: true });
85
- writeFileSync(OPENCLAW_CONFIG, JSON.stringify(openclawConfig, null, 2) + '\n', 'utf8');
86
- info(`Written ${OPENCLAW_CONFIG}`);
87
- // Set default model — agents.defaults.model is { "primary": "provider/modelId" }
115
+ // Full replace via `openclaw config set ... --replace`. --strict-json
116
+ // forces JSON parsing (no raw-string fallback). Single quotes are
117
+ // escaped using the standard '\'' pattern so an apiKey containing a
118
+ // single quote doesn't break out of the shell argument.
119
+ const providersJson = JSON.stringify(config).replace(/'/g, `'\\''`);
120
+ await shell(`openclaw config set models.providers '${providersJson}' --strict-json --replace`);
121
+ info(`Replaced models.providers with: ${Object.keys(config).join(', ')}`);
88
122
  if (defaultModel) {
89
- info(`Setting default model: ${defaultModel}`);
90
- await shell(`openclaw config set agents.defaults.model.primary '${defaultModel}'`).catch(() => {
91
- warn('Failed to set default model via CLI, patching directly...');
92
- const agents = (openclawConfig.agents ?? {});
93
- const defaults = (agents.defaults ?? {});
94
- defaults.model = { primary: defaultModel };
95
- agents.defaults = defaults;
96
- openclawConfig.agents = agents;
97
- writeFileSync(OPENCLAW_CONFIG, JSON.stringify(openclawConfig, null, 2) + '\n', 'utf8');
98
- });
123
+ await shell(`openclaw config set agents.defaults.model.primary '${defaultModel}'`);
99
124
  info(`Default model: ${defaultModel}`);
100
125
  }
101
126
  info('openclaw configured.');
102
127
  }
128
+ async uninstall() {
129
+ info('Stopping openclaw...');
130
+ // okclaw command may not exist (CLI early state), tolerate
131
+ await shell(`okclaw stop 2>/dev/null || true`).catch(() => { });
132
+ const userDataBackupDir = backupOpenclawUserData();
133
+ if (userDataBackupDir) {
134
+ info(`Backed up openclaw user data to ${userDataBackupDir}`);
135
+ }
136
+ else {
137
+ info('No openclaw user data found to back up before uninstall.');
138
+ }
139
+ // 先让 openclaw 自己卸掉 systemd user unit(stop + disable + 删 .service 文件),
140
+ // 否则 pkill + npm uninstall 只删二进制,service 文件留着仍指向旧路径,新版装完
141
+ // systemd 会在旧 ExecStart 上无限 restart 直到下次手工 restart。
142
+ await shell(`openclaw gateway uninstall 2>/dev/null || true`).catch(() => { });
143
+ // `openclaw gateway uninstall` 只删主 .service,残留的 .bak / .service.d/
144
+ // drop-in 会污染下次 install,一并清掉。
145
+ await cleanupGatewayServiceFiles();
146
+ // 兜底停掉残留 gateway 进程(systemd 没接管的情况)。按监听端口杀 ——
147
+ // gateway 进程名在新版 openclaw 下是 `openclaw` / `node`,旧的
148
+ // `pkill -f openclaw-gateway` 匹配不到;按端口杀也绝不会误命中本 CLI 进程。
149
+ await stopGateway().catch(() => { });
150
+ // 多 package manager 容忍:主机可能用 npm / pnpm / yarn 任一装过 openclaw,
151
+ // 没装的包管理器跑也 tolerate,各自清各自的 store。
152
+ // 见 P5 真机排障:测试主机 which openclaw 指向 /root/.local/share/pnpm/openclaw,
153
+ // 单跑 npm uninstall 清不掉 pnpm 位置 → verifier 在 sudo 下(PATH 不含 pnpm bin)
154
+ // 假阴性通过,但用户 shell 仍能跑。
155
+ info('Uninstalling openclaw via known package managers (best-effort)...');
156
+ await shell(`npm uninstall -g openclaw --no-audit --no-fund 2>/dev/null || true`).catch(() => { });
157
+ await shell(`pnpm rm -g openclaw 2>/dev/null || true`).catch(() => { });
158
+ await shell(`yarn global remove openclaw 2>/dev/null || true`).catch(() => { });
159
+ // openclaw 可能自己写过 /usr/local/bin/openclaw 这类 PATH 入口,
160
+ // 这一层不受 npm uninstall 管辖,所以这里额外清理。
161
+ await shell(`rm -f /usr/local/bin/openclaw 2>/dev/null || true`).catch(() => { });
162
+ // 兜底扫描:用增广 PATH(涵盖 pnpm / yarn / user-local / nvm 各全局 bin)跑
163
+ // command -v 定位任意残留,循环 rm 直到找不到。覆盖:
164
+ // - sudo secure_path 剔除了 ~/.local/share/pnpm 导致 verifier 假阴性
165
+ // - symlink 链(bin → 真文件 → 再有一层 symlink)
166
+ // - 未来新增 pm 装到新位置(npm cache / corepack 等)
167
+ const PATH_AUG = '/usr/local/bin:/usr/bin:/bin:/root/.local/share/pnpm:/root/.yarn/bin:/root/.local/bin';
168
+ info('Scanning & removing any leftover openclaw binaries...');
169
+ for (let i = 0; i < 3; i++) {
170
+ const scan = await shellCapture(`PATH="${PATH_AUG}:$PATH" command -v openclaw || true`);
171
+ const leftover = (scan.stdout ?? '').trim();
172
+ if (!leftover)
173
+ break;
174
+ info(` found leftover: ${leftover}, removing`);
175
+ // 命令里路径用单引号包住,防空格 / 特殊字符;内部 ' 转义成 '\''
176
+ const safe = leftover.replace(/'/g, `'\\''`);
177
+ await shell(`rm -f '${safe}' 2>/dev/null || true`).catch(() => { });
178
+ }
179
+ info('Verifying openclaw fully removed...');
180
+ const check = await shellCapture(`PATH="${PATH_AUG}:$PATH" command -v openclaw || true`);
181
+ const resolvedPath = (check.stdout ?? '').trim();
182
+ if (resolvedPath) {
183
+ throw new Error(`openclaw still found after uninstall: ${resolvedPath}`);
184
+ }
185
+ info(`Removing ${OPENCLAW_HOME}...`);
186
+ rmSync(OPENCLAW_HOME, { recursive: true, force: true });
187
+ if (existsSync(OPENCLAW_HOME)) {
188
+ throw new Error(`${OPENCLAW_HOME} still exists after removal`);
189
+ }
190
+ info('openclaw uninstalled.');
191
+ }
103
192
  }
104
193
  //# 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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEhE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,4BAA4B,EAC5B,WAAW,EACX,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,eAAe,GAAG,GAAG,aAAa,gBAAgB,CAAC;AAEzD,MAAM,OAAO,iBAAiB;IAC5B,KAAK,CAAC,SAAS;QACb,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,iBAAiB,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,GAAG,iBAAiB,oBAAoB,EAAE,EAAE,CAAC;YAC/D,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,eAAe,EAAE,GAAG,SAAS,gBAAgB,CAAC,CAAC;YACtD,IAAI,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,uBAAuB,OAAO,KAAK,CAAC,CAAC;QAC1C,mFAAmF;QACnF,mEAAmE;QACnE,MAAM,UAAU,CACd,2BAA2B,OAAO,eAAe,YAAY,wCAAwC,CACtG,CAAC;QACF,0EAA0E;QAC1E,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACxC,MAAM,KAAK,CACT,qHAAqH,CACtH,CAAC;QACF,MAAM,KAAK,CACT,6EAA6E,CAC9E,CAAC;QAEF,yEAAyE;QACzE,6EAA6E;QAC7E,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAC1E,MAAM,WAAW,EAAE,CAAC;QAEpB,2DAA2D;QAC3D,2EAA2E;QAC3E,4EAA4E;QAC5E,kFAAkF;QAClF,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACnD,wDAAwD;QACxD,sCAAsC;QACtC,iDAAiD;QACjD,iCAAiC;QACjC,MAAM,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAE9E,mEAAmE;QACnE,wEAAwE;QACxE,uEAAuE;QACvE,0EAA0E;QAC1E,sEAAsE;QACtE,yEAAyE;QACzE,wEAAwE;QACxE,6CAA6C;QAC7C,MAAM,4BAA4B,CAAC,8BAA8B,CAAC,CAAC;QAEnE,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC,mDAAmD,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAC1E,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QACH,yEAAyE;QACzE,0CAA0C;QAC1C,gEAAgE;QAChE,+DAA+D;QAC/D,uCAAuC;QACvC,MAAM,KAAK,CAAC,sDAAsD,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAC7E,IAAI,CAAC,iFAAiF,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;QACH,oDAAoD;QACpD,6BAA6B;QAC7B,MAAM,KAAK,CAAC,0DAA0D,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACjF,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAEtD,IAAI,CAAC,YAAY,OAAO,aAAa,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,SAAS,CAAC,MAA+B;QAC7C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE7C,8DAA8D;QAC9D,sEAAsE;QACtE,gDAAgD;QAChD,iEAAiE;QACjE,kEAAkE;QAClE,qEAAqE;QACrE,sBAAsB;QACtB,MAAM,4BAA4B,CAAC,0BAA0B,CAAC,CAAC;QAE/D,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAEnD,kDAAkD;QAClD,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpE,MAAM,EAAE,GAAG,cAAyC,CAAC;YACrD,MAAM,SAAS,GAAG,EAAE,CAAC,MAAoD,CAAC;YAC1E,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;gBACvB,YAAY,GAAG,GAAG,YAAY,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM;YACR,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,kEAAkE;QAClE,oEAAoE;QACpE,wDAAwD;QACxD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,KAAK,CACT,yCAAyC,aAAa,2BAA2B,CAClF,CAAC;QACF,IAAI,CAAC,mCAAmC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE1E,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC,sDAAsD,YAAY,GAAG,CAAC,CAAC;YACnF,IAAI,CAAC,kBAAkB,YAAY,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7B,2DAA2D;QAC3D,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE/D,MAAM,iBAAiB,GAAG,sBAAsB,EAAE,CAAC;QACnD,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC,mCAAmC,iBAAiB,EAAE,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACnE,CAAC;QAED,sEAAsE;QACtE,yDAAyD;QACzD,oDAAoD;QACpD,MAAM,KAAK,CAAC,gDAAgD,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9E,mEAAmE;QACnE,8BAA8B;QAC9B,MAAM,0BAA0B,EAAE,CAAC;QACnC,8CAA8C;QAC9C,oDAAoD;QACpD,wDAAwD;QACxD,MAAM,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEpC,8DAA8D;QAC9D,mCAAmC;QACnC,qEAAqE;QACrE,qEAAqE;QACrE,uBAAuB;QACvB,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAC1E,MAAM,KAAK,CAAC,oEAAoE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClG,MAAM,KAAK,CAAC,yCAAyC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,MAAM,KAAK,CAAC,iDAAiD,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE/E,sDAAsD;QACtD,mCAAmC;QACnC,MAAM,KAAK,CAAC,mDAAmD,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEjF,4DAA4D;QAC5D,oCAAoC;QACpC,+DAA+D;QAC/D,0CAA0C;QAC1C,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,uFAAuF,CAAC;QACzG,IAAI,CAAC,uDAAuD,CAAC,CAAC;QAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,SAAS,QAAQ,qCAAqC,CAAC,CAAC;YACxF,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,QAAQ;gBAAE,MAAM;YACrB,IAAI,CAAC,qBAAqB,QAAQ,YAAY,CAAC,CAAC;YAChD,uCAAuC;YACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC,UAAU,IAAI,uBAAuB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,QAAQ,qCAAqC,CAAC,CAAC;QACzF,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,yCAAyC,YAAY,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC,YAAY,aAAa,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,aAAa,6BAA6B,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -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>;