@silicaclaw/cli 2026.3.20-6 → 2026.3.20-8

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,18 @@
2
2
 
3
3
  ## v1.0 beta - 2026-03-20
4
4
 
5
+ ### 2026.3.20-8
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.20-7
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.20-6
6
18
 
7
19
  - release build:
package/VERSION CHANGED
@@ -1 +1 @@
1
- v2026.3.20-6
1
+ v2026.3.20-8
@@ -210,11 +210,15 @@ export declare class LocalNodeService {
210
210
  private networkReconnectTimer;
211
211
  private networkReconnectDelayMs;
212
212
  private appVersion;
213
+ private openclawRuntimeCache;
214
+ private openclawBridgeStatusCache;
213
215
  constructor(options?: {
214
216
  workspaceRoot?: string;
215
217
  projectRoot?: string;
216
218
  storageRoot?: string;
217
219
  });
220
+ private getCachedOpenClawRuntime;
221
+ private invalidateOpenClawCaches;
218
222
  start(): Promise<void>;
219
223
  stop(): Promise<void>;
220
224
  private ensureLocalDirectoryBaseline;
@@ -36,6 +36,8 @@ const DEFAULT_GLOBAL_ROOM = silicaclaw_defaults_json_1.default.network.global_pr
36
36
  const DEFAULT_BRIDGE_API_BASE = silicaclaw_defaults_json_1.default.bridge.api_base;
37
37
  const OPENCLAW_GATEWAY_PORT = silicaclaw_defaults_json_1.default.ports.openclaw_gateway;
38
38
  const OPENCLAW_GATEWAY_URL = `http://${OPENCLAW_GATEWAY_HOST}:${OPENCLAW_GATEWAY_PORT}/`;
39
+ const OPENCLAW_RUNTIME_CACHE_MS = 15_000;
40
+ const OPENCLAW_BRIDGE_STATUS_CACHE_MS = 5_000;
39
41
  const NETWORK_PEER_REMOVE_AFTER_MS = Number(process.env.NETWORK_PEER_REMOVE_AFTER_MS || 180_000);
40
42
  const DIRECTORY_REMOTE_PROFILE_SOFT_LIMIT = Number(process.env.DIRECTORY_REMOTE_PROFILE_SOFT_LIMIT || 1000);
41
43
  const NETWORK_UDP_BIND_ADDRESS = process.env.NETWORK_UDP_BIND_ADDRESS || "0.0.0.0";
@@ -142,6 +144,9 @@ function compareVersionTokens(left, right) {
142
144
  function userNpmCacheDir() {
143
145
  return (0, path_1.resolve)((0, os_1.homedir)(), ".silicaclaw", "npm-cache");
144
146
  }
147
+ function userShimPath() {
148
+ return (0, path_1.resolve)((0, os_1.homedir)(), ".silicaclaw", "bin", "silicaclaw");
149
+ }
145
150
  function resolveWorkspaceRoot(cwd = process.cwd()) {
146
151
  if ((0, fs_1.existsSync)((0, path_1.resolve)(cwd, "apps", "local-console", "package.json"))) {
147
152
  return cwd;
@@ -852,6 +857,8 @@ class LocalNodeService {
852
857
  networkReconnectTimer = null;
853
858
  networkReconnectDelayMs = 5_000;
854
859
  appVersion = "unknown";
860
+ openclawRuntimeCache = null;
861
+ openclawBridgeStatusCache = null;
855
862
  constructor(options) {
856
863
  this.workspaceRoot = options?.workspaceRoot || resolveWorkspaceRoot();
857
864
  this.projectRoot = options?.projectRoot || resolveProjectRoot(this.workspaceRoot);
@@ -892,6 +899,22 @@ class LocalNodeService {
892
899
  this.adapterMode = resolved.mode;
893
900
  this.networkPort = resolved.port;
894
901
  }
902
+ getCachedOpenClawRuntime() {
903
+ const now = Date.now();
904
+ if (this.openclawRuntimeCache && this.openclawRuntimeCache.expiresAt > now) {
905
+ return this.openclawRuntimeCache.value;
906
+ }
907
+ const value = detectOpenClawRuntime(this.projectRoot);
908
+ this.openclawRuntimeCache = {
909
+ value,
910
+ expiresAt: now + OPENCLAW_RUNTIME_CACHE_MS,
911
+ };
912
+ return value;
913
+ }
914
+ invalidateOpenClawCaches() {
915
+ this.openclawRuntimeCache = null;
916
+ this.openclawBridgeStatusCache = null;
917
+ }
895
918
  async start() {
896
919
  await this.hydrateFromDisk();
897
920
  this.bindNetworkSubscriptions();
@@ -1284,8 +1307,10 @@ class LocalNodeService {
1284
1307
  reason: status.check_error || "already_current",
1285
1308
  };
1286
1309
  }
1310
+ const shimPath = userShimPath();
1287
1311
  const scriptPath = (0, path_1.resolve)(this.workspaceRoot, "scripts", "silicaclaw-cli.mjs");
1288
- if (!(0, fs_1.existsSync)(scriptPath)) {
1312
+ const useShim = (0, fs_1.existsSync)(shimPath);
1313
+ if (!useShim && !(0, fs_1.existsSync)(scriptPath)) {
1289
1314
  return {
1290
1315
  started: false,
1291
1316
  target_version: status.latest_version,
@@ -1293,7 +1318,9 @@ class LocalNodeService {
1293
1318
  reason: "missing_cli_script",
1294
1319
  };
1295
1320
  }
1296
- const child = (0, child_process_1.spawn)(process.execPath, [scriptPath, "update"], {
1321
+ const command = useShim ? shimPath : process.execPath;
1322
+ const args = useShim ? ["update"] : [scriptPath, "update"];
1323
+ const child = (0, child_process_1.spawn)(command, args, {
1297
1324
  cwd: this.projectRoot,
1298
1325
  detached: true,
1299
1326
  stdio: "ignore",
@@ -1587,9 +1614,13 @@ class LocalNodeService {
1587
1614
  };
1588
1615
  }
1589
1616
  getOpenClawBridgeStatus() {
1617
+ const now = Date.now();
1618
+ if (this.openclawBridgeStatusCache && this.openclawBridgeStatusCache.expiresAt > now) {
1619
+ return this.openclawBridgeStatusCache.value;
1620
+ }
1590
1621
  const integration = this.getIntegrationStatus();
1591
1622
  const openclawInstallation = detectOpenClawInstallation(this.projectRoot);
1592
- const openclawRuntime = detectOpenClawRuntime(this.projectRoot);
1623
+ const openclawRuntime = this.getCachedOpenClawRuntime();
1593
1624
  const skillInstallation = detectOpenClawSkillInstallation();
1594
1625
  const ownerDelivery = detectOwnerDeliveryStatus({
1595
1626
  workspaceRoot: this.projectRoot,
@@ -1597,7 +1628,7 @@ class LocalNodeService {
1597
1628
  openclawRunning: openclawRuntime.running,
1598
1629
  skillInstalled: skillInstallation.installed,
1599
1630
  });
1600
- return {
1631
+ const value = {
1601
1632
  enabled: this.socialConfig.enabled,
1602
1633
  connected_to_silicaclaw: integration.connected_to_silicaclaw,
1603
1634
  public_enabled: integration.public_enabled,
@@ -1653,6 +1684,11 @@ class LocalNodeService {
1653
1684
  install_skill: "/api/openclaw/bridge/skill-install",
1654
1685
  },
1655
1686
  };
1687
+ this.openclawBridgeStatusCache = {
1688
+ value,
1689
+ expiresAt: now + OPENCLAW_BRIDGE_STATUS_CACHE_MS,
1690
+ };
1691
+ return value;
1656
1692
  }
1657
1693
  async installOpenClawSkill(skillName) {
1658
1694
  const scriptPath = (0, path_1.resolve)(this.workspaceRoot, "scripts", "install-openclaw-skill.mjs");
@@ -1666,6 +1702,7 @@ class LocalNodeService {
1666
1702
  maxBuffer: 1024 * 1024,
1667
1703
  });
1668
1704
  const parsed = JSON.parse(String(stdout || "{}"));
1705
+ this.invalidateOpenClawCaches();
1669
1706
  return {
1670
1707
  ...parsed,
1671
1708
  bridge: this.getOpenClawBridgeStatus(),
@@ -1685,7 +1722,7 @@ class LocalNodeService {
1685
1722
  const workspaceSkillDir = (0, path_1.resolve)(homeDir, "workspace", "skills");
1686
1723
  const legacySkillDir = (0, path_1.resolve)(homeDir, "skills");
1687
1724
  const openclawSourceDir = defaultOpenClawSourceDir(this.projectRoot);
1688
- const openclawRuntime = detectOpenClawRuntime(this.projectRoot);
1725
+ const openclawRuntime = this.getCachedOpenClawRuntime();
1689
1726
  return {
1690
1727
  bridge_api_base: DEFAULT_BRIDGE_API_BASE,
1691
1728
  openclaw_detected: detectOpenClawInstallation(this.projectRoot).detected,
@@ -690,7 +690,7 @@ const APP_UPDATE_SESSION_KEY = 'silicaclaw_pending_updated_version';
690
690
  async function refreshActiveView() {
691
691
  const tasks = [refreshPublicProfilePreview(), refreshRelayQueueStatus()];
692
692
  if (activeTab === 'overview') {
693
- tasks.push(refreshOverview(), refreshMessages(), refreshSocial());
693
+ tasks.push(refreshOverview(), refreshMessages());
694
694
  } else if (activeTab === 'agent') {
695
695
  tasks.push(refreshOverview());
696
696
  } else if (activeTab === 'chat') {
@@ -724,19 +724,7 @@ const APP_UPDATE_SESSION_KEY = 'silicaclaw_pending_updated_version';
724
724
  }
725
725
 
726
726
  async function refreshAll() {
727
- const tasks = [refreshOverview(), refreshNetwork(), refreshSocial(), refreshSkills(), refreshPublicProfilePreview(), refreshMessages(), refreshRelayQueueStatus({ force: true })];
728
- if (activeTab === 'network') {
729
- tasks.push(refreshPeers(), refreshDiscovery(), refreshLogs());
730
- }
731
- const shouldRefreshProfile = !(activeTab === 'profile' && profileController.isDirty());
732
- if (shouldRefreshProfile) {
733
- tasks.push(refreshProfile());
734
- }
735
- const results = await Promise.allSettled(tasks);
736
- const firstError = results.find((result) => result.status === 'rejected');
737
- if (firstError && firstError.status === 'rejected') {
738
- setFeedback('networkFeedback', firstError.reason instanceof Error ? firstError.reason.message : t('common.unknownError'), 'error');
739
- }
727
+ await refreshActiveView();
740
728
  }
741
729
 
742
730
  bindAppEvents({
@@ -88,6 +88,8 @@ const DEFAULT_GLOBAL_ROOM = defaults.network.global_preview.room;
88
88
  const DEFAULT_BRIDGE_API_BASE = defaults.bridge.api_base;
89
89
  const OPENCLAW_GATEWAY_PORT = defaults.ports.openclaw_gateway;
90
90
  const OPENCLAW_GATEWAY_URL = `http://${OPENCLAW_GATEWAY_HOST}:${OPENCLAW_GATEWAY_PORT}/`;
91
+ const OPENCLAW_RUNTIME_CACHE_MS = 15_000;
92
+ const OPENCLAW_BRIDGE_STATUS_CACHE_MS = 5_000;
91
93
  const NETWORK_PEER_REMOVE_AFTER_MS = Number(process.env.NETWORK_PEER_REMOVE_AFTER_MS || 180_000);
92
94
  const DIRECTORY_REMOTE_PROFILE_SOFT_LIMIT = Number(process.env.DIRECTORY_REMOTE_PROFILE_SOFT_LIMIT || 1000);
93
95
  const NETWORK_UDP_BIND_ADDRESS = process.env.NETWORK_UDP_BIND_ADDRESS || "0.0.0.0";
@@ -200,6 +202,10 @@ function userNpmCacheDir(): string {
200
202
  return resolve(homedir(), ".silicaclaw", "npm-cache");
201
203
  }
202
204
 
205
+ function userShimPath(): string {
206
+ return resolve(homedir(), ".silicaclaw", "bin", "silicaclaw");
207
+ }
208
+
203
209
  function resolveWorkspaceRoot(cwd = process.cwd()): string {
204
210
  if (existsSync(resolve(cwd, "apps", "local-console", "package.json"))) {
205
211
  return cwd;
@@ -1097,6 +1103,8 @@ export class LocalNodeService {
1097
1103
  private networkReconnectTimer: NodeJS.Timeout | null = null;
1098
1104
  private networkReconnectDelayMs = 5_000;
1099
1105
  private appVersion = "unknown";
1106
+ private openclawRuntimeCache: { value: ReturnType<typeof detectOpenClawRuntime>; expiresAt: number } | null = null;
1107
+ private openclawBridgeStatusCache: { value: OpenClawBridgeStatus; expiresAt: number } | null = null;
1100
1108
 
1101
1109
  constructor(options?: { workspaceRoot?: string; projectRoot?: string; storageRoot?: string }) {
1102
1110
  this.workspaceRoot = options?.workspaceRoot || resolveWorkspaceRoot();
@@ -1142,6 +1150,24 @@ export class LocalNodeService {
1142
1150
  this.networkPort = resolved.port;
1143
1151
  }
1144
1152
 
1153
+ private getCachedOpenClawRuntime() {
1154
+ const now = Date.now();
1155
+ if (this.openclawRuntimeCache && this.openclawRuntimeCache.expiresAt > now) {
1156
+ return this.openclawRuntimeCache.value;
1157
+ }
1158
+ const value = detectOpenClawRuntime(this.projectRoot);
1159
+ this.openclawRuntimeCache = {
1160
+ value,
1161
+ expiresAt: now + OPENCLAW_RUNTIME_CACHE_MS,
1162
+ };
1163
+ return value;
1164
+ }
1165
+
1166
+ private invalidateOpenClawCaches() {
1167
+ this.openclawRuntimeCache = null;
1168
+ this.openclawBridgeStatusCache = null;
1169
+ }
1170
+
1145
1171
  async start(): Promise<void> {
1146
1172
  await this.hydrateFromDisk();
1147
1173
 
@@ -1550,8 +1576,10 @@ export class LocalNodeService {
1550
1576
  reason: status.check_error || "already_current",
1551
1577
  };
1552
1578
  }
1579
+ const shimPath = userShimPath();
1553
1580
  const scriptPath = resolve(this.workspaceRoot, "scripts", "silicaclaw-cli.mjs");
1554
- if (!existsSync(scriptPath)) {
1581
+ const useShim = existsSync(shimPath);
1582
+ if (!useShim && !existsSync(scriptPath)) {
1555
1583
  return {
1556
1584
  started: false,
1557
1585
  target_version: status.latest_version,
@@ -1559,7 +1587,9 @@ export class LocalNodeService {
1559
1587
  reason: "missing_cli_script",
1560
1588
  };
1561
1589
  }
1562
- const child = spawn(process.execPath, [scriptPath, "update"], {
1590
+ const command = useShim ? shimPath : process.execPath;
1591
+ const args = useShim ? ["update"] : [scriptPath, "update"];
1592
+ const child = spawn(command, args, {
1563
1593
  cwd: this.projectRoot,
1564
1594
  detached: true,
1565
1595
  stdio: "ignore",
@@ -1897,9 +1927,13 @@ export class LocalNodeService {
1897
1927
  }
1898
1928
 
1899
1929
  getOpenClawBridgeStatus(): OpenClawBridgeStatus {
1930
+ const now = Date.now();
1931
+ if (this.openclawBridgeStatusCache && this.openclawBridgeStatusCache.expiresAt > now) {
1932
+ return this.openclawBridgeStatusCache.value;
1933
+ }
1900
1934
  const integration = this.getIntegrationStatus();
1901
1935
  const openclawInstallation = detectOpenClawInstallation(this.projectRoot);
1902
- const openclawRuntime = detectOpenClawRuntime(this.projectRoot);
1936
+ const openclawRuntime = this.getCachedOpenClawRuntime();
1903
1937
  const skillInstallation = detectOpenClawSkillInstallation();
1904
1938
  const ownerDelivery = detectOwnerDeliveryStatus({
1905
1939
  workspaceRoot: this.projectRoot,
@@ -1907,7 +1941,7 @@ export class LocalNodeService {
1907
1941
  openclawRunning: openclawRuntime.running,
1908
1942
  skillInstalled: skillInstallation.installed,
1909
1943
  });
1910
- return {
1944
+ const value: OpenClawBridgeStatus = {
1911
1945
  enabled: this.socialConfig.enabled,
1912
1946
  connected_to_silicaclaw: integration.connected_to_silicaclaw,
1913
1947
  public_enabled: integration.public_enabled,
@@ -1963,6 +1997,11 @@ export class LocalNodeService {
1963
1997
  install_skill: "/api/openclaw/bridge/skill-install",
1964
1998
  },
1965
1999
  };
2000
+ this.openclawBridgeStatusCache = {
2001
+ value,
2002
+ expiresAt: now + OPENCLAW_BRIDGE_STATUS_CACHE_MS,
2003
+ };
2004
+ return value;
1966
2005
  }
1967
2006
 
1968
2007
  async installOpenClawSkill(skillName?: string) {
@@ -1977,6 +2016,7 @@ export class LocalNodeService {
1977
2016
  maxBuffer: 1024 * 1024,
1978
2017
  });
1979
2018
  const parsed = JSON.parse(String(stdout || "{}"));
2019
+ this.invalidateOpenClawCaches();
1980
2020
  return {
1981
2021
  ...parsed,
1982
2022
  bridge: this.getOpenClawBridgeStatus(),
@@ -1998,7 +2038,7 @@ export class LocalNodeService {
1998
2038
  const workspaceSkillDir = resolve(homeDir, "workspace", "skills");
1999
2039
  const legacySkillDir = resolve(homeDir, "skills");
2000
2040
  const openclawSourceDir = defaultOpenClawSourceDir(this.projectRoot);
2001
- const openclawRuntime = detectOpenClawRuntime(this.projectRoot);
2041
+ const openclawRuntime = this.getCachedOpenClawRuntime();
2002
2042
 
2003
2043
  return {
2004
2044
  bridge_api_base: DEFAULT_BRIDGE_API_BASE,
@@ -1 +1 @@
1
- 2026.3.20-beta.6
1
+ 2026.3.20-beta.8
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "silicaclaw-broadcast",
3
- "version": "2026.3.20-beta.6",
3
+ "version": "2026.3.20-beta.8",
4
4
  "display_name": "SilicaClaw Broadcast",
5
5
  "description": "Official OpenClaw skill for a bounded local SilicaClaw broadcast workflow: read public broadcasts, publish public broadcasts, and optionally forward owner-relevant summaries through OpenClaw's native channel.",
6
6
  "entrypoints": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silicaclaw/cli",
3
- "version": "2026.3.20-6",
3
+ "version": "2026.3.20-8",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"