@okclaw-build/cli 1.0.0-beta.6 → 1.0.0-beta.61
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/bridge/daemon/channel-auth-runtime.d.ts +16 -0
- package/dist/bridge/daemon/channel-auth-runtime.js +2 -0
- package/dist/bridge/daemon/channel-auth-runtime.js.map +1 -0
- package/dist/bridge/daemon/config.d.ts +24 -0
- package/dist/bridge/daemon/config.js +96 -0
- package/dist/bridge/daemon/config.js.map +1 -0
- package/dist/bridge/daemon/daemon.d.ts +7 -0
- package/dist/bridge/daemon/daemon.js +32 -0
- package/dist/bridge/daemon/daemon.js.map +1 -0
- package/dist/bridge/daemon/event-id.d.ts +2 -0
- package/dist/bridge/daemon/event-id.js +18 -0
- package/dist/bridge/daemon/event-id.js.map +1 -0
- package/dist/bridge/daemon/frames.d.ts +81 -0
- package/dist/bridge/daemon/frames.js +64 -0
- package/dist/bridge/daemon/frames.js.map +1 -0
- package/dist/bridge/daemon/openclaw-chat-runtime.d.ts +80 -0
- package/dist/bridge/daemon/openclaw-chat-runtime.js +1222 -0
- package/dist/bridge/daemon/openclaw-chat-runtime.js.map +1 -0
- package/dist/bridge/daemon/openclaw-gateway-client.d.ts +58 -0
- package/dist/bridge/daemon/openclaw-gateway-client.js +251 -0
- package/dist/bridge/daemon/openclaw-gateway-client.js.map +1 -0
- package/dist/bridge/daemon/openclaw-weixin-auth-runtime.d.ts +28 -0
- package/dist/bridge/daemon/openclaw-weixin-auth-runtime.js +266 -0
- package/dist/bridge/daemon/openclaw-weixin-auth-runtime.js.map +1 -0
- package/dist/bridge/daemon/openclaw-weixin-plugin.d.ts +67 -0
- package/dist/bridge/daemon/openclaw-weixin-plugin.js +196 -0
- package/dist/bridge/daemon/openclaw-weixin-plugin.js.map +1 -0
- package/dist/bridge/daemon/relay-client.d.ts +79 -0
- package/dist/bridge/daemon/relay-client.js +396 -0
- package/dist/bridge/daemon/relay-client.js.map +1 -0
- package/dist/bridge/daemon/stub-chat-runtime.d.ts +4 -0
- package/dist/bridge/daemon/stub-chat-runtime.js +91 -0
- package/dist/bridge/daemon/stub-chat-runtime.js.map +1 -0
- package/dist/bridge/service.d.ts +12 -0
- package/dist/bridge/service.js +86 -0
- package/dist/bridge/service.js.map +1 -0
- package/dist/commands/backup.d.ts +16 -0
- package/dist/commands/backup.js +99 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/bridge.d.ts +7 -0
- package/dist/commands/bridge.js +100 -0
- package/dist/commands/bridge.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 +28 -16
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/feed.js +48 -16
- package/dist/commands/feed.js.map +1 -1
- package/dist/commands/install.js +99 -18
- 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/openclaw-channel-login.d.ts +54 -0
- package/dist/commands/openclaw-channel-login.js +334 -0
- package/dist/commands/openclaw-channel-login.js.map +1 -0
- package/dist/commands/restore.d.ts +16 -0
- package/dist/commands/restore.js +94 -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 +137 -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 +116 -12
- package/dist/index.js.map +1 -1
- package/dist/installers/base.d.ts +3 -1
- package/dist/installers/channel.d.ts +10 -2
- package/dist/installers/channel.js +143 -24
- package/dist/installers/channel.js.map +1 -1
- package/dist/installers/openclaw.d.ts +20 -2
- package/dist/installers/openclaw.js +201 -55
- 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 +5 -2
- package/dist/installers/skill.js +67 -18
- 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 +86 -0
- package/dist/openclaw-user-data.js +422 -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 +14 -13
- package/dist/utils/constants.js +40 -21
- 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/install-safety.d.ts +25 -0
- package/dist/utils/install-safety.js +97 -0
- package/dist/utils/install-safety.js.map +1 -0
- 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 +23 -2
- package/dist/utils/shell.js +138 -5
- package/dist/utils/shell.js.map +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { appendFileSync } from 'node:fs';
|
|
2
|
+
import { getNdjsonPath, getOpId, isNdjson } from './mode.js';
|
|
3
|
+
const defaultWriter = (line) => {
|
|
4
|
+
const path = getNdjsonPath();
|
|
5
|
+
if (path) {
|
|
6
|
+
appendFileSync(path, line);
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
process.stdout.write(line);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* 单 op 的事件发射器。在 text 模式下所有方法都是 no-op;ndjson 模式才写出。
|
|
14
|
+
*
|
|
15
|
+
* 约定:
|
|
16
|
+
* - seq 单调递增,同一 emitter 实例内唯一
|
|
17
|
+
* - end() 只能发一次,重复调用忽略
|
|
18
|
+
* - 非正常退出(exception/signal)由 registerExitHandlers 兜底补 end
|
|
19
|
+
*/
|
|
20
|
+
export class NdjsonEmitter {
|
|
21
|
+
seq = 0;
|
|
22
|
+
op;
|
|
23
|
+
writer;
|
|
24
|
+
ended = false;
|
|
25
|
+
constructor(op, writer = defaultWriter) {
|
|
26
|
+
this.op = op;
|
|
27
|
+
this.writer = writer;
|
|
28
|
+
}
|
|
29
|
+
start(msg = '', fields) {
|
|
30
|
+
this.emit('start', 'info', { msg, fields });
|
|
31
|
+
}
|
|
32
|
+
stepStart(step, msg, fields) {
|
|
33
|
+
this.emit('step_start', 'info', { step, msg, fields });
|
|
34
|
+
}
|
|
35
|
+
progress(step, progress, msg, fields) {
|
|
36
|
+
const clamped = Number.isFinite(progress) ? Math.max(0, Math.min(1, progress)) : undefined;
|
|
37
|
+
this.emit('progress', 'info', { step, progress: clamped, msg, fields });
|
|
38
|
+
}
|
|
39
|
+
stepDone(step, msg, fields) {
|
|
40
|
+
this.emit('step_done', 'info', { step, msg, fields });
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 通用日志事件。走独立 phase="log"(bug#7 修:之前借用 phase="progress" 会
|
|
44
|
+
* 污染"取 max(progress) 作为当前进度"的聚合逻辑)。用 level 区分严重度。
|
|
45
|
+
*/
|
|
46
|
+
log(level, msg, fields) {
|
|
47
|
+
this.emit('log', level, { msg, fields });
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 终态事件;必发。ok=false 时 fields 里加 errorCode(可选)。
|
|
51
|
+
* end 事件的 fields 可承载 op-specific 返回值(如 FILE_READ 的 content)。
|
|
52
|
+
*/
|
|
53
|
+
end(ok, exitCode, code, fields) {
|
|
54
|
+
if (this.ended)
|
|
55
|
+
return;
|
|
56
|
+
this.ended = true;
|
|
57
|
+
const mergedFields = { ok, exitCode, ...(fields ?? {}) };
|
|
58
|
+
this.emit('end', ok ? 'info' : 'error', {
|
|
59
|
+
msg: ok ? 'success' : 'failed',
|
|
60
|
+
fields: mergedFields,
|
|
61
|
+
code,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
hasEnded() {
|
|
65
|
+
return this.ended;
|
|
66
|
+
}
|
|
67
|
+
emit(phase, level, partial) {
|
|
68
|
+
if (!isNdjson())
|
|
69
|
+
return;
|
|
70
|
+
const opId = getOpId();
|
|
71
|
+
const userFields = { ...(partial.fields ?? {}) };
|
|
72
|
+
if (opId !== undefined && userFields.opId === undefined) {
|
|
73
|
+
userFields.opId = opId;
|
|
74
|
+
}
|
|
75
|
+
const event = {
|
|
76
|
+
ts: new Date().toISOString(),
|
|
77
|
+
seq: ++this.seq,
|
|
78
|
+
op: this.op,
|
|
79
|
+
phase,
|
|
80
|
+
level,
|
|
81
|
+
};
|
|
82
|
+
if (partial.step !== undefined)
|
|
83
|
+
event.step = partial.step;
|
|
84
|
+
if (partial.progress !== undefined)
|
|
85
|
+
event.progress = partial.progress;
|
|
86
|
+
if (partial.msg !== undefined && partial.msg !== '')
|
|
87
|
+
event.msg = partial.msg;
|
|
88
|
+
if (Object.keys(userFields).length > 0)
|
|
89
|
+
event.fields = userFields;
|
|
90
|
+
if (partial.code !== undefined)
|
|
91
|
+
event.code = partial.code;
|
|
92
|
+
this.writer(JSON.stringify(event) + '\n');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// bug#4 修:顶层 main().catch 里也要能拿到活 emitter 发 end 兜底。
|
|
96
|
+
// registerExitHandlers 时把 emitter 挂到 module 级,exposé getActiveEmitter 给 index.ts。
|
|
97
|
+
let activeEmitter = null;
|
|
98
|
+
export function getActiveEmitter() {
|
|
99
|
+
return activeEmitter;
|
|
100
|
+
}
|
|
101
|
+
export function clearActiveEmitter() {
|
|
102
|
+
activeEmitter = null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 注册进程兜底,确保 ndjson 模式下 end 事件必发(plan P1 风险:忘 flush → os-api 卡死)。
|
|
106
|
+
* 只在 ndjson 模式生效。
|
|
107
|
+
*/
|
|
108
|
+
export function registerExitHandlers(emitter) {
|
|
109
|
+
if (!isNdjson())
|
|
110
|
+
return;
|
|
111
|
+
activeEmitter = emitter;
|
|
112
|
+
const finalize = (exitCode, code) => {
|
|
113
|
+
if (!emitter.hasEnded()) {
|
|
114
|
+
emitter.end(false, exitCode, code);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
process.on('uncaughtException', (err) => {
|
|
118
|
+
finalize(1, 'E_UNCAUGHT');
|
|
119
|
+
process.stderr.write(String(err?.stack ?? err) + '\n');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
});
|
|
122
|
+
process.on('unhandledRejection', (reason) => {
|
|
123
|
+
finalize(1, 'E_UNHANDLED_REJECTION');
|
|
124
|
+
process.stderr.write(String(reason) + '\n');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
});
|
|
127
|
+
process.on('SIGTERM', () => {
|
|
128
|
+
finalize(143, 'E_SIGTERM');
|
|
129
|
+
process.exit(143);
|
|
130
|
+
});
|
|
131
|
+
process.on('SIGINT', () => {
|
|
132
|
+
finalize(130, 'E_SIGINT');
|
|
133
|
+
process.exit(130);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=ndjson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ndjson.js","sourceRoot":"","sources":["../../src/output/ndjson.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,25 +2,26 @@ export declare const OKCLAW_HOME = "/root/okclaw";
|
|
|
2
2
|
export declare const OKCLAW_CONFIG_DIR = "/root/okclaw/config";
|
|
3
3
|
export declare const OKCLAW_BACKUP_DIR = "/root/okclaw/backup";
|
|
4
4
|
export declare const OKCLAW_TMP_DIR = "/root/okclaw/tmp";
|
|
5
|
+
export declare const OKCLAW_BRIDGE_CONFIG = "/etc/okclaw-bridge/config.json";
|
|
6
|
+
export declare const OKCLAW_BRIDGE_STATE_DIR = "/var/lib/okclaw-bridge";
|
|
7
|
+
export declare const OKCLAW_BRIDGE_RUN_DIR = "/root/okclaw/bridge";
|
|
8
|
+
export declare const OKCLAW_BRIDGE_RUNNER = "/root/okclaw/bridge/run-bridge.sh";
|
|
9
|
+
export declare const OKCLAW_BRIDGE_USER_UNIT = "/root/.config/systemd/user/okclaw-bridge.service";
|
|
5
10
|
export declare const OPENCLAW_HOME = "/root/.openclaw";
|
|
6
11
|
export declare const OPENCLAW_WORKSPACE = "/root/.openclaw/workspace";
|
|
7
|
-
export declare const
|
|
8
|
-
export declare const
|
|
9
|
-
export declare const
|
|
10
|
-
export declare const
|
|
11
|
-
export declare const NODE_MIN_MAJOR = 22;
|
|
12
|
-
export declare const NODE_MIN_MINOR = 16;
|
|
13
|
-
export declare const NODE_INSTALL_VERSION = "22.16.0";
|
|
14
|
-
export declare const PYTHON_MIN_MAJOR = 3;
|
|
15
|
-
export declare const PYTHON_MIN_MINOR = 11;
|
|
12
|
+
export declare const OPENCLAW_GATEWAY_PORT = 18789;
|
|
13
|
+
export declare const NODE_MIN_MAJOR = 24;
|
|
14
|
+
export declare const NODE_MIN_MINOR = 0;
|
|
15
|
+
export declare const NODE_INSTALL_VERSION = "24";
|
|
16
16
|
export declare const NPM_REGISTRY = "https://registry.npmmirror.com";
|
|
17
|
+
export declare const CLI_NPM_REGISTRY = "https://registry.npmjs.org";
|
|
18
|
+
export declare const CLI_PACKAGE = "@okclaw-build/cli";
|
|
17
19
|
export declare const PIP_INDEX_URL = "https://pypi.tuna.tsinghua.edu.cn/simple";
|
|
18
20
|
export declare const PIP_TRUSTED_HOST = "pypi.tuna.tsinghua.edu.cn";
|
|
19
21
|
export declare const NODE_MIRROR = "https://npmmirror.com/mirrors/node";
|
|
20
22
|
export declare const JSDELIVR_GH = "https://cdn.jsdelivr.net/gh";
|
|
21
|
-
export declare const
|
|
22
|
-
export declare const
|
|
23
|
-
export declare const OPENVIKING_PLUGIN_REQUIRED_FILES: string[];
|
|
24
|
-
export declare const OPENVIKING_PLUGIN_OPTIONAL_FILES: string[];
|
|
23
|
+
export declare const NVM_VERSION = "v0.40.3";
|
|
24
|
+
export declare const NVM_SH_SOURCES: string[];
|
|
25
25
|
export declare const CHANNEL_NPM_PACKAGES: Record<string, string>;
|
|
26
|
+
export declare const CHANNEL_ALIASES: Record<string, string>;
|
|
26
27
|
export declare const BUNDLED_PLUGINS: Set<string>;
|
package/dist/utils/constants.js
CHANGED
|
@@ -3,43 +3,62 @@ export const OKCLAW_HOME = '/root/okclaw';
|
|
|
3
3
|
export const OKCLAW_CONFIG_DIR = `${OKCLAW_HOME}/config`;
|
|
4
4
|
export const OKCLAW_BACKUP_DIR = `${OKCLAW_HOME}/backup`;
|
|
5
5
|
export const OKCLAW_TMP_DIR = `${OKCLAW_HOME}/tmp`;
|
|
6
|
+
export const OKCLAW_BRIDGE_CONFIG = '/etc/okclaw-bridge/config.json';
|
|
7
|
+
export const OKCLAW_BRIDGE_STATE_DIR = '/var/lib/okclaw-bridge';
|
|
8
|
+
export const OKCLAW_BRIDGE_RUN_DIR = `${OKCLAW_HOME}/bridge`;
|
|
9
|
+
export const OKCLAW_BRIDGE_RUNNER = `${OKCLAW_BRIDGE_RUN_DIR}/run-bridge.sh`;
|
|
10
|
+
export const OKCLAW_BRIDGE_USER_UNIT = '/root/.config/systemd/user/okclaw-bridge.service';
|
|
6
11
|
export const OPENCLAW_HOME = '/root/.openclaw';
|
|
7
12
|
export const OPENCLAW_WORKSPACE = `${OPENCLAW_HOME}/workspace`;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export const
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export const
|
|
18
|
-
export const
|
|
13
|
+
// openclaw gateway 默认 WebSocket 端口。gateway 进程名在不同启动方式下不固定
|
|
14
|
+
// (`openclaw gateway run` → `openclaw`,systemd → `node`),所以进程识别一律
|
|
15
|
+
// 按这个监听端口来,不能用 `ps -C` / `pkill -f` 匹配进程名。
|
|
16
|
+
export const OPENCLAW_GATEWAY_PORT = 18789;
|
|
17
|
+
// Node baseline — standardize on the current LTS (Node 24, "Krypton").
|
|
18
|
+
// openclaw keeps raising its own minimum over time (e.g. >=22.19), so any
|
|
19
|
+
// host sitting on an older Node makes `openclaw onboard` fail with
|
|
20
|
+
// "Node.js vX is required". Keeping the CLI's floor well ahead means a stale
|
|
21
|
+
// host is auto-upgraded via nvm (see deps.ts) — never a hard error.
|
|
22
|
+
export const NODE_MIN_MAJOR = 24;
|
|
23
|
+
export const NODE_MIN_MINOR = 0;
|
|
24
|
+
// Major-only: nvm resolves the latest 24.x LTS patch at install time, so we
|
|
25
|
+
// pick up security releases without bumping a pinned version here.
|
|
26
|
+
export const NODE_INSTALL_VERSION = '24';
|
|
19
27
|
// China mirrors
|
|
20
28
|
export const NPM_REGISTRY = 'https://registry.npmmirror.com';
|
|
29
|
+
// The okclaw CLI itself is published on the public npm registry (not mirrored
|
|
30
|
+
// to npmmirror reliably), so self-relocation after a Node upgrade pulls it from
|
|
31
|
+
// npmjs.org — same registry os-api's preflight uses to install the CLI.
|
|
32
|
+
export const CLI_NPM_REGISTRY = 'https://registry.npmjs.org';
|
|
33
|
+
export const CLI_PACKAGE = '@okclaw-build/cli';
|
|
21
34
|
export const PIP_INDEX_URL = 'https://pypi.tuna.tsinghua.edu.cn/simple';
|
|
22
35
|
export const PIP_TRUSTED_HOST = 'pypi.tuna.tsinghua.edu.cn';
|
|
23
36
|
export const NODE_MIRROR = 'https://npmmirror.com/mirrors/node';
|
|
24
37
|
// jsdelivr CDN for GitHub content (works in China, GitHub raw does not)
|
|
25
38
|
export const JSDELIVR_GH = 'https://cdn.jsdelivr.net/gh';
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
39
|
+
// nvm install sources. The official install.sh clones/downloads from GitHub
|
|
40
|
+
// (raw.githubusercontent.com / github.com .git) which is unreliable in China,
|
|
41
|
+
// so instead we drop nvm.sh itself directly — a single self-contained file that
|
|
42
|
+
// is enough for `nvm install/use/alias`. jsdelivr serves any repo file and is
|
|
43
|
+
// reachable in China; gitee/github raw are fallbacks. Tried in order, each curl
|
|
44
|
+
// time-bounded, and validated by running `nvm --version` (rejects HTML/redirect
|
|
45
|
+
// bodies that still return 200).
|
|
46
|
+
export const NVM_VERSION = 'v0.40.3';
|
|
47
|
+
export const NVM_SH_SOURCES = [
|
|
48
|
+
`${JSDELIVR_GH}/nvm-sh/nvm@${NVM_VERSION}/nvm.sh`,
|
|
49
|
+
`https://gitee.com/mirrors/nvm/raw/${NVM_VERSION}/nvm.sh`,
|
|
50
|
+
`https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/nvm.sh`,
|
|
35
51
|
];
|
|
36
52
|
// Channel npm package mapping
|
|
37
53
|
export const CHANNEL_NPM_PACKAGES = {
|
|
38
54
|
dingtalk: '@soimy/dingtalk',
|
|
39
|
-
|
|
55
|
+
'openclaw-weixin': '@tencent-weixin/openclaw-weixin',
|
|
40
56
|
// s3 has no npm package — must use --package-url
|
|
41
57
|
// feishu is bundled with openclaw — config only, no install needed
|
|
42
58
|
};
|
|
59
|
+
export const CHANNEL_ALIASES = {
|
|
60
|
+
wechat: 'openclaw-weixin',
|
|
61
|
+
};
|
|
43
62
|
// Bundled plugins: already included in openclaw, only need configuration
|
|
44
63
|
export const BUNDLED_PLUGINS = new Set(['feishu']);
|
|
45
64
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,WAAW,SAAS,CAAC;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,WAAW,SAAS,CAAC;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,WAAW,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,WAAW,SAAS,CAAC;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,WAAW,SAAS,CAAC;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,WAAW,MAAM,CAAC;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,gCAAgC,CAAC;AACrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,wBAAwB,CAAC;AAChE,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,WAAW,SAAS,CAAC;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,qBAAqB,gBAAgB,CAAC;AAC7E,MAAM,CAAC,MAAM,uBAAuB,GAAG,kDAAkD,CAAC;AAE1F,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,aAAa,YAAY,CAAC;AAC/D,0DAA0D;AAC1D,kEAAkE;AAClE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,uEAAuE;AACvE,0EAA0E;AAC1E,mEAAmE;AACnE,6EAA6E;AAC7E,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,4EAA4E;AAC5E,mEAAmE;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,gCAAgC,CAAC;AAC7D,8EAA8E;AAC9E,gFAAgF;AAChF,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAC7D,MAAM,CAAC,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,0CAA0C,CAAC;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAC5D,MAAM,CAAC,MAAM,WAAW,GAAG,oCAAoC,CAAC;AAEhE,wEAAwE;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAEzD,4EAA4E;AAC5E,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF,iCAAiC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,GAAG,WAAW,eAAe,WAAW,SAAS;IACjD,qCAAqC,WAAW,SAAS;IACzD,gDAAgD,WAAW,SAAS;CACrE,CAAC;AACF,8BAA8B;AAC9B,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,QAAQ,EAAE,iBAAiB;IAC3B,iBAAiB,EAAE,iCAAiC;IACpD,iDAAiD;IACjD,mEAAmE;CACpE,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,MAAM,EAAE,iBAAiB;CAC1B,CAAC;AAEF,yEAAyE;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC"}
|
package/dist/utils/deps.d.ts
CHANGED
|
@@ -4,10 +4,41 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare function ensureNodeVersion(): Promise<void>;
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* 升级 default node 后,把 okclaw CLI 也装到新 default 下。
|
|
8
|
+
*
|
|
9
|
+
* 为什么必须做:CLI 最初由 os-api preflight 装在升级前的旧 node(如 22.x)的全局
|
|
10
|
+
* 目录里;`nvm alias default 24` 之后,os-api 用新 shell(只 source nvm → auto-use
|
|
11
|
+
* default 24)再调 `okclaw stop/start/status` 时,新 default 下找不到 okclaw →
|
|
12
|
+
* "command not found",迁移会从 bootstrap 之后的步骤失败。把 CLI 重装到新 default
|
|
13
|
+
* 下,让 okclaw 和 openclaw 都落在 node 24,os-api 侧无需任何改动。
|
|
14
|
+
*
|
|
15
|
+
* 版本固定为当前正在运行的 CLI 自身版本:`@okclaw-build/cli` 的 latest dist-tag 并非
|
|
16
|
+
* 最新版,裸装会回退到旧版本,必须显式 pin。
|
|
17
|
+
*
|
|
18
|
+
* 失败必须抛、不能吞:relocation 是"升级完成"的一部分。若只 warn 放过,okclaw check
|
|
19
|
+
* 仍会成功返回,但 default node 下没有 okclaw —— openclaw 这次能在 24 跑起来,可
|
|
20
|
+
* 之后 os-api 用新 shell 调 okclaw 会以 "command not found" 在更晚、更难定位的步骤
|
|
21
|
+
* (迁移 target:stop 等)失败;且此时 node 已是 24,下一次 okclaw check 会直接
|
|
22
|
+
* early-return、永不重试 relocation,这个半坏状态自己解不开。所以用 shellRetry 吸收
|
|
23
|
+
* 瞬时抖动,重试仍失败就抛,让 okclaw check 在 bootstrap 早早干净失败(可重试),
|
|
24
|
+
* 而不是留下半坏主机。
|
|
25
|
+
*
|
|
26
|
+
* shell 副作用经 {@link RelocateCliDeps} 注入(沿用 openviking-purge 的 deps 约定),
|
|
27
|
+
* 让"失败必抛 + 重装后校验可解析"这条契约可单测。
|
|
9
28
|
*/
|
|
10
|
-
export
|
|
29
|
+
export interface RelocateCliDeps {
|
|
30
|
+
/** 把指定 spec 装到当前 default node 全局(默认 shellRetry npm install)。 */
|
|
31
|
+
installGlobal: (spec: string) => Promise<void>;
|
|
32
|
+
/** 校验 okclaw 在当前 default node 下可解析(默认 commandExists)。 */
|
|
33
|
+
isResolvable: () => Promise<boolean>;
|
|
34
|
+
}
|
|
35
|
+
export declare function relocateCliToDefaultNode(deps?: Partial<RelocateCliDeps>): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* 把版本号格式化成 CLI 安装 spec。有版本则 pin 成 `@okclaw-build/cli@<version>`;
|
|
38
|
+
* 读不到版本(空/缺失)时回退到 `@beta` dist-tag —— 绝不用裸包名,因为
|
|
39
|
+
* `@okclaw-build/cli` 的 latest tag 指向的不是最新版,裸装会回退到旧版本。
|
|
40
|
+
*/
|
|
41
|
+
export declare function formatCliSpec(version: string | null | undefined): string;
|
|
11
42
|
/**
|
|
12
43
|
* Ensure a command exists on PATH.
|
|
13
44
|
*/
|
package/dist/utils/deps.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { shell, shellRetry, shellCapture, commandExists } from './shell.js';
|
|
2
3
|
import { info, warn } from './logger.js';
|
|
3
|
-
import { NODE_MIN_MAJOR, NODE_MIN_MINOR, NODE_INSTALL_VERSION, NODE_MIRROR,
|
|
4
|
+
import { NODE_MIN_MAJOR, NODE_MIN_MINOR, NODE_INSTALL_VERSION, NODE_MIRROR, NVM_SH_SOURCES, CLI_NPM_REGISTRY, CLI_PACKAGE, } from './constants.js';
|
|
4
5
|
/**
|
|
5
6
|
* Ensure Node.js >= NODE_MIN_MAJOR.NODE_MIN_MINOR is installed via nvm.
|
|
6
7
|
* Installs nvm first if not present, then installs Node.js through nvm.
|
|
@@ -21,6 +22,49 @@ export async function ensureNodeVersion() {
|
|
|
21
22
|
}
|
|
22
23
|
await ensureNvm();
|
|
23
24
|
await installNodejs();
|
|
25
|
+
await relocateCliToDefaultNode();
|
|
26
|
+
}
|
|
27
|
+
function relocateCliDeps(deps = {}) {
|
|
28
|
+
return {
|
|
29
|
+
installGlobal: deps.installGlobal
|
|
30
|
+
?? ((spec) => shellRetry(`npm install -g ${spec} --registry ${CLI_NPM_REGISTRY} --no-audit --no-fund`)),
|
|
31
|
+
isResolvable: deps.isResolvable ?? (() => commandExists('okclaw')),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export async function relocateCliToDefaultNode(deps = {}) {
|
|
35
|
+
const d = relocateCliDeps(deps);
|
|
36
|
+
const spec = cliPackageSpec();
|
|
37
|
+
info(`Relocating okclaw CLI (${spec}) onto the upgraded default Node...`);
|
|
38
|
+
await d.installGlobal(spec); // shellRetry 抖动重试;彻底失败直接抛(不 catch)
|
|
39
|
+
// 校验真的在升级后的 default node 下可解析(npm 偶发 exit 0 但 bin 没就位)。
|
|
40
|
+
if (!(await d.isResolvable())) {
|
|
41
|
+
throw new Error(`okclaw CLI not resolvable under the upgraded default Node after relocate (${spec})`);
|
|
42
|
+
}
|
|
43
|
+
info('okclaw CLI relocated onto default Node ✓');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 把版本号格式化成 CLI 安装 spec。有版本则 pin 成 `@okclaw-build/cli@<version>`;
|
|
47
|
+
* 读不到版本(空/缺失)时回退到 `@beta` dist-tag —— 绝不用裸包名,因为
|
|
48
|
+
* `@okclaw-build/cli` 的 latest tag 指向的不是最新版,裸装会回退到旧版本。
|
|
49
|
+
*/
|
|
50
|
+
export function formatCliSpec(version) {
|
|
51
|
+
if (typeof version === 'string' && version.length > 0) {
|
|
52
|
+
return `${CLI_PACKAGE}@${version}`;
|
|
53
|
+
}
|
|
54
|
+
return `${CLI_PACKAGE}@beta`;
|
|
55
|
+
}
|
|
56
|
+
/** 当前正在运行的 CLI 自身的安装 spec。 */
|
|
57
|
+
function cliPackageSpec() {
|
|
58
|
+
let version = null;
|
|
59
|
+
try {
|
|
60
|
+
const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
|
|
61
|
+
if (typeof pkg.version === 'string')
|
|
62
|
+
version = pkg.version;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// ignore — formatCliSpec falls back to the @beta tag
|
|
66
|
+
}
|
|
67
|
+
return formatCliSpec(version);
|
|
24
68
|
}
|
|
25
69
|
const NVM_DIR = '/root/.nvm';
|
|
26
70
|
async function ensureNvm() {
|
|
@@ -31,17 +75,22 @@ async function ensureNvm() {
|
|
|
31
75
|
return;
|
|
32
76
|
}
|
|
33
77
|
info('nvm not found, installing...');
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
78
|
+
// 不跑官方 install.sh:它内部从 GitHub clone/下载,国内不可靠且无超时会卡住部署。
|
|
79
|
+
// 直接把 nvm.sh 本体落到 $NVM_DIR(单文件即可支撑 nvm install/use/alias)。
|
|
80
|
+
// 多源按序尝试,每个 curl 带 --connect-timeout/--max-time 快速失败,并用
|
|
81
|
+
// `nvm --version` 校验真的拿到了可用 nvm(镜像偶发返回重定向/HTML 也是 200)。
|
|
82
|
+
for (const src of NVM_SH_SOURCES) {
|
|
83
|
+
const dl = await shellCapture(`mkdir -p ${NVM_DIR} && curl -fsSL --connect-timeout 10 --max-time 60 '${src}' -o ${NVM_DIR}/nvm.sh`);
|
|
84
|
+
if (dl.code === 0) {
|
|
85
|
+
const verify = await shellCapture('nvm --version');
|
|
86
|
+
if (verify.code === 0) {
|
|
87
|
+
info(`nvm ${verify.stdout.trim()} installed (source: ${src}) ✓`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
warn(`nvm source unavailable, trying next: ${src}`);
|
|
92
|
+
}
|
|
93
|
+
throw new Error('nvm installation failed: all sources unreachable (jsdelivr/gitee/github)');
|
|
45
94
|
}
|
|
46
95
|
async function installNodejs() {
|
|
47
96
|
info(`Installing Node.js ${NODE_INSTALL_VERSION} via nvm...`);
|
|
@@ -55,79 +104,6 @@ async function installNodejs() {
|
|
|
55
104
|
throw new Error('Node.js installation failed: node command not found');
|
|
56
105
|
info(`Node.js ${verify.stdout.trim()} installed via nvm ✓`);
|
|
57
106
|
}
|
|
58
|
-
/**
|
|
59
|
-
* Ensure Python >= PYTHON_MIN_MAJOR.PYTHON_MIN_MINOR is installed.
|
|
60
|
-
* Auto-installs via system package manager if missing or too old.
|
|
61
|
-
*/
|
|
62
|
-
export async function ensurePython() {
|
|
63
|
-
const required = `${PYTHON_MIN_MAJOR}.${PYTHON_MIN_MINOR}`;
|
|
64
|
-
const result = await shellCapture('python3 --version');
|
|
65
|
-
if (result.code === 0) {
|
|
66
|
-
const match = result.stdout.match(/(\d+)\.(\d+)\.?(\d+)?/);
|
|
67
|
-
if (match) {
|
|
68
|
-
const version = `${match[1]}.${match[2]}`;
|
|
69
|
-
if (versionGe(version, required)) {
|
|
70
|
-
info(`Python ${result.stdout.trim()} >= ${required} ✓`);
|
|
71
|
-
await ensurePip();
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
warn(`Python ${version} < ${required}, upgrading...`);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
info('Python3 not found, installing...');
|
|
79
|
-
}
|
|
80
|
-
await installPython();
|
|
81
|
-
await ensurePip();
|
|
82
|
-
}
|
|
83
|
-
async function installPython() {
|
|
84
|
-
const required = `${PYTHON_MIN_MAJOR}.${PYTHON_MIN_MINOR}`;
|
|
85
|
-
info(`Installing Python >= ${required}...`);
|
|
86
|
-
if (await commandExists('apt-get')) {
|
|
87
|
-
// Try deadsnakes PPA for newer Python on older Ubuntu
|
|
88
|
-
await shell('apt-get update -qq').catch(() => { });
|
|
89
|
-
await shell('apt-get install -y -qq python3 python3-pip python3-venv python3-dev').catch(async () => {
|
|
90
|
-
info('Trying deadsnakes PPA...');
|
|
91
|
-
await shell('apt-get install -y -qq software-properties-common').catch(() => { });
|
|
92
|
-
await shell('add-apt-repository -y ppa:deadsnakes/ppa').catch(() => { });
|
|
93
|
-
await shell('apt-get update -qq');
|
|
94
|
-
await shell('apt-get install -y -qq python3 python3-pip python3-venv python3-dev');
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
else if (await commandExists('dnf')) {
|
|
98
|
-
await shell('dnf install -y python3 python3-pip python3-devel');
|
|
99
|
-
}
|
|
100
|
-
else if (await commandExists('yum')) {
|
|
101
|
-
await shell('yum install -y python3 python3-pip python3-devel');
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
throw new Error(`Cannot install Python: no supported package manager. Install Python >= ${required} manually.`);
|
|
105
|
-
}
|
|
106
|
-
// Verify
|
|
107
|
-
const verify = await shellCapture('python3 --version');
|
|
108
|
-
if (verify.code !== 0)
|
|
109
|
-
throw new Error('Python installation failed');
|
|
110
|
-
const match = verify.stdout.match(/(\d+)\.(\d+)/);
|
|
111
|
-
if (match && !versionGe(`${match[1]}.${match[2]}`, required)) {
|
|
112
|
-
throw new Error(`Installed Python ${match[1]}.${match[2]} still below ${required}. Install manually.`);
|
|
113
|
-
}
|
|
114
|
-
info(`Python ${verify.stdout.trim()} installed ✓`);
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Ensure pip is available.
|
|
118
|
-
*/
|
|
119
|
-
async function ensurePip() {
|
|
120
|
-
const result = await shellCapture('python3 -m pip --version');
|
|
121
|
-
if (result.code === 0)
|
|
122
|
-
return;
|
|
123
|
-
info('pip not found, installing...');
|
|
124
|
-
await shell('curl -fsSL https://bootstrap.pypa.io/get-pip.py | python3').catch(async () => {
|
|
125
|
-
await installSystemPackages(['python3-pip']);
|
|
126
|
-
});
|
|
127
|
-
const verify = await shellCapture('python3 -m pip --version');
|
|
128
|
-
if (verify.code !== 0)
|
|
129
|
-
throw new Error('Failed to install pip');
|
|
130
|
-
}
|
|
131
107
|
/**
|
|
132
108
|
* Ensure a command exists on PATH.
|
|
133
109
|
*/
|
|
@@ -147,20 +123,6 @@ export async function checkDiskSpace(requiredMb) {
|
|
|
147
123
|
}
|
|
148
124
|
}
|
|
149
125
|
// ---- helpers ----
|
|
150
|
-
async function installSystemPackages(packages) {
|
|
151
|
-
if (await commandExists('apt-get')) {
|
|
152
|
-
await shell(`apt-get update -qq && apt-get install -y -qq ${packages.join(' ')}`);
|
|
153
|
-
}
|
|
154
|
-
else if (await commandExists('dnf')) {
|
|
155
|
-
await shell(`dnf install -y ${packages.join(' ')}`);
|
|
156
|
-
}
|
|
157
|
-
else if (await commandExists('yum')) {
|
|
158
|
-
await shell(`yum install -y ${packages.join(' ')}`);
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
throw new Error(`Cannot install packages: no supported package manager`);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
126
|
function versionGe(a, b) {
|
|
165
127
|
const pa = a.split('.').map(Number);
|
|
166
128
|
const pb = b.split('.').map(Number);
|
package/dist/utils/deps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/utils/deps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/utils/deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type InstallComponentKind = 'openclaw' | 'channel' | 'skill';
|
|
2
|
+
export interface ParsedInstallComponent {
|
|
3
|
+
kind: InstallComponentKind;
|
|
4
|
+
raw: string;
|
|
5
|
+
channelName?: string;
|
|
6
|
+
skillName?: string;
|
|
7
|
+
}
|
|
8
|
+
export type PackageSource = {
|
|
9
|
+
kind: 'remote';
|
|
10
|
+
url: string;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'local';
|
|
13
|
+
path: string;
|
|
14
|
+
};
|
|
15
|
+
export type SafePackageVersion = string & {
|
|
16
|
+
readonly __safePackageVersion: unique symbol;
|
|
17
|
+
};
|
|
18
|
+
export declare function parseInstallComponent(component: string): ParsedInstallComponent;
|
|
19
|
+
export declare function assertSafeInstallName(kind: 'channel' | 'skill', name: string): string;
|
|
20
|
+
export declare function assertSafePackageVersion(version: string): SafePackageVersion;
|
|
21
|
+
export declare function parsePackageSource(raw: string): PackageSource;
|
|
22
|
+
export declare function resolveInside(baseDir: string, ...segments: string[]): string;
|
|
23
|
+
export declare function channelExtensionDir(channelName: string): string;
|
|
24
|
+
export declare function skillInstallDir(skillName: string): string;
|
|
25
|
+
export declare function tmpInstallPath(fileName: string): string;
|