@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
@@ -0,0 +1,46 @@
1
+ import { OpenclawInstaller } from '../installers/openclaw.js';
2
+ import { error, info, success } from '../utils/logger.js';
3
+ import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
4
+ function getInstaller(component) {
5
+ switch (component) {
6
+ case 'openclaw': return new OpenclawInstaller();
7
+ default: return null;
8
+ }
9
+ }
10
+ export async function uninstallCommand(args) {
11
+ const emitter = new NdjsonEmitter('uninstall');
12
+ registerExitHandlers(emitter);
13
+ const component = args[0];
14
+ if (!component) {
15
+ error('Usage: okclaw uninstall <component>');
16
+ emitter.end(false, 1, 'E_USAGE');
17
+ process.exit(1);
18
+ }
19
+ const installer = getInstaller(component);
20
+ if (!installer) {
21
+ error(`Uninstall not supported for component: ${component}`);
22
+ emitter.end(false, 1, 'E_UNSUPPORTED');
23
+ process.exit(1);
24
+ }
25
+ if (!installer.uninstall) {
26
+ error(`Component ${component} does not support uninstall`);
27
+ emitter.end(false, 1, 'E_UNSUPPORTED');
28
+ process.exit(1);
29
+ }
30
+ emitter.start(`uninstalling ${component}`, { component });
31
+ info(`Uninstalling ${component}...`);
32
+ try {
33
+ emitter.stepStart('uninstall', `running uninstall for ${component}`);
34
+ await installer.uninstall();
35
+ emitter.stepDone('uninstall', `${component} uninstalled`);
36
+ success(`${component} uninstalled.`);
37
+ emitter.end(true, 0, undefined, { component });
38
+ }
39
+ catch (e) {
40
+ const msg = e instanceof Error ? e.message : String(e);
41
+ error(msg);
42
+ emitter.end(false, 1, 'E_UNINSTALL_FAILED', { error: msg });
43
+ process.exit(1);
44
+ }
45
+ }
46
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,SAAS,YAAY,CAAC,SAAiB;IACrC,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;QAChD,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAc;IACnD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;IAC/C,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,KAAK,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACzB,KAAK,CAAC,aAAa,SAAS,6BAA6B,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,gBAAgB,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,gBAAgB,SAAS,KAAK,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,yBAAyB,SAAS,EAAE,CAAC,CAAC;QACrE,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,SAAS,cAAc,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,SAAS,eAAe,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -1,21 +1,76 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import { installCommand } from './commands/install.js';
3
+ import { uninstallCommand } from './commands/uninstall.js';
3
4
  import { checkCommand } from './commands/check.js';
4
5
  import { editCommand } from './commands/edit.js';
6
+ import { showCommand } from './commands/show.js';
5
7
  import { feedCommand } from './commands/feed.js';
8
+ import { backupCommand } from './commands/backup.js';
9
+ import { restoreCommand } from './commands/restore.js';
6
10
  import { startCommand, stopCommand, restartCommand, statusCommand } from './commands/service.js';
11
+ import { skillCommand } from './commands/skill.js';
7
12
  import { ensureRoot } from './utils/shell.js';
8
13
  import { error } from './utils/logger.js';
9
- const [command, ...args] = process.argv.slice(2);
14
+ import { setNdjsonPath, setOutputMode, isNdjson } from './output/mode.js';
15
+ import { getActiveEmitter, NdjsonEmitter } from './output/ndjson.js';
16
+ /**
17
+ * 从 argv 里抽出全局 flag --output=<mode> 和 --op-id=<uuid>,返回剩余参数。
18
+ * 支持 "--flag=value" 与 "--flag value" 两种写法。
19
+ */
20
+ function extractGlobalFlags(argv) {
21
+ const rest = [];
22
+ let output = 'text';
23
+ let opId;
24
+ let ndjsonPath;
25
+ for (let i = 0; i < argv.length; i++) {
26
+ const arg = argv[i];
27
+ if (arg === '--output' && argv[i + 1]) {
28
+ output = argv[++i] === 'ndjson' ? 'ndjson' : 'text';
29
+ continue;
30
+ }
31
+ if (arg.startsWith('--output=')) {
32
+ output = arg.slice('--output='.length) === 'ndjson' ? 'ndjson' : 'text';
33
+ continue;
34
+ }
35
+ if (arg === '--op-id' && argv[i + 1]) {
36
+ opId = argv[++i];
37
+ continue;
38
+ }
39
+ if (arg.startsWith('--op-id=')) {
40
+ opId = arg.slice('--op-id='.length);
41
+ continue;
42
+ }
43
+ if (arg === '--ndjson-path' && argv[i + 1]) {
44
+ ndjsonPath = argv[++i];
45
+ continue;
46
+ }
47
+ if (arg.startsWith('--ndjson-path=')) {
48
+ ndjsonPath = arg.slice('--ndjson-path='.length);
49
+ continue;
50
+ }
51
+ rest.push(arg);
52
+ }
53
+ return { rest, output, opId, ndjsonPath };
54
+ }
55
+ const { rest, output, opId, ndjsonPath } = extractGlobalFlags(process.argv.slice(2));
56
+ setOutputMode(output, opId);
57
+ setNdjsonPath(ndjsonPath);
58
+ const [command, ...args] = rest;
10
59
  async function main() {
11
60
  // All commands require root (or auto-sudo)
12
61
  if (command && command !== '--help' && command !== '-h' && command !== '--version' && command !== '-v') {
13
62
  ensureRoot();
14
63
  }
15
64
  switch (command) {
65
+ case 'skill':
66
+ await skillCommand(args);
67
+ break;
16
68
  case 'install':
17
69
  await installCommand(args);
18
70
  break;
71
+ case 'uninstall':
72
+ await uninstallCommand(args);
73
+ break;
19
74
  case 'check':
20
75
  await checkCommand();
21
76
  break;
@@ -34,9 +89,18 @@ async function main() {
34
89
  case 'edit':
35
90
  await editCommand(args);
36
91
  break;
92
+ case 'show':
93
+ await showCommand(args);
94
+ break;
37
95
  case 'feed':
38
96
  await feedCommand(args);
39
97
  break;
98
+ case 'backup':
99
+ await backupCommand(args);
100
+ break;
101
+ case 'restore':
102
+ await restoreCommand(args);
103
+ break;
40
104
  case '--version':
41
105
  case '-v': {
42
106
  const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
@@ -58,22 +122,33 @@ function printHelp() {
58
122
  console.log(`
59
123
  okclaw - OKClaw Deployment CLI
60
124
 
61
- Usage: okclaw <command> [args...]
125
+ Usage: okclaw [global-flags] <command> [args...]
62
126
 
127
+ Global flags (before the command):
128
+ --output text|ndjson Output mode (default: text)
129
+ --op-id <uuid> Operation id, echoed in every ndjson event's fields.opId
130
+ --ndjson-path <path> Append ndjson to file instead of stdout (used in detached mode)
131
+
132
+ okclaw skill install <name> --version <ver> [--package-url <url>] Install a skill
133
+ okclaw skill uninstall <name> Uninstall a skill
63
134
  okclaw install <component> --version <ver> [--config '<json>'] [--config-file <path>] [--package-url <url>]
135
+ okclaw uninstall <component> Uninstall a component (currently: openclaw)
64
136
  okclaw check Check & install system dependencies
65
137
  okclaw start Start openclaw gateway
66
138
  okclaw stop Stop openclaw gateway
67
139
  okclaw restart Restart openclaw gateway
68
140
  okclaw status Show gateway status
69
- okclaw edit <target> --file <path> Write config file (user/identity/soul/agents)
141
+ okclaw edit <target> --file <path> Write config file (user/identity/soul/agents/memory/tools/openclaw-json)
142
+ okclaw show <target...> Read config file content to stdout (batch requires --output=ndjson)
70
143
  okclaw feed --file <path> Feed file into knowledge base
144
+ okclaw backup openclaw-user-data --archive [--archive-path <path>]
145
+ okclaw restore openclaw-user-data --archive <path>
71
146
 
72
147
  Components:
73
148
  openclaw Core AI Agent framework (npm install)
74
149
  openviking Long-term memory plugin (pip + openclaw plugin, needs --package-url)
75
- dingtalk DingTalk channel (npm: @largezhou/ddingtalk)
76
- feishu Feishu/Lark channel (npm: @openclaw/feishu)
150
+ dingtalk DingTalk channel (npm: @soimy/dingtalk)
151
+ feishu Feishu/Lark channel (bundled with OpenClaw, config only)
77
152
  wechat WeChat channel (npm: @tencent-weixin/openclaw-weixin)
78
153
  s3 S3 IM channel (needs --package-url)
79
154
 
@@ -82,6 +157,9 @@ Examples:
82
157
  okclaw install openviking --version 0.2.15 --package-url /tmp/ov-plugin.tar.gz --config-file /root/okclaw/config/openviking.json
83
158
  okclaw install dingtalk --version 2.0.1 --config '{"clientId":"xxx","clientSecret":"xxx"}'
84
159
  okclaw install s3 --version 1.0.0 --package-url /tmp/channel-s3.tar.gz
160
+ okclaw uninstall openclaw
161
+ okclaw skill install my-skill --version 1.0.0 --package-url https://example.com/skill.zip
162
+ okclaw skill uninstall my-skill
85
163
  okclaw restart
86
164
  okclaw status
87
165
 
@@ -89,11 +167,26 @@ Notes:
89
167
  - All commands auto-elevate to root via sudo if needed
90
168
  - All paths are anchored to /root/ (forced HOME=/root)
91
169
  - npm uses npmmirror, pip uses tsinghua mirror (China acceleration)
92
- - Node.js >= 22.16 and Python >= 3.11 are auto-installed if missing
170
+ - Node.js >= 24 (LTS) is auto-installed/upgraded via nvm if missing or too old
93
171
  `);
94
172
  }
95
173
  main().catch((err) => {
96
- error(String(err.message || err));
174
+ const msg = String(err?.message || err);
175
+ // bug#4 修:顶层 catch 兜底发 end,防止 os-api 永远等不到终态。
176
+ // 有活 emitter 就用它;没有(比如 extractGlobalFlags/ensureRoot 阶段崩)→ 直接写一行 fallback。
177
+ if (isNdjson()) {
178
+ const active = getActiveEmitter();
179
+ if (active && !active.hasEnded()) {
180
+ active.end(false, 1, 'E_TOPLEVEL', { error: msg });
181
+ }
182
+ else if (!active) {
183
+ // 没有任何 emitter 被注册过:手写一条 end 行
184
+ const fallback = new NdjsonEmitter('unknown');
185
+ fallback.start('top-level error');
186
+ fallback.end(false, 1, 'E_TOPLEVEL', { error: msg });
187
+ }
188
+ }
189
+ error(msg);
97
190
  process.exit(1);
98
191
  });
99
192
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEjD,KAAK,UAAU,IAAI;IACjB,2CAA2C;IAC3C,IAAI,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACvG,UAAU,EAAE,CAAC;IACf,CAAC;IAED,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM;QACR,KAAK,OAAO;YACV,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM;QACR,KAAK,OAAO;YACV,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,aAAa,EAAE,CAAC;YACtB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACZ,SAAS,EAAE,CAAC;YACZ,MAAM;QACR;YACE,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YACrC,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCb,CAAC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAmB,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAErE;;;GAGG;AACH,SAAS,kBAAkB,CAAC,IAAc;IAMxC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,MAAM,GAAe,MAAM,CAAC;IAChC,IAAI,IAAwB,CAAC;IAC7B,IAAI,UAA8B,CAAC;IAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACtC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YACpD,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YACxE,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,eAAe,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3C,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrC,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC5B,aAAa,CAAC,UAAU,CAAC,CAAC;AAE1B,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAEhC,KAAK,UAAU,IAAI;IACjB,2CAA2C;IAC3C,IAAI,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACvG,UAAU,EAAE,CAAC;IACf,CAAC;IAED,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM;QACR,KAAK,WAAW;YACd,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM;QACR,KAAK,OAAO;YACV,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM;QACR,KAAK,OAAO;YACV,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,aAAa,EAAE,CAAC;YACtB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM;QACR,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACZ,SAAS,EAAE,CAAC;YACZ,MAAM;QACR;YACE,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YACrC,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDb,CAAC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;IACxC,8CAA8C;IAC9C,2EAA2E;IAC3E,IAAI,QAAQ,EAAE,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACnB,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;YAC9C,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAClC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,CAAC;IACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -2,4 +2,5 @@ export interface Installer {
2
2
  checkDeps(): Promise<void>;
3
3
  install(version: string, packageUrl?: string): Promise<void>;
4
4
  configure(config: Record<string, unknown>): Promise<void>;
5
+ uninstall?(): Promise<void>;
5
6
  }
@@ -4,8 +4,17 @@ export declare class ChannelInstaller implements Installer {
4
4
  constructor(channelName: string);
5
5
  checkDeps(): Promise<void>;
6
6
  install(version: string, packageUrl?: string): Promise<void>;
7
+ private verifyInstalled;
7
8
  configure(config: Record<string, unknown>): Promise<void>;
8
- private removeExistingPlugin;
9
+ /**
10
+ * Clean up both filesystem state (extensions/<name>) and openclaw.json state
11
+ * (plugins.entries/installs/allow.<name> + channels.<name>) for this channel,
12
+ * atomically. Partial cleanup — e.g., rm-ing the dir but leaving the JSON refs —
13
+ * leaves openclaw's config validation broken and poisons all subsequent
14
+ * `openclaw ...` commands ("unknown channel id: <name>").
15
+ */
16
+ private cleanupStaleState;
17
+ private hasJsonRef;
9
18
  private installFromLocalPackage;
10
19
  /**
11
20
  * Download tgz from npm (npmmirror) first, then install locally.
@@ -13,5 +22,11 @@ export declare class ChannelInstaller implements Installer {
13
22
  */
14
23
  private installViaNpmPack;
15
24
  private addToPluginsAllow;
25
+ /**
26
+ * Push the absolute extension dir into plugins.load.paths so the gateway
27
+ * scans it on startup. Idempotent — dedup against trailing-slash variants
28
+ * (e.g. `/.../dingtalk` vs `/.../dingtalk/` both count as the same entry).
29
+ */
30
+ private addToLoadPaths;
16
31
  private applyConfig;
17
32
  }
@@ -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)
@@ -118,10 +249,13 @@ export class ChannelInstaller {
118
249
  await this.applyConfig(value, path);
119
250
  }
120
251
  else {
121
- const strVal = String(value).replace(/'/g, "'\\''");
122
- await shell(`openclaw config set '${path}' '${strVal}'`).catch(() => {
123
- warn(`Failed to set ${path}`);
124
- });
252
+ const isJsonValue = Array.isArray(value);
253
+ const strVal = (isJsonValue ? JSON.stringify(value) : String(value)).replace(/'/g, "'\\''");
254
+ // Let errors propagate — silently skipping a config set leaves openclaw.json
255
+ // in a half-written state that breaks config validation at runtime.
256
+ await shell(isJsonValue
257
+ ? `openclaw config set '${path}' '${strVal}' --strict-json`
258
+ : `openclaw config set '${path}' -- '${strVal}'`);
125
259
  }
126
260
  }
127
261
  }
@@ -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,5 @@
1
1
  import type { Installer } from './base.js';
2
+ export { backupOpenclawUserData } from '../openclaw-user-data.js';
2
3
  export declare class OpenclawInstaller implements Installer {
3
4
  checkDeps(): Promise<void>;
4
5
  install(version: string): Promise<void>;
@@ -11,8 +12,15 @@ export declare class OpenclawInstaller implements Installer {
11
12
  * }
12
13
  * }
13
14
  *
14
- * Merges into openclaw.json -> models.providers
15
- * Sets agents.defaults.model to first provider's first model
15
+ * REPLACES openclaw.json -> models.providers entirely. The old merge
16
+ * semantics left stale providers behind on every deploy: switching from
17
+ * deepseek to qwen would still leave deepseek under models.providers.
18
+ * models.providers is a protected map in openclaw — full replacement
19
+ * requires the --replace flag, otherwise `openclaw config set` refuses
20
+ * to drop existing keys.
21
+ *
22
+ * Sets agents.defaults.model.primary to the first provider's first model.
16
23
  */
17
24
  configure(config: Record<string, unknown>): Promise<void>;
25
+ uninstall(): Promise<void>;
18
26
  }