@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.
- package/CHANGELOG.md +6 -0
- package/INSTALL.md +44 -11
- package/README.md +53 -19
- package/VERSION +1 -1
- package/apps/local-console/dist/apps/local-console/src/server.d.ts +30 -12
- package/apps/local-console/dist/apps/local-console/src/server.js +265 -48
- package/apps/local-console/dist/config/silicaclaw-defaults.json +19 -0
- package/apps/local-console/dist/packages/core/src/socialConfig.js +9 -5
- package/apps/local-console/dist/packages/network/src/realPreview.js +6 -2
- package/apps/local-console/dist/packages/network/src/relayPreview.js +8 -2
- package/apps/local-console/dist/packages/network/src/transport/udpLanBroadcastTransport.js +2 -1
- package/apps/local-console/dist/packages/network/src/webrtcPreview.js +5 -1
- package/apps/local-console/dist/packages/storage/src/socialRuntimeRepo.js +8 -4
- package/apps/local-console/public/app/app.js +17 -1
- package/apps/local-console/public/app/events.js +38 -2
- package/apps/local-console/public/app/network.js +32 -3
- package/apps/local-console/public/app/overview.js +4 -2
- package/apps/local-console/public/app/social.js +175 -26
- package/apps/local-console/public/app/styles.css +182 -14
- package/apps/local-console/public/app/template.js +70 -30
- package/apps/local-console/public/app/translations.js +131 -43
- package/apps/local-console/src/server.ts +281 -50
- package/apps/public-explorer/dist/apps/public-explorer/src/server.d.ts +1 -0
- package/apps/public-explorer/dist/apps/public-explorer/src/server.js +41 -0
- package/apps/public-explorer/dist/config/silicaclaw-defaults.json +19 -0
- package/apps/public-explorer/public/app/app.js +22 -2
- package/apps/public-explorer/public/app/template.js +4 -4
- package/apps/public-explorer/public/app/translations.js +15 -15
- package/apps/public-explorer/src/server.ts +11 -1
- package/docs/NEW_USER_INSTALL.md +14 -10
- package/docs/NEW_USER_OPERATIONS.md +3 -3
- package/docs/OPENCLAW_BRIDGE.md +15 -0
- package/docs/OPENCLAW_BRIDGE_ZH.md +15 -0
- package/node_modules/@silicaclaw/core/dist/config/silicaclaw-defaults.json +19 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/crypto.d.ts +6 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/crypto.js +50 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/directory.d.ts +17 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/directory.js +145 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/identity.d.ts +2 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/identity.js +18 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/index.d.ts +12 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/index.js +28 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/indexing.d.ts +6 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/indexing.js +43 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/presence.d.ts +4 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/presence.js +23 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/profile.d.ts +4 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/profile.js +39 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.d.ts +70 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.js +103 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/socialConfig.d.ts +100 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/socialConfig.js +300 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/socialMessage.d.ts +19 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/socialMessage.js +69 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/socialResolver.d.ts +46 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/socialResolver.js +237 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/socialTemplate.d.ts +2 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/socialTemplate.js +90 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/types.d.ts +59 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/types.js +2 -0
- package/node_modules/@silicaclaw/core/src/socialConfig.ts +7 -5
- package/node_modules/@silicaclaw/network/dist/config/silicaclaw-defaults.json +19 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/messageEnvelope.d.ts +28 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/messageEnvelope.js +36 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/peerDiscovery.d.ts +43 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/peerDiscovery.js +2 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/topicCodec.d.ts +4 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/topicCodec.js +2 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/transport.d.ts +36 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/transport.js +2 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.d.ts +5 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.js +24 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonTopicCodec.d.ts +5 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonTopicCodec.js +12 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.d.ts +28 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.js +144 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/index.d.ts +14 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/index.js +30 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/localEventBus.d.ts +9 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/localEventBus.js +47 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/mock.d.ts +8 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/mock.js +24 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/realPreview.d.ts +105 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/realPreview.js +331 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.d.ts +166 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.js +448 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/transport/udpLanBroadcastTransport.d.ts +23 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/transport/udpLanBroadcastTransport.js +154 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/types.d.ts +6 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/types.js +2 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/webrtcPreview.d.ts +163 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/webrtcPreview.js +848 -0
- package/node_modules/@silicaclaw/network/src/realPreview.ts +3 -2
- package/node_modules/@silicaclaw/network/src/relayPreview.ts +5 -2
- package/node_modules/@silicaclaw/network/src/transport/udpLanBroadcastTransport.ts +2 -1
- package/node_modules/@silicaclaw/network/src/webrtcPreview.ts +2 -1
- package/node_modules/@silicaclaw/storage/dist/socialRuntimeRepo.js +8 -4
- package/node_modules/@silicaclaw/storage/src/socialRuntimeRepo.ts +5 -4
- package/openclaw-skills/silicaclaw-bridge-setup/SKILL.md +147 -0
- package/openclaw-skills/silicaclaw-bridge-setup/VERSION +1 -0
- package/openclaw-skills/silicaclaw-bridge-setup/agents/openai.yaml +6 -0
- package/openclaw-skills/silicaclaw-bridge-setup/manifest.json +27 -0
- package/openclaw-skills/silicaclaw-bridge-setup/references/owner-dialogue-cheatsheet-zh.md +58 -0
- package/openclaw-skills/silicaclaw-bridge-setup/references/runtime-setup.md +43 -0
- package/openclaw-skills/silicaclaw-bridge-setup/references/troubleshooting.md +24 -0
- package/openclaw-skills/silicaclaw-broadcast/SKILL.md +132 -0
- package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -1
- package/openclaw-skills/silicaclaw-broadcast/agents/openai.yaml +2 -2
- package/openclaw-skills/silicaclaw-broadcast/manifest.json +3 -2
- package/openclaw-skills/silicaclaw-broadcast/references/owner-dialogue-cheatsheet-zh.md +81 -0
- package/openclaw-skills/silicaclaw-owner-push/SKILL.md +217 -0
- package/openclaw-skills/silicaclaw-owner-push/VERSION +1 -0
- package/openclaw-skills/silicaclaw-owner-push/agents/openai.yaml +6 -0
- package/openclaw-skills/silicaclaw-owner-push/manifest.json +30 -0
- package/openclaw-skills/silicaclaw-owner-push/references/owner-dialogue-cheatsheet-zh.md +87 -0
- package/openclaw-skills/silicaclaw-owner-push/references/push-routing-policy.md +43 -0
- package/openclaw-skills/silicaclaw-owner-push/references/runtime-setup.md +41 -0
- package/openclaw-skills/silicaclaw-owner-push/scripts/owner-push-forwarder.mjs +214 -0
- package/openclaw-skills/silicaclaw-owner-push/scripts/send-to-owner-via-openclaw.mjs +69 -0
- package/package.json +1 -1
- package/packages/core/dist/config/silicaclaw-defaults.json +19 -0
- package/packages/core/dist/packages/core/src/crypto.d.ts +6 -0
- package/packages/core/dist/packages/core/src/crypto.js +50 -0
- package/packages/core/dist/packages/core/src/directory.d.ts +17 -0
- package/packages/core/dist/packages/core/src/directory.js +145 -0
- package/packages/core/dist/packages/core/src/identity.d.ts +2 -0
- package/packages/core/dist/packages/core/src/identity.js +18 -0
- package/packages/core/dist/packages/core/src/index.d.ts +12 -0
- package/packages/core/dist/packages/core/src/index.js +28 -0
- package/packages/core/dist/packages/core/src/indexing.d.ts +6 -0
- package/packages/core/dist/packages/core/src/indexing.js +43 -0
- package/packages/core/dist/packages/core/src/presence.d.ts +4 -0
- package/packages/core/dist/packages/core/src/presence.js +23 -0
- package/packages/core/dist/packages/core/src/profile.d.ts +4 -0
- package/packages/core/dist/packages/core/src/profile.js +39 -0
- package/packages/core/dist/packages/core/src/publicProfileSummary.d.ts +70 -0
- package/packages/core/dist/packages/core/src/publicProfileSummary.js +103 -0
- package/packages/core/dist/packages/core/src/socialConfig.d.ts +100 -0
- package/packages/core/dist/packages/core/src/socialConfig.js +300 -0
- package/packages/core/dist/packages/core/src/socialMessage.d.ts +19 -0
- package/packages/core/dist/packages/core/src/socialMessage.js +69 -0
- package/packages/core/dist/packages/core/src/socialResolver.d.ts +46 -0
- package/packages/core/dist/packages/core/src/socialResolver.js +237 -0
- package/packages/core/dist/packages/core/src/socialTemplate.d.ts +2 -0
- package/packages/core/dist/packages/core/src/socialTemplate.js +90 -0
- package/packages/core/dist/packages/core/src/types.d.ts +59 -0
- package/packages/core/dist/packages/core/src/types.js +2 -0
- package/packages/core/src/socialConfig.ts +7 -5
- package/packages/network/dist/config/silicaclaw-defaults.json +19 -0
- package/packages/network/dist/packages/network/src/abstractions/messageEnvelope.d.ts +28 -0
- package/packages/network/dist/packages/network/src/abstractions/messageEnvelope.js +36 -0
- package/packages/network/dist/packages/network/src/abstractions/peerDiscovery.d.ts +43 -0
- package/packages/network/dist/packages/network/src/abstractions/peerDiscovery.js +2 -0
- package/packages/network/dist/packages/network/src/abstractions/topicCodec.d.ts +4 -0
- package/packages/network/dist/packages/network/src/abstractions/topicCodec.js +2 -0
- package/packages/network/dist/packages/network/src/abstractions/transport.d.ts +36 -0
- package/packages/network/dist/packages/network/src/abstractions/transport.js +2 -0
- package/packages/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.d.ts +5 -0
- package/packages/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.js +24 -0
- package/packages/network/dist/packages/network/src/codec/jsonTopicCodec.d.ts +5 -0
- package/packages/network/dist/packages/network/src/codec/jsonTopicCodec.js +12 -0
- package/packages/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.d.ts +28 -0
- package/packages/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.js +144 -0
- package/packages/network/dist/packages/network/src/index.d.ts +14 -0
- package/packages/network/dist/packages/network/src/index.js +30 -0
- package/packages/network/dist/packages/network/src/localEventBus.d.ts +9 -0
- package/packages/network/dist/packages/network/src/localEventBus.js +47 -0
- package/packages/network/dist/packages/network/src/mock.d.ts +8 -0
- package/packages/network/dist/packages/network/src/mock.js +24 -0
- package/packages/network/dist/packages/network/src/realPreview.d.ts +105 -0
- package/packages/network/dist/packages/network/src/realPreview.js +331 -0
- package/packages/network/dist/packages/network/src/relayPreview.d.ts +166 -0
- package/packages/network/dist/packages/network/src/relayPreview.js +448 -0
- package/packages/network/dist/packages/network/src/transport/udpLanBroadcastTransport.d.ts +23 -0
- package/packages/network/dist/packages/network/src/transport/udpLanBroadcastTransport.js +154 -0
- package/packages/network/dist/packages/network/src/types.d.ts +6 -0
- package/packages/network/dist/packages/network/src/types.js +2 -0
- package/packages/network/dist/packages/network/src/webrtcPreview.d.ts +163 -0
- package/packages/network/dist/packages/network/src/webrtcPreview.js +848 -0
- package/packages/network/src/realPreview.ts +3 -2
- package/packages/network/src/relayPreview.ts +5 -2
- package/packages/network/src/transport/udpLanBroadcastTransport.ts +2 -1
- package/packages/network/src/webrtcPreview.ts +2 -1
- package/packages/storage/dist/socialRuntimeRepo.js +8 -4
- package/packages/storage/src/socialRuntimeRepo.ts +5 -4
- package/scripts/functional-check.mjs +35 -6
- package/scripts/install-openclaw-skill.mjs +9 -2
- package/scripts/openclaw-bridge-adapter.mjs +3 -1
- package/scripts/openclaw-bridge-client.mjs +3 -1
- package/scripts/openclaw-runtime-demo.mjs +3 -1
- package/scripts/quickstart.sh +13 -9
- package/scripts/release-pack.mjs +13 -1
- package/scripts/silicaclaw-cli.mjs +23 -18
- package/scripts/silicaclaw-gateway.mjs +33 -27
- 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(
|
|
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(
|
|
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 ||
|
|
441
|
-
kv("Room", payload.signaling.room ||
|
|
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",
|
|
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",
|
|
458
|
+
kv("Console", LOCAL_CONSOLE_BASE_URL);
|
|
453
459
|
if (status.mode === "global-preview") {
|
|
454
|
-
const signalingUrl = status?.signaling?.url ||
|
|
455
|
-
const room = status?.signaling?.room ||
|
|
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(
|
|
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",
|
|
620
|
+
kv("Hint", `an older SilicaClaw local-console process is still holding port ${LOCAL_CONSOLE_PORT}`);
|
|
615
621
|
}
|
|
616
|
-
kv("Inspect",
|
|
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(
|
|
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(
|
|
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 ||
|
|
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 ||
|
|
678
|
-
const room = parseFlag("room", process.env.WEBRTC_ROOM ||
|
|
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(
|
|
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(
|
|
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(
|
|
749
|
-
const remainingLocalListener = listeningProcessOnPort(
|
|
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
|
|
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(
|
|
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
|
|
818
|
-
kv("Inspect",
|
|
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(
|
|
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
|
|
847
|
-
kv("Inspect",
|
|
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
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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(
|
|
56
|
-
|
|
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,
|