@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.
Files changed (331) hide show
  1. package/CHANGELOG.md +182 -0
  2. package/DEMO_GUIDE.md +1 -1
  3. package/INSTALL.md +53 -13
  4. package/README.md +106 -23
  5. package/VERSION +1 -1
  6. package/apps/local-console/dist/apps/local-console/src/server.d.ts +180 -14
  7. package/apps/local-console/dist/apps/local-console/src/server.js +1499 -267
  8. package/apps/local-console/dist/config/silicaclaw-defaults.json +19 -0
  9. package/apps/local-console/dist/packages/core/src/index.d.ts +2 -0
  10. package/apps/local-console/dist/packages/core/src/index.js +2 -0
  11. package/apps/local-console/dist/packages/core/src/privateCrypto.d.ts +17 -0
  12. package/apps/local-console/dist/packages/core/src/privateCrypto.js +40 -0
  13. package/apps/local-console/dist/packages/core/src/privateMessage.d.ts +23 -0
  14. package/apps/local-console/dist/packages/core/src/privateMessage.js +74 -0
  15. package/apps/local-console/dist/packages/core/src/profile.js +2 -0
  16. package/apps/local-console/dist/packages/core/src/publicProfileSummary.d.ts +4 -0
  17. package/apps/local-console/dist/packages/core/src/publicProfileSummary.js +3 -0
  18. package/apps/local-console/dist/packages/core/src/socialConfig.js +9 -5
  19. package/apps/local-console/dist/packages/core/src/types.d.ts +40 -0
  20. package/apps/local-console/dist/packages/network/src/realPreview.js +6 -2
  21. package/apps/local-console/dist/packages/network/src/relayPreview.d.ts +12 -0
  22. package/apps/local-console/dist/packages/network/src/relayPreview.js +116 -10
  23. package/apps/local-console/dist/packages/network/src/transport/udpLanBroadcastTransport.js +2 -1
  24. package/apps/local-console/dist/packages/network/src/types.d.ts +4 -0
  25. package/apps/local-console/dist/packages/network/src/webrtcPreview.js +5 -1
  26. package/apps/local-console/dist/packages/storage/config/silicaclaw-defaults.json +19 -0
  27. package/apps/local-console/dist/packages/storage/src/repos.d.ts +13 -1
  28. package/apps/local-console/dist/packages/storage/src/repos.js +19 -1
  29. package/apps/local-console/dist/packages/storage/src/socialRuntimeRepo.js +8 -4
  30. package/apps/local-console/public/app/app.js +486 -12
  31. package/apps/local-console/public/app/events.js +61 -2
  32. package/apps/local-console/public/app/network.js +176 -35
  33. package/apps/local-console/public/app/overview.js +75 -53
  34. package/apps/local-console/public/app/shell.js +18 -34
  35. package/apps/local-console/public/app/social.js +495 -93
  36. package/apps/local-console/public/app/styles.css +309 -15
  37. package/apps/local-console/public/app/template.js +182 -51
  38. package/apps/local-console/public/app/translations.js +476 -266
  39. package/apps/local-console/src/server.ts +1669 -271
  40. package/apps/public-explorer/dist/apps/public-explorer/src/server.d.ts +1 -0
  41. package/apps/public-explorer/dist/apps/public-explorer/src/server.js +41 -0
  42. package/apps/public-explorer/dist/config/silicaclaw-defaults.json +19 -0
  43. package/apps/public-explorer/public/app/app.js +22 -2
  44. package/apps/public-explorer/public/app/template.js +4 -4
  45. package/apps/public-explorer/public/app/translations.js +29 -29
  46. package/apps/public-explorer/src/server.ts +11 -1
  47. package/config/silicaclaw-defaults.json +19 -0
  48. package/dist/apps/local-console/src/server.d.ts +1 -0
  49. package/dist/apps/local-console/src/server.js +555 -0
  50. package/docs/NEW_USER_INSTALL.md +14 -10
  51. package/docs/NEW_USER_OPERATIONS.md +9 -9
  52. package/docs/OPENCLAW_BRIDGE.md +22 -7
  53. package/docs/OPENCLAW_BRIDGE_ZH.md +21 -6
  54. package/docs/RELEASE_CHECKLIST.md +95 -0
  55. package/node_modules/@silicaclaw/core/dist/config/silicaclaw-defaults.json +19 -0
  56. package/node_modules/@silicaclaw/core/dist/packages/core/src/crypto.d.ts +6 -0
  57. package/node_modules/@silicaclaw/core/dist/packages/core/src/crypto.js +50 -0
  58. package/node_modules/@silicaclaw/core/dist/packages/core/src/directory.d.ts +17 -0
  59. package/node_modules/@silicaclaw/core/dist/packages/core/src/directory.js +145 -0
  60. package/node_modules/@silicaclaw/core/dist/packages/core/src/identity.d.ts +2 -0
  61. package/node_modules/@silicaclaw/core/dist/packages/core/src/identity.js +18 -0
  62. package/node_modules/@silicaclaw/core/dist/packages/core/src/index.d.ts +14 -0
  63. package/node_modules/@silicaclaw/core/dist/packages/core/src/index.js +30 -0
  64. package/node_modules/@silicaclaw/core/dist/packages/core/src/indexing.d.ts +6 -0
  65. package/node_modules/@silicaclaw/core/dist/packages/core/src/indexing.js +43 -0
  66. package/node_modules/@silicaclaw/core/dist/packages/core/src/presence.d.ts +4 -0
  67. package/node_modules/@silicaclaw/core/dist/packages/core/src/presence.js +23 -0
  68. package/node_modules/@silicaclaw/core/dist/packages/core/src/privateCrypto.d.ts +17 -0
  69. package/node_modules/@silicaclaw/core/dist/packages/core/src/privateCrypto.js +40 -0
  70. package/node_modules/@silicaclaw/core/dist/packages/core/src/privateMessage.d.ts +23 -0
  71. package/node_modules/@silicaclaw/core/dist/packages/core/src/privateMessage.js +74 -0
  72. package/node_modules/@silicaclaw/core/dist/packages/core/src/profile.d.ts +4 -0
  73. package/node_modules/@silicaclaw/core/dist/packages/core/src/profile.js +41 -0
  74. package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.d.ts +74 -0
  75. package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.js +106 -0
  76. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialConfig.d.ts +100 -0
  77. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialConfig.js +300 -0
  78. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialMessage.d.ts +19 -0
  79. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialMessage.js +69 -0
  80. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialResolver.d.ts +46 -0
  81. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialResolver.js +237 -0
  82. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialTemplate.d.ts +2 -0
  83. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialTemplate.js +90 -0
  84. package/node_modules/@silicaclaw/core/dist/packages/core/src/types.d.ts +99 -0
  85. package/node_modules/@silicaclaw/core/dist/packages/core/src/types.js +2 -0
  86. package/node_modules/@silicaclaw/core/src/index.ts +2 -0
  87. package/node_modules/@silicaclaw/core/src/privateCrypto.ts +57 -0
  88. package/node_modules/@silicaclaw/core/src/privateMessage.ts +101 -0
  89. package/node_modules/@silicaclaw/core/src/profile.ts +2 -0
  90. package/node_modules/@silicaclaw/core/src/publicProfileSummary.ts +7 -0
  91. package/node_modules/@silicaclaw/core/src/socialConfig.ts +7 -5
  92. package/node_modules/@silicaclaw/core/src/types.ts +44 -0
  93. package/node_modules/@silicaclaw/network/dist/config/silicaclaw-defaults.json +19 -0
  94. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/messageEnvelope.d.ts +28 -0
  95. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/messageEnvelope.js +36 -0
  96. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/peerDiscovery.d.ts +43 -0
  97. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/peerDiscovery.js +2 -0
  98. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/topicCodec.d.ts +4 -0
  99. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/topicCodec.js +2 -0
  100. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/transport.d.ts +36 -0
  101. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/transport.js +2 -0
  102. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.d.ts +5 -0
  103. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.js +24 -0
  104. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonTopicCodec.d.ts +5 -0
  105. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonTopicCodec.js +12 -0
  106. package/node_modules/@silicaclaw/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.d.ts +28 -0
  107. package/node_modules/@silicaclaw/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.js +144 -0
  108. package/node_modules/@silicaclaw/network/dist/packages/network/src/index.d.ts +14 -0
  109. package/node_modules/@silicaclaw/network/dist/packages/network/src/index.js +30 -0
  110. package/node_modules/@silicaclaw/network/dist/packages/network/src/localEventBus.d.ts +9 -0
  111. package/node_modules/@silicaclaw/network/dist/packages/network/src/localEventBus.js +47 -0
  112. package/node_modules/@silicaclaw/network/dist/packages/network/src/mock.d.ts +8 -0
  113. package/node_modules/@silicaclaw/network/dist/packages/network/src/mock.js +24 -0
  114. package/node_modules/@silicaclaw/network/dist/packages/network/src/realPreview.d.ts +105 -0
  115. package/node_modules/@silicaclaw/network/dist/packages/network/src/realPreview.js +331 -0
  116. package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.d.ts +178 -0
  117. package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.js +548 -0
  118. package/node_modules/@silicaclaw/network/dist/packages/network/src/transport/udpLanBroadcastTransport.d.ts +23 -0
  119. package/node_modules/@silicaclaw/network/dist/packages/network/src/transport/udpLanBroadcastTransport.js +154 -0
  120. package/node_modules/@silicaclaw/network/dist/packages/network/src/types.d.ts +10 -0
  121. package/node_modules/@silicaclaw/network/dist/packages/network/src/types.js +2 -0
  122. package/node_modules/@silicaclaw/network/dist/packages/network/src/webrtcPreview.d.ts +163 -0
  123. package/node_modules/@silicaclaw/network/dist/packages/network/src/webrtcPreview.js +848 -0
  124. package/node_modules/@silicaclaw/network/src/realPreview.ts +3 -2
  125. package/node_modules/@silicaclaw/network/src/relayPreview.ts +125 -12
  126. package/node_modules/@silicaclaw/network/src/transport/udpLanBroadcastTransport.ts +2 -1
  127. package/node_modules/@silicaclaw/network/src/types.ts +2 -0
  128. package/node_modules/@silicaclaw/network/src/webrtcPreview.ts +2 -1
  129. package/node_modules/@silicaclaw/storage/config/silicaclaw-defaults.json +19 -0
  130. package/node_modules/@silicaclaw/storage/dist/config/silicaclaw-defaults.json +19 -0
  131. package/node_modules/@silicaclaw/storage/dist/packages/core/src/crypto.d.ts +6 -0
  132. package/node_modules/@silicaclaw/storage/dist/packages/core/src/crypto.js +50 -0
  133. package/node_modules/@silicaclaw/storage/dist/packages/core/src/directory.d.ts +17 -0
  134. package/node_modules/@silicaclaw/storage/dist/packages/core/src/directory.js +145 -0
  135. package/node_modules/@silicaclaw/storage/dist/packages/core/src/identity.d.ts +2 -0
  136. package/node_modules/@silicaclaw/storage/dist/packages/core/src/identity.js +18 -0
  137. package/node_modules/@silicaclaw/storage/dist/packages/core/src/index.d.ts +14 -0
  138. package/node_modules/@silicaclaw/storage/dist/packages/core/src/index.js +30 -0
  139. package/node_modules/@silicaclaw/storage/dist/packages/core/src/indexing.d.ts +6 -0
  140. package/node_modules/@silicaclaw/storage/dist/packages/core/src/indexing.js +43 -0
  141. package/node_modules/@silicaclaw/storage/dist/packages/core/src/presence.d.ts +4 -0
  142. package/node_modules/@silicaclaw/storage/dist/packages/core/src/presence.js +23 -0
  143. package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateCrypto.d.ts +17 -0
  144. package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateCrypto.js +40 -0
  145. package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateMessage.d.ts +23 -0
  146. package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateMessage.js +74 -0
  147. package/node_modules/@silicaclaw/storage/dist/packages/core/src/profile.d.ts +4 -0
  148. package/node_modules/@silicaclaw/storage/dist/packages/core/src/profile.js +41 -0
  149. package/node_modules/@silicaclaw/storage/dist/packages/core/src/publicProfileSummary.d.ts +74 -0
  150. package/node_modules/@silicaclaw/storage/dist/packages/core/src/publicProfileSummary.js +106 -0
  151. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialConfig.d.ts +100 -0
  152. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialConfig.js +300 -0
  153. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialMessage.d.ts +19 -0
  154. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialMessage.js +69 -0
  155. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialResolver.d.ts +46 -0
  156. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialResolver.js +237 -0
  157. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialTemplate.d.ts +2 -0
  158. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialTemplate.js +90 -0
  159. package/node_modules/@silicaclaw/storage/dist/packages/core/src/types.d.ts +99 -0
  160. package/node_modules/@silicaclaw/storage/dist/packages/core/src/types.js +2 -0
  161. package/node_modules/@silicaclaw/storage/dist/packages/storage/config/silicaclaw-defaults.json +19 -0
  162. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/index.d.ts +3 -0
  163. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/index.js +19 -0
  164. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/jsonRepo.d.ts +7 -0
  165. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/jsonRepo.js +29 -0
  166. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/repos.d.ts +73 -0
  167. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/repos.js +85 -0
  168. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/socialRuntimeRepo.d.ts +5 -0
  169. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/socialRuntimeRepo.js +57 -0
  170. package/node_modules/@silicaclaw/storage/dist/socialRuntimeRepo.js +8 -4
  171. package/node_modules/@silicaclaw/storage/src/repos.ts +31 -1
  172. package/node_modules/@silicaclaw/storage/src/socialRuntimeRepo.ts +5 -4
  173. package/node_modules/@silicaclaw/storage/tsconfig.json +1 -6
  174. package/openclaw-skills/silicaclaw-bridge-setup/SKILL.md +165 -0
  175. package/openclaw-skills/silicaclaw-bridge-setup/VERSION +1 -0
  176. package/openclaw-skills/silicaclaw-bridge-setup/agents/openai.yaml +6 -0
  177. package/openclaw-skills/silicaclaw-bridge-setup/manifest.json +27 -0
  178. package/openclaw-skills/silicaclaw-bridge-setup/references/owner-dialogue-cheatsheet-zh.md +58 -0
  179. package/openclaw-skills/silicaclaw-bridge-setup/references/runtime-setup.md +43 -0
  180. package/openclaw-skills/silicaclaw-bridge-setup/references/troubleshooting.md +24 -0
  181. package/openclaw-skills/silicaclaw-broadcast/SKILL.md +150 -0
  182. package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -1
  183. package/openclaw-skills/silicaclaw-broadcast/agents/openai.yaml +2 -2
  184. package/openclaw-skills/silicaclaw-broadcast/manifest.json +4 -3
  185. package/openclaw-skills/silicaclaw-broadcast/references/owner-dialogue-cheatsheet-zh.md +81 -0
  186. package/openclaw-skills/silicaclaw-network-config/SKILL.md +158 -0
  187. package/openclaw-skills/silicaclaw-network-config/VERSION +1 -0
  188. package/openclaw-skills/silicaclaw-network-config/agents/openai.yaml +6 -0
  189. package/openclaw-skills/silicaclaw-network-config/manifest.json +27 -0
  190. package/openclaw-skills/silicaclaw-network-config/references/network-modes.md +22 -0
  191. package/openclaw-skills/silicaclaw-network-config/references/owner-dialogue-cheatsheet-zh.md +47 -0
  192. package/openclaw-skills/silicaclaw-network-config/references/public-discovery.md +22 -0
  193. package/openclaw-skills/silicaclaw-owner-push/SKILL.md +235 -0
  194. package/openclaw-skills/silicaclaw-owner-push/VERSION +1 -0
  195. package/openclaw-skills/silicaclaw-owner-push/agents/openai.yaml +6 -0
  196. package/openclaw-skills/silicaclaw-owner-push/manifest.json +30 -0
  197. package/openclaw-skills/silicaclaw-owner-push/references/owner-dialogue-cheatsheet-zh.md +87 -0
  198. package/openclaw-skills/silicaclaw-owner-push/references/push-routing-policy.md +43 -0
  199. package/openclaw-skills/silicaclaw-owner-push/references/runtime-setup.md +44 -0
  200. package/openclaw-skills/silicaclaw-owner-push/scripts/owner-push-forwarder.mjs +356 -0
  201. package/openclaw-skills/silicaclaw-owner-push/scripts/send-to-owner-via-openclaw.mjs +69 -0
  202. package/package.json +5 -1
  203. package/packages/core/dist/config/silicaclaw-defaults.json +19 -0
  204. package/packages/core/dist/packages/core/src/crypto.d.ts +6 -0
  205. package/packages/core/dist/packages/core/src/crypto.js +50 -0
  206. package/packages/core/dist/packages/core/src/directory.d.ts +17 -0
  207. package/packages/core/dist/packages/core/src/directory.js +145 -0
  208. package/packages/core/dist/packages/core/src/identity.d.ts +2 -0
  209. package/packages/core/dist/packages/core/src/identity.js +18 -0
  210. package/packages/core/dist/packages/core/src/index.d.ts +14 -0
  211. package/packages/core/dist/packages/core/src/index.js +30 -0
  212. package/packages/core/dist/packages/core/src/indexing.d.ts +6 -0
  213. package/packages/core/dist/packages/core/src/indexing.js +43 -0
  214. package/packages/core/dist/packages/core/src/presence.d.ts +4 -0
  215. package/packages/core/dist/packages/core/src/presence.js +23 -0
  216. package/packages/core/dist/packages/core/src/privateCrypto.d.ts +17 -0
  217. package/packages/core/dist/packages/core/src/privateCrypto.js +40 -0
  218. package/packages/core/dist/packages/core/src/privateMessage.d.ts +23 -0
  219. package/packages/core/dist/packages/core/src/privateMessage.js +74 -0
  220. package/packages/core/dist/packages/core/src/profile.d.ts +4 -0
  221. package/packages/core/dist/packages/core/src/profile.js +41 -0
  222. package/packages/core/dist/packages/core/src/publicProfileSummary.d.ts +74 -0
  223. package/packages/core/dist/packages/core/src/publicProfileSummary.js +106 -0
  224. package/packages/core/dist/packages/core/src/socialConfig.d.ts +100 -0
  225. package/packages/core/dist/packages/core/src/socialConfig.js +300 -0
  226. package/packages/core/dist/packages/core/src/socialMessage.d.ts +19 -0
  227. package/packages/core/dist/packages/core/src/socialMessage.js +69 -0
  228. package/packages/core/dist/packages/core/src/socialResolver.d.ts +46 -0
  229. package/packages/core/dist/packages/core/src/socialResolver.js +237 -0
  230. package/packages/core/dist/packages/core/src/socialTemplate.d.ts +2 -0
  231. package/packages/core/dist/packages/core/src/socialTemplate.js +90 -0
  232. package/packages/core/dist/packages/core/src/types.d.ts +99 -0
  233. package/packages/core/dist/packages/core/src/types.js +2 -0
  234. package/packages/core/src/index.ts +2 -0
  235. package/packages/core/src/privateCrypto.ts +57 -0
  236. package/packages/core/src/privateMessage.ts +101 -0
  237. package/packages/core/src/profile.ts +2 -0
  238. package/packages/core/src/publicProfileSummary.ts +7 -0
  239. package/packages/core/src/socialConfig.ts +7 -5
  240. package/packages/core/src/types.ts +44 -0
  241. package/packages/network/dist/config/silicaclaw-defaults.json +19 -0
  242. package/packages/network/dist/packages/network/src/abstractions/messageEnvelope.d.ts +28 -0
  243. package/packages/network/dist/packages/network/src/abstractions/messageEnvelope.js +36 -0
  244. package/packages/network/dist/packages/network/src/abstractions/peerDiscovery.d.ts +43 -0
  245. package/packages/network/dist/packages/network/src/abstractions/peerDiscovery.js +2 -0
  246. package/packages/network/dist/packages/network/src/abstractions/topicCodec.d.ts +4 -0
  247. package/packages/network/dist/packages/network/src/abstractions/topicCodec.js +2 -0
  248. package/packages/network/dist/packages/network/src/abstractions/transport.d.ts +36 -0
  249. package/packages/network/dist/packages/network/src/abstractions/transport.js +2 -0
  250. package/packages/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.d.ts +5 -0
  251. package/packages/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.js +24 -0
  252. package/packages/network/dist/packages/network/src/codec/jsonTopicCodec.d.ts +5 -0
  253. package/packages/network/dist/packages/network/src/codec/jsonTopicCodec.js +12 -0
  254. package/packages/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.d.ts +28 -0
  255. package/packages/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.js +144 -0
  256. package/packages/network/dist/packages/network/src/index.d.ts +14 -0
  257. package/packages/network/dist/packages/network/src/index.js +30 -0
  258. package/packages/network/dist/packages/network/src/localEventBus.d.ts +9 -0
  259. package/packages/network/dist/packages/network/src/localEventBus.js +47 -0
  260. package/packages/network/dist/packages/network/src/mock.d.ts +8 -0
  261. package/packages/network/dist/packages/network/src/mock.js +24 -0
  262. package/packages/network/dist/packages/network/src/realPreview.d.ts +105 -0
  263. package/packages/network/dist/packages/network/src/realPreview.js +331 -0
  264. package/packages/network/dist/packages/network/src/relayPreview.d.ts +178 -0
  265. package/packages/network/dist/packages/network/src/relayPreview.js +548 -0
  266. package/packages/network/dist/packages/network/src/transport/udpLanBroadcastTransport.d.ts +23 -0
  267. package/packages/network/dist/packages/network/src/transport/udpLanBroadcastTransport.js +154 -0
  268. package/packages/network/dist/packages/network/src/types.d.ts +10 -0
  269. package/packages/network/dist/packages/network/src/types.js +2 -0
  270. package/packages/network/dist/packages/network/src/webrtcPreview.d.ts +163 -0
  271. package/packages/network/dist/packages/network/src/webrtcPreview.js +848 -0
  272. package/packages/network/src/realPreview.ts +3 -2
  273. package/packages/network/src/relayPreview.ts +125 -12
  274. package/packages/network/src/transport/udpLanBroadcastTransport.ts +2 -1
  275. package/packages/network/src/types.ts +2 -0
  276. package/packages/network/src/webrtcPreview.ts +2 -1
  277. package/packages/storage/config/silicaclaw-defaults.json +19 -0
  278. package/packages/storage/dist/config/silicaclaw-defaults.json +19 -0
  279. package/packages/storage/dist/packages/core/src/crypto.d.ts +6 -0
  280. package/packages/storage/dist/packages/core/src/crypto.js +50 -0
  281. package/packages/storage/dist/packages/core/src/directory.d.ts +17 -0
  282. package/packages/storage/dist/packages/core/src/directory.js +145 -0
  283. package/packages/storage/dist/packages/core/src/identity.d.ts +2 -0
  284. package/packages/storage/dist/packages/core/src/identity.js +18 -0
  285. package/packages/storage/dist/packages/core/src/index.d.ts +14 -0
  286. package/packages/storage/dist/packages/core/src/index.js +30 -0
  287. package/packages/storage/dist/packages/core/src/indexing.d.ts +6 -0
  288. package/packages/storage/dist/packages/core/src/indexing.js +43 -0
  289. package/packages/storage/dist/packages/core/src/presence.d.ts +4 -0
  290. package/packages/storage/dist/packages/core/src/presence.js +23 -0
  291. package/packages/storage/dist/packages/core/src/privateCrypto.d.ts +17 -0
  292. package/packages/storage/dist/packages/core/src/privateCrypto.js +40 -0
  293. package/packages/storage/dist/packages/core/src/privateMessage.d.ts +23 -0
  294. package/packages/storage/dist/packages/core/src/privateMessage.js +74 -0
  295. package/packages/storage/dist/packages/core/src/profile.d.ts +4 -0
  296. package/packages/storage/dist/packages/core/src/profile.js +41 -0
  297. package/packages/storage/dist/packages/core/src/publicProfileSummary.d.ts +74 -0
  298. package/packages/storage/dist/packages/core/src/publicProfileSummary.js +106 -0
  299. package/packages/storage/dist/packages/core/src/socialConfig.d.ts +100 -0
  300. package/packages/storage/dist/packages/core/src/socialConfig.js +300 -0
  301. package/packages/storage/dist/packages/core/src/socialMessage.d.ts +19 -0
  302. package/packages/storage/dist/packages/core/src/socialMessage.js +69 -0
  303. package/packages/storage/dist/packages/core/src/socialResolver.d.ts +46 -0
  304. package/packages/storage/dist/packages/core/src/socialResolver.js +237 -0
  305. package/packages/storage/dist/packages/core/src/socialTemplate.d.ts +2 -0
  306. package/packages/storage/dist/packages/core/src/socialTemplate.js +90 -0
  307. package/packages/storage/dist/packages/core/src/types.d.ts +99 -0
  308. package/packages/storage/dist/packages/core/src/types.js +2 -0
  309. package/packages/storage/dist/packages/storage/config/silicaclaw-defaults.json +19 -0
  310. package/packages/storage/dist/packages/storage/src/index.d.ts +3 -0
  311. package/packages/storage/dist/packages/storage/src/index.js +19 -0
  312. package/packages/storage/dist/packages/storage/src/jsonRepo.d.ts +7 -0
  313. package/packages/storage/dist/packages/storage/src/jsonRepo.js +29 -0
  314. package/packages/storage/dist/packages/storage/src/repos.d.ts +73 -0
  315. package/packages/storage/dist/packages/storage/src/repos.js +85 -0
  316. package/packages/storage/dist/packages/storage/src/socialRuntimeRepo.d.ts +5 -0
  317. package/packages/storage/dist/packages/storage/src/socialRuntimeRepo.js +57 -0
  318. package/packages/storage/dist/socialRuntimeRepo.js +8 -4
  319. package/packages/storage/src/repos.ts +31 -1
  320. package/packages/storage/src/socialRuntimeRepo.ts +5 -4
  321. package/packages/storage/tsconfig.json +1 -6
  322. package/scripts/functional-check.mjs +35 -6
  323. package/scripts/install-openclaw-skill.mjs +9 -2
  324. package/scripts/openclaw-bridge-adapter.mjs +3 -1
  325. package/scripts/openclaw-bridge-client.mjs +3 -1
  326. package/scripts/openclaw-runtime-demo.mjs +3 -1
  327. package/scripts/quickstart.sh +14 -10
  328. package/scripts/release-pack.mjs +59 -1
  329. package/scripts/silicaclaw-cli.mjs +166 -51
  330. package/scripts/silicaclaw-gateway.mjs +410 -84
  331. package/scripts/validate-openclaw-skill.mjs +98 -21
@@ -7,6 +7,7 @@ export function bindAppEvents({
7
7
  parseCsv,
8
8
  profileController,
9
9
  pulseOverviewBroadcastStep,
10
+ clearUiCache,
10
11
  refreshAll,
11
12
  refreshLogs,
12
13
  refreshMessages,
@@ -30,6 +31,7 @@ export function bindAppEvents({
30
31
  t,
31
32
  toast,
32
33
  getSocialTemplate,
34
+ getQuickConnectDefaults,
33
35
  setAgentsPage,
34
36
  getSocialMessagesCache,
35
37
  toPrettyJson,
@@ -194,9 +196,12 @@ export function bindAppEvents({
194
196
  document.getElementById("broadcastNowBtn").addEventListener("click", () => runAction("/api/broadcast/now", t("actions.broadcastNow")));
195
197
 
196
198
  document.getElementById("quickGlobalPreviewBtn").addEventListener("click", async () => {
197
- const currentSignaling = window.prompt(t("feedback.promptSignalingUrl"), "http://localhost:4510");
199
+ const quickConnectDefaults = typeof getQuickConnectDefaults === "function"
200
+ ? getQuickConnectDefaults()
201
+ : { signalingUrl: "http://localhost:4510", room: "" };
202
+ const currentSignaling = window.prompt(t("feedback.promptSignalingUrl"), quickConnectDefaults.signalingUrl || "http://localhost:4510");
198
203
  if (!currentSignaling) return;
199
- const room = window.prompt(t("feedback.promptRoom"), "silicaclaw-global-preview") || "silicaclaw-global-preview";
204
+ const room = window.prompt(t("feedback.promptRoom"), quickConnectDefaults.room || "") || quickConnectDefaults.room || "";
200
205
  setFeedback("networkFeedback", t("feedback.crossPreviewEnabling"));
201
206
  try {
202
207
  const result = await api("/api/network/quick-connect-global-preview", {
@@ -223,6 +228,7 @@ export function bindAppEvents({
223
228
  document.getElementById("clearDiscoveryCacheBtn").addEventListener("click", async () => {
224
229
  try {
225
230
  await api("/api/cache/clear", { method: "POST" });
231
+ clearUiCache(["silicaclaw_ui_overview", "silicaclaw_ui_network", "silicaclaw_ui_social"]);
226
232
  setFeedback("networkFeedback", t("feedback.discoveryCacheCleared"));
227
233
  toast(t("feedback.discoveryCacheCleared"));
228
234
  setAgentsPage(1);
@@ -281,6 +287,59 @@ export function bindAppEvents({
281
287
  }
282
288
  });
283
289
 
290
+ document.getElementById("skillsBundledGrid").addEventListener("click", async (event) => {
291
+ const btn = event.target instanceof Element ? event.target.closest("[data-skill-install]") : null;
292
+ if (!btn) return;
293
+ const skillName = String(btn.getAttribute("data-skill-install") || "").trim();
294
+ if (!skillName) return;
295
+ btn.setAttribute("disabled", "true");
296
+ setFeedback("skillsFeedback", `${t("common.saving")} ${skillName}`);
297
+ try {
298
+ await api("/api/openclaw/bridge/skill-install", {
299
+ method: "POST",
300
+ body: JSON.stringify({ skill_name: skillName }),
301
+ });
302
+ setFeedback("skillsFeedback", t("feedback.openclawSkillInstalled"));
303
+ toast(`${t("feedback.openclawSkillInstalled")} · ${skillName}`);
304
+ await refreshSkills();
305
+ await refreshSocial();
306
+ } catch (e) {
307
+ setFeedback("skillsFeedback", e instanceof Error ? e.message : t("feedback.openclawSkillInstallFailed"), "error");
308
+ } finally {
309
+ btn.removeAttribute("disabled");
310
+ await refreshSkills().catch(() => {});
311
+ }
312
+ });
313
+
314
+ document.querySelectorAll("[data-skills-jump]").forEach((btn) => {
315
+ btn.addEventListener("click", () => {
316
+ const targetId = String(btn.getAttribute("data-skills-jump") || "").trim();
317
+ if (!targetId) return;
318
+ document.getElementById(targetId)?.scrollIntoView({ behavior: "smooth", block: "start" });
319
+ });
320
+ });
321
+
322
+ document.getElementById("skillsSearchInput").addEventListener("input", async (event) => {
323
+ socialController.setSkillsQuery(String(event.target?.value || ""));
324
+ await refreshSkills();
325
+ });
326
+
327
+ document.querySelectorAll("[data-skills-filter]").forEach((btn) => {
328
+ btn.addEventListener("click", async () => {
329
+ socialController.setSkillsFilter(String(btn.getAttribute("data-skills-filter") || "all"));
330
+ await refreshSkills();
331
+ });
332
+ });
333
+
334
+ document.querySelectorAll("#skillsBundledFooter, #skillsInstalledFooter, #skillsDialogueFooter").forEach((footer) => {
335
+ footer.addEventListener("click", async (event) => {
336
+ const btn = event.target instanceof Element ? event.target.closest("[data-skills-toggle]") : null;
337
+ if (!btn) return;
338
+ socialController.toggleSkillsExpanded(String(btn.getAttribute("data-skills-toggle") || ""));
339
+ await refreshSkills();
340
+ });
341
+ });
342
+
284
343
  document.getElementById("saveGovernanceBtn").addEventListener("click", async () => {
285
344
  setFeedback("socialGovernanceFeedback", t("common.saving"));
286
345
  try {
@@ -8,6 +8,27 @@ export function createNetworkController({
8
8
  toPrettyJson,
9
9
  writeUiCache,
10
10
  }) {
11
+ const fallbackQuickConnectDefaults = {
12
+ signalingUrl: "http://localhost:4510",
13
+ room: "",
14
+ };
15
+ let quickConnectDefaults = { ...fallbackQuickConnectDefaults };
16
+ let lastNetworkRenderKey = "";
17
+ let lastPeersRenderKey = "";
18
+ let lastDiscoveryRenderKey = "";
19
+
20
+ function queueState(value) {
21
+ const n = Number(value || 0);
22
+ if (n >= 100) return { tone: "danger", label: t("labels.queueHigh") };
23
+ if (n >= 20) return { tone: "warn", label: t("labels.queueWatch") };
24
+ return { tone: "ok", label: t("labels.queueHealthy") };
25
+ }
26
+
27
+ function queueBadge(value) {
28
+ const state = queueState(value);
29
+ return `<span class="pill ${state.tone}">${Number(value || 0)} · ${state.label}</span>`;
30
+ }
31
+
11
32
  async function refreshNetwork() {
12
33
  const [cfg, sts, rtp] = await Promise.all([api("/api/network/config"), api("/api/network/stats"), api("/api/runtime/paths")]);
13
34
  const c = cfg.data;
@@ -19,10 +40,36 @@ export function createNetworkController({
19
40
  const transportStats = s.adapter_transport_stats || {};
20
41
  const d = s.adapter_discovery_stats || {};
21
42
  const dx = s.adapter_diagnostics_summary || {};
43
+ const runtimeDiag = s.runtime_diagnostics || {};
44
+ const runtimeMemory = runtimeDiag.memory_mib || {};
45
+ const runtimeDirectory = runtimeDiag.directory || {};
46
+ const runtimeSocial = runtimeDiag.social || {};
22
47
  const ac = s.adapter_config || c.adapter_config || {};
48
+ quickConnectDefaults = {
49
+ signalingUrl: String(
50
+ dx.signaling_url ||
51
+ c.signaling_url ||
52
+ c.adapter_extra?.signaling_url ||
53
+ quickConnectDefaults.signalingUrl ||
54
+ fallbackQuickConnectDefaults.signalingUrl
55
+ ),
56
+ room: String(
57
+ dx.room ||
58
+ c.room ||
59
+ c.adapter_extra?.room ||
60
+ quickConnectDefaults.room ||
61
+ fallbackQuickConnectDefaults.room
62
+ ),
63
+ };
64
+ const relayCapable = c.adapter === "relay-preview" || c.adapter === "webrtc-preview";
65
+ const relayHealth = relayCapable
66
+ ? (dx.last_error ? t("network.degraded") : t("network.connected"))
67
+ : "-";
23
68
  document.getElementById("heroAdapter").textContent = c.adapter || "-";
24
- document.getElementById("heroRelay").textContent = dx.signaling_url || "-";
25
- document.getElementById("heroRoom").textContent = dx.room || "-";
69
+ const heroRelayEl = document.getElementById("heroRelay");
70
+ const heroRoomEl = document.getElementById("heroRoom");
71
+ if (heroRelayEl) heroRelayEl.textContent = dx.signaling_url || "-";
72
+ if (heroRoomEl) heroRoomEl.textContent = dx.room || "-";
26
73
 
27
74
  document.getElementById("pillAdapter").textContent = `${t("labels.adapter")}: ${c.adapter || "-"}`;
28
75
  writeUiCache("silicaclaw_ui_network", {
@@ -31,7 +78,7 @@ export function createNetworkController({
31
78
  heroRoomText: dx.room || "-",
32
79
  pillAdapterText: `${t("labels.adapter")}: ${c.adapter || "-"}`,
33
80
  });
34
- document.getElementById("networkCards").innerHTML = [
81
+ const networkCardsHtml = [
35
82
  [t("labels.adapter"), c.adapter],
36
83
  [t("labels.namespace"), c.namespace || "-"],
37
84
  [t("labels.port"), c.port ?? "-"],
@@ -47,14 +94,20 @@ export function createNetworkController({
47
94
  [t("network.sent"), msg.broadcast_total ?? 0],
48
95
  [t("network.peers"), p.total ?? 0],
49
96
  [t("network.onlinePeers"), p.online ?? 0],
97
+ ["RSS", runtimeMemory.rss ?? "-"],
98
+ ["Heap", runtimeMemory.heap_used ?? "-"],
99
+ ["Profiles", runtimeDirectory.profile_count ?? "-"],
100
+ ["Index keys", runtimeDirectory.index_key_count ?? "-"],
101
+ ["Messages", runtimeSocial.message_count ?? "-"],
102
+ ["Observations", runtimeSocial.observation_count ?? "-"],
50
103
  [t("network.activeWebrtcPeers"), dx.active_webrtc_peers ?? "-"],
51
104
  [t("network.reconnectAttempts"), dx.reconnect_attempts_total ?? "-"],
52
105
  [t("network.lastInbound"), ago(msg.last_message_at)],
53
106
  [t("network.lastOutbound"), ago(msg.last_broadcast_at)],
54
107
  ].map(([k, v]) => `<div class="card"><div class="label">${k}</div><div class="value" style="font-size:17px;">${v}</div></div>`).join("");
55
- document.getElementById("networkSummaryList").innerHTML = [
108
+ const networkSummaryHtml = [
56
109
  [t("labels.mode"), describeCurrentMode(t, c.mode || "lan")],
57
- [t("network.relayHealth"), dx.last_error ? t("network.degraded") : t("network.connected")],
110
+ [t("network.relayHealth"), relayHealth],
58
111
  [t("network.currentRelay"), dx.signaling_url || "-"],
59
112
  [t("network.currentRoom"), dx.room || "-"],
60
113
  [t("network.lastJoin"), ago(dx.last_join_at)],
@@ -65,7 +118,7 @@ export function createNetworkController({
65
118
 
66
119
  const comp = c.components || {};
67
120
  const lim = c.limits || {};
68
- document.getElementById("networkComponents").textContent = [
121
+ const networkComponentsText = [
69
122
  `demo_mode: ${c.demo_mode || "-"}`,
70
123
  `transport: ${comp.transport || "-"}`,
71
124
  `discovery: ${comp.discovery || "-"}`,
@@ -102,12 +155,39 @@ export function createNetworkController({
102
155
  `last_discovery_event_at: ${dx.last_discovery_event_at ? new Date(dx.last_discovery_event_at).toISOString() : "-"}`,
103
156
  ].join("\n");
104
157
 
105
- document.getElementById("networkConfigSnapshot").textContent = toPrettyJson({
158
+ const networkConfigSnapshotText = toPrettyJson({
106
159
  config: c,
107
160
  adapter_config: ac,
108
161
  runtime_paths: runtimePaths,
109
162
  });
110
- document.getElementById("networkStatsSnapshot").textContent = toPrettyJson({ stats: s });
163
+ const networkStatsSnapshotText = toPrettyJson({ stats: s });
164
+ const renderKey = JSON.stringify({
165
+ adapter: c.adapter || "",
166
+ mode: c.mode || "",
167
+ namespace: c.namespace || "",
168
+ port: c.port ?? null,
169
+ signaling_url: dx.signaling_url || "",
170
+ room: dx.room || "",
171
+ relay_health: relayHealth,
172
+ last_poll_at: dx.last_poll_at || 0,
173
+ last_publish_at: dx.last_publish_at || 0,
174
+ last_error: dx.last_error || "",
175
+ msg_received_total: msg.received_total ?? 0,
176
+ msg_broadcast_total: msg.broadcast_total ?? 0,
177
+ peers_total: p.total ?? 0,
178
+ peers_online: p.online ?? 0,
179
+ reconnect_attempts_total: dx.reconnect_attempts_total ?? 0,
180
+ active_webrtc_peers: dx.active_webrtc_peers ?? 0,
181
+ });
182
+ if (renderKey === lastNetworkRenderKey) {
183
+ return;
184
+ }
185
+ document.getElementById("networkCards").innerHTML = networkCardsHtml;
186
+ document.getElementById("networkSummaryList").innerHTML = networkSummaryHtml;
187
+ document.getElementById("networkComponents").textContent = networkComponentsText;
188
+ document.getElementById("networkConfigSnapshot").textContent = networkConfigSnapshotText;
189
+ document.getElementById("networkStatsSnapshot").textContent = networkStatsSnapshotText;
190
+ lastNetworkRenderKey = renderKey;
111
191
  }
112
192
 
113
193
  async function refreshPeers() {
@@ -115,8 +195,12 @@ export function createNetworkController({
115
195
  const peers = peerRes.data || {};
116
196
  const ds = statsRes.data?.adapter_discovery_stats || {};
117
197
  const summary = peers.diagnostics_summary || {};
118
-
119
- document.getElementById("peerCards").innerHTML = [
198
+ const peerItems = Array.isArray(peers.items) ? peers.items : [];
199
+ const relayQueueTotal = peerItems.reduce((sum, peer) => sum + Number(peer?.meta?.relay_queue_size || 0), 0);
200
+ const relayQueueMax = peerItems.reduce((max, peer) => Math.max(max, Number(peer?.meta?.relay_queue_size || 0)), 0);
201
+ const signalQueueTotal = peerItems.reduce((sum, peer) => sum + Number(peer?.meta?.signal_queue_size || 0), 0);
202
+ const signalQueueMax = peerItems.reduce((max, peer) => Math.max(max, Number(peer?.meta?.signal_queue_size || 0)), 0);
203
+ const peerCardsHtml = [
120
204
  [t("network.total"), peers.total || 0],
121
205
  [t("overview.online"), peers.online || 0],
122
206
  [t("network.stale"), peers.stale || 0],
@@ -131,26 +215,28 @@ export function createNetworkController({
131
215
  [t("network.seedPeers"), summary.seed_peers_count ?? 0],
132
216
  [t("network.discoveryEvents"), summary.discovery_events_total ?? 0],
133
217
  [t("network.activeWebrtcPeers"), summary.active_webrtc_peers ?? "-"],
218
+ ["Relay queue", queueBadge(relayQueueTotal)],
219
+ ["Max relay queue", queueBadge(relayQueueMax)],
220
+ ["Signal queue", queueBadge(signalQueueTotal)],
221
+ ["Max signal queue", queueBadge(signalQueueMax)],
134
222
  [t("network.observeCalls"), ds.observe_calls || 0],
135
223
  [t("network.heartbeats"), ds.heartbeat_sent || 0],
136
224
  [t("network.peersAdded"), ds.peers_added || 0],
137
225
  [t("network.peersRemoved"), ds.peers_removed || 0],
138
226
  ].map(([k, v]) => `<div class="card"><div class="label">${k}</div><div class="value" style="font-size:17px;">${v}</div></div>`).join("");
227
+ const peerStatsText = toPrettyJson({
228
+ discovery_stats: ds,
229
+ diagnostics_summary: summary,
230
+ adapter_stats: statsRes.data?.adapter_stats || {},
231
+ });
139
232
 
140
- if (!peers.items || !peers.items.length) {
141
- document.getElementById("peerTableWrap").innerHTML = `<div class="empty-state">${t("network.noPeersDiscovered")}</div>`;
142
- document.getElementById("peerStatsWrap").textContent = toPrettyJson({
143
- discovery_stats: ds,
144
- diagnostics_summary: summary,
145
- });
146
- return;
147
- }
148
-
149
- document.getElementById("peerTableWrap").innerHTML = `
233
+ const peerTableHtml = !peers.items || !peers.items.length
234
+ ? `<div class="empty-state">${t("network.noPeersDiscovered")}</div>`
235
+ : `
150
236
  <table class="table">
151
- <thead><tr><th>${t("network.peer")}</th><th>${t("network.status")}</th><th>${t("network.lastSeen")}</th><th>${t("network.staleSince")}</th><th>${t("network.messages")}</th><th>${t("network.firstSeen")}</th><th>${t("network.meta")}</th></tr></thead>
237
+ <thead><tr><th>${t("network.peer")}</th><th>${t("network.status")}</th><th>${t("network.lastSeen")}</th><th>${t("network.staleSince")}</th><th>${t("network.messages")}</th><th>${t("network.firstSeen")}</th><th>Relay Q</th><th>Signal Q</th><th>${t("network.meta")}</th></tr></thead>
152
238
  <tbody>
153
- ${peers.items.map((peer) => `
239
+ ${peerItems.map((peer) => `
154
240
  <tr>
155
241
  <td class="mono">${shortId(peer.peer_id)}</td>
156
242
  <td class="${peer.status === "online" ? "online" : peer.status === "offline" ? "offline" : "stale"}">${peerStatusText(peer.status)}</td>
@@ -158,25 +244,67 @@ export function createNetworkController({
158
244
  <td>${peer.stale_since_at ? ago(peer.stale_since_at) : "-"}</td>
159
245
  <td>${peer.messages_seen || 0}</td>
160
246
  <td>${new Date(peer.first_seen_at).toLocaleTimeString()}</td>
247
+ <td>${queueBadge(Number(peer?.meta?.relay_queue_size || 0))}</td>
248
+ <td>${queueBadge(Number(peer?.meta?.signal_queue_size || 0))}</td>
161
249
  <td class="mono">${peer.meta ? JSON.stringify(peer.meta) : "-"}</td>
162
250
  </tr>
163
251
  `).join("")}
164
252
  </tbody>
165
253
  </table>
166
254
  `;
167
- document.getElementById("peerStatsWrap").textContent = toPrettyJson({
168
- discovery_stats: ds,
169
- diagnostics_summary: summary,
170
- adapter_stats: statsRes.data?.adapter_stats || {},
255
+ const renderKey = JSON.stringify({
256
+ total: peers.total || 0,
257
+ online: peers.online || 0,
258
+ stale: peers.stale || 0,
259
+ namespace: peers.namespace || "",
260
+ summary: {
261
+ signaling_url: summary.signaling_url || "",
262
+ room: summary.room || "",
263
+ last_join_at: summary.last_join_at || 0,
264
+ last_poll_at: summary.last_poll_at || 0,
265
+ last_publish_at: summary.last_publish_at || 0,
266
+ last_error: summary.last_error || "",
267
+ },
268
+ ds: {
269
+ observe_calls: ds.observe_calls || 0,
270
+ heartbeat_sent: ds.heartbeat_sent || 0,
271
+ peers_added: ds.peers_added || 0,
272
+ peers_removed: ds.peers_removed || 0,
273
+ },
274
+ queues: {
275
+ relay_total: relayQueueTotal,
276
+ relay_max: relayQueueMax,
277
+ signal_total: signalQueueTotal,
278
+ signal_max: signalQueueMax,
279
+ },
280
+ items: peerItems
281
+ ? peerItems.map((peer) => [
282
+ peer.peer_id,
283
+ peer.status || "",
284
+ peer.last_seen_at || 0,
285
+ peer.stale_since_at || 0,
286
+ peer.messages_seen || 0,
287
+ peer.first_seen_at || 0,
288
+ Number(peer?.meta?.relay_queue_size || 0),
289
+ Number(peer?.meta?.signal_queue_size || 0),
290
+ peer.meta ? JSON.stringify(peer.meta) : "",
291
+ ])
292
+ : [],
171
293
  });
294
+ if (renderKey === lastPeersRenderKey) {
295
+ return;
296
+ }
297
+ document.getElementById("peerCards").innerHTML = peerCardsHtml;
298
+ document.getElementById("peerTableWrap").innerHTML = peerTableHtml;
299
+ document.getElementById("peerStatsWrap").textContent = peerStatsText;
300
+ lastPeersRenderKey = renderKey;
172
301
  }
173
302
 
174
303
  async function refreshDiscovery() {
175
304
  const eventsRes = await api("/api/discovery/events");
176
305
  const payload = eventsRes.data || {};
177
306
  const items = Array.isArray(payload.items) ? payload.items : [];
178
-
179
- document.getElementById("discoveryCards").innerHTML = [
307
+ const discoveryCardsHtml = [
180
308
  [t("labels.adapter"), payload.adapter || "-"],
181
309
  [t("labels.namespace"), payload.namespace || "-"],
182
310
  [t("network.eventsTotal"), payload.total ?? 0],
@@ -184,11 +312,9 @@ export function createNetworkController({
184
312
  [t("network.signalingEndpoints"), (payload.signaling_endpoints || []).length || 0],
185
313
  [t("network.seedPeers"), payload.seed_peers_count ?? 0],
186
314
  ].map(([k, v]) => `<div class="card"><div class="label">${k}</div><div class="value" style="font-size:17px;">${v}</div></div>`).join("");
187
-
188
- if (!items.length) {
189
- document.getElementById("discoveryEventList").innerHTML = `<div class="empty-state">${t("network.noDiscoveryEvents")}</div>`;
190
- } else {
191
- document.getElementById("discoveryEventList").innerHTML = items
315
+ const discoveryEventListHtml = !items.length
316
+ ? `<div class="empty-state">${t("network.noDiscoveryEvents")}</div>`
317
+ : items
192
318
  .slice()
193
319
  .reverse()
194
320
  .map((event) => `
@@ -199,12 +325,27 @@ export function createNetworkController({
199
325
  </div>
200
326
  `)
201
327
  .join("");
328
+ const discoverySnapshotText = toPrettyJson(payload);
329
+ const renderKey = JSON.stringify({
330
+ adapter: payload.adapter || "",
331
+ namespace: payload.namespace || "",
332
+ total: payload.total ?? 0,
333
+ last_event_at: payload.last_event_at || 0,
334
+ signaling_endpoints: payload.signaling_endpoints || [],
335
+ seed_peers_count: payload.seed_peers_count ?? 0,
336
+ items: items.map((event) => [event.type || "", event.peer_id || "", event.endpoint || "", event.detail || "", event.at || 0]),
337
+ });
338
+ if (renderKey === lastDiscoveryRenderKey) {
339
+ return;
202
340
  }
203
-
204
- document.getElementById("discoverySnapshot").textContent = toPrettyJson(payload);
341
+ document.getElementById("discoveryCards").innerHTML = discoveryCardsHtml;
342
+ document.getElementById("discoveryEventList").innerHTML = discoveryEventListHtml;
343
+ document.getElementById("discoverySnapshot").textContent = discoverySnapshotText;
344
+ lastDiscoveryRenderKey = renderKey;
205
345
  }
206
346
 
207
347
  return {
348
+ getQuickConnectDefaults: () => ({ ...quickConnectDefaults }),
208
349
  refreshDiscovery,
209
350
  refreshNetwork,
210
351
  refreshPeers,
@@ -7,6 +7,8 @@ export function createOverviewController({
7
7
  t,
8
8
  writeUiCache,
9
9
  }) {
10
+ let lastAgentsRenderKey = "";
11
+
10
12
  function renderOverviewGuide(overview, profile) {
11
13
  const hasDisplayName = Boolean(String(profile?.display_name || overview?.display_name || "").trim());
12
14
  const hasBio = Boolean(String(profile?.bio || "").trim());
@@ -64,12 +66,11 @@ export function createOverviewController({
64
66
  setOverviewMode,
65
67
  setVisibleRemotePublicCount,
66
68
  }) {
67
- const [overviewRes, discoveredRes, peerRes, profileRes, bridgeRes, networkCfgRes, networkStatsRes] = await Promise.allSettled([
69
+ const [overviewRes, discoveredRes, peerRes, profileRes, networkCfgRes, networkStatsRes] = await Promise.allSettled([
68
70
  api("/api/overview"),
69
71
  api("/api/search?q="),
70
72
  api("/api/peers"),
71
73
  api("/api/profile"),
72
- api("/api/openclaw/bridge"),
73
74
  api("/api/network/config"),
74
75
  api("/api/network/stats"),
75
76
  ]);
@@ -80,40 +81,17 @@ export function createOverviewController({
80
81
  const allProfiles = discoveredRes.status === "fulfilled" ? discoveredRes.value.data || [] : [];
81
82
  const peers = peerRes.status === "fulfilled" ? peerRes.value.data || {} : {};
82
83
  const currentProfile = profileRes.status === "fulfilled" ? profileRes.value.data || {} : {};
83
- const bridge = bridgeRes.status === "fulfilled" ? bridgeRes.value.data || {} : {};
84
84
  const networkCfg = networkCfgRes.status === "fulfilled" ? networkCfgRes.value.data || {} : {};
85
85
  const networkStats = networkStatsRes.status === "fulfilled" ? networkStatsRes.value.data || {} : {};
86
- const peerItems = peers.items || [];
87
- const mergedById = new Map();
88
-
89
- for (const agent of allProfiles) mergedById.set(agent.agent_id, agent);
90
-
91
- for (const peer of peerItems) {
92
- const existing = mergedById.get(peer.peer_id);
93
- if (existing) {
94
- if (peer.status && !existing.online) existing.online = peer.status === "online";
95
- if (peer.last_seen_at && (!existing.updated_at || peer.last_seen_at > existing.updated_at)) {
96
- existing.updated_at = peer.last_seen_at;
97
- }
98
- continue;
99
- }
100
- mergedById.set(peer.peer_id, {
101
- agent_id: peer.peer_id,
102
- display_name: shortId(peer.peer_id),
103
- online: peer.status === "online",
104
- updated_at: peer.last_seen_at || peer.first_seen_at || 0,
105
- });
106
- }
107
-
108
- const all = Array.from(mergedById.values());
86
+ const all = Array.isArray(allProfiles) ? allProfiles.slice() : [];
109
87
  const filtered = getOnlyShowOnline() ? all.filter((agent) => agent.online) : all;
110
88
  setVisibleRemotePublicCount(all.filter((agent) => !agent.is_self && agent.online).length);
111
89
  const totalAgentPages = Math.max(1, Math.ceil(filtered.length / 10));
112
90
  let agentsPage = Math.min(Math.max(1, getAgentsPage()), totalAgentPages);
113
91
  onPageChange(agentsPage);
114
92
  const pagedAgents = filtered.slice((agentsPage - 1) * 10, agentsPage * 10);
115
- const discoveredCount = Math.max(Number(o.discovered_count || 0), Number(peers.total || 0), all.length);
116
- const onlineCount = Math.max(Number(o.online_count || 0), Number(peers.online || 0), all.filter((agent) => agent.online).length);
93
+ const discoveredCount = Math.max(Number(o.discovered_count || 0), all.length);
94
+ const onlineCount = Math.max(Number(o.online_count || 0), all.filter((agent) => agent.online).length);
117
95
  const offlineCount = Math.max(0, discoveredCount - onlineCount);
118
96
 
119
97
  const overviewCardsHtml = [
@@ -130,22 +108,31 @@ export function createOverviewController({
130
108
  const snapshotHtml = `
131
109
  <div class="snapshot-card">
132
110
  <div class="snapshot-card__identity">
133
- <div class="snapshot-card__label">Current Node</div>
111
+ <div class="snapshot-card__label">${t("overview.snapshotCurrentNode")}</div>
134
112
  <div class="snapshot-card__title">${escapeHtml(o.display_name || t("overview.unnamed"))}</div>
135
113
  <div class="snapshot-card__subtle mono">${escapeHtml(o.agent_id || "-")}</div>
136
114
  </div>
137
115
  <div class="snapshot-card__grid">
138
- <div class="snapshot-card__item"><div class="label">Version</div><span class="value-inline">${escapeHtml(o.app_version || "-")}</span></div>
139
- <div class="snapshot-card__item"><div class="label">Public</div><span class="value-inline">${o.public_enabled ? t("common.on") : t("common.off")}</span></div>
140
- <div class="snapshot-card__item"><div class="label">Broadcast</div><span class="value-inline">${o.broadcast_enabled ? t("common.on") : t("common.off")}</span></div>
141
- <div class="snapshot-card__item"><div class="label">Last Broadcast</div><span class="value-inline">${escapeHtml(ago(o.last_broadcast_at))}</span></div>
116
+ <div class="snapshot-card__item"><div class="label">${t("overview.snapshotVersion")}</div><span class="value-inline">${escapeHtml(o.app_version || "-")}</span></div>
117
+ <div class="snapshot-card__item"><div class="label">${t("overview.snapshotPublic")}</div><span class="value-inline">${o.public_enabled ? t("common.on") : t("common.off")}</span></div>
118
+ <div class="snapshot-card__item"><div class="label">${t("overview.snapshotBroadcast")}</div><span class="value-inline">${o.broadcast_enabled ? t("common.on") : t("common.off")}</span></div>
119
+ <div class="snapshot-card__item"><div class="label">${t("overview.snapshotLastBroadcast")}</div><span class="value-inline">${escapeHtml(ago(o.last_broadcast_at))}</span></div>
142
120
  </div>
143
121
  </div>
144
122
  `;
145
123
  document.getElementById("snapshot").innerHTML = snapshotHtml;
124
+ const networkDiag = networkStats.adapter_diagnostics_summary || {};
146
125
  const heroModeText = o.social?.network_mode || "-";
126
+ const heroAdapterText = networkCfg.adapter || "-";
127
+ const heroRelayText = String(networkDiag.signaling_url || networkCfg.adapter_extra?.signaling_url || "-");
128
+ const heroRoomText = String(networkDiag.room || networkCfg.adapter_extra?.room || "-");
147
129
  setOverviewMode(heroModeText);
148
130
  document.getElementById("heroMode").textContent = heroModeText;
131
+ document.getElementById("heroAdapter").textContent = heroAdapterText;
132
+ const heroRelayEl = document.getElementById("heroRelay");
133
+ const heroRoomEl = document.getElementById("heroRoom");
134
+ if (heroRelayEl) heroRelayEl.textContent = heroRelayText;
135
+ if (heroRoomEl) heroRoomEl.textContent = heroRoomText;
149
136
  document.getElementById("overviewModeHint").textContent = t("overview.modeCurrentSource", {
150
137
  mode: describeCurrentMode(t, heroModeText),
151
138
  hint: t("overview.modeCacheHint"),
@@ -156,11 +143,11 @@ export function createOverviewController({
156
143
  document.getElementById("pillBroadcast").textContent = pillBroadcastText;
157
144
  document.getElementById("pillBroadcast").className = pillBroadcastClassName;
158
145
 
159
- const openclawRunning = !!bridge.openclaw_runtime?.running;
160
- const openclawDetected = !!bridge.openclaw_installation?.detected || openclawRunning || !!bridge.openclaw_runtime?.gateway_reachable;
161
- const skillInstalled = !!bridge.skill_learning?.installed;
146
+ const openclaw = o.openclaw || {};
147
+ const openclawRunning = !!openclaw.running;
148
+ const openclawDetected = !!openclaw.detected || openclawRunning;
149
+ const skillInstalled = !!openclaw.skill_installed;
162
150
  const globalMode = heroModeText === "global-preview";
163
- const networkDiag = networkStats.adapter_diagnostics_summary || {};
164
151
  const lastNetworkError = String(networkDiag.last_error || o.last_broadcast_error || "").trim();
165
152
  const broadcastHealthy = o.broadcast_enabled && !lastNetworkError;
166
153
  const roleKey = openclawRunning
@@ -189,7 +176,7 @@ export function createOverviewController({
189
176
  document.getElementById("homePriorityGrid").innerHTML = [
190
177
  [t("overview.homeOpenClaw"), openclawRunning ? t("overview.homeRunning") : openclawDetected ? t("overview.homeInstalledOnly") : t("overview.homeStopped"), openclawRunning ? t("overview.homeMetaRunning") : t("overview.homeMetaNotRunning")],
191
178
  [t("overview.homeGlobalMode"), globalMode ? t("overview.homeGlobalReady") : t("overview.homeNotGlobal"), globalMode ? t("overview.homeMetaGlobal") : t("overview.homeMetaNotGlobal")],
192
- [t("overview.homeBroadcastHealth"), broadcastHealthy ? t("overview.homeHealthy") : t("overview.homeDegraded"), lastNetworkError || `Last broadcast ${ago(o.last_broadcast_at)}`],
179
+ [t("overview.homeBroadcastHealth"), broadcastHealthy ? t("overview.homeHealthy") : t("overview.homeDegraded"), lastNetworkError || t("overview.lastBroadcastAgo", { value: ago(o.last_broadcast_at) })],
193
180
  [t("overview.homePeers"), String(all.filter((agent) => !agent.is_self && agent.online).length), t("overview.homeMetaPeers", { online: String(onlineCount), discovered: String(discoveredCount) })],
194
181
  ].map(([label, value, meta]) => `
195
182
  <div class="priority-card">
@@ -235,13 +222,25 @@ export function createOverviewController({
235
222
  if (!filtered.length) {
236
223
  const agentsCountHintText = t("overview.agentsZero");
237
224
  const agentsWrapHtml = `<div class="label">${t("overview.noDiscoveredAgents")}</div>`;
238
- document.getElementById("agentsCountHint").textContent = agentsCountHintText;
239
- document.getElementById("agentsWrap").innerHTML = agentsWrapHtml;
225
+ const renderKey = JSON.stringify({
226
+ state: "empty",
227
+ hint: agentsCountHintText,
228
+ page: agentsPage,
229
+ onlineOnly: getOnlyShowOnline(),
230
+ });
231
+ if (renderKey !== lastAgentsRenderKey) {
232
+ document.getElementById("agentsCountHint").textContent = agentsCountHintText;
233
+ document.getElementById("agentsWrap").innerHTML = agentsWrapHtml;
234
+ lastAgentsRenderKey = renderKey;
235
+ }
240
236
  writeUiCache("silicaclaw_ui_overview", {
241
237
  overviewCardsHtml,
242
238
  brandVersionText,
243
239
  snapshotText: snapshotHtml,
244
240
  heroModeText,
241
+ heroAdapterText,
242
+ heroRelayText,
243
+ heroRoomText,
245
244
  pillBroadcastText,
246
245
  pillBroadcastClassName,
247
246
  agentsCountHintText,
@@ -281,6 +280,9 @@ export function createOverviewController({
281
280
  ${renderTags(a)}
282
281
  </div>
283
282
  <div class="${a.online ? "online" : "offline"}">${a.online ? t("overview.online") : t("overview.offline")}</div>
283
+ <div class="agent-card__actions">
284
+ ${!a.is_self ? `<button class="secondary" type="button" data-private-agent="${escapeHtml(a.agent_id)}" data-private-name="${escapeHtml(a.display_name || "")}" data-private-key="${escapeHtml(a.private_encryption_public_key || "")}" ${a.private_encryption_public_key ? "" : "disabled title=\"Private messaging unavailable for this agent yet\""}>${t("actions.messageAgentPrivately")}</button>` : ""}
285
+ </div>
284
286
  <div class="agent-card__meta"><div class="agent-card__updated">${ago(a.updated_at)}</div></div>
285
287
  </div>
286
288
  `).join("")}
@@ -293,25 +295,45 @@ export function createOverviewController({
293
295
  </div>
294
296
  </div>
295
297
  `;
296
- document.getElementById("agentsCountHint").textContent = agentsCountHintText;
297
- document.getElementById("agentsWrap").innerHTML = agentsWrapHtml;
298
- document.getElementById("agentsPrevPageBtn")?.addEventListener("click", async () => {
299
- if (agentsPage <= 1) return;
300
- agentsPage -= 1;
301
- onPageChange(agentsPage);
302
- await refreshOverview({ getAgentsPage, getOnlyShowOnline, onPageChange, setOverviewMode, setVisibleRemotePublicCount });
303
- });
304
- document.getElementById("agentsNextPageBtn")?.addEventListener("click", async () => {
305
- if (agentsPage >= totalAgentPages) return;
306
- agentsPage += 1;
307
- onPageChange(agentsPage);
308
- await refreshOverview({ getAgentsPage, getOnlyShowOnline, onPageChange, setOverviewMode, setVisibleRemotePublicCount });
298
+ const renderKey = JSON.stringify({
299
+ state: "list",
300
+ hint: agentsCountHintText,
301
+ page: agentsPage,
302
+ totalPages: totalAgentPages,
303
+ onlineOnly: getOnlyShowOnline(),
304
+ items: pagedAgents.map((agent) => [
305
+ agent.agent_id,
306
+ agent.updated_at,
307
+ agent.online ? 1 : 0,
308
+ agent.display_name || "",
309
+ agent.bio || "",
310
+ ]),
309
311
  });
312
+ if (renderKey !== lastAgentsRenderKey) {
313
+ document.getElementById("agentsCountHint").textContent = agentsCountHintText;
314
+ document.getElementById("agentsWrap").innerHTML = agentsWrapHtml;
315
+ document.getElementById("agentsPrevPageBtn")?.addEventListener("click", async () => {
316
+ if (agentsPage <= 1) return;
317
+ agentsPage -= 1;
318
+ onPageChange(agentsPage);
319
+ await refreshOverview({ getAgentsPage, getOnlyShowOnline, onPageChange, setOverviewMode, setVisibleRemotePublicCount });
320
+ });
321
+ document.getElementById("agentsNextPageBtn")?.addEventListener("click", async () => {
322
+ if (agentsPage >= totalAgentPages) return;
323
+ agentsPage += 1;
324
+ onPageChange(agentsPage);
325
+ await refreshOverview({ getAgentsPage, getOnlyShowOnline, onPageChange, setOverviewMode, setVisibleRemotePublicCount });
326
+ });
327
+ lastAgentsRenderKey = renderKey;
328
+ }
310
329
  writeUiCache("silicaclaw_ui_overview", {
311
330
  overviewCardsHtml,
312
331
  brandVersionText,
313
332
  snapshotText: snapshotHtml,
314
333
  heroModeText,
334
+ heroAdapterText,
335
+ heroRelayText,
336
+ heroRoomText,
315
337
  pillBroadcastText,
316
338
  pillBroadcastClassName,
317
339
  agentsCountHintText,