@silicaclaw/cli 2026.3.19-28 → 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 CHANGED
@@ -2,6 +2,12 @@
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
+
5
11
  ### 2026.3.19-28
6
12
 
7
13
  - release build:
package/VERSION CHANGED
@@ -1 +1 @@
1
- v2026.3.19-28
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;
@@ -734,6 +734,8 @@ class LocalNodeService {
734
734
  webrtcSeedPeers = [];
735
735
  webrtcBootstrapHints = [];
736
736
  webrtcBootstrapSources = [];
737
+ networkStarted = false;
738
+ networkStartupError = null;
737
739
  appVersion = "unknown";
738
740
  constructor(options) {
739
741
  this.workspaceRoot = options?.workspaceRoot || resolveWorkspaceRoot();
@@ -778,9 +780,18 @@ class LocalNodeService {
778
780
  async start() {
779
781
  await this.hydrateFromDisk();
780
782
  this.bindNetworkSubscriptions();
781
- await this.network.start();
782
- await this.log("info", `Local node started (${this.adapterMode}, mode=${this.networkMode}, signaling=${this.webrtcSignalingUrls[0] || "-"}, room=${this.webrtcRoom})`);
783
- if (this.profile?.public_enabled && this.broadcastEnabled) {
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) {
784
795
  try {
785
796
  await this.broadcastNow("adapter_start");
786
797
  }
@@ -788,14 +799,19 @@ class LocalNodeService {
788
799
  await this.log("warn", `Initial broadcast failed: ${error instanceof Error ? error.message : String(error)}`);
789
800
  }
790
801
  }
791
- this.startBroadcastLoop();
802
+ if (this.networkStarted) {
803
+ this.startBroadcastLoop();
804
+ }
792
805
  }
793
806
  async stop() {
794
807
  if (this.broadcaster) {
795
808
  clearInterval(this.broadcaster);
796
809
  this.broadcaster = null;
797
810
  }
798
- await this.network.stop();
811
+ if (this.networkStarted) {
812
+ await this.network.stop();
813
+ }
814
+ this.networkStarted = false;
799
815
  }
800
816
  ensureLocalDirectoryBaseline() {
801
817
  if (this.profile) {
@@ -873,6 +889,8 @@ class LocalNodeService {
873
889
  real_preview_discovery_stats: diagnostics?.discovery_stats ?? null,
874
890
  webrtc_preview: relayCapable
875
891
  ? {
892
+ started: this.networkStarted,
893
+ startup_error: this.networkStartupError,
876
894
  signaling_url: network.signaling_url,
877
895
  signaling_endpoints: network.signaling_endpoints,
878
896
  room: network.room,
@@ -911,6 +929,8 @@ class LocalNodeService {
911
929
  adapter_config: diagnostics?.config ?? null,
912
930
  adapter_extra: relayCapable
913
931
  ? {
932
+ started: this.networkStarted,
933
+ startup_error: this.networkStartupError,
914
934
  signaling_url: network.signaling_url,
915
935
  signaling_endpoints: network.signaling_endpoints,
916
936
  room: network.room,
@@ -988,6 +1008,8 @@ class LocalNodeService {
988
1008
  adapter_discovery_stats: diagnostics?.discovery_stats ?? null,
989
1009
  adapter_diagnostics_summary: relayCapable || diagnostics
990
1010
  ? {
1011
+ started: this.networkStarted,
1012
+ startup_error: this.networkStartupError,
991
1013
  signaling_url: network.signaling_url,
992
1014
  signaling_endpoints: network.signaling_endpoints,
993
1015
  room: network.room,
@@ -1036,6 +1058,8 @@ class LocalNodeService {
1036
1058
  components: diagnostics.components,
1037
1059
  limits: diagnostics.limits,
1038
1060
  diagnostics_summary: {
1061
+ started: this.networkStarted,
1062
+ startup_error: this.networkStartupError,
1039
1063
  signaling_url: network.signaling_url,
1040
1064
  signaling_endpoints: network.signaling_endpoints,
1041
1065
  room: network.room,
@@ -1125,9 +1149,10 @@ class LocalNodeService {
1125
1149
  }
1126
1150
  getIntegrationStatus() {
1127
1151
  const runtimeGenerated = Boolean(this.socialRuntime && this.socialRuntime.last_loaded_at > 0);
1128
- const connected = this.socialFound && runtimeGenerated && !this.socialParseError;
1129
- const configured = connected && this.socialConfig.enabled;
1130
- const running = configured && this.broadcastEnabled;
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;
1131
1156
  const publicEnabled = Boolean(this.profile?.public_enabled);
1132
1157
  const discoveryEnabled = this.socialConfig.discovery.discoverable &&
1133
1158
  this.socialConfig.discovery.allow_profile_broadcast &&
@@ -1146,9 +1171,11 @@ class LocalNodeService {
1146
1171
  ? "running"
1147
1172
  : !configured
1148
1173
  ? "not configured"
1149
- : !this.broadcastEnabled
1150
- ? "broadcast paused"
1151
- : "not running";
1174
+ : this.networkStartupError
1175
+ ? this.networkStartupError
1176
+ : !this.broadcastEnabled
1177
+ ? "broadcast paused"
1178
+ : "not running";
1152
1179
  const discoverableReason = discoverable
1153
1180
  ? "discoverable"
1154
1181
  : !running
@@ -2837,7 +2864,6 @@ async function main() {
2837
2864
  const staticDir = resolveLocalConsoleStaticDir();
2838
2865
  const staticIndexFile = (0, path_1.resolve)(staticDir, "index.html");
2839
2866
  const node = new LocalNodeService();
2840
- await node.start();
2841
2867
  app.use((0, cors_1.default)({ origin: true }));
2842
2868
  app.use(express_1.default.json());
2843
2869
  app.get("/api/identity", (_req, res) => {
@@ -3093,6 +3119,7 @@ async function main() {
3093
3119
  // eslint-disable-next-line no-console
3094
3120
  console.log(`SilicaClaw local-console running: http://localhost:${port}`);
3095
3121
  });
3122
+ await node.start();
3096
3123
  process.on("SIGINT", async () => {
3097
3124
  await node.stop();
3098
3125
  process.exit(0);
@@ -951,6 +951,8 @@ export class LocalNodeService {
951
951
  private webrtcSeedPeers: string[] = [];
952
952
  private webrtcBootstrapHints: string[] = [];
953
953
  private webrtcBootstrapSources: string[] = [];
954
+ private networkStarted = false;
955
+ private networkStartupError: string | null = null;
954
956
  private appVersion = "unknown";
955
957
 
956
958
  constructor(options?: { workspaceRoot?: string; projectRoot?: string; storageRoot?: string }) {
@@ -1001,13 +1003,24 @@ export class LocalNodeService {
1001
1003
  await this.hydrateFromDisk();
1002
1004
 
1003
1005
  this.bindNetworkSubscriptions();
1004
- await this.network.start();
1005
- await this.log(
1006
- "info",
1007
- `Local node started (${this.adapterMode}, mode=${this.networkMode}, signaling=${this.webrtcSignalingUrls[0] || "-"}, room=${this.webrtcRoom})`
1008
- );
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
+ }
1009
1022
 
1010
- if (this.profile?.public_enabled && this.broadcastEnabled) {
1023
+ if (this.networkStarted && this.profile?.public_enabled && this.broadcastEnabled) {
1011
1024
  try {
1012
1025
  await this.broadcastNow("adapter_start");
1013
1026
  } catch (error) {
@@ -1018,7 +1031,9 @@ export class LocalNodeService {
1018
1031
  }
1019
1032
  }
1020
1033
 
1021
- this.startBroadcastLoop();
1034
+ if (this.networkStarted) {
1035
+ this.startBroadcastLoop();
1036
+ }
1022
1037
  }
1023
1038
 
1024
1039
  async stop(): Promise<void> {
@@ -1026,7 +1041,10 @@ export class LocalNodeService {
1026
1041
  clearInterval(this.broadcaster);
1027
1042
  this.broadcaster = null;
1028
1043
  }
1029
- await this.network.stop();
1044
+ if (this.networkStarted) {
1045
+ await this.network.stop();
1046
+ }
1047
+ this.networkStarted = false;
1030
1048
  }
1031
1049
 
1032
1050
  private ensureLocalDirectoryBaseline(): void {
@@ -1109,6 +1127,8 @@ export class LocalNodeService {
1109
1127
  real_preview_discovery_stats: diagnostics?.discovery_stats ?? null,
1110
1128
  webrtc_preview: relayCapable
1111
1129
  ? {
1130
+ started: this.networkStarted,
1131
+ startup_error: this.networkStartupError,
1112
1132
  signaling_url: network.signaling_url,
1113
1133
  signaling_endpoints: network.signaling_endpoints,
1114
1134
  room: network.room,
@@ -1148,6 +1168,8 @@ export class LocalNodeService {
1148
1168
  adapter_config: diagnostics?.config ?? null,
1149
1169
  adapter_extra: relayCapable
1150
1170
  ? {
1171
+ started: this.networkStarted,
1172
+ startup_error: this.networkStartupError,
1151
1173
  signaling_url: network.signaling_url,
1152
1174
  signaling_endpoints: network.signaling_endpoints,
1153
1175
  room: network.room,
@@ -1228,6 +1250,8 @@ export class LocalNodeService {
1228
1250
  adapter_discovery_stats: diagnostics?.discovery_stats ?? null,
1229
1251
  adapter_diagnostics_summary: relayCapable || diagnostics
1230
1252
  ? {
1253
+ started: this.networkStarted,
1254
+ startup_error: this.networkStartupError,
1231
1255
  signaling_url: network.signaling_url,
1232
1256
  signaling_endpoints: network.signaling_endpoints,
1233
1257
  room: network.room,
@@ -1277,6 +1301,8 @@ export class LocalNodeService {
1277
1301
  components: diagnostics.components,
1278
1302
  limits: diagnostics.limits,
1279
1303
  diagnostics_summary: {
1304
+ started: this.networkStarted,
1305
+ startup_error: this.networkStartupError,
1280
1306
  signaling_url: network.signaling_url,
1281
1307
  signaling_endpoints: network.signaling_endpoints,
1282
1308
  room: network.room,
@@ -1372,9 +1398,10 @@ export class LocalNodeService {
1372
1398
 
1373
1399
  getIntegrationStatus(): IntegrationStatusSummary {
1374
1400
  const runtimeGenerated = Boolean(this.socialRuntime && this.socialRuntime.last_loaded_at > 0);
1375
- const connected = this.socialFound && runtimeGenerated && !this.socialParseError;
1376
- const configured = connected && this.socialConfig.enabled;
1377
- const running = configured && this.broadcastEnabled;
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;
1378
1405
  const publicEnabled = Boolean(this.profile?.public_enabled);
1379
1406
  const discoveryEnabled =
1380
1407
  this.socialConfig.discovery.discoverable &&
@@ -1396,6 +1423,8 @@ export class LocalNodeService {
1396
1423
  ? "running"
1397
1424
  : !configured
1398
1425
  ? "not configured"
1426
+ : this.networkStartupError
1427
+ ? this.networkStartupError
1399
1428
  : !this.broadcastEnabled
1400
1429
  ? "broadcast paused"
1401
1430
  : "not running";
@@ -3290,7 +3319,6 @@ export async function main() {
3290
3319
  const staticIndexFile = resolve(staticDir, "index.html");
3291
3320
 
3292
3321
  const node = new LocalNodeService();
3293
- await node.start();
3294
3322
 
3295
3323
  app.use(cors({ origin: true }));
3296
3324
  app.use(express.json());
@@ -3641,6 +3669,8 @@ export async function main() {
3641
3669
  console.log(`SilicaClaw local-console running: http://localhost:${port}`);
3642
3670
  });
3643
3671
 
3672
+ await node.start();
3673
+
3644
3674
  process.on("SIGINT", async () => {
3645
3675
  await node.stop();
3646
3676
  process.exit(0);
@@ -1 +1 @@
1
- 2026.3.19-beta.28
1
+ 2026.3.19-beta.29
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "silicaclaw-broadcast",
3
- "version": "2026.3.19-beta.28",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silicaclaw/cli",
3
- "version": "2026.3.19-28",
3
+ "version": "2026.3.19-29",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -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", `install ${targetVersion} manually if needed`);
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
 
@@ -639,6 +639,20 @@ async function waitForCurrentAppListener(port, kind, timeoutMs = 5000) {
639
639
  return lastListener;
640
640
  }
641
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
+
642
656
  async function waitForPortToClear(port, timeoutMs = 5000) {
643
657
  const startedAt = Date.now();
644
658
  while (Date.now() - startedAt < timeoutMs) {
@@ -999,7 +1013,8 @@ async function main() {
999
1013
  if (cmd === "start") {
1000
1014
  await startAll();
1001
1015
  const listener = await waitForCurrentAppListener(LOCAL_CONSOLE_PORT, "local-console", 15000);
1002
- if (!listener || !isCurrentAppListener(listener, "local-console")) {
1016
+ const healthy = listener ? await waitForLocalConsoleHealth(8000) : false;
1017
+ if (!listener || !isCurrentAppListener(listener, "local-console") || !healthy) {
1003
1018
  headline();
1004
1019
  console.log("");
1005
1020
  kv("Status", paint("failed to start", COLOR.red));
@@ -1027,7 +1042,8 @@ async function main() {
1027
1042
  if (cmd === "restart") {
1028
1043
  await restartAll();
1029
1044
  const listener = await waitForCurrentAppListener(LOCAL_CONSOLE_PORT, "local-console", 15000);
1030
- if (!listener || !isCurrentAppListener(listener, "local-console")) {
1045
+ const healthy = listener ? await waitForLocalConsoleHealth(8000) : false;
1046
+ if (!listener || !isCurrentAppListener(listener, "local-console") || !healthy) {
1031
1047
  headline();
1032
1048
  console.log("");
1033
1049
  kv("Status", paint("failed to restart", COLOR.red));