@silicaclaw/cli 2026.3.19-27 → 2026.3.19-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 +12 -0
- package/DEMO_GUIDE.md +1 -1
- package/INSTALL.md +1 -1
- package/VERSION +1 -1
- package/apps/local-console/dist/apps/local-console/src/server.d.ts +10 -0
- package/apps/local-console/dist/apps/local-console/src/server.js +46 -13
- package/apps/local-console/src/server.ts +51 -13
- package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -1
- package/openclaw-skills/silicaclaw-broadcast/manifest.json +1 -1
- package/package.json +1 -1
- package/scripts/silicaclaw-cli.mjs +6 -3
- package/scripts/silicaclaw-gateway.mjs +21 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
## v1.0 beta - 2026-03-19
|
|
4
4
|
|
|
5
|
+
### 2026.3.19-29
|
|
6
|
+
|
|
7
|
+
- release build:
|
|
8
|
+
- prepared another fresh latest-channel package build without publishing
|
|
9
|
+
- regenerated the npm tarball through the verified release packing workflow
|
|
10
|
+
|
|
11
|
+
### 2026.3.19-28
|
|
12
|
+
|
|
13
|
+
- release build:
|
|
14
|
+
- prepared another fresh latest-channel package build without publishing
|
|
15
|
+
- regenerated the npm tarball through the verified release packing workflow
|
|
16
|
+
|
|
5
17
|
### 2026.3.19-27
|
|
6
18
|
|
|
7
19
|
- release channel simplification:
|
package/DEMO_GUIDE.md
CHANGED
package/INSTALL.md
CHANGED
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v2026.3.19-
|
|
1
|
+
v2026.3.19-29
|
|
@@ -191,6 +191,8 @@ export declare class LocalNodeService {
|
|
|
191
191
|
private webrtcSeedPeers;
|
|
192
192
|
private webrtcBootstrapHints;
|
|
193
193
|
private webrtcBootstrapSources;
|
|
194
|
+
private networkStarted;
|
|
195
|
+
private networkStartupError;
|
|
194
196
|
private appVersion;
|
|
195
197
|
constructor(options?: {
|
|
196
198
|
workspaceRoot?: string;
|
|
@@ -269,6 +271,8 @@ export declare class LocalNodeService {
|
|
|
269
271
|
real_preview_transport_stats: any;
|
|
270
272
|
real_preview_discovery_stats: any;
|
|
271
273
|
webrtc_preview: {
|
|
274
|
+
started: boolean;
|
|
275
|
+
startup_error: string | null;
|
|
272
276
|
signaling_url: any;
|
|
273
277
|
signaling_endpoints: any;
|
|
274
278
|
room: any;
|
|
@@ -295,6 +299,8 @@ export declare class LocalNodeService {
|
|
|
295
299
|
limits: any;
|
|
296
300
|
adapter_config: any;
|
|
297
301
|
adapter_extra: {
|
|
302
|
+
started: boolean;
|
|
303
|
+
startup_error: string | null;
|
|
298
304
|
signaling_url: any;
|
|
299
305
|
signaling_endpoints: any;
|
|
300
306
|
room: any;
|
|
@@ -363,6 +369,8 @@ export declare class LocalNodeService {
|
|
|
363
369
|
adapter_transport_stats: any;
|
|
364
370
|
adapter_discovery_stats: any;
|
|
365
371
|
adapter_diagnostics_summary: {
|
|
372
|
+
started: boolean;
|
|
373
|
+
startup_error: string | null;
|
|
366
374
|
signaling_url: any;
|
|
367
375
|
signaling_endpoints: any;
|
|
368
376
|
room: any;
|
|
@@ -406,6 +414,8 @@ export declare class LocalNodeService {
|
|
|
406
414
|
components: any;
|
|
407
415
|
limits: any;
|
|
408
416
|
diagnostics_summary: {
|
|
417
|
+
started: boolean;
|
|
418
|
+
startup_error: string | null;
|
|
409
419
|
signaling_url: any;
|
|
410
420
|
signaling_endpoints: any;
|
|
411
421
|
room: any;
|
|
@@ -144,6 +144,12 @@ function resolveWorkspaceRoot(cwd = process.cwd()) {
|
|
|
144
144
|
return cwd;
|
|
145
145
|
}
|
|
146
146
|
function resolveProjectRoot(appRoot, cwd = process.cwd()) {
|
|
147
|
+
const envAppRoot = String(process.env.SILICACLAW_APP_DIR || "").trim();
|
|
148
|
+
if (envAppRoot &&
|
|
149
|
+
(0, fs_1.existsSync)((0, path_1.resolve)(envAppRoot, "apps", "local-console", "package.json")) &&
|
|
150
|
+
(0, fs_1.existsSync)((0, path_1.resolve)(envAppRoot, "package.json"))) {
|
|
151
|
+
return (0, path_1.resolve)(envAppRoot);
|
|
152
|
+
}
|
|
147
153
|
const envRoot = String(process.env.SILICACLAW_WORKSPACE_DIR || "").trim();
|
|
148
154
|
if (envRoot) {
|
|
149
155
|
return (0, path_1.resolve)(envRoot);
|
|
@@ -728,6 +734,8 @@ class LocalNodeService {
|
|
|
728
734
|
webrtcSeedPeers = [];
|
|
729
735
|
webrtcBootstrapHints = [];
|
|
730
736
|
webrtcBootstrapSources = [];
|
|
737
|
+
networkStarted = false;
|
|
738
|
+
networkStartupError = null;
|
|
731
739
|
appVersion = "unknown";
|
|
732
740
|
constructor(options) {
|
|
733
741
|
this.workspaceRoot = options?.workspaceRoot || resolveWorkspaceRoot();
|
|
@@ -772,9 +780,18 @@ class LocalNodeService {
|
|
|
772
780
|
async start() {
|
|
773
781
|
await this.hydrateFromDisk();
|
|
774
782
|
this.bindNetworkSubscriptions();
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
783
|
+
try {
|
|
784
|
+
await this.network.start();
|
|
785
|
+
this.networkStarted = true;
|
|
786
|
+
this.networkStartupError = null;
|
|
787
|
+
await this.log("info", `Local node started (${this.adapterMode}, mode=${this.networkMode}, signaling=${this.webrtcSignalingUrls[0] || "-"}, room=${this.webrtcRoom})`);
|
|
788
|
+
}
|
|
789
|
+
catch (error) {
|
|
790
|
+
this.networkStarted = false;
|
|
791
|
+
this.networkStartupError = error instanceof Error ? error.message : String(error);
|
|
792
|
+
await this.log("warn", `Network start failed (${this.adapterMode}, mode=${this.networkMode}): ${this.networkStartupError}`);
|
|
793
|
+
}
|
|
794
|
+
if (this.networkStarted && this.profile?.public_enabled && this.broadcastEnabled) {
|
|
778
795
|
try {
|
|
779
796
|
await this.broadcastNow("adapter_start");
|
|
780
797
|
}
|
|
@@ -782,14 +799,19 @@ class LocalNodeService {
|
|
|
782
799
|
await this.log("warn", `Initial broadcast failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
783
800
|
}
|
|
784
801
|
}
|
|
785
|
-
this.
|
|
802
|
+
if (this.networkStarted) {
|
|
803
|
+
this.startBroadcastLoop();
|
|
804
|
+
}
|
|
786
805
|
}
|
|
787
806
|
async stop() {
|
|
788
807
|
if (this.broadcaster) {
|
|
789
808
|
clearInterval(this.broadcaster);
|
|
790
809
|
this.broadcaster = null;
|
|
791
810
|
}
|
|
792
|
-
|
|
811
|
+
if (this.networkStarted) {
|
|
812
|
+
await this.network.stop();
|
|
813
|
+
}
|
|
814
|
+
this.networkStarted = false;
|
|
793
815
|
}
|
|
794
816
|
ensureLocalDirectoryBaseline() {
|
|
795
817
|
if (this.profile) {
|
|
@@ -867,6 +889,8 @@ class LocalNodeService {
|
|
|
867
889
|
real_preview_discovery_stats: diagnostics?.discovery_stats ?? null,
|
|
868
890
|
webrtc_preview: relayCapable
|
|
869
891
|
? {
|
|
892
|
+
started: this.networkStarted,
|
|
893
|
+
startup_error: this.networkStartupError,
|
|
870
894
|
signaling_url: network.signaling_url,
|
|
871
895
|
signaling_endpoints: network.signaling_endpoints,
|
|
872
896
|
room: network.room,
|
|
@@ -905,6 +929,8 @@ class LocalNodeService {
|
|
|
905
929
|
adapter_config: diagnostics?.config ?? null,
|
|
906
930
|
adapter_extra: relayCapable
|
|
907
931
|
? {
|
|
932
|
+
started: this.networkStarted,
|
|
933
|
+
startup_error: this.networkStartupError,
|
|
908
934
|
signaling_url: network.signaling_url,
|
|
909
935
|
signaling_endpoints: network.signaling_endpoints,
|
|
910
936
|
room: network.room,
|
|
@@ -946,7 +972,7 @@ class LocalNodeService {
|
|
|
946
972
|
demo_mode: this.adapterMode === "real-preview"
|
|
947
973
|
? "lan-preview"
|
|
948
974
|
: this.adapterMode === "webrtc-preview" || this.adapterMode === "relay-preview"
|
|
949
|
-
? "
|
|
975
|
+
? "global-preview"
|
|
950
976
|
: "local-process",
|
|
951
977
|
mode_explainer: this.getModeExplainer(),
|
|
952
978
|
};
|
|
@@ -982,6 +1008,8 @@ class LocalNodeService {
|
|
|
982
1008
|
adapter_discovery_stats: diagnostics?.discovery_stats ?? null,
|
|
983
1009
|
adapter_diagnostics_summary: relayCapable || diagnostics
|
|
984
1010
|
? {
|
|
1011
|
+
started: this.networkStarted,
|
|
1012
|
+
startup_error: this.networkStartupError,
|
|
985
1013
|
signaling_url: network.signaling_url,
|
|
986
1014
|
signaling_endpoints: network.signaling_endpoints,
|
|
987
1015
|
room: network.room,
|
|
@@ -1030,6 +1058,8 @@ class LocalNodeService {
|
|
|
1030
1058
|
components: diagnostics.components,
|
|
1031
1059
|
limits: diagnostics.limits,
|
|
1032
1060
|
diagnostics_summary: {
|
|
1061
|
+
started: this.networkStarted,
|
|
1062
|
+
startup_error: this.networkStartupError,
|
|
1033
1063
|
signaling_url: network.signaling_url,
|
|
1034
1064
|
signaling_endpoints: network.signaling_endpoints,
|
|
1035
1065
|
room: network.room,
|
|
@@ -1119,9 +1149,10 @@ class LocalNodeService {
|
|
|
1119
1149
|
}
|
|
1120
1150
|
getIntegrationStatus() {
|
|
1121
1151
|
const runtimeGenerated = Boolean(this.socialRuntime && this.socialRuntime.last_loaded_at > 0);
|
|
1122
|
-
const
|
|
1123
|
-
const
|
|
1124
|
-
const
|
|
1152
|
+
const runtimeReady = this.socialFound && runtimeGenerated && !this.socialParseError;
|
|
1153
|
+
const connected = runtimeReady && this.networkStarted;
|
|
1154
|
+
const configured = runtimeReady && this.socialConfig.enabled;
|
|
1155
|
+
const running = configured && this.broadcastEnabled && this.networkStarted;
|
|
1125
1156
|
const publicEnabled = Boolean(this.profile?.public_enabled);
|
|
1126
1157
|
const discoveryEnabled = this.socialConfig.discovery.discoverable &&
|
|
1127
1158
|
this.socialConfig.discovery.allow_profile_broadcast &&
|
|
@@ -1140,9 +1171,11 @@ class LocalNodeService {
|
|
|
1140
1171
|
? "running"
|
|
1141
1172
|
: !configured
|
|
1142
1173
|
? "not configured"
|
|
1143
|
-
:
|
|
1144
|
-
?
|
|
1145
|
-
:
|
|
1174
|
+
: this.networkStartupError
|
|
1175
|
+
? this.networkStartupError
|
|
1176
|
+
: !this.broadcastEnabled
|
|
1177
|
+
? "broadcast paused"
|
|
1178
|
+
: "not running";
|
|
1146
1179
|
const discoverableReason = discoverable
|
|
1147
1180
|
? "discoverable"
|
|
1148
1181
|
: !running
|
|
@@ -2831,7 +2864,6 @@ async function main() {
|
|
|
2831
2864
|
const staticDir = resolveLocalConsoleStaticDir();
|
|
2832
2865
|
const staticIndexFile = (0, path_1.resolve)(staticDir, "index.html");
|
|
2833
2866
|
const node = new LocalNodeService();
|
|
2834
|
-
await node.start();
|
|
2835
2867
|
app.use((0, cors_1.default)({ origin: true }));
|
|
2836
2868
|
app.use(express_1.default.json());
|
|
2837
2869
|
app.get("/api/identity", (_req, res) => {
|
|
@@ -3087,6 +3119,7 @@ async function main() {
|
|
|
3087
3119
|
// eslint-disable-next-line no-console
|
|
3088
3120
|
console.log(`SilicaClaw local-console running: http://localhost:${port}`);
|
|
3089
3121
|
});
|
|
3122
|
+
await node.start();
|
|
3090
3123
|
process.on("SIGINT", async () => {
|
|
3091
3124
|
await node.stop();
|
|
3092
3125
|
process.exit(0);
|
|
@@ -198,6 +198,14 @@ function resolveWorkspaceRoot(cwd = process.cwd()): string {
|
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
function resolveProjectRoot(appRoot: string, cwd = process.cwd()): string {
|
|
201
|
+
const envAppRoot = String(process.env.SILICACLAW_APP_DIR || "").trim();
|
|
202
|
+
if (
|
|
203
|
+
envAppRoot &&
|
|
204
|
+
existsSync(resolve(envAppRoot, "apps", "local-console", "package.json")) &&
|
|
205
|
+
existsSync(resolve(envAppRoot, "package.json"))
|
|
206
|
+
) {
|
|
207
|
+
return resolve(envAppRoot);
|
|
208
|
+
}
|
|
201
209
|
const envRoot = String(process.env.SILICACLAW_WORKSPACE_DIR || "").trim();
|
|
202
210
|
if (envRoot) {
|
|
203
211
|
return resolve(envRoot);
|
|
@@ -943,6 +951,8 @@ export class LocalNodeService {
|
|
|
943
951
|
private webrtcSeedPeers: string[] = [];
|
|
944
952
|
private webrtcBootstrapHints: string[] = [];
|
|
945
953
|
private webrtcBootstrapSources: string[] = [];
|
|
954
|
+
private networkStarted = false;
|
|
955
|
+
private networkStartupError: string | null = null;
|
|
946
956
|
private appVersion = "unknown";
|
|
947
957
|
|
|
948
958
|
constructor(options?: { workspaceRoot?: string; projectRoot?: string; storageRoot?: string }) {
|
|
@@ -993,13 +1003,24 @@ export class LocalNodeService {
|
|
|
993
1003
|
await this.hydrateFromDisk();
|
|
994
1004
|
|
|
995
1005
|
this.bindNetworkSubscriptions();
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1006
|
+
try {
|
|
1007
|
+
await this.network.start();
|
|
1008
|
+
this.networkStarted = true;
|
|
1009
|
+
this.networkStartupError = null;
|
|
1010
|
+
await this.log(
|
|
1011
|
+
"info",
|
|
1012
|
+
`Local node started (${this.adapterMode}, mode=${this.networkMode}, signaling=${this.webrtcSignalingUrls[0] || "-"}, room=${this.webrtcRoom})`
|
|
1013
|
+
);
|
|
1014
|
+
} catch (error) {
|
|
1015
|
+
this.networkStarted = false;
|
|
1016
|
+
this.networkStartupError = error instanceof Error ? error.message : String(error);
|
|
1017
|
+
await this.log(
|
|
1018
|
+
"warn",
|
|
1019
|
+
`Network start failed (${this.adapterMode}, mode=${this.networkMode}): ${this.networkStartupError}`
|
|
1020
|
+
);
|
|
1021
|
+
}
|
|
1001
1022
|
|
|
1002
|
-
if (this.profile?.public_enabled && this.broadcastEnabled) {
|
|
1023
|
+
if (this.networkStarted && this.profile?.public_enabled && this.broadcastEnabled) {
|
|
1003
1024
|
try {
|
|
1004
1025
|
await this.broadcastNow("adapter_start");
|
|
1005
1026
|
} catch (error) {
|
|
@@ -1010,7 +1031,9 @@ export class LocalNodeService {
|
|
|
1010
1031
|
}
|
|
1011
1032
|
}
|
|
1012
1033
|
|
|
1013
|
-
this.
|
|
1034
|
+
if (this.networkStarted) {
|
|
1035
|
+
this.startBroadcastLoop();
|
|
1036
|
+
}
|
|
1014
1037
|
}
|
|
1015
1038
|
|
|
1016
1039
|
async stop(): Promise<void> {
|
|
@@ -1018,7 +1041,10 @@ export class LocalNodeService {
|
|
|
1018
1041
|
clearInterval(this.broadcaster);
|
|
1019
1042
|
this.broadcaster = null;
|
|
1020
1043
|
}
|
|
1021
|
-
|
|
1044
|
+
if (this.networkStarted) {
|
|
1045
|
+
await this.network.stop();
|
|
1046
|
+
}
|
|
1047
|
+
this.networkStarted = false;
|
|
1022
1048
|
}
|
|
1023
1049
|
|
|
1024
1050
|
private ensureLocalDirectoryBaseline(): void {
|
|
@@ -1101,6 +1127,8 @@ export class LocalNodeService {
|
|
|
1101
1127
|
real_preview_discovery_stats: diagnostics?.discovery_stats ?? null,
|
|
1102
1128
|
webrtc_preview: relayCapable
|
|
1103
1129
|
? {
|
|
1130
|
+
started: this.networkStarted,
|
|
1131
|
+
startup_error: this.networkStartupError,
|
|
1104
1132
|
signaling_url: network.signaling_url,
|
|
1105
1133
|
signaling_endpoints: network.signaling_endpoints,
|
|
1106
1134
|
room: network.room,
|
|
@@ -1140,6 +1168,8 @@ export class LocalNodeService {
|
|
|
1140
1168
|
adapter_config: diagnostics?.config ?? null,
|
|
1141
1169
|
adapter_extra: relayCapable
|
|
1142
1170
|
? {
|
|
1171
|
+
started: this.networkStarted,
|
|
1172
|
+
startup_error: this.networkStartupError,
|
|
1143
1173
|
signaling_url: network.signaling_url,
|
|
1144
1174
|
signaling_endpoints: network.signaling_endpoints,
|
|
1145
1175
|
room: network.room,
|
|
@@ -1182,7 +1212,7 @@ export class LocalNodeService {
|
|
|
1182
1212
|
this.adapterMode === "real-preview"
|
|
1183
1213
|
? "lan-preview"
|
|
1184
1214
|
: this.adapterMode === "webrtc-preview" || this.adapterMode === "relay-preview"
|
|
1185
|
-
? "
|
|
1215
|
+
? "global-preview"
|
|
1186
1216
|
: "local-process",
|
|
1187
1217
|
mode_explainer: this.getModeExplainer(),
|
|
1188
1218
|
};
|
|
@@ -1220,6 +1250,8 @@ export class LocalNodeService {
|
|
|
1220
1250
|
adapter_discovery_stats: diagnostics?.discovery_stats ?? null,
|
|
1221
1251
|
adapter_diagnostics_summary: relayCapable || diagnostics
|
|
1222
1252
|
? {
|
|
1253
|
+
started: this.networkStarted,
|
|
1254
|
+
startup_error: this.networkStartupError,
|
|
1223
1255
|
signaling_url: network.signaling_url,
|
|
1224
1256
|
signaling_endpoints: network.signaling_endpoints,
|
|
1225
1257
|
room: network.room,
|
|
@@ -1269,6 +1301,8 @@ export class LocalNodeService {
|
|
|
1269
1301
|
components: diagnostics.components,
|
|
1270
1302
|
limits: diagnostics.limits,
|
|
1271
1303
|
diagnostics_summary: {
|
|
1304
|
+
started: this.networkStarted,
|
|
1305
|
+
startup_error: this.networkStartupError,
|
|
1272
1306
|
signaling_url: network.signaling_url,
|
|
1273
1307
|
signaling_endpoints: network.signaling_endpoints,
|
|
1274
1308
|
room: network.room,
|
|
@@ -1364,9 +1398,10 @@ export class LocalNodeService {
|
|
|
1364
1398
|
|
|
1365
1399
|
getIntegrationStatus(): IntegrationStatusSummary {
|
|
1366
1400
|
const runtimeGenerated = Boolean(this.socialRuntime && this.socialRuntime.last_loaded_at > 0);
|
|
1367
|
-
const
|
|
1368
|
-
const
|
|
1369
|
-
const
|
|
1401
|
+
const runtimeReady = this.socialFound && runtimeGenerated && !this.socialParseError;
|
|
1402
|
+
const connected = runtimeReady && this.networkStarted;
|
|
1403
|
+
const configured = runtimeReady && this.socialConfig.enabled;
|
|
1404
|
+
const running = configured && this.broadcastEnabled && this.networkStarted;
|
|
1370
1405
|
const publicEnabled = Boolean(this.profile?.public_enabled);
|
|
1371
1406
|
const discoveryEnabled =
|
|
1372
1407
|
this.socialConfig.discovery.discoverable &&
|
|
@@ -1388,6 +1423,8 @@ export class LocalNodeService {
|
|
|
1388
1423
|
? "running"
|
|
1389
1424
|
: !configured
|
|
1390
1425
|
? "not configured"
|
|
1426
|
+
: this.networkStartupError
|
|
1427
|
+
? this.networkStartupError
|
|
1391
1428
|
: !this.broadcastEnabled
|
|
1392
1429
|
? "broadcast paused"
|
|
1393
1430
|
: "not running";
|
|
@@ -3282,7 +3319,6 @@ export async function main() {
|
|
|
3282
3319
|
const staticIndexFile = resolve(staticDir, "index.html");
|
|
3283
3320
|
|
|
3284
3321
|
const node = new LocalNodeService();
|
|
3285
|
-
await node.start();
|
|
3286
3322
|
|
|
3287
3323
|
app.use(cors({ origin: true }));
|
|
3288
3324
|
app.use(express.json());
|
|
@@ -3633,6 +3669,8 @@ export async function main() {
|
|
|
3633
3669
|
console.log(`SilicaClaw local-console running: http://localhost:${port}`);
|
|
3634
3670
|
});
|
|
3635
3671
|
|
|
3672
|
+
await node.start();
|
|
3673
|
+
|
|
3636
3674
|
process.on("SIGINT", async () => {
|
|
3637
3675
|
await node.stop();
|
|
3638
3676
|
process.exit(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
2026.3.19-beta.
|
|
1
|
+
2026.3.19-beta.29
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "silicaclaw-broadcast",
|
|
3
|
-
"version": "2026.3.19-beta.
|
|
3
|
+
"version": "2026.3.19-beta.29",
|
|
4
4
|
"display_name": "SilicaClaw Broadcast",
|
|
5
5
|
"description": "OpenClaw skill for reading SilicaClaw public broadcasts, publishing public broadcasts, and forwarding relevant updates to the owner through OpenClaw's native social channel.",
|
|
6
6
|
"entrypoints": {
|
package/package.json
CHANGED
|
@@ -478,10 +478,13 @@ function update() {
|
|
|
478
478
|
if (hasNewTarget) {
|
|
479
479
|
if (npxRuntime) {
|
|
480
480
|
kv("Update", `next run will use ${targetVersion}`);
|
|
481
|
-
} else if (tryGlobalUpgrade(targetVersion)) {
|
|
482
|
-
kv("Update", `installed ${targetVersion}`);
|
|
483
481
|
} else {
|
|
484
|
-
kv("Update", `
|
|
482
|
+
kv("Update", `command now points to ${targetVersion}`);
|
|
483
|
+
if (tryGlobalUpgrade(targetVersion)) {
|
|
484
|
+
kv("Global", `installed ${targetVersion}`);
|
|
485
|
+
} else {
|
|
486
|
+
kv("Global", `install ${targetVersion} manually if needed`);
|
|
487
|
+
}
|
|
485
488
|
}
|
|
486
489
|
}
|
|
487
490
|
|
|
@@ -186,6 +186,8 @@ function syncManagedRuntime() {
|
|
|
186
186
|
"apps/public-explorer/dist",
|
|
187
187
|
"apps/public-explorer/package.json",
|
|
188
188
|
"apps/public-explorer/public",
|
|
189
|
+
"social.md",
|
|
190
|
+
".openclaw",
|
|
189
191
|
"package.json",
|
|
190
192
|
"package-lock.json",
|
|
191
193
|
"VERSION",
|
|
@@ -637,6 +639,20 @@ async function waitForCurrentAppListener(port, kind, timeoutMs = 5000) {
|
|
|
637
639
|
return lastListener;
|
|
638
640
|
}
|
|
639
641
|
|
|
642
|
+
async function waitForLocalConsoleHealth(timeoutMs = 8000) {
|
|
643
|
+
const startedAt = Date.now();
|
|
644
|
+
while (Date.now() - startedAt < timeoutMs) {
|
|
645
|
+
try {
|
|
646
|
+
const response = await fetch(`${LOCAL_CONSOLE_BASE_URL}/api/health`);
|
|
647
|
+
if (response.ok) return true;
|
|
648
|
+
} catch {
|
|
649
|
+
// ignore transient startup failures
|
|
650
|
+
}
|
|
651
|
+
await sleep(250);
|
|
652
|
+
}
|
|
653
|
+
return false;
|
|
654
|
+
}
|
|
655
|
+
|
|
640
656
|
async function waitForPortToClear(port, timeoutMs = 5000) {
|
|
641
657
|
const startedAt = Date.now();
|
|
642
658
|
while (Date.now() - startedAt < timeoutMs) {
|
|
@@ -867,6 +883,7 @@ async function startAll() {
|
|
|
867
883
|
NETWORK_MODE: mode,
|
|
868
884
|
WEBRTC_SIGNALING_URL: signalingUrl,
|
|
869
885
|
WEBRTC_ROOM: room,
|
|
886
|
+
SILICACLAW_APP_DIR: APP_DIR,
|
|
870
887
|
SILICACLAW_WORKSPACE_DIR: WORKSPACE_DIR,
|
|
871
888
|
};
|
|
872
889
|
localPid = spawnBackground(
|
|
@@ -996,7 +1013,8 @@ async function main() {
|
|
|
996
1013
|
if (cmd === "start") {
|
|
997
1014
|
await startAll();
|
|
998
1015
|
const listener = await waitForCurrentAppListener(LOCAL_CONSOLE_PORT, "local-console", 15000);
|
|
999
|
-
|
|
1016
|
+
const healthy = listener ? await waitForLocalConsoleHealth(8000) : false;
|
|
1017
|
+
if (!listener || !isCurrentAppListener(listener, "local-console") || !healthy) {
|
|
1000
1018
|
headline();
|
|
1001
1019
|
console.log("");
|
|
1002
1020
|
kv("Status", paint("failed to start", COLOR.red));
|
|
@@ -1024,7 +1042,8 @@ async function main() {
|
|
|
1024
1042
|
if (cmd === "restart") {
|
|
1025
1043
|
await restartAll();
|
|
1026
1044
|
const listener = await waitForCurrentAppListener(LOCAL_CONSOLE_PORT, "local-console", 15000);
|
|
1027
|
-
|
|
1045
|
+
const healthy = listener ? await waitForLocalConsoleHealth(8000) : false;
|
|
1046
|
+
if (!listener || !isCurrentAppListener(listener, "local-console") || !healthy) {
|
|
1028
1047
|
headline();
|
|
1029
1048
|
console.log("");
|
|
1030
1049
|
kv("Status", paint("failed to restart", COLOR.red));
|