@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.
- package/dist/commands/backup.d.ts +16 -0
- package/dist/commands/backup.js +72 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/check.js +22 -6
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/edit.d.ts +2 -7
- package/dist/commands/edit.js +27 -15
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/feed.js +63 -19
- package/dist/commands/feed.js.map +1 -1
- package/dist/commands/install.js +57 -9
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/migration.d.ts +1 -0
- package/dist/commands/migration.js +205 -0
- package/dist/commands/migration.js.map +1 -0
- package/dist/commands/restore.d.ts +16 -0
- package/dist/commands/restore.js +67 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/service.js +56 -13
- package/dist/commands/service.js.map +1 -1
- package/dist/commands/show.d.ts +13 -0
- package/dist/commands/show.js +70 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/skill.d.ts +1 -0
- package/dist/commands/skill.js +114 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/uninstall.d.ts +1 -0
- package/dist/commands/uninstall.js +46 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/index.js +100 -7
- package/dist/index.js.map +1 -1
- package/dist/installers/base.d.ts +1 -0
- package/dist/installers/channel.d.ts +16 -1
- package/dist/installers/channel.js +143 -9
- package/dist/installers/channel.js.map +1 -1
- package/dist/installers/openclaw.d.ts +10 -2
- package/dist/installers/openclaw.js +140 -51
- package/dist/installers/openclaw.js.map +1 -1
- package/dist/installers/openviking-purge.d.ts +52 -0
- package/dist/installers/openviking-purge.js +380 -0
- package/dist/installers/openviking-purge.js.map +1 -0
- package/dist/installers/openviking.js +1 -2
- package/dist/installers/openviking.js.map +1 -1
- package/dist/installers/skill.d.ts +2 -0
- package/dist/installers/skill.js +35 -5
- package/dist/installers/skill.js.map +1 -1
- package/dist/migration/archive.d.ts +14 -0
- package/dist/migration/archive.js +84 -0
- package/dist/migration/archive.js.map +1 -0
- package/dist/migration/crypto.d.ts +16 -0
- package/dist/migration/crypto.js +56 -0
- package/dist/migration/crypto.js.map +1 -0
- package/dist/migration/manifest.d.ts +39 -0
- package/dist/migration/manifest.js +140 -0
- package/dist/migration/manifest.js.map +1 -0
- package/dist/openclaw-user-data.d.ts +66 -0
- package/dist/openclaw-user-data.js +283 -0
- package/dist/openclaw-user-data.js.map +1 -0
- package/dist/output/mode.d.ts +11 -0
- package/dist/output/mode.js +27 -0
- package/dist/output/mode.js.map +1 -0
- package/dist/output/ndjson.d.ts +57 -0
- package/dist/output/ndjson.js +136 -0
- package/dist/output/ndjson.js.map +1 -0
- package/dist/utils/constants.d.ts +8 -5
- package/dist/utils/constants.js +32 -7
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/deps.d.ts +34 -3
- package/dist/utils/deps.js +62 -100
- package/dist/utils/deps.js.map +1 -1
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.js +31 -4
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/mirror.js +14 -0
- package/dist/utils/mirror.js.map +1 -1
- package/dist/utils/openclaw-config-cli.d.ts +19 -0
- package/dist/utils/openclaw-config-cli.js +81 -0
- package/dist/utils/openclaw-config-cli.js.map +1 -0
- package/dist/utils/openclaw-daemon.d.ts +58 -0
- package/dist/utils/openclaw-daemon.js +154 -0
- package/dist/utils/openclaw-daemon.js.map +1 -0
- package/dist/utils/shell.d.ts +12 -2
- package/dist/utils/shell.js +80 -5
- package/dist/utils/shell.js.map +1 -1
- 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
|
-
|
|
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: @
|
|
76
|
-
feishu Feishu/Lark channel (
|
|
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 >=
|
|
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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
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
|
-
//
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
46
|
-
|
|
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
|
|
122
|
-
|
|
123
|
-
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE3H,MAAM,OAAO,gBAAgB;IACP;IAApB,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAE3C,KAAK,CAAC,SAAS;QACb,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,UAAmB;QAChD,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,4DAA4D,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/installers/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE3H,MAAM,OAAO,gBAAgB;IACP;IAApB,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAE3C,KAAK,CAAC,SAAS;QACb,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,UAAmB;QAChD,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,4DAA4D,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QAED,wEAAwE;QACxE,4EAA4E;QAC5E,uEAAuE;QACvE,oCAAoC;QACpC,0EAA0E;QAC1E,wCAAwC;QACxC,mEAAmE;QACnE,kEAAkE;QAClE,sEAAsE;QACtE,4EAA4E;QAC5E,MAAM,4BAA4B,CAAC,GAAG,IAAI,CAAC,WAAW,UAAU,CAAC,CAAC;QAElE,qFAAqF;QACrF,iEAAiE;QACjE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QAED,qFAAqF;QACrF,0EAA0E;QAC1E,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,sDAAsD;QACtD,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,6EAA6E;QAC7E,2EAA2E;QAC3E,oEAAoE;QACpE,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,aAAa,CAAC,CAAC;IACpD,CAAC;IAEO,eAAe;QACrB,MAAM,SAAS,GAAG,GAAG,aAAa,eAAe,IAAI,CAAC,WAAW,EAAE,CAAC;QACpE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,gCAAgC,SAAS,+CAA+C;gBACxF,sGAAsG,CACvG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAA+B;QAC7C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAExD,4EAA4E;QAC5E,yEAAyE;QACzE,0EAA0E;QAC1E,0EAA0E;QAC1E,2EAA2E;QAC3E,MAAM,4BAA4B,CAAC,GAAG,IAAI,CAAC,WAAW,YAAY,CAAC,CAAC;QAEpE,gFAAgF;QAChF,4EAA4E;QAC5E,MAAM,YAAY,GAAG,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC;QAEpD,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,OAAO,YAAY,KAAK,CAAC,CAAC;QAC9D,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED,oBAAoB;IAEpB;;;;;;OAMG;IACK,iBAAiB;QACvB,MAAM,SAAS,GAAG,GAAG,aAAa,eAAe,IAAI,CAAC,WAAW,EAAE,CAAC;QACpE,MAAM,UAAU,GAAG,GAAG,aAAa,gBAAgB,CAAC;QACpD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;YAAE,OAAO;QAEnC,IAAI,CAAC,4BAA4B,IAAI,CAAC,WAAW,SAAS,MAAM,cAAc,UAAU,GAAG,CAAC,CAAC;QAE7F,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;gBACzD,IAAI,GAAG,CAAC,QAAQ;oBAAE,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxD,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO;oBAAE,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACvE,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ;oBAAE,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACzE,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;oBACtC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC;gBACtF,CAAC;gBACD,oEAAoE;gBACpE,yEAAyE;gBACzE,wEAAwE;gBACxE,kEAAkE;gBAClE,qEAAqE;gBACrE,MAAM,gBAAgB,GAAG,eAAe,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC5C,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CACrE,OAAO,CAAC,KAAK,QAAQ;2BAClB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAC1E,CAAC,CAAC;gBACL,CAAC;gBACD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,UAAkB;QACnC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACzD,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClD,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC1D,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,OAAO,IAAI,CAAC;YACnG,yEAAyE;YACzE,0EAA0E;YAC1E,MAAM,gBAAgB,GAAG,eAAe,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CACzF,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAC9F,CAAC;gBAAE,OAAO,IAAI,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,UAAkB;QACtD,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,GAAG,cAAc,IAAI,IAAI,CAAC,WAAW,aAAa,CAAC;QAEnE,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,SAAS,UAAU,KAAK,CAAC,CAAC;YAC9D,MAAM,KAAK,CAAC,iDAAiD,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC;QAC3F,CAAC;aAAM,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC,OAAO,UAAU,MAAM,OAAO,GAAG,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC,cAAc,IAAI,CAAC,WAAW,wBAAwB,CAAC,CAAC;QAC7D,MAAM,KAAK,CAAC,6BAA6B,OAAO,GAAG,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC,UAAU,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,iBAAiB,CAAC,OAAe;QAC7C,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,WAAW,KAAK;gBACpD,oDAAoD,CACrD,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;QACvC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,IAAI,CAAC,eAAe,OAAO,cAAc,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM,YAAY,CACnC,OAAO,cAAc,kBAAkB,OAAO,gBAAgB,YAAY,iBAAiB,CAC5F,CAAC;QACF,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,cAAc,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,cAAc,IAAI,CAAC,WAAW,SAAS,OAAO,KAAK,CAAC,CAAC;QAC1D,MAAM,KAAK,CAAC,6BAA6B,OAAO,GAAG,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC,UAAU,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,MAAM,UAAU,GAAG,GAAG,aAAa,gBAAgB,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;YAC9D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClD,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACzC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;gBACvE,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,mBAAmB,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,cAAc;QAC1B,MAAM,UAAU,GAAG,GAAG,aAAa,gBAAgB,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO;QACpC,MAAM,UAAU,GAAG,GAAG,aAAa,eAAe,IAAI,CAAC,WAAW,EAAE,CAAC;QACrE,MAAM,kBAAkB,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxE,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI;gBAAE,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACxE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CACzD,OAAO,CAAC,KAAK,QAAQ,IAAI,kBAAkB,CAAC,CAAC,CAAC,KAAK,gBAAgB,CACpE,CAAC,CAAC;YACH,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,uCAAuC,UAAU,kBAAkB,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;YACD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;YACvE,IAAI,CAAC,SAAS,UAAU,wBAAwB,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,wCAAwC,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,GAA4B,EAAE,MAAc;QACpE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YACpD,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC;YAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvD,MAAM,IAAI,CAAC,WAAW,CAAC,KAAgC,EAAE,IAAI,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACzC,MAAM,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC5F,6EAA6E;gBAC7E,oEAAoE;gBACpE,MAAM,KAAK,CAAC,WAAW;oBACrB,CAAC,CAAC,wBAAwB,IAAI,MAAM,MAAM,iBAAiB;oBAC3D,CAAC,CAAC,wBAAwB,IAAI,SAAS,MAAM,GAAG,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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
|
-
*
|
|
15
|
-
*
|
|
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
|
}
|