@silicaclaw/cli 2026.3.19-15 → 2026.3.19-16

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.
Files changed (195) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/INSTALL.md +44 -11
  3. package/README.md +53 -19
  4. package/VERSION +1 -1
  5. package/apps/local-console/dist/apps/local-console/src/server.d.ts +30 -12
  6. package/apps/local-console/dist/apps/local-console/src/server.js +265 -48
  7. package/apps/local-console/dist/config/silicaclaw-defaults.json +19 -0
  8. package/apps/local-console/dist/packages/core/src/socialConfig.js +9 -5
  9. package/apps/local-console/dist/packages/network/src/realPreview.js +6 -2
  10. package/apps/local-console/dist/packages/network/src/relayPreview.js +8 -2
  11. package/apps/local-console/dist/packages/network/src/transport/udpLanBroadcastTransport.js +2 -1
  12. package/apps/local-console/dist/packages/network/src/webrtcPreview.js +5 -1
  13. package/apps/local-console/dist/packages/storage/src/socialRuntimeRepo.js +8 -4
  14. package/apps/local-console/public/app/app.js +17 -1
  15. package/apps/local-console/public/app/events.js +38 -2
  16. package/apps/local-console/public/app/network.js +32 -3
  17. package/apps/local-console/public/app/overview.js +4 -2
  18. package/apps/local-console/public/app/social.js +175 -26
  19. package/apps/local-console/public/app/styles.css +182 -14
  20. package/apps/local-console/public/app/template.js +70 -30
  21. package/apps/local-console/public/app/translations.js +131 -43
  22. package/apps/local-console/src/server.ts +281 -50
  23. package/apps/public-explorer/dist/apps/public-explorer/src/server.d.ts +1 -0
  24. package/apps/public-explorer/dist/apps/public-explorer/src/server.js +41 -0
  25. package/apps/public-explorer/dist/config/silicaclaw-defaults.json +19 -0
  26. package/apps/public-explorer/public/app/app.js +22 -2
  27. package/apps/public-explorer/public/app/template.js +4 -4
  28. package/apps/public-explorer/public/app/translations.js +15 -15
  29. package/apps/public-explorer/src/server.ts +11 -1
  30. package/docs/NEW_USER_INSTALL.md +14 -10
  31. package/docs/NEW_USER_OPERATIONS.md +3 -3
  32. package/docs/OPENCLAW_BRIDGE.md +15 -0
  33. package/docs/OPENCLAW_BRIDGE_ZH.md +15 -0
  34. package/node_modules/@silicaclaw/core/dist/config/silicaclaw-defaults.json +19 -0
  35. package/node_modules/@silicaclaw/core/dist/packages/core/src/crypto.d.ts +6 -0
  36. package/node_modules/@silicaclaw/core/dist/packages/core/src/crypto.js +50 -0
  37. package/node_modules/@silicaclaw/core/dist/packages/core/src/directory.d.ts +17 -0
  38. package/node_modules/@silicaclaw/core/dist/packages/core/src/directory.js +145 -0
  39. package/node_modules/@silicaclaw/core/dist/packages/core/src/identity.d.ts +2 -0
  40. package/node_modules/@silicaclaw/core/dist/packages/core/src/identity.js +18 -0
  41. package/node_modules/@silicaclaw/core/dist/packages/core/src/index.d.ts +12 -0
  42. package/node_modules/@silicaclaw/core/dist/packages/core/src/index.js +28 -0
  43. package/node_modules/@silicaclaw/core/dist/packages/core/src/indexing.d.ts +6 -0
  44. package/node_modules/@silicaclaw/core/dist/packages/core/src/indexing.js +43 -0
  45. package/node_modules/@silicaclaw/core/dist/packages/core/src/presence.d.ts +4 -0
  46. package/node_modules/@silicaclaw/core/dist/packages/core/src/presence.js +23 -0
  47. package/node_modules/@silicaclaw/core/dist/packages/core/src/profile.d.ts +4 -0
  48. package/node_modules/@silicaclaw/core/dist/packages/core/src/profile.js +39 -0
  49. package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.d.ts +70 -0
  50. package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.js +103 -0
  51. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialConfig.d.ts +100 -0
  52. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialConfig.js +300 -0
  53. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialMessage.d.ts +19 -0
  54. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialMessage.js +69 -0
  55. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialResolver.d.ts +46 -0
  56. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialResolver.js +237 -0
  57. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialTemplate.d.ts +2 -0
  58. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialTemplate.js +90 -0
  59. package/node_modules/@silicaclaw/core/dist/packages/core/src/types.d.ts +59 -0
  60. package/node_modules/@silicaclaw/core/dist/packages/core/src/types.js +2 -0
  61. package/node_modules/@silicaclaw/core/src/socialConfig.ts +7 -5
  62. package/node_modules/@silicaclaw/network/dist/config/silicaclaw-defaults.json +19 -0
  63. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/messageEnvelope.d.ts +28 -0
  64. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/messageEnvelope.js +36 -0
  65. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/peerDiscovery.d.ts +43 -0
  66. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/peerDiscovery.js +2 -0
  67. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/topicCodec.d.ts +4 -0
  68. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/topicCodec.js +2 -0
  69. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/transport.d.ts +36 -0
  70. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/transport.js +2 -0
  71. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.d.ts +5 -0
  72. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.js +24 -0
  73. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonTopicCodec.d.ts +5 -0
  74. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonTopicCodec.js +12 -0
  75. package/node_modules/@silicaclaw/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.d.ts +28 -0
  76. package/node_modules/@silicaclaw/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.js +144 -0
  77. package/node_modules/@silicaclaw/network/dist/packages/network/src/index.d.ts +14 -0
  78. package/node_modules/@silicaclaw/network/dist/packages/network/src/index.js +30 -0
  79. package/node_modules/@silicaclaw/network/dist/packages/network/src/localEventBus.d.ts +9 -0
  80. package/node_modules/@silicaclaw/network/dist/packages/network/src/localEventBus.js +47 -0
  81. package/node_modules/@silicaclaw/network/dist/packages/network/src/mock.d.ts +8 -0
  82. package/node_modules/@silicaclaw/network/dist/packages/network/src/mock.js +24 -0
  83. package/node_modules/@silicaclaw/network/dist/packages/network/src/realPreview.d.ts +105 -0
  84. package/node_modules/@silicaclaw/network/dist/packages/network/src/realPreview.js +331 -0
  85. package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.d.ts +166 -0
  86. package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.js +448 -0
  87. package/node_modules/@silicaclaw/network/dist/packages/network/src/transport/udpLanBroadcastTransport.d.ts +23 -0
  88. package/node_modules/@silicaclaw/network/dist/packages/network/src/transport/udpLanBroadcastTransport.js +154 -0
  89. package/node_modules/@silicaclaw/network/dist/packages/network/src/types.d.ts +6 -0
  90. package/node_modules/@silicaclaw/network/dist/packages/network/src/types.js +2 -0
  91. package/node_modules/@silicaclaw/network/dist/packages/network/src/webrtcPreview.d.ts +163 -0
  92. package/node_modules/@silicaclaw/network/dist/packages/network/src/webrtcPreview.js +848 -0
  93. package/node_modules/@silicaclaw/network/src/realPreview.ts +3 -2
  94. package/node_modules/@silicaclaw/network/src/relayPreview.ts +5 -2
  95. package/node_modules/@silicaclaw/network/src/transport/udpLanBroadcastTransport.ts +2 -1
  96. package/node_modules/@silicaclaw/network/src/webrtcPreview.ts +2 -1
  97. package/node_modules/@silicaclaw/storage/dist/socialRuntimeRepo.js +8 -4
  98. package/node_modules/@silicaclaw/storage/src/socialRuntimeRepo.ts +5 -4
  99. package/openclaw-skills/silicaclaw-bridge-setup/SKILL.md +147 -0
  100. package/openclaw-skills/silicaclaw-bridge-setup/VERSION +1 -0
  101. package/openclaw-skills/silicaclaw-bridge-setup/agents/openai.yaml +6 -0
  102. package/openclaw-skills/silicaclaw-bridge-setup/manifest.json +27 -0
  103. package/openclaw-skills/silicaclaw-bridge-setup/references/owner-dialogue-cheatsheet-zh.md +58 -0
  104. package/openclaw-skills/silicaclaw-bridge-setup/references/runtime-setup.md +43 -0
  105. package/openclaw-skills/silicaclaw-bridge-setup/references/troubleshooting.md +24 -0
  106. package/openclaw-skills/silicaclaw-broadcast/SKILL.md +132 -0
  107. package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -1
  108. package/openclaw-skills/silicaclaw-broadcast/agents/openai.yaml +2 -2
  109. package/openclaw-skills/silicaclaw-broadcast/manifest.json +3 -2
  110. package/openclaw-skills/silicaclaw-broadcast/references/owner-dialogue-cheatsheet-zh.md +81 -0
  111. package/openclaw-skills/silicaclaw-owner-push/SKILL.md +217 -0
  112. package/openclaw-skills/silicaclaw-owner-push/VERSION +1 -0
  113. package/openclaw-skills/silicaclaw-owner-push/agents/openai.yaml +6 -0
  114. package/openclaw-skills/silicaclaw-owner-push/manifest.json +30 -0
  115. package/openclaw-skills/silicaclaw-owner-push/references/owner-dialogue-cheatsheet-zh.md +87 -0
  116. package/openclaw-skills/silicaclaw-owner-push/references/push-routing-policy.md +43 -0
  117. package/openclaw-skills/silicaclaw-owner-push/references/runtime-setup.md +41 -0
  118. package/openclaw-skills/silicaclaw-owner-push/scripts/owner-push-forwarder.mjs +214 -0
  119. package/openclaw-skills/silicaclaw-owner-push/scripts/send-to-owner-via-openclaw.mjs +69 -0
  120. package/package.json +1 -1
  121. package/packages/core/dist/config/silicaclaw-defaults.json +19 -0
  122. package/packages/core/dist/packages/core/src/crypto.d.ts +6 -0
  123. package/packages/core/dist/packages/core/src/crypto.js +50 -0
  124. package/packages/core/dist/packages/core/src/directory.d.ts +17 -0
  125. package/packages/core/dist/packages/core/src/directory.js +145 -0
  126. package/packages/core/dist/packages/core/src/identity.d.ts +2 -0
  127. package/packages/core/dist/packages/core/src/identity.js +18 -0
  128. package/packages/core/dist/packages/core/src/index.d.ts +12 -0
  129. package/packages/core/dist/packages/core/src/index.js +28 -0
  130. package/packages/core/dist/packages/core/src/indexing.d.ts +6 -0
  131. package/packages/core/dist/packages/core/src/indexing.js +43 -0
  132. package/packages/core/dist/packages/core/src/presence.d.ts +4 -0
  133. package/packages/core/dist/packages/core/src/presence.js +23 -0
  134. package/packages/core/dist/packages/core/src/profile.d.ts +4 -0
  135. package/packages/core/dist/packages/core/src/profile.js +39 -0
  136. package/packages/core/dist/packages/core/src/publicProfileSummary.d.ts +70 -0
  137. package/packages/core/dist/packages/core/src/publicProfileSummary.js +103 -0
  138. package/packages/core/dist/packages/core/src/socialConfig.d.ts +100 -0
  139. package/packages/core/dist/packages/core/src/socialConfig.js +300 -0
  140. package/packages/core/dist/packages/core/src/socialMessage.d.ts +19 -0
  141. package/packages/core/dist/packages/core/src/socialMessage.js +69 -0
  142. package/packages/core/dist/packages/core/src/socialResolver.d.ts +46 -0
  143. package/packages/core/dist/packages/core/src/socialResolver.js +237 -0
  144. package/packages/core/dist/packages/core/src/socialTemplate.d.ts +2 -0
  145. package/packages/core/dist/packages/core/src/socialTemplate.js +90 -0
  146. package/packages/core/dist/packages/core/src/types.d.ts +59 -0
  147. package/packages/core/dist/packages/core/src/types.js +2 -0
  148. package/packages/core/src/socialConfig.ts +7 -5
  149. package/packages/network/dist/config/silicaclaw-defaults.json +19 -0
  150. package/packages/network/dist/packages/network/src/abstractions/messageEnvelope.d.ts +28 -0
  151. package/packages/network/dist/packages/network/src/abstractions/messageEnvelope.js +36 -0
  152. package/packages/network/dist/packages/network/src/abstractions/peerDiscovery.d.ts +43 -0
  153. package/packages/network/dist/packages/network/src/abstractions/peerDiscovery.js +2 -0
  154. package/packages/network/dist/packages/network/src/abstractions/topicCodec.d.ts +4 -0
  155. package/packages/network/dist/packages/network/src/abstractions/topicCodec.js +2 -0
  156. package/packages/network/dist/packages/network/src/abstractions/transport.d.ts +36 -0
  157. package/packages/network/dist/packages/network/src/abstractions/transport.js +2 -0
  158. package/packages/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.d.ts +5 -0
  159. package/packages/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.js +24 -0
  160. package/packages/network/dist/packages/network/src/codec/jsonTopicCodec.d.ts +5 -0
  161. package/packages/network/dist/packages/network/src/codec/jsonTopicCodec.js +12 -0
  162. package/packages/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.d.ts +28 -0
  163. package/packages/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.js +144 -0
  164. package/packages/network/dist/packages/network/src/index.d.ts +14 -0
  165. package/packages/network/dist/packages/network/src/index.js +30 -0
  166. package/packages/network/dist/packages/network/src/localEventBus.d.ts +9 -0
  167. package/packages/network/dist/packages/network/src/localEventBus.js +47 -0
  168. package/packages/network/dist/packages/network/src/mock.d.ts +8 -0
  169. package/packages/network/dist/packages/network/src/mock.js +24 -0
  170. package/packages/network/dist/packages/network/src/realPreview.d.ts +105 -0
  171. package/packages/network/dist/packages/network/src/realPreview.js +331 -0
  172. package/packages/network/dist/packages/network/src/relayPreview.d.ts +166 -0
  173. package/packages/network/dist/packages/network/src/relayPreview.js +448 -0
  174. package/packages/network/dist/packages/network/src/transport/udpLanBroadcastTransport.d.ts +23 -0
  175. package/packages/network/dist/packages/network/src/transport/udpLanBroadcastTransport.js +154 -0
  176. package/packages/network/dist/packages/network/src/types.d.ts +6 -0
  177. package/packages/network/dist/packages/network/src/types.js +2 -0
  178. package/packages/network/dist/packages/network/src/webrtcPreview.d.ts +163 -0
  179. package/packages/network/dist/packages/network/src/webrtcPreview.js +848 -0
  180. package/packages/network/src/realPreview.ts +3 -2
  181. package/packages/network/src/relayPreview.ts +5 -2
  182. package/packages/network/src/transport/udpLanBroadcastTransport.ts +2 -1
  183. package/packages/network/src/webrtcPreview.ts +2 -1
  184. package/packages/storage/dist/socialRuntimeRepo.js +8 -4
  185. package/packages/storage/src/socialRuntimeRepo.ts +5 -4
  186. package/scripts/functional-check.mjs +35 -6
  187. package/scripts/install-openclaw-skill.mjs +9 -2
  188. package/scripts/openclaw-bridge-adapter.mjs +3 -1
  189. package/scripts/openclaw-bridge-client.mjs +3 -1
  190. package/scripts/openclaw-runtime-demo.mjs +3 -1
  191. package/scripts/quickstart.sh +13 -9
  192. package/scripts/release-pack.mjs +13 -1
  193. package/scripts/silicaclaw-cli.mjs +23 -18
  194. package/scripts/silicaclaw-gateway.mjs +33 -27
  195. package/scripts/validate-openclaw-skill.mjs +79 -21
@@ -5,10 +5,16 @@ import { existsSync, mkdirSync, openSync, readFileSync, rmSync, writeFileSync }
5
5
  import { homedir } from "node:os";
6
6
  import { dirname, join, resolve } from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
+ import defaults from "../config/silicaclaw-defaults.json" with { type: "json" };
8
9
 
9
10
  const __filename = fileURLToPath(import.meta.url);
10
11
  const __dirname = dirname(__filename);
11
12
  const ROOT_DIR = resolve(__dirname, "..");
13
+ const LOCAL_CONSOLE_PORT = defaults.ports.local_console;
14
+ const DEFAULT_NETWORK_MODE = defaults.network.default_mode;
15
+ const DEFAULT_SIGNALING_URL = defaults.network.global_preview.relay_url;
16
+ const DEFAULT_ROOM = defaults.network.global_preview.room;
17
+ const LOCAL_CONSOLE_BASE_URL = defaults.bridge.api_base;
12
18
 
13
19
  const argv = process.argv.slice(2);
14
20
  const cmd = String(argv[0] || "help").toLowerCase();
@@ -364,7 +370,7 @@ function launchdStatusPayload() {
364
370
  const state = readState();
365
371
  const localRuntime = readLaunchAgentRuntime(LOCAL_CONSOLE_LABEL);
366
372
  const signalingRuntime = readLaunchAgentRuntime(SIGNALING_LABEL);
367
- const localListener = listeningProcessOnPort(4310);
373
+ const localListener = listeningProcessOnPort(LOCAL_CONSOLE_PORT);
368
374
  const signalingListener = listeningProcessOnPort(4510);
369
375
  return {
370
376
  app_dir: APP_DIR,
@@ -399,7 +405,7 @@ function buildStatusPayload() {
399
405
  const localPid = readPid(CONSOLE_PID_FILE);
400
406
  const sigPid = readPid(SIGNALING_PID_FILE);
401
407
  const state = readState();
402
- const localListener = listeningProcessOnPort(4310);
408
+ const localListener = listeningProcessOnPort(LOCAL_CONSOLE_PORT);
403
409
  const signalingListener = listeningProcessOnPort(4510);
404
410
  return {
405
411
  app_dir: APP_DIR,
@@ -437,10 +443,10 @@ function showStatusHuman() {
437
443
  : `${paint("stopped", COLOR.dim)} · ${payload.mode}`
438
444
  );
439
445
  if (payload.mode === "global-preview") {
440
- kv("Relay", payload.signaling.url || "https://relay.silicaclaw.com");
441
- kv("Room", payload.signaling.room || "silicaclaw-global-preview");
446
+ kv("Relay", payload.signaling.url || DEFAULT_SIGNALING_URL);
447
+ kv("Room", payload.signaling.room || DEFAULT_ROOM);
442
448
  }
443
- if (payload.local_console.running) kv("Open", "http://localhost:4310");
449
+ if (payload.local_console.running) kv("Open", LOCAL_CONSOLE_BASE_URL);
444
450
  return payload;
445
451
  }
446
452
 
@@ -449,10 +455,10 @@ function printConnectionSummary(status, verb = "Started") {
449
455
  headline();
450
456
  console.log("");
451
457
  kv("Status", `${verb.toLowerCase()} · ${status.mode}`);
452
- kv("Console", `http://localhost:4310`);
458
+ kv("Console", LOCAL_CONSOLE_BASE_URL);
453
459
  if (status.mode === "global-preview") {
454
- const signalingUrl = status?.signaling?.url || "https://relay.silicaclaw.com";
455
- const room = status?.signaling?.room || "silicaclaw-global-preview";
460
+ const signalingUrl = status?.signaling?.url || DEFAULT_SIGNALING_URL;
461
+ const room = status?.signaling?.room || DEFAULT_ROOM;
456
462
  kv("Relay", signalingUrl);
457
463
  kv("Room", room);
458
464
  }
@@ -601,7 +607,7 @@ async function drainOwnedListener(port, kind, timeoutMs = 5000) {
601
607
  }
602
608
 
603
609
  function printStopSummary() {
604
- const localListener = listeningProcessOnPort(4310);
610
+ const localListener = listeningProcessOnPort(LOCAL_CONSOLE_PORT);
605
611
  const signalingListener = listeningProcessOnPort(4510);
606
612
  headline();
607
613
  console.log("");
@@ -611,9 +617,9 @@ function printStopSummary() {
611
617
  } else {
612
618
  kv("Console", `${paint("still busy", COLOR.yellow)} (pid=${localListener.pid})`);
613
619
  if (isOwnedListener(localListener, "local-console")) {
614
- kv("Hint", "an older SilicaClaw local-console process is still holding port 4310");
620
+ kv("Hint", `an older SilicaClaw local-console process is still holding port ${LOCAL_CONSOLE_PORT}`);
615
621
  }
616
- kv("Inspect", "lsof -nP -iTCP:4310 -sTCP:LISTEN");
622
+ kv("Inspect", `lsof -nP -iTCP:${LOCAL_CONSOLE_PORT} -sTCP:LISTEN`);
617
623
  kv("Stop pid", `kill ${localListener.pid}`);
618
624
  }
619
625
  if (!signalingListener) {
@@ -645,7 +651,7 @@ async function stopAll() {
645
651
  if (isLaunchdPlatform()) {
646
652
  stopLaunchAgent(LOCAL_CONSOLE_LABEL);
647
653
  stopLaunchAgent(SIGNALING_LABEL);
648
- await drainOwnedListener(4310, "local-console", 8000);
654
+ await drainOwnedListener(LOCAL_CONSOLE_PORT, "local-console", 8000);
649
655
  await drainOwnedListener(4510, "signaling", 5000);
650
656
  removeFileIfExists(CONSOLE_PID_FILE);
651
657
  removeFileIfExists(SIGNALING_PID_FILE);
@@ -659,7 +665,7 @@ async function stopAll() {
659
665
  const sigPid = readPid(SIGNALING_PID_FILE);
660
666
  await stopPid(localPid, "local-console");
661
667
  await stopPid(sigPid, "signaling");
662
- await drainOwnedListener(4310, "local-console", 5000);
668
+ await drainOwnedListener(LOCAL_CONSOLE_PORT, "local-console", 5000);
663
669
  await drainOwnedListener(4510, "signaling", 5000);
664
670
  removeFileIfExists(CONSOLE_PID_FILE);
665
671
  removeFileIfExists(SIGNALING_PID_FILE);
@@ -672,10 +678,10 @@ async function stopAll() {
672
678
  async function startAll() {
673
679
  ensureStateDir();
674
680
 
675
- const mode = parseMode(parseFlag("mode", process.env.NETWORK_MODE || "global-preview"));
681
+ const mode = parseMode(parseFlag("mode", process.env.NETWORK_MODE || DEFAULT_NETWORK_MODE));
676
682
  const adapter = adapterForMode(mode);
677
- const signalingUrl = parseFlag("signaling-url", process.env.WEBRTC_SIGNALING_URL || "https://relay.silicaclaw.com");
678
- const room = parseFlag("room", process.env.WEBRTC_ROOM || "silicaclaw-global-preview");
683
+ const signalingUrl = parseFlag("signaling-url", process.env.WEBRTC_SIGNALING_URL || DEFAULT_SIGNALING_URL);
684
+ const room = parseFlag("room", process.env.WEBRTC_ROOM || DEFAULT_ROOM);
679
685
  const shouldDisableSignaling = hasFlag("no-signaling");
680
686
 
681
687
  const { host, port } = parseUrlHostPort(signalingUrl);
@@ -687,7 +693,7 @@ async function startAll() {
687
693
  if (isLaunchdPlatform()) {
688
694
  const npmPath = resolveCommandPath("npm");
689
695
  const signalingEntry = resolve(APP_DIR, "scripts", "webrtc-signaling-server.mjs");
690
- await drainOwnedListener(4310, "local-console", 8000);
696
+ await drainOwnedListener(LOCAL_CONSOLE_PORT, "local-console", 8000);
691
697
  await drainOwnedListener(4510, "signaling", 5000);
692
698
  const baseEnv = {
693
699
  NETWORK_ADAPTER: adapter,
@@ -737,7 +743,7 @@ async function startAll() {
737
743
 
738
744
  const currentLocalPid = readPid(CONSOLE_PID_FILE);
739
745
  const currentSigPid = readPid(SIGNALING_PID_FILE);
740
- const currentListener = listeningProcessOnPort(4310);
746
+ const currentListener = listeningProcessOnPort(LOCAL_CONSOLE_PORT);
741
747
  if (currentListener && isOwnedListener(currentListener, "local-console") && !isRunning(currentLocalPid)) {
742
748
  writeFileSync(CONSOLE_PID_FILE, String(currentListener.pid));
743
749
  }
@@ -745,10 +751,10 @@ async function startAll() {
745
751
  let localPid = readPid(CONSOLE_PID_FILE);
746
752
  if (!isRunning(localPid)) {
747
753
  removeFileIfExists(CONSOLE_PID_FILE);
748
- await drainOwnedListener(4310, "local-console", 8000);
749
- const remainingLocalListener = listeningProcessOnPort(4310);
754
+ await drainOwnedListener(LOCAL_CONSOLE_PORT, "local-console", 8000);
755
+ const remainingLocalListener = listeningProcessOnPort(LOCAL_CONSOLE_PORT);
750
756
  if (remainingLocalListener) {
751
- throw new Error(`port 4310 is occupied by pid=${remainingLocalListener.pid}`);
757
+ throw new Error(`port ${LOCAL_CONSOLE_PORT} is occupied by pid=${remainingLocalListener.pid}`);
752
758
  }
753
759
  const env = {
754
760
  NETWORK_ADAPTER: adapter,
@@ -808,14 +814,14 @@ async function main() {
808
814
  }
809
815
  if (cmd === "start") {
810
816
  await startAll();
811
- const listener = await waitForCurrentAppListener(4310, "local-console", 15000);
817
+ const listener = await waitForCurrentAppListener(LOCAL_CONSOLE_PORT, "local-console", 15000);
812
818
  if (!listener || !isCurrentAppListener(listener, "local-console")) {
813
819
  headline();
814
820
  console.log("");
815
821
  kv("Status", paint("failed to start", COLOR.red));
816
822
  if (listener) {
817
- kv("Conflict", `port 4310 is occupied by pid=${listener.pid}`);
818
- kv("Inspect", "lsof -nP -iTCP:4310 -sTCP:LISTEN");
823
+ kv("Conflict", `port ${LOCAL_CONSOLE_PORT} is occupied by pid=${listener.pid}`);
824
+ kv("Inspect", `lsof -nP -iTCP:${LOCAL_CONSOLE_PORT} -sTCP:LISTEN`);
819
825
  }
820
826
  const recent = tailText(CONSOLE_LOG_FILE, 18);
821
827
  if (recent) {
@@ -837,14 +843,14 @@ async function main() {
837
843
  if (cmd === "restart") {
838
844
  await stopAll();
839
845
  await startAll();
840
- const listener = await waitForCurrentAppListener(4310, "local-console", 15000);
846
+ const listener = await waitForCurrentAppListener(LOCAL_CONSOLE_PORT, "local-console", 15000);
841
847
  if (!listener || !isCurrentAppListener(listener, "local-console")) {
842
848
  headline();
843
849
  console.log("");
844
850
  kv("Status", paint("failed to restart", COLOR.red));
845
851
  if (listener) {
846
- kv("Conflict", `port 4310 is occupied by pid=${listener.pid}`);
847
- kv("Inspect", "lsof -nP -iTCP:4310 -sTCP:LISTEN");
852
+ kv("Conflict", `port ${LOCAL_CONSOLE_PORT} is occupied by pid=${listener.pid}`);
853
+ kv("Inspect", `lsof -nP -iTCP:${LOCAL_CONSOLE_PORT} -sTCP:LISTEN`);
848
854
  }
849
855
  const recent = tailText(CONSOLE_LOG_FILE, 18);
850
856
  if (recent) {
@@ -27,15 +27,84 @@ function main() {
27
27
  const versionFile = resolve(skillDir, "VERSION");
28
28
  const manifestFile = resolve(skillDir, "manifest.json");
29
29
  const agentYaml = resolve(skillDir, "agents", "openai.yaml");
30
- const clientFile = resolve(skillDir, "scripts", "bridge-client.mjs");
31
- const ownerForwarderDemoFile = resolve(skillDir, "scripts", "owner-forwarder-demo.mjs");
32
- const ownerDispatchAdapterDemoFile = resolve(skillDir, "scripts", "owner-dispatch-adapter-demo.mjs");
33
- const ownerSendViaOpenClawFile = resolve(skillDir, "scripts", "send-to-owner-via-openclaw.mjs");
34
- const ownerPolicyFile = resolve(skillDir, "references", "owner-forwarding-policy.md");
35
- const ownerDispatchAdapterRefFile = resolve(skillDir, "references", "owner-dispatch-adapter.md");
36
- const computerControlRefFile = resolve(skillDir, "references", "computer-control-via-openclaw.md");
30
+ const profile = {
31
+ "silicaclaw-broadcast": {
32
+ requiredFiles: [
33
+ resolve(skillDir, "scripts", "bridge-client.mjs"),
34
+ resolve(skillDir, "scripts", "owner-forwarder-demo.mjs"),
35
+ resolve(skillDir, "scripts", "owner-dispatch-adapter-demo.mjs"),
36
+ resolve(skillDir, "scripts", "send-to-owner-via-openclaw.mjs"),
37
+ resolve(skillDir, "references", "owner-forwarding-policy.md"),
38
+ resolve(skillDir, "references", "owner-dispatch-adapter.md"),
39
+ resolve(skillDir, "references", "computer-control-via-openclaw.md"),
40
+ resolve(skillDir, "references", "owner-dialogue-cheatsheet-zh.md"),
41
+ ],
42
+ uiDisplayName: 'display_name: "SilicaClaw Broadcast"',
43
+ checks(manifest, files) {
44
+ const ownerPolicy = readFileSync(files[4], "utf8");
45
+ const ownerDispatchAdapterRef = readFileSync(files[5], "utf8");
46
+ const computerControlRef = readFileSync(files[6], "utf8");
47
+ const dialogueCheatsheetZh = readFileSync(files[7], "utf8");
48
+ assert(String(manifest.entrypoints?.owner_forwarder_demo || "") === "scripts/owner-forwarder-demo.mjs", "manifest owner forwarder demo entrypoint mismatch");
49
+ assert(String(manifest.entrypoints?.owner_dispatch_adapter_demo || "") === "scripts/owner-dispatch-adapter-demo.mjs", "manifest owner dispatch adapter demo entrypoint mismatch");
50
+ assert(String(manifest.entrypoints?.owner_send_via_openclaw || "") === "scripts/send-to-owner-via-openclaw.mjs", "manifest owner send via openclaw entrypoint mismatch");
51
+ assert(String(manifest.references?.owner_forwarding_policy || "") === "references/owner-forwarding-policy.md", "manifest owner forwarding reference mismatch");
52
+ assert(String(manifest.references?.owner_dispatch_adapter || "") === "references/owner-dispatch-adapter.md", "manifest owner dispatch adapter reference mismatch");
53
+ assert(String(manifest.references?.computer_control_via_openclaw || "") === "references/computer-control-via-openclaw.md", "manifest computer control reference mismatch");
54
+ assert(String(manifest.references?.owner_dialogue_cheatsheet_zh || "") === "references/owner-dialogue-cheatsheet-zh.md", "manifest owner dialogue cheatsheet zh reference mismatch");
55
+ assert(ownerPolicy.includes("Default routing modes"), "owner forwarding policy content mismatch");
56
+ assert(ownerDispatchAdapterRef.includes("OPENCLAW_OWNER_FORWARD_CMD"), "owner dispatch adapter reference content mismatch");
57
+ assert(computerControlRef.includes("node.invoke"), "computer control reference content mismatch");
58
+ assert(dialogueCheatsheetZh.includes("主人对话速查表"), "owner dialogue cheatsheet zh content mismatch");
59
+ },
60
+ },
61
+ "silicaclaw-owner-push": {
62
+ requiredFiles: [
63
+ resolve(skillDir, "scripts", "owner-push-forwarder.mjs"),
64
+ resolve(skillDir, "scripts", "send-to-owner-via-openclaw.mjs"),
65
+ resolve(skillDir, "references", "push-routing-policy.md"),
66
+ resolve(skillDir, "references", "runtime-setup.md"),
67
+ resolve(skillDir, "references", "owner-dialogue-cheatsheet-zh.md"),
68
+ ],
69
+ uiDisplayName: 'display_name: "SilicaClaw Owner Push"',
70
+ checks(manifest, files) {
71
+ const pushRouting = readFileSync(files[2], "utf8");
72
+ const runtimeSetup = readFileSync(files[3], "utf8");
73
+ const dialogueCheatsheetZh = readFileSync(files[4], "utf8");
74
+ assert(String(manifest.entrypoints?.owner_push_forwarder || "") === "scripts/owner-push-forwarder.mjs", "manifest owner push forwarder entrypoint mismatch");
75
+ assert(String(manifest.entrypoints?.owner_send_via_openclaw || "") === "scripts/send-to-owner-via-openclaw.mjs", "manifest owner send via openclaw entrypoint mismatch");
76
+ assert(String(manifest.references?.push_routing_policy || "") === "references/push-routing-policy.md", "manifest push routing policy reference mismatch");
77
+ assert(String(manifest.references?.runtime_setup || "") === "references/runtime-setup.md", "manifest runtime setup reference mismatch");
78
+ assert(String(manifest.references?.owner_dialogue_cheatsheet_zh || "") === "references/owner-dialogue-cheatsheet-zh.md", "manifest owner dialogue cheatsheet zh reference mismatch");
79
+ assert(pushRouting.includes("Default routes"), "push routing policy content mismatch");
80
+ assert(runtimeSetup.includes("Minimum setup"), "runtime setup content mismatch");
81
+ assert(dialogueCheatsheetZh.includes("主人对话速查表"), "owner dialogue cheatsheet zh content mismatch");
82
+ },
83
+ },
84
+ "silicaclaw-bridge-setup": {
85
+ requiredFiles: [
86
+ resolve(skillDir, "references", "runtime-setup.md"),
87
+ resolve(skillDir, "references", "troubleshooting.md"),
88
+ resolve(skillDir, "references", "owner-dialogue-cheatsheet-zh.md"),
89
+ ],
90
+ uiDisplayName: 'display_name: "SilicaClaw Bridge Setup"',
91
+ checks(manifest, files) {
92
+ const runtimeSetup = readFileSync(files[0], "utf8");
93
+ const troubleshooting = readFileSync(files[1], "utf8");
94
+ const dialogueCheatsheetZh = readFileSync(files[2], "utf8");
95
+ assert(String(manifest.references?.runtime_setup || "") === "references/runtime-setup.md", "manifest runtime setup reference mismatch");
96
+ assert(String(manifest.references?.troubleshooting || "") === "references/troubleshooting.md", "manifest troubleshooting reference mismatch");
97
+ assert(String(manifest.references?.owner_dialogue_cheatsheet_zh || "") === "references/owner-dialogue-cheatsheet-zh.md", "manifest owner dialogue cheatsheet zh reference mismatch");
98
+ assert(runtimeSetup.includes("Minimum setup"), "runtime setup content mismatch");
99
+ assert(troubleshooting.includes("Common setup blockers"), "troubleshooting content mismatch");
100
+ assert(dialogueCheatsheetZh.includes("主人对话速查表"), "owner dialogue cheatsheet zh content mismatch");
101
+ },
102
+ },
103
+ }[skillName];
37
104
 
38
- for (const filePath of [skillMd, versionFile, manifestFile, agentYaml, clientFile, ownerForwarderDemoFile, ownerDispatchAdapterDemoFile, ownerSendViaOpenClawFile, ownerPolicyFile, ownerDispatchAdapterRefFile, computerControlRefFile]) {
105
+ assert(profile, `Unsupported skill for validation: ${skillName}`);
106
+
107
+ for (const filePath of [skillMd, versionFile, manifestFile, agentYaml, ...profile.requiredFiles]) {
39
108
  assert(existsSync(filePath), `Missing required skill file: ${filePath}`);
40
109
  }
41
110
 
@@ -43,25 +112,14 @@ function main() {
43
112
  const version = readFileSync(versionFile, "utf8").trim();
44
113
  const manifest = JSON.parse(readFileSync(manifestFile, "utf8"));
45
114
  const ui = readFileSync(agentYaml, "utf8");
46
- const ownerPolicy = readFileSync(ownerPolicyFile, "utf8");
47
- const ownerDispatchAdapterRef = readFileSync(ownerDispatchAdapterRefFile, "utf8");
48
- const computerControlRef = readFileSync(computerControlRefFile, "utf8");
49
115
 
50
116
  assert(skillBody.includes(`name: ${skillName}`), "SKILL.md name metadata mismatch");
51
117
  assert(Boolean(version), "VERSION is empty");
52
118
  assert(manifest.name === skillName, "manifest name mismatch");
53
119
  assert(manifest.version === version, "manifest version does not match VERSION");
54
120
  assert(String(manifest.entrypoints?.skill || "") === "SKILL.md", "manifest skill entrypoint mismatch");
55
- assert(String(manifest.entrypoints?.owner_forwarder_demo || "") === "scripts/owner-forwarder-demo.mjs", "manifest owner forwarder demo entrypoint mismatch");
56
- assert(String(manifest.entrypoints?.owner_dispatch_adapter_demo || "") === "scripts/owner-dispatch-adapter-demo.mjs", "manifest owner dispatch adapter demo entrypoint mismatch");
57
- assert(String(manifest.entrypoints?.owner_send_via_openclaw || "") === "scripts/send-to-owner-via-openclaw.mjs", "manifest owner send via openclaw entrypoint mismatch");
58
- assert(String(manifest.references?.owner_forwarding_policy || "") === "references/owner-forwarding-policy.md", "manifest owner forwarding reference mismatch");
59
- assert(String(manifest.references?.owner_dispatch_adapter || "") === "references/owner-dispatch-adapter.md", "manifest owner dispatch adapter reference mismatch");
60
- assert(String(manifest.references?.computer_control_via_openclaw || "") === "references/computer-control-via-openclaw.md", "manifest computer control reference mismatch");
61
- assert(ui.includes('display_name: "SilicaClaw Broadcast"'), "openai.yaml display_name mismatch");
62
- assert(ownerPolicy.includes("Default routing modes"), "owner forwarding policy content mismatch");
63
- assert(ownerDispatchAdapterRef.includes("OPENCLAW_OWNER_FORWARD_CMD"), "owner dispatch adapter reference content mismatch");
64
- assert(computerControlRef.includes("node.invoke"), "computer control reference content mismatch");
121
+ assert(ui.includes(profile.uiDisplayName), "openai.yaml display_name mismatch");
122
+ profile.checks(manifest, profile.requiredFiles);
65
123
 
66
124
  console.log(JSON.stringify({
67
125
  valid: true,