@okclaw-build/cli 1.0.0-beta.6 → 1.0.0-beta.60

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 (121) hide show
  1. package/dist/bridge/daemon/config.d.ts +24 -0
  2. package/dist/bridge/daemon/config.js +96 -0
  3. package/dist/bridge/daemon/config.js.map +1 -0
  4. package/dist/bridge/daemon/daemon.d.ts +7 -0
  5. package/dist/bridge/daemon/daemon.js +23 -0
  6. package/dist/bridge/daemon/daemon.js.map +1 -0
  7. package/dist/bridge/daemon/event-id.d.ts +2 -0
  8. package/dist/bridge/daemon/event-id.js +18 -0
  9. package/dist/bridge/daemon/event-id.js.map +1 -0
  10. package/dist/bridge/daemon/frames.d.ts +81 -0
  11. package/dist/bridge/daemon/frames.js +64 -0
  12. package/dist/bridge/daemon/frames.js.map +1 -0
  13. package/dist/bridge/daemon/openclaw-chat-runtime.d.ts +80 -0
  14. package/dist/bridge/daemon/openclaw-chat-runtime.js +1222 -0
  15. package/dist/bridge/daemon/openclaw-chat-runtime.js.map +1 -0
  16. package/dist/bridge/daemon/openclaw-gateway-client.d.ts +58 -0
  17. package/dist/bridge/daemon/openclaw-gateway-client.js +251 -0
  18. package/dist/bridge/daemon/openclaw-gateway-client.js.map +1 -0
  19. package/dist/bridge/daemon/relay-client.d.ts +75 -0
  20. package/dist/bridge/daemon/relay-client.js +369 -0
  21. package/dist/bridge/daemon/relay-client.js.map +1 -0
  22. package/dist/bridge/daemon/stub-chat-runtime.d.ts +4 -0
  23. package/dist/bridge/daemon/stub-chat-runtime.js +91 -0
  24. package/dist/bridge/daemon/stub-chat-runtime.js.map +1 -0
  25. package/dist/bridge/service.d.ts +12 -0
  26. package/dist/bridge/service.js +86 -0
  27. package/dist/bridge/service.js.map +1 -0
  28. package/dist/commands/backup.d.ts +16 -0
  29. package/dist/commands/backup.js +99 -0
  30. package/dist/commands/backup.js.map +1 -0
  31. package/dist/commands/bridge.d.ts +7 -0
  32. package/dist/commands/bridge.js +100 -0
  33. package/dist/commands/bridge.js.map +1 -0
  34. package/dist/commands/check.js +22 -6
  35. package/dist/commands/check.js.map +1 -1
  36. package/dist/commands/edit.d.ts +2 -7
  37. package/dist/commands/edit.js +28 -16
  38. package/dist/commands/edit.js.map +1 -1
  39. package/dist/commands/feed.js +48 -16
  40. package/dist/commands/feed.js.map +1 -1
  41. package/dist/commands/install.js +99 -18
  42. package/dist/commands/install.js.map +1 -1
  43. package/dist/commands/migration.d.ts +1 -0
  44. package/dist/commands/migration.js +205 -0
  45. package/dist/commands/migration.js.map +1 -0
  46. package/dist/commands/openclaw-channel-login.d.ts +54 -0
  47. package/dist/commands/openclaw-channel-login.js +334 -0
  48. package/dist/commands/openclaw-channel-login.js.map +1 -0
  49. package/dist/commands/restore.d.ts +16 -0
  50. package/dist/commands/restore.js +94 -0
  51. package/dist/commands/restore.js.map +1 -0
  52. package/dist/commands/service.js +56 -13
  53. package/dist/commands/service.js.map +1 -1
  54. package/dist/commands/show.d.ts +13 -0
  55. package/dist/commands/show.js +70 -0
  56. package/dist/commands/show.js.map +1 -0
  57. package/dist/commands/skill.d.ts +1 -0
  58. package/dist/commands/skill.js +137 -0
  59. package/dist/commands/skill.js.map +1 -0
  60. package/dist/commands/uninstall.d.ts +1 -0
  61. package/dist/commands/uninstall.js +46 -0
  62. package/dist/commands/uninstall.js.map +1 -0
  63. package/dist/index.js +121 -12
  64. package/dist/index.js.map +1 -1
  65. package/dist/installers/base.d.ts +3 -1
  66. package/dist/installers/channel.d.ts +10 -2
  67. package/dist/installers/channel.js +143 -24
  68. package/dist/installers/channel.js.map +1 -1
  69. package/dist/installers/openclaw.d.ts +19 -2
  70. package/dist/installers/openclaw.js +186 -55
  71. package/dist/installers/openclaw.js.map +1 -1
  72. package/dist/installers/openviking-purge.d.ts +52 -0
  73. package/dist/installers/openviking-purge.js +380 -0
  74. package/dist/installers/openviking-purge.js.map +1 -0
  75. package/dist/installers/openviking.js +1 -2
  76. package/dist/installers/openviking.js.map +1 -1
  77. package/dist/installers/skill.d.ts +5 -2
  78. package/dist/installers/skill.js +67 -18
  79. package/dist/installers/skill.js.map +1 -1
  80. package/dist/migration/archive.d.ts +14 -0
  81. package/dist/migration/archive.js +84 -0
  82. package/dist/migration/archive.js.map +1 -0
  83. package/dist/migration/crypto.d.ts +16 -0
  84. package/dist/migration/crypto.js +56 -0
  85. package/dist/migration/crypto.js.map +1 -0
  86. package/dist/migration/manifest.d.ts +39 -0
  87. package/dist/migration/manifest.js +140 -0
  88. package/dist/migration/manifest.js.map +1 -0
  89. package/dist/openclaw-user-data.d.ts +86 -0
  90. package/dist/openclaw-user-data.js +422 -0
  91. package/dist/openclaw-user-data.js.map +1 -0
  92. package/dist/output/mode.d.ts +11 -0
  93. package/dist/output/mode.js +27 -0
  94. package/dist/output/mode.js.map +1 -0
  95. package/dist/output/ndjson.d.ts +57 -0
  96. package/dist/output/ndjson.js +136 -0
  97. package/dist/output/ndjson.js.map +1 -0
  98. package/dist/utils/constants.d.ts +14 -13
  99. package/dist/utils/constants.js +40 -21
  100. package/dist/utils/constants.js.map +1 -1
  101. package/dist/utils/deps.d.ts +34 -3
  102. package/dist/utils/deps.js +62 -100
  103. package/dist/utils/deps.js.map +1 -1
  104. package/dist/utils/install-safety.d.ts +25 -0
  105. package/dist/utils/install-safety.js +97 -0
  106. package/dist/utils/install-safety.js.map +1 -0
  107. package/dist/utils/logger.d.ts +10 -0
  108. package/dist/utils/logger.js +31 -4
  109. package/dist/utils/logger.js.map +1 -1
  110. package/dist/utils/mirror.js +14 -0
  111. package/dist/utils/mirror.js.map +1 -1
  112. package/dist/utils/openclaw-config-cli.d.ts +19 -0
  113. package/dist/utils/openclaw-config-cli.js +81 -0
  114. package/dist/utils/openclaw-config-cli.js.map +1 -0
  115. package/dist/utils/openclaw-daemon.d.ts +58 -0
  116. package/dist/utils/openclaw-daemon.js +154 -0
  117. package/dist/utils/openclaw-daemon.js.map +1 -0
  118. package/dist/utils/shell.d.ts +23 -2
  119. package/dist/utils/shell.js +138 -5
  120. package/dist/utils/shell.js.map +1 -1
  121. package/package.json +6 -4
@@ -0,0 +1,334 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, symlinkSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { isNdjson } from '../output/mode.js';
6
+ import { NdjsonEmitter, clearActiveEmitter, registerExitHandlers } from '../output/ndjson.js';
7
+ import { OPENCLAW_HOME } from '../utils/constants.js';
8
+ import { runCommandCapture } from '../utils/shell.js';
9
+ export const OPENCLAW_WEIXIN_CHANNEL_ID = 'openclaw-weixin';
10
+ export const WECHAT_PLUGIN_MISSING = 'WECHAT_PLUGIN_MISSING';
11
+ export const WECHAT_QR_START_FAILED = 'WECHAT_QR_START_FAILED';
12
+ export const WECHAT_QR_EXPIRED = 'WECHAT_QR_EXPIRED';
13
+ export const WECHAT_LOGIN_FAILED = 'WECHAT_LOGIN_FAILED';
14
+ export const WECHAT_CHANNEL_START_FAILED = 'WECHAT_CHANNEL_START_FAILED';
15
+ const ACCOUNT_ID_PATTERN = /^[A-Za-z0-9._-]{1,64}$/;
16
+ const DEFAULT_ACCOUNT_ID = 'default';
17
+ const DEFAULT_TIMEOUT_SECONDS = 300;
18
+ const MAX_TIMEOUT_SECONDS = 600;
19
+ const WAIT_SLICE_MS = 35_000;
20
+ export async function openclawChannelLoginCommand(args) {
21
+ const emitter = new NdjsonEmitter('openclaw-channel-login');
22
+ registerExitHandlers(emitter);
23
+ try {
24
+ const options = parseOpenclawChannelLoginArgs(args);
25
+ await runOpenclawChannelLogin(options, { emitter });
26
+ }
27
+ finally {
28
+ clearActiveEmitter();
29
+ }
30
+ }
31
+ export function parseOpenclawChannelLoginArgs(args) {
32
+ let channelId = '';
33
+ let accountId = DEFAULT_ACCOUNT_ID;
34
+ let force = false;
35
+ let timeoutSeconds = DEFAULT_TIMEOUT_SECONDS;
36
+ for (let i = 0; i < args.length; i++) {
37
+ const arg = args[i];
38
+ const readValue = (name) => {
39
+ if (arg.startsWith(`${name}=`)) {
40
+ return arg.slice(name.length + 1);
41
+ }
42
+ const value = args[++i];
43
+ if (!value) {
44
+ throw new Error(`${name} requires a value`);
45
+ }
46
+ return value;
47
+ };
48
+ if (arg === '--channel' || arg.startsWith('--channel=')) {
49
+ channelId = readValue('--channel').trim();
50
+ }
51
+ else if (arg === '--account' || arg.startsWith('--account=')) {
52
+ accountId = readValue('--account').trim();
53
+ }
54
+ else if (arg === '--timeout-seconds' || arg.startsWith('--timeout-seconds=')) {
55
+ timeoutSeconds = normalizeTimeoutSeconds(readValue('--timeout-seconds'));
56
+ }
57
+ else if (arg === '--force') {
58
+ force = true;
59
+ }
60
+ else {
61
+ throw new Error(`Unknown openclaw-channel-login argument: ${arg}`);
62
+ }
63
+ }
64
+ if (!channelId) {
65
+ throw new Error('--channel is required');
66
+ }
67
+ if (channelId !== OPENCLAW_WEIXIN_CHANNEL_ID) {
68
+ throw new Error(`only ${OPENCLAW_WEIXIN_CHANNEL_ID} is supported`);
69
+ }
70
+ if (!ACCOUNT_ID_PATTERN.test(accountId)) {
71
+ throw new Error('invalid account id');
72
+ }
73
+ return { channelId, accountId, force, timeoutSeconds };
74
+ }
75
+ export async function runOpenclawChannelLogin(options, deps) {
76
+ const emitter = deps.emitter;
77
+ emitter.start('start openclaw channel login', {
78
+ channelId: options.channelId,
79
+ accountId: options.accountId,
80
+ force: options.force,
81
+ });
82
+ try {
83
+ const plugin = await (deps.loadPlugin ?? loadInstalledWeixinPlugin)(options.channelId);
84
+ const gateway = plugin.gateway;
85
+ if (!gateway?.loginWithQrStart || !gateway.loginWithQrWait) {
86
+ throw new LoginFailure(WECHAT_PLUGIN_MISSING, 'openclaw-weixin QR login adapter is unavailable');
87
+ }
88
+ const start = await capturePluginStdout(() => gateway.loginWithQrStart({
89
+ accountId: options.accountId,
90
+ force: options.force,
91
+ timeoutMs: 30_000,
92
+ }));
93
+ if (start.connected) {
94
+ const accountId = resolveAccountId(plugin, options.accountId);
95
+ await (deps.startChannel ?? startOpenclawChannel)(options.channelId, accountId);
96
+ emitter.end(true, 0, undefined, successFields(options.channelId, accountId, true));
97
+ return;
98
+ }
99
+ const qrDataUrl = typeof start.qrDataUrl === 'string' ? start.qrDataUrl.trim() : '';
100
+ const sessionKey = typeof start.sessionKey === 'string' ? start.sessionKey.trim() : '';
101
+ if (!qrDataUrl || !sessionKey) {
102
+ throw new LoginFailure(WECHAT_QR_START_FAILED, start.message || 'wechat qr login did not return qrDataUrl');
103
+ }
104
+ emitter.progress('qr_ready', 0.05, 'wechat qr ready', {
105
+ channelId: options.channelId,
106
+ accountId: options.accountId,
107
+ qrDataUrl,
108
+ expireInSeconds: options.timeoutSeconds,
109
+ message: start.message || 'scan qr',
110
+ });
111
+ const deadline = Date.now() + options.timeoutSeconds * 1000;
112
+ while (Date.now() < deadline) {
113
+ const timeoutMs = Math.min(WAIT_SLICE_MS, Math.max(1000, deadline - Date.now()));
114
+ const wait = await capturePluginStdout(() => gateway.loginWithQrWait({
115
+ accountId: options.accountId,
116
+ timeoutMs,
117
+ currentQrDataUrl: qrDataUrl,
118
+ sessionKey,
119
+ }));
120
+ if (wait.connected) {
121
+ const accountId = resolveAccountId(plugin, wait.accountId || options.accountId);
122
+ await (deps.startChannel ?? startOpenclawChannel)(options.channelId, accountId);
123
+ emitter.end(true, 0, undefined, successFields(options.channelId, accountId, false));
124
+ return;
125
+ }
126
+ if (wait.alreadyConnected || isAlreadyConnectedMessage(wait.message)) {
127
+ const accountId = resolveAccountId(plugin, wait.accountId || options.accountId);
128
+ await (deps.startChannel ?? startOpenclawChannel)(options.channelId, accountId);
129
+ emitter.end(true, 0, undefined, successFields(options.channelId, accountId, true));
130
+ return;
131
+ }
132
+ }
133
+ throw new LoginFailure(WECHAT_QR_EXPIRED, 'wechat qr login expired');
134
+ }
135
+ catch (err) {
136
+ const failure = normalizeFailure(err);
137
+ emitter.end(false, 1, failure.code, {
138
+ channelId: options.channelId,
139
+ accountId: options.accountId,
140
+ errorMessage: failure.message,
141
+ });
142
+ if (!isNdjson()) {
143
+ throw err;
144
+ }
145
+ }
146
+ }
147
+ async function loadInstalledWeixinPlugin(channelId) {
148
+ const pluginDir = join(OPENCLAW_HOME, 'extensions', channelId);
149
+ const entry = join(pluginDir, 'dist', 'index.js');
150
+ if (!existsSync(entry)) {
151
+ throw new LoginFailure(WECHAT_PLUGIN_MISSING, `${entry} not found`);
152
+ }
153
+ ensureOpenclawPeerVisible(pluginDir);
154
+ const module = await import(pathToFileURL(entry).href);
155
+ const pluginEntry = module.default;
156
+ if (!pluginEntry || typeof pluginEntry.register !== 'function') {
157
+ throw new LoginFailure(WECHAT_PLUGIN_MISSING, 'openclaw-weixin plugin entry is invalid');
158
+ }
159
+ let captured;
160
+ pluginEntry.register({
161
+ runtime: { version: 'unknown' },
162
+ registerChannel(input) {
163
+ captured = input.plugin;
164
+ },
165
+ });
166
+ if (!captured || captured.id !== channelId) {
167
+ throw new LoginFailure(WECHAT_PLUGIN_MISSING, 'openclaw-weixin channel plugin was not registered');
168
+ }
169
+ return captured;
170
+ }
171
+ function ensureOpenclawPeerVisible(pluginDir) {
172
+ const nodeModulesDir = join(pluginDir, 'node_modules');
173
+ const linkPath = join(nodeModulesDir, 'openclaw');
174
+ if (existsSync(linkPath)) {
175
+ return;
176
+ }
177
+ const openclawRoot = resolveOpenclawPackageRoot();
178
+ mkdirSync(nodeModulesDir, { recursive: true });
179
+ try {
180
+ symlinkSync(openclawRoot, linkPath, 'dir');
181
+ }
182
+ catch (err) {
183
+ if (!existsSync(linkPath) || !lstatSync(linkPath).isSymbolicLink()) {
184
+ throw err;
185
+ }
186
+ }
187
+ }
188
+ function resolveOpenclawPackageRoot() {
189
+ const candidates = [
190
+ resolveOpenclawRootFromNpm(),
191
+ resolveOpenclawRootFromBinary(),
192
+ ].filter((value) => Boolean(value));
193
+ const found = candidates.find((candidate) => existsSync(candidate));
194
+ if (found) {
195
+ return found;
196
+ }
197
+ throw new LoginFailure(WECHAT_PLUGIN_MISSING, 'openclaw package root is not resolvable in current node environment');
198
+ }
199
+ function resolveOpenclawRootFromNpm() {
200
+ try {
201
+ const globalRoot = execFileSync('npm', ['root', '-g'], { encoding: 'utf8' }).trim();
202
+ return globalRoot ? join(globalRoot, 'openclaw') : undefined;
203
+ }
204
+ catch {
205
+ return undefined;
206
+ }
207
+ }
208
+ function resolveOpenclawRootFromBinary() {
209
+ try {
210
+ const bin = execFileSync('sh', ['-lc', 'command -v openclaw'], { encoding: 'utf8' }).trim();
211
+ if (!bin)
212
+ return undefined;
213
+ return findPackageRoot(dirname(realpathSync(bin)));
214
+ }
215
+ catch {
216
+ return undefined;
217
+ }
218
+ }
219
+ function findPackageRoot(startDir) {
220
+ let current = startDir;
221
+ for (let i = 0; i < 10; i++) {
222
+ const pkg = join(current, 'package.json');
223
+ if (existsSync(pkg)) {
224
+ try {
225
+ const parsed = JSON.parse(readFileSync(pkg, 'utf8'));
226
+ if (parsed.name === 'openclaw') {
227
+ return current;
228
+ }
229
+ }
230
+ catch {
231
+ return undefined;
232
+ }
233
+ }
234
+ const parent = dirname(current);
235
+ if (parent === current)
236
+ return undefined;
237
+ current = parent;
238
+ }
239
+ return undefined;
240
+ }
241
+ async function startOpenclawChannel(channelId, accountId) {
242
+ const result = await runCommandCapture('openclaw', [
243
+ 'gateway',
244
+ 'call',
245
+ 'channels.start',
246
+ '--params',
247
+ JSON.stringify({ channel: channelId, accountId }),
248
+ '--json',
249
+ '--timeout',
250
+ '30000',
251
+ ]);
252
+ if (result.code !== 0) {
253
+ throw new LoginFailure(WECHAT_CHANNEL_START_FAILED, 'openclaw channels.start failed');
254
+ }
255
+ }
256
+ function resolveAccountId(plugin, rawAccountId) {
257
+ if (rawAccountId === DEFAULT_ACCOUNT_ID) {
258
+ try {
259
+ const accountIds = plugin.config?.listAccountIds?.({ channels: {} }) ?? [];
260
+ if (accountIds.length === 1 && accountIds[0]?.trim()) {
261
+ return accountIds[0].trim();
262
+ }
263
+ }
264
+ catch {
265
+ // Continue with resolveAccount fallback.
266
+ }
267
+ }
268
+ try {
269
+ const account = plugin.config?.resolveAccount?.({ channels: {} }, rawAccountId);
270
+ const normalized = account?.accountId;
271
+ if (typeof normalized === 'string' && normalized.trim()) {
272
+ return normalized.trim();
273
+ }
274
+ }
275
+ catch {
276
+ // Fall back to the raw value; the plugin already saved credentials before this point.
277
+ }
278
+ return rawAccountId;
279
+ }
280
+ async function capturePluginStdout(fn) {
281
+ if (!isNdjson()) {
282
+ return fn();
283
+ }
284
+ const stdoutWrite = process.stdout.write;
285
+ const stderrWrite = process.stderr.write;
286
+ process.stdout.write = (() => true);
287
+ process.stderr.write = (() => true);
288
+ try {
289
+ return await fn();
290
+ }
291
+ finally {
292
+ process.stdout.write = stdoutWrite;
293
+ process.stderr.write = stderrWrite;
294
+ }
295
+ }
296
+ function successFields(channelId, accountId, alreadyConnected) {
297
+ return {
298
+ channelId,
299
+ accountId,
300
+ connected: true,
301
+ alreadyConnected,
302
+ };
303
+ }
304
+ function isAlreadyConnectedMessage(message) {
305
+ if (typeof message !== 'string') {
306
+ return false;
307
+ }
308
+ const text = message.toLowerCase();
309
+ return text.includes('already') || message.includes('无需重复连接') || message.includes('已连接过');
310
+ }
311
+ function normalizeTimeoutSeconds(raw) {
312
+ const parsed = Number.parseInt(raw, 10);
313
+ if (!Number.isFinite(parsed) || parsed <= 0) {
314
+ return DEFAULT_TIMEOUT_SECONDS;
315
+ }
316
+ return Math.min(parsed, MAX_TIMEOUT_SECONDS);
317
+ }
318
+ function normalizeFailure(err) {
319
+ if (err instanceof LoginFailure) {
320
+ return { code: err.code, message: err.message };
321
+ }
322
+ return {
323
+ code: WECHAT_LOGIN_FAILED,
324
+ message: err instanceof Error ? err.message : String(err),
325
+ };
326
+ }
327
+ class LoginFailure extends Error {
328
+ code;
329
+ constructor(code, message) {
330
+ super(message);
331
+ this.code = code;
332
+ }
333
+ }
334
+ //# sourceMappingURL=openclaw-channel-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-channel-login.js","sourceRoot":"","sources":["../../src/commands/openclaw-channel-login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { restoreOpenclawUserDataArchive } from '../openclaw-user-data.js';
2
+ type RestoreEvent = {
3
+ ok: boolean;
4
+ code: string;
5
+ message: string;
6
+ stagingDir?: string;
7
+ archivePath?: string;
8
+ restoredFiles?: string[];
9
+ error?: string;
10
+ };
11
+ export type RestoreCommandDeps = {
12
+ restoreArchive?: typeof restoreOpenclawUserDataArchive;
13
+ emit?: (event: RestoreEvent) => void;
14
+ };
15
+ export declare function restoreCommand(args: string[], deps?: RestoreCommandDeps): Promise<void>;
16
+ export {};
@@ -0,0 +1,94 @@
1
+ import { error, info } from '../utils/logger.js';
2
+ import { restoreOpenclawUserDataArchive, } from '../openclaw-user-data.js';
3
+ export async function restoreCommand(args, deps = {}) {
4
+ const parsed = parseRestoreArgs(args);
5
+ const emit = deps.emit ?? defaultEmit;
6
+ const restoreArchive = deps.restoreArchive ?? restoreOpenclawUserDataArchive;
7
+ if (parsed.target !== 'openclaw-user-data' || !parsed.archivePath) {
8
+ error('Usage: okclaw restore openclaw-user-data --archive <path> [--scope user-data|clone] [--include-workspace-extra] [--output=ndjson]');
9
+ process.exit(1);
10
+ }
11
+ try {
12
+ const result = await restoreArchive({
13
+ archivePath: parsed.archivePath,
14
+ scope: parsed.scope,
15
+ includeWorkspaceExtra: parsed.includeWorkspaceExtra,
16
+ });
17
+ emit({
18
+ ok: true,
19
+ code: 'OK',
20
+ message: 'openclaw user data restored',
21
+ stagingDir: result.stagingDir,
22
+ archivePath: result.archivePath,
23
+ restoredFiles: result.restoredFiles,
24
+ });
25
+ if (!parsed.ndjson) {
26
+ info(`Restored openclaw user data from ${result.archivePath}`);
27
+ }
28
+ }
29
+ catch (e) {
30
+ const err = e;
31
+ emit({
32
+ ok: false,
33
+ code: 'E_RESTORE_FAILED',
34
+ message: 'openclaw user data restore failed',
35
+ stagingDir: err.stagingDir,
36
+ archivePath: err.archivePath ?? parsed.archivePath,
37
+ error: err.message,
38
+ });
39
+ throw e;
40
+ }
41
+ }
42
+ function parseRestoreArgs(args) {
43
+ let target;
44
+ let archivePath;
45
+ let scope = 'user-data';
46
+ let includeWorkspaceExtra = false;
47
+ let ndjson = false;
48
+ for (let i = 0; i < args.length; i++) {
49
+ const arg = args[i];
50
+ if (!target && !arg.startsWith('--')) {
51
+ target = arg;
52
+ continue;
53
+ }
54
+ if (arg === '--archive' && args[i + 1]) {
55
+ archivePath = args[++i];
56
+ continue;
57
+ }
58
+ if (arg.startsWith('--archive=')) {
59
+ archivePath = arg.slice('--archive='.length);
60
+ continue;
61
+ }
62
+ if (arg === '--scope') {
63
+ if (!args[i + 1]) {
64
+ throw new Error('missing value for --scope');
65
+ }
66
+ scope = parseScope(args[++i]);
67
+ continue;
68
+ }
69
+ if (arg.startsWith('--scope=')) {
70
+ scope = parseScope(arg.slice('--scope='.length));
71
+ continue;
72
+ }
73
+ if (arg === '--include-workspace-extra') {
74
+ includeWorkspaceExtra = true;
75
+ continue;
76
+ }
77
+ if (arg === '--output=ndjson' || (arg === '--output' && args[i + 1] === 'ndjson')) {
78
+ ndjson = true;
79
+ if (arg === '--output')
80
+ i += 1;
81
+ }
82
+ }
83
+ return { target, archivePath, scope, includeWorkspaceExtra, ndjson };
84
+ }
85
+ function parseScope(value) {
86
+ if (value === 'user-data' || value === 'clone') {
87
+ return value;
88
+ }
89
+ throw new Error(`unsupported openclaw user data scope: ${value}`);
90
+ }
91
+ function defaultEmit(event) {
92
+ process.stdout.write(JSON.stringify(event) + '\n');
93
+ }
94
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,66 @@
1
- import { shell, shellCapture } from '../utils/shell.js';
2
1
  import { info, success } from '../utils/logger.js';
3
- import { OPENVIKING_ENV } from '../utils/constants.js';
2
+ import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
3
+ import { isNdjson } from '../output/mode.js';
4
+ import { OPENCLAW_GATEWAY_PORT } from '../utils/constants.js';
5
+ import { startGateway, stopGateway, restartGateway, probeGatewayState } from '../utils/openclaw-daemon.js';
6
+ async function runSimpleOp(op, step, humanVerb, action) {
7
+ const emitter = new NdjsonEmitter(op);
8
+ registerExitHandlers(emitter);
9
+ emitter.start(`${humanVerb} gateway`);
10
+ info(`${humanVerb} openclaw gateway...`);
11
+ try {
12
+ emitter.stepStart(step, `${humanVerb} gateway`);
13
+ await action();
14
+ emitter.stepDone(step, 'done');
15
+ success(`Gateway ${step}ed.`);
16
+ emitter.end(true, 0);
17
+ }
18
+ catch (e) {
19
+ const msg = e instanceof Error ? e.message : String(e);
20
+ emitter.end(false, 1, `E_${op.toUpperCase()}_FAILED`, { error: msg });
21
+ throw e;
22
+ }
23
+ }
4
24
  export async function startCommand() {
5
- info('Starting openclaw gateway...');
6
- await shell(`source ${OPENVIKING_ENV} 2>/dev/null || true; openclaw gateway start`);
7
- success('Gateway started.');
25
+ await runSimpleOp('start', 'start', 'Starting', startGateway);
8
26
  }
9
27
  export async function stopCommand() {
10
- info('Stopping openclaw gateway...');
11
- await shell('openclaw gateway stop 2>/dev/null || true');
12
- success('Gateway stopped.');
28
+ await runSimpleOp('stop', 'stop', 'Stopping', stopGateway);
13
29
  }
14
30
  export async function restartCommand() {
15
- info('Restarting openclaw gateway...');
16
- await shell(`source ${OPENVIKING_ENV} 2>/dev/null || true; openclaw gateway restart`);
17
- success('Gateway restarted.');
31
+ await runSimpleOp('restart', 'restart', 'Restarting', restartGateway);
18
32
  }
19
33
  export async function statusCommand() {
20
- const result = await shellCapture('openclaw gateway status 2>&1 || true');
21
- console.log(result.stdout || result.stderr || 'No output');
34
+ const emitter = new NdjsonEmitter('status');
35
+ registerExitHandlers(emitter);
36
+ emitter.start('querying gateway status');
37
+ emitter.stepStart('status', 'checking openclaw gateway process');
38
+ try {
39
+ // 健康判定以 18789 端口监听为准 —— systemd 服务 active ≠ 端口已对外服务。
40
+ // probeGatewayState 内含启动窗口的 bounded wait。
41
+ const state = await probeGatewayState();
42
+ const running = state === 'listening';
43
+ const output = state === 'listening'
44
+ ? `Gateway listening on port ${OPENCLAW_GATEWAY_PORT}`
45
+ : state === 'starting'
46
+ ? `Gateway service active but not listening on port ${OPENCLAW_GATEWAY_PORT} (starting/degraded)`
47
+ : `No gateway process found on port ${OPENCLAW_GATEWAY_PORT}`;
48
+ if (!isNdjson()) {
49
+ console.log(output);
50
+ }
51
+ emitter.stepDone('status', 'status query done');
52
+ emitter.end(running, running ? 0 : 1, running ? undefined : state === 'starting' ? 'E_STATUS_DEGRADED' : 'E_STATUS_NOT_RUNNING', { running, state, rawOutput: output });
53
+ // gateway 没真正对外监听时进程退出码也必须非 0 —— os-api 的 bootstrap
54
+ // 「Step 6」和迁移「target:status」都靠 shell 退出码做校验门
55
+ // (`okclaw status || 失败`),只写 ndjson、进程仍 exit 0 会让校验形同虚设。
56
+ if (!running) {
57
+ process.exit(1);
58
+ }
59
+ }
60
+ catch (e) {
61
+ const msg = e instanceof Error ? e.message : String(e);
62
+ emitter.end(false, 1, 'E_STATUS_FAILED', { error: msg });
63
+ throw e;
64
+ }
22
65
  }
23
66
  //# sourceMappingURL=service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACrC,MAAM,KAAK,CAAC,UAAU,cAAc,8CAA8C,CAAC,CAAC;IACpF,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACrC,MAAM,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACzD,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACvC,MAAM,KAAK,CAAC,UAAU,cAAc,gDAAgD,CAAC,CAAC;IACtF,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,sCAAsC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * okclaw show <target...>
3
+ *
4
+ * 把 target 对应的文件内容原样输出到 stdout(text 模式);
5
+ * 在 ndjson 模式下,文件内容放到 end 事件的 fields.content(plan 决策 #16)。
6
+ *
7
+ * - 文件存在 → 输出文件内容,exit 0
8
+ * - 文件不存在 → 输出空内容,exit 0(视为尚未创建)
9
+ * - target 非法 → stderr 提示,exit 1
10
+ *
11
+ * `targets` 参数用于测试注入;生产调用不传第二个参数,使用 edit.ts 导出的 TARGETS。
12
+ */
13
+ export declare function showCommand(args: string[], targets?: Record<string, string>): Promise<void>;
@@ -0,0 +1,70 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { error } from '../utils/logger.js';
3
+ import { TARGETS as DEFAULT_TARGETS } from './edit.js';
4
+ import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
5
+ import { isNdjson } from '../output/mode.js';
6
+ /**
7
+ * okclaw show <target...>
8
+ *
9
+ * 把 target 对应的文件内容原样输出到 stdout(text 模式);
10
+ * 在 ndjson 模式下,文件内容放到 end 事件的 fields.content(plan 决策 #16)。
11
+ *
12
+ * - 文件存在 → 输出文件内容,exit 0
13
+ * - 文件不存在 → 输出空内容,exit 0(视为尚未创建)
14
+ * - target 非法 → stderr 提示,exit 1
15
+ *
16
+ * `targets` 参数用于测试注入;生产调用不传第二个参数,使用 edit.ts 导出的 TARGETS。
17
+ */
18
+ export async function showCommand(args, targets = DEFAULT_TARGETS) {
19
+ const emitter = new NdjsonEmitter('file_read');
20
+ registerExitHandlers(emitter);
21
+ const requestedTargets = args.filter((arg) => !arg.startsWith('--'));
22
+ if (requestedTargets.length === 0 || requestedTargets.some((target) => !targets[target])) {
23
+ error(`Usage: okclaw show <${Object.keys(targets).join('|')}>`);
24
+ emitter.end(false, 1, 'E_USAGE');
25
+ process.exit(1);
26
+ }
27
+ if (!isNdjson() && requestedTargets.length > 1) {
28
+ error('Multiple targets are only supported with --output=ndjson');
29
+ emitter.end(false, 1, 'E_USAGE');
30
+ process.exit(1);
31
+ }
32
+ emitter.start(`reading ${requestedTargets.join(',')}`, { targets: requestedTargets });
33
+ try {
34
+ const files = [];
35
+ for (const target of requestedTargets) {
36
+ const path = targets[target];
37
+ emitter.stepStart(`read:${target}`, `reading ${path}`, { target, path });
38
+ const exists = existsSync(path);
39
+ const content = exists ? readFileSync(path, 'utf8') : '';
40
+ files.push({ fileKey: target, path, exists, content });
41
+ emitter.stepDone(`read:${target}`, exists ? 'read ok' : 'file not found, returning empty');
42
+ }
43
+ if (!isNdjson()) {
44
+ const { exists, content } = files[0];
45
+ if (exists) {
46
+ process.stdout.write(content);
47
+ }
48
+ }
49
+ // 单文件保持 content 兼容;批量读取用 files 数组承载返回值。
50
+ if (requestedTargets.length === 1) {
51
+ const file = files[0];
52
+ emitter.end(true, 0, undefined, {
53
+ target: file.fileKey,
54
+ path: file.path,
55
+ exists: file.exists,
56
+ content: file.content,
57
+ });
58
+ }
59
+ else {
60
+ emitter.end(true, 0, undefined, { files });
61
+ }
62
+ }
63
+ catch (e) {
64
+ const msg = e instanceof Error ? e.message : String(e);
65
+ error(msg);
66
+ emitter.end(false, 1, 'E_READ_FAILED', { error: msg });
67
+ process.exit(1);
68
+ }
69
+ }
70
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"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"}