@silicaclaw/cli 2026.3.20-6 → 2026.3.20-7
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 +6 -0
- package/VERSION +1 -1
- package/apps/local-console/dist/apps/local-console/src/server.d.ts +4 -0
- package/apps/local-console/dist/apps/local-console/src/server.js +42 -5
- package/apps/local-console/src/server.ts +45 -5
- package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -1
- package/openclaw-skills/silicaclaw-broadcast/manifest.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## v1.0 beta - 2026-03-20
|
|
4
4
|
|
|
5
|
+
### 2026.3.20-7
|
|
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.20-6
|
|
6
12
|
|
|
7
13
|
- release build:
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v2026.3.20-
|
|
1
|
+
v2026.3.20-7
|
|
@@ -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
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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,
|
|
@@ -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
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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.
|
|
1
|
+
2026.3.20-beta.7
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "silicaclaw-broadcast",
|
|
3
|
-
"version": "2026.3.20-beta.
|
|
3
|
+
"version": "2026.3.20-beta.7",
|
|
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": {
|