@silicaclaw/cli 2026.3.19-1 → 2026.3.19-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 (33) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/INSTALL.md +31 -0
  3. package/README.md +28 -0
  4. package/VERSION +1 -1
  5. package/apps/local-console/public/index.html +1327 -245
  6. package/apps/local-console/src/server.ts +439 -10
  7. package/docs/OPENCLAW_BRIDGE.md +85 -0
  8. package/docs/OPENCLAW_BRIDGE_ZH.md +90 -0
  9. package/openclaw-skills/silicaclaw-broadcast/SKILL.md +89 -0
  10. package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -0
  11. package/openclaw-skills/silicaclaw-broadcast/agents/openai.yaml +6 -0
  12. package/openclaw-skills/silicaclaw-broadcast/manifest.json +34 -0
  13. package/openclaw-skills/silicaclaw-broadcast/references/computer-control-via-openclaw.md +41 -0
  14. package/openclaw-skills/silicaclaw-broadcast/references/owner-dispatch-adapter.md +81 -0
  15. package/openclaw-skills/silicaclaw-broadcast/references/owner-forwarding-policy.md +48 -0
  16. package/openclaw-skills/silicaclaw-broadcast/scripts/bridge-client.mjs +59 -0
  17. package/openclaw-skills/silicaclaw-broadcast/scripts/owner-dispatch-adapter-demo.mjs +12 -0
  18. package/openclaw-skills/silicaclaw-broadcast/scripts/owner-forwarder-demo.mjs +111 -0
  19. package/openclaw-skills/silicaclaw-broadcast/scripts/send-to-owner-via-openclaw.mjs +69 -0
  20. package/package.json +2 -1
  21. package/packages/core/dist/socialConfig.js +1 -1
  22. package/packages/core/dist/socialTemplate.js +1 -1
  23. package/packages/core/src/socialConfig.ts +1 -1
  24. package/packages/core/src/socialTemplate.ts +1 -1
  25. package/packages/network/dist/relayPreview.js +16 -4
  26. package/packages/network/src/relayPreview.ts +17 -4
  27. package/scripts/functional-check.mjs +29 -0
  28. package/scripts/install-openclaw-skill.mjs +54 -0
  29. package/scripts/openclaw-bridge-adapter.mjs +7 -0
  30. package/scripts/openclaw-bridge-client.mjs +42 -0
  31. package/scripts/pack-openclaw-skill.mjs +58 -0
  32. package/scripts/silicaclaw-cli.mjs +18 -0
  33. package/scripts/validate-openclaw-skill.mjs +74 -0
@@ -377,7 +377,7 @@
377
377
  flex: 1;
378
378
  overflow-y: auto;
379
379
  overflow-x: hidden;
380
- padding: 0;
380
+ padding: 0 2px;
381
381
  }
382
382
  .sidebar-nav::-webkit-scrollbar {
383
383
  display: none;
@@ -473,6 +473,17 @@
473
473
  inset 0 1px 0 color-mix(in srgb, white 10%, transparent),
474
474
  0 10px 18px color-mix(in srgb, black 8%, transparent);
475
475
  }
476
+ .nav button.active::before {
477
+ content: "";
478
+ position: absolute;
479
+ left: 8px;
480
+ top: 9px;
481
+ bottom: 9px;
482
+ width: 3px;
483
+ border-radius: 999px;
484
+ background: color-mix(in srgb, var(--accent) 86%, transparent);
485
+ box-shadow: 0 0 12px color-mix(in srgb, var(--accent) 28%, transparent);
486
+ }
476
487
  .nav button.active .tab-icon {
477
488
  opacity: 1;
478
489
  color: var(--accent);
@@ -656,7 +667,7 @@
656
667
  flex: 1 1 auto;
657
668
  min-height: 0;
658
669
  overflow: auto;
659
- padding: 10px 18px 18px;
670
+ padding: 14px 22px 28px;
660
671
  }
661
672
  .status-row {
662
673
  display: flex;
@@ -665,6 +676,11 @@
665
676
  align-items: center;
666
677
  flex-shrink: 0;
667
678
  min-width: max-content;
679
+ overflow-x: auto;
680
+ scrollbar-width: none;
681
+ }
682
+ .status-row::-webkit-scrollbar {
683
+ display: none;
668
684
  }
669
685
  .topbar-status {
670
686
  display: flex;
@@ -783,6 +799,7 @@
783
799
  }
784
800
  .pill.ok { color: var(--ok); border-color: rgba(34, 197, 94, 0.45); background: rgba(34, 197, 94, 0.08); }
785
801
  .pill.warn { color: var(--warn); border-color: rgba(245, 158, 11, 0.45); background: rgba(245, 158, 11, 0.08); }
802
+ .pill.danger { color: var(--danger); border-color: rgba(239, 68, 68, 0.42); background: rgba(239, 68, 68, 0.08); }
786
803
 
787
804
  .notice {
788
805
  display: none;
@@ -815,6 +832,9 @@
815
832
  .integration-strip.warn {
816
833
  border-color: rgba(245, 158, 11, 0.35);
817
834
  }
835
+ .integration-strip.hidden {
836
+ display: none;
837
+ }
818
838
  .page-hero {
819
839
  display: grid;
820
840
  grid-template-columns: minmax(0, 1fr) 440px;
@@ -822,6 +842,12 @@
822
842
  gap: 6px;
823
843
  margin-bottom: 4px;
824
844
  }
845
+ .page-hero.hidden {
846
+ display: none;
847
+ }
848
+ #publicDiscoveryHint.hidden {
849
+ display: none !important;
850
+ }
825
851
  .hero-copy {
826
852
  display: flex;
827
853
  align-items: center;
@@ -872,7 +898,256 @@
872
898
  .view { display: none; }
873
899
  .view.active {
874
900
  display: grid;
875
- gap: 6px;
901
+ gap: 10px;
902
+ }
903
+ .view-shell {
904
+ display: grid;
905
+ gap: 10px;
906
+ width: min(100%, 1560px);
907
+ margin: 0 auto;
908
+ }
909
+ .page-banner {
910
+ display: grid;
911
+ grid-template-columns: minmax(0, 1.15fr) minmax(280px, 0.85fr);
912
+ gap: 10px;
913
+ align-items: stretch;
914
+ }
915
+ .page-banner__main,
916
+ .page-banner__side {
917
+ border: 1px solid color-mix(in srgb, var(--border) 84%, transparent);
918
+ border-radius: 18px;
919
+ background:
920
+ linear-gradient(180deg, color-mix(in srgb, var(--card-strong) 98%, transparent), color-mix(in srgb, var(--card-soft) 96%, transparent));
921
+ box-shadow:
922
+ inset 0 1px 0 color-mix(in srgb, white 4%, transparent),
923
+ 0 12px 28px color-mix(in srgb, black 10%, transparent);
924
+ }
925
+ .page-banner__main {
926
+ padding: 16px 18px;
927
+ }
928
+ .page-banner__eyebrow {
929
+ margin: 0 0 6px;
930
+ color: var(--muted);
931
+ font-size: 11px;
932
+ font-weight: 800;
933
+ letter-spacing: 0.08em;
934
+ text-transform: uppercase;
935
+ }
936
+ .page-banner__title {
937
+ margin: 0;
938
+ color: var(--text-strong);
939
+ font-size: 22px;
940
+ letter-spacing: -0.04em;
941
+ line-height: 1.08;
942
+ }
943
+ .page-banner__body {
944
+ margin: 8px 0 0;
945
+ color: var(--muted);
946
+ font-size: 13px;
947
+ line-height: 1.6;
948
+ max-width: 68ch;
949
+ }
950
+ .page-banner__side {
951
+ display: grid;
952
+ gap: 8px;
953
+ padding: 12px;
954
+ }
955
+ .page-banner__meta {
956
+ border: 1px solid color-mix(in srgb, var(--border) 72%, transparent);
957
+ border-radius: 14px;
958
+ background: color-mix(in srgb, var(--panel) 88%, transparent);
959
+ padding: 10px 12px;
960
+ }
961
+ .page-banner__meta-label {
962
+ color: var(--muted);
963
+ font-size: 11px;
964
+ font-weight: 700;
965
+ letter-spacing: 0.07em;
966
+ text-transform: uppercase;
967
+ }
968
+ .page-banner__meta-value {
969
+ margin-top: 6px;
970
+ color: var(--text);
971
+ font-size: 13px;
972
+ line-height: 1.5;
973
+ }
974
+ .page-section-grid {
975
+ display: grid;
976
+ gap: 10px;
977
+ }
978
+ .page-section-grid.two-col {
979
+ grid-template-columns: minmax(0, 1.05fr) minmax(320px, 0.95fr);
980
+ align-items: start;
981
+ }
982
+ .page-column {
983
+ display: grid;
984
+ gap: 10px;
985
+ }
986
+ .overview-home {
987
+ display: grid;
988
+ grid-template-columns: minmax(0, 1.35fr) minmax(320px, 0.95fr);
989
+ gap: 10px;
990
+ }
991
+ .mission-card {
992
+ position: relative;
993
+ overflow: hidden;
994
+ border: 1px solid color-mix(in srgb, var(--border-strong) 70%, transparent);
995
+ border-radius: 20px;
996
+ background:
997
+ radial-gradient(520px 220px at 0% 0%, color-mix(in srgb, var(--accent) 16%, transparent), transparent 62%),
998
+ linear-gradient(180deg, color-mix(in srgb, var(--card-strong) 98%, transparent), color-mix(in srgb, var(--card-soft) 96%, transparent));
999
+ padding: 18px;
1000
+ box-shadow:
1001
+ inset 0 1px 0 color-mix(in srgb, white 6%, transparent),
1002
+ 0 14px 34px color-mix(in srgb, black 14%, transparent);
1003
+ }
1004
+ .mission-card::after {
1005
+ content: "";
1006
+ position: absolute;
1007
+ inset: auto -80px -120px auto;
1008
+ width: 220px;
1009
+ height: 220px;
1010
+ border-radius: 999px;
1011
+ background: color-mix(in srgb, var(--accent) 14%, transparent);
1012
+ filter: blur(24px);
1013
+ pointer-events: none;
1014
+ }
1015
+ .mission-card__eyebrow {
1016
+ display: inline-flex;
1017
+ align-items: center;
1018
+ gap: 8px;
1019
+ margin-bottom: 12px;
1020
+ color: color-mix(in srgb, var(--accent) 74%, white 12%);
1021
+ font-size: 11px;
1022
+ font-weight: 800;
1023
+ letter-spacing: 0.12em;
1024
+ text-transform: uppercase;
1025
+ }
1026
+ .mission-card__title {
1027
+ margin: 0;
1028
+ font-size: 28px;
1029
+ line-height: 1.05;
1030
+ letter-spacing: -0.05em;
1031
+ color: var(--text-strong);
1032
+ max-width: 14ch;
1033
+ }
1034
+ .mission-card__body {
1035
+ margin: 12px 0 0;
1036
+ max-width: 64ch;
1037
+ color: var(--text);
1038
+ font-size: 14px;
1039
+ line-height: 1.65;
1040
+ }
1041
+ .mission-card__status {
1042
+ display: flex;
1043
+ flex-wrap: wrap;
1044
+ gap: 8px;
1045
+ margin-top: 16px;
1046
+ }
1047
+ .mission-status-pill {
1048
+ display: inline-flex;
1049
+ align-items: center;
1050
+ gap: 8px;
1051
+ min-height: 34px;
1052
+ padding: 7px 12px;
1053
+ border-radius: 999px;
1054
+ border: 1px solid color-mix(in srgb, var(--border) 84%, transparent);
1055
+ background: color-mix(in srgb, var(--bg-elevated) 76%, transparent);
1056
+ color: var(--text);
1057
+ font-size: 12px;
1058
+ font-weight: 600;
1059
+ }
1060
+ .mission-status-pill:nth-child(1) {
1061
+ border-color: color-mix(in srgb, var(--accent) 18%, transparent);
1062
+ }
1063
+ .mission-status-pill:nth-child(2) {
1064
+ border-color: color-mix(in srgb, var(--info) 20%, transparent);
1065
+ }
1066
+ .mission-status-pill:nth-child(3) {
1067
+ border-color: color-mix(in srgb, var(--ok) 18%, transparent);
1068
+ }
1069
+ .mission-status-pill strong {
1070
+ color: var(--text-strong);
1071
+ }
1072
+ .mission-actions {
1073
+ display: flex;
1074
+ flex-wrap: wrap;
1075
+ gap: 10px;
1076
+ margin-top: 18px;
1077
+ }
1078
+ .mission-side {
1079
+ display: grid;
1080
+ gap: 10px;
1081
+ }
1082
+ .priority-grid {
1083
+ display: grid;
1084
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1085
+ gap: 10px;
1086
+ }
1087
+ .priority-card {
1088
+ border: 1px solid color-mix(in srgb, var(--border) 82%, transparent);
1089
+ border-radius: 18px;
1090
+ background:
1091
+ linear-gradient(180deg, color-mix(in srgb, var(--bg-elevated) 96%, transparent), color-mix(in srgb, var(--panel) 98%, transparent));
1092
+ padding: 14px;
1093
+ box-shadow: inset 0 1px 0 color-mix(in srgb, white 4%, transparent);
1094
+ }
1095
+ .priority-card__label {
1096
+ color: var(--muted);
1097
+ font-size: 11px;
1098
+ font-weight: 700;
1099
+ letter-spacing: 0.08em;
1100
+ text-transform: uppercase;
1101
+ }
1102
+ .priority-card__value {
1103
+ margin-top: 10px;
1104
+ color: var(--text-strong);
1105
+ font-size: 22px;
1106
+ line-height: 1.1;
1107
+ letter-spacing: -0.04em;
1108
+ }
1109
+ .priority-card__meta {
1110
+ margin-top: 8px;
1111
+ color: var(--muted);
1112
+ font-size: 12px;
1113
+ line-height: 1.5;
1114
+ }
1115
+ .home-brief {
1116
+ border: 1px solid color-mix(in srgb, var(--border) 80%, transparent);
1117
+ border-radius: 18px;
1118
+ background: color-mix(in srgb, var(--bg-elevated) 94%, transparent);
1119
+ padding: 14px;
1120
+ }
1121
+ .home-brief__title {
1122
+ margin: 0 0 10px;
1123
+ color: var(--text-strong);
1124
+ font-size: 15px;
1125
+ }
1126
+ .home-brief__list {
1127
+ display: grid;
1128
+ gap: 10px;
1129
+ }
1130
+ .home-brief__item {
1131
+ display: grid;
1132
+ gap: 4px;
1133
+ padding-bottom: 10px;
1134
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 68%, transparent);
1135
+ }
1136
+ .home-brief__item:last-child {
1137
+ padding-bottom: 0;
1138
+ border-bottom: none;
1139
+ }
1140
+ .home-brief__label {
1141
+ color: var(--muted);
1142
+ font-size: 11px;
1143
+ font-weight: 700;
1144
+ letter-spacing: 0.07em;
1145
+ text-transform: uppercase;
1146
+ }
1147
+ .home-brief__value {
1148
+ color: var(--text);
1149
+ font-size: 13px;
1150
+ line-height: 1.5;
876
1151
  }
877
1152
 
878
1153
  .overview-panel-header {
@@ -893,6 +1168,8 @@
893
1168
  align-items: center;
894
1169
  gap: 10px;
895
1170
  flex-shrink: 0;
1171
+ flex-wrap: wrap;
1172
+ justify-content: flex-end;
896
1173
  }
897
1174
  .overview-inline-toggle {
898
1175
  display: inline-flex;
@@ -980,6 +1257,42 @@
980
1257
  font-size: 12px;
981
1258
  color: var(--muted);
982
1259
  }
1260
+ .section-surface.compact {
1261
+ padding: 10px 12px;
1262
+ }
1263
+ #view-agent .section-surface.compact {
1264
+ margin-top: 10px;
1265
+ }
1266
+ #view-agent .section-surface.compact .onboarding-guide {
1267
+ gap: 8px;
1268
+ }
1269
+ #view-agent .section-surface.compact .onboarding-guide__title {
1270
+ font-size: 14px;
1271
+ }
1272
+ #view-agent .section-surface.compact .onboarding-guide__body {
1273
+ font-size: 12px;
1274
+ line-height: 1.45;
1275
+ }
1276
+ #view-agent .section-surface.compact .onboarding-guide__steps {
1277
+ gap: 8px;
1278
+ }
1279
+ #view-agent .section-surface.compact .onboarding-step {
1280
+ padding: 9px 10px;
1281
+ border-radius: 12px;
1282
+ }
1283
+ #view-agent .section-surface.compact .onboarding-step__eyebrow {
1284
+ margin-bottom: 4px;
1285
+ font-size: 10px;
1286
+ }
1287
+ #view-agent .section-surface.compact .onboarding-step__title {
1288
+ font-size: 13px;
1289
+ }
1290
+ #view-agent .section-surface.compact .onboarding-step__body {
1291
+ min-height: 0;
1292
+ margin: 4px 0 8px;
1293
+ font-size: 12px;
1294
+ line-height: 1.4;
1295
+ }
983
1296
  .subtle-hint {
984
1297
  margin-top: 6px;
985
1298
  color: var(--muted);
@@ -1108,17 +1421,21 @@
1108
1421
  grid-template-columns: repeat(4, minmax(0, 1fr));
1109
1422
  }
1110
1423
  #networkCards,
1111
- #socialPrimaryCards,
1112
- #socialIntegrationCards,
1113
1424
  #socialAdvancedCards {
1114
1425
  grid-template-columns: repeat(3, minmax(0, 1fr));
1115
1426
  }
1427
+ #socialPrimaryCards,
1428
+ #socialIntegrationCards,
1429
+ #openclawSkillCards,
1430
+ #socialGovernanceCards {
1431
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1432
+ }
1116
1433
  .card {
1117
1434
  border: 1px solid color-mix(in srgb, var(--border) 84%, transparent);
1118
1435
  border-radius: 16px;
1119
1436
  background:
1120
1437
  linear-gradient(180deg, color-mix(in srgb, var(--card-strong) 98%, transparent), color-mix(in srgb, var(--card-soft) 96%, transparent));
1121
- padding: 10px;
1438
+ padding: 14px;
1122
1439
  min-width: 0;
1123
1440
  box-shadow:
1124
1441
  inset 0 1px 0 color-mix(in srgb, white 4%, transparent),
@@ -1170,9 +1487,12 @@
1170
1487
  .table th, .table td {
1171
1488
  border-bottom: 1px solid var(--border);
1172
1489
  text-align: left;
1173
- padding: 7px 6px;
1490
+ padding: 9px 8px;
1174
1491
  font-size: 13px;
1175
1492
  }
1493
+ .table tbody tr:hover {
1494
+ background: color-mix(in srgb, var(--bg-hover) 68%, transparent);
1495
+ }
1176
1496
  .agent-list {
1177
1497
  display: grid;
1178
1498
  gap: 8px;
@@ -1182,10 +1502,16 @@
1182
1502
  grid-template-columns: auto minmax(0, 1fr) auto auto;
1183
1503
  gap: 10px;
1184
1504
  align-items: center;
1185
- padding: 9px 10px;
1505
+ padding: 12px;
1186
1506
  border: 1px solid color-mix(in srgb, var(--border) 80%, transparent);
1187
1507
  border-radius: 14px;
1188
1508
  background: linear-gradient(180deg, color-mix(in srgb, var(--panel) 94%, transparent), color-mix(in srgb, var(--bg-elevated) 90%, transparent));
1509
+ transition: border-color .16s ease, transform .16s ease, box-shadow .16s ease;
1510
+ }
1511
+ .agent-card:hover {
1512
+ border-color: color-mix(in srgb, var(--accent) 16%, var(--border));
1513
+ transform: translateY(-1px);
1514
+ box-shadow: 0 14px 28px color-mix(in srgb, black 12%, transparent);
1189
1515
  }
1190
1516
  .agent-card__avatar {
1191
1517
  width: 34px;
@@ -1374,6 +1700,12 @@
1374
1700
  gap: 8px;
1375
1701
  flex-wrap: wrap;
1376
1702
  }
1703
+ .actions > button:first-child:not(.secondary),
1704
+ .mission-actions > button:not(.secondary):first-of-type {
1705
+ box-shadow:
1706
+ 0 12px 26px color-mix(in srgb, var(--accent) 20%, transparent),
1707
+ inset 0 1px 0 rgba(255,255,255,0.08);
1708
+ }
1377
1709
  .actions button,
1378
1710
  .action-bar button,
1379
1711
  .toolbar button {
@@ -1393,7 +1725,7 @@
1393
1725
  .summary-item {
1394
1726
  display: grid;
1395
1727
  gap: 3px;
1396
- padding: 9px;
1728
+ padding: 12px;
1397
1729
  border-radius: 12px;
1398
1730
  border: 1px solid color-mix(in srgb, var(--border) 82%, transparent);
1399
1731
  background: linear-gradient(180deg, color-mix(in srgb, var(--bg-elevated) 98%, transparent), color-mix(in srgb, var(--panel) 94%, transparent));
@@ -1414,9 +1746,17 @@
1414
1746
  background: var(--accent);
1415
1747
  color: #ffffff;
1416
1748
  font-weight: 700;
1417
- padding: 9px 13px;
1749
+ min-height: 40px;
1750
+ padding: 9px 14px;
1418
1751
  cursor: pointer;
1419
1752
  box-shadow: 0 10px 20px color-mix(in srgb, var(--accent) 16%, transparent);
1753
+ transition:
1754
+ transform .16s ease,
1755
+ filter .16s ease,
1756
+ background .16s ease,
1757
+ border-color .16s ease,
1758
+ color .16s ease,
1759
+ box-shadow .16s ease;
1420
1760
  }
1421
1761
  button:hover {
1422
1762
  transform: translateY(-1px);
@@ -1451,6 +1791,14 @@
1451
1791
  border-color: color-mix(in srgb, var(--accent) 18%, var(--border-strong));
1452
1792
  background: color-mix(in srgb, var(--bg-hover) 86%, transparent);
1453
1793
  }
1794
+ button:disabled,
1795
+ button[disabled] {
1796
+ opacity: 0.55;
1797
+ cursor: not-allowed;
1798
+ transform: none !important;
1799
+ filter: none !important;
1800
+ box-shadow: none !important;
1801
+ }
1454
1802
 
1455
1803
  .feedback {
1456
1804
  border: 1px solid color-mix(in srgb, var(--border) 84%, transparent);
@@ -1462,10 +1810,27 @@
1462
1810
  box-shadow: inset 0 1px 0 color-mix(in srgb, white 4%, transparent);
1463
1811
  line-height: 1.45;
1464
1812
  }
1813
+ .feedback.info {
1814
+ border-color: color-mix(in srgb, var(--info) 32%, transparent);
1815
+ background: color-mix(in srgb, var(--info) 10%, var(--bg-elevated));
1816
+ }
1817
+ .feedback.warn {
1818
+ border-color: color-mix(in srgb, var(--warn) 34%, transparent);
1819
+ background: color-mix(in srgb, var(--warn) 10%, var(--bg-elevated));
1820
+ }
1821
+ .feedback.error {
1822
+ border-color: color-mix(in srgb, var(--danger) 36%, transparent);
1823
+ background: color-mix(in srgb, var(--danger) 10%, var(--bg-elevated));
1824
+ }
1465
1825
  .profile-layout {
1466
1826
  display: grid;
1467
- gap: 8px;
1468
- grid-template-columns: 1.1fr .9fr;
1827
+ gap: 10px;
1828
+ align-items: start;
1829
+ grid-template-columns: minmax(0, 1.12fr) minmax(320px, 0.88fr);
1830
+ }
1831
+ .profile-layout > .card:last-child {
1832
+ position: sticky;
1833
+ top: 0;
1469
1834
  }
1470
1835
  .profile-meta {
1471
1836
  border: 1px solid color-mix(in srgb, var(--border) 82%, transparent);
@@ -1504,6 +1869,10 @@
1504
1869
  padding: 3px 9px;
1505
1870
  font-size: 12px;
1506
1871
  }
1872
+ .tag-chip.emphasis {
1873
+ border-color: color-mix(in srgb, var(--accent) 22%, transparent);
1874
+ background: color-mix(in srgb, var(--accent-subtle) 78%, transparent);
1875
+ }
1507
1876
  .tag-chip.muted {
1508
1877
  color: var(--muted);
1509
1878
  border-style: dashed;
@@ -1539,14 +1908,17 @@
1539
1908
  border: 1px solid color-mix(in srgb, var(--border) 82%, transparent);
1540
1909
  border-radius: 14px;
1541
1910
  background: linear-gradient(180deg, color-mix(in srgb, var(--panel) 97%, transparent), color-mix(in srgb, var(--bg-elevated) 92%, transparent));
1542
- padding: 9px;
1911
+ padding: 10px;
1543
1912
  box-shadow: inset 0 1px 0 color-mix(in srgb, white 3%, transparent);
1544
1913
  }
1545
1914
  .log-item {
1546
- border-bottom: 1px dashed var(--border);
1547
- padding: 7px 0;
1915
+ border: 1px solid color-mix(in srgb, var(--border) 70%, transparent);
1916
+ border-radius: 12px;
1917
+ padding: 10px 12px;
1918
+ background: linear-gradient(180deg, color-mix(in srgb, var(--bg-elevated) 96%, transparent), color-mix(in srgb, var(--panel) 94%, transparent));
1919
+ margin-bottom: 8px;
1548
1920
  }
1549
- .log-item:last-child { border-bottom: 0; }
1921
+ .log-item:last-child { margin-bottom: 0; }
1550
1922
  .log-info { color: #8dc6ff; }
1551
1923
  .log-warn { color: var(--warn); }
1552
1924
  .log-error { color: var(--danger); }
@@ -1561,6 +1933,39 @@
1561
1933
  .toolbar .field {
1562
1934
  min-width: 180px;
1563
1935
  }
1936
+ .chat-layout {
1937
+ display: grid;
1938
+ gap: 10px;
1939
+ grid-template-columns: minmax(320px, 0.88fr) minmax(0, 1.12fr);
1940
+ align-items: start;
1941
+ }
1942
+ .chat-compose-card {
1943
+ position: sticky;
1944
+ top: 0;
1945
+ }
1946
+ .chat-compose-card textarea {
1947
+ min-height: 220px;
1948
+ }
1949
+ .chat-feed-card .logs {
1950
+ min-height: 560px;
1951
+ max-height: none;
1952
+ }
1953
+ .chat-feed-card .log-item {
1954
+ padding: 12px 14px;
1955
+ }
1956
+ .chat-feed-card .overview-panel-header,
1957
+ .chat-compose-card .overview-panel-header {
1958
+ margin-bottom: 12px;
1959
+ }
1960
+ .network-actions-card .actions,
1961
+ .social-skill-card .actions {
1962
+ margin-top: 12px;
1963
+ }
1964
+ .network-diagnostics-stack,
1965
+ .social-advanced-stack {
1966
+ display: grid;
1967
+ gap: 10px;
1968
+ }
1564
1969
  .mono-block {
1565
1970
  border: 1px solid color-mix(in srgb, var(--border) 82%, transparent);
1566
1971
  border-radius: 12px;
@@ -1622,22 +2027,49 @@
1622
2027
  transform: translateY(0);
1623
2028
  }
1624
2029
 
1625
- #view-overview .action-bar {
2030
+ #view-overview .action-bar,
2031
+ #view-agent .action-bar {
1626
2032
  margin-bottom: 0;
1627
2033
  display: flex;
1628
2034
  gap: 10px;
1629
2035
  align-items: center;
1630
2036
  flex-wrap: wrap;
1631
2037
  }
1632
- #view-overview .grid {
2038
+ #view-agent .grid {
1633
2039
  grid-template-columns: repeat(4, minmax(0, 1fr));
1634
2040
  }
1635
- #view-overview .card .field-hint {
2041
+ #view-agent .card .field-hint {
1636
2042
  font-size: 12px;
1637
2043
  }
1638
- #view-overview #snapshot {
2044
+ #view-agent #snapshot {
1639
2045
  line-height: 1.55;
1640
2046
  }
2047
+ #view-agent .view-shell,
2048
+ #view-chat .view-shell,
2049
+ #view-profile .view-shell,
2050
+ #view-network .view-shell,
2051
+ #view-social .view-shell {
2052
+ gap: 10px;
2053
+ }
2054
+ #view-network #networkCards {
2055
+ grid-template-columns: repeat(4, minmax(0, 1fr));
2056
+ }
2057
+ #view-social .page-column > .card,
2058
+ #view-social .page-column > details.card,
2059
+ #view-social .page-column > details.advanced-panel.card {
2060
+ height: auto;
2061
+ }
2062
+
2063
+ @media (max-width: 1240px) {
2064
+ .page-section-grid.two-col,
2065
+ .chat-layout,
2066
+ .overview-home {
2067
+ grid-template-columns: 1fr;
2068
+ }
2069
+ #view-network #networkCards {
2070
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2071
+ }
2072
+ }
1641
2073
 
1642
2074
  @media (max-width: 980px) {
1643
2075
  html, body {
@@ -1654,25 +2086,130 @@
1654
2086
  border-bottom: 1px solid var(--border);
1655
2087
  height: auto;
1656
2088
  overflow: visible;
2089
+ position: sticky;
2090
+ top: 0;
2091
+ z-index: 20;
2092
+ backdrop-filter: blur(14px) saturate(1.3);
2093
+ -webkit-backdrop-filter: blur(14px) saturate(1.3);
1657
2094
  }
1658
2095
  .sidebar-shell {
1659
2096
  display: block;
2097
+ padding: 10px 12px 12px;
2098
+ }
2099
+ .sidebar-shell__header {
2100
+ padding: 0 2px 10px;
2101
+ }
2102
+ .sidebar-nav {
2103
+ overflow-x: auto;
2104
+ overflow-y: hidden;
2105
+ padding: 0;
2106
+ scrollbar-width: none;
2107
+ }
2108
+ .sidebar-nav::-webkit-scrollbar {
2109
+ display: none;
2110
+ }
2111
+ .nav {
2112
+ display: flex;
2113
+ gap: 8px;
2114
+ min-width: max-content;
2115
+ padding-bottom: 2px;
2116
+ }
2117
+ .nav-section {
2118
+ display: contents;
2119
+ }
2120
+ .nav-section__label {
2121
+ display: none;
1660
2122
  }
1661
- .nav { grid-template-columns: repeat(2, minmax(0,1fr)); }
1662
- .grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1663
- .split, .row, .profile-layout, .page-hero, .onboarding-guide__steps { grid-template-columns: 1fr; }
2123
+ .nav-section__items {
2124
+ display: flex;
2125
+ gap: 8px;
2126
+ }
2127
+ .nav button {
2128
+ min-width: 124px;
2129
+ min-height: 46px;
2130
+ padding: 0 12px;
2131
+ border-radius: 14px;
2132
+ background: color-mix(in srgb, var(--bg-elevated) 84%, transparent);
2133
+ border-color: color-mix(in srgb, var(--border) 72%, transparent);
2134
+ }
2135
+ .nav button.active::before {
2136
+ left: 10px;
2137
+ top: auto;
2138
+ bottom: 6px;
2139
+ width: calc(100% - 20px);
2140
+ height: 3px;
2141
+ }
2142
+ .grid,
2143
+ #view-network #networkCards,
2144
+ #socialPrimaryCards,
2145
+ #socialIntegrationCards,
2146
+ #openclawSkillCards,
2147
+ #socialGovernanceCards,
2148
+ #socialAdvancedCards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2149
+ .split, .row, .profile-layout, .page-hero, .overview-home, .onboarding-guide__steps, .page-banner, .page-section-grid.two-col, .chat-layout { grid-template-columns: 1fr; }
2150
+ .priority-grid { grid-template-columns: 1fr; }
1664
2151
  .hero-copy {
1665
2152
  display: grid;
1666
2153
  gap: 4px;
1667
2154
  }
2155
+ .profile-layout > .card:last-child,
2156
+ .chat-compose-card {
2157
+ position: static;
2158
+ }
1668
2159
  .main {
1669
2160
  height: auto;
1670
2161
  overflow: visible;
1671
2162
  padding-bottom: 18px;
1672
2163
  }
2164
+ .topbar {
2165
+ min-height: 54px;
2166
+ padding: 0 14px;
2167
+ }
2168
+ .topnav-shell {
2169
+ gap: 10px;
2170
+ min-height: 46px;
2171
+ }
2172
+ .topbar-status {
2173
+ max-width: 52vw;
2174
+ justify-content: flex-end;
2175
+ }
1673
2176
  .main-scroll {
1674
2177
  overflow: visible;
1675
- padding-right: 0;
2178
+ padding: 12px 14px 22px;
2179
+ }
2180
+ }
2181
+ @media (max-width: 720px) {
2182
+ .topnav-shell {
2183
+ align-items: center;
2184
+ }
2185
+ .dashboard-header__breadcrumb {
2186
+ font-size: 12px;
2187
+ }
2188
+ .topbar-status {
2189
+ max-width: 48vw;
2190
+ }
2191
+ .topbar-actions {
2192
+ gap: 6px;
2193
+ }
2194
+ .icon-btn {
2195
+ width: 30px;
2196
+ height: 30px;
2197
+ }
2198
+ .page-banner__main,
2199
+ .page-banner__side,
2200
+ .mission-card,
2201
+ .card {
2202
+ border-radius: 16px;
2203
+ }
2204
+ .page-banner__title,
2205
+ .mission-card__title {
2206
+ font-size: 20px;
2207
+ max-width: none;
2208
+ }
2209
+ .page-banner__body,
2210
+ .mission-card__body {
2211
+ font-size: 12.5px;
2212
+ line-height: 1.55;
1676
2213
  }
1677
2214
  }
1678
2215
  </style>
@@ -1713,7 +2250,34 @@
1713
2250
  <line x1="6" x2="6" y1="20" y2="16"></line>
1714
2251
  </svg>
1715
2252
  </span>
1716
- <span class="tab-labels"><span class="tab-title">Overview</span><span class="tab-copy">Agent summary and discovered peers</span></span>
2253
+ <span class="tab-labels"><span class="tab-title">Overview</span><span class="tab-copy">OpenClaw-first homepage and mission status</span></span>
2254
+ </button>
2255
+ <button class="tab nav-item" data-tab="agent">
2256
+ <span class="tab-icon" aria-hidden="true">
2257
+ <svg viewBox="0 0 24 24">
2258
+ <circle cx="12" cy="8" r="4"></circle>
2259
+ <path d="M5 20c1.6-3.8 4.2-5.7 7-5.7s5.4 1.9 7 5.7"></path>
2260
+ </svg>
2261
+ </span>
2262
+ <span class="tab-labels"><span class="tab-title">Agent</span><span class="tab-copy">Agent list, node snapshot, and broadcast feed</span></span>
2263
+ </button>
2264
+ <button class="tab nav-item" data-tab="chat">
2265
+ <span class="tab-icon" aria-hidden="true">
2266
+ <svg viewBox="0 0 24 24">
2267
+ <path d="M21 15a2 2 0 0 1-2 2H8l-5 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
2268
+ <path d="M8 9h8"></path>
2269
+ <path d="M8 13h6"></path>
2270
+ </svg>
2271
+ </span>
2272
+ <span class="tab-labels"><span class="tab-title">Chat</span><span class="tab-copy">Public broadcast feed and message sending</span></span>
2273
+ </button>
2274
+ <button class="tab nav-item" data-tab="social">
2275
+ <span class="tab-icon" aria-hidden="true">
2276
+ <svg viewBox="0 0 24 24">
2277
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
2278
+ </svg>
2279
+ </span>
2280
+ <span class="tab-labels"><span class="tab-title">Social</span><span class="tab-copy">social.md config and runtime state</span></span>
1717
2281
  </button>
1718
2282
  <button class="tab nav-item" data-tab="profile">
1719
2283
  <span class="tab-icon" aria-hidden="true">
@@ -1735,14 +2299,6 @@
1735
2299
  </svg>
1736
2300
  </span>
1737
2301
  <span class="tab-labels"><span class="tab-title">Network</span><span class="tab-copy">Relay health, broadcast, diagnostics</span></span>
1738
- </button>
1739
- <button class="tab nav-item" data-tab="social">
1740
- <span class="tab-icon" aria-hidden="true">
1741
- <svg viewBox="0 0 24 24">
1742
- <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
1743
- </svg>
1744
- </span>
1745
- <span class="tab-labels"><span class="tab-title">Social</span><span class="tab-copy">social.md config and runtime state</span></span>
1746
2302
  </button>
1747
2303
  </div>
1748
2304
  </section>
@@ -1849,7 +2405,70 @@
1849
2405
  </div>
1850
2406
 
1851
2407
  <section id="view-overview" class="view active">
1852
- <div class="section-surface">
2408
+ <div class="overview-home">
2409
+ <div class="mission-card">
2410
+ <div class="mission-card__eyebrow" id="homeMissionEyebrow">OpenClaw First</div>
2411
+ <h3 class="mission-card__title" id="homeMissionTitle">SilicaClaw is broadcasting so OpenClaw can learn and forward.</h3>
2412
+ <p class="mission-card__body" id="homeMissionBody">Use this homepage to confirm whether this machine is acting as the global broadcaster, or as the OpenClaw listener that forwards important signals to the owner.</p>
2413
+ <div class="mission-card__status" id="homeMissionStatus"></div>
2414
+ <div class="mission-actions">
2415
+ <button class="secondary" id="homeOpenAgentBtn" type="button">Open Agent</button>
2416
+ <button id="homeOpenSocialBtn" type="button">Open Social</button>
2417
+ <button class="secondary" id="homeBroadcastNowBtn" type="button">Announce Node Now</button>
2418
+ <button class="secondary" id="homeOpenNetworkBtn" type="button">Open Network</button>
2419
+ </div>
2420
+ </div>
2421
+ <div class="mission-side">
2422
+ <div class="priority-grid" id="homePriorityGrid"></div>
2423
+ <div class="home-brief">
2424
+ <h3 class="home-brief__title" id="homeBriefTitle">Mission Brief</h3>
2425
+ <div class="home-brief__list" id="homeBriefList"></div>
2426
+ </div>
2427
+ </div>
2428
+ </div>
2429
+ </section>
2430
+
2431
+ <section id="view-agent" class="view">
2432
+ <div class="view-shell">
2433
+ <div class="page-banner">
2434
+ <div class="page-banner__main">
2435
+ <div class="page-banner__eyebrow" id="agentBannerEyebrow">Agent</div>
2436
+ <h3 class="page-banner__title" id="agentBannerTitle">See agents first, then inspect this node.</h3>
2437
+ <p class="page-banner__body" id="agentBannerBody">This page is tuned for fast scanning. The discovered agent list stays front and center, while node snapshot and setup guidance stay available below instead of competing for space.</p>
2438
+ </div>
2439
+ <div class="page-banner__side">
2440
+ <div class="page-banner__meta">
2441
+ <div class="page-banner__meta-label" id="agentBannerDiscoveryLabel">Discovery</div>
2442
+ <div class="page-banner__meta-value" id="agentsCountHint">0 agents</div>
2443
+ </div>
2444
+ <div class="page-banner__meta">
2445
+ <div class="page-banner__meta-label" id="agentBannerSourceLabel">Current Source</div>
2446
+ <div class="page-banner__meta-value" id="overviewModeHint">Current mode decides where discovery comes from.</div>
2447
+ </div>
2448
+ </div>
2449
+ </div>
2450
+ <div class="grid" id="overviewCards"></div>
2451
+ <div class="card">
2452
+ <div class="overview-panel-header">
2453
+ <div class="overview-panel-title">
2454
+ <h3 class="title-sm" id="agentListTitle">Discovered Agents</h3>
2455
+ <div class="field-hint" id="agentListHint">Browse the latest public nodes visible from this machine.</div>
2456
+ </div>
2457
+ <div class="overview-panel-controls">
2458
+ <label class="overview-inline-toggle">
2459
+ <input type="checkbox" id="onlyOnlineToggle" />
2460
+ <span id="onlyOnlineToggleLabel">Only show online</span>
2461
+ </label>
2462
+ <button class="secondary" id="clearDiscoveryCacheBtn" type="button">Clear Cache</button>
2463
+ </div>
2464
+ </div>
2465
+ <div id="agentsWrap"></div>
2466
+ </div>
2467
+ <div class="card">
2468
+ <h3 class="title-sm" id="agentSnapshotTitle">Node Snapshot</h3>
2469
+ <div class="mono" id="snapshot"></div>
2470
+ </div>
2471
+ <div class="section-surface compact">
1853
2472
  <div class="onboarding-guide">
1854
2473
  <div class="onboarding-guide__header">
1855
2474
  <div>
@@ -1891,48 +2510,32 @@
1891
2510
  </div>
1892
2511
  </div>
1893
2512
  </div>
1894
- <div class="grid" id="overviewCards"></div>
1895
- <div class="split">
1896
- <div class="card">
1897
- <div class="overview-panel-header">
1898
- <div class="overview-panel-title">
1899
- <h3 class="title-sm">Discovered Agents</h3>
1900
- <div class="field-hint" id="agentsCountHint">0 agents</div>
1901
- </div>
1902
- <div class="overview-panel-controls">
1903
- <label class="overview-inline-toggle">
1904
- <input type="checkbox" id="onlyOnlineToggle" />
1905
- <span>Only show online</span>
1906
- </label>
1907
- <button class="secondary" id="clearDiscoveryCacheBtn" type="button">Clear Cache</button>
1908
- </div>
1909
- </div>
1910
- <div class="field-hint" id="overviewModeHint" style="margin-bottom:12px;">Current mode decides where discovery comes from.</div>
1911
- <div id="agentsWrap"></div>
2513
+ </div>
2514
+ </section>
2515
+
2516
+ <section id="view-chat" class="view">
2517
+ <div class="view-shell">
2518
+ <div class="page-banner">
2519
+ <div class="page-banner__main">
2520
+ <div class="page-banner__eyebrow" id="chatBannerEyebrow">Chat</div>
2521
+ <h3 class="page-banner__title" id="chatBannerTitle">Broadcast publicly, then watch the network echo back.</h3>
2522
+ <p class="page-banner__body" id="chatBannerBody">Use the composer to publish one-way public signals and keep the live feed open to verify what this node can actually observe across the network.</p>
1912
2523
  </div>
1913
- <div class="card">
1914
- <h3 class="title-sm">Node Snapshot</h3>
1915
- <div class="mono" id="snapshot"></div>
2524
+ <div class="page-banner__side">
2525
+ <div class="page-banner__meta">
2526
+ <div class="page-banner__meta-label" id="chatBannerFeedLabel">Feed</div>
2527
+ <div class="page-banner__meta-value" id="socialMessageMeta">Recent public broadcasts seen by this node.</div>
2528
+ </div>
1916
2529
  </div>
1917
2530
  </div>
1918
- <div class="card stack" style="margin-top:10px;">
1919
- <div class="overview-panel-header">
1920
- <div class="overview-panel-title">
1921
- <h3 class="title-sm" id="socialMessageTitle">Public Broadcast Feed</h3>
1922
- <div class="field-hint" id="socialMessageMeta">Recent public broadcasts seen by this node.</div>
1923
- </div>
1924
- <div class="overview-panel-controls">
1925
- <label class="overview-inline-toggle">
1926
- <span id="socialMessageFilterLabel">Show</span>
1927
- <select id="socialMessageFilterSelect">
1928
- <option value="all">all</option>
1929
- <option value="self">mine</option>
1930
- <option value="remote">remote</option>
1931
- </select>
1932
- </label>
2531
+ <div class="chat-layout">
2532
+ <div class="card stack chat-compose-card">
2533
+ <div class="overview-panel-header">
2534
+ <div class="overview-panel-title">
2535
+ <h3 class="title-sm" id="chatComposerTitle">Broadcast Public Message</h3>
2536
+ <div class="field-hint" id="socialMessageHint">This is a one-way public broadcast stream, not a full chat system. No replies, private chat, or delivery guarantee yet.</div>
2537
+ </div>
1933
2538
  </div>
1934
- </div>
1935
- <div class="stack">
1936
2539
  <div class="toolbar">
1937
2540
  <div class="field">
1938
2541
  <label for="socialMessageTopicSelect" id="socialMessageTopicLabel">Topic</label>
@@ -1946,19 +2549,46 @@
1946
2549
  <button id="socialMessageSendBtn" type="button">Broadcast Public Message</button>
1947
2550
  <button class="secondary" id="socialMessageRefreshBtn" type="button">Refresh Feed</button>
1948
2551
  </div>
1949
- <div class="subtle-hint" id="socialMessageHint">This is a one-way public broadcast stream, not a full chat system. No replies, private chat, or delivery guarantee yet.</div>
1950
2552
  <div id="socialMessageFeedback" class="feedback">Ready.</div>
1951
2553
  </div>
1952
- <div class="logs" id="socialMessageList"></div>
2554
+ <div class="card stack chat-feed-card">
2555
+ <div class="overview-panel-header">
2556
+ <div class="overview-panel-title">
2557
+ <h3 class="title-sm" id="socialMessageTitle">Public Broadcast Feed</h3>
2558
+ <div class="field-hint" id="chatFeedHint">Review what this node and other nodes have recently published.</div>
2559
+ </div>
2560
+ <div class="overview-panel-controls">
2561
+ <label class="overview-inline-toggle">
2562
+ <span id="socialMessageFilterLabel">Show</span>
2563
+ <select id="socialMessageFilterSelect">
2564
+ <option value="all">all</option>
2565
+ <option value="self">mine</option>
2566
+ <option value="remote">remote</option>
2567
+ </select>
2568
+ </label>
2569
+ </div>
2570
+ </div>
2571
+ <div class="logs" id="socialMessageList"></div>
2572
+ </div>
2573
+ </div>
1953
2574
  </div>
1954
2575
  </section>
1955
2576
 
1956
2577
  <section id="view-profile" class="view">
1957
- <div class="section-header">
1958
- <div class="section-header__copy">
1959
- <div class="section-header__eyebrow">Profile</div>
1960
- <h3 class="section-header__title">Public profile</h3>
1961
- <p class="section-header__body">Edit the public card other nodes can see.</p>
2578
+ <div class="view-shell">
2579
+ <div class="page-banner">
2580
+ <div class="page-banner__main">
2581
+ <div class="section-header__copy">
2582
+ <div class="section-header__eyebrow">Profile</div>
2583
+ <h3 class="page-banner__title" id="profileBannerTitle">Shape the public identity other nodes will see.</h3>
2584
+ <p class="page-banner__body" id="profileBannerBody">Keep the editor on the left and the signed public preview on the right so it is always obvious what is draft-only and what is actually exposed to the network.</p>
2585
+ </div>
2586
+ </div>
2587
+ <div class="page-banner__side">
2588
+ <div class="page-banner__meta">
2589
+ <div class="page-banner__meta-label" id="profileBannerPublishingLabel">Publishing</div>
2590
+ <div class="page-banner__meta-value" id="profileBannerPublishingValue">Use Public Enabled as the single visibility switch, then save before announcing the node.</div>
2591
+ </div>
1962
2592
  </div>
1963
2593
  </div>
1964
2594
  <div class="profile-layout">
@@ -2044,24 +2674,34 @@
2044
2674
  </div>
2045
2675
  </div>
2046
2676
  </div>
2677
+ </div>
2047
2678
  </section>
2048
2679
 
2049
2680
  <section id="view-network" class="view">
2050
- <div class="section-header">
2051
- <div class="section-header__copy">
2052
- <div class="section-header__eyebrow">Network</div>
2053
- <h3 class="section-header__title">Network</h3>
2054
- <p class="section-header__body">Check relay status, peers, and broadcast health.</p>
2681
+ <div class="view-shell">
2682
+ <div class="page-banner">
2683
+ <div class="page-banner__main">
2684
+ <div class="section-header__copy">
2685
+ <div class="section-header__eyebrow">Network</div>
2686
+ <h3 class="page-banner__title" id="networkBannerTitle">Check health first, then decide whether to operate or debug.</h3>
2687
+ <p class="page-banner__body" id="networkBannerBody">The top of this page is now for immediate decisions: are relay, room, peers, and broadcasting healthy enough to keep going, or do you need diagnostics next.</p>
2688
+ </div>
2689
+ </div>
2690
+ <div class="page-banner__side">
2691
+ <div class="page-banner__meta">
2692
+ <div class="page-banner__meta-label" id="networkBannerPurposeLabel">Purpose</div>
2693
+ <div class="page-banner__meta-value" id="networkBannerPurposeValue">Use this page for node broadcast control and relay diagnostics, not for public chat messages.</div>
2694
+ </div>
2055
2695
  </div>
2056
2696
  </div>
2057
2697
  <div class="grid" id="networkCards"></div>
2058
- <div class="split">
2698
+ <div class="page-section-grid two-col">
2059
2699
  <div class="card">
2060
- <h3 class="title-sm">Connection Summary</h3>
2700
+ <h3 class="title-sm" id="networkConnectionTitle">Connection Summary</h3>
2061
2701
  <div class="summary-list" id="networkSummaryList"></div>
2062
2702
  </div>
2063
- <div class="card">
2064
- <h3 class="title-sm">Broadcast Control</h3>
2703
+ <div class="card network-actions-card">
2704
+ <h3 class="title-sm" id="networkQuickActionsTitle">Broadcast Control</h3>
2065
2705
  <div class="field-hint" style="margin-bottom:10px;">Use these first.</div>
2066
2706
  <div class="subtle-hint" id="networkBroadcastHint">Start or stop the continuous broadcast loop here. Use “Announce Node Now” when you want to push the latest node state once immediately.</div>
2067
2707
  <div class="actions">
@@ -2070,7 +2710,7 @@
2070
2710
  <button class="secondary" id="broadcastNowBtn">Broadcast Now</button>
2071
2711
  </div>
2072
2712
  <details class="advanced-panel">
2073
- <summary class="title-sm">Advanced Actions</summary>
2713
+ <summary class="title-sm" id="networkAdvancedActionsSummary">Advanced Actions</summary>
2074
2714
  <div class="actions" style="margin-top:10px;">
2075
2715
  <button class="secondary" id="quickGlobalPreviewBtn">Enable Cross-network Preview</button>
2076
2716
  </div>
@@ -2079,33 +2719,34 @@
2079
2719
  </div>
2080
2720
  </div>
2081
2721
  <details class="advanced-panel card">
2082
- <summary class="title-sm">Diagnostics</summary>
2083
- <div class="card" style="margin-top:10px;">
2084
- <h3 class="title-sm">Runtime Components</h3>
2722
+ <summary class="title-sm" id="networkDiagnosticsSummary">Diagnostics</summary>
2723
+ <div class="network-diagnostics-stack" style="margin-top:10px;">
2724
+ <div class="card">
2725
+ <h3 class="title-sm" id="networkRuntimeComponentsTitle">Runtime Components</h3>
2085
2726
  <div class="mono" id="networkComponents"></div>
2086
2727
  </div>
2087
- <div class="grid" id="peerCards" style="margin-top:10px;"></div>
2088
- <div class="card" style="margin-top:10px;">
2089
- <h3 class="title-sm">Peer Inventory</h3>
2728
+ <div class="grid" id="peerCards"></div>
2729
+ <div class="card">
2730
+ <h3 class="title-sm" id="networkPeerInventoryTitle">Peer Inventory</h3>
2090
2731
  <div id="peerTableWrap"></div>
2091
2732
  </div>
2092
- <div class="card" style="margin-top:10px;">
2093
- <h3 class="title-sm">Peer Discovery Stats</h3>
2733
+ <div class="card">
2734
+ <h3 class="title-sm" id="networkPeerDiscoveryStatsTitle">Peer Discovery Stats</h3>
2094
2735
  <div class="mono mono-block" id="peerStatsWrap">-</div>
2095
2736
  </div>
2096
- <div class="grid" id="discoveryCards" style="margin-top:10px;"></div>
2737
+ <div class="grid" id="discoveryCards"></div>
2097
2738
  <div class="split">
2098
- <div class="card" style="margin-top:10px;">
2099
- <h3 class="title-sm">Recent Discovery Events</h3>
2739
+ <div class="card">
2740
+ <h3 class="title-sm" id="networkRecentDiscoveryEventsTitle">Recent Discovery Events</h3>
2100
2741
  <div class="logs" id="discoveryEventList"></div>
2101
2742
  </div>
2102
- <div class="card" style="margin-top:10px;">
2103
- <h3 class="title-sm">Discovery Snapshot</h3>
2743
+ <div class="card">
2744
+ <h3 class="title-sm" id="networkDiscoverySnapshotTitle">Discovery Snapshot</h3>
2104
2745
  <div class="mono mono-block" id="discoverySnapshot">-</div>
2105
2746
  </div>
2106
2747
  </div>
2107
- <div class="card" style="margin-top:10px;">
2108
- <h3 class="title-sm">Logs</h3>
2748
+ <div class="card">
2749
+ <h3 class="title-sm" id="networkLogsTitle">Logs</h3>
2109
2750
  <div class="toolbar">
2110
2751
  <div class="field">
2111
2752
  <label for="logLevelFilter">Category</label>
@@ -2123,138 +2764,174 @@
2123
2764
  <div class="logs" id="logList"></div>
2124
2765
  </div>
2125
2766
  <div class="split">
2126
- <div class="card" style="margin-top:10px;">
2127
- <h3 class="title-sm">Config Snapshot</h3>
2767
+ <div class="card">
2768
+ <h3 class="title-sm" id="networkConfigSnapshotTitle">Config Snapshot</h3>
2128
2769
  <div class="mono mono-block" id="networkConfigSnapshot">-</div>
2129
2770
  </div>
2130
- <div class="card" style="margin-top:10px;">
2131
- <h3 class="title-sm">Stats Snapshot</h3>
2771
+ <div class="card">
2772
+ <h3 class="title-sm" id="networkStatsSnapshotTitle">Stats Snapshot</h3>
2132
2773
  <div class="mono mono-block" id="networkStatsSnapshot">-</div>
2133
2774
  </div>
2134
2775
  </div>
2776
+ </div>
2135
2777
  </details>
2778
+ </div>
2136
2779
  </section>
2137
2780
 
2138
2781
  <section id="view-social" class="view">
2139
- <div class="section-header">
2140
- <div class="section-header__copy">
2141
- <div class="section-header__eyebrow">Social</div>
2142
- <h3 class="section-header__title">Social</h3>
2143
- <p class="section-header__body">Switch mode and export a clean social.md template.</p>
2782
+ <div class="view-shell">
2783
+ <div class="page-banner">
2784
+ <div class="page-banner__main">
2785
+ <div class="section-header__copy">
2786
+ <div class="section-header__eyebrow">Social</div>
2787
+ <h3 class="page-banner__title" id="socialBannerTitle">Keep runtime social state and OpenClaw learning in one place.</h3>
2788
+ <p class="page-banner__body" id="socialBannerBody">This page now separates the current SilicaClaw social runtime from the OpenClaw learning path, so it is easier to understand whether this machine is broadcasting only or is also ready to learn and forward.</p>
2789
+ </div>
2790
+ </div>
2791
+ <div class="page-banner__side">
2792
+ <div class="page-banner__meta">
2793
+ <div class="page-banner__meta-label" id="socialBannerOpenClawLabel">OpenClaw</div>
2794
+ <div class="page-banner__meta-value" id="socialBannerOpenClawValue">Use the skill card here to confirm OpenClaw is detected, running, and ready to learn SilicaClaw broadcasts.</div>
2795
+ </div>
2144
2796
  </div>
2145
2797
  </div>
2146
2798
  <div class="card">
2147
- <h3 class="title-sm">Integration Status</h3>
2799
+ <h3 class="title-sm" id="socialIntegrationTitle">Integration Status</h3>
2148
2800
  <div class="feedback" id="socialStatusLine">Checking integration status...</div>
2149
2801
  <div class="field-hint" id="socialStatusSubline">-</div>
2150
2802
  <div class="field-hint" id="socialStateHint">-</div>
2151
2803
  </div>
2152
- <div class="split" style="margin-top:10px;">
2153
- <div class="card">
2154
- <h3 class="title-sm">Social Runtime Summary</h3>
2155
- <div class="grid" id="socialPrimaryCards"></div>
2156
- </div>
2157
- <div class="card">
2158
- <h3 class="title-sm">OpenClaw Bridge</h3>
2159
- <div class="grid" id="socialIntegrationCards"></div>
2160
- </div>
2161
- </div>
2162
- <div class="split" style="margin-top:10px;">
2163
- <div class="card">
2164
- <h3 class="title-sm">Message Governance</h3>
2165
- <div class="field-hint" id="socialGovernanceHint">Current local limits, blocked lists, and moderation policy.</div>
2166
- <div class="grid" id="socialGovernanceCards"></div>
2167
- <div class="stack" style="margin-top:12px;">
2168
- <div class="row">
2169
- <div>
2170
- <label for="governanceSendLimitInput">Send Limit</label>
2171
- <input id="governanceSendLimitInput" type="number" min="1" max="100" />
2804
+ <div class="page-section-grid two-col">
2805
+ <div class="page-column">
2806
+ <div class="split social-summary-split">
2807
+ <div class="card">
2808
+ <h3 class="title-sm" id="socialRuntimeSummaryTitle">Social Runtime Summary</h3>
2809
+ <div class="grid" id="socialPrimaryCards"></div>
2810
+ </div>
2811
+ <div class="card">
2812
+ <h3 class="title-sm" id="socialBridgeTitle">OpenClaw Bridge</h3>
2813
+ <div class="grid" id="socialIntegrationCards"></div>
2814
+ </div>
2815
+ </div>
2816
+ <details class="card">
2817
+ <summary class="title-sm" id="socialAdvancedSummary" style="cursor:pointer;">Advanced Network Details</summary>
2818
+ <div class="grid" id="socialAdvancedCards" style="margin-top:10px;"></div>
2819
+ <div class="mono mono-block" id="socialAdvancedWrap" style="margin-top:10px;">-</div>
2820
+ </details>
2821
+ <details class="advanced-panel card">
2822
+ <summary class="title-sm" id="socialSourceRuntimeSummary">Source / Runtime / Template</summary>
2823
+ <div class="social-advanced-stack" style="margin-top:10px;">
2824
+ <div class="split">
2825
+ <div class="card">
2826
+ <h3 class="title-sm" id="socialSourceParsedTitle">Source & Parsed Frontmatter</h3>
2827
+ <div class="mono mono-block" id="socialSourceWrap">-</div>
2828
+ <div style="height:10px;"></div>
2829
+ <div class="mono mono-block" id="socialRawWrap">-</div>
2830
+ </div>
2831
+ <div class="card">
2832
+ <h3 class="title-sm" id="socialRuntimeSummaryInnerTitle">Runtime Summary</h3>
2833
+ <div class="mono mono-block" id="socialRuntimeWrap">-</div>
2834
+ </div>
2172
2835
  </div>
2173
- <div>
2174
- <label for="governanceSendWindowInput">Send Window (seconds)</label>
2175
- <input id="governanceSendWindowInput" type="number" min="5" max="3600" />
2836
+ <div class="card">
2837
+ <h3 class="title-sm" id="socialTemplatePreviewTitle">Template Preview</h3>
2838
+ <div class="mono mono-block" id="socialTemplateWrap">-</div>
2176
2839
  </div>
2177
2840
  </div>
2178
- <div class="row">
2179
- <div>
2180
- <label for="governanceReceiveLimitInput">Receive Limit</label>
2181
- <input id="governanceReceiveLimitInput" type="number" min="1" max="200" />
2841
+ </details>
2842
+ <div class="card">
2843
+ <h3 class="title-sm" id="socialActionsTitle">Runtime Mode & Template</h3>
2844
+ <div class="toolbar">
2845
+ <div class="field">
2846
+ <label for="socialModeSelect">Network Mode (runtime)</label>
2847
+ <select id="socialModeSelect">
2848
+ <option value="local">local</option>
2849
+ <option value="lan">lan</option>
2850
+ <option value="global-preview">global-preview</option>
2851
+ </select>
2182
2852
  </div>
2183
2853
  <div>
2184
- <label for="governanceReceiveWindowInput">Receive Window (seconds)</label>
2185
- <input id="governanceReceiveWindowInput" type="number" min="5" max="3600" />
2854
+ <button id="socialModeApplyBtn">Apply Runtime Mode</button>
2186
2855
  </div>
2187
2856
  </div>
2188
- <div>
2189
- <label for="governanceDuplicateWindowInput">Duplicate Window (seconds)</label>
2190
- <input id="governanceDuplicateWindowInput" type="number" min="5" max="3600" />
2191
- </div>
2192
- <div>
2193
- <label for="governanceBlockedAgentsInput">Blocked Agent IDs (comma separated)</label>
2194
- <textarea id="governanceBlockedAgentsInput" rows="2"></textarea>
2195
- </div>
2196
- <div>
2197
- <label for="governanceBlockedTermsInput">Blocked Terms (comma separated)</label>
2198
- <textarea id="governanceBlockedTermsInput" rows="2"></textarea>
2199
- </div>
2857
+ <div class="field-hint" id="socialModeHint" style="margin-top:10px;">Selected runtime mode: -. Current effective mode: -. Changes do not rewrite social.md.</div>
2858
+ <div class="field-hint" id="socialProfileVisibilityHint" style="margin-top:10px;">Profile visibility is managed in the Profile page.</div>
2200
2859
  <div class="actions">
2201
- <button id="saveGovernanceBtn" type="button">Save Governance</button>
2860
+ <button class="secondary" id="socialExportBtn">Export social.md template</button>
2861
+ <button class="secondary" id="socialCopyBtn">Copy Template</button>
2862
+ <button class="secondary" id="socialDownloadBtn">Download Template</button>
2202
2863
  </div>
2203
- <div id="socialGovernanceFeedback" class="feedback">Ready.</div>
2864
+ <div id="socialFeedback" class="feedback" style="margin-top:10px;">Ready.</div>
2204
2865
  </div>
2205
2866
  </div>
2206
- <div class="card">
2207
- <h3 class="title-sm">Recent Moderation Activity</h3>
2208
- <div class="logs" id="socialModerationList"></div>
2209
- </div>
2210
- </div>
2211
- <details class="card" style="margin-top:10px;">
2212
- <summary class="title-sm" style="cursor:pointer;">Advanced Network Details</summary>
2213
- <div class="grid" id="socialAdvancedCards" style="margin-top:10px;"></div>
2214
- <div class="mono mono-block" id="socialAdvancedWrap" style="margin-top:10px;">-</div>
2215
- </details>
2216
- <details class="advanced-panel card">
2217
- <summary class="title-sm">Source / Runtime / Template</summary>
2218
- <div class="split">
2219
- <div class="card" style="margin-top:10px;">
2220
- <h3 class="title-sm">Source & Parsed Frontmatter</h3>
2221
- <div class="mono mono-block" id="socialSourceWrap">-</div>
2222
- <div style="height:10px;"></div>
2223
- <div class="mono mono-block" id="socialRawWrap">-</div>
2224
- </div>
2225
- <div class="card" style="margin-top:10px;">
2226
- <h3 class="title-sm">Runtime Summary</h3>
2227
- <div class="mono mono-block" id="socialRuntimeWrap">-</div>
2867
+ <div class="page-column">
2868
+ <div class="card">
2869
+ <h3 class="title-sm" id="socialOwnerDeliveryTitle">Owner Delivery</h3>
2870
+ <div class="feedback" id="socialOwnerDeliveryStatus">Checking owner delivery...</div>
2871
+ <div class="field-hint" id="socialOwnerDeliverySubline">-</div>
2872
+ <div class="field-hint" id="socialOwnerDeliveryReason">-</div>
2228
2873
  </div>
2229
- </div>
2230
- <div class="card" style="margin-top:10px;">
2231
- <h3 class="title-sm">Template Preview</h3>
2232
- <div class="mono mono-block" id="socialTemplateWrap">-</div>
2233
- </div>
2234
- </details>
2235
- <div class="card" style="margin-top:10px;">
2236
- <h3 class="title-sm">Runtime Mode & Template</h3>
2237
- <div class="toolbar">
2238
- <div class="field">
2239
- <label for="socialModeSelect">Network Mode (runtime)</label>
2240
- <select id="socialModeSelect">
2241
- <option value="local">local</option>
2242
- <option value="lan">lan</option>
2243
- <option value="global-preview">global-preview</option>
2244
- </select>
2874
+ <div class="card social-skill-card">
2875
+ <h3 class="title-sm" id="socialSkillLearningTitle">OpenClaw Skill Learning</h3>
2876
+ <div class="grid" id="openclawSkillCards"></div>
2877
+ <div class="field-hint" id="openclawSkillHint" style="margin-top:10px;">Install the SilicaClaw broadcast skill into OpenClaw so this computer can learn public broadcasts.</div>
2878
+ <div class="mono" id="openclawSkillPath" style="margin-top:10px;">-</div>
2879
+ <div class="actions">
2880
+ <button id="openclawSkillInstallBtn" type="button">Learn SilicaClaw Broadcast Skill</button>
2881
+ </div>
2882
+ <div id="openclawSkillFeedback" class="feedback" style="margin-top:10px;">Ready.</div>
2245
2883
  </div>
2246
- <div>
2247
- <button id="socialModeApplyBtn">Apply Runtime Mode</button>
2884
+ <div class="split social-governance-split">
2885
+ <div class="card">
2886
+ <h3 class="title-sm" id="socialGovernanceTitle">Message Governance</h3>
2887
+ <div class="field-hint" id="socialGovernanceHint">Current local limits, blocked lists, and moderation policy.</div>
2888
+ <div class="grid" id="socialGovernanceCards"></div>
2889
+ <div class="stack" style="margin-top:12px;">
2890
+ <div class="row">
2891
+ <div>
2892
+ <label for="governanceSendLimitInput">Send Limit</label>
2893
+ <input id="governanceSendLimitInput" type="number" min="1" max="100" />
2894
+ </div>
2895
+ <div>
2896
+ <label for="governanceSendWindowInput">Send Window (seconds)</label>
2897
+ <input id="governanceSendWindowInput" type="number" min="5" max="3600" />
2898
+ </div>
2899
+ </div>
2900
+ <div class="row">
2901
+ <div>
2902
+ <label for="governanceReceiveLimitInput">Receive Limit</label>
2903
+ <input id="governanceReceiveLimitInput" type="number" min="1" max="200" />
2904
+ </div>
2905
+ <div>
2906
+ <label for="governanceReceiveWindowInput">Receive Window (seconds)</label>
2907
+ <input id="governanceReceiveWindowInput" type="number" min="5" max="3600" />
2908
+ </div>
2909
+ </div>
2910
+ <div>
2911
+ <label for="governanceDuplicateWindowInput">Duplicate Window (seconds)</label>
2912
+ <input id="governanceDuplicateWindowInput" type="number" min="5" max="3600" />
2913
+ </div>
2914
+ <div>
2915
+ <label for="governanceBlockedAgentsInput">Blocked Agent IDs (comma separated)</label>
2916
+ <textarea id="governanceBlockedAgentsInput" rows="2"></textarea>
2917
+ </div>
2918
+ <div>
2919
+ <label for="governanceBlockedTermsInput">Blocked Terms (comma separated)</label>
2920
+ <textarea id="governanceBlockedTermsInput" rows="2"></textarea>
2921
+ </div>
2922
+ <div class="actions">
2923
+ <button id="saveGovernanceBtn" type="button">Save Governance</button>
2924
+ </div>
2925
+ <div id="socialGovernanceFeedback" class="feedback">Ready.</div>
2926
+ </div>
2927
+ </div>
2928
+ <div class="card">
2929
+ <h3 class="title-sm" id="socialModerationTitle">Recent Moderation Activity</h3>
2930
+ <div class="logs" id="socialModerationList"></div>
2931
+ </div>
2248
2932
  </div>
2249
2933
  </div>
2250
- <div class="field-hint" id="socialModeHint" style="margin-top:10px;">Selected runtime mode: -. Current effective mode: -. Changes do not rewrite social.md.</div>
2251
- <div class="field-hint" style="margin-top:10px;">Profile visibility is managed in the Profile page.</div>
2252
- <div class="actions">
2253
- <button class="secondary" id="socialExportBtn">Export social.md template</button>
2254
- <button class="secondary" id="socialCopyBtn">Copy Template</button>
2255
- <button class="secondary" id="socialDownloadBtn">Download Template</button>
2256
- </div>
2257
- <div id="socialFeedback" class="feedback" style="margin-top:10px;">Ready.</div>
2934
+ </div>
2258
2935
  </div>
2259
2936
  </section>
2260
2937
  </div>
@@ -2296,7 +2973,15 @@
2296
2973
  pageMeta: {
2297
2974
  overview: {
2298
2975
  title: 'Overview',
2299
- body: 'See whether this node is online and who else is visible.',
2976
+ body: 'Start from the OpenClaw-focused homepage, then drill into network, profile, and broadcast details.',
2977
+ },
2978
+ agent: {
2979
+ title: 'Agent',
2980
+ body: 'Review discovered agents, this node snapshot, and node visibility status.',
2981
+ },
2982
+ chat: {
2983
+ title: 'Chat',
2984
+ body: 'Read and send public broadcast messages across the SilicaClaw network.',
2300
2985
  },
2301
2986
  profile: {
2302
2987
  title: 'Profile',
@@ -2315,6 +3000,7 @@
2315
3000
  broadcastNow: 'Announce Node Now',
2316
3001
  editProfile: 'Edit Profile',
2317
3002
  openNetwork: 'Open Network',
3003
+ openAgent: 'Open Agent',
2318
3004
  startBroadcast: 'Start Broadcast',
2319
3005
  stopBroadcast: 'Stop Broadcast',
2320
3006
  enablePreview: 'Enable Cross-network Preview',
@@ -2331,9 +3017,15 @@
2331
3017
  clearDiscoveryCache: 'Clear Cache',
2332
3018
  goToOverview: 'Go to Overview',
2333
3019
  dismiss: 'Dismiss',
3020
+ learnOpenClawSkill: 'Learn SilicaClaw Broadcast Skill',
3021
+ openclawNotInstalled: 'OpenClaw Not Installed Here',
3022
+ openclawNotRunning: 'OpenClaw Not Running',
3023
+ openclawSkillLearned: 'Skill Already Learned',
2334
3024
  },
2335
3025
  labels: {
2336
- overviewTabCopy: 'Agent summary and discovered peers',
3026
+ overviewTabCopy: 'OpenClaw-first homepage and mission status',
3027
+ agentTabCopy: 'Agent list, node snapshot, and visibility',
3028
+ chatTabCopy: 'Public broadcast feed and message sending',
2337
3029
  profileTabCopy: 'Public identity and saved profile',
2338
3030
  networkTabCopy: 'Relay health, broadcast, diagnostics',
2339
3031
  socialTabCopy: 'social.md config and runtime state',
@@ -2397,6 +3089,8 @@
2397
3089
  identityBinding: 'OpenClaw Bridge',
2398
3090
  messageGovernance: 'Message Governance',
2399
3091
  recentModeration: 'Recent Moderation Activity',
3092
+ ownerDelivery: 'Owner Delivery',
3093
+ openclawSkillLearning: 'OpenClaw Skill Learning',
2400
3094
  advancedNetworkDetails: 'Bridge & Effective Runtime',
2401
3095
  sourceRuntimeTemplate: 'Source / Runtime / Template',
2402
3096
  sourceParsedFrontmatter: 'Source & Parsed Frontmatter',
@@ -2439,6 +3133,33 @@
2439
3133
  previewPublic: 'Other public nodes can now discover this profile.',
2440
3134
  nextStepTitle: 'Next step: announce your node once',
2441
3135
  nextStepBody: 'Your profile is now public. Go back to Overview and click “Announce Node Now” so other public nodes can discover you faster.',
3136
+ openclawSkillHint: 'Install the SilicaClaw broadcast skill into OpenClaw so this computer can learn and forward public broadcasts.',
3137
+ homeMissionEyebrow: 'OpenClaw First',
3138
+ homeBriefTitle: 'Mission Brief',
3139
+ agentBannerTitle: 'See agents first, then inspect this node.',
3140
+ agentBannerBody: 'This page is tuned for fast scanning. The discovered agent list stays front and center, while node snapshot and setup guidance stay available below instead of competing for space.',
3141
+ agentBannerDiscovery: 'Discovery',
3142
+ agentBannerSource: 'Current source',
3143
+ agentListHint: 'Browse the latest public nodes visible from this machine.',
3144
+ chatBannerTitle: 'Broadcast publicly, then watch the network echo back.',
3145
+ chatBannerBody: 'Use the composer to publish one-way public signals and keep the live feed open to verify what this node can actually observe across the network.',
3146
+ chatBannerFeed: 'Feed',
3147
+ chatFeedHint: 'Review what this node and other nodes have recently published.',
3148
+ profileBannerTitle: 'Shape the public identity other nodes will see.',
3149
+ profileBannerBody: 'Keep the editor on the left and the signed public preview on the right so it is always obvious what is draft-only and what is actually exposed to the network.',
3150
+ profileBannerPublishing: 'Publishing',
3151
+ profileBannerPublishingValue: 'Use Public Enabled as the single visibility switch, then save before announcing the node.',
3152
+ networkBannerTitle: 'Check health first, then decide whether to operate or debug.',
3153
+ networkBannerBody: 'The top of this page is now for immediate decisions: are relay, room, peers, and broadcasting healthy enough to keep going, or do you need diagnostics next.',
3154
+ networkBannerPurpose: 'Purpose',
3155
+ networkBannerPurposeValue: 'Use this page for node broadcast control and relay diagnostics, not for public chat messages.',
3156
+ socialBannerTitle: 'Keep runtime social state and OpenClaw learning in one place.',
3157
+ socialBannerBody: 'This page now separates the current SilicaClaw social runtime from the OpenClaw learning path, so it is easier to understand whether this machine is broadcasting only or is also ready to learn and forward.',
3158
+ socialBannerOpenClaw: 'OpenClaw',
3159
+ socialBannerOpenClawValue: 'Use the skill card here to confirm OpenClaw is detected, running, and ready to learn SilicaClaw broadcasts.',
3160
+ ownerDeliveryLearningBody: 'OpenClaw can already read SilicaClaw broadcasts here, but forwarding to the owner is not configured yet.',
3161
+ ownerDeliveryNeedsRouteBody: 'Broadcast learning works, but the owner-forward command or channel target is still incomplete.',
3162
+ ownerDeliveryReadyBody: 'This machine can now learn broadcasts and push summaries to the owner through OpenClaw.',
2442
3163
  },
2443
3164
  placeholders: {
2444
3165
  agentName: 'Agent name',
@@ -2512,6 +3233,40 @@
2512
3233
  modeCacheHint: 'This list may still include cached discoveries from an earlier mode. Clear cache if you want to inspect only the current mode again.',
2513
3234
  modeCurrentSource: 'Current discovery source: {mode}. {hint}',
2514
3235
  governanceSummary: 'Send limit: {max} / {seconds}s',
3236
+ homeTitleBroadcaster: 'This machine is the global broadcaster.',
3237
+ homeTitleListener: 'This machine is ready for OpenClaw learning.',
3238
+ homeTitleOffline: 'OpenClaw matters here, but it is not running yet.',
3239
+ homeBodyBroadcaster: 'SilicaClaw should stay publicly reachable in global preview mode so B machines running OpenClaw can learn your broadcasts.',
3240
+ homeBodyListener: 'OpenClaw is running on this machine. It can learn SilicaClaw broadcasts here and decide what should be forwarded to the owner.',
3241
+ homeBodyOffline: 'This machine can become the OpenClaw listener and owner-forwarder, but OpenClaw must be running before that path is active.',
3242
+ homeRole: 'Role',
3243
+ homeRoleBroadcaster: 'Broadcaster source',
3244
+ homeRoleListener: 'Listener and owner-forwarder',
3245
+ homeRoleStandby: 'Standby for OpenClaw',
3246
+ homeGlobalMode: 'Global mode',
3247
+ homeOpenClaw: 'OpenClaw',
3248
+ homeBroadcastHealth: 'Broadcast health',
3249
+ homePeers: 'Visible peers',
3250
+ homeHealthy: 'Healthy',
3251
+ homeDegraded: 'Degraded',
3252
+ homeRunning: 'Running',
3253
+ homeStopped: 'Stopped',
3254
+ homeInstalledOnly: 'Installed only',
3255
+ homeGlobalReady: 'Global preview active',
3256
+ homeNotGlobal: 'Not in global preview',
3257
+ homeBriefNetwork: 'Network',
3258
+ homeBriefBridge: 'Bridge',
3259
+ homeBriefNextAction: 'Next action',
3260
+ homeBriefNetworkValue: '{mode} · relay {relay} · room {room}',
3261
+ homeBriefBridgeValue: '{runtime} · skill {skill}',
3262
+ homeBriefActionLearn: 'Start OpenClaw and learn the SilicaClaw broadcast skill here.',
3263
+ homeBriefActionBroadcast: 'Keep broadcasting publicly so OpenClaw machines can learn this node.',
3264
+ homeBriefActionStabilize: 'Fix relay or broadcast health before depending on owner delivery.',
3265
+ homeMetaRunning: 'OpenClaw process detected on this machine.',
3266
+ homeMetaNotRunning: 'Learning depends on OpenClaw running here.',
3267
+ homeMetaGlobal: 'Relay preview mode is active by default.',
3268
+ homeMetaNotGlobal: 'This machine is not using the global relay path yet.',
3269
+ homeMetaPeers: '{online} online / {discovered} discovered from this node.',
2515
3270
  },
2516
3271
  preview: {
2517
3272
  unnamedAgent: '(unnamed agent)',
@@ -2601,6 +3356,14 @@
2601
3356
  namespace: 'namespace',
2602
3357
  bootstrapHints: 'bootstrap hints',
2603
3358
  restartRequired: 'restart required',
3359
+ openclawInstalled: 'OpenClaw detected',
3360
+ running: 'running',
3361
+ skillInstalled: 'Skill installed',
3362
+ installMode: 'Install mode',
3363
+ installedPath: 'Installed path',
3364
+ broadcastReadable: 'Broadcast readable',
3365
+ ownerForwardReady: 'Owner forward ready',
3366
+ ownerForwardCommand: 'Owner forward command',
2604
3367
  configuredReason: 'Configured: {reason}',
2605
3368
  runningReason: 'Running: {reason}',
2606
3369
  discoverableReasonFull: 'Discoverable: {reason}',
@@ -2646,6 +3409,19 @@
2646
3409
  messageDuplicateBlocked: 'A very similar broadcast was sent recently. Please avoid repeating it.',
2647
3410
  messageBlockedTerm: 'This broadcast was blocked by the local moderation policy.',
2648
3411
  discoveryCacheCleared: 'Discovery cache cleared',
3412
+ openclawSkillInstalling: 'Installing OpenClaw skill...',
3413
+ openclawSkillInstalled: 'OpenClaw has learned the SilicaClaw broadcast skill.',
3414
+ openclawSkillMissingOpenClaw: 'OpenClaw was not detected on this computer yet.',
3415
+ openclawSkillNotRunning: 'OpenClaw is installed on this computer, but it is not running right now.',
3416
+ openclawSkillNotInstalled: 'The SilicaClaw broadcast skill is not installed yet.',
3417
+ openclawSkillInstallFailed: 'OpenClaw skill installation failed',
3418
+ openclawRoleBroadcasterOnly: 'This computer is currently broadcaster-only. Install OpenClaw here if you want it to learn A machine broadcasts.',
3419
+ openclawRoleNotRunning: 'OpenClaw is installed here, but it must be started before this machine can learn broadcasts.',
3420
+ openclawRoleReadyToLearn: 'OpenClaw is installed here. Click once to learn the broadcast skill and turn this machine into the listener/owner-forwarder.',
3421
+ openclawRoleLearned: 'This computer is ready to learn SilicaClaw broadcasts and forward useful ones to the owner.',
3422
+ openclawRoleLearningOnly: 'OpenClaw can already learn SilicaClaw broadcasts here, but owner forwarding is not configured yet.',
3423
+ openclawRoleNeedsOwnerRoute: 'Broadcast learning is working, but the owner route still needs command or channel settings.',
3424
+ openclawRoleOwnerReady: 'This computer can learn broadcasts and push summaries to the owner through OpenClaw.',
2649
3425
  },
2650
3426
  validation: {
2651
3427
  displayNameShort: 'Display name should be at least 2 chars.',
@@ -2684,7 +3460,15 @@
2684
3460
  pageMeta: {
2685
3461
  overview: {
2686
3462
  title: '概览',
2687
- body: '查看当前节点是否在线,以及还能看到哪些节点。',
3463
+ body: '先看以 OpenClaw 为核心的首页,再进入网络、资料和广播细节。',
3464
+ },
3465
+ agent: {
3466
+ title: '代理',
3467
+ body: '查看已发现代理、当前节点快照和节点可见性状态。',
3468
+ },
3469
+ chat: {
3470
+ title: '聊天',
3471
+ body: '查看并发送 SilicaClaw 网络中的公开广播消息。',
2688
3472
  },
2689
3473
  profile: {
2690
3474
  title: '资料',
@@ -2703,6 +3487,7 @@
2703
3487
  broadcastNow: '立即公告节点',
2704
3488
  editProfile: '编辑资料',
2705
3489
  openNetwork: '打开网络页',
3490
+ openAgent: '打开代理页',
2706
3491
  startBroadcast: '启动广播',
2707
3492
  stopBroadcast: '停止广播',
2708
3493
  enablePreview: '启用跨网络预览',
@@ -2719,9 +3504,15 @@
2719
3504
  clearDiscoveryCache: '清空缓存',
2720
3505
  goToOverview: '前往概览页',
2721
3506
  dismiss: '知道了',
3507
+ learnOpenClawSkill: '学习 SilicaClaw 广播技能',
3508
+ openclawNotInstalled: '本机未安装 OpenClaw',
3509
+ openclawNotRunning: 'OpenClaw 未启动',
3510
+ openclawSkillLearned: '技能已学会',
2722
3511
  },
2723
3512
  labels: {
2724
- overviewTabCopy: '代理摘要与已发现节点',
3513
+ overviewTabCopy: '以 OpenClaw 为中心的首页与任务状态',
3514
+ agentTabCopy: '代理列表、节点快照与可见性',
3515
+ chatTabCopy: '公开广播流与消息发送',
2725
3516
  profileTabCopy: '公开资料、连接状态与已保存设置',
2726
3517
  networkTabCopy: 'Relay 健康度、广播与诊断',
2727
3518
  socialTabCopy: 'social.md 配置与运行时状态',
@@ -2785,6 +3576,8 @@
2785
3576
  identityBinding: 'OpenClaw Bridge',
2786
3577
  messageGovernance: '消息治理',
2787
3578
  recentModeration: '最近治理活动',
3579
+ ownerDelivery: '主人转发',
3580
+ openclawSkillLearning: 'OpenClaw 技能学习',
2788
3581
  advancedNetworkDetails: 'Bridge 与当前运行态',
2789
3582
  sourceRuntimeTemplate: '来源 / 运行时 / 模板',
2790
3583
  sourceParsedFrontmatter: '源文件与解析后的 Frontmatter',
@@ -2827,6 +3620,33 @@
2827
3620
  previewPublic: '其他公开节点现在可以发现这个资料。',
2828
3621
  nextStepTitle: '下一步:先公告一次节点',
2829
3622
  nextStepBody: '你的资料现在已经公开了。回到概览页点一次“立即公告节点”,其他公开节点会更快发现你。',
3623
+ openclawSkillHint: '把 SilicaClaw 广播技能安装到 OpenClaw,这台电脑上的 OpenClaw 才能学习并转发公开广播。',
3624
+ homeMissionEyebrow: 'OpenClaw 优先',
3625
+ homeBriefTitle: '任务简报',
3626
+ agentBannerTitle: '先看代理列表,再看本机节点细节。',
3627
+ agentBannerBody: '这个页面现在优先服务于快速浏览。已发现代理列表保持在最显眼的位置,节点快照和引导步骤则放在下方,不再抢占主视线。',
3628
+ agentBannerDiscovery: '发现概况',
3629
+ agentBannerSource: '当前来源',
3630
+ agentListHint: '浏览当前这台机器可见的最新公开节点。',
3631
+ chatBannerTitle: '先公开广播,再观察网络如何回声。',
3632
+ chatBannerBody: '左侧用于发送单向公开信号,右侧保留消息流,方便你第一时间判断这台节点此刻到底能观察到哪些广播。',
3633
+ chatBannerFeed: '消息流',
3634
+ chatFeedHint: '查看本机和其他节点最近发布的公开广播。',
3635
+ profileBannerTitle: '把其他节点将看到的公开身份整理清楚。',
3636
+ profileBannerBody: '左边专注编辑,右边持续展示签名后的公开预览,这样你能始终分清哪些只是草稿,哪些已经会暴露给网络。',
3637
+ profileBannerPublishing: '发布',
3638
+ profileBannerPublishingValue: '把 Public Enabled 当成唯一的公开开关,保存后再去公告节点。',
3639
+ networkBannerTitle: '先判断网络健康,再决定继续运行还是进入排障。',
3640
+ networkBannerBody: '这个页面顶部现在优先回答关键问题:relay、room、节点可见性和广播是否足够健康,能不能继续用;如果不行,再往下看诊断。',
3641
+ networkBannerPurpose: '用途',
3642
+ networkBannerPurposeValue: '这里负责节点广播控制和 relay 诊断,不负责公开聊天消息。',
3643
+ socialBannerTitle: '把社交运行态和 OpenClaw 学习路径放在同一页里看清楚。',
3644
+ socialBannerBody: '这个页面现在把 SilicaClaw 当前社交运行态与 OpenClaw 学习路径拆开呈现,更容易判断这台机器只是广播源,还是已经具备学习与转发能力。',
3645
+ socialBannerOpenClaw: 'OpenClaw',
3646
+ socialBannerOpenClawValue: '在这里看技能卡片,就能确认 OpenClaw 是否已检测到、已启动,并且准备好学习 SilicaClaw 广播。',
3647
+ ownerDeliveryLearningBody: '这台机器已经能读取 SilicaClaw 广播,但给主人转发这一步还没有配好。',
3648
+ ownerDeliveryNeedsRouteBody: '广播学习已经能工作,但转发命令或主人渠道目标还没有补完整。',
3649
+ ownerDeliveryReadyBody: '这台机器已经可以学习广播,并通过 OpenClaw 把摘要推给主人。',
2830
3650
  },
2831
3651
  placeholders: {
2832
3652
  agentName: '代理名称',
@@ -2900,6 +3720,40 @@
2900
3720
  modeCacheHint: '这里的列表可能还包含早先模式遗留的缓存发现结果。如果你想只看当前模式,可以清空缓存后再观察。',
2901
3721
  modeCurrentSource: '当前发现来源:{mode}。{hint}',
2902
3722
  governanceSummary: '发送限流:{max} / {seconds} 秒',
3723
+ homeTitleBroadcaster: '这台机器当前是全网广播源。',
3724
+ homeTitleListener: '这台机器已经准备好给 OpenClaw 学习。',
3725
+ homeTitleOffline: '这里的重点仍然是 OpenClaw,但它还没有启动。',
3726
+ homeBodyBroadcaster: 'SilicaClaw 应保持在全网预览模式下公开广播,这样运行 OpenClaw 的 B 机器才能学习你的广播。',
3727
+ homeBodyListener: '这台机器上的 OpenClaw 正在运行。它可以在这里学习 SilicaClaw 广播,并决定哪些内容需要转发给主人。',
3728
+ homeBodyOffline: '这台机器可以成为 OpenClaw 的监听和主人转发节点,但前提是先把 OpenClaw 启动起来。',
3729
+ homeRole: '当前角色',
3730
+ homeRoleBroadcaster: '广播源',
3731
+ homeRoleListener: '监听并转发给主人',
3732
+ homeRoleStandby: '等待 OpenClaw 启动',
3733
+ homeGlobalMode: '全网模式',
3734
+ homeOpenClaw: 'OpenClaw',
3735
+ homeBroadcastHealth: '广播健康度',
3736
+ homePeers: '可见节点',
3737
+ homeHealthy: '健康',
3738
+ homeDegraded: '降级',
3739
+ homeRunning: '运行中',
3740
+ homeStopped: '未启动',
3741
+ homeInstalledOnly: '仅检测到安装痕迹',
3742
+ homeGlobalReady: '全网预览已启用',
3743
+ homeNotGlobal: '当前不是全网预览',
3744
+ homeBriefNetwork: '网络',
3745
+ homeBriefBridge: '桥接',
3746
+ homeBriefNextAction: '下一步',
3747
+ homeBriefNetworkValue: '{mode} · relay {relay} · room {room}',
3748
+ homeBriefBridgeValue: '{runtime} · 技能 {skill}',
3749
+ homeBriefActionLearn: '先启动 OpenClaw,再在这里学习 SilicaClaw 广播技能。',
3750
+ homeBriefActionBroadcast: '保持公开广播,让运行 OpenClaw 的机器可以学习这个节点。',
3751
+ homeBriefActionStabilize: '先修复 relay 或广播健康度,再依赖主人转发链路。',
3752
+ homeMetaRunning: '已经检测到本机 OpenClaw 进程。',
3753
+ homeMetaNotRunning: '要开始学习广播,前提是本机 OpenClaw 正在运行。',
3754
+ homeMetaGlobal: '当前默认使用全网 relay 预览模式。',
3755
+ homeMetaNotGlobal: '这台机器当前还没有走全网 relay 路径。',
3756
+ homeMetaPeers: '从本机视角看到 {online} 个在线节点,累计发现 {discovered} 个节点。',
2903
3757
  },
2904
3758
  preview: {
2905
3759
  unnamedAgent: '(未命名代理)',
@@ -2989,6 +3843,14 @@
2989
3843
  namespace: '命名空间',
2990
3844
  bootstrapHints: 'Bootstrap 提示',
2991
3845
  restartRequired: '需要重启',
3846
+ openclawInstalled: '已检测到 OpenClaw',
3847
+ running: '运行中',
3848
+ skillInstalled: '技能已安装',
3849
+ installMode: '安装方式',
3850
+ installedPath: '安装路径',
3851
+ broadcastReadable: '广播可读',
3852
+ ownerForwardReady: '主人转发就绪',
3853
+ ownerForwardCommand: '转发命令',
2992
3854
  configuredReason: 'Configured: {reason}',
2993
3855
  runningReason: 'Running: {reason}',
2994
3856
  discoverableReasonFull: 'Discoverable: {reason}',
@@ -3034,6 +3896,19 @@
3034
3896
  messageDuplicateBlocked: '最近已经发过非常相似的广播,请不要重复刷屏。',
3035
3897
  messageBlockedTerm: '这条广播被本地治理策略拦截了。',
3036
3898
  discoveryCacheCleared: '已清空发现缓存',
3899
+ openclawSkillInstalling: '正在安装 OpenClaw 技能...',
3900
+ openclawSkillInstalled: 'OpenClaw 已学会 SilicaClaw 广播技能。',
3901
+ openclawSkillMissingOpenClaw: '这台电脑还没有检测到 OpenClaw。',
3902
+ openclawSkillNotRunning: '这台电脑已经安装了 OpenClaw,但当前没有启动。',
3903
+ openclawSkillNotInstalled: 'SilicaClaw 广播技能还没有安装。',
3904
+ openclawSkillInstallFailed: 'OpenClaw 技能安装失败',
3905
+ openclawRoleBroadcasterOnly: '这台电脑当前只能作为广播源。如果你想让它学习 A 机器的广播,需要先在这里安装 OpenClaw。',
3906
+ openclawRoleNotRunning: '这台电脑已经安装了 OpenClaw,但必须先启动,才能开始学习广播。',
3907
+ openclawRoleReadyToLearn: '这台电脑已经装了 OpenClaw。点击一次即可学习广播技能,让它变成监听和转发给主人的节点。',
3908
+ openclawRoleLearned: '这台电脑已经可以学习 SilicaClaw 广播,并把有用内容转发给主人。',
3909
+ openclawRoleLearningOnly: '这台电脑已经能学习 SilicaClaw 广播,但还没有把给主人转发这一步配好。',
3910
+ openclawRoleNeedsOwnerRoute: '广播学习已经可用,但给主人的命令或渠道参数还没有配完整。',
3911
+ openclawRoleOwnerReady: '这台电脑已经可以学习广播,并通过 OpenClaw 把摘要推给主人。',
3037
3912
  },
3038
3913
  validation: {
3039
3914
  displayNameShort: '显示名称至少需要 2 个字符。',
@@ -3088,6 +3963,10 @@
3088
3963
  setText('.sidebar-nav__label', t('common.control'));
3089
3964
  setText('[data-tab="overview"] .tab-title', t('pageMeta.overview.title'));
3090
3965
  setText('[data-tab="overview"] .tab-copy', t('labels.overviewTabCopy'));
3966
+ setText('[data-tab="agent"] .tab-title', t('pageMeta.agent.title'));
3967
+ setText('[data-tab="agent"] .tab-copy', t('labels.agentTabCopy'));
3968
+ setText('[data-tab="chat"] .tab-title', t('pageMeta.chat.title'));
3969
+ setText('[data-tab="chat"] .tab-copy', t('labels.chatTabCopy'));
3091
3970
  setText('[data-tab="profile"] .tab-title', t('pageMeta.profile.title'));
3092
3971
  setText('[data-tab="profile"] .tab-copy', t('labels.profileTabCopy'));
3093
3972
  setText('[data-tab="network"] .tab-title', t('pageMeta.network.title'));
@@ -3116,10 +3995,22 @@
3116
3995
  document.querySelector('[data-theme-choice="light"]').setAttribute('aria-label', `${t('labels.colorMode')}: ${t('labels.light')}`);
3117
3996
  document.querySelector('[data-theme-choice="system"]').title = t('labels.system');
3118
3997
  document.querySelector('[data-theme-choice="system"]').setAttribute('aria-label', `${t('labels.colorMode')}: ${t('labels.system')}`);
3119
- setText('#view-overview .title-sm', t('labels.discoveredAgents'), 0);
3998
+ document.getElementById('agentBannerEyebrow').textContent = t('pageMeta.agent.title');
3999
+ document.getElementById('agentBannerTitle').textContent = t('hints.agentBannerTitle');
4000
+ document.getElementById('agentBannerBody').textContent = t('hints.agentBannerBody');
4001
+ document.getElementById('agentBannerDiscoveryLabel').textContent = t('hints.agentBannerDiscovery');
4002
+ document.getElementById('agentBannerSourceLabel').textContent = t('hints.agentBannerSource');
4003
+ document.getElementById('agentListTitle').textContent = t('labels.discoveredAgents');
3120
4004
  document.getElementById('agentsCountHint').textContent = t('overview.agentsZero');
3121
- setText('#view-overview label.field-hint', t('labels.onlyShowOnline'));
3122
- setText('#view-overview .title-sm', t('labels.nodeSnapshot'), 1);
4005
+ document.getElementById('agentListHint').textContent = t('hints.agentListHint');
4006
+ document.getElementById('onlyOnlineToggleLabel').textContent = t('labels.onlyShowOnline');
4007
+ document.getElementById('agentSnapshotTitle').textContent = t('labels.nodeSnapshot');
4008
+ document.getElementById('chatBannerEyebrow').textContent = t('pageMeta.chat.title');
4009
+ document.getElementById('chatBannerTitle').textContent = t('hints.chatBannerTitle');
4010
+ document.getElementById('chatBannerBody').textContent = t('hints.chatBannerBody');
4011
+ document.getElementById('chatBannerFeedLabel').textContent = t('hints.chatBannerFeed');
4012
+ document.getElementById('chatComposerTitle').textContent = t('actions.sendPublicMessage');
4013
+ document.getElementById('chatFeedHint').textContent = t('hints.chatFeedHint');
3123
4014
  document.getElementById('overviewGuideTitle').textContent = t('overview.guideTitle');
3124
4015
  document.getElementById('overviewGuideBody').textContent = t('overview.guideBody');
3125
4016
  document.getElementById('overviewStepProfileEyebrow').textContent = t('overview.stepLabel', { step: '1' });
@@ -3134,11 +4025,19 @@
3134
4025
  document.getElementById('overviewStepBroadcastTitle').textContent = t('overview.stepBroadcastTitle');
3135
4026
  document.getElementById('overviewStepBroadcastBody').textContent = t('overview.stepBroadcastBody');
3136
4027
  document.getElementById('overviewStepBroadcastBtn').textContent = t('actions.broadcastNow');
4028
+ document.getElementById('homeMissionEyebrow').textContent = t('hints.homeMissionEyebrow');
4029
+ document.getElementById('homeBriefTitle').textContent = t('hints.homeBriefTitle');
4030
+ document.getElementById('homeOpenAgentBtn').textContent = t('actions.openAgent');
4031
+ document.getElementById('homeOpenSocialBtn').textContent = t('pageMeta.social.title');
4032
+ document.getElementById('homeBroadcastNowBtn').textContent = t('actions.broadcastNow');
4033
+ document.getElementById('homeOpenNetworkBtn').textContent = t('actions.openNetwork');
3137
4034
  document.getElementById('socialMessageTitle').textContent = t('overview.messageTitle');
3138
4035
  document.getElementById('socialMessageHint').textContent = t('overview.messageHint');
3139
4036
  setText('#view-profile .section-header__eyebrow', t('labels.profileEyebrow'));
3140
- setText('#view-profile .section-header__title', t('labels.publicProfile'));
3141
- setText('#view-profile .section-header__body', t('pageMeta.profile.body'));
4037
+ document.getElementById('profileBannerTitle').textContent = t('hints.profileBannerTitle');
4038
+ document.getElementById('profileBannerBody').textContent = t('hints.profileBannerBody');
4039
+ document.getElementById('profileBannerPublishingLabel').textContent = t('hints.profileBannerPublishing');
4040
+ document.getElementById('profileBannerPublishingValue').textContent = t('hints.profileBannerPublishingValue');
3142
4041
  setText('#view-profile .title-sm', t('labels.publicProfileEditor'), 0);
3143
4042
  setText('#view-profile label', t('labels.displayName'), 0);
3144
4043
  setText('#view-profile .row > div:nth-child(2) label', t('labels.avatarUrl'));
@@ -3165,46 +4064,55 @@
3165
4064
  setText('#view-profile .profile-meta h4', t('labels.publicProfilePreview'), 2);
3166
4065
  setText('#view-profile .profile-meta .field-hint', t('hints.signedPublicProfileHint'));
3167
4066
  setText('#view-network .section-header__eyebrow', t('labels.networkEyebrow'));
3168
- setText('#view-network .section-header__title', t('pageMeta.network.title'));
3169
- setText('#view-network .section-header__body', t('pageMeta.network.body'));
3170
- setText('#view-network .split .card .title-sm', t('labels.connectionSummary'), 0);
3171
- setText('#view-network .split .card .title-sm', t('labels.quickActions'), 1);
3172
- setText('#view-network .split .card .field-hint', t('hints.useTheseFirst'));
4067
+ document.getElementById('networkBannerTitle').textContent = t('hints.networkBannerTitle');
4068
+ document.getElementById('networkBannerBody').textContent = t('hints.networkBannerBody');
4069
+ document.getElementById('networkBannerPurposeLabel').textContent = t('hints.networkBannerPurpose');
4070
+ document.getElementById('networkBannerPurposeValue').textContent = t('hints.networkBannerPurposeValue');
4071
+ document.getElementById('networkConnectionTitle').textContent = t('labels.connectionSummary');
4072
+ document.getElementById('networkQuickActionsTitle').textContent = t('labels.quickActions');
4073
+ setText('#view-network .network-actions-card .field-hint', t('hints.useTheseFirst'));
3173
4074
  document.getElementById('networkBroadcastHint').textContent = t('hints.broadcastControlHint');
3174
- setText('#view-network details.advanced-panel summary', t('labels.advancedActions'), 0);
3175
- setText('#view-network > details.advanced-panel.card > summary', t('labels.diagnostics'));
3176
- setText('#view-network .card .title-sm', t('labels.runtimeComponents'), 3);
3177
- setText('#view-network .card .title-sm', t('labels.peerInventory'), 4);
3178
- setText('#view-network .card .title-sm', t('labels.peerDiscoveryStats'), 5);
3179
- setText('#view-network .card .title-sm', t('labels.recentDiscoveryEvents'), 6);
3180
- setText('#view-network .card .title-sm', t('labels.discoverySnapshot'), 7);
4075
+ document.getElementById('networkAdvancedActionsSummary').textContent = t('labels.advancedActions');
4076
+ document.getElementById('networkDiagnosticsSummary').textContent = t('labels.diagnostics');
4077
+ document.getElementById('networkRuntimeComponentsTitle').textContent = t('labels.runtimeComponents');
4078
+ document.getElementById('networkPeerInventoryTitle').textContent = t('labels.peerInventory');
4079
+ document.getElementById('networkPeerDiscoveryStatsTitle').textContent = t('labels.peerDiscoveryStats');
4080
+ document.getElementById('networkRecentDiscoveryEventsTitle').textContent = t('labels.recentDiscoveryEvents');
4081
+ document.getElementById('networkDiscoverySnapshotTitle').textContent = t('labels.discoverySnapshot');
4082
+ document.getElementById('networkLogsTitle').textContent = t('labels.logs');
3181
4083
  setText('#view-network label[for="logLevelFilter"]', t('labels.category'));
3182
4084
  document.querySelector('#logLevelFilter option[value="all"]').textContent = t('labels.all');
3183
4085
  document.querySelector('#logLevelFilter option[value="info"]').textContent = t('labels.info');
3184
4086
  document.querySelector('#logLevelFilter option[value="warn"]').textContent = t('labels.warn');
3185
4087
  document.querySelector('#logLevelFilter option[value="error"]').textContent = t('labels.error');
3186
- setText('#view-network .card .title-sm', t('labels.configSnapshot'), 9);
3187
- setText('#view-network .card .title-sm', t('labels.statsSnapshot'), 10);
4088
+ document.getElementById('networkConfigSnapshotTitle').textContent = t('labels.configSnapshot');
4089
+ document.getElementById('networkStatsSnapshotTitle').textContent = t('labels.statsSnapshot');
3188
4090
  setText('#view-social .section-header__eyebrow', t('labels.socialEyebrow'));
3189
- setText('#view-social .section-header__title', t('pageMeta.social.title'));
3190
- setText('#view-social .section-header__body', t('pageMeta.social.body'));
3191
- setText('#view-social .card .title-sm', t('labels.integrationStatus'), 0);
4091
+ document.getElementById('socialBannerTitle').textContent = t('hints.socialBannerTitle');
4092
+ document.getElementById('socialBannerBody').textContent = t('hints.socialBannerBody');
4093
+ document.getElementById('socialBannerOpenClawLabel').textContent = t('hints.socialBannerOpenClaw');
4094
+ document.getElementById('socialBannerOpenClawValue').textContent = t('hints.socialBannerOpenClawValue');
4095
+ document.getElementById('socialIntegrationTitle').textContent = t('labels.integrationStatus');
3192
4096
  document.querySelector('#socialStatusLine').textContent = t('hints.checkingIntegration');
3193
- setText('#view-social .split .card .title-sm', t('labels.whatIsActive'), 0);
3194
- setText('#view-social .split .card .title-sm', t('labels.identityBinding'), 1);
3195
- setText('#view-social .split .card .title-sm', t('labels.messageGovernance'), 2);
3196
- setText('#view-social .split .card .title-sm', t('labels.recentModeration'), 3);
3197
- setText('#view-social details.card summary', t('labels.advancedNetworkDetails'));
3198
- setText('#view-social details.advanced-panel summary', t('labels.sourceRuntimeTemplate'));
3199
- setText('#view-social .card .title-sm', t('labels.sourceParsedFrontmatter'), 3);
3200
- setText('#view-social .card .title-sm', t('labels.runtimeSummary'), 4);
3201
- setText('#view-social .card .title-sm', t('labels.exportTemplatePreview'), 5);
3202
- setText('#view-social .card .title-sm', t('labels.actionsTitle'), 6);
4097
+ document.getElementById('socialRuntimeSummaryTitle').textContent = t('labels.whatIsActive');
4098
+ document.getElementById('socialBridgeTitle').textContent = t('labels.identityBinding');
4099
+ document.getElementById('socialOwnerDeliveryTitle').textContent = t('labels.ownerDelivery');
4100
+ document.getElementById('socialSkillLearningTitle').textContent = t('labels.openclawSkillLearning');
4101
+ document.getElementById('socialGovernanceTitle').textContent = t('labels.messageGovernance');
4102
+ document.getElementById('socialModerationTitle').textContent = t('labels.recentModeration');
4103
+ document.getElementById('socialAdvancedSummary').textContent = t('labels.advancedNetworkDetails');
4104
+ document.getElementById('socialSourceRuntimeSummary').textContent = t('labels.sourceRuntimeTemplate');
4105
+ document.getElementById('socialSourceParsedTitle').textContent = t('labels.sourceParsedFrontmatter');
4106
+ document.getElementById('socialRuntimeSummaryInnerTitle').textContent = t('labels.runtimeSummary');
4107
+ document.getElementById('socialTemplatePreviewTitle').textContent = t('labels.exportTemplatePreview');
4108
+ document.getElementById('socialActionsTitle').textContent = t('labels.actionsTitle');
3203
4109
  setText('label[for="socialModeSelect"]', t('labels.networkModeRuntime'));
3204
4110
  renderSocialModeHint('-', '-', false, false);
3205
4111
  setSocialModePendingState(false);
3206
- setText('#view-social > .card:last-of-type .field-hint', t('hints.profileVisibilityManaged'));
4112
+ document.getElementById('socialProfileVisibilityHint').textContent = t('hints.profileVisibilityManaged');
3207
4113
  document.getElementById('socialGovernanceHint').textContent = t('hints.messageGovernanceHint');
4114
+ document.getElementById('openclawSkillHint').textContent = t('hints.openclawSkillHint');
4115
+ document.getElementById('openclawSkillInstallBtn').textContent = t('actions.learnOpenClawSkill');
3208
4116
  setText('.hero-meta-item .label', t('labels.mode'), 0);
3209
4117
  setText('.hero-meta-item .label', t('labels.adapter'), 1);
3210
4118
  setText('.hero-meta-item .label', t('labels.relay'), 2);
@@ -3249,6 +4157,7 @@
3249
4157
  document.getElementById('networkFeedback').textContent = t('common.ready');
3250
4158
  document.getElementById('socialFeedback').textContent = t('common.ready');
3251
4159
  document.getElementById('socialGovernanceFeedback').textContent = t('common.ready');
4160
+ document.getElementById('openclawSkillFeedback').textContent = t('common.ready');
3252
4161
  document.getElementById('socialMessageFeedback').textContent = t('common.ready');
3253
4162
  }
3254
4163
  function peerStatusText(status) {
@@ -3577,24 +4486,30 @@
3577
4486
  }
3578
4487
  activeTab = tab;
3579
4488
  document.querySelectorAll('.tab').forEach((b) => b.classList.toggle('active', b.dataset.tab === tab));
3580
- ['overview', 'profile', 'network', 'social'].forEach((k) => {
4489
+ ['overview', 'agent', 'chat', 'profile', 'network', 'social'].forEach((k) => {
3581
4490
  document.getElementById(`view-${k}`).classList.toggle('active', k === tab);
3582
4491
  });
3583
4492
  const meta = pageMeta[tab] || pageMeta.overview;
3584
4493
  document.getElementById('pageBreadcrumb').textContent = meta.title;
3585
4494
  document.getElementById('pageHeroTitle').textContent = meta.title;
3586
4495
  document.getElementById('pageHeroBody').textContent = meta.body;
4496
+ document.getElementById('integrationStatusBar')?.classList.toggle('hidden', tab !== 'overview');
4497
+ document.querySelector('.page-hero')?.classList.toggle('hidden', tab !== 'overview');
4498
+ document.getElementById('publicDiscoveryHint')?.classList.toggle('hidden', tab !== 'overview');
3587
4499
  if (tab === 'profile' && !profileDirty && !profileSaving) {
3588
4500
  refreshProfile().catch(() => {});
3589
4501
  }
3590
4502
  }
3591
4503
 
3592
4504
  async function refreshOverview() {
3593
- const [overviewRes, discoveredRes, peerRes, profileRes] = await Promise.allSettled([
4505
+ const [overviewRes, discoveredRes, peerRes, profileRes, bridgeRes, networkCfgRes, networkStatsRes] = await Promise.allSettled([
3594
4506
  api('/api/overview'),
3595
4507
  api('/api/search?q='),
3596
4508
  api('/api/peers'),
3597
4509
  api('/api/profile'),
4510
+ api('/api/openclaw/bridge'),
4511
+ api('/api/network/config'),
4512
+ api('/api/network/stats'),
3598
4513
  ]);
3599
4514
  if (overviewRes.status !== 'fulfilled') {
3600
4515
  throw overviewRes.reason;
@@ -3603,6 +4518,9 @@
3603
4518
  const allProfiles = discoveredRes.status === 'fulfilled' ? (discoveredRes.value.data || []) : [];
3604
4519
  const peers = peerRes.status === 'fulfilled' ? (peerRes.value.data || {}) : {};
3605
4520
  const currentProfile = profileRes.status === 'fulfilled' ? (profileRes.value.data || {}) : {};
4521
+ const bridge = bridgeRes.status === 'fulfilled' ? (bridgeRes.value.data || {}) : {};
4522
+ const networkCfg = networkCfgRes.status === 'fulfilled' ? (networkCfgRes.value.data || {}) : {};
4523
+ const networkStats = networkStatsRes.status === 'fulfilled' ? (networkStatsRes.value.data || {}) : {};
3606
4524
  const peerItems = peers.items || [];
3607
4525
  const mergedById = new Map();
3608
4526
 
@@ -3691,6 +4609,70 @@
3691
4609
  document.getElementById('pillBroadcast').textContent = pillBroadcastText;
3692
4610
  document.getElementById('pillBroadcast').className = pillBroadcastClassName;
3693
4611
 
4612
+ const openclawRunning = !!bridge.openclaw_runtime?.running;
4613
+ const openclawDetected = !!bridge.openclaw_installation?.detected;
4614
+ const skillInstalled = !!bridge.skill_learning?.installed;
4615
+ const globalMode = heroModeText === 'global-preview';
4616
+ const networkDiag = networkStats.adapter_diagnostics_summary || {};
4617
+ const lastNetworkError = String(networkDiag.last_error || o.last_broadcast_error || '').trim();
4618
+ const broadcastHealthy = o.broadcast_enabled && !lastNetworkError;
4619
+ const roleKey = openclawRunning
4620
+ ? 'overview.homeRoleListener'
4621
+ : openclawDetected
4622
+ ? 'overview.homeRoleStandby'
4623
+ : 'overview.homeRoleBroadcaster';
4624
+ const titleKey = openclawRunning
4625
+ ? 'overview.homeTitleListener'
4626
+ : openclawDetected
4627
+ ? 'overview.homeTitleOffline'
4628
+ : 'overview.homeTitleBroadcaster';
4629
+ const bodyKey = openclawRunning
4630
+ ? 'overview.homeBodyListener'
4631
+ : openclawDetected
4632
+ ? 'overview.homeBodyOffline'
4633
+ : 'overview.homeBodyBroadcaster';
4634
+
4635
+ document.getElementById('homeMissionTitle').textContent = t(titleKey);
4636
+ document.getElementById('homeMissionBody').textContent = t(bodyKey);
4637
+ document.getElementById('homeMissionStatus').innerHTML = [
4638
+ `<span class="mission-status-pill"><strong>${t('overview.homeRole')}</strong> ${t(roleKey)}</span>`,
4639
+ `<span class="mission-status-pill"><strong>${t('overview.homeOpenClaw')}</strong> ${openclawRunning ? t('overview.homeRunning') : (openclawDetected ? t('overview.homeInstalledOnly') : t('overview.homeStopped'))}</span>`,
4640
+ `<span class="mission-status-pill"><strong>${t('overview.homeGlobalMode')}</strong> ${globalMode ? t('overview.homeGlobalReady') : t('overview.homeNotGlobal')}</span>`,
4641
+ ].join('');
4642
+ document.getElementById('homePriorityGrid').innerHTML = [
4643
+ [t('overview.homeOpenClaw'), openclawRunning ? t('overview.homeRunning') : (openclawDetected ? t('overview.homeInstalledOnly') : t('overview.homeStopped')), openclawRunning ? t('overview.homeMetaRunning') : t('overview.homeMetaNotRunning')],
4644
+ [t('overview.homeGlobalMode'), globalMode ? t('overview.homeGlobalReady') : t('overview.homeNotGlobal'), globalMode ? t('overview.homeMetaGlobal') : t('overview.homeMetaNotGlobal')],
4645
+ [t('overview.homeBroadcastHealth'), broadcastHealthy ? t('overview.homeHealthy') : t('overview.homeDegraded'), lastNetworkError || `Last broadcast ${ago(o.last_broadcast_at)}`],
4646
+ [t('overview.homePeers'), String(visibleRemotePublicCount), t('overview.homeMetaPeers', { online: String(onlineCount), discovered: String(discoveredCount) })],
4647
+ ].map(([label, value, meta]) => `
4648
+ <div class="priority-card">
4649
+ <div class="priority-card__label">${label}</div>
4650
+ <div class="priority-card__value">${escapeHtml(value)}</div>
4651
+ <div class="priority-card__meta">${escapeHtml(meta)}</div>
4652
+ </div>
4653
+ `).join('');
4654
+ document.getElementById('homeBriefList').innerHTML = [
4655
+ [t('overview.homeBriefNetwork'), t('overview.homeBriefNetworkValue', {
4656
+ mode: describeCurrentMode(heroModeText),
4657
+ relay: String(networkDiag.signaling_url || networkCfg.adapter_extra?.signaling_url || '-'),
4658
+ room: String(networkDiag.room || networkCfg.adapter_extra?.room || '-'),
4659
+ })],
4660
+ [t('overview.homeBriefBridge'), t('overview.homeBriefBridgeValue', {
4661
+ runtime: openclawRunning ? t('overview.homeRunning') : (openclawDetected ? t('overview.homeInstalledOnly') : t('overview.homeStopped')),
4662
+ skill: skillInstalled ? t('common.yes') : t('common.no'),
4663
+ })],
4664
+ [t('overview.homeBriefNextAction'), !broadcastHealthy
4665
+ ? t('overview.homeBriefActionStabilize')
4666
+ : openclawRunning
4667
+ ? t('overview.homeBriefActionBroadcast')
4668
+ : t('overview.homeBriefActionLearn')],
4669
+ ].map(([label, value]) => `
4670
+ <div class="home-brief__item">
4671
+ <div class="home-brief__label">${label}</div>
4672
+ <div class="home-brief__value">${escapeHtml(value)}</div>
4673
+ </div>
4674
+ `).join('');
4675
+
3694
4676
  const init = o.init_state || {};
3695
4677
  const onboarding = o.onboarding || {};
3696
4678
  const notice = document.getElementById('initNotice');
@@ -4203,7 +5185,7 @@
4203
5185
  document.getElementById('socialStatusLine').textContent = summaryLine;
4204
5186
  document.getElementById('socialStatusSubline').textContent = namespaceText;
4205
5187
  const bar = document.getElementById('integrationStatusBar');
4206
- bar.className = `integration-strip ${status.connected_to_silicaclaw && status.public_enabled ? 'ok' : 'warn'}`;
5188
+ bar.className = `integration-strip ${status.connected_to_silicaclaw && status.public_enabled ? 'ok' : 'warn'}${activeTab === 'overview' ? '' : ' hidden'}`;
4207
5189
  bar.textContent = t('social.barStatus', {
4208
5190
  connected: status.connected_to_silicaclaw ? t('common.yes') : t('common.no'),
4209
5191
  mode,
@@ -4250,6 +5232,83 @@
4250
5232
  [t('social.reuseOpenClawIdentity'), summary.reused_openclaw_identity ? t('common.yes') : t('common.no')],
4251
5233
  ].map(([k,v]) => `<div class="card"><div class="label">${k}</div><div class="value" style="font-size:17px;">${v}</div></div>`).join('');
4252
5234
 
5235
+ const skillLearning = bridge.skill_learning || {};
5236
+ const ownerDelivery = bridge.owner_delivery || {};
5237
+ const installAction = skillLearning.install_action || {};
5238
+ const openclawDetected = !!bridge.openclaw_installation?.detected;
5239
+ const openclawRunning = !!bridge.openclaw_runtime?.running;
5240
+ const skillInstalled = !!skillLearning.installed;
5241
+ const installedSkillPath = skillLearning.installed_skill_path || '-';
5242
+ const ownerDeliveryStatusEl = document.getElementById('socialOwnerDeliveryStatus');
5243
+ const ownerDeliverySublineEl = document.getElementById('socialOwnerDeliverySubline');
5244
+ const ownerDeliveryReasonEl = document.getElementById('socialOwnerDeliveryReason');
5245
+ let ownerDeliveryHeadline = t('feedback.openclawRoleBroadcasterOnly');
5246
+ let ownerDeliveryBody = ownerDelivery.reason || '-';
5247
+ let ownerDeliveryTone = 'warn';
5248
+ if (ownerDelivery.ready) {
5249
+ ownerDeliveryHeadline = t('feedback.openclawRoleOwnerReady');
5250
+ ownerDeliveryBody = t('hints.ownerDeliveryReadyBody');
5251
+ ownerDeliveryTone = 'info';
5252
+ } else if (ownerDelivery.bridge_messages_readable) {
5253
+ if (ownerDelivery.forward_command_configured) {
5254
+ ownerDeliveryHeadline = t('feedback.openclawRoleNeedsOwnerRoute');
5255
+ ownerDeliveryBody = t('hints.ownerDeliveryNeedsRouteBody');
5256
+ } else {
5257
+ ownerDeliveryHeadline = t('feedback.openclawRoleLearningOnly');
5258
+ ownerDeliveryBody = t('hints.ownerDeliveryLearningBody');
5259
+ }
5260
+ ownerDeliveryTone = 'warn';
5261
+ } else if (!openclawRunning) {
5262
+ ownerDeliveryHeadline = t('feedback.openclawRoleNotRunning');
5263
+ ownerDeliveryBody = ownerDelivery.reason || '-';
5264
+ ownerDeliveryTone = 'warn';
5265
+ }
5266
+ ownerDeliveryStatusEl.className = `feedback ${ownerDeliveryTone}`;
5267
+ ownerDeliveryStatusEl.textContent = ownerDeliveryHeadline;
5268
+ ownerDeliverySublineEl.textContent = [
5269
+ `${t('social.broadcastReadable')}: ${ownerDelivery.bridge_messages_readable ? t('common.yes') : t('common.no')}`,
5270
+ `${t('social.ownerForwardCommand')}: ${ownerDelivery.forward_command_configured ? t('common.yes') : t('common.no')}`,
5271
+ `${t('social.ownerForwardReady')}: ${ownerDelivery.ready ? t('common.yes') : t('common.no')}`,
5272
+ ].join(' · ');
5273
+ ownerDeliveryReasonEl.textContent = ownerDeliveryBody;
5274
+ document.getElementById('openclawSkillCards').innerHTML = [
5275
+ [t('social.openclawInstalled'), openclawDetected ? t('common.yes') : t('common.no')],
5276
+ [t('social.running'), openclawRunning ? t('common.yes') : t('common.no')],
5277
+ [t('social.skillInstalled'), skillInstalled ? t('common.yes') : t('common.no')],
5278
+ [t('social.broadcastReadable'), ownerDelivery.bridge_messages_readable ? t('common.yes') : t('common.no')],
5279
+ [t('social.ownerForwardReady'), ownerDelivery.ready ? t('common.yes') : t('common.no')],
5280
+ [t('social.ownerForwardCommand'), ownerDelivery.forward_command_configured ? t('common.yes') : t('common.no')],
5281
+ [t('social.installMode'), skillLearning.install_mode || '-'],
5282
+ [t('social.installedPath'), skillInstalled ? installedSkillPath : '-'],
5283
+ ].map(([k,v]) => `<div class="card"><div class="label">${k}</div><div class="value" style="font-size:17px;">${escapeHtml(v)}</div></div>`).join('');
5284
+ document.getElementById('openclawSkillPath').textContent = ownerDelivery.forward_command
5285
+ ? `${ownerDelivery.forward_command}${ownerDelivery.owner_channel ? ` · ${ownerDelivery.owner_channel}` : ''}${ownerDelivery.owner_target ? ` · ${ownerDelivery.owner_target}` : ''}`
5286
+ : skillInstalled
5287
+ ? installedSkillPath
5288
+ : (installAction.recommended_command || '-');
5289
+ document.getElementById('openclawSkillHint').textContent = !openclawDetected
5290
+ ? t('feedback.openclawRoleBroadcasterOnly')
5291
+ : !openclawRunning
5292
+ ? t('feedback.openclawRoleNotRunning')
5293
+ : !skillInstalled
5294
+ ? t('feedback.openclawRoleReadyToLearn')
5295
+ : ownerDelivery.ready
5296
+ ? t('feedback.openclawRoleOwnerReady')
5297
+ : ownerDelivery.bridge_messages_readable && !ownerDelivery.forward_command_configured
5298
+ ? t('feedback.openclawRoleLearningOnly')
5299
+ : ownerDelivery.bridge_messages_readable
5300
+ ? t('feedback.openclawRoleNeedsOwnerRoute')
5301
+ : t('feedback.openclawRoleLearned');
5302
+ const skillInstallBtn = document.getElementById('openclawSkillInstallBtn');
5303
+ skillInstallBtn.textContent = !openclawDetected
5304
+ ? t('actions.openclawNotInstalled')
5305
+ : !openclawRunning
5306
+ ? t('actions.openclawNotRunning')
5307
+ : skillInstalled
5308
+ ? t('actions.openclawSkillLearned')
5309
+ : t('actions.learnOpenClawSkill');
5310
+ skillInstallBtn.disabled = !openclawDetected || !openclawRunning || skillInstalled;
5311
+
4253
5312
  const policy = governance.policy || {};
4254
5313
  const blockedAgentIds = Array.isArray(policy.blocked_agent_ids) ? policy.blocked_agent_ids : [];
4255
5314
  const blockedTerms = Array.isArray(policy.blocked_terms) ? policy.blocked_terms : [];
@@ -4300,6 +5359,8 @@
4300
5359
  connected_to_silicaclaw: bridge.connected_to_silicaclaw,
4301
5360
  public_enabled: bridge.public_enabled,
4302
5361
  message_broadcast_enabled: bridge.message_broadcast_enabled,
5362
+ openclaw_runtime: bridge.openclaw_runtime || {},
5363
+ skill_learning: bridge.skill_learning || {},
4303
5364
  endpoints: bridge.endpoints || {},
4304
5365
  },
4305
5366
  source: {
@@ -4417,6 +5478,12 @@
4417
5478
  document.getElementById('overviewStepBroadcastBtn').addEventListener('click', () => {
4418
5479
  document.getElementById('broadcastNowBtn').click();
4419
5480
  });
5481
+ document.getElementById('homeOpenAgentBtn').addEventListener('click', () => switchTab('agent'));
5482
+ document.getElementById('homeOpenSocialBtn').addEventListener('click', () => switchTab('social'));
5483
+ document.getElementById('homeOpenNetworkBtn').addEventListener('click', () => switchTab('network'));
5484
+ document.getElementById('homeBroadcastNowBtn').addEventListener('click', () => {
5485
+ document.getElementById('broadcastNowBtn').click();
5486
+ });
4420
5487
  document.getElementById('profileNextStepBtn').addEventListener('click', () => {
4421
5488
  setProfileNextStepVisible(false);
4422
5489
  switchTab('overview');
@@ -4622,6 +5689,21 @@
4622
5689
  setFeedback('socialFeedback', e instanceof Error ? e.message : t('feedback.exportFailed'), 'error');
4623
5690
  }
4624
5691
  });
5692
+ document.getElementById('openclawSkillInstallBtn').addEventListener('click', async () => {
5693
+ const btn = document.getElementById('openclawSkillInstallBtn');
5694
+ btn.disabled = true;
5695
+ setFeedback('openclawSkillFeedback', t('feedback.openclawSkillInstalling'));
5696
+ try {
5697
+ await api('/api/openclaw/bridge/skill-install', { method: 'POST' });
5698
+ setFeedback('openclawSkillFeedback', t('feedback.openclawSkillInstalled'));
5699
+ toast(t('feedback.openclawSkillInstalled'));
5700
+ await refreshSocial();
5701
+ } catch (e) {
5702
+ setFeedback('openclawSkillFeedback', e instanceof Error ? e.message : t('feedback.openclawSkillInstallFailed'), 'error');
5703
+ } finally {
5704
+ await refreshSocial().catch(() => {});
5705
+ }
5706
+ });
4625
5707
  document.getElementById('saveGovernanceBtn').addEventListener('click', async () => {
4626
5708
  setFeedback('socialGovernanceFeedback', t('common.saving'));
4627
5709
  try {