@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,27 @@
1
+ /**
2
+ * CLI 输出模式全局状态。index.ts 解析 --output / --op-id 后注入;
3
+ * ndjson.ts 与 logger.ts 读取以决定行为。
4
+ */
5
+ let currentMode = 'text';
6
+ let currentOpId;
7
+ let currentNdjsonPath;
8
+ export function setOutputMode(mode, opId) {
9
+ currentMode = mode;
10
+ currentOpId = opId;
11
+ }
12
+ export function setNdjsonPath(path) {
13
+ currentNdjsonPath = path;
14
+ }
15
+ export function getOutputMode() {
16
+ return currentMode;
17
+ }
18
+ export function getOpId() {
19
+ return currentOpId;
20
+ }
21
+ export function getNdjsonPath() {
22
+ return currentNdjsonPath;
23
+ }
24
+ export function isNdjson() {
25
+ return currentMode === 'ndjson';
26
+ }
27
+ //# sourceMappingURL=mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/output/mode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,IAAI,WAAW,GAAe,MAAM,CAAC;AACrC,IAAI,WAA+B,CAAC;AACpC,IAAI,iBAAqC,CAAC;AAE1C,MAAM,UAAU,aAAa,CAAC,IAAgB,EAAE,IAAa;IAC3D,WAAW,GAAG,IAAI,CAAC;IACnB,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAwB;IACpD,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,WAAW,KAAK,QAAQ,CAAC;AAClC,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Envelope 字段说明见 docs/superpowers/specs/2026-04-19-host-operation-refactor-design.md
3
+ * §okclaw-cli ndjson 输出契约。
4
+ */
5
+ export type OpPhase = 'start' | 'step_start' | 'progress' | 'step_done' | 'log' | 'end';
6
+ export type Level = 'debug' | 'info' | 'warn' | 'error';
7
+ export interface NdjsonEvent {
8
+ ts: string;
9
+ seq: number;
10
+ op: string;
11
+ phase: OpPhase;
12
+ step?: string;
13
+ level: Level;
14
+ progress?: number;
15
+ msg?: string;
16
+ fields?: Record<string, unknown>;
17
+ code?: string;
18
+ }
19
+ export type NdjsonWriter = (line: string) => void;
20
+ /**
21
+ * 单 op 的事件发射器。在 text 模式下所有方法都是 no-op;ndjson 模式才写出。
22
+ *
23
+ * 约定:
24
+ * - seq 单调递增,同一 emitter 实例内唯一
25
+ * - end() 只能发一次,重复调用忽略
26
+ * - 非正常退出(exception/signal)由 registerExitHandlers 兜底补 end
27
+ */
28
+ export declare class NdjsonEmitter {
29
+ private seq;
30
+ private readonly op;
31
+ private readonly writer;
32
+ private ended;
33
+ constructor(op: string, writer?: NdjsonWriter);
34
+ start(msg?: string, fields?: Record<string, unknown>): void;
35
+ stepStart(step: string, msg: string, fields?: Record<string, unknown>): void;
36
+ progress(step: string, progress: number, msg?: string, fields?: Record<string, unknown>): void;
37
+ stepDone(step: string, msg: string, fields?: Record<string, unknown>): void;
38
+ /**
39
+ * 通用日志事件。走独立 phase="log"(bug#7 修:之前借用 phase="progress" 会
40
+ * 污染"取 max(progress) 作为当前进度"的聚合逻辑)。用 level 区分严重度。
41
+ */
42
+ log(level: Level, msg: string, fields?: Record<string, unknown>): void;
43
+ /**
44
+ * 终态事件;必发。ok=false 时 fields 里加 errorCode(可选)。
45
+ * end 事件的 fields 可承载 op-specific 返回值(如 FILE_READ 的 content)。
46
+ */
47
+ end(ok: boolean, exitCode: number, code?: string, fields?: Record<string, unknown>): void;
48
+ hasEnded(): boolean;
49
+ private emit;
50
+ }
51
+ export declare function getActiveEmitter(): NdjsonEmitter | null;
52
+ export declare function clearActiveEmitter(): void;
53
+ /**
54
+ * 注册进程兜底,确保 ndjson 模式下 end 事件必发(plan P1 风险:忘 flush → os-api 卡死)。
55
+ * 只在 ndjson 模式生效。
56
+ */
57
+ export declare function registerExitHandlers(emitter: NdjsonEmitter): void;
@@ -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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"}
@@ -4,20 +4,23 @@ export declare const OKCLAW_BACKUP_DIR = "/root/okclaw/backup";
4
4
  export declare const OKCLAW_TMP_DIR = "/root/okclaw/tmp";
5
5
  export declare const OPENCLAW_HOME = "/root/.openclaw";
6
6
  export declare const OPENCLAW_WORKSPACE = "/root/.openclaw/workspace";
7
+ export declare const OPENCLAW_GATEWAY_PORT = 18789;
7
8
  export declare const OPENVIKING_HOME = "/root/.openviking";
8
9
  export declare const OPENVIKING_CONF = "/root/.openviking/ov.conf";
9
10
  export declare const OPENVIKING_ENV = "/root/.openclaw/openviking.env";
10
11
  export declare const OPENVIKING_PORT = 1933;
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 NODE_MIN_MAJOR = 24;
13
+ export declare const NODE_MIN_MINOR = 0;
14
+ export declare const NODE_INSTALL_VERSION = "24";
16
15
  export declare const NPM_REGISTRY = "https://registry.npmmirror.com";
16
+ export declare const CLI_NPM_REGISTRY = "https://registry.npmjs.org";
17
+ export declare const CLI_PACKAGE = "@okclaw-build/cli";
17
18
  export declare const PIP_INDEX_URL = "https://pypi.tuna.tsinghua.edu.cn/simple";
18
19
  export declare const PIP_TRUSTED_HOST = "pypi.tuna.tsinghua.edu.cn";
19
20
  export declare const NODE_MIRROR = "https://npmmirror.com/mirrors/node";
20
21
  export declare const JSDELIVR_GH = "https://cdn.jsdelivr.net/gh";
22
+ export declare const NVM_VERSION = "v0.40.3";
23
+ export declare const NVM_SH_SOURCES: string[];
21
24
  export declare const OPENVIKING_REPO = "volcengine/OpenViking";
22
25
  export declare const OPENVIKING_PLUGIN_DIR = "examples/openclaw-plugin";
23
26
  export declare const OPENVIKING_PLUGIN_REQUIRED_FILES: string[];
@@ -5,24 +5,49 @@ export const OKCLAW_BACKUP_DIR = `${OKCLAW_HOME}/backup`;
5
5
  export const OKCLAW_TMP_DIR = `${OKCLAW_HOME}/tmp`;
6
6
  export const OPENCLAW_HOME = '/root/.openclaw';
7
7
  export const OPENCLAW_WORKSPACE = `${OPENCLAW_HOME}/workspace`;
8
+ // openclaw gateway 默认 WebSocket 端口。gateway 进程名在不同启动方式下不固定
9
+ // (`openclaw gateway run` → `openclaw`,systemd → `node`),所以进程识别一律
10
+ // 按这个监听端口来,不能用 `ps -C` / `pkill -f` 匹配进程名。
11
+ export const OPENCLAW_GATEWAY_PORT = 18789;
8
12
  export const OPENVIKING_HOME = '/root/.openviking';
9
13
  export const OPENVIKING_CONF = `${OPENVIKING_HOME}/ov.conf`;
10
14
  export const OPENVIKING_ENV = `${OPENCLAW_HOME}/openviking.env`;
11
15
  export const OPENVIKING_PORT = 1933;
12
- // Version requirementsslightly above official minimums
13
- // Official: Node >= 22.14, Python >= 3.10
14
- export const NODE_MIN_MAJOR = 22;
15
- export const NODE_MIN_MINOR = 16;
16
- export const NODE_INSTALL_VERSION = '22.16.0';
17
- export const PYTHON_MIN_MAJOR = 3;
18
- export const PYTHON_MIN_MINOR = 11;
16
+ // Node baselinestandardize on the current LTS (Node 24, "Krypton").
17
+ // openclaw keeps raising its own minimum over time (e.g. >=22.19), so any
18
+ // host sitting on an older Node makes `openclaw onboard` fail with
19
+ // "Node.js vX is required". Keeping the CLI's floor well ahead means a stale
20
+ // host is auto-upgraded via nvm (see deps.ts) — never a hard error.
21
+ export const NODE_MIN_MAJOR = 24;
22
+ export const NODE_MIN_MINOR = 0;
23
+ // Major-only: nvm resolves the latest 24.x LTS patch at install time, so we
24
+ // pick up security releases without bumping a pinned version here.
25
+ export const NODE_INSTALL_VERSION = '24';
19
26
  // China mirrors
20
27
  export const NPM_REGISTRY = 'https://registry.npmmirror.com';
28
+ // The okclaw CLI itself is published on the public npm registry (not mirrored
29
+ // to npmmirror reliably), so self-relocation after a Node upgrade pulls it from
30
+ // npmjs.org — same registry os-api's preflight uses to install the CLI.
31
+ export const CLI_NPM_REGISTRY = 'https://registry.npmjs.org';
32
+ export const CLI_PACKAGE = '@okclaw-build/cli';
21
33
  export const PIP_INDEX_URL = 'https://pypi.tuna.tsinghua.edu.cn/simple';
22
34
  export const PIP_TRUSTED_HOST = 'pypi.tuna.tsinghua.edu.cn';
23
35
  export const NODE_MIRROR = 'https://npmmirror.com/mirrors/node';
24
36
  // jsdelivr CDN for GitHub content (works in China, GitHub raw does not)
25
37
  export const JSDELIVR_GH = 'https://cdn.jsdelivr.net/gh';
38
+ // nvm install sources. The official install.sh clones/downloads from GitHub
39
+ // (raw.githubusercontent.com / github.com .git) which is unreliable in China,
40
+ // so instead we drop nvm.sh itself directly — a single self-contained file that
41
+ // is enough for `nvm install/use/alias`. jsdelivr serves any repo file and is
42
+ // reachable in China; gitee/github raw are fallbacks. Tried in order, each curl
43
+ // time-bounded, and validated by running `nvm --version` (rejects HTML/redirect
44
+ // bodies that still return 200).
45
+ export const NVM_VERSION = 'v0.40.3';
46
+ export const NVM_SH_SOURCES = [
47
+ `${JSDELIVR_GH}/nvm-sh/nvm@${NVM_VERSION}/nvm.sh`,
48
+ `https://gitee.com/mirrors/nvm/raw/${NVM_VERSION}/nvm.sh`,
49
+ `https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/nvm.sh`,
50
+ ];
26
51
  export const OPENVIKING_REPO = 'volcengine/OpenViking';
27
52
  export const OPENVIKING_PLUGIN_DIR = 'examples/openclaw-plugin';
28
53
  // Plugin files to download (same as ov-install)
@@ -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;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,aAAa,YAAY,CAAC;AAC/D,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AACnD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,eAAe,UAAU,CAAC;AAC5D,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,aAAa,iBAAiB,CAAC;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,0DAA0D;AAC1D,0CAA0C;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,gCAAgC,CAAC;AAC7D,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;AACzD,MAAM,CAAC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAEhE,gDAAgD;AAChD,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AAC1F,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,mBAAmB,EAAE,WAAW,EAAE,oBAAoB;IACtD,mBAAmB,EAAE,eAAe,EAAE,iBAAiB;IACvD,8BAA8B,EAAE,sBAAsB;IACtD,eAAe;CAChB,CAAC;AAEF,8BAA8B;AAC9B,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,QAAQ,EAAE,iBAAiB;IAC3B,MAAM,EAAE,iCAAiC;IACzC,iDAAiD;IACjD,mEAAmE;CACpE,CAAC;AAEF,yEAAyE;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,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;AAEnD,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,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AACnD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,eAAe,UAAU,CAAC;AAC5D,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,aAAa,iBAAiB,CAAC;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,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,MAAM,CAAC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAEhE,gDAAgD;AAChD,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AAC1F,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,mBAAmB,EAAE,WAAW,EAAE,oBAAoB;IACtD,mBAAmB,EAAE,eAAe,EAAE,iBAAiB;IACvD,8BAA8B,EAAE,sBAAsB;IACtD,eAAe;CAChB,CAAC;AAEF,8BAA8B;AAC9B,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,QAAQ,EAAE,iBAAiB;IAC3B,MAAM,EAAE,iCAAiC;IACzC,iDAAiD;IACjD,mEAAmE;CACpE,CAAC;AAEF,yEAAyE;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC"}
@@ -4,10 +4,41 @@
4
4
  */
5
5
  export declare function ensureNodeVersion(): Promise<void>;
6
6
  /**
7
- * Ensure Python >= PYTHON_MIN_MAJOR.PYTHON_MIN_MINOR is installed.
8
- * Auto-installs via system package manager if missing or too old.
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 declare function ensurePython(): Promise<void>;
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
  */
@@ -1,6 +1,7 @@
1
- import { shell, shellCapture, commandExists } from './shell.js';
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, PYTHON_MIN_MAJOR, PYTHON_MIN_MINOR, } from './constants.js';
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
- // Install nvm from gitee mirror (GitHub is unreliable in China)
35
- await shell(`curl -fsSL https://gitee.com/mirrors/nvm/raw/master/install.sh | PROFILE=/dev/null NVM_DIR=${NVM_DIR} bash`).catch(async () => {
36
- // Fallback: npmmirror hosted nvm install script
37
- info('Retrying nvm install from npmmirror...');
38
- await shell(`curl -fsSL https://npmmirror.com/mirrors/nvm/v0.40.3/install.sh | PROFILE=/dev/null NVM_DIR=${NVM_DIR} bash`);
39
- });
40
- // Verify
41
- const verify = await shellCapture('nvm --version');
42
- if (verify.code !== 0)
43
- throw new Error('nvm installation failed');
44
- info(`nvm ${verify.stdout.trim()} installed ✓`);
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);
@@ -1 +1 @@
1
- {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/utils/deps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/utils/deps.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,13 @@
1
+ /**
2
+ * 人类可读 log。
3
+ *
4
+ * ndjson 模式下:所有业务级 log(info / warn / success / error)静默。
5
+ * - info/warn/success 本就无关紧要,静默避免污染 stdout 结构化流
6
+ * - error 也静默(bug#5 修):业务错误必须通过 emitter.end(false, code, { error: msg }) 承载,
7
+ * 与 design 契约对齐(stderr 仅给真正的崩溃栈,由 registerExitHandlers 的 uncaughtException 打印)
8
+ *
9
+ * 调用方注意:ndjson 模式下调 error(msg) 不会让用户看见消息,务必把 msg 塞进 emitter.end 的 fields。
10
+ */
1
11
  export declare function info(msg: string): void;
2
12
  export declare function warn(msg: string): void;
3
13
  export declare function error(msg: string): void;