@silicaclaw/cli 2026.3.19-9 → 2026.3.20-10
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 +182 -0
- package/DEMO_GUIDE.md +1 -1
- package/INSTALL.md +53 -13
- package/README.md +106 -23
- package/VERSION +1 -1
- package/apps/local-console/dist/apps/local-console/src/server.d.ts +180 -14
- package/apps/local-console/dist/apps/local-console/src/server.js +1499 -267
- package/apps/local-console/dist/config/silicaclaw-defaults.json +19 -0
- package/apps/local-console/dist/packages/core/src/index.d.ts +2 -0
- package/apps/local-console/dist/packages/core/src/index.js +2 -0
- package/apps/local-console/dist/packages/core/src/privateCrypto.d.ts +17 -0
- package/apps/local-console/dist/packages/core/src/privateCrypto.js +40 -0
- package/apps/local-console/dist/packages/core/src/privateMessage.d.ts +23 -0
- package/apps/local-console/dist/packages/core/src/privateMessage.js +74 -0
- package/apps/local-console/dist/packages/core/src/profile.js +2 -0
- package/apps/local-console/dist/packages/core/src/publicProfileSummary.d.ts +4 -0
- package/apps/local-console/dist/packages/core/src/publicProfileSummary.js +3 -0
- package/apps/local-console/dist/packages/core/src/socialConfig.js +9 -5
- package/apps/local-console/dist/packages/core/src/types.d.ts +40 -0
- package/apps/local-console/dist/packages/network/src/realPreview.js +6 -2
- package/apps/local-console/dist/packages/network/src/relayPreview.d.ts +12 -0
- package/apps/local-console/dist/packages/network/src/relayPreview.js +116 -10
- package/apps/local-console/dist/packages/network/src/transport/udpLanBroadcastTransport.js +2 -1
- package/apps/local-console/dist/packages/network/src/types.d.ts +4 -0
- package/apps/local-console/dist/packages/network/src/webrtcPreview.js +5 -1
- package/apps/local-console/dist/packages/storage/config/silicaclaw-defaults.json +19 -0
- package/apps/local-console/dist/packages/storage/src/repos.d.ts +13 -1
- package/apps/local-console/dist/packages/storage/src/repos.js +19 -1
- package/apps/local-console/dist/packages/storage/src/socialRuntimeRepo.js +8 -4
- package/apps/local-console/public/app/app.js +486 -12
- package/apps/local-console/public/app/events.js +61 -2
- package/apps/local-console/public/app/network.js +176 -35
- package/apps/local-console/public/app/overview.js +75 -53
- package/apps/local-console/public/app/shell.js +18 -34
- package/apps/local-console/public/app/social.js +495 -93
- package/apps/local-console/public/app/styles.css +309 -15
- package/apps/local-console/public/app/template.js +182 -51
- package/apps/local-console/public/app/translations.js +476 -266
- package/apps/local-console/src/server.ts +1669 -271
- 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 +29 -29
- package/apps/public-explorer/src/server.ts +11 -1
- package/config/silicaclaw-defaults.json +19 -0
- package/dist/apps/local-console/src/server.d.ts +1 -0
- package/dist/apps/local-console/src/server.js +555 -0
- package/docs/NEW_USER_INSTALL.md +14 -10
- package/docs/NEW_USER_OPERATIONS.md +9 -9
- package/docs/OPENCLAW_BRIDGE.md +22 -7
- package/docs/OPENCLAW_BRIDGE_ZH.md +21 -6
- package/docs/RELEASE_CHECKLIST.md +95 -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 +14 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/index.js +30 -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/privateCrypto.d.ts +17 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/privateCrypto.js +40 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/privateMessage.d.ts +23 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/privateMessage.js +74 -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 +41 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.d.ts +74 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.js +106 -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 +99 -0
- package/node_modules/@silicaclaw/core/dist/packages/core/src/types.js +2 -0
- package/node_modules/@silicaclaw/core/src/index.ts +2 -0
- package/node_modules/@silicaclaw/core/src/privateCrypto.ts +57 -0
- package/node_modules/@silicaclaw/core/src/privateMessage.ts +101 -0
- package/node_modules/@silicaclaw/core/src/profile.ts +2 -0
- package/node_modules/@silicaclaw/core/src/publicProfileSummary.ts +7 -0
- package/node_modules/@silicaclaw/core/src/socialConfig.ts +7 -5
- package/node_modules/@silicaclaw/core/src/types.ts +44 -0
- 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 +178 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.js +548 -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 +10 -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 +125 -12
- package/node_modules/@silicaclaw/network/src/transport/udpLanBroadcastTransport.ts +2 -1
- package/node_modules/@silicaclaw/network/src/types.ts +2 -0
- package/node_modules/@silicaclaw/network/src/webrtcPreview.ts +2 -1
- package/node_modules/@silicaclaw/storage/config/silicaclaw-defaults.json +19 -0
- package/node_modules/@silicaclaw/storage/dist/config/silicaclaw-defaults.json +19 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/crypto.d.ts +6 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/crypto.js +50 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/directory.d.ts +17 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/directory.js +145 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/identity.d.ts +2 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/identity.js +18 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/index.d.ts +14 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/index.js +30 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/indexing.d.ts +6 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/indexing.js +43 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/presence.d.ts +4 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/presence.js +23 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateCrypto.d.ts +17 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateCrypto.js +40 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateMessage.d.ts +23 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateMessage.js +74 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/profile.d.ts +4 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/profile.js +41 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/publicProfileSummary.d.ts +74 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/publicProfileSummary.js +106 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialConfig.d.ts +100 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialConfig.js +300 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialMessage.d.ts +19 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialMessage.js +69 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialResolver.d.ts +46 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialResolver.js +237 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialTemplate.d.ts +2 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialTemplate.js +90 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/types.d.ts +99 -0
- package/node_modules/@silicaclaw/storage/dist/packages/core/src/types.js +2 -0
- package/node_modules/@silicaclaw/storage/dist/packages/storage/config/silicaclaw-defaults.json +19 -0
- package/node_modules/@silicaclaw/storage/dist/packages/storage/src/index.d.ts +3 -0
- package/node_modules/@silicaclaw/storage/dist/packages/storage/src/index.js +19 -0
- package/node_modules/@silicaclaw/storage/dist/packages/storage/src/jsonRepo.d.ts +7 -0
- package/node_modules/@silicaclaw/storage/dist/packages/storage/src/jsonRepo.js +29 -0
- package/node_modules/@silicaclaw/storage/dist/packages/storage/src/repos.d.ts +73 -0
- package/node_modules/@silicaclaw/storage/dist/packages/storage/src/repos.js +85 -0
- package/node_modules/@silicaclaw/storage/dist/packages/storage/src/socialRuntimeRepo.d.ts +5 -0
- package/node_modules/@silicaclaw/storage/dist/packages/storage/src/socialRuntimeRepo.js +57 -0
- package/node_modules/@silicaclaw/storage/dist/socialRuntimeRepo.js +8 -4
- package/node_modules/@silicaclaw/storage/src/repos.ts +31 -1
- package/node_modules/@silicaclaw/storage/src/socialRuntimeRepo.ts +5 -4
- package/node_modules/@silicaclaw/storage/tsconfig.json +1 -6
- package/openclaw-skills/silicaclaw-bridge-setup/SKILL.md +165 -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 +150 -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 +4 -3
- package/openclaw-skills/silicaclaw-broadcast/references/owner-dialogue-cheatsheet-zh.md +81 -0
- package/openclaw-skills/silicaclaw-network-config/SKILL.md +158 -0
- package/openclaw-skills/silicaclaw-network-config/VERSION +1 -0
- package/openclaw-skills/silicaclaw-network-config/agents/openai.yaml +6 -0
- package/openclaw-skills/silicaclaw-network-config/manifest.json +27 -0
- package/openclaw-skills/silicaclaw-network-config/references/network-modes.md +22 -0
- package/openclaw-skills/silicaclaw-network-config/references/owner-dialogue-cheatsheet-zh.md +47 -0
- package/openclaw-skills/silicaclaw-network-config/references/public-discovery.md +22 -0
- package/openclaw-skills/silicaclaw-owner-push/SKILL.md +235 -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 +44 -0
- package/openclaw-skills/silicaclaw-owner-push/scripts/owner-push-forwarder.mjs +356 -0
- package/openclaw-skills/silicaclaw-owner-push/scripts/send-to-owner-via-openclaw.mjs +69 -0
- package/package.json +5 -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 +14 -0
- package/packages/core/dist/packages/core/src/index.js +30 -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/privateCrypto.d.ts +17 -0
- package/packages/core/dist/packages/core/src/privateCrypto.js +40 -0
- package/packages/core/dist/packages/core/src/privateMessage.d.ts +23 -0
- package/packages/core/dist/packages/core/src/privateMessage.js +74 -0
- package/packages/core/dist/packages/core/src/profile.d.ts +4 -0
- package/packages/core/dist/packages/core/src/profile.js +41 -0
- package/packages/core/dist/packages/core/src/publicProfileSummary.d.ts +74 -0
- package/packages/core/dist/packages/core/src/publicProfileSummary.js +106 -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 +99 -0
- package/packages/core/dist/packages/core/src/types.js +2 -0
- package/packages/core/src/index.ts +2 -0
- package/packages/core/src/privateCrypto.ts +57 -0
- package/packages/core/src/privateMessage.ts +101 -0
- package/packages/core/src/profile.ts +2 -0
- package/packages/core/src/publicProfileSummary.ts +7 -0
- package/packages/core/src/socialConfig.ts +7 -5
- package/packages/core/src/types.ts +44 -0
- 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 +178 -0
- package/packages/network/dist/packages/network/src/relayPreview.js +548 -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 +10 -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 +125 -12
- package/packages/network/src/transport/udpLanBroadcastTransport.ts +2 -1
- package/packages/network/src/types.ts +2 -0
- package/packages/network/src/webrtcPreview.ts +2 -1
- package/packages/storage/config/silicaclaw-defaults.json +19 -0
- package/packages/storage/dist/config/silicaclaw-defaults.json +19 -0
- package/packages/storage/dist/packages/core/src/crypto.d.ts +6 -0
- package/packages/storage/dist/packages/core/src/crypto.js +50 -0
- package/packages/storage/dist/packages/core/src/directory.d.ts +17 -0
- package/packages/storage/dist/packages/core/src/directory.js +145 -0
- package/packages/storage/dist/packages/core/src/identity.d.ts +2 -0
- package/packages/storage/dist/packages/core/src/identity.js +18 -0
- package/packages/storage/dist/packages/core/src/index.d.ts +14 -0
- package/packages/storage/dist/packages/core/src/index.js +30 -0
- package/packages/storage/dist/packages/core/src/indexing.d.ts +6 -0
- package/packages/storage/dist/packages/core/src/indexing.js +43 -0
- package/packages/storage/dist/packages/core/src/presence.d.ts +4 -0
- package/packages/storage/dist/packages/core/src/presence.js +23 -0
- package/packages/storage/dist/packages/core/src/privateCrypto.d.ts +17 -0
- package/packages/storage/dist/packages/core/src/privateCrypto.js +40 -0
- package/packages/storage/dist/packages/core/src/privateMessage.d.ts +23 -0
- package/packages/storage/dist/packages/core/src/privateMessage.js +74 -0
- package/packages/storage/dist/packages/core/src/profile.d.ts +4 -0
- package/packages/storage/dist/packages/core/src/profile.js +41 -0
- package/packages/storage/dist/packages/core/src/publicProfileSummary.d.ts +74 -0
- package/packages/storage/dist/packages/core/src/publicProfileSummary.js +106 -0
- package/packages/storage/dist/packages/core/src/socialConfig.d.ts +100 -0
- package/packages/storage/dist/packages/core/src/socialConfig.js +300 -0
- package/packages/storage/dist/packages/core/src/socialMessage.d.ts +19 -0
- package/packages/storage/dist/packages/core/src/socialMessage.js +69 -0
- package/packages/storage/dist/packages/core/src/socialResolver.d.ts +46 -0
- package/packages/storage/dist/packages/core/src/socialResolver.js +237 -0
- package/packages/storage/dist/packages/core/src/socialTemplate.d.ts +2 -0
- package/packages/storage/dist/packages/core/src/socialTemplate.js +90 -0
- package/packages/storage/dist/packages/core/src/types.d.ts +99 -0
- package/packages/storage/dist/packages/core/src/types.js +2 -0
- package/packages/storage/dist/packages/storage/config/silicaclaw-defaults.json +19 -0
- package/packages/storage/dist/packages/storage/src/index.d.ts +3 -0
- package/packages/storage/dist/packages/storage/src/index.js +19 -0
- package/packages/storage/dist/packages/storage/src/jsonRepo.d.ts +7 -0
- package/packages/storage/dist/packages/storage/src/jsonRepo.js +29 -0
- package/packages/storage/dist/packages/storage/src/repos.d.ts +73 -0
- package/packages/storage/dist/packages/storage/src/repos.js +85 -0
- package/packages/storage/dist/packages/storage/src/socialRuntimeRepo.d.ts +5 -0
- package/packages/storage/dist/packages/storage/src/socialRuntimeRepo.js +57 -0
- package/packages/storage/dist/socialRuntimeRepo.js +8 -4
- package/packages/storage/src/repos.ts +31 -1
- package/packages/storage/src/socialRuntimeRepo.ts +5 -4
- package/packages/storage/tsconfig.json +1 -6
- 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 +14 -10
- package/scripts/release-pack.mjs +59 -1
- package/scripts/silicaclaw-cli.mjs +166 -51
- package/scripts/silicaclaw-gateway.mjs +410 -84
- package/scripts/validate-openclaw-skill.mjs +98 -21
|
@@ -12,6 +12,7 @@ import { JsonMessageEnvelopeCodec } from "./codec/jsonMessageEnvelopeCodec";
|
|
|
12
12
|
import { JsonTopicCodec } from "./codec/jsonTopicCodec";
|
|
13
13
|
import { UdpLanBroadcastTransport } from "./transport/udpLanBroadcastTransport";
|
|
14
14
|
import { HeartbeatPeerDiscovery } from "./discovery/heartbeatPeerDiscovery";
|
|
15
|
+
import defaults from "../../../config/silicaclaw-defaults.json";
|
|
15
16
|
|
|
16
17
|
type RealNetworkAdapterPreviewOptions = {
|
|
17
18
|
peerId?: string;
|
|
@@ -124,7 +125,7 @@ export class RealNetworkAdapterPreview implements NetworkAdapter {
|
|
|
124
125
|
|
|
125
126
|
constructor(options: RealNetworkAdapterPreviewOptions = {}) {
|
|
126
127
|
this.peerId = options.peerId ?? `peer-${process.pid}-${Math.random().toString(36).slice(2, 10)}`;
|
|
127
|
-
this.namespace = this.normalizeNamespace(options.namespace ??
|
|
128
|
+
this.namespace = this.normalizeNamespace(options.namespace ?? defaults.network.default_namespace);
|
|
128
129
|
this.transport = options.transport ?? new UdpLanBroadcastTransport();
|
|
129
130
|
this.envelopeCodec = options.envelopeCodec ?? new JsonMessageEnvelopeCodec();
|
|
130
131
|
this.topicCodec = options.topicCodec ?? new JsonTopicCodec();
|
|
@@ -424,7 +425,7 @@ export class RealNetworkAdapterPreview implements NetworkAdapter {
|
|
|
424
425
|
|
|
425
426
|
private normalizeNamespace(namespace: string): string {
|
|
426
427
|
const normalized = namespace.trim();
|
|
427
|
-
return normalized.length > 0 ? normalized :
|
|
428
|
+
return normalized.length > 0 ? normalized : defaults.network.default_namespace;
|
|
428
429
|
}
|
|
429
430
|
|
|
430
431
|
private errorMessage(error: unknown): string {
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
import { TopicCodec } from "./abstractions/topicCodec";
|
|
9
9
|
import { JsonMessageEnvelopeCodec } from "./codec/jsonMessageEnvelopeCodec";
|
|
10
10
|
import { JsonTopicCodec } from "./codec/jsonTopicCodec";
|
|
11
|
+
import defaults from "../../../config/silicaclaw-defaults.json";
|
|
11
12
|
|
|
12
13
|
type RelayPreviewOptions = {
|
|
13
14
|
peerId?: string;
|
|
@@ -33,6 +34,10 @@ type RelayPeer = {
|
|
|
33
34
|
last_seen_at: number;
|
|
34
35
|
messages_seen: number;
|
|
35
36
|
reconnect_attempts: number;
|
|
37
|
+
meta?: {
|
|
38
|
+
signal_queue_size?: number;
|
|
39
|
+
relay_queue_size?: number;
|
|
40
|
+
};
|
|
36
41
|
};
|
|
37
42
|
|
|
38
43
|
type RelayDiagnostics = {
|
|
@@ -143,7 +148,8 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
143
148
|
|
|
144
149
|
private started = false;
|
|
145
150
|
private poller: NodeJS.Timeout | null = null;
|
|
146
|
-
private handlers = new Map<string, Set<(data: any) => void>>();
|
|
151
|
+
private handlers = new Map<string, Set<(data: any, meta?: { peerId?: string }) => void>>();
|
|
152
|
+
private directHandlers = new Map<string, Set<(data: any, meta?: { peerId?: string }) => void>>();
|
|
147
153
|
private peers = new Map<string, RelayPeer>();
|
|
148
154
|
private seenMessageIds = new Set<string>();
|
|
149
155
|
private activeEndpoint = "";
|
|
@@ -196,7 +202,8 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
196
202
|
|
|
197
203
|
constructor(options: RelayPreviewOptions = {}) {
|
|
198
204
|
this.peerId = options.peerId ?? `peer-${process.pid}-${Math.random().toString(36).slice(2, 10)}`;
|
|
199
|
-
this.namespace =
|
|
205
|
+
this.namespace =
|
|
206
|
+
String(options.namespace || defaults.network.default_namespace).trim() || defaults.network.default_namespace;
|
|
200
207
|
this.signalingEndpoints = dedupe(
|
|
201
208
|
(options.signalingUrls && options.signalingUrls.length > 0
|
|
202
209
|
? options.signalingUrls
|
|
@@ -204,7 +211,8 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
204
211
|
);
|
|
205
212
|
this.activeEndpoint = this.signalingEndpoints[0] || "http://localhost:4510";
|
|
206
213
|
this.activeEndpointIndex = 0;
|
|
207
|
-
this.room =
|
|
214
|
+
this.room =
|
|
215
|
+
String(options.room || defaults.network.global_preview.room).trim() || defaults.network.global_preview.room;
|
|
208
216
|
this.seedPeers = dedupe(options.seedPeers || []);
|
|
209
217
|
this.bootstrapHints = dedupe(options.bootstrapHints || []);
|
|
210
218
|
this.bootstrapSources = dedupe(options.bootstrapSources || []);
|
|
@@ -224,7 +232,6 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
224
232
|
try {
|
|
225
233
|
await this.joinRoom("start");
|
|
226
234
|
this.started = true;
|
|
227
|
-
await this.refreshPeers();
|
|
228
235
|
await this.pollOnce();
|
|
229
236
|
this.scheduleNextPoll(this.pollIntervalMs);
|
|
230
237
|
this.recordDiscovery("signaling_connected", { endpoint: this.activeEndpoint });
|
|
@@ -278,7 +285,43 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
278
285
|
if (!this.handlers.has(key)) {
|
|
279
286
|
this.handlers.set(key, new Set());
|
|
280
287
|
}
|
|
281
|
-
this.handlers.get(key)?.add(handler);
|
|
288
|
+
this.handlers.get(key)?.add(handler as (data: any, meta?: { peerId?: string }) => void);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
async sendDirect(peerId: string, topic: string, data: any): Promise<void> {
|
|
292
|
+
if (!this.started) return;
|
|
293
|
+
const targetPeerId = String(peerId || "").trim();
|
|
294
|
+
if (!targetPeerId) return;
|
|
295
|
+
await this.maybeRefreshJoin("direct_send");
|
|
296
|
+
const envelope: NetworkMessageEnvelope = {
|
|
297
|
+
version: 1,
|
|
298
|
+
message_id: randomUUID(),
|
|
299
|
+
topic: `${this.namespace}:${topic}`,
|
|
300
|
+
source_peer_id: this.peerId,
|
|
301
|
+
timestamp: Date.now(),
|
|
302
|
+
payload: this.topicCodec.encode(topic, data),
|
|
303
|
+
};
|
|
304
|
+
const raw = this.envelopeCodec.encode(envelope);
|
|
305
|
+
if (raw.length > this.maxMessageBytes) {
|
|
306
|
+
this.stats.dropped_oversized += 1;
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
await this.post("/direct/send", {
|
|
310
|
+
room: this.room,
|
|
311
|
+
from_peer_id: this.peerId,
|
|
312
|
+
to_peer_id: targetPeerId,
|
|
313
|
+
envelope,
|
|
314
|
+
});
|
|
315
|
+
this.lastPublishAt = Date.now();
|
|
316
|
+
this.signalingMessagesSentTotal += 1;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
subscribeDirect(topic: string, handler: (data: any, meta?: { peerId?: string }) => void): void {
|
|
320
|
+
const key = `${this.namespace}:${topic}`;
|
|
321
|
+
if (!this.directHandlers.has(key)) {
|
|
322
|
+
this.directHandlers.set(key, new Set());
|
|
323
|
+
}
|
|
324
|
+
this.directHandlers.get(key)?.add(handler);
|
|
282
325
|
}
|
|
283
326
|
|
|
284
327
|
getDiagnostics(): RelayDiagnostics {
|
|
@@ -351,6 +394,15 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
351
394
|
this.signalingMessagesReceivedTotal += 1;
|
|
352
395
|
this.onEnvelope(message?.envelope);
|
|
353
396
|
}
|
|
397
|
+
let directMessages = Array.isArray(payload?.direct_messages) ? payload.direct_messages : null;
|
|
398
|
+
if (!directMessages) {
|
|
399
|
+
const directPayload = await this.get(`/direct/poll?room=${encodeURIComponent(this.room)}&peer_id=${encodeURIComponent(this.peerId)}`);
|
|
400
|
+
directMessages = Array.isArray(directPayload?.messages) ? directPayload.messages : [];
|
|
401
|
+
}
|
|
402
|
+
for (const message of directMessages) {
|
|
403
|
+
this.signalingMessagesReceivedTotal += 1;
|
|
404
|
+
this.onDirectEnvelope(message?.envelope, { peerId: String(message?.from_peer_id || "") || undefined });
|
|
405
|
+
}
|
|
354
406
|
if (Array.isArray(payload?.peers)) {
|
|
355
407
|
this.updatePeersFromList(payload.peers);
|
|
356
408
|
} else if (!this.lastPeerRefreshAt || Date.now() - this.lastPeerRefreshAt >= this.peerRefreshIntervalMs) {
|
|
@@ -372,11 +424,25 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
372
424
|
const payload = await this.get(`/peers?room=${encodeURIComponent(this.room)}`);
|
|
373
425
|
this.lastPeerRefreshAt = Date.now();
|
|
374
426
|
this.stats.peers_refresh_succeeded += 1;
|
|
375
|
-
const
|
|
376
|
-
|
|
427
|
+
const peerItems = Array.isArray(payload?.peer_details) && payload.peer_details.length
|
|
428
|
+
? payload.peer_details
|
|
429
|
+
: Array.isArray(payload?.peers) ? payload.peers : [];
|
|
430
|
+
this.updatePeersFromList(peerItems);
|
|
377
431
|
}
|
|
378
432
|
|
|
379
433
|
private onEnvelope(envelope: unknown): void {
|
|
434
|
+
this.dispatchEnvelope(envelope, this.handlers);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
private onDirectEnvelope(envelope: unknown, meta?: { peerId?: string }): void {
|
|
438
|
+
this.dispatchEnvelope(envelope, this.directHandlers, meta);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
private dispatchEnvelope(
|
|
442
|
+
envelope: unknown,
|
|
443
|
+
handlersByTopic: Map<string, Set<(data: any, meta?: { peerId?: string }) => void>>,
|
|
444
|
+
meta?: { peerId?: string }
|
|
445
|
+
): void {
|
|
380
446
|
this.stats.received_total += 1;
|
|
381
447
|
const validated = validateNetworkMessageEnvelope(envelope, {
|
|
382
448
|
max_future_drift_ms: this.maxFutureDriftMs,
|
|
@@ -413,7 +479,7 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
413
479
|
|
|
414
480
|
const topicKey = message.topic;
|
|
415
481
|
const topic = topicKey.slice(this.namespace.length + 1);
|
|
416
|
-
const handlers =
|
|
482
|
+
const handlers = handlersByTopic.get(topicKey);
|
|
417
483
|
if (!handlers || handlers.size === 0) return;
|
|
418
484
|
|
|
419
485
|
const peer = this.peers.get(message.source_peer_id);
|
|
@@ -431,7 +497,7 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
431
497
|
}
|
|
432
498
|
for (const handler of handlers) {
|
|
433
499
|
try {
|
|
434
|
-
handler(payload);
|
|
500
|
+
handler(payload, meta || { peerId: message.source_peer_id });
|
|
435
501
|
this.stats.delivered_total += 1;
|
|
436
502
|
} catch {
|
|
437
503
|
this.stats.dropped_handler_error += 1;
|
|
@@ -454,9 +520,13 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
454
520
|
|
|
455
521
|
private async joinRoom(reason: string): Promise<void> {
|
|
456
522
|
this.stats.join_attempted += 1;
|
|
457
|
-
await this.post("/join", { room: this.room, peer_id: this.peerId });
|
|
523
|
+
const payload = await this.post("/join", { room: this.room, peer_id: this.peerId });
|
|
458
524
|
this.lastJoinAt = Date.now();
|
|
459
525
|
this.stats.join_succeeded += 1;
|
|
526
|
+
if (Array.isArray(payload?.peers)) {
|
|
527
|
+
this.updatePeersFromList(payload.peers);
|
|
528
|
+
this.lastPeerRefreshAt = this.lastJoinAt;
|
|
529
|
+
}
|
|
460
530
|
this.recordDiscovery("join_ok", { endpoint: this.activeEndpoint, detail: reason });
|
|
461
531
|
}
|
|
462
532
|
|
|
@@ -464,6 +534,7 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
464
534
|
if (!this.lastJoinAt || Date.now() - this.lastJoinAt > Math.max(45_000, this.pollIntervalMs * 6)) {
|
|
465
535
|
await this.joinRoom(reason);
|
|
466
536
|
}
|
|
537
|
+
this.ensurePollingAlive(reason);
|
|
467
538
|
}
|
|
468
539
|
|
|
469
540
|
private async get(path: string): Promise<any> {
|
|
@@ -524,13 +595,38 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
524
595
|
}
|
|
525
596
|
|
|
526
597
|
private updatePeersFromList(values: unknown[]): void {
|
|
527
|
-
const
|
|
598
|
+
const parsedPeers: Array<{ peer_id: string; meta?: RelayPeer["meta"] }> = [];
|
|
599
|
+
for (const value of values) {
|
|
600
|
+
if (typeof value === "string") {
|
|
601
|
+
const peerId = String(value || "").trim();
|
|
602
|
+
if (peerId) {
|
|
603
|
+
parsedPeers.push({ peer_id: peerId });
|
|
604
|
+
}
|
|
605
|
+
continue;
|
|
606
|
+
}
|
|
607
|
+
if (value && typeof value === "object") {
|
|
608
|
+
const raw = value as Record<string, unknown>;
|
|
609
|
+
const peerId = String(raw.peer_id || "").trim();
|
|
610
|
+
if (!peerId) {
|
|
611
|
+
continue;
|
|
612
|
+
}
|
|
613
|
+
parsedPeers.push({
|
|
614
|
+
peer_id: peerId,
|
|
615
|
+
meta: {
|
|
616
|
+
signal_queue_size: Number(raw.signal_queue_size ?? 0),
|
|
617
|
+
relay_queue_size: Number(raw.relay_queue_size ?? 0),
|
|
618
|
+
},
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
const peerIds = parsedPeers.map((peer) => peer.peer_id);
|
|
528
623
|
if (!peerIds.includes(this.peerId)) {
|
|
529
624
|
void this.joinRoom("self_missing_from_peers").catch(() => {});
|
|
530
625
|
}
|
|
531
626
|
const now = Date.now();
|
|
532
627
|
const next = new Map<string, RelayPeer>();
|
|
533
|
-
for (const
|
|
628
|
+
for (const peerInfo of parsedPeers) {
|
|
629
|
+
const peerId = peerInfo.peer_id;
|
|
534
630
|
if (peerId === this.peerId) continue;
|
|
535
631
|
const existing = this.peers.get(peerId);
|
|
536
632
|
if (!existing) {
|
|
@@ -543,6 +639,7 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
543
639
|
last_seen_at: now,
|
|
544
640
|
messages_seen: existing?.messages_seen ?? 0,
|
|
545
641
|
reconnect_attempts: existing?.reconnect_attempts ?? 0,
|
|
642
|
+
meta: peerInfo.meta || existing?.meta,
|
|
546
643
|
});
|
|
547
644
|
}
|
|
548
645
|
for (const peerId of this.peers.keys()) {
|
|
@@ -562,4 +659,20 @@ export class RelayPreviewAdapter implements NetworkAdapter {
|
|
|
562
659
|
this.pollOnce().catch(() => {});
|
|
563
660
|
}, Math.max(1000, delayMs + jitterMs));
|
|
564
661
|
}
|
|
662
|
+
|
|
663
|
+
private ensurePollingAlive(reason: string): void {
|
|
664
|
+
if (!this.started) return;
|
|
665
|
+
const pollStaleMs = Math.max(45_000, this.pollIntervalMs * 6);
|
|
666
|
+
const pollMissing = !this.poller;
|
|
667
|
+
const pollStale = Boolean(this.lastPollAt) && Date.now() - this.lastPollAt > pollStaleMs;
|
|
668
|
+
if (!pollMissing && !pollStale) {
|
|
669
|
+
return;
|
|
670
|
+
}
|
|
671
|
+
this.recordDiscovery("poll_recover_scheduled", {
|
|
672
|
+
endpoint: this.activeEndpoint,
|
|
673
|
+
detail: `${reason}:${pollMissing ? "missing" : "stale"}`,
|
|
674
|
+
});
|
|
675
|
+
this.currentPollDelayMs = this.pollIntervalMs;
|
|
676
|
+
this.scheduleNextPoll(0);
|
|
677
|
+
}
|
|
565
678
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import dgram from "dgram";
|
|
2
|
+
import defaults from "../../../../config/silicaclaw-defaults.json";
|
|
2
3
|
import {
|
|
3
4
|
NetworkTransport,
|
|
4
5
|
TransportConfigSnapshot,
|
|
@@ -38,7 +39,7 @@ export class UdpLanBroadcastTransport implements NetworkTransport {
|
|
|
38
39
|
private broadcastAddress: string;
|
|
39
40
|
|
|
40
41
|
constructor(options: UdpLanBroadcastTransportOptions = {}) {
|
|
41
|
-
this.port = options.port ??
|
|
42
|
+
this.port = options.port ?? defaults.ports.network_default;
|
|
42
43
|
this.bindAddress = options.bindAddress ?? "0.0.0.0";
|
|
43
44
|
this.broadcastAddress = options.broadcastAddress ?? "255.255.255.255";
|
|
44
45
|
}
|
|
@@ -3,4 +3,6 @@ export interface NetworkAdapter {
|
|
|
3
3
|
stop(): Promise<void>;
|
|
4
4
|
publish(topic: string, data: any): Promise<void>;
|
|
5
5
|
subscribe(topic: string, handler: (data: any) => void): void;
|
|
6
|
+
sendDirect?(peerId: string, topic: string, data: any): Promise<void>;
|
|
7
|
+
subscribeDirect?(topic: string, handler: (data: any, meta?: { peerId?: string }) => void): void;
|
|
6
8
|
}
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
import { TopicCodec } from "./abstractions/topicCodec";
|
|
9
9
|
import { JsonMessageEnvelopeCodec } from "./codec/jsonMessageEnvelopeCodec";
|
|
10
10
|
import { JsonTopicCodec } from "./codec/jsonTopicCodec";
|
|
11
|
+
import defaults from "../../../config/silicaclaw-defaults.json";
|
|
11
12
|
|
|
12
13
|
type WebRTCPreviewOptions = {
|
|
13
14
|
peerId?: string;
|
|
@@ -261,7 +262,7 @@ export class WebRTCPreviewAdapter implements NetworkAdapter {
|
|
|
261
262
|
|
|
262
263
|
constructor(options: WebRTCPreviewOptions = {}) {
|
|
263
264
|
this.peerId = options.peerId ?? `webrtc-${process.pid}-${Math.random().toString(36).slice(2, 9)}`;
|
|
264
|
-
this.namespace = (options.namespace ??
|
|
265
|
+
this.namespace = (options.namespace ?? defaults.network.default_namespace).trim() || defaults.network.default_namespace;
|
|
265
266
|
const configuredSignalingUrls = dedupeArray([
|
|
266
267
|
...(options.signalingUrls ?? []),
|
|
267
268
|
options.signalingUrl ?? "",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"ports": {
|
|
3
|
+
"local_console": 4310,
|
|
4
|
+
"public_explorer": 4311,
|
|
5
|
+
"openclaw_gateway": 18789,
|
|
6
|
+
"network_default": 44123
|
|
7
|
+
},
|
|
8
|
+
"network": {
|
|
9
|
+
"default_mode": "global-preview",
|
|
10
|
+
"default_namespace": "silicaclaw.preview",
|
|
11
|
+
"global_preview": {
|
|
12
|
+
"relay_url": "https://relay.silicaclaw.com",
|
|
13
|
+
"room": "silicaclaw-global-preview"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"bridge": {
|
|
17
|
+
"api_base": "http://localhost:4310"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"ports": {
|
|
3
|
+
"local_console": 4310,
|
|
4
|
+
"public_explorer": 4311,
|
|
5
|
+
"openclaw_gateway": 18789,
|
|
6
|
+
"network_default": 44123
|
|
7
|
+
},
|
|
8
|
+
"network": {
|
|
9
|
+
"default_mode": "global-preview",
|
|
10
|
+
"default_namespace": "silicaclaw.preview",
|
|
11
|
+
"global_preview": {
|
|
12
|
+
"relay_url": "https://relay.silicaclaw.com",
|
|
13
|
+
"room": "silicaclaw-global-preview"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"bridge": {
|
|
17
|
+
"api_base": "http://localhost:4310"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function toBase64(input: Uint8Array): string;
|
|
2
|
+
export declare function fromBase64(input: string): Uint8Array;
|
|
3
|
+
export declare function hashPublicKey(publicKey: Uint8Array): string;
|
|
4
|
+
export declare function stableStringify(input: unknown): string;
|
|
5
|
+
export declare function signPayload(payload: unknown, privateKeyBase64: string): string;
|
|
6
|
+
export declare function verifyPayload(payload: unknown, signatureBase64: string, publicKeyBase64: string): boolean;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.toBase64 = toBase64;
|
|
7
|
+
exports.fromBase64 = fromBase64;
|
|
8
|
+
exports.hashPublicKey = hashPublicKey;
|
|
9
|
+
exports.stableStringify = stableStringify;
|
|
10
|
+
exports.signPayload = signPayload;
|
|
11
|
+
exports.verifyPayload = verifyPayload;
|
|
12
|
+
const crypto_1 = require("crypto");
|
|
13
|
+
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
14
|
+
function toBase64(input) {
|
|
15
|
+
return Buffer.from(input).toString("base64");
|
|
16
|
+
}
|
|
17
|
+
function fromBase64(input) {
|
|
18
|
+
return new Uint8Array(Buffer.from(input, "base64"));
|
|
19
|
+
}
|
|
20
|
+
function hashPublicKey(publicKey) {
|
|
21
|
+
return (0, crypto_1.createHash)("sha256").update(publicKey).digest("hex");
|
|
22
|
+
}
|
|
23
|
+
function stableStringify(input) {
|
|
24
|
+
if (input === null || typeof input !== "object") {
|
|
25
|
+
return JSON.stringify(input);
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(input)) {
|
|
28
|
+
return `[${input.map((item) => stableStringify(item)).join(",")}]`;
|
|
29
|
+
}
|
|
30
|
+
const entries = Object.entries(input)
|
|
31
|
+
.filter(([, value]) => value !== undefined)
|
|
32
|
+
.sort(([a], [b]) => a.localeCompare(b));
|
|
33
|
+
return `{${entries
|
|
34
|
+
.map(([key, value]) => `${JSON.stringify(key)}:${stableStringify(value)}`)
|
|
35
|
+
.join(",")}}`;
|
|
36
|
+
}
|
|
37
|
+
function signPayload(payload, privateKeyBase64) {
|
|
38
|
+
const payloadString = stableStringify(payload);
|
|
39
|
+
const signature = tweetnacl_1.default.sign.detached(Buffer.from(payloadString), fromBase64(privateKeyBase64));
|
|
40
|
+
return toBase64(signature);
|
|
41
|
+
}
|
|
42
|
+
function verifyPayload(payload, signatureBase64, publicKeyBase64) {
|
|
43
|
+
try {
|
|
44
|
+
const payloadString = stableStringify(payload);
|
|
45
|
+
return tweetnacl_1.default.sign.detached.verify(Buffer.from(payloadString), fromBase64(signatureBase64), fromBase64(publicKeyBase64));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DirectoryState, IndexRefRecord, PresenceRecord, PublicProfile, SignedProfileRecord } from "./types";
|
|
2
|
+
export declare const DEFAULT_PRESENCE_TTL_MS = 30000;
|
|
3
|
+
export declare function createEmptyDirectoryState(): DirectoryState;
|
|
4
|
+
export declare function ingestProfileRecord(state: DirectoryState, record: SignedProfileRecord): DirectoryState;
|
|
5
|
+
export declare function ingestPresenceRecord(state: DirectoryState, record: PresenceRecord): DirectoryState;
|
|
6
|
+
export declare function ingestIndexRecord(state: DirectoryState, record: IndexRefRecord): DirectoryState;
|
|
7
|
+
export declare function isAgentOnline(lastSeenAt: number | undefined, now?: number, ttlMs?: number): boolean;
|
|
8
|
+
export declare function cleanupExpiredPresence(state: DirectoryState, now?: number, ttlMs?: number): {
|
|
9
|
+
state: DirectoryState;
|
|
10
|
+
removed: number;
|
|
11
|
+
};
|
|
12
|
+
export declare function rebuildIndexForProfile(state: DirectoryState, profile: PublicProfile): DirectoryState;
|
|
13
|
+
export declare function dedupeIndex(state: DirectoryState): DirectoryState;
|
|
14
|
+
export declare function searchDirectory(state: DirectoryState, keyword: string, options?: {
|
|
15
|
+
now?: number;
|
|
16
|
+
presenceTTLms?: number;
|
|
17
|
+
}): PublicProfile[];
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_PRESENCE_TTL_MS = void 0;
|
|
4
|
+
exports.createEmptyDirectoryState = createEmptyDirectoryState;
|
|
5
|
+
exports.ingestProfileRecord = ingestProfileRecord;
|
|
6
|
+
exports.ingestPresenceRecord = ingestPresenceRecord;
|
|
7
|
+
exports.ingestIndexRecord = ingestIndexRecord;
|
|
8
|
+
exports.isAgentOnline = isAgentOnline;
|
|
9
|
+
exports.cleanupExpiredPresence = cleanupExpiredPresence;
|
|
10
|
+
exports.rebuildIndexForProfile = rebuildIndexForProfile;
|
|
11
|
+
exports.dedupeIndex = dedupeIndex;
|
|
12
|
+
exports.searchDirectory = searchDirectory;
|
|
13
|
+
const indexing_1 = require("./indexing");
|
|
14
|
+
exports.DEFAULT_PRESENCE_TTL_MS = 30_000;
|
|
15
|
+
function createEmptyDirectoryState() {
|
|
16
|
+
return {
|
|
17
|
+
profiles: {},
|
|
18
|
+
presence: {},
|
|
19
|
+
index: {},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function ingestProfileRecord(state, record) {
|
|
23
|
+
const next = {
|
|
24
|
+
profiles: { ...state.profiles },
|
|
25
|
+
presence: { ...state.presence },
|
|
26
|
+
index: { ...state.index },
|
|
27
|
+
};
|
|
28
|
+
next.profiles[record.profile.agent_id] = record.profile;
|
|
29
|
+
return rebuildIndexForProfile(next, record.profile);
|
|
30
|
+
}
|
|
31
|
+
function ingestPresenceRecord(state, record) {
|
|
32
|
+
return {
|
|
33
|
+
profiles: { ...state.profiles },
|
|
34
|
+
presence: {
|
|
35
|
+
...state.presence,
|
|
36
|
+
[record.agent_id]: record.timestamp,
|
|
37
|
+
},
|
|
38
|
+
index: { ...state.index },
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function ingestIndexRecord(state, record) {
|
|
42
|
+
const existing = new Set(state.index[record.key] ?? []);
|
|
43
|
+
if (existing.has(record.agent_id)) {
|
|
44
|
+
return state;
|
|
45
|
+
}
|
|
46
|
+
existing.add(record.agent_id);
|
|
47
|
+
return {
|
|
48
|
+
profiles: { ...state.profiles },
|
|
49
|
+
presence: { ...state.presence },
|
|
50
|
+
index: {
|
|
51
|
+
...state.index,
|
|
52
|
+
[record.key]: Array.from(existing),
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function isAgentOnline(lastSeenAt, now = Date.now(), ttlMs = exports.DEFAULT_PRESENCE_TTL_MS) {
|
|
57
|
+
if (!lastSeenAt) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return now - lastSeenAt <= ttlMs;
|
|
61
|
+
}
|
|
62
|
+
function cleanupExpiredPresence(state, now = Date.now(), ttlMs = exports.DEFAULT_PRESENCE_TTL_MS) {
|
|
63
|
+
let removed = 0;
|
|
64
|
+
const presence = {};
|
|
65
|
+
for (const [agentId, timestamp] of Object.entries(state.presence)) {
|
|
66
|
+
if (isAgentOnline(timestamp, now, ttlMs)) {
|
|
67
|
+
presence[agentId] = timestamp;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
removed += 1;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (removed === 0) {
|
|
74
|
+
return { state, removed: 0 };
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
state: {
|
|
78
|
+
profiles: { ...state.profiles },
|
|
79
|
+
presence,
|
|
80
|
+
index: { ...state.index },
|
|
81
|
+
},
|
|
82
|
+
removed,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function rebuildIndexForProfile(state, profile) {
|
|
86
|
+
const keys = (0, indexing_1.buildIndexKeys)(profile);
|
|
87
|
+
const nextIndex = {};
|
|
88
|
+
for (const [key, ids] of Object.entries(state.index)) {
|
|
89
|
+
const filtered = ids.filter((id) => id !== profile.agent_id);
|
|
90
|
+
if (filtered.length > 0) {
|
|
91
|
+
nextIndex[key] = Array.from(new Set(filtered));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
for (const key of keys) {
|
|
95
|
+
const existing = new Set(nextIndex[key] ?? []);
|
|
96
|
+
existing.add(profile.agent_id);
|
|
97
|
+
nextIndex[key] = Array.from(existing);
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
profiles: { ...state.profiles },
|
|
101
|
+
presence: { ...state.presence },
|
|
102
|
+
index: nextIndex,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function dedupeIndex(state) {
|
|
106
|
+
const index = {};
|
|
107
|
+
for (const [key, ids] of Object.entries(state.index)) {
|
|
108
|
+
index[key] = Array.from(new Set(ids));
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
profiles: { ...state.profiles },
|
|
112
|
+
presence: { ...state.presence },
|
|
113
|
+
index,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function searchDirectory(state, keyword, options) {
|
|
117
|
+
const now = options?.now ?? Date.now();
|
|
118
|
+
const presenceTTLms = options?.presenceTTLms ?? exports.DEFAULT_PRESENCE_TTL_MS;
|
|
119
|
+
const normalized = keyword.trim().toLowerCase();
|
|
120
|
+
const baseList = normalized.length === 0
|
|
121
|
+
? Object.values(state.profiles)
|
|
122
|
+
: Array.from(new Set([
|
|
123
|
+
...(state.index[`tag:${normalized}`] ?? []),
|
|
124
|
+
...(state.index[`name:${normalized.replace(/[^a-z0-9]+/g, "")}`] ?? []),
|
|
125
|
+
]))
|
|
126
|
+
.map((agentId) => state.profiles[agentId])
|
|
127
|
+
.filter((profile) => Boolean(profile));
|
|
128
|
+
return baseList
|
|
129
|
+
.slice()
|
|
130
|
+
.sort((a, b) => {
|
|
131
|
+
const aOnline = isAgentOnline(state.presence[a.agent_id], now, presenceTTLms) ? 1 : 0;
|
|
132
|
+
const bOnline = isAgentOnline(state.presence[b.agent_id], now, presenceTTLms) ? 1 : 0;
|
|
133
|
+
if (aOnline !== bOnline) {
|
|
134
|
+
return bOnline - aOnline;
|
|
135
|
+
}
|
|
136
|
+
if (a.updated_at !== b.updated_at) {
|
|
137
|
+
return b.updated_at - a.updated_at;
|
|
138
|
+
}
|
|
139
|
+
const byName = a.display_name.localeCompare(b.display_name);
|
|
140
|
+
if (byName !== 0) {
|
|
141
|
+
return byName;
|
|
142
|
+
}
|
|
143
|
+
return a.agent_id.localeCompare(b.agent_id);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createIdentity = createIdentity;
|
|
7
|
+
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
8
|
+
const crypto_1 = require("./crypto");
|
|
9
|
+
function createIdentity(now = Date.now()) {
|
|
10
|
+
const pair = tweetnacl_1.default.sign.keyPair();
|
|
11
|
+
const publicKey = (0, crypto_1.toBase64)(pair.publicKey);
|
|
12
|
+
return {
|
|
13
|
+
agent_id: (0, crypto_1.hashPublicKey)(pair.publicKey),
|
|
14
|
+
public_key: publicKey,
|
|
15
|
+
private_key: (0, crypto_1.toBase64)(pair.secretKey),
|
|
16
|
+
created_at: now,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from "./types";
|
|
2
|
+
export * from "./crypto";
|
|
3
|
+
export * from "./identity";
|
|
4
|
+
export * from "./profile";
|
|
5
|
+
export * from "./presence";
|
|
6
|
+
export * from "./socialMessage";
|
|
7
|
+
export * from "./privateCrypto";
|
|
8
|
+
export * from "./privateMessage";
|
|
9
|
+
export * from "./indexing";
|
|
10
|
+
export * from "./directory";
|
|
11
|
+
export * from "./publicProfileSummary";
|
|
12
|
+
export * from "./socialConfig";
|
|
13
|
+
export * from "./socialResolver";
|
|
14
|
+
export * from "./socialTemplate";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./crypto"), exports);
|
|
19
|
+
__exportStar(require("./identity"), exports);
|
|
20
|
+
__exportStar(require("./profile"), exports);
|
|
21
|
+
__exportStar(require("./presence"), exports);
|
|
22
|
+
__exportStar(require("./socialMessage"), exports);
|
|
23
|
+
__exportStar(require("./privateCrypto"), exports);
|
|
24
|
+
__exportStar(require("./privateMessage"), exports);
|
|
25
|
+
__exportStar(require("./indexing"), exports);
|
|
26
|
+
__exportStar(require("./directory"), exports);
|
|
27
|
+
__exportStar(require("./publicProfileSummary"), exports);
|
|
28
|
+
__exportStar(require("./socialConfig"), exports);
|
|
29
|
+
__exportStar(require("./socialResolver"), exports);
|
|
30
|
+
__exportStar(require("./socialTemplate"), exports);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { IndexRefRecord, PublicProfile } from "./types";
|
|
2
|
+
export declare function normalizeTag(tag: string): string;
|
|
3
|
+
export declare function buildTagIndexKeys(tags: string[]): string[];
|
|
4
|
+
export declare function buildNamePrefixKeys(displayName: string): string[];
|
|
5
|
+
export declare function buildIndexKeys(profile: PublicProfile): string[];
|
|
6
|
+
export declare function buildIndexRecords(profile: PublicProfile): IndexRefRecord[];
|