@silicaclaw/cli 1.0.0-beta.25 → 1.0.0-beta.29
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/CHANGELOG.md +27 -0
- package/INSTALL.md +19 -16
- package/README.md +9 -8
- package/apps/local-console/public/index.html +1055 -261
- package/apps/local-console/src/server.ts +21 -0
- package/package.json +1 -1
- package/scripts/quickstart.sh +89 -45
- package/scripts/silicaclaw-cli.mjs +147 -88
- package/scripts/silicaclaw-gateway.mjs +134 -62
|
@@ -71,6 +71,24 @@ const WEBRTC_SEED_PEERS = process.env.WEBRTC_SEED_PEERS || "";
|
|
|
71
71
|
const WEBRTC_BOOTSTRAP_HINTS = process.env.WEBRTC_BOOTSTRAP_HINTS || "";
|
|
72
72
|
const PROFILE_VERSION = "v0.9";
|
|
73
73
|
|
|
74
|
+
function readWorkspaceVersion(workspaceRoot: string): string {
|
|
75
|
+
const pkgFile = resolve(workspaceRoot, "package.json");
|
|
76
|
+
if (existsSync(pkgFile)) {
|
|
77
|
+
try {
|
|
78
|
+
const pkg = JSON.parse(readFileSync(pkgFile, "utf8")) as { version?: string };
|
|
79
|
+
if (pkg.version) return String(pkg.version);
|
|
80
|
+
} catch {
|
|
81
|
+
// ignore
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const versionFile = resolve(workspaceRoot, "VERSION");
|
|
85
|
+
if (existsSync(versionFile)) {
|
|
86
|
+
const raw = readFileSync(versionFile, "utf8").trim();
|
|
87
|
+
if (raw) return raw;
|
|
88
|
+
}
|
|
89
|
+
return "unknown";
|
|
90
|
+
}
|
|
91
|
+
|
|
74
92
|
function resolveWorkspaceRoot(cwd = process.cwd()): string {
|
|
75
93
|
if (existsSync(resolve(cwd, "apps", "local-console", "package.json"))) {
|
|
76
94
|
return cwd;
|
|
@@ -211,10 +229,12 @@ class LocalNodeService {
|
|
|
211
229
|
private webrtcSeedPeers: string[] = [];
|
|
212
230
|
private webrtcBootstrapHints: string[] = [];
|
|
213
231
|
private webrtcBootstrapSources: string[] = [];
|
|
232
|
+
private appVersion = "unknown";
|
|
214
233
|
|
|
215
234
|
constructor() {
|
|
216
235
|
this.workspaceRoot = resolveWorkspaceRoot();
|
|
217
236
|
this.storageRoot = resolveStorageRoot(this.workspaceRoot);
|
|
237
|
+
this.appVersion = readWorkspaceVersion(this.workspaceRoot);
|
|
218
238
|
migrateLegacyDataIfNeeded(this.workspaceRoot, this.storageRoot);
|
|
219
239
|
|
|
220
240
|
this.identityRepo = new IdentityRepo(this.storageRoot);
|
|
@@ -283,6 +303,7 @@ class LocalNodeService {
|
|
|
283
303
|
).length;
|
|
284
304
|
|
|
285
305
|
return {
|
|
306
|
+
app_version: this.appVersion,
|
|
286
307
|
agent_id: this.identity?.agent_id ?? "",
|
|
287
308
|
public_enabled: Boolean(this.profile?.public_enabled),
|
|
288
309
|
broadcast_enabled: this.broadcastEnabled,
|
package/package.json
CHANGED
package/scripts/quickstart.sh
CHANGED
|
@@ -21,16 +21,49 @@ esac
|
|
|
21
21
|
|
|
22
22
|
STEP=1
|
|
23
23
|
|
|
24
|
+
ORANGE=$'\033[38;5;208m'
|
|
25
|
+
BOLD=$'\033[1m'
|
|
26
|
+
DIM=$'\033[2m'
|
|
27
|
+
GREEN=$'\033[32m'
|
|
28
|
+
YELLOW=$'\033[33m'
|
|
29
|
+
RESET=$'\033[0m'
|
|
30
|
+
|
|
31
|
+
if [ ! -t 1 ] || [ -n "${NO_COLOR:-}" ]; then
|
|
32
|
+
ORANGE=""
|
|
33
|
+
BOLD=""
|
|
34
|
+
DIM=""
|
|
35
|
+
GREEN=""
|
|
36
|
+
YELLOW=""
|
|
37
|
+
RESET=""
|
|
38
|
+
fi
|
|
39
|
+
|
|
24
40
|
line() {
|
|
25
41
|
printf '\n%s\n' "------------------------------------------------------------"
|
|
26
42
|
}
|
|
27
43
|
|
|
28
44
|
title() {
|
|
29
45
|
line
|
|
30
|
-
printf '[Step %s] %s\n' "$STEP" "$1"
|
|
46
|
+
printf '%s[Step %s]%s %s\n' "$BOLD" "$STEP" "$RESET" "$1"
|
|
31
47
|
STEP=$((STEP + 1))
|
|
32
48
|
}
|
|
33
49
|
|
|
50
|
+
headline() {
|
|
51
|
+
printf '%sSilicaClaw%s %s%s%s\n' "$ORANGE$BOLD" "$RESET" "$DIM" "$(cat "$WORK_DIR/VERSION" 2>/dev/null || printf 'unknown')" "$RESET"
|
|
52
|
+
printf '%sPublic identity and discovery for OpenClaw agents.%s\n' "$DIM" "$RESET"
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
kv() {
|
|
56
|
+
printf '%s%-14s%s %s\n' "$DIM" "$1" "$RESET" "$2"
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
note() {
|
|
60
|
+
printf '%s%s%s\n' "$YELLOW" "$1" "$RESET"
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
success() {
|
|
64
|
+
printf '%s%s%s\n' "$GREEN" "$1" "$RESET"
|
|
65
|
+
}
|
|
66
|
+
|
|
34
67
|
run_cmd() {
|
|
35
68
|
local cmd="$1"
|
|
36
69
|
printf '→ %s\n' "$cmd"
|
|
@@ -190,8 +223,10 @@ url_port_or_default() {
|
|
|
190
223
|
}
|
|
191
224
|
|
|
192
225
|
title "SilicaClaw Quick Start 启动"
|
|
193
|
-
|
|
194
|
-
echo "
|
|
226
|
+
headline
|
|
227
|
+
echo ""
|
|
228
|
+
kv "目录" "$ROOT_DIR"
|
|
229
|
+
kv "目标" "一步步完成安装、联网与启动"
|
|
195
230
|
pause_continue
|
|
196
231
|
|
|
197
232
|
if [ "$IS_NPX_MODE" -eq 1 ]; then
|
|
@@ -208,7 +243,8 @@ if [ "$IS_NPX_MODE" -eq 1 ]; then
|
|
|
208
243
|
fi
|
|
209
244
|
|
|
210
245
|
mkdir -p "$TARGET_DIR"
|
|
211
|
-
|
|
246
|
+
kv "安装目录" "$TARGET_DIR"
|
|
247
|
+
echo "正在复制项目文件..."
|
|
212
248
|
if command -v rsync >/dev/null 2>&1; then
|
|
213
249
|
rsync -a --delete \
|
|
214
250
|
--exclude '.git/' \
|
|
@@ -221,7 +257,8 @@ if [ "$IS_NPX_MODE" -eq 1 ]; then
|
|
|
221
257
|
rm -rf "$TARGET_DIR/.git" "$TARGET_DIR/node_modules" "$TARGET_DIR/.npm-cache"
|
|
222
258
|
fi
|
|
223
259
|
WORK_DIR="$TARGET_DIR"
|
|
224
|
-
|
|
260
|
+
success "工作目录已切换"
|
|
261
|
+
kv "目录" "$WORK_DIR"
|
|
225
262
|
pause_continue
|
|
226
263
|
fi
|
|
227
264
|
|
|
@@ -237,8 +274,8 @@ fi
|
|
|
237
274
|
|
|
238
275
|
NODE_VER="$(node -p "process.versions.node")"
|
|
239
276
|
NPM_VER="$(npm -v)"
|
|
240
|
-
|
|
241
|
-
|
|
277
|
+
kv "node" "$NODE_VER"
|
|
278
|
+
kv "npm" "$NPM_VER"
|
|
242
279
|
|
|
243
280
|
if ! node -e "const v=process.versions.node.split('.').map(Number); if (v[0] < 18) process.exit(1)"; then
|
|
244
281
|
echo "Node.js 版本过低,请升级到 18+"
|
|
@@ -258,32 +295,33 @@ fi
|
|
|
258
295
|
|
|
259
296
|
title "安装系统命令(silicaclaw)"
|
|
260
297
|
if command -v silicaclaw >/dev/null 2>&1; then
|
|
261
|
-
|
|
262
|
-
|
|
298
|
+
success "已检测到 silicaclaw 命令"
|
|
299
|
+
kv "路径" "$(command -v silicaclaw)"
|
|
263
300
|
else
|
|
264
|
-
echo "
|
|
301
|
+
echo "将尝试安装可持久使用的 silicaclaw 命令。"
|
|
265
302
|
BIN_DIR="$(first_writable_path_dir || true)"
|
|
266
303
|
INSTALLED=0
|
|
267
304
|
if [ -n "${BIN_DIR:-}" ]; then
|
|
268
305
|
if install_command_shim "$BIN_DIR"; then
|
|
269
|
-
|
|
306
|
+
success "命令已写入"
|
|
307
|
+
kv "路径" "$BIN_DIR/silicaclaw"
|
|
270
308
|
hash -r || true
|
|
271
309
|
if command -v silicaclaw >/dev/null 2>&1; then
|
|
272
|
-
|
|
310
|
+
kv "验证" "$(command -v silicaclaw)"
|
|
273
311
|
INSTALLED=1
|
|
274
312
|
else
|
|
275
|
-
|
|
313
|
+
note "当前 shell 还未刷新。新开终端后即可直接运行 silicaclaw。"
|
|
276
314
|
fi
|
|
277
315
|
else
|
|
278
|
-
|
|
316
|
+
note "命令安装未完成,仍可继续使用 npx。"
|
|
279
317
|
fi
|
|
280
318
|
else
|
|
281
|
-
|
|
319
|
+
note "PATH 中没有可写目录,无法直接安装到现有 PATH。"
|
|
282
320
|
fi
|
|
283
321
|
|
|
284
322
|
if [ "$INSTALLED" != "1" ]; then
|
|
285
323
|
SYS_BIN_DIR="$(default_system_bin_dir)"
|
|
286
|
-
|
|
324
|
+
kv "建议路径" "$SYS_BIN_DIR/silicaclaw"
|
|
287
325
|
if ask_yes_no "是否使用 sudo 安装系统命令?" "Y"; then
|
|
288
326
|
run_cmd "sudo mkdir -p \"$SYS_BIN_DIR\""
|
|
289
327
|
run_cmd "sudo tee \"$SYS_BIN_DIR/silicaclaw\" >/dev/null <<'EOF'
|
|
@@ -294,26 +332,27 @@ EOF"
|
|
|
294
332
|
run_cmd "sudo chmod +x \"$SYS_BIN_DIR/silicaclaw\""
|
|
295
333
|
hash -r || true
|
|
296
334
|
if command -v silicaclaw >/dev/null 2>&1; then
|
|
297
|
-
|
|
335
|
+
success "系统命令安装完成"
|
|
336
|
+
kv "验证" "$(command -v silicaclaw)"
|
|
298
337
|
INSTALLED=1
|
|
299
338
|
else
|
|
300
|
-
|
|
339
|
+
note "安装完成,但当前 shell 未刷新。新开终端后再试。"
|
|
301
340
|
fi
|
|
302
341
|
else
|
|
303
|
-
|
|
342
|
+
note "已跳过 sudo 安装。"
|
|
304
343
|
fi
|
|
305
344
|
fi
|
|
306
345
|
|
|
307
346
|
if [ "$INSTALLED" != "1" ]; then
|
|
308
|
-
echo "
|
|
347
|
+
echo "你也可以选择无需全局安装的命令别名模式。"
|
|
309
348
|
if ask_yes_no "是否自动写入 shell alias(silicaclaw -> npx @silicaclaw/cli@beta)?" "Y"; then
|
|
310
349
|
if install_npx_alias; then
|
|
311
|
-
|
|
350
|
+
success "alias 安装完成"
|
|
312
351
|
else
|
|
313
|
-
|
|
352
|
+
note "alias 安装失败。继续使用 npx 即可。"
|
|
314
353
|
fi
|
|
315
354
|
else
|
|
316
|
-
|
|
355
|
+
kv "临时用法" "npx @silicaclaw/cli@beta <command>"
|
|
317
356
|
fi
|
|
318
357
|
fi
|
|
319
358
|
fi
|
|
@@ -334,8 +373,8 @@ title "选择网络模式"
|
|
|
334
373
|
echo "1) local 单机预览(最快)"
|
|
335
374
|
echo "2) lan 局域网预览(A/B 双机)"
|
|
336
375
|
echo "3) global-preview 互联网预览(Relay,推荐)"
|
|
337
|
-
|
|
338
|
-
|
|
376
|
+
note "不确定就直接回车,默认 global-preview。"
|
|
377
|
+
note "互联网模式需要所有节点都能访问同一个 relay。"
|
|
339
378
|
if [ "$CONNECT_MODE" = "1" ]; then
|
|
340
379
|
MODE_PICK="3"
|
|
341
380
|
echo "connect 模式:已自动选择 global-preview。"
|
|
@@ -363,13 +402,13 @@ case "$MODE_PICK" in
|
|
|
363
402
|
if [ -n "$PUBLIC_IP" ]; then
|
|
364
403
|
SIGNALING_DEFAULT="https://relay.silicaclaw.com"
|
|
365
404
|
fi
|
|
366
|
-
|
|
405
|
+
note "signaling 地址需要所有节点都可访问。"
|
|
367
406
|
if [ -n "$PUBLIC_IP" ]; then
|
|
368
|
-
|
|
369
|
-
|
|
407
|
+
kv "公网 IP" "$PUBLIC_IP"
|
|
408
|
+
note "如果这台机器就是 relay 所在主机,可直接使用默认值。"
|
|
370
409
|
else
|
|
371
|
-
|
|
372
|
-
|
|
410
|
+
kv "默认 relay" "$SIGNALING_DEFAULT"
|
|
411
|
+
note "如需私有 relay,可改成你自己的公网地址。"
|
|
373
412
|
fi
|
|
374
413
|
read -r -p "请输入 signaling URL(默认 ${SIGNALING_DEFAULT}): " WEBRTC_SIGNALING_URL_INPUT || true
|
|
375
414
|
WEBRTC_SIGNALING_URL_VALUE="${WEBRTC_SIGNALING_URL_INPUT:-$SIGNALING_DEFAULT}"
|
|
@@ -380,13 +419,13 @@ case "$MODE_PICK" in
|
|
|
380
419
|
|
|
381
420
|
SIGNALING_HOST="$(url_host "$WEBRTC_SIGNALING_URL_VALUE")"
|
|
382
421
|
if [ "$SIGNALING_HOST" = "localhost" ] || [ "$SIGNALING_HOST" = "127.0.0.1" ]; then
|
|
383
|
-
|
|
422
|
+
note "当前 signaling URL 是本机地址,仅本机可用,不适合异地双机。"
|
|
384
423
|
fi
|
|
385
424
|
|
|
386
425
|
if ask_yes_no "是否在当前机器自动后台启动 signaling server(用于演示)?" "Y"; then
|
|
387
426
|
AUTO_START_SIGNALING=1
|
|
388
427
|
SIGNALING_PORT_VALUE="$(url_port_or_default "$WEBRTC_SIGNALING_URL_VALUE" "4510")"
|
|
389
|
-
|
|
428
|
+
kv "本地 relay" "PORT=$SIGNALING_PORT_VALUE"
|
|
390
429
|
fi
|
|
391
430
|
|
|
392
431
|
read -r -p "请输入 room(默认 silicaclaw-global-preview): " WEBRTC_ROOM_VALUE_INPUT || true
|
|
@@ -398,7 +437,9 @@ case "$MODE_PICK" in
|
|
|
398
437
|
;;
|
|
399
438
|
esac
|
|
400
439
|
|
|
401
|
-
|
|
440
|
+
success "网络模式已选择"
|
|
441
|
+
kv "Mode" "$NETWORK_MODE"
|
|
442
|
+
kv "Adapter" "$NETWORK_ADAPTER"
|
|
402
443
|
|
|
403
444
|
title "启动 local-console"
|
|
404
445
|
echo "1) gateway(推荐) 后台服务模式,可用 start/stop/restart/status 管理"
|
|
@@ -413,18 +454,19 @@ if [ "$START_MODE_PICK" = "2" ]; then
|
|
|
413
454
|
SIGNALING_LOG="$WORK_DIR/.silicaclaw/signaling.log"
|
|
414
455
|
SIGNALING_PID_FILE="$WORK_DIR/.silicaclaw/signaling.pid"
|
|
415
456
|
run_cmd "cd \"$WORK_DIR\" && PORT=${SIGNALING_PORT_VALUE:-4510} nohup npm run webrtc-signaling > \"$SIGNALING_LOG\" 2>&1 & echo \$! > \"$SIGNALING_PID_FILE\""
|
|
416
|
-
|
|
417
|
-
|
|
457
|
+
success "已后台启动 signaling server"
|
|
458
|
+
kv "日志" "$SIGNALING_LOG"
|
|
459
|
+
kv "停止" "kill \$(cat \"$SIGNALING_PID_FILE\")"
|
|
418
460
|
fi
|
|
419
461
|
echo "将使用以下参数启动(dev watch):"
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
462
|
+
kv "Adapter" "$NETWORK_ADAPTER"
|
|
463
|
+
kv "Relay" "$WEBRTC_SIGNALING_URL_VALUE"
|
|
464
|
+
kv "Room" "$WEBRTC_ROOM_VALUE"
|
|
423
465
|
pause_continue
|
|
424
466
|
run_cmd "cd \"$WORK_DIR\" && NETWORK_ADAPTER=$NETWORK_ADAPTER WEBRTC_SIGNALING_URL=$WEBRTC_SIGNALING_URL_VALUE WEBRTC_ROOM=$WEBRTC_ROOM_VALUE npm run local-console"
|
|
425
467
|
else
|
|
426
468
|
echo "将使用以下参数启动(dev watch):"
|
|
427
|
-
|
|
469
|
+
kv "Adapter" "$NETWORK_ADAPTER"
|
|
428
470
|
pause_continue
|
|
429
471
|
run_cmd "cd \"$WORK_DIR\" && NETWORK_ADAPTER=$NETWORK_ADAPTER npm run local-console"
|
|
430
472
|
fi
|
|
@@ -434,14 +476,16 @@ else
|
|
|
434
476
|
GATEWAY_CMD="$GATEWAY_CMD --signaling-url=$WEBRTC_SIGNALING_URL_VALUE --room=$WEBRTC_ROOM_VALUE"
|
|
435
477
|
fi
|
|
436
478
|
echo "将使用 gateway 后台启动:"
|
|
437
|
-
|
|
479
|
+
kv "Command" "$GATEWAY_CMD"
|
|
438
480
|
pause_continue
|
|
439
481
|
run_cmd "$GATEWAY_CMD"
|
|
440
482
|
echo ""
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
echo "
|
|
444
|
-
echo "
|
|
483
|
+
success "已启动完成"
|
|
484
|
+
kv "打开" "http://localhost:4310"
|
|
485
|
+
echo ""
|
|
486
|
+
echo "常用命令:"
|
|
487
|
+
kv "Status" "silicaclaw status"
|
|
488
|
+
kv "Logs" "silicaclaw logs local-console"
|
|
489
|
+
kv "Stop" "silicaclaw stop"
|
|
445
490
|
echo ""
|
|
446
|
-
echo "打开: http://localhost:4310"
|
|
447
491
|
fi
|