@silicaclaw/cli 2026.3.19-9 → 2026.3.20-2

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 (278) hide show
  1. package/CHANGELOG.md +134 -0
  2. package/DEMO_GUIDE.md +1 -1
  3. package/INSTALL.md +47 -13
  4. package/README.md +54 -19
  5. package/VERSION +1 -1
  6. package/apps/local-console/dist/apps/local-console/src/server.d.ts +51 -12
  7. package/apps/local-console/dist/apps/local-console/src/server.js +619 -183
  8. package/apps/local-console/dist/config/silicaclaw-defaults.json +19 -0
  9. package/apps/local-console/dist/packages/core/src/socialConfig.js +9 -5
  10. package/apps/local-console/dist/packages/network/src/realPreview.js +6 -2
  11. package/apps/local-console/dist/packages/network/src/relayPreview.js +8 -2
  12. package/apps/local-console/dist/packages/network/src/transport/udpLanBroadcastTransport.js +2 -1
  13. package/apps/local-console/dist/packages/network/src/webrtcPreview.js +5 -1
  14. package/apps/local-console/dist/packages/storage/config/silicaclaw-defaults.json +19 -0
  15. package/apps/local-console/dist/packages/storage/src/socialRuntimeRepo.js +8 -4
  16. package/apps/local-console/public/app/app.js +21 -1
  17. package/apps/local-console/public/app/events.js +40 -2
  18. package/apps/local-console/public/app/network.js +32 -3
  19. package/apps/local-console/public/app/overview.js +18 -26
  20. package/apps/local-console/public/app/shell.js +18 -34
  21. package/apps/local-console/public/app/social.js +207 -28
  22. package/apps/local-console/public/app/styles.css +182 -14
  23. package/apps/local-console/public/app/template.js +76 -31
  24. package/apps/local-console/public/app/translations.js +147 -51
  25. package/apps/local-console/src/server.ts +652 -189
  26. package/apps/public-explorer/dist/apps/public-explorer/src/server.d.ts +1 -0
  27. package/apps/public-explorer/dist/apps/public-explorer/src/server.js +41 -0
  28. package/apps/public-explorer/dist/config/silicaclaw-defaults.json +19 -0
  29. package/apps/public-explorer/public/app/app.js +22 -2
  30. package/apps/public-explorer/public/app/template.js +4 -4
  31. package/apps/public-explorer/public/app/translations.js +15 -15
  32. package/apps/public-explorer/src/server.ts +11 -1
  33. package/config/silicaclaw-defaults.json +19 -0
  34. package/dist/apps/local-console/src/server.d.ts +1 -0
  35. package/dist/apps/local-console/src/server.js +555 -0
  36. package/docs/NEW_USER_INSTALL.md +14 -10
  37. package/docs/NEW_USER_OPERATIONS.md +4 -4
  38. package/docs/OPENCLAW_BRIDGE.md +15 -0
  39. package/docs/OPENCLAW_BRIDGE_ZH.md +15 -0
  40. package/docs/RELEASE_CHECKLIST.md +95 -0
  41. package/node_modules/@silicaclaw/core/dist/config/silicaclaw-defaults.json +19 -0
  42. package/node_modules/@silicaclaw/core/dist/packages/core/src/crypto.d.ts +6 -0
  43. package/node_modules/@silicaclaw/core/dist/packages/core/src/crypto.js +50 -0
  44. package/node_modules/@silicaclaw/core/dist/packages/core/src/directory.d.ts +17 -0
  45. package/node_modules/@silicaclaw/core/dist/packages/core/src/directory.js +145 -0
  46. package/node_modules/@silicaclaw/core/dist/packages/core/src/identity.d.ts +2 -0
  47. package/node_modules/@silicaclaw/core/dist/packages/core/src/identity.js +18 -0
  48. package/node_modules/@silicaclaw/core/dist/packages/core/src/index.d.ts +12 -0
  49. package/node_modules/@silicaclaw/core/dist/packages/core/src/index.js +28 -0
  50. package/node_modules/@silicaclaw/core/dist/packages/core/src/indexing.d.ts +6 -0
  51. package/node_modules/@silicaclaw/core/dist/packages/core/src/indexing.js +43 -0
  52. package/node_modules/@silicaclaw/core/dist/packages/core/src/presence.d.ts +4 -0
  53. package/node_modules/@silicaclaw/core/dist/packages/core/src/presence.js +23 -0
  54. package/node_modules/@silicaclaw/core/dist/packages/core/src/profile.d.ts +4 -0
  55. package/node_modules/@silicaclaw/core/dist/packages/core/src/profile.js +39 -0
  56. package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.d.ts +70 -0
  57. package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.js +103 -0
  58. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialConfig.d.ts +100 -0
  59. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialConfig.js +300 -0
  60. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialMessage.d.ts +19 -0
  61. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialMessage.js +69 -0
  62. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialResolver.d.ts +46 -0
  63. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialResolver.js +237 -0
  64. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialTemplate.d.ts +2 -0
  65. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialTemplate.js +90 -0
  66. package/node_modules/@silicaclaw/core/dist/packages/core/src/types.d.ts +59 -0
  67. package/node_modules/@silicaclaw/core/dist/packages/core/src/types.js +2 -0
  68. package/node_modules/@silicaclaw/core/src/socialConfig.ts +7 -5
  69. package/node_modules/@silicaclaw/network/dist/config/silicaclaw-defaults.json +19 -0
  70. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/messageEnvelope.d.ts +28 -0
  71. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/messageEnvelope.js +36 -0
  72. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/peerDiscovery.d.ts +43 -0
  73. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/peerDiscovery.js +2 -0
  74. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/topicCodec.d.ts +4 -0
  75. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/topicCodec.js +2 -0
  76. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/transport.d.ts +36 -0
  77. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/transport.js +2 -0
  78. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.d.ts +5 -0
  79. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.js +24 -0
  80. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonTopicCodec.d.ts +5 -0
  81. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonTopicCodec.js +12 -0
  82. package/node_modules/@silicaclaw/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.d.ts +28 -0
  83. package/node_modules/@silicaclaw/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.js +144 -0
  84. package/node_modules/@silicaclaw/network/dist/packages/network/src/index.d.ts +14 -0
  85. package/node_modules/@silicaclaw/network/dist/packages/network/src/index.js +30 -0
  86. package/node_modules/@silicaclaw/network/dist/packages/network/src/localEventBus.d.ts +9 -0
  87. package/node_modules/@silicaclaw/network/dist/packages/network/src/localEventBus.js +47 -0
  88. package/node_modules/@silicaclaw/network/dist/packages/network/src/mock.d.ts +8 -0
  89. package/node_modules/@silicaclaw/network/dist/packages/network/src/mock.js +24 -0
  90. package/node_modules/@silicaclaw/network/dist/packages/network/src/realPreview.d.ts +105 -0
  91. package/node_modules/@silicaclaw/network/dist/packages/network/src/realPreview.js +331 -0
  92. package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.d.ts +166 -0
  93. package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.js +448 -0
  94. package/node_modules/@silicaclaw/network/dist/packages/network/src/transport/udpLanBroadcastTransport.d.ts +23 -0
  95. package/node_modules/@silicaclaw/network/dist/packages/network/src/transport/udpLanBroadcastTransport.js +154 -0
  96. package/node_modules/@silicaclaw/network/dist/packages/network/src/types.d.ts +6 -0
  97. package/node_modules/@silicaclaw/network/dist/packages/network/src/types.js +2 -0
  98. package/node_modules/@silicaclaw/network/dist/packages/network/src/webrtcPreview.d.ts +163 -0
  99. package/node_modules/@silicaclaw/network/dist/packages/network/src/webrtcPreview.js +848 -0
  100. package/node_modules/@silicaclaw/network/src/realPreview.ts +3 -2
  101. package/node_modules/@silicaclaw/network/src/relayPreview.ts +5 -2
  102. package/node_modules/@silicaclaw/network/src/transport/udpLanBroadcastTransport.ts +2 -1
  103. package/node_modules/@silicaclaw/network/src/webrtcPreview.ts +2 -1
  104. package/node_modules/@silicaclaw/storage/config/silicaclaw-defaults.json +19 -0
  105. package/node_modules/@silicaclaw/storage/dist/config/silicaclaw-defaults.json +19 -0
  106. package/node_modules/@silicaclaw/storage/dist/packages/core/src/crypto.d.ts +6 -0
  107. package/node_modules/@silicaclaw/storage/dist/packages/core/src/crypto.js +50 -0
  108. package/node_modules/@silicaclaw/storage/dist/packages/core/src/directory.d.ts +17 -0
  109. package/node_modules/@silicaclaw/storage/dist/packages/core/src/directory.js +145 -0
  110. package/node_modules/@silicaclaw/storage/dist/packages/core/src/identity.d.ts +2 -0
  111. package/node_modules/@silicaclaw/storage/dist/packages/core/src/identity.js +18 -0
  112. package/node_modules/@silicaclaw/storage/dist/packages/core/src/index.d.ts +12 -0
  113. package/node_modules/@silicaclaw/storage/dist/packages/core/src/index.js +28 -0
  114. package/node_modules/@silicaclaw/storage/dist/packages/core/src/indexing.d.ts +6 -0
  115. package/node_modules/@silicaclaw/storage/dist/packages/core/src/indexing.js +43 -0
  116. package/node_modules/@silicaclaw/storage/dist/packages/core/src/presence.d.ts +4 -0
  117. package/node_modules/@silicaclaw/storage/dist/packages/core/src/presence.js +23 -0
  118. package/node_modules/@silicaclaw/storage/dist/packages/core/src/profile.d.ts +4 -0
  119. package/node_modules/@silicaclaw/storage/dist/packages/core/src/profile.js +39 -0
  120. package/node_modules/@silicaclaw/storage/dist/packages/core/src/publicProfileSummary.d.ts +70 -0
  121. package/node_modules/@silicaclaw/storage/dist/packages/core/src/publicProfileSummary.js +103 -0
  122. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialConfig.d.ts +100 -0
  123. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialConfig.js +300 -0
  124. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialMessage.d.ts +19 -0
  125. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialMessage.js +69 -0
  126. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialResolver.d.ts +46 -0
  127. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialResolver.js +237 -0
  128. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialTemplate.d.ts +2 -0
  129. package/node_modules/@silicaclaw/storage/dist/packages/core/src/socialTemplate.js +90 -0
  130. package/node_modules/@silicaclaw/storage/dist/packages/core/src/types.d.ts +59 -0
  131. package/node_modules/@silicaclaw/storage/dist/packages/core/src/types.js +2 -0
  132. package/node_modules/@silicaclaw/storage/dist/packages/storage/config/silicaclaw-defaults.json +19 -0
  133. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/index.d.ts +3 -0
  134. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/index.js +19 -0
  135. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/jsonRepo.d.ts +7 -0
  136. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/jsonRepo.js +29 -0
  137. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/repos.d.ts +61 -0
  138. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/repos.js +67 -0
  139. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/socialRuntimeRepo.d.ts +5 -0
  140. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/socialRuntimeRepo.js +57 -0
  141. package/node_modules/@silicaclaw/storage/dist/socialRuntimeRepo.js +8 -4
  142. package/node_modules/@silicaclaw/storage/src/socialRuntimeRepo.ts +5 -4
  143. package/node_modules/@silicaclaw/storage/tsconfig.json +1 -6
  144. package/openclaw-skills/silicaclaw-bridge-setup/SKILL.md +147 -0
  145. package/openclaw-skills/silicaclaw-bridge-setup/VERSION +1 -0
  146. package/openclaw-skills/silicaclaw-bridge-setup/agents/openai.yaml +6 -0
  147. package/openclaw-skills/silicaclaw-bridge-setup/manifest.json +27 -0
  148. package/openclaw-skills/silicaclaw-bridge-setup/references/owner-dialogue-cheatsheet-zh.md +58 -0
  149. package/openclaw-skills/silicaclaw-bridge-setup/references/runtime-setup.md +43 -0
  150. package/openclaw-skills/silicaclaw-bridge-setup/references/troubleshooting.md +24 -0
  151. package/openclaw-skills/silicaclaw-broadcast/SKILL.md +132 -0
  152. package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -1
  153. package/openclaw-skills/silicaclaw-broadcast/agents/openai.yaml +2 -2
  154. package/openclaw-skills/silicaclaw-broadcast/manifest.json +3 -2
  155. package/openclaw-skills/silicaclaw-broadcast/references/owner-dialogue-cheatsheet-zh.md +81 -0
  156. package/openclaw-skills/silicaclaw-owner-push/SKILL.md +217 -0
  157. package/openclaw-skills/silicaclaw-owner-push/VERSION +1 -0
  158. package/openclaw-skills/silicaclaw-owner-push/agents/openai.yaml +6 -0
  159. package/openclaw-skills/silicaclaw-owner-push/manifest.json +30 -0
  160. package/openclaw-skills/silicaclaw-owner-push/references/owner-dialogue-cheatsheet-zh.md +87 -0
  161. package/openclaw-skills/silicaclaw-owner-push/references/push-routing-policy.md +43 -0
  162. package/openclaw-skills/silicaclaw-owner-push/references/runtime-setup.md +41 -0
  163. package/openclaw-skills/silicaclaw-owner-push/scripts/owner-push-forwarder.mjs +214 -0
  164. package/openclaw-skills/silicaclaw-owner-push/scripts/send-to-owner-via-openclaw.mjs +69 -0
  165. package/package.json +5 -1
  166. package/packages/core/dist/config/silicaclaw-defaults.json +19 -0
  167. package/packages/core/dist/packages/core/src/crypto.d.ts +6 -0
  168. package/packages/core/dist/packages/core/src/crypto.js +50 -0
  169. package/packages/core/dist/packages/core/src/directory.d.ts +17 -0
  170. package/packages/core/dist/packages/core/src/directory.js +145 -0
  171. package/packages/core/dist/packages/core/src/identity.d.ts +2 -0
  172. package/packages/core/dist/packages/core/src/identity.js +18 -0
  173. package/packages/core/dist/packages/core/src/index.d.ts +12 -0
  174. package/packages/core/dist/packages/core/src/index.js +28 -0
  175. package/packages/core/dist/packages/core/src/indexing.d.ts +6 -0
  176. package/packages/core/dist/packages/core/src/indexing.js +43 -0
  177. package/packages/core/dist/packages/core/src/presence.d.ts +4 -0
  178. package/packages/core/dist/packages/core/src/presence.js +23 -0
  179. package/packages/core/dist/packages/core/src/profile.d.ts +4 -0
  180. package/packages/core/dist/packages/core/src/profile.js +39 -0
  181. package/packages/core/dist/packages/core/src/publicProfileSummary.d.ts +70 -0
  182. package/packages/core/dist/packages/core/src/publicProfileSummary.js +103 -0
  183. package/packages/core/dist/packages/core/src/socialConfig.d.ts +100 -0
  184. package/packages/core/dist/packages/core/src/socialConfig.js +300 -0
  185. package/packages/core/dist/packages/core/src/socialMessage.d.ts +19 -0
  186. package/packages/core/dist/packages/core/src/socialMessage.js +69 -0
  187. package/packages/core/dist/packages/core/src/socialResolver.d.ts +46 -0
  188. package/packages/core/dist/packages/core/src/socialResolver.js +237 -0
  189. package/packages/core/dist/packages/core/src/socialTemplate.d.ts +2 -0
  190. package/packages/core/dist/packages/core/src/socialTemplate.js +90 -0
  191. package/packages/core/dist/packages/core/src/types.d.ts +59 -0
  192. package/packages/core/dist/packages/core/src/types.js +2 -0
  193. package/packages/core/src/socialConfig.ts +7 -5
  194. package/packages/network/dist/config/silicaclaw-defaults.json +19 -0
  195. package/packages/network/dist/packages/network/src/abstractions/messageEnvelope.d.ts +28 -0
  196. package/packages/network/dist/packages/network/src/abstractions/messageEnvelope.js +36 -0
  197. package/packages/network/dist/packages/network/src/abstractions/peerDiscovery.d.ts +43 -0
  198. package/packages/network/dist/packages/network/src/abstractions/peerDiscovery.js +2 -0
  199. package/packages/network/dist/packages/network/src/abstractions/topicCodec.d.ts +4 -0
  200. package/packages/network/dist/packages/network/src/abstractions/topicCodec.js +2 -0
  201. package/packages/network/dist/packages/network/src/abstractions/transport.d.ts +36 -0
  202. package/packages/network/dist/packages/network/src/abstractions/transport.js +2 -0
  203. package/packages/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.d.ts +5 -0
  204. package/packages/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.js +24 -0
  205. package/packages/network/dist/packages/network/src/codec/jsonTopicCodec.d.ts +5 -0
  206. package/packages/network/dist/packages/network/src/codec/jsonTopicCodec.js +12 -0
  207. package/packages/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.d.ts +28 -0
  208. package/packages/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.js +144 -0
  209. package/packages/network/dist/packages/network/src/index.d.ts +14 -0
  210. package/packages/network/dist/packages/network/src/index.js +30 -0
  211. package/packages/network/dist/packages/network/src/localEventBus.d.ts +9 -0
  212. package/packages/network/dist/packages/network/src/localEventBus.js +47 -0
  213. package/packages/network/dist/packages/network/src/mock.d.ts +8 -0
  214. package/packages/network/dist/packages/network/src/mock.js +24 -0
  215. package/packages/network/dist/packages/network/src/realPreview.d.ts +105 -0
  216. package/packages/network/dist/packages/network/src/realPreview.js +331 -0
  217. package/packages/network/dist/packages/network/src/relayPreview.d.ts +166 -0
  218. package/packages/network/dist/packages/network/src/relayPreview.js +448 -0
  219. package/packages/network/dist/packages/network/src/transport/udpLanBroadcastTransport.d.ts +23 -0
  220. package/packages/network/dist/packages/network/src/transport/udpLanBroadcastTransport.js +154 -0
  221. package/packages/network/dist/packages/network/src/types.d.ts +6 -0
  222. package/packages/network/dist/packages/network/src/types.js +2 -0
  223. package/packages/network/dist/packages/network/src/webrtcPreview.d.ts +163 -0
  224. package/packages/network/dist/packages/network/src/webrtcPreview.js +848 -0
  225. package/packages/network/src/realPreview.ts +3 -2
  226. package/packages/network/src/relayPreview.ts +5 -2
  227. package/packages/network/src/transport/udpLanBroadcastTransport.ts +2 -1
  228. package/packages/network/src/webrtcPreview.ts +2 -1
  229. package/packages/storage/config/silicaclaw-defaults.json +19 -0
  230. package/packages/storage/dist/config/silicaclaw-defaults.json +19 -0
  231. package/packages/storage/dist/packages/core/src/crypto.d.ts +6 -0
  232. package/packages/storage/dist/packages/core/src/crypto.js +50 -0
  233. package/packages/storage/dist/packages/core/src/directory.d.ts +17 -0
  234. package/packages/storage/dist/packages/core/src/directory.js +145 -0
  235. package/packages/storage/dist/packages/core/src/identity.d.ts +2 -0
  236. package/packages/storage/dist/packages/core/src/identity.js +18 -0
  237. package/packages/storage/dist/packages/core/src/index.d.ts +12 -0
  238. package/packages/storage/dist/packages/core/src/index.js +28 -0
  239. package/packages/storage/dist/packages/core/src/indexing.d.ts +6 -0
  240. package/packages/storage/dist/packages/core/src/indexing.js +43 -0
  241. package/packages/storage/dist/packages/core/src/presence.d.ts +4 -0
  242. package/packages/storage/dist/packages/core/src/presence.js +23 -0
  243. package/packages/storage/dist/packages/core/src/profile.d.ts +4 -0
  244. package/packages/storage/dist/packages/core/src/profile.js +39 -0
  245. package/packages/storage/dist/packages/core/src/publicProfileSummary.d.ts +70 -0
  246. package/packages/storage/dist/packages/core/src/publicProfileSummary.js +103 -0
  247. package/packages/storage/dist/packages/core/src/socialConfig.d.ts +100 -0
  248. package/packages/storage/dist/packages/core/src/socialConfig.js +300 -0
  249. package/packages/storage/dist/packages/core/src/socialMessage.d.ts +19 -0
  250. package/packages/storage/dist/packages/core/src/socialMessage.js +69 -0
  251. package/packages/storage/dist/packages/core/src/socialResolver.d.ts +46 -0
  252. package/packages/storage/dist/packages/core/src/socialResolver.js +237 -0
  253. package/packages/storage/dist/packages/core/src/socialTemplate.d.ts +2 -0
  254. package/packages/storage/dist/packages/core/src/socialTemplate.js +90 -0
  255. package/packages/storage/dist/packages/core/src/types.d.ts +59 -0
  256. package/packages/storage/dist/packages/core/src/types.js +2 -0
  257. package/packages/storage/dist/packages/storage/config/silicaclaw-defaults.json +19 -0
  258. package/packages/storage/dist/packages/storage/src/index.d.ts +3 -0
  259. package/packages/storage/dist/packages/storage/src/index.js +19 -0
  260. package/packages/storage/dist/packages/storage/src/jsonRepo.d.ts +7 -0
  261. package/packages/storage/dist/packages/storage/src/jsonRepo.js +29 -0
  262. package/packages/storage/dist/packages/storage/src/repos.d.ts +61 -0
  263. package/packages/storage/dist/packages/storage/src/repos.js +67 -0
  264. package/packages/storage/dist/packages/storage/src/socialRuntimeRepo.d.ts +5 -0
  265. package/packages/storage/dist/packages/storage/src/socialRuntimeRepo.js +57 -0
  266. package/packages/storage/dist/socialRuntimeRepo.js +8 -4
  267. package/packages/storage/src/socialRuntimeRepo.ts +5 -4
  268. package/packages/storage/tsconfig.json +1 -6
  269. package/scripts/functional-check.mjs +35 -6
  270. package/scripts/install-openclaw-skill.mjs +9 -2
  271. package/scripts/openclaw-bridge-adapter.mjs +3 -1
  272. package/scripts/openclaw-bridge-client.mjs +3 -1
  273. package/scripts/openclaw-runtime-demo.mjs +3 -1
  274. package/scripts/quickstart.sh +14 -10
  275. package/scripts/release-pack.mjs +59 -1
  276. package/scripts/silicaclaw-cli.mjs +162 -50
  277. package/scripts/silicaclaw-gateway.mjs +302 -84
  278. package/scripts/validate-openclaw-skill.mjs +79 -21
@@ -68,6 +68,7 @@ export function createSocialController({
68
68
 
69
69
  listEl.innerHTML = filteredMessages
70
70
  .map((item) => {
71
+ const visibleRemoteCount = getVisibleRemotePublicCount();
71
72
  const selfStatusChips = item.is_self
72
73
  ? `
73
74
  <span class="tag-chip" style="margin-left:8px;">${t("overview.selfMessagePublished")}</span>
@@ -77,7 +78,21 @@ export function createSocialController({
77
78
  ? t("overview.selfMessageRemoteObserved", { count: String(item.remote_observation_count) })
78
79
  : t("overview.selfMessageAwaitingObservation")
79
80
  }</span>
80
- <span class="tag-chip" style="margin-left:8px;">${t("overview.selfMessageRemoteVisible", { count: String(getVisibleRemotePublicCount()) })}</span>
81
+ <span class="tag-chip" style="margin-left:8px;">${t("overview.selfMessageRemoteVisible", { count: String(visibleRemoteCount) })}</span>
82
+ `
83
+ : "";
84
+ const selfDeliveryHint = item.is_self
85
+ ? `
86
+ <div style="margin-top:8px; color:#90a2c3;">
87
+ ${
88
+ item.remote_observation_count > 0
89
+ ? t("overview.selfMessageDeliveryObserved", {
90
+ count: String(item.remote_observation_count),
91
+ visible: String(visibleRemoteCount),
92
+ })
93
+ : t("overview.selfMessageDeliveryPending", { count: String(visibleRemoteCount) })
94
+ }
95
+ </div>
81
96
  `
82
97
  : "";
83
98
  const observationChip = item.remote_observation_count > 0
@@ -98,6 +113,7 @@ export function createSocialController({
98
113
  <div class="mono" style="color:#90a2c3;">${new Date(item.created_at).toLocaleString()}</div>
99
114
  </div>
100
115
  <div style="margin-top:8px; line-height:1.6;">${formatMessageBody(item.body || "")}</div>
116
+ ${selfDeliveryHint}
101
117
  </div>
102
118
  `;
103
119
  })
@@ -112,11 +128,12 @@ export function createSocialController({
112
128
  }
113
129
 
114
130
  async function refreshSocial() {
115
- const [socialRes, summaryRes, statusRes, networkCfgRes, governanceRes] = await Promise.all([
131
+ const [socialRes, summaryRes, statusRes, networkCfgRes, networkStatsRes, governanceRes] = await Promise.all([
116
132
  api("/api/social/config"),
117
133
  api("/api/social/integration-summary"),
118
134
  api("/api/integration/status"),
119
135
  api("/api/network/config"),
136
+ api("/api/network/stats"),
120
137
  api("/api/social/message-governance"),
121
138
  ]);
122
139
  const bridgeRes = await api("/api/openclaw/bridge");
@@ -126,6 +143,7 @@ export function createSocialController({
126
143
  const networkCfg = networkCfgRes.data || {};
127
144
  const bridge = bridgeRes.data || {};
128
145
  const governance = governanceRes.data || {};
146
+ const networkStats = networkStatsRes.data || {};
129
147
  const runtime = social.runtime || {};
130
148
  const config = social.social_config || {};
131
149
  const network = config.network || {};
@@ -137,6 +155,7 @@ export function createSocialController({
137
155
  const effectiveNamespace = networkCfg.namespace || runtimeNetwork.namespace || summary.current_namespace || "-";
138
156
  const effectiveRoom = effectiveAdapterExtra.room || runtimeNetwork.room || network.room || "-";
139
157
  const effectiveRelay = effectiveAdapterExtra.signaling_url || runtimeNetwork.signaling_url || network.signaling_url || "-";
158
+ const networkDiag = networkStats.adapter_diagnostics_summary || {};
140
159
  const discoverable = status.discoverable === true;
141
160
  const mode = effectiveMode;
142
161
  const summaryLine = status.status_line || summary.summary_line || `${summary.connected ? t("social.connectedToSilicaClaw") : t("social.notConnectedToSilicaClaw")} · ${discoverable ? t("social.discoverableInCurrentMode") : t("social.notDiscoverableInCurrentMode")} · ${t("social.usingMode", { mode })}`;
@@ -190,6 +209,17 @@ export function createSocialController({
190
209
  [t("social.reuseOpenClawIdentity"), summary.reused_openclaw_identity ? t("common.yes") : t("common.no")],
191
210
  ].map(([k, v]) => `<div class="card"><div class="label">${k}</div><div class="value" style="font-size:17px;">${v}</div></div>`).join("");
192
211
 
212
+ document.getElementById("socialMessagePathCards").innerHTML = [
213
+ [t("social.messageBroadcast"), bridge.message_broadcast_enabled ? t("common.on") : t("common.off")],
214
+ [t("social.publicDiscovery"), status.public_enabled ? t("common.on") : t("common.off")],
215
+ [t("social.namespace"), effectiveNamespace],
216
+ [t("labels.room"), effectiveRoom],
217
+ [t("labels.relay"), effectiveRelay],
218
+ [t("network.lastPoll"), networkDiag.last_poll_at ? new Date(networkDiag.last_poll_at).toLocaleTimeString() : "-"],
219
+ [t("network.lastPublish"), networkDiag.last_publish_at ? new Date(networkDiag.last_publish_at).toLocaleTimeString() : "-"],
220
+ [t("network.lastError"), networkDiag.last_error || t("network.none")],
221
+ ].map(([k, v]) => `<div class="card"><div class="label">${k}</div><div class="value" style="font-size:17px;">${escapeHtml(String(v))}</div></div>`).join("");
222
+
193
223
  const skillLearning = bridge.skill_learning || {};
194
224
  const ownerDelivery = bridge.owner_delivery || {};
195
225
  const installAction = skillLearning.install_action || {};
@@ -224,6 +254,12 @@ export function createSocialController({
224
254
  `${t("social.ownerForwardReady")}: ${ownerDelivery.ready ? t("common.yes") : t("common.no")}`,
225
255
  ].join(" · ");
226
256
  document.getElementById("socialOwnerDeliveryReason").textContent = ownerDeliveryBody;
257
+ document.getElementById("socialCapabilityCards").innerHTML = [
258
+ [t("socialCapability.publicBroadcast"), bridge.message_broadcast_enabled ? t("common.yes") : t("common.no")],
259
+ [t("socialCapability.monitorBroadcasts"), ownerDelivery.bridge_messages_readable ? t("common.yes") : t("common.no")],
260
+ [t("socialCapability.autoPushToOwner"), ownerDelivery.ready ? t("common.yes") : t("common.no")],
261
+ [t("socialCapability.ownerPrivateBoundary"), t("socialCapability.ownerPrivateBoundaryValue")],
262
+ ].map(([k, v]) => `<div class="card"><div class="label">${escapeHtml(String(k))}</div><div class="value" style="font-size:17px;">${escapeHtml(String(v))}</div></div>`).join("");
227
263
  document.getElementById("openclawSkillCards").innerHTML = [
228
264
  [t("social.openclawInstalled"), openclawDetected ? t("common.yes") : t("common.no")],
229
265
  [t("social.running"), openclawRunning ? t("common.yes") : t("common.no")],
@@ -370,12 +406,19 @@ export function createSocialController({
370
406
 
371
407
  function renderSkillCard(skill, options = {}) {
372
408
  const capabilities = Array.isArray(skill.capabilities) ? skill.capabilities.slice(0, 6) : [];
409
+ const updateAvailable = options.updateAvailable === true;
373
410
  const statusText = options.statusText || (skill.installed_in_openclaw ? t("common.yes") : t("hints.skillsNotInstalled"));
374
411
  const versionText = String(skill.version || "-");
375
412
  const bodyText = escapeHtml(String(skill.description || "-"));
376
- const installTone = skill.installed_in_openclaw || skill.install_mode === "workspace" || skill.install_mode === "legacy"
377
- ? "tag-chip emphasis"
378
- : "tag-chip muted";
413
+ const skillName = String(skill.name || "").trim();
414
+ const installable = options.installable === true && Boolean(skillName) && (!skill.installed_in_openclaw || updateAvailable);
415
+ const installedVersionText = escapeHtml(String(options.installedVersion || skill.installed_version || "-"));
416
+ const bundledVersionText = escapeHtml(String(options.bundledVersion || skill.bundled_version || skill.version || "-"));
417
+ const installTone = updateAvailable
418
+ ? "tag-chip warn"
419
+ : skill.installed_in_openclaw || skill.install_mode === "workspace" || skill.install_mode === "legacy"
420
+ ? "tag-chip emphasis"
421
+ : "tag-chip muted";
379
422
  const sourceText = escapeHtml(String(skill.source_path || skill.bundled_source_path || skill.installed_path || "-"));
380
423
  const locationText = escapeHtml(String(skill.installed_path || skill.manifest_path || "-"));
381
424
  return `
@@ -390,9 +433,18 @@ export function createSocialController({
390
433
  <div class="skill-card__body">${bodyText}</div>
391
434
  <div class="skill-card__tags">
392
435
  <span class="${installTone}">${escapeHtml(statusText)}</span>
436
+ ${updateAvailable ? `<span class="tag-chip warn">${t("labels.skillsUpdateAvailable")}</span>` : ""}
393
437
  ${capabilities.map((item) => `<span class="tag-chip">${escapeHtml(String(item))}</span>`).join("")}
394
438
  </div>
395
439
  <div class="skill-card__meta">
440
+ <div class="skill-card__meta-item">
441
+ <div class="skill-card__meta-label">${t("labels.skillsInstalledVersion")}</div>
442
+ <div class="skill-card__meta-value mono">${installedVersionText}</div>
443
+ </div>
444
+ <div class="skill-card__meta-item">
445
+ <div class="skill-card__meta-label">${t("labels.skillsBundledVersion")}</div>
446
+ <div class="skill-card__meta-value mono">${bundledVersionText}</div>
447
+ </div>
396
448
  <div class="skill-card__meta-item">
397
449
  <div class="skill-card__meta-label">${t("labels.skillsSource")}</div>
398
450
  <div class="skill-card__meta-value mono">${sourceText}</div>
@@ -402,6 +454,50 @@ export function createSocialController({
402
454
  <div class="skill-card__meta-value mono">${locationText}</div>
403
455
  </div>
404
456
  </div>
457
+ ${installable ? `
458
+ <div class="actions">
459
+ <button class="secondary skill-install-btn" type="button" data-skill-install="${escapeHtml(skillName)}">${updateAvailable ? t("actions.updateThisSkill") : t("actions.installThisSkill")}</button>
460
+ </div>
461
+ ` : ""}
462
+ </div>
463
+ `;
464
+ }
465
+
466
+ function setSkillActionCopy({ title, body, state }) {
467
+ document.getElementById("skillsActionTitle").textContent = title;
468
+ document.getElementById("skillsActionBody").textContent = body;
469
+ document.getElementById("skillsActionState").textContent = state;
470
+ }
471
+
472
+ function renderDialogueCard(skill) {
473
+ const sections = Array.isArray(skill.owner_dialogue_sections_zh) ? skill.owner_dialogue_sections_zh : [];
474
+ const examples = Array.isArray(skill.owner_dialogue_examples_zh) ? skill.owner_dialogue_examples_zh : [];
475
+ return `
476
+ <div class="skill-card">
477
+ <div class="skill-card__top">
478
+ <div>
479
+ <div class="skill-card__eyebrow">${escapeHtml(skill.display_name || skill.name || "Skill")}</div>
480
+ <div class="skill-card__title">${escapeHtml(t("labels.skillsDialogueExamples"))}</div>
481
+ </div>
482
+ <div class="skill-card__version mono">${escapeHtml(skill.version || "-")}</div>
483
+ </div>
484
+ <div class="skill-card__body">${escapeHtml(skill.description || "-")}</div>
485
+ <div class="skills-dialogue-list">
486
+ ${sections.length
487
+ ? sections.map((section) => `
488
+ <div class="skills-dialogue-group">
489
+ <div class="skills-dialogue-group__title">${escapeHtml(String(section.title || "-"))}</div>
490
+ <div class="skills-dialogue-group__items">
491
+ ${Array.isArray(section.items)
492
+ ? section.items.map((item) => `<div class="skills-dialogue-item">"${escapeHtml(String(item))}"</div>`).join("")
493
+ : ""}
494
+ </div>
495
+ </div>
496
+ `).join("")
497
+ : examples.length
498
+ ? examples.map((item) => `<div class="skills-dialogue-item">"${escapeHtml(String(item))}"</div>`).join("")
499
+ : `<div class="skills-empty">${t("hints.skillsNoDialogueExamples")}</div>`}
500
+ </div>
405
501
  </div>
406
502
  `;
407
503
  }
@@ -413,9 +509,29 @@ export function createSocialController({
413
509
  const openclaw = payload.openclaw || {};
414
510
  const summary = payload.summary || {};
415
511
  const installAction = payload.install_action || {};
416
- const featured = bundled[0] || null;
512
+ const broadcastSkill = bundled.find((item) => item.name === "silicaclaw-broadcast") || bundled[0] || null;
513
+ const ownerPushSkill = bundled.find((item) => item.name === "silicaclaw-owner-push") || null;
514
+ const featuredSkills = [broadcastSkill, ownerPushSkill].filter(Boolean);
417
515
  const openclawDetected = !!openclaw.detected;
418
516
  const openclawRunning = !!openclaw.running;
517
+ const allFeaturedInstalled = featuredSkills.length > 0 && featuredSkills.every((item) => item.installed_in_openclaw);
518
+ const installedFeaturedCount = featuredSkills.filter((item) => item.installed_in_openclaw).length;
519
+ const bundledUpdateCount = bundled.filter((item) => item.update_available).length;
520
+ const bundledSorted = [...bundled].sort((left, right) => {
521
+ const featuredLeft = featuredSkills.some((item) => item?.name === left.name) ? 1 : 0;
522
+ const featuredRight = featuredSkills.some((item) => item?.name === right.name) ? 1 : 0;
523
+ if (featuredLeft !== featuredRight) return featuredRight - featuredLeft;
524
+ const updateLeft = left.update_available ? 1 : 0;
525
+ const updateRight = right.update_available ? 1 : 0;
526
+ if (updateLeft !== updateRight) return updateRight - updateLeft;
527
+ const installLeft = left.installed_in_openclaw ? 1 : 0;
528
+ const installRight = right.installed_in_openclaw ? 1 : 0;
529
+ if (installLeft !== installRight) return installLeft - installRight;
530
+ return String(left.display_name || left.name || "").localeCompare(String(right.display_name || right.name || ""));
531
+ });
532
+ const installedSorted = [...installed].sort((left, right) =>
533
+ String(left.display_name || left.name || "").localeCompare(String(right.display_name || right.name || ""))
534
+ );
419
535
 
420
536
  document.getElementById("skillsBannerRuntimeValue").textContent = t("hints.skillsRuntimeSummary", {
421
537
  runtime: openclawRunning ? t("common.yes") : t("common.no"),
@@ -423,51 +539,114 @@ export function createSocialController({
423
539
  installed: String(summary.installed_count || 0),
424
540
  });
425
541
 
542
+ if (!openclawDetected) {
543
+ setSkillActionCopy({
544
+ title: t("hints.skillsActionMissingTitle"),
545
+ body: t("hints.skillsActionMissingBody"),
546
+ state: t("labels.skillsStateAttention"),
547
+ });
548
+ } else if (!openclawRunning) {
549
+ setSkillActionCopy({
550
+ title: t("hints.skillsActionStoppedTitle"),
551
+ body: t("hints.skillsActionStoppedBody"),
552
+ state: t("labels.skillsStateAttention"),
553
+ });
554
+ } else if (bundledUpdateCount > 0) {
555
+ setSkillActionCopy({
556
+ title: t("hints.skillsActionUpdateTitle", { count: String(bundledUpdateCount) }),
557
+ body: t("hints.skillsActionUpdateBody", { count: String(bundledUpdateCount) }),
558
+ state: t("labels.skillsStateAttention"),
559
+ });
560
+ } else if (allFeaturedInstalled) {
561
+ setSkillActionCopy({
562
+ title: t("hints.skillsActionCompleteTitle"),
563
+ body: t("hints.skillsActionCompleteBody"),
564
+ state: t("labels.skillsStateComplete"),
565
+ });
566
+ } else if (installedFeaturedCount > 0) {
567
+ setSkillActionCopy({
568
+ title: t("hints.skillsActionPartialTitle"),
569
+ body: t("hints.skillsActionPartialBody"),
570
+ state: t("labels.skillsStateInProgress"),
571
+ });
572
+ } else {
573
+ setSkillActionCopy({
574
+ title: t("hints.skillsActionInstallTitle"),
575
+ body: t("hints.skillsActionInstallBody"),
576
+ state: t("labels.skillsStateReady"),
577
+ });
578
+ }
579
+
426
580
  document.getElementById("skillsSummaryCards").innerHTML = [
427
581
  [t("labels.skillsBundled"), String(summary.bundled_count || 0)],
428
582
  [t("labels.skillsInstalled"), String(summary.installed_count || 0)],
429
- [t("social.openclawInstalled"), openclawDetected ? t("common.yes") : t("common.no")],
430
- [t("social.running"), openclawRunning ? t("common.yes") : t("common.no")],
431
- ].map(([k, v]) => `<div class="card"><div class="label">${k}</div><div class="value" style="font-size:17px;">${escapeHtml(v)}</div></div>`).join("");
583
+ [t("labels.skillsUpdates"), String(summary.update_available_count || 0)],
584
+ [t("labels.skillsBroadcastLearning"), broadcastSkill?.installed_in_openclaw ? t("common.yes") : t("common.no")],
585
+ [t("labels.skillsAutoPush"), ownerPushSkill?.installed_in_openclaw ? t("common.yes") : t("common.no")],
586
+ ].map(([k, v]) => `<div class="skills-summary-card"><div class="label">${k}</div><div class="value">${escapeHtml(v)}</div></div>`).join("");
432
587
 
433
- document.getElementById("skillsFeaturedSpotlight").innerHTML = featured
434
- ? `
588
+ document.getElementById("skillsFeaturedCount").textContent = `${featuredSkills.length}`;
589
+ document.getElementById("skillsBundledCount").textContent = `${bundled.length}`;
590
+ document.getElementById("skillsInstalledCount").textContent = `${installed.length}`;
591
+ document.getElementById("skillsDialogueCount").textContent = `${featuredSkills.length}`;
592
+
593
+ document.getElementById("skillsFeaturedSpotlights").innerHTML = featuredSkills.length
594
+ ? featuredSkills.map((skill) => `
435
595
  <div class="skills-spotlight">
436
- <div class="skill-card__eyebrow">${escapeHtml(openclaw.gateway_url || "OpenClaw skill")}</div>
437
- <div class="skills-spotlight__title">${escapeHtml(featured.display_name || featured.name)}</div>
438
- <div class="skills-spotlight__body">${escapeHtml(featured.description || "-")}</div>
596
+ <div class="skill-card__eyebrow">${escapeHtml(skill.name === "silicaclaw-owner-push" ? t("labels.skillsAutoPush") : t("labels.skillsBroadcastLearning"))}</div>
597
+ <div class="skills-spotlight__title">${escapeHtml(skill.display_name || skill.name)}</div>
598
+ <div class="skills-spotlight__body">${escapeHtml(skill.description || "-")}</div>
439
599
  <div class="skill-card__tags">
440
- <span class="${featured.installed_in_openclaw ? "tag-chip emphasis" : "tag-chip muted"}">${featured.installed_in_openclaw ? t("common.yes") : t("hints.skillsNotInstalled")}</span>
441
- ${(featured.capabilities || []).slice(0, 8).map((item) => `<span class="tag-chip">${escapeHtml(String(item))}</span>`).join("")}
600
+ <span class="${skill.update_available ? "tag-chip warn" : skill.installed_in_openclaw ? "tag-chip emphasis" : "tag-chip muted"}">${skill.update_available ? t("labels.skillsUpdateAvailable") : skill.installed_in_openclaw ? `${t("labels.skillsStatus")}: ${t("common.yes")}` : t("hints.skillsNotInstalled")}</span>
601
+ ${(skill.capabilities || []).slice(0, 8).map((item) => `<span class="tag-chip">${escapeHtml(String(item))}</span>`).join("")}
442
602
  </div>
443
603
  </div>
444
- `
604
+ `).join("")
445
605
  : `<div class="skills-empty">${t("hints.skillsNoBundled")}</div>`;
446
606
 
447
- document.getElementById("skillsBundledGrid").innerHTML = bundled.length
448
- ? bundled.map((skill) => renderSkillCard(skill, {
607
+ document.getElementById("skillsBundledGrid").innerHTML = bundledSorted.length
608
+ ? bundledSorted.map((skill) => renderSkillCard(skill, {
449
609
  eyebrow: skill.install_mode === "workspace" || skill.install_mode === "legacy" ? skill.install_mode : "bundled",
450
- statusText: skill.installed_in_openclaw ? `${t("labels.skillsStatus")}: ${t("common.yes")}` : t("hints.skillsNotInstalled"),
610
+ statusText: skill.update_available
611
+ ? t("labels.skillsUpdateAvailable")
612
+ : skill.installed_in_openclaw
613
+ ? `${t("labels.skillsStatus")}: ${t("common.yes")}`
614
+ : t("hints.skillsNotInstalled"),
615
+ installable: true,
616
+ updateAvailable: skill.update_available,
617
+ installedVersion: skill.installed_version,
618
+ bundledVersion: skill.version,
451
619
  })).join("")
452
620
  : `<div class="skills-empty">${t("hints.skillsNoBundled")}</div>`;
453
621
 
454
- document.getElementById("skillsInstalledGrid").innerHTML = installed.length
455
- ? installed.map((skill) => renderSkillCard(skill, {
622
+ document.getElementById("skillsInstalledGrid").innerHTML = installedSorted.length
623
+ ? installedSorted.map((skill) => renderSkillCard(skill, {
456
624
  eyebrow: skill.install_mode || "installed",
457
- statusText: `${t("labels.skillsStatus")}: ${escapeHtml(String(skill.install_mode || "-"))}`,
625
+ statusText: skill.update_available
626
+ ? t("labels.skillsUpdateAvailable")
627
+ : `${t("labels.skillsStatus")}: ${escapeHtml(String(skill.install_mode || "-"))}`,
628
+ updateAvailable: skill.update_available,
629
+ installedVersion: skill.version,
630
+ bundledVersion: skill.bundled_version,
458
631
  })).join("")
459
632
  : `<div class="skills-empty">${t("hints.skillsNoInstalled")}</div>`;
460
633
 
634
+ document.getElementById("skillsDialogueGrid").innerHTML = featuredSkills.length
635
+ ? featuredSkills.map((skill) => renderDialogueCard(skill)).join("")
636
+ : `<div class="skills-empty">${t("hints.skillsNoDialogueExamples")}</div>`;
637
+
461
638
  const installBtn = document.getElementById("skillsInstallBtn");
462
639
  installBtn.textContent = !openclawDetected
463
640
  ? t("actions.openclawNotInstalled")
464
641
  : !openclawRunning
465
642
  ? t("actions.openclawNotRunning")
466
- : featured?.installed_in_openclaw
467
- ? t("actions.openclawSkillLearned")
468
- : t("actions.learnOpenClawSkill");
469
- installBtn.disabled = !openclawDetected || !openclawRunning || !!featured?.installed_in_openclaw;
470
- document.getElementById("skillsFeedback").textContent = featured?.installed_in_openclaw
643
+ : bundledUpdateCount > 0
644
+ ? t("actions.updateSilicaClawSkills")
645
+ : allFeaturedInstalled
646
+ ? t("actions.silicaClawSkillsInstalled")
647
+ : t("actions.installSilicaClawSkills");
648
+ installBtn.disabled = !openclawDetected || !openclawRunning || (allFeaturedInstalled && bundledUpdateCount === 0);
649
+ document.getElementById("skillsFeedback").textContent = allFeaturedInstalled && bundledUpdateCount === 0
471
650
  ? t("feedback.openclawSkillInstalled")
472
651
  : installAction.recommended_command || t("common.ready");
473
652
  }
@@ -192,6 +192,33 @@
192
192
  stroke-linecap: round;
193
193
  stroke-linejoin: round;
194
194
  }
195
+ .skills-dialogue-list {
196
+ display: grid;
197
+ gap: 8px;
198
+ margin-top: 12px;
199
+ }
200
+ .skills-dialogue-group {
201
+ display: grid;
202
+ gap: 8px;
203
+ }
204
+ .skills-dialogue-group__title {
205
+ font-size: 12px;
206
+ font-weight: 700;
207
+ color: var(--text-strong);
208
+ letter-spacing: 0.01em;
209
+ }
210
+ .skills-dialogue-group__items {
211
+ display: grid;
212
+ gap: 8px;
213
+ }
214
+ .skills-dialogue-item {
215
+ padding: 10px 12px;
216
+ border-radius: 12px;
217
+ border: 1px solid color-mix(in srgb, var(--border) 74%, transparent);
218
+ background: color-mix(in srgb, var(--card-soft) 92%, transparent);
219
+ color: var(--text);
220
+ line-height: 1.5;
221
+ }
195
222
  .sidebar-shell__body {
196
223
  flex: 1 1 auto;
197
224
  min-height: 0;
@@ -803,9 +830,6 @@
803
830
  }
804
831
  .notice.show { display: block; }
805
832
  .integration-strip {
806
- position: sticky;
807
- top: 0;
808
- z-index: 9;
809
833
  margin-bottom: 4px;
810
834
  border: 1px solid color-mix(in srgb, var(--border) 82%, transparent);
811
835
  border-radius: 14px;
@@ -1846,8 +1870,7 @@
1846
1870
  grid-template-columns: minmax(0, 1.12fr) minmax(320px, 0.88fr);
1847
1871
  }
1848
1872
  .profile-layout > .card:last-child {
1849
- position: sticky;
1850
- top: 0;
1873
+ position: relative;
1851
1874
  }
1852
1875
  .profile-meta {
1853
1876
  border: 1px solid color-mix(in srgb, var(--border) 82%, transparent);
@@ -1894,6 +1917,11 @@
1894
1917
  color: var(--muted);
1895
1918
  border-style: dashed;
1896
1919
  }
1920
+ .tag-chip.warn {
1921
+ color: color-mix(in srgb, var(--warn) 84%, var(--text-strong));
1922
+ border-color: color-mix(in srgb, var(--warn) 34%, transparent);
1923
+ background: color-mix(in srgb, var(--warn) 14%, transparent);
1924
+ }
1897
1925
  .field-hint {
1898
1926
  margin-top: 4px;
1899
1927
  color: var(--muted);
@@ -1957,8 +1985,7 @@
1957
1985
  align-items: start;
1958
1986
  }
1959
1987
  .chat-compose-card {
1960
- position: sticky;
1961
- top: 12px;
1988
+ position: relative;
1962
1989
  }
1963
1990
  .chat-compose-card textarea {
1964
1991
  min-height: 220px;
@@ -1980,10 +2007,85 @@
1980
2007
  }
1981
2008
  .network-actions-card,
1982
2009
  .social-actions-card {
1983
- position: sticky;
1984
- top: 12px;
2010
+ position: relative;
1985
2011
  align-self: start;
1986
2012
  }
2013
+ .skills-topline {
2014
+ display: grid;
2015
+ gap: 10px;
2016
+ grid-template-columns: minmax(0, 1.18fr) minmax(280px, 0.82fr);
2017
+ margin-bottom: 10px;
2018
+ }
2019
+ .skills-action-card {
2020
+ display: grid;
2021
+ gap: 18px;
2022
+ grid-template-columns: minmax(0, 1fr) auto;
2023
+ align-items: center;
2024
+ border: 1px solid color-mix(in srgb, var(--accent) 28%, transparent);
2025
+ background:
2026
+ radial-gradient(circle at top left, color-mix(in srgb, var(--accent) 18%, transparent), transparent 36%),
2027
+ linear-gradient(180deg, color-mix(in srgb, var(--card-soft) 98%, transparent), color-mix(in srgb, var(--panel) 92%, transparent));
2028
+ }
2029
+ .skills-action-card__copy {
2030
+ display: grid;
2031
+ gap: 8px;
2032
+ }
2033
+ .skills-action-card__title {
2034
+ margin: 0;
2035
+ font-size: 24px;
2036
+ line-height: 1.15;
2037
+ color: var(--text-strong);
2038
+ }
2039
+ .skills-action-card__body {
2040
+ margin: 0;
2041
+ max-width: 720px;
2042
+ color: var(--text);
2043
+ line-height: 1.6;
2044
+ }
2045
+ .skills-action-card__side {
2046
+ display: grid;
2047
+ gap: 10px;
2048
+ min-width: 220px;
2049
+ justify-items: end;
2050
+ }
2051
+ .skills-action-card__side .actions {
2052
+ margin: 0;
2053
+ }
2054
+ .skills-action-card__state {
2055
+ display: inline-flex;
2056
+ align-items: center;
2057
+ justify-content: center;
2058
+ min-height: 36px;
2059
+ padding: 9px 12px;
2060
+ border-radius: 999px;
2061
+ border: 1px solid color-mix(in srgb, var(--border-strong) 84%, transparent);
2062
+ background: color-mix(in srgb, var(--panel) 86%, transparent);
2063
+ color: var(--text-strong);
2064
+ font-size: 12px;
2065
+ font-weight: 700;
2066
+ letter-spacing: 0.02em;
2067
+ text-align: center;
2068
+ }
2069
+ .skills-jump-card {
2070
+ display: grid;
2071
+ gap: 14px;
2072
+ }
2073
+ .skills-jump-card__header {
2074
+ display: grid;
2075
+ gap: 6px;
2076
+ }
2077
+ .skills-jump-card__title {
2078
+ font-size: 16px;
2079
+ font-weight: 700;
2080
+ color: var(--text-strong);
2081
+ }
2082
+ .skills-jump-list {
2083
+ display: grid;
2084
+ gap: 8px;
2085
+ }
2086
+ .skills-jump-btn {
2087
+ justify-content: flex-start;
2088
+ }
1987
2089
  .skills-layout {
1988
2090
  display: grid;
1989
2091
  gap: 10px;
@@ -1994,6 +2096,45 @@
1994
2096
  display: grid;
1995
2097
  gap: 10px;
1996
2098
  }
2099
+ .skills-section {
2100
+ display: grid;
2101
+ gap: 12px;
2102
+ }
2103
+ .skills-section__count {
2104
+ min-width: 42px;
2105
+ padding: 6px 10px;
2106
+ border-radius: 999px;
2107
+ border: 1px solid color-mix(in srgb, var(--border-strong) 76%, transparent);
2108
+ background: color-mix(in srgb, var(--panel) 90%, transparent);
2109
+ color: var(--text-strong);
2110
+ font-size: 12px;
2111
+ text-align: center;
2112
+ }
2113
+ #skillsSummaryCards {
2114
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
2115
+ }
2116
+ .skills-summary-card {
2117
+ display: grid;
2118
+ gap: 8px;
2119
+ padding: 14px 15px;
2120
+ border-radius: 16px;
2121
+ border: 1px solid color-mix(in srgb, var(--border) 84%, transparent);
2122
+ background:
2123
+ linear-gradient(180deg, color-mix(in srgb, var(--card-soft) 98%, transparent), color-mix(in srgb, var(--panel) 92%, transparent));
2124
+ box-shadow: inset 0 1px 0 color-mix(in srgb, white 4%, transparent);
2125
+ }
2126
+ .skills-summary-card .label {
2127
+ font-size: 11px;
2128
+ letter-spacing: 0.08em;
2129
+ text-transform: uppercase;
2130
+ color: var(--muted);
2131
+ }
2132
+ .skills-summary-card .value {
2133
+ font-size: 24px;
2134
+ line-height: 1;
2135
+ font-weight: 800;
2136
+ color: var(--text-strong);
2137
+ }
1997
2138
  .skill-card {
1998
2139
  border: 1px solid color-mix(in srgb, var(--border) 84%, transparent);
1999
2140
  border-radius: 16px;
@@ -2064,10 +2205,14 @@
2064
2205
  color: var(--text);
2065
2206
  line-height: 1.4;
2066
2207
  word-break: break-word;
2208
+ display: -webkit-box;
2209
+ -webkit-line-clamp: 3;
2210
+ line-clamp: 3;
2211
+ -webkit-box-orient: vertical;
2212
+ overflow: hidden;
2067
2213
  }
2068
2214
  .skills-feature-card {
2069
- position: sticky;
2070
- top: 0;
2215
+ position: relative;
2071
2216
  }
2072
2217
  .skills-spotlight {
2073
2218
  border: 1px solid color-mix(in srgb, var(--accent) 24%, transparent);
@@ -2098,6 +2243,31 @@
2098
2243
  line-height: 1.5;
2099
2244
  font-size: 12.5px;
2100
2245
  }
2246
+ @media (max-width: 1180px) {
2247
+ .skills-topline {
2248
+ grid-template-columns: 1fr;
2249
+ }
2250
+ .skills-action-card {
2251
+ grid-template-columns: 1fr;
2252
+ }
2253
+ .skills-action-card__side {
2254
+ min-width: 0;
2255
+ justify-items: start;
2256
+ }
2257
+ #skillsSummaryCards {
2258
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
2259
+ }
2260
+ }
2261
+ @media (max-width: 920px) {
2262
+ .skills-layout {
2263
+ grid-template-columns: 1fr;
2264
+ }
2265
+ }
2266
+ @media (max-width: 640px) {
2267
+ #skillsSummaryCards {
2268
+ grid-template-columns: 1fr;
2269
+ }
2270
+ }
2101
2271
  .network-diagnostics-stack,
2102
2272
  .social-advanced-stack {
2103
2273
  display: grid;
@@ -2225,9 +2395,7 @@
2225
2395
  border-bottom: 1px solid var(--border);
2226
2396
  height: auto;
2227
2397
  overflow: visible;
2228
- position: sticky;
2229
- top: 0;
2230
- z-index: 20;
2398
+ position: relative;
2231
2399
  backdrop-filter: blur(14px) saturate(1.3);
2232
2400
  -webkit-backdrop-filter: blur(14px) saturate(1.3);
2233
2401
  }