@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
@@ -27,6 +27,7 @@ if (!root) {
27
27
  throw new Error("Missing root element: app-root");
28
28
  }
29
29
  root.innerHTML = appTemplate;
30
+ const APP_UPDATE_SESSION_KEY = 'silicaclaw_pending_updated_version';
30
31
 
31
32
  const i18n = createI18n(TRANSLATIONS);
32
33
  const DEFAULT_LOCALE = i18n.DEFAULT_LOCALE;
@@ -51,13 +52,15 @@ root.innerHTML = appTemplate;
51
52
  summary.setAttribute('data-i18n-closed-label', t('labels.show'));
52
53
  summary.setAttribute('data-i18n-open-label', t('labels.hide'));
53
54
  });
54
- setText('.sidebar-nav__label', t('common.control'));
55
+ setText('.nav-section__label', t('common.control'));
55
56
  setText('[data-tab="overview"] .tab-title', t('pageMeta.overview.title'));
56
57
  setText('[data-tab="overview"] .tab-copy', t('labels.overviewTabCopy'));
57
58
  setText('[data-tab="agent"] .tab-title', t('pageMeta.agent.title'));
58
59
  setText('[data-tab="agent"] .tab-copy', t('labels.agentTabCopy'));
59
60
  setText('[data-tab="chat"] .tab-title', t('pageMeta.chat.title'));
60
61
  setText('[data-tab="chat"] .tab-copy', t('labels.chatTabCopy'));
62
+ setText('[data-tab="private"] .tab-title', t('pageMeta.private.title'));
63
+ setText('[data-tab="private"] .tab-copy', t('labels.privateTabCopy'));
61
64
  setText('[data-tab="skills"] .tab-title', t('pageMeta.skills.title'));
62
65
  setText('[data-tab="skills"] .tab-copy', t('labels.skillsTabCopy'));
63
66
  setText('[data-tab="profile"] .tab-title', t('pageMeta.profile.title'));
@@ -70,6 +73,10 @@ root.innerHTML = appTemplate;
70
73
  document.getElementById('sidebarToggleBtn').setAttribute('aria-label', t('labels.collapseSidebar'));
71
74
  document.querySelector('.sidebar-version').title = t('common.version');
72
75
  setText('.sidebar-version__label', t('common.version'));
76
+ document.getElementById('brandUpdateHint').textContent = t('labels.versionChecking');
77
+ document.getElementById('brandRelayHint').textContent = t('labels.relayQueuesHealthy');
78
+ document.getElementById('brandCheckUpdateBtn').textContent = t('actions.checkUpdate');
79
+ document.getElementById('brandUpdateBtn').textContent = t('actions.updateNow');
73
80
  document.getElementById('integrationStatusBar').textContent = t('social.barStatus', {
74
81
  connected: '-',
75
82
  mode: '-',
@@ -103,22 +110,38 @@ root.innerHTML = appTemplate;
103
110
  document.getElementById('chatBannerBody').textContent = t('hints.chatBannerBody');
104
111
  document.getElementById('chatBannerFeedLabel').textContent = t('hints.chatBannerFeed');
105
112
  document.getElementById('chatComposerTitle').textContent = t('actions.sendPublicMessage');
113
+ document.getElementById('privateBannerEyebrow').textContent = t('pageMeta.private.title');
114
+ document.getElementById('privateBannerTitle').textContent = t('pageMeta.private.body');
115
+ document.getElementById('privateBannerBody').textContent = t('pageMeta.private.body');
116
+ document.getElementById('privateBannerStateLabel').textContent = t('labels.state');
117
+ document.getElementById('privateConversationsTitle').textContent = t('pageMeta.private.title');
118
+ document.getElementById('privateComposerTitle').textContent = t('actions.sendPrivateMessage');
119
+ document.getElementById('privateTargetLabel').textContent = t('labels.target');
120
+ document.getElementById('privateTargetIdLabel').textContent = t('social.agentId');
121
+ document.getElementById('privateMessageSendBtn').textContent = t('actions.sendPrivateMessage');
122
+ document.getElementById('privateRefreshBtn').textContent = t('actions.refreshPrivate');
106
123
  document.getElementById('chatFeedHint').textContent = t('hints.chatFeedHint');
107
124
  document.getElementById('overviewGuideTitle').textContent = t('overview.guideTitle');
108
125
  document.getElementById('overviewGuideBody').textContent = t('overview.guideBody');
126
+ document.getElementById('overviewGuideStatus').textContent = t('overview.guideNeedSetup');
109
127
  document.getElementById('overviewStepProfileEyebrow').textContent = t('overview.stepLabel', { step: '1' });
110
128
  document.getElementById('overviewStepProfileTitle').textContent = t('overview.stepProfileTitle');
111
129
  document.getElementById('overviewStepProfileBody').textContent = t('overview.stepProfileBody');
130
+ document.getElementById('overviewStepProfileStatus').textContent = t('overview.stepIncomplete');
112
131
  document.getElementById('overviewStepProfileBtn').textContent = t('actions.editProfile');
113
132
  document.getElementById('overviewStepPublicEyebrow').textContent = t('overview.stepLabel', { step: '2' });
114
133
  document.getElementById('overviewStepPublicTitle').textContent = t('overview.stepPublicTitle');
115
134
  document.getElementById('overviewStepPublicBody').textContent = t('overview.stepPublicBody');
135
+ document.getElementById('overviewStepPublicStatus').textContent = t('overview.stepIncomplete');
116
136
  document.getElementById('overviewStepPublicBtn').textContent = t('actions.editProfile');
117
137
  document.getElementById('overviewStepBroadcastEyebrow').textContent = t('overview.stepLabel', { step: '3' });
118
138
  document.getElementById('overviewStepBroadcastTitle').textContent = t('overview.stepBroadcastTitle');
119
139
  document.getElementById('overviewStepBroadcastBody').textContent = t('overview.stepBroadcastBody');
140
+ document.getElementById('overviewStepBroadcastStatus').textContent = t('overview.stepWaiting');
120
141
  document.getElementById('overviewStepBroadcastBtn').textContent = t('actions.broadcastNow');
121
142
  document.getElementById('homeMissionEyebrow').textContent = t('hints.homeMissionEyebrow');
143
+ document.getElementById('homeMissionTitle').textContent = t('hints.homeMissionTitle');
144
+ document.getElementById('homeMissionBody').textContent = t('hints.homeMissionBody');
122
145
  document.getElementById('homeBriefTitle').textContent = t('hints.homeBriefTitle');
123
146
  document.getElementById('homeOpenAgentBtn').textContent = t('actions.openAgent');
124
147
  document.getElementById('homeOpenSocialBtn').textContent = t('pageMeta.social.title');
@@ -156,7 +179,7 @@ root.innerHTML = appTemplate;
156
179
  setText('#view-profile .profile-meta h4', t('labels.publicCard'), 0);
157
180
  setText('#view-profile .profile-meta h4', t('labels.publishStatus'), 1);
158
181
  setText('#view-profile .profile-meta h4', t('labels.publicProfilePreview'), 2);
159
- setText('#view-profile .profile-meta .field-hint', t('hints.signedPublicProfileHint'));
182
+ setText('#view-profile .profile-meta .field-hint', t('hints.signedPublicProfileHint'), 1);
160
183
  setText('#view-network .section-header__eyebrow', t('labels.networkEyebrow'));
161
184
  document.getElementById('networkBannerTitle').textContent = t('hints.networkBannerTitle');
162
185
  document.getElementById('networkBannerBody').textContent = t('hints.networkBannerBody');
@@ -190,19 +213,47 @@ root.innerHTML = appTemplate;
190
213
  document.getElementById('skillsBannerTitle').textContent = t('hints.skillsBannerTitle');
191
214
  document.getElementById('skillsBannerBody').textContent = t('hints.skillsBannerBody');
192
215
  document.getElementById('skillsBannerRuntimeLabel').textContent = t('hints.skillsBannerRuntime');
216
+ document.getElementById('skillsBannerRuntimeValue').textContent = t('hints.skillsRuntimeChecking');
217
+ document.getElementById('skillsActionEyebrow').textContent = t('labels.skillsRecommendedAction');
218
+ document.getElementById('skillsActionTitle').textContent = t('hints.skillsActionInstallTitle');
219
+ document.getElementById('skillsActionBody').textContent = t('hints.skillsActionInstallBody');
220
+ document.getElementById('skillsActionState').textContent = t('labels.skillsStateReady');
221
+ document.getElementById('skillsJumpEyebrow').textContent = t('labels.skillsBrowseAreas');
222
+ document.getElementById('skillsJumpTitle').textContent = t('hints.skillsJumpTitle');
223
+ document.getElementById('skillsJumpFeatured').textContent = t('labels.skillsFeatured');
224
+ document.getElementById('skillsJumpBundled').textContent = t('labels.skillsBundled');
225
+ document.getElementById('skillsJumpInstalled').textContent = t('labels.skillsInstalled');
226
+ document.getElementById('skillsJumpDialogue').textContent = t('labels.skillsDialogue');
227
+ document.getElementById('skillsSearchLabel').textContent = t('labels.skillsSearch');
228
+ document.getElementById('skillsSearchInput').placeholder = t('placeholders.skillsSearch');
229
+ document.getElementById('skillsFilterAll').textContent = t('labels.skillsFilterAll');
230
+ document.getElementById('skillsFilterAttention').textContent = t('labels.skillsFilterAttention');
231
+ document.getElementById('skillsFilterUpdates').textContent = t('labels.skillsFilterUpdates');
232
+ document.getElementById('skillsFilterInstalled').textContent = t('labels.skillsFilterInstalled');
233
+ document.getElementById('skillsFilterMeta').textContent = t('hints.skillsFilterMeta', {
234
+ count: '0',
235
+ filter: t('labels.skillsFilterAll'),
236
+ });
193
237
  document.getElementById('skillsFeaturedTitle').textContent = t('labels.skillsFeatured');
194
238
  document.getElementById('skillsFeaturedHint').textContent = t('hints.skillsFeaturedHint');
195
239
  document.getElementById('skillsBundledTitle').textContent = t('labels.skillsBundled');
196
240
  document.getElementById('skillsBundledHint').textContent = t('hints.skillsBundledHint');
241
+ document.getElementById('skillsDialogueTitle').textContent = t('labels.skillsDialogue');
242
+ document.getElementById('skillsDialogueHint').textContent = t('hints.skillsDialogueHint');
197
243
  document.getElementById('skillsInstalledTitle').textContent = t('labels.skillsInstalled');
198
244
  document.getElementById('skillsInstalledHint').textContent = t('hints.skillsInstalledHint');
199
- document.getElementById('skillsInstallBtn').textContent = t('actions.learnOpenClawSkill');
245
+ document.getElementById('skillsInstallBtn').textContent = t('actions.installSilicaClawSkills');
200
246
  document.getElementById('socialIntegrationTitle').textContent = t('labels.integrationStatus');
201
247
  document.querySelector('#socialStatusLine').textContent = t('hints.checkingIntegration');
202
248
  document.getElementById('socialRuntimeSummaryTitle').textContent = t('labels.whatIsActive');
203
249
  document.getElementById('socialBridgeTitle').textContent = t('labels.identityBinding');
250
+ document.getElementById('socialCapabilityTitle').textContent = t('labels.ownerCommunicationCapabilities');
251
+ document.getElementById('socialCapabilityHint').textContent = t('hints.ownerCommunicationCapabilitiesHint');
204
252
  document.getElementById('socialOwnerDeliveryTitle').textContent = t('labels.ownerDelivery');
205
253
  document.getElementById('socialSkillLearningTitle').textContent = t('labels.openclawSkillLearning');
254
+ document.getElementById('socialMessagePathTitle').textContent = t('labels.messagePath');
255
+ document.getElementById('socialMessagePathHint').textContent = t('hints.socialMessagePathHint');
256
+ document.getElementById('socialOwnerDeliveryStatus').textContent = t('hints.checkingOwnerDelivery');
206
257
  document.getElementById('socialGovernanceTitle').textContent = t('labels.messageGovernance');
207
258
  document.getElementById('socialModerationTitle').textContent = t('labels.recentModeration');
208
259
  document.getElementById('socialAdvancedSummary').textContent = t('labels.advancedNetworkDetails');
@@ -224,6 +275,10 @@ root.innerHTML = appTemplate;
224
275
  setText('.hero-meta-item .label', t('labels.room'), 3);
225
276
  document.getElementById('publicDiscoveryHint').innerHTML = t('hints.publicDiscoverySwitch');
226
277
  document.getElementById('clearDiscoveryCacheBtn').textContent = t('actions.clearDiscoveryCache');
278
+ document.getElementById('overviewModeHint').textContent = t('overview.modeCurrentSource', {
279
+ mode: '-',
280
+ hint: t('overview.modeCacheHint'),
281
+ });
227
282
  document.getElementById('socialMessageTitle').textContent = t('overview.messageTitle');
228
283
  document.getElementById('socialMessageMeta').textContent = t('overview.messageMetaInitial');
229
284
  document.getElementById('socialMessageHint').textContent = t('overview.messageHint');
@@ -246,6 +301,7 @@ root.innerHTML = appTemplate;
246
301
  document.querySelector('label[for="governanceBlockedTermsInput"]').textContent = t('labels.blockedTerms');
247
302
  document.getElementById('startBroadcastBtn').textContent = t('actions.startBroadcast');
248
303
  document.getElementById('stopBroadcastBtn').textContent = t('actions.stopBroadcast');
304
+ document.getElementById('broadcastNowBtn').textContent = t('actions.broadcastNow');
249
305
  document.getElementById('quickGlobalPreviewBtn').textContent = t('actions.enablePreview');
250
306
  document.getElementById('refreshLogsBtn').textContent = t('actions.refreshLogs');
251
307
  document.getElementById('socialExportBtn').textContent = t('actions.exportTemplate');
@@ -268,6 +324,7 @@ root.innerHTML = appTemplate;
268
324
  const shell = createShellController({ resolveThemeMode, t });
269
325
  const {
270
326
  applyTheme,
327
+ clearUiCache,
271
328
  flashButton,
272
329
  hydrateCachedShell,
273
330
  peerStatusText,
@@ -279,6 +336,216 @@ root.innerHTML = appTemplate;
279
336
  toast,
280
337
  writeUiCache,
281
338
  } = shell;
339
+ let appUpdatePollTimer = null;
340
+ let appUpdateCheckInFlight = false;
341
+ let relayQueueCheckInFlight = false;
342
+ let lastRelayQueueCheckAt = 0;
343
+
344
+ function setAppUpdateUi({
345
+ hint,
346
+ buttonVisible = false,
347
+ buttonDisabled = false,
348
+ buttonText = t('actions.updateNow'),
349
+ checkVisible = false,
350
+ checkDisabled = false,
351
+ }) {
352
+ const hintEl = document.getElementById('brandUpdateHint');
353
+ const buttonEl = document.getElementById('brandUpdateBtn');
354
+ const checkEl = document.getElementById('brandCheckUpdateBtn');
355
+ if (hintEl) {
356
+ hintEl.textContent = hint;
357
+ hintEl.classList.toggle('hidden', !hint);
358
+ }
359
+ if (checkEl) {
360
+ checkEl.textContent = t('actions.checkUpdate');
361
+ checkEl.classList.toggle('hidden', !checkVisible);
362
+ checkEl.disabled = checkDisabled;
363
+ }
364
+ if (buttonEl) {
365
+ buttonEl.textContent = buttonText;
366
+ buttonEl.classList.toggle('hidden', !buttonVisible);
367
+ buttonEl.disabled = buttonDisabled;
368
+ }
369
+ }
370
+
371
+ function platformUpdateHint(platform) {
372
+ if (platform === 'darwin') return t('labels.versionPlatformMac');
373
+ if (platform === 'linux') return t('labels.versionPlatformLinux');
374
+ return t('labels.versionPlatformOther');
375
+ }
376
+
377
+ function setRelayQueueUi({ hint = '', tone = 'ok', visible = false }) {
378
+ const hintEl = document.getElementById('brandRelayHint');
379
+ if (!hintEl) return;
380
+ hintEl.textContent = hint;
381
+ hintEl.classList.toggle('hidden', !visible || !hint);
382
+ hintEl.classList.remove('warn', 'danger');
383
+ if (tone === 'warn' || tone === 'danger') {
384
+ hintEl.classList.add(tone);
385
+ }
386
+ }
387
+
388
+ async function refreshRelayQueueStatus({ force = false } = {}) {
389
+ const now = Date.now();
390
+ if (relayQueueCheckInFlight) return null;
391
+ if (!force && now - lastRelayQueueCheckAt < 15_000) return null;
392
+ relayQueueCheckInFlight = true;
393
+ try {
394
+ const result = await api('/api/peers');
395
+ const peers = result.data || {};
396
+ const peerItems = Array.isArray(peers.items) ? peers.items : [];
397
+ const relayQueueMax = peerItems.reduce((max, peer) => Math.max(max, Number(peer?.meta?.relay_queue_size || 0)), 0);
398
+ const signalQueueMax = peerItems.reduce((max, peer) => Math.max(max, Number(peer?.meta?.signal_queue_size || 0)), 0);
399
+ const queueMax = Math.max(relayQueueMax, signalQueueMax);
400
+ if (queueMax >= 100) {
401
+ setRelayQueueUi({ hint: t('labels.relayQueuesHigh'), tone: 'danger', visible: true });
402
+ } else if (queueMax >= 20) {
403
+ setRelayQueueUi({ hint: t('labels.relayQueuesWatch'), tone: 'warn', visible: true });
404
+ } else {
405
+ setRelayQueueUi({ hint: t('labels.relayQueuesHealthy'), tone: 'ok', visible: true });
406
+ }
407
+ lastRelayQueueCheckAt = now;
408
+ return { relayQueueMax, signalQueueMax };
409
+ } catch (_error) {
410
+ return null;
411
+ } finally {
412
+ relayQueueCheckInFlight = false;
413
+ }
414
+ }
415
+
416
+ async function refreshAppUpdateStatus({ silent = false } = {}) {
417
+ if (appUpdateCheckInFlight) return null;
418
+ appUpdateCheckInFlight = true;
419
+ try {
420
+ const result = await api('/api/app/update-status');
421
+ const status = result.data || {};
422
+ const currentVersion = String(status.current_version || '').trim();
423
+ const latestVersion = String(status.latest_version || '').trim();
424
+ const platformHint = platformUpdateHint(String(status.platform || ''));
425
+ if (currentVersion) {
426
+ document.getElementById('brandVersion').textContent = currentVersion.startsWith('v') ? currentVersion : `v${currentVersion}`;
427
+ }
428
+ if (status.update_available && status.latest_version) {
429
+ setAppUpdateUi({
430
+ hint: `${t('labels.versionUpdateReady', { version: `v${status.latest_version}` })} · ${platformHint}`,
431
+ buttonVisible: true,
432
+ buttonDisabled: false,
433
+ buttonText: t('actions.updateNowVersion', { version: latestVersion.startsWith('v') ? latestVersion : `v${latestVersion}` }),
434
+ checkVisible: true,
435
+ checkDisabled: false,
436
+ });
437
+ } else if (status.check_error) {
438
+ setAppUpdateUi({
439
+ hint: t('labels.versionCheckFailed'),
440
+ buttonVisible: false,
441
+ buttonDisabled: false,
442
+ buttonText: t('actions.updateNow'),
443
+ checkVisible: true,
444
+ checkDisabled: false,
445
+ });
446
+ if (!silent) {
447
+ setFeedback('networkFeedback', t('feedback.appUpdateCheckFailed'), 'warn');
448
+ }
449
+ } else {
450
+ setAppUpdateUi({
451
+ hint: `${t('labels.versionCurrent')} · ${platformHint}`,
452
+ buttonVisible: false,
453
+ buttonDisabled: false,
454
+ buttonText: t('actions.updateNow'),
455
+ checkVisible: true,
456
+ checkDisabled: false,
457
+ });
458
+ }
459
+ return status;
460
+ } catch (_error) {
461
+ setAppUpdateUi({
462
+ hint: t('labels.versionCheckFailed'),
463
+ buttonVisible: false,
464
+ buttonDisabled: false,
465
+ buttonText: t('actions.updateNow'),
466
+ checkVisible: true,
467
+ checkDisabled: false,
468
+ });
469
+ if (!silent) {
470
+ setFeedback('networkFeedback', t('feedback.appUpdateCheckFailed'), 'warn');
471
+ }
472
+ return null;
473
+ } finally {
474
+ appUpdateCheckInFlight = false;
475
+ }
476
+ }
477
+
478
+ function startAppUpdatePolling(targetVersion) {
479
+ if (appUpdatePollTimer) {
480
+ window.clearInterval(appUpdatePollTimer);
481
+ }
482
+ let attempts = 0;
483
+ appUpdatePollTimer = window.setInterval(async () => {
484
+ attempts += 1;
485
+ const status = await refreshAppUpdateStatus({ silent: true });
486
+ if (status && !status.update_available && String(status.current_version || '') === String(targetVersion || '')) {
487
+ window.clearInterval(appUpdatePollTimer);
488
+ appUpdatePollTimer = null;
489
+ if (targetVersion) {
490
+ window.sessionStorage.setItem(APP_UPDATE_SESSION_KEY, String(targetVersion));
491
+ }
492
+ window.location.reload();
493
+ return;
494
+ }
495
+ if (attempts >= 24) {
496
+ window.clearInterval(appUpdatePollTimer);
497
+ appUpdatePollTimer = null;
498
+ setAppUpdateUi({
499
+ hint: t('labels.versionCurrent'),
500
+ buttonVisible: false,
501
+ buttonDisabled: false,
502
+ buttonText: t('actions.updateNow'),
503
+ checkVisible: true,
504
+ checkDisabled: false,
505
+ });
506
+ }
507
+ }, 5000);
508
+ }
509
+
510
+ async function triggerAppUpdate() {
511
+ const buttonEl = document.getElementById('brandUpdateBtn');
512
+ setAppUpdateUi({
513
+ hint: t('labels.versionUpdating'),
514
+ buttonVisible: true,
515
+ buttonDisabled: true,
516
+ buttonText: t('labels.versionUpdating'),
517
+ checkVisible: true,
518
+ checkDisabled: true,
519
+ });
520
+ try {
521
+ const result = await api('/api/app/update', { method: 'POST' });
522
+ const data = result.data || {};
523
+ if (!data.started) {
524
+ setAppUpdateUi({
525
+ hint: t('labels.versionCurrent'),
526
+ buttonVisible: false,
527
+ buttonDisabled: false,
528
+ buttonText: t('actions.updateNow'),
529
+ checkVisible: true,
530
+ checkDisabled: false,
531
+ });
532
+ toast(t('feedback.appUpdateLatest'));
533
+ return;
534
+ }
535
+ toast(t('feedback.appUpdateStarted'));
536
+ startAppUpdatePolling(String(data.target_version || ''));
537
+ } catch (error) {
538
+ setAppUpdateUi({
539
+ hint: t('labels.versionCheckFailed'),
540
+ buttonVisible: true,
541
+ buttonDisabled: false,
542
+ buttonText: t('actions.updateNow'),
543
+ checkVisible: true,
544
+ checkDisabled: false,
545
+ });
546
+ setFeedback('networkFeedback', error instanceof Error ? error.message : t('feedback.appUpdateFailed'), 'error');
547
+ }
548
+ }
282
549
  setLocale(currentLocale);
283
550
  applyStaticTranslations();
284
551
 
@@ -292,6 +559,11 @@ root.innerHTML = appTemplate;
292
559
  let visibleRemotePublicCount = 0;
293
560
  let socialMessageFilter = 'all';
294
561
  let socialMessageGovernance = null;
562
+ let privateState = null;
563
+ let privateConversations = [];
564
+ let privateMessages = [];
565
+ let privateTarget = null;
566
+ let selectedPrivateConversationId = '';
295
567
  let overviewMode = 'lan';
296
568
  let onlyShowOnline = false;
297
569
  let agentsPage = 1;
@@ -375,7 +647,7 @@ root.innerHTML = appTemplate;
375
647
  }
376
648
  activeTab = tab;
377
649
  document.querySelectorAll('.tab').forEach((b) => b.classList.toggle('active', b.dataset.tab === tab));
378
- ['overview', 'agent', 'chat', 'skills', 'profile', 'network', 'social'].forEach((k) => {
650
+ ['overview', 'agent', 'chat', 'private', 'skills', 'profile', 'network', 'social'].forEach((k) => {
379
651
  document.getElementById(`view-${k}`).classList.toggle('active', k === tab);
380
652
  });
381
653
  const meta = pageMeta[tab] || pageMeta.overview;
@@ -387,6 +659,25 @@ root.innerHTML = appTemplate;
387
659
  document.getElementById('publicDiscoveryHint')?.classList.toggle('hidden', tab !== 'overview');
388
660
  if (tab === 'profile' && !profileController.isDirty() && !profileController.isSaving()) {
389
661
  refreshProfile().catch(() => {});
662
+ } else if (tab === 'overview') {
663
+ refreshOverview().catch(() => {});
664
+ refreshMessages().catch(() => {});
665
+ } else if (tab === 'agent') {
666
+ refreshOverview().catch(() => {});
667
+ } else if (tab === 'chat') {
668
+ refreshMessages().catch(() => {});
669
+ } else if (tab === 'private') {
670
+ refreshPrivate().catch(() => {});
671
+ } else if (tab === 'skills') {
672
+ refreshSkills().catch(() => {});
673
+ } else if (tab === 'network') {
674
+ refreshNetwork().catch(() => {});
675
+ refreshPeers().catch(() => {});
676
+ refreshDiscovery().catch(() => {});
677
+ refreshLogs().catch(() => {});
678
+ } else if (tab === 'social') {
679
+ refreshSocial().catch(() => {});
680
+ refreshMessages().catch(() => {});
390
681
  }
391
682
  }
392
683
 
@@ -400,26 +691,106 @@ root.innerHTML = appTemplate;
400
691
  });
401
692
  }
402
693
 
694
+ function renderPrivate() {
695
+ document.getElementById('privateStateMeta').textContent = privateState?.enabled
696
+ ? `${privateConversations.length} conversation(s)`
697
+ : 'Private messaging unavailable';
698
+ document.getElementById('privateTargetName').value = privateTarget?.display_name || '';
699
+ document.getElementById('privateTargetAgentId').value = privateTarget?.agent_id || '';
700
+ document.getElementById('privateConversationList').innerHTML = privateConversations.length
701
+ ? privateConversations.map((item) => `
702
+ <button class="agent-card" type="button" data-private-conversation="${escapeHtml(item.conversation_id)}">
703
+ <div class="agent-card__avatar-fallback">${escapeHtml(((item.peer_display_name || item.peer_agent_id || '?')[0] || '?').toUpperCase())}</div>
704
+ <div class="agent-card__main">
705
+ <div class="agent-card__row">
706
+ <div class="agent-card__name">${escapeHtml(item.peer_display_name || item.peer_agent_id || 'Unknown')}</div>
707
+ <div class="agent-card__id mono">${escapeHtml(shortId(item.peer_agent_id || ''))}</div>
708
+ </div>
709
+ </div>
710
+ </button>
711
+ `).join('')
712
+ : `<div class="empty-state">No private conversations yet.</div>`;
713
+ document.getElementById('privateMessageList').innerHTML = privateMessages.length
714
+ ? privateMessages.map((item) => `
715
+ <div class="log-item">
716
+ <div style="display:flex; align-items:center; justify-content:space-between; gap:12px;">
717
+ <div>
718
+ <strong>${item.is_self ? 'Me' : escapeHtml(privateTarget?.display_name || item.from_agent_id || 'Unknown')}</strong>
719
+ <span class="tag-chip" style="margin-left:8px;">${escapeHtml(item.delivery_status)}</span>
720
+ </div>
721
+ <div class="mono" style="color:#90a2c3;">${new Date(item.created_at).toLocaleString()}</div>
722
+ </div>
723
+ <div style="margin-top:8px; line-height:1.6;">${formatMessageBody(item.body || '')}</div>
724
+ </div>
725
+ `).join('')
726
+ : `<div class="empty-state">No private messages yet.</div>`;
727
+ }
728
+
729
+ async function refreshPrivate() {
730
+ const [stateRes, conversationsRes] = await Promise.all([
731
+ api('/api/private/state'),
732
+ api('/api/private/conversations'),
733
+ ]);
734
+ privateState = stateRes.data || null;
735
+ privateConversations = Array.isArray(conversationsRes.data) ? conversationsRes.data : [];
736
+ if ((!privateTarget || privateTarget.agent_id === privateState?.agent_id) && privateConversations[0]) {
737
+ const first = privateConversations[0];
738
+ privateTarget = {
739
+ agent_id: first.peer_agent_id,
740
+ display_name: first.peer_display_name,
741
+ private_encryption_public_key: first.peer_public_key,
742
+ };
743
+ selectedPrivateConversationId = first.conversation_id;
744
+ }
745
+ const selectedConversation = privateConversations.find((item) => item.conversation_id === selectedPrivateConversationId);
746
+ if (selectedConversation) {
747
+ privateTarget = {
748
+ agent_id: selectedConversation.peer_agent_id,
749
+ display_name: selectedConversation.peer_display_name,
750
+ private_encryption_public_key: selectedConversation.peer_public_key,
751
+ };
752
+ }
753
+ if (selectedPrivateConversationId) {
754
+ const messageRes = await api(`/api/private/messages?conversation_id=${encodeURIComponent(selectedPrivateConversationId)}&limit=100`);
755
+ privateMessages = Array.isArray(messageRes.data) ? messageRes.data : [];
756
+ } else {
757
+ privateMessages = [];
758
+ }
759
+ renderPrivate();
760
+ }
761
+
403
762
  const renderSocialMessages = socialController.renderSocialMessages;
404
763
  const refreshMessages = socialController.refreshMessages;
405
764
 
406
765
  const refreshNetwork = networkController.refreshNetwork;
407
766
  const refreshPeers = networkController.refreshPeers;
408
767
  const refreshDiscovery = networkController.refreshDiscovery;
768
+ const getQuickConnectDefaults = networkController.getQuickConnectDefaults;
409
769
 
410
770
  const refreshSocial = socialController.refreshSocial;
411
771
  const exportSocialTemplate = socialController.exportSocialTemplate;
412
772
  const renderLogs = socialController.renderLogs;
413
773
  const refreshLogs = socialController.refreshLogs;
414
774
  const refreshSkills = socialController.refreshSkills;
775
+ let autoRefreshInFlight = false;
415
776
 
416
- async function refreshAll() {
417
- const tasks = [refreshOverview(), refreshNetwork(), refreshSocial(), refreshSkills(), refreshPublicProfilePreview(), refreshMessages()];
418
- if (activeTab === 'network') {
419
- tasks.push(refreshPeers(), refreshDiscovery(), refreshLogs());
420
- }
421
- const shouldRefreshProfile = !(activeTab === 'profile' && profileController.isDirty());
422
- if (shouldRefreshProfile) {
777
+ async function refreshActiveView() {
778
+ const tasks = [refreshPublicProfilePreview(), refreshRelayQueueStatus()];
779
+ if (activeTab === 'overview') {
780
+ tasks.push(refreshOverview(), refreshMessages());
781
+ } else if (activeTab === 'agent') {
782
+ tasks.push(refreshOverview());
783
+ } else if (activeTab === 'chat') {
784
+ tasks.push(refreshMessages());
785
+ } else if (activeTab === 'private') {
786
+ tasks.push(refreshPrivate());
787
+ } else if (activeTab === 'skills') {
788
+ tasks.push(refreshSkills());
789
+ } else if (activeTab === 'network') {
790
+ tasks.push(refreshNetwork(), refreshPeers(), refreshDiscovery(), refreshLogs());
791
+ } else if (activeTab === 'social') {
792
+ tasks.push(refreshSocial(), refreshMessages());
793
+ } else if (activeTab === 'profile' && !profileController.isDirty() && !profileController.isSaving()) {
423
794
  tasks.push(refreshProfile());
424
795
  }
425
796
  const results = await Promise.allSettled(tasks);
@@ -429,6 +800,22 @@ root.innerHTML = appTemplate;
429
800
  }
430
801
  }
431
802
 
803
+ async function refreshAuto() {
804
+ if (document.hidden || autoRefreshInFlight) {
805
+ return;
806
+ }
807
+ autoRefreshInFlight = true;
808
+ try {
809
+ await refreshActiveView();
810
+ } finally {
811
+ autoRefreshInFlight = false;
812
+ }
813
+ }
814
+
815
+ async function refreshAll() {
816
+ await refreshActiveView();
817
+ }
818
+
432
819
  bindAppEvents({
433
820
  api,
434
821
  applyTheme,
@@ -438,6 +825,7 @@ root.innerHTML = appTemplate;
438
825
  parseCsv,
439
826
  profileController,
440
827
  pulseOverviewBroadcastStep,
828
+ clearUiCache,
441
829
  refreshAll,
442
830
  refreshLogs,
443
831
  refreshMessages,
@@ -461,13 +849,99 @@ root.innerHTML = appTemplate;
461
849
  t,
462
850
  toast,
463
851
  getSocialTemplate: () => socialTemplate,
852
+ getQuickConnectDefaults,
464
853
  setAgentsPage: (value) => { agentsPage = value; },
465
854
  getSocialMessagesCache: () => socialMessagesCache,
466
855
  toPrettyJson,
467
856
  });
468
857
 
858
+ document.getElementById('agentsWrap').addEventListener('click', (event) => {
859
+ const button = event.target?.closest?.('[data-private-agent]');
860
+ if (!button) return;
861
+ privateTarget = {
862
+ agent_id: String(button.getAttribute('data-private-agent') || ''),
863
+ display_name: String(button.getAttribute('data-private-name') || ''),
864
+ private_encryption_public_key: String(button.getAttribute('data-private-key') || ''),
865
+ };
866
+ selectedPrivateConversationId = [privateState?.agent_id || '', privateTarget.agent_id].sort().join(':');
867
+ switchTab('private');
868
+ });
869
+
870
+ document.getElementById('privateConversationList').addEventListener('click', async (event) => {
871
+ const button = event.target?.closest?.('[data-private-conversation]');
872
+ if (!button) return;
873
+ selectedPrivateConversationId = String(button.getAttribute('data-private-conversation') || '');
874
+ const selectedConversation = privateConversations.find((item) => item.conversation_id === selectedPrivateConversationId);
875
+ if (selectedConversation) {
876
+ privateTarget = {
877
+ agent_id: selectedConversation.peer_agent_id,
878
+ display_name: selectedConversation.peer_display_name,
879
+ private_encryption_public_key: selectedConversation.peer_public_key,
880
+ };
881
+ }
882
+ await refreshPrivate();
883
+ });
884
+
885
+ document.getElementById('privateRefreshBtn').addEventListener('click', async () => {
886
+ await refreshPrivate();
887
+ });
888
+
889
+ document.getElementById('privateMessageSendBtn').addEventListener('click', async () => {
890
+ const body = String(document.getElementById('privateMessageInput').value || '').trim();
891
+ if (!privateTarget?.agent_id || !privateTarget?.private_encryption_public_key) {
892
+ setFeedback('privateFeedback', 'Pick an agent with private messaging support first.', 'warn');
893
+ return;
894
+ }
895
+ if (privateTarget.agent_id === privateState?.agent_id) {
896
+ setFeedback('privateFeedback', 'Private messages must target another agent.', 'warn');
897
+ return;
898
+ }
899
+ if (!body) {
900
+ setFeedback('privateFeedback', t('feedback.messageEmpty'), 'warn');
901
+ return;
902
+ }
903
+ setFeedback('privateFeedback', 'Sending private message...');
904
+ try {
905
+ const result = await api('/api/private/messages/send', {
906
+ method: 'POST',
907
+ body: JSON.stringify({
908
+ to_agent_id: privateTarget.agent_id,
909
+ recipient_encryption_public_key: privateTarget.private_encryption_public_key,
910
+ body,
911
+ }),
912
+ });
913
+ document.getElementById('privateMessageInput').value = '';
914
+ setFeedback('privateFeedback', result.meta?.message || 'Private message sent.');
915
+ await refreshPrivate();
916
+ } catch (error) {
917
+ setFeedback('privateFeedback', error instanceof Error ? error.message : 'Private message failed.', 'error');
918
+ }
919
+ });
920
+
469
921
  applyTheme(localStorage.getItem('silicaclaw_theme_mode') || 'dark');
470
922
  hydrateCachedShell();
923
+ document.getElementById('brandUpdateBtn').addEventListener('click', () => {
924
+ triggerAppUpdate().catch(() => {});
925
+ });
926
+ document.getElementById('brandCheckUpdateBtn').addEventListener('click', () => {
927
+ refreshAppUpdateStatus().catch(() => {});
928
+ });
471
929
  refreshAll();
930
+ refreshAppUpdateStatus({ silent: true }).catch(() => {});
931
+ const updatedVersion = window.sessionStorage.getItem(APP_UPDATE_SESSION_KEY);
932
+ if (updatedVersion) {
933
+ window.sessionStorage.removeItem(APP_UPDATE_SESSION_KEY);
934
+ toast(t('feedback.appUpdatedTo', { version: updatedVersion.startsWith('v') ? updatedVersion : `v${updatedVersion}` }));
935
+ }
472
936
  exportSocialTemplate().catch(() => {});
473
- setInterval(refreshAll, 4000);
937
+ document.addEventListener('visibilitychange', () => {
938
+ if (!document.hidden) {
939
+ refreshAuto().catch(() => {});
940
+ refreshAppUpdateStatus({ silent: true }).catch(() => {});
941
+ refreshRelayQueueStatus({ force: true }).catch(() => {});
942
+ }
943
+ });
944
+ setInterval(refreshAuto, 4000);
945
+ setInterval(() => {
946
+ refreshAppUpdateStatus({ silent: true }).catch(() => {});
947
+ }, 15 * 60 * 1000);