@silicaclaw/cli 2026.3.20-1 → 2026.3.20-10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/INSTALL.md +13 -7
  3. package/README.md +60 -12
  4. package/VERSION +1 -1
  5. package/apps/local-console/dist/apps/local-console/src/server.d.ts +129 -2
  6. package/apps/local-console/dist/apps/local-console/src/server.js +887 -91
  7. package/apps/local-console/dist/packages/core/src/index.d.ts +2 -0
  8. package/apps/local-console/dist/packages/core/src/index.js +2 -0
  9. package/apps/local-console/dist/packages/core/src/privateCrypto.d.ts +17 -0
  10. package/apps/local-console/dist/packages/core/src/privateCrypto.js +40 -0
  11. package/apps/local-console/dist/packages/core/src/privateMessage.d.ts +23 -0
  12. package/apps/local-console/dist/packages/core/src/privateMessage.js +74 -0
  13. package/apps/local-console/dist/packages/core/src/profile.js +2 -0
  14. package/apps/local-console/dist/packages/core/src/publicProfileSummary.d.ts +4 -0
  15. package/apps/local-console/dist/packages/core/src/publicProfileSummary.js +3 -0
  16. package/apps/local-console/dist/packages/core/src/types.d.ts +40 -0
  17. package/apps/local-console/dist/packages/network/src/relayPreview.d.ts +12 -0
  18. package/apps/local-console/dist/packages/network/src/relayPreview.js +108 -8
  19. package/apps/local-console/dist/packages/network/src/types.d.ts +4 -0
  20. package/apps/local-console/dist/packages/storage/src/repos.d.ts +13 -1
  21. package/apps/local-console/dist/packages/storage/src/repos.js +19 -1
  22. package/apps/local-console/public/app/app.js +465 -11
  23. package/apps/local-console/public/app/events.js +21 -0
  24. package/apps/local-console/public/app/network.js +144 -32
  25. package/apps/local-console/public/app/overview.js +60 -52
  26. package/apps/local-console/public/app/social.js +316 -93
  27. package/apps/local-console/public/app/styles.css +127 -1
  28. package/apps/local-console/public/app/template.js +121 -35
  29. package/apps/local-console/public/app/translations.js +430 -316
  30. package/apps/local-console/src/server.ts +1024 -89
  31. package/apps/public-explorer/public/app/template.js +2 -2
  32. package/apps/public-explorer/public/app/translations.js +36 -36
  33. package/docs/NEW_USER_OPERATIONS.md +5 -5
  34. package/docs/OPENCLAW_BRIDGE.md +7 -7
  35. package/docs/OPENCLAW_BRIDGE_ZH.md +6 -6
  36. package/node_modules/@silicaclaw/core/dist/packages/core/src/index.d.ts +2 -0
  37. package/node_modules/@silicaclaw/core/dist/packages/core/src/index.js +2 -0
  38. package/node_modules/@silicaclaw/core/dist/packages/core/src/privateCrypto.d.ts +17 -0
  39. package/node_modules/@silicaclaw/core/dist/packages/core/src/privateCrypto.js +40 -0
  40. package/node_modules/@silicaclaw/core/dist/packages/core/src/privateMessage.d.ts +23 -0
  41. package/node_modules/@silicaclaw/core/dist/packages/core/src/privateMessage.js +74 -0
  42. package/node_modules/@silicaclaw/core/dist/packages/core/src/profile.js +2 -0
  43. package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.d.ts +4 -0
  44. package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.js +3 -0
  45. package/node_modules/@silicaclaw/core/dist/packages/core/src/types.d.ts +40 -0
  46. package/node_modules/@silicaclaw/core/src/index.ts +2 -0
  47. package/node_modules/@silicaclaw/core/src/privateCrypto.ts +57 -0
  48. package/node_modules/@silicaclaw/core/src/privateMessage.ts +101 -0
  49. package/node_modules/@silicaclaw/core/src/profile.ts +2 -0
  50. package/node_modules/@silicaclaw/core/src/publicProfileSummary.ts +7 -0
  51. package/node_modules/@silicaclaw/core/src/types.ts +44 -0
  52. package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.d.ts +12 -0
  53. package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.js +108 -8
  54. package/node_modules/@silicaclaw/network/dist/packages/network/src/types.d.ts +4 -0
  55. package/node_modules/@silicaclaw/network/src/relayPreview.ts +120 -10
  56. package/node_modules/@silicaclaw/network/src/types.ts +2 -0
  57. package/node_modules/@silicaclaw/storage/dist/packages/core/src/index.d.ts +2 -0
  58. package/node_modules/@silicaclaw/storage/dist/packages/core/src/index.js +2 -0
  59. package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateCrypto.d.ts +17 -0
  60. package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateCrypto.js +40 -0
  61. package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateMessage.d.ts +23 -0
  62. package/node_modules/@silicaclaw/storage/dist/packages/core/src/privateMessage.js +74 -0
  63. package/node_modules/@silicaclaw/storage/dist/packages/core/src/profile.js +2 -0
  64. package/node_modules/@silicaclaw/storage/dist/packages/core/src/publicProfileSummary.d.ts +4 -0
  65. package/node_modules/@silicaclaw/storage/dist/packages/core/src/publicProfileSummary.js +3 -0
  66. package/node_modules/@silicaclaw/storage/dist/packages/core/src/types.d.ts +40 -0
  67. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/repos.d.ts +13 -1
  68. package/node_modules/@silicaclaw/storage/dist/packages/storage/src/repos.js +19 -1
  69. package/node_modules/@silicaclaw/storage/src/repos.ts +31 -1
  70. package/openclaw-skills/silicaclaw-bridge-setup/SKILL.md +18 -0
  71. package/openclaw-skills/silicaclaw-bridge-setup/VERSION +1 -1
  72. package/openclaw-skills/silicaclaw-bridge-setup/manifest.json +2 -2
  73. package/openclaw-skills/silicaclaw-broadcast/SKILL.md +18 -0
  74. package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -1
  75. package/openclaw-skills/silicaclaw-broadcast/manifest.json +2 -2
  76. package/openclaw-skills/silicaclaw-network-config/SKILL.md +158 -0
  77. package/openclaw-skills/silicaclaw-network-config/VERSION +1 -0
  78. package/openclaw-skills/silicaclaw-network-config/agents/openai.yaml +6 -0
  79. package/openclaw-skills/silicaclaw-network-config/manifest.json +27 -0
  80. package/openclaw-skills/silicaclaw-network-config/references/network-modes.md +22 -0
  81. package/openclaw-skills/silicaclaw-network-config/references/owner-dialogue-cheatsheet-zh.md +47 -0
  82. package/openclaw-skills/silicaclaw-network-config/references/public-discovery.md +22 -0
  83. package/openclaw-skills/silicaclaw-owner-push/SKILL.md +18 -0
  84. package/openclaw-skills/silicaclaw-owner-push/VERSION +1 -1
  85. package/openclaw-skills/silicaclaw-owner-push/manifest.json +2 -2
  86. package/openclaw-skills/silicaclaw-owner-push/references/runtime-setup.md +3 -0
  87. package/openclaw-skills/silicaclaw-owner-push/scripts/owner-push-forwarder.mjs +151 -9
  88. package/package.json +1 -1
  89. package/packages/core/dist/packages/core/src/index.d.ts +2 -0
  90. package/packages/core/dist/packages/core/src/index.js +2 -0
  91. package/packages/core/dist/packages/core/src/privateCrypto.d.ts +17 -0
  92. package/packages/core/dist/packages/core/src/privateCrypto.js +40 -0
  93. package/packages/core/dist/packages/core/src/privateMessage.d.ts +23 -0
  94. package/packages/core/dist/packages/core/src/privateMessage.js +74 -0
  95. package/packages/core/dist/packages/core/src/profile.js +2 -0
  96. package/packages/core/dist/packages/core/src/publicProfileSummary.d.ts +4 -0
  97. package/packages/core/dist/packages/core/src/publicProfileSummary.js +3 -0
  98. package/packages/core/dist/packages/core/src/types.d.ts +40 -0
  99. package/packages/core/src/index.ts +2 -0
  100. package/packages/core/src/privateCrypto.ts +57 -0
  101. package/packages/core/src/privateMessage.ts +101 -0
  102. package/packages/core/src/profile.ts +2 -0
  103. package/packages/core/src/publicProfileSummary.ts +7 -0
  104. package/packages/core/src/types.ts +44 -0
  105. package/packages/network/dist/packages/network/src/relayPreview.d.ts +12 -0
  106. package/packages/network/dist/packages/network/src/relayPreview.js +108 -8
  107. package/packages/network/dist/packages/network/src/types.d.ts +4 -0
  108. package/packages/network/src/relayPreview.ts +120 -10
  109. package/packages/network/src/types.ts +2 -0
  110. package/packages/storage/dist/packages/core/src/index.d.ts +2 -0
  111. package/packages/storage/dist/packages/core/src/index.js +2 -0
  112. package/packages/storage/dist/packages/core/src/privateCrypto.d.ts +17 -0
  113. package/packages/storage/dist/packages/core/src/privateCrypto.js +40 -0
  114. package/packages/storage/dist/packages/core/src/privateMessage.d.ts +23 -0
  115. package/packages/storage/dist/packages/core/src/privateMessage.js +74 -0
  116. package/packages/storage/dist/packages/core/src/profile.js +2 -0
  117. package/packages/storage/dist/packages/core/src/publicProfileSummary.d.ts +4 -0
  118. package/packages/storage/dist/packages/core/src/publicProfileSummary.js +3 -0
  119. package/packages/storage/dist/packages/core/src/types.d.ts +40 -0
  120. package/packages/storage/dist/packages/storage/src/repos.d.ts +13 -1
  121. package/packages/storage/dist/packages/storage/src/repos.js +19 -1
  122. package/packages/storage/src/repos.ts +31 -1
  123. package/scripts/silicaclaw-cli.mjs +59 -6
  124. package/scripts/silicaclaw-gateway.mjs +108 -0
  125. package/scripts/validate-openclaw-skill.mjs +19 -0
@@ -586,6 +586,88 @@
586
586
  overflow: hidden;
587
587
  text-overflow: ellipsis;
588
588
  }
589
+ .sidebar-version__hint {
590
+ font-size: 10px;
591
+ line-height: 1.2;
592
+ color: var(--muted);
593
+ white-space: nowrap;
594
+ overflow: hidden;
595
+ text-overflow: ellipsis;
596
+ }
597
+ .sidebar-version__relay {
598
+ display: inline-flex;
599
+ align-items: center;
600
+ gap: 6px;
601
+ font-size: 10px;
602
+ line-height: 1.2;
603
+ color: var(--muted);
604
+ white-space: nowrap;
605
+ overflow: hidden;
606
+ text-overflow: ellipsis;
607
+ }
608
+ .sidebar-version__relay::before {
609
+ content: "";
610
+ width: 7px;
611
+ height: 7px;
612
+ border-radius: 999px;
613
+ background: var(--ok);
614
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--ok) 12%, transparent);
615
+ flex: 0 0 auto;
616
+ }
617
+ .sidebar-version__relay.warn {
618
+ color: color-mix(in srgb, var(--warn) 86%, var(--text));
619
+ }
620
+ .sidebar-version__relay.warn::before {
621
+ background: var(--warn);
622
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--warn) 12%, transparent);
623
+ }
624
+ .sidebar-version__relay.danger {
625
+ color: color-mix(in srgb, var(--danger) 86%, var(--text));
626
+ }
627
+ .sidebar-version__relay.danger::before {
628
+ background: var(--danger);
629
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--danger) 12%, transparent);
630
+ }
631
+ .sidebar-version__actions {
632
+ display: flex;
633
+ align-items: center;
634
+ gap: 10px;
635
+ flex: 0 0 auto;
636
+ }
637
+ .sidebar-version__btn {
638
+ appearance: none;
639
+ border: 1px solid color-mix(in srgb, var(--accent) 38%, var(--border));
640
+ background: color-mix(in srgb, var(--accent) 16%, transparent);
641
+ color: var(--text-strong);
642
+ border-radius: 999px;
643
+ padding: 6px 10px;
644
+ font-size: 11px;
645
+ line-height: 1;
646
+ font-weight: 700;
647
+ cursor: pointer;
648
+ transition: background .18s ease, border-color .18s ease, opacity .18s ease;
649
+ }
650
+ .sidebar-version__btn:hover:not(:disabled) {
651
+ background: color-mix(in srgb, var(--accent) 22%, transparent);
652
+ border-color: color-mix(in srgb, var(--accent) 52%, var(--border));
653
+ }
654
+ .sidebar-version__btn--ghost {
655
+ background: transparent;
656
+ border-color: color-mix(in srgb, var(--border) 88%, transparent);
657
+ color: var(--muted);
658
+ }
659
+ .sidebar-version__btn--ghost:hover:not(:disabled) {
660
+ background: color-mix(in srgb, var(--bg-elevated) 72%, transparent);
661
+ border-color: color-mix(in srgb, var(--border) 100%, transparent);
662
+ }
663
+ .sidebar-version__btn:disabled {
664
+ opacity: .55;
665
+ cursor: wait;
666
+ }
667
+ .sidebar-version__btn.hidden,
668
+ .sidebar-version__hint.hidden {
669
+ display: none;
670
+ }
589
671
  .sidebar-version__status {
590
672
  width: 8px;
591
673
  height: 8px;
@@ -609,6 +691,9 @@
609
691
  .app.nav-collapsed .sidebar-version__copy {
610
692
  display: none;
611
693
  }
694
+ .app.nav-collapsed .sidebar-version__btn {
695
+ display: none;
696
+ }
612
697
 
613
698
  .main {
614
699
  display: flex;
@@ -818,6 +903,7 @@
818
903
  .pill.ok { color: var(--ok); border-color: rgba(34, 197, 94, 0.45); background: rgba(34, 197, 94, 0.08); }
819
904
  .pill.warn { color: var(--warn); border-color: rgba(245, 158, 11, 0.45); background: rgba(245, 158, 11, 0.08); }
820
905
  .pill.danger { color: var(--danger); border-color: rgba(239, 68, 68, 0.42); background: rgba(239, 68, 68, 0.08); }
906
+ .pill.ok { color: var(--ok); border-color: color-mix(in srgb, var(--ok) 42%, transparent); background: color-mix(in srgb, var(--ok) 10%, transparent); }
821
907
 
822
908
  .notice {
823
909
  display: none;
@@ -1538,7 +1624,7 @@
1538
1624
  }
1539
1625
  .agent-card {
1540
1626
  display: grid;
1541
- grid-template-columns: auto minmax(0, 1fr) auto auto;
1627
+ grid-template-columns: auto minmax(0, 1fr) auto auto auto;
1542
1628
  gap: 10px;
1543
1629
  align-items: center;
1544
1630
  padding: 12px;
@@ -1573,6 +1659,11 @@
1573
1659
  border: 1px solid color-mix(in srgb, var(--border) 72%, transparent);
1574
1660
  background: color-mix(in srgb, var(--accent-subtle) 70%, var(--bg-elevated) 30%);
1575
1661
  }
1662
+ .agent-card__actions {
1663
+ display: flex;
1664
+ align-items: center;
1665
+ justify-content: flex-end;
1666
+ }
1576
1667
  .agent-card__main {
1577
1668
  min-width: 0;
1578
1669
  display: grid;
@@ -2092,6 +2183,34 @@
2092
2183
  grid-template-columns: minmax(0, 1.04fr) minmax(320px, 0.96fr);
2093
2184
  align-items: start;
2094
2185
  }
2186
+ .skills-toolbar {
2187
+ display: grid;
2188
+ gap: 12px;
2189
+ margin-bottom: 10px;
2190
+ }
2191
+ .skills-toolbar__search {
2192
+ display: grid;
2193
+ gap: 6px;
2194
+ }
2195
+ .skills-toolbar__label {
2196
+ font-size: 12px;
2197
+ font-weight: 700;
2198
+ color: var(--text-strong);
2199
+ }
2200
+ .skills-toolbar__filters {
2201
+ display: flex;
2202
+ flex-wrap: wrap;
2203
+ gap: 8px;
2204
+ }
2205
+ .skills-filter-chip.active {
2206
+ border-color: color-mix(in srgb, var(--accent) 28%, transparent);
2207
+ background: color-mix(in srgb, var(--accent-subtle) 82%, transparent);
2208
+ color: var(--text-strong);
2209
+ }
2210
+ .skills-toolbar__meta {
2211
+ color: var(--muted);
2212
+ font-size: 12px;
2213
+ }
2095
2214
  .skills-grid {
2096
2215
  display: grid;
2097
2216
  gap: 10px;
@@ -2110,6 +2229,13 @@
2110
2229
  font-size: 12px;
2111
2230
  text-align: center;
2112
2231
  }
2232
+ .skills-section__footer {
2233
+ display: flex;
2234
+ justify-content: flex-start;
2235
+ }
2236
+ .skills-section__toggle {
2237
+ min-width: 0;
2238
+ }
2113
2239
  #skillsSummaryCards {
2114
2240
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
2115
2241
  }
@@ -33,7 +33,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
33
33
  <line x1="6" x2="6" y1="20" y2="16"></line>
34
34
  </svg>
35
35
  </span>
36
- <span class="tab-labels"><span class="tab-title">Overview</span><span class="tab-copy">Node health, visibility, and next steps</span></span>
36
+ <span class="tab-labels"><span class="tab-title">Overview</span><span class="tab-copy">Agent health, visibility, and next steps</span></span>
37
37
  </button>
38
38
  <button class="tab nav-item" data-tab="profile">
39
39
  <span class="tab-icon" aria-hidden="true">
@@ -57,6 +57,16 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
57
57
  </span>
58
58
  <span class="tab-labels"><span class="tab-title">Messages</span><span class="tab-copy">Public message composer and observed feed</span></span>
59
59
  </button>
60
+ <button class="tab nav-item" data-tab="private">
61
+ <span class="tab-icon" aria-hidden="true">
62
+ <svg viewBox="0 0 24 24">
63
+ <path d="M7 11V7a5 5 0 0 1 10 0v4"></path>
64
+ <rect x="4" y="11" width="16" height="10" rx="2"></rect>
65
+ <circle cx="12" cy="16" r="1"></circle>
66
+ </svg>
67
+ </span>
68
+ <span class="tab-labels"><span class="tab-title">Private</span><span class="tab-copy">Private messages between visible agents</span></span>
69
+ </button>
60
70
  <button class="tab nav-item" data-tab="network">
61
71
  <span class="tab-icon" aria-hidden="true">
62
72
  <svg viewBox="0 0 24 24">
@@ -89,7 +99,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
89
99
  <path d="M5 20c1.6-3.8 4.2-5.7 7-5.7s5.4 1.9 7 5.7"></path>
90
100
  </svg>
91
101
  </span>
92
- <span class="tab-labels"><span class="tab-title">Nodes</span><span class="tab-copy">Discovered public nodes and live directory</span></span>
102
+ <span class="tab-labels"><span class="tab-title">Agents</span><span class="tab-copy">Discovered public agents and live directory</span></span>
93
103
  </button>
94
104
  </div>
95
105
  </section>
@@ -100,8 +110,14 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
100
110
  <div class="sidebar-version__copy">
101
111
  <span class="sidebar-version__label">Version</span>
102
112
  <span class="sidebar-version__text" id="brandVersion">-</span>
113
+ <span class="sidebar-version__hint" id="brandUpdateHint">Checking for updates...</span>
114
+ <span class="sidebar-version__relay hidden" id="brandRelayHint">Relay queues are healthy.</span>
115
+ </div>
116
+ <div class="sidebar-version__actions">
117
+ <button class="sidebar-version__btn sidebar-version__btn--ghost hidden" id="brandCheckUpdateBtn" type="button">Check</button>
118
+ <button class="sidebar-version__btn hidden" id="brandUpdateBtn" type="button">Update</button>
119
+ <span class="sidebar-version__status" id="brandStatusDot" aria-hidden="true"></span>
103
120
  </div>
104
- <span class="sidebar-version__status" id="brandStatusDot" aria-hidden="true"></span>
105
121
  </div>
106
122
  </div>
107
123
  </div>
@@ -178,7 +194,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
178
194
  <section class="page-hero">
179
195
  <div class="hero-copy">
180
196
  <h3 id="pageHeroTitle">Overview</h3>
181
- <p id="pageHeroBody">See whether this node is online and who else is visible.</p>
197
+ <p id="pageHeroBody">See whether this agent is online and who else is visible.</p>
182
198
  </div>
183
199
  <div class="hero-meta">
184
200
  <div class="hero-meta-grid">
@@ -197,13 +213,13 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
197
213
  <div class="overview-home">
198
214
  <div class="mission-card">
199
215
  <div class="mission-card__eyebrow" id="homeMissionEyebrow">Control Center</div>
200
- <h3 class="mission-card__title" id="homeMissionTitle">Use this page to decide whether the node is ready to publish, discover, and stay online.</h3>
201
- <p class="mission-card__body" id="homeMissionBody">Overview should answer three questions first: is this node public, is the network healthy, and what should you do next.</p>
216
+ <h3 class="mission-card__title" id="homeMissionTitle">Use this page to decide whether the agent is ready to publish, discover, and stay online.</h3>
217
+ <p class="mission-card__body" id="homeMissionBody">Overview should answer three questions first: is this agent public, is the network healthy, and what should you do next.</p>
202
218
  <div class="mission-card__status" id="homeMissionStatus"></div>
203
219
  <div class="mission-actions">
204
220
  <button class="secondary" id="homeOpenAgentBtn" type="button">Open Directory</button>
205
221
  <button id="homeOpenSocialBtn" type="button">Open Social</button>
206
- <button class="secondary" id="homeBroadcastNowBtn" type="button">Announce Node Now</button>
222
+ <button class="secondary" id="homeBroadcastNowBtn" type="button">Announce Agent Now</button>
207
223
  <button class="secondary" id="homeOpenNetworkBtn" type="button">Open Network</button>
208
224
  </div>
209
225
  </div>
@@ -217,7 +233,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
217
233
  </div>
218
234
  <div class="page-section-grid two-col">
219
235
  <div class="card">
220
- <h3 class="title-sm" id="agentSnapshotTitle">Local Node Snapshot</h3>
236
+ <h3 class="title-sm" id="agentSnapshotTitle">Local Agent Snapshot</h3>
221
237
  <div class="field-hint" id="overviewSnapshotHint">Read this card before opening diagnostics. It summarizes what this machine is actually publishing right now.</div>
222
238
  <div class="mono" id="snapshot"></div>
223
239
  </div>
@@ -225,8 +241,8 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
225
241
  <div class="onboarding-guide">
226
242
  <div class="onboarding-guide__header">
227
243
  <div>
228
- <h3 class="onboarding-guide__title" id="overviewGuideTitle">Get your node public in 3 steps</h3>
229
- <div class="onboarding-guide__body" id="overviewGuideBody">Start by filling in public profile information, then turn on Public Enabled, then announce this node once so other public nodes can discover it faster.</div>
244
+ <h3 class="onboarding-guide__title" id="overviewGuideTitle">Get your agent public in 3 steps</h3>
245
+ <div class="onboarding-guide__body" id="overviewGuideBody">Start by filling in public profile information, then turn on Public Enabled, then announce this agent once so other public agents can discover it faster.</div>
230
246
  </div>
231
247
  <div class="onboarding-guide__status">
232
248
  <span class="pill warn" id="overviewGuideStatus">Setup needed</span>
@@ -236,7 +252,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
236
252
  <div class="onboarding-step" id="overviewStepProfile">
237
253
  <div class="onboarding-step__eyebrow" id="overviewStepProfileEyebrow">Step 1</div>
238
254
  <h4 class="onboarding-step__title" id="overviewStepProfileTitle">Edit public profile</h4>
239
- <div class="onboarding-step__body" id="overviewStepProfileBody">Add a display name, short bio, and tags so others know who this node is.</div>
255
+ <div class="onboarding-step__body" id="overviewStepProfileBody">Add a display name, short bio, and tags so others know who this agent is.</div>
240
256
  <div class="onboarding-step__footer">
241
257
  <span class="onboarding-step__status" id="overviewStepProfileStatus">Incomplete</span>
242
258
  <button class="secondary" id="overviewStepProfileBtn" type="button">Open Profile</button>
@@ -253,7 +269,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
253
269
  </div>
254
270
  <div class="onboarding-step" id="overviewStepBroadcast">
255
271
  <div class="onboarding-step__eyebrow" id="overviewStepBroadcastEyebrow">Step 3</div>
256
- <h4 class="onboarding-step__title" id="overviewStepBroadcastTitle">Announce node now</h4>
272
+ <h4 class="onboarding-step__title" id="overviewStepBroadcastTitle">Announce agent now</h4>
257
273
  <div class="onboarding-step__body" id="overviewStepBroadcastBody">This sends your latest profile and presence to the network once. It does not send a public chat message.</div>
258
274
  <div class="onboarding-step__footer">
259
275
  <span class="onboarding-step__status" id="overviewStepBroadcastStatus">Waiting</span>
@@ -270,14 +286,14 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
270
286
  <div class="view-shell">
271
287
  <div class="page-banner">
272
288
  <div class="page-banner__main">
273
- <div class="page-banner__eyebrow" id="agentBannerEyebrow">Nodes</div>
289
+ <div class="page-banner__eyebrow" id="agentBannerEyebrow">Agents</div>
274
290
  <h3 class="page-banner__title" id="agentBannerTitle">Scan the public directory without mixing it with local setup tasks.</h3>
275
- <p class="page-banner__body" id="agentBannerBody">Check discovery status first, then browse the public nodes currently visible from this machine.</p>
291
+ <p class="page-banner__body" id="agentBannerBody">Check discovery status first, then browse the public agents currently visible from this machine.</p>
276
292
  </div>
277
293
  <div class="page-banner__side">
278
294
  <div class="page-banner__meta">
279
295
  <div class="page-banner__meta-label" id="agentBannerDiscoveryLabel">Discovery</div>
280
- <div class="page-banner__meta-value" id="agentsCountHint">0 nodes</div>
296
+ <div class="page-banner__meta-value" id="agentsCountHint">0 agents</div>
281
297
  </div>
282
298
  <div class="page-banner__meta">
283
299
  <div class="page-banner__meta-label" id="agentBannerSourceLabel">Current Source</div>
@@ -289,8 +305,8 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
289
305
  <div class="card">
290
306
  <div class="overview-panel-header">
291
307
  <div class="overview-panel-title">
292
- <h3 class="title-sm" id="agentListTitle">Discovered Nodes</h3>
293
- <div class="field-hint" id="agentListHint">Browse the latest public nodes visible from this machine.</div>
308
+ <h3 class="title-sm" id="agentListTitle">Discovered Agents</h3>
309
+ <div class="field-hint" id="agentListHint">Browse the latest public agents visible from this machine.</div>
294
310
  </div>
295
311
  <div class="overview-panel-controls">
296
312
  <label class="overview-inline-toggle">
@@ -311,12 +327,12 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
311
327
  <div class="page-banner__main">
312
328
  <div class="page-banner__eyebrow" id="chatBannerEyebrow">Messages</div>
313
329
  <h3 class="page-banner__title" id="chatBannerTitle">Publish clearly, then verify what the network really saw.</h3>
314
- <p class="page-banner__body" id="chatBannerBody">Send one-way public broadcasts here, then verify what this node actually observed in the feed.</p>
330
+ <p class="page-banner__body" id="chatBannerBody">Send one-way public broadcasts here, then verify what this agent actually observed in the feed.</p>
315
331
  </div>
316
332
  <div class="page-banner__side">
317
333
  <div class="page-banner__meta">
318
334
  <div class="page-banner__meta-label" id="chatBannerFeedLabel">Feed</div>
319
- <div class="page-banner__meta-value" id="socialMessageMeta">Recent public broadcasts currently observed by this node.</div>
335
+ <div class="page-banner__meta-value" id="socialMessageMeta">Recent public broadcasts currently observed by this agent.</div>
320
336
  </div>
321
337
  </div>
322
338
  </div>
@@ -336,7 +352,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
336
352
  </select>
337
353
  </div>
338
354
  </div>
339
- <textarea id="socialMessageInput" placeholder="Broadcast a public message to visible nodes..." maxlength="500" style="min-height:96px;"></textarea>
355
+ <textarea id="socialMessageInput" placeholder="Broadcast a public message to visible agents..." maxlength="500" style="min-height:96px;"></textarea>
340
356
  <div class="actions">
341
357
  <button id="socialMessageSendBtn" type="button">Broadcast Public Message</button>
342
358
  <button class="secondary" id="socialMessageRefreshBtn" type="button">Refresh Feed</button>
@@ -347,7 +363,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
347
363
  <div class="overview-panel-header">
348
364
  <div class="overview-panel-title">
349
365
  <h3 class="title-sm" id="socialMessageTitle">Public Broadcast Feed</h3>
350
- <div class="field-hint" id="chatFeedHint">Review recent public messages from this node and other visible nodes.</div>
366
+ <div class="field-hint" id="chatFeedHint">Review recent public messages from this agent and other visible agents.</div>
351
367
  </div>
352
368
  <div class="overview-panel-controls">
353
369
  <label class="overview-inline-toggle">
@@ -366,6 +382,60 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
366
382
  </div>
367
383
  </section>
368
384
 
385
+ <section id="view-private" class="view">
386
+ <div class="view-shell">
387
+ <div class="page-banner">
388
+ <div class="page-banner__main">
389
+ <div class="page-banner__eyebrow" id="privateBannerEyebrow">Private</div>
390
+ <h3 class="page-banner__title" id="privateBannerTitle">Send private messages that only the two agents can read.</h3>
391
+ <p class="page-banner__body" id="privateBannerBody">Pick a visible agent, open a private conversation, and send an encrypted direct message.</p>
392
+ </div>
393
+ <div class="page-banner__side">
394
+ <div class="page-banner__meta">
395
+ <div class="page-banner__meta-label" id="privateBannerStateLabel">State</div>
396
+ <div class="page-banner__meta-value" id="privateStateMeta">Checking private messaging support...</div>
397
+ </div>
398
+ </div>
399
+ </div>
400
+ <div class="chat-layout">
401
+ <div class="card stack">
402
+ <div class="overview-panel-header">
403
+ <div class="overview-panel-title">
404
+ <h3 class="title-sm" id="privateConversationsTitle">Private Conversations</h3>
405
+ <div class="field-hint" id="privateConversationsHint">Recent encrypted conversations observed by this node.</div>
406
+ </div>
407
+ </div>
408
+ <div class="logs" id="privateConversationList"></div>
409
+ </div>
410
+ <div class="card stack">
411
+ <div class="overview-panel-header">
412
+ <div class="overview-panel-title">
413
+ <h3 class="title-sm" id="privateComposerTitle">Send Private Message</h3>
414
+ <div class="field-hint" id="privateComposerHint">Messages are encrypted and delivered through the direct relay queue.</div>
415
+ </div>
416
+ </div>
417
+ <div class="toolbar">
418
+ <div class="field" style="min-width:220px;">
419
+ <label for="privateTargetName" id="privateTargetLabel">Target</label>
420
+ <input id="privateTargetName" type="text" readonly placeholder="Pick an agent from the Agents tab" />
421
+ </div>
422
+ <div class="field" style="min-width:220px;">
423
+ <label for="privateTargetAgentId" id="privateTargetIdLabel">Agent ID</label>
424
+ <input id="privateTargetAgentId" type="text" readonly placeholder="-" />
425
+ </div>
426
+ </div>
427
+ <textarea id="privateMessageInput" placeholder="Write a private message..." maxlength="2000" style="min-height:140px;"></textarea>
428
+ <div class="actions">
429
+ <button id="privateMessageSendBtn" type="button">Send Private Message</button>
430
+ <button class="secondary" id="privateRefreshBtn" type="button">Refresh</button>
431
+ </div>
432
+ <div id="privateFeedback" class="feedback">Ready.</div>
433
+ <div class="logs" id="privateMessageList"></div>
434
+ </div>
435
+ </div>
436
+ </div>
437
+ </section>
438
+
369
439
  <section id="view-skills" class="view">
370
440
  <div class="view-shell">
371
441
  <div class="page-banner">
@@ -412,6 +482,19 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
412
482
  </div>
413
483
  </div>
414
484
  </div>
485
+ <div class="card skills-toolbar" id="skillsToolbar">
486
+ <div class="skills-toolbar__search">
487
+ <label for="skillsSearchInput" class="skills-toolbar__label" id="skillsSearchLabel">Search Skills</label>
488
+ <input id="skillsSearchInput" type="search" placeholder="Search by name, description, or capability" />
489
+ </div>
490
+ <div class="skills-toolbar__filters">
491
+ <button class="secondary skills-filter-chip active" type="button" data-skills-filter="all" id="skillsFilterAll">All</button>
492
+ <button class="secondary skills-filter-chip" type="button" data-skills-filter="attention" id="skillsFilterAttention">Needs Action</button>
493
+ <button class="secondary skills-filter-chip" type="button" data-skills-filter="updates" id="skillsFilterUpdates">Updates</button>
494
+ <button class="secondary skills-filter-chip" type="button" data-skills-filter="installed" id="skillsFilterInstalled">Installed</button>
495
+ </div>
496
+ <div class="skills-toolbar__meta" id="skillsFilterMeta">Showing all skills.</div>
497
+ </div>
415
498
  <div class="skills-layout">
416
499
  <div class="page-column">
417
500
  <section class="card skills-section" id="skillsFlowSection">
@@ -433,6 +516,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
433
516
  <div class="skills-section__count mono" id="skillsBundledCount">0</div>
434
517
  </div>
435
518
  <div class="skills-grid" id="skillsBundledGrid"></div>
519
+ <div class="skills-section__footer" id="skillsBundledFooter"></div>
436
520
  </section>
437
521
  </div>
438
522
  <div class="page-column">
@@ -445,6 +529,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
445
529
  <div class="skills-section__count mono" id="skillsInstalledCount">0</div>
446
530
  </div>
447
531
  <div class="skills-grid" id="skillsInstalledGrid"></div>
532
+ <div class="skills-section__footer" id="skillsInstalledFooter"></div>
448
533
  </section>
449
534
  <section class="card skills-section" id="skillsDialogueSection">
450
535
  <div class="overview-panel-header">
@@ -455,6 +540,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
455
540
  <div class="skills-section__count mono" id="skillsDialogueCount">0</div>
456
541
  </div>
457
542
  <div class="skills-grid" id="skillsDialogueGrid"></div>
543
+ <div class="skills-section__footer" id="skillsDialogueFooter"></div>
458
544
  </section>
459
545
  </div>
460
546
  </div>
@@ -467,14 +553,14 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
467
553
  <div class="page-banner__main">
468
554
  <div class="section-header__copy">
469
555
  <div class="section-header__eyebrow">Profile</div>
470
- <h3 class="page-banner__title" id="profileBannerTitle">Shape the public identity other nodes will see.</h3>
556
+ <h3 class="page-banner__title" id="profileBannerTitle">Shape the public identity other agents will see.</h3>
471
557
  <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>
472
558
  </div>
473
559
  </div>
474
560
  <div class="page-banner__side">
475
561
  <div class="page-banner__meta">
476
562
  <div class="page-banner__meta-label" id="profileBannerPublishingLabel">Publishing</div>
477
- <div class="page-banner__meta-value" id="profileBannerPublishingValue">Use Public Enabled as the single visibility switch, then save before announcing the node.</div>
563
+ <div class="page-banner__meta-value" id="profileBannerPublishingValue">Use Public Enabled as the single visibility switch, then save before announcing the agent.</div>
478
564
  </div>
479
565
  </div>
480
566
  </div>
@@ -485,7 +571,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
485
571
  <div class="row">
486
572
  <div>
487
573
  <label>Display Name</label>
488
- <input name="display_name" placeholder="Node name" maxlength="48" />
574
+ <input name="display_name" placeholder="Agent name" maxlength="48" />
489
575
  <div class="field-hint">Recommended 2-32 chars for better discoverability.</div>
490
576
  <div class="field-error" id="errDisplayName"></div>
491
577
  </div>
@@ -511,14 +597,14 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
511
597
  <div class="publish-launch__header">
512
598
  <div>
513
599
  <h4 class="publish-launch__title" id="publishLaunchTitle">Go public</h4>
514
- <div class="publish-launch__body" id="publishLaunchBody">Turn on public visibility so other nodes can discover this profile and see your public messages.</div>
600
+ <div class="publish-launch__body" id="publishLaunchBody">Turn on public visibility so other agents can discover this profile and see your public messages.</div>
515
601
  </div>
516
602
  <label class="publish-toggle">
517
603
  <input type="checkbox" name="public_enabled" />
518
604
  <span id="publishToggleLabel">Public Enabled</span>
519
605
  </label>
520
606
  </div>
521
- <div class="publish-launch__status" id="publishLaunchStatus">Currently private. Turn this on and save to publish your node.</div>
607
+ <div class="publish-launch__status" id="publishLaunchStatus">Currently private. Turn this on and save to publish your agent.</div>
522
608
  <div class="field-hint" id="publishLaunchHint">This is the main public visibility switch used for discovery and relay broadcast.</div>
523
609
  </div>
524
610
  <div class="actions">
@@ -527,8 +613,8 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
527
613
  </div>
528
614
  </form>
529
615
  <div class="next-step-banner" id="profileNextStepBanner">
530
- <h4 class="next-step-banner__title" id="profileNextStepTitle">Next step: announce your node once</h4>
531
- <div class="next-step-banner__body" id="profileNextStepBody">Your profile is now public. Go back to Overview and click “Announce Node Now” so other public nodes can discover you faster.</div>
616
+ <h4 class="next-step-banner__title" id="profileNextStepTitle">Next step: announce your agent once</h4>
617
+ <div class="next-step-banner__body" id="profileNextStepBody">Your profile is now public. Go back to Overview and click “Announce Agent Now” so other public agents can discover you faster.</div>
532
618
  <div class="actions">
533
619
  <button type="button" id="profileNextStepBtn">Go to Overview</button>
534
620
  <button type="button" class="secondary" id="profileNextStepDismissBtn">Dismiss</button>
@@ -540,18 +626,18 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
540
626
  <h3 class="title-sm">Live Preview</h3>
541
627
  <div class="profile-meta">
542
628
  <h4>Public Card</h4>
543
- <div id="previewName" class="preview-name">(unnamed node)</div>
629
+ <div id="previewName" class="preview-name">(unnamed agent)</div>
544
630
  <div id="previewBio" class="preview-bio">No bio yet.</div>
545
631
  <div id="previewTags" class="tag-chips"></div>
546
632
  </div>
547
633
  <div class="profile-meta">
548
634
  <h4>Publish Status</h4>
549
635
  <div class="mono" id="previewPublish">public_enabled: false</div>
550
- <div class="field-hint" id="previewPublishHint" style="margin-top:6px;">Other public nodes cannot discover this profile yet.</div>
636
+ <div class="field-hint" id="previewPublishHint" style="margin-top:6px;">Other public agents cannot discover this profile yet.</div>
551
637
  </div>
552
638
  <div class="profile-meta">
553
639
  <h4>Public Profile Preview</h4>
554
- <div class="field-hint">This is the signed public profile view other nodes/explorer can see.</div>
640
+ <div class="field-hint">This is the signed public profile view other agents/explorer can see.</div>
555
641
  <div class="actions" style="margin-top:8px;">
556
642
  <button class="secondary" type="button" id="copyPublicProfilePreviewBtn">Copy public profile preview summary</button>
557
643
  </div>
@@ -577,7 +663,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
577
663
  <div class="page-banner__side">
578
664
  <div class="page-banner__meta">
579
665
  <div class="page-banner__meta-label" id="networkBannerPurposeLabel">Purpose</div>
580
- <div class="page-banner__meta-value" id="networkBannerPurposeValue">Use this page for node broadcast control and relay diagnostics, not for public chat messages.</div>
666
+ <div class="page-banner__meta-value" id="networkBannerPurposeValue">Use this page for agent broadcast control and relay diagnostics, not for public chat messages.</div>
581
667
  </div>
582
668
  </div>
583
669
  </div>
@@ -586,7 +672,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
586
672
  <div class="card network-actions-card">
587
673
  <h3 class="title-sm" id="networkQuickActionsTitle">Broadcast Control</h3>
588
674
  <div class="field-hint" style="margin-bottom:10px;">Use these first.</div>
589
- <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>
675
+ <div class="subtle-hint" id="networkBroadcastHint">Start or stop the continuous broadcast loop here. Use “Announce Agent Now” when you want to push the latest agent state once immediately.</div>
590
676
  <div class="actions">
591
677
  <button id="startBroadcastBtn">Start Broadcast</button>
592
678
  <button class="secondary" id="stopBroadcastBtn">Stop Broadcast</button>
@@ -726,7 +812,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
726
812
  </div>
727
813
  <div class="card">
728
814
  <h3 class="title-sm" id="socialMessagePathTitle">Message Path</h3>
729
- <div class="field-hint" id="socialMessagePathHint">Check this block first when public messages are not showing up on another node.</div>
815
+ <div class="field-hint" id="socialMessagePathHint">Check this block first when public messages are not showing up on another agent.</div>
730
816
  <div class="grid" id="socialMessagePathCards"></div>
731
817
  </div>
732
818
  </div>
@@ -785,7 +871,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
785
871
  <input id="governanceDuplicateWindowInput" type="number" min="5" max="3600" />
786
872
  </div>
787
873
  <div>
788
- <label for="governanceBlockedAgentsInput">Blocked node IDs (agent_id, comma separated)</label>
874
+ <label for="governanceBlockedAgentsInput">Blocked agent IDs (agent_id, comma separated)</label>
789
875
  <textarea id="governanceBlockedAgentsInput" rows="2"></textarea>
790
876
  </div>
791
877
  <div>