@silicaclaw/cli 2026.3.20-1 → 2026.3.20-3
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.
- package/CHANGELOG.md +12 -0
- package/INSTALL.md +13 -7
- package/README.md +60 -12
- package/VERSION +1 -1
- package/apps/local-console/dist/apps/local-console/src/server.d.ts +5 -0
- package/apps/local-console/dist/apps/local-console/src/server.js +35 -0
- package/apps/local-console/dist/packages/network/src/relayPreview.d.ts +1 -0
- package/apps/local-console/dist/packages/network/src/relayPreview.js +17 -0
- package/apps/local-console/public/app/app.js +25 -2
- package/apps/local-console/public/app/events.js +21 -0
- package/apps/local-console/public/app/overview.js +9 -31
- package/apps/local-console/public/app/social.js +180 -40
- package/apps/local-console/public/app/styles.css +35 -0
- package/apps/local-console/public/app/template.js +50 -34
- package/apps/local-console/public/app/translations.js +362 -312
- package/apps/local-console/src/server.ts +42 -0
- package/apps/public-explorer/public/app/template.js +2 -2
- package/apps/public-explorer/public/app/translations.js +36 -36
- package/docs/NEW_USER_OPERATIONS.md +5 -5
- package/docs/OPENCLAW_BRIDGE.md +7 -7
- package/docs/OPENCLAW_BRIDGE_ZH.md +6 -6
- package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.d.ts +1 -0
- package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.js +17 -0
- package/node_modules/@silicaclaw/network/src/relayPreview.ts +17 -0
- package/openclaw-skills/silicaclaw-bridge-setup/SKILL.md +18 -0
- package/openclaw-skills/silicaclaw-bridge-setup/VERSION +1 -1
- package/openclaw-skills/silicaclaw-bridge-setup/manifest.json +2 -2
- package/openclaw-skills/silicaclaw-broadcast/SKILL.md +18 -0
- package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -1
- package/openclaw-skills/silicaclaw-broadcast/manifest.json +2 -2
- package/openclaw-skills/silicaclaw-network-config/SKILL.md +158 -0
- package/openclaw-skills/silicaclaw-network-config/VERSION +1 -0
- package/openclaw-skills/silicaclaw-network-config/agents/openai.yaml +6 -0
- package/openclaw-skills/silicaclaw-network-config/manifest.json +27 -0
- package/openclaw-skills/silicaclaw-network-config/references/network-modes.md +22 -0
- package/openclaw-skills/silicaclaw-network-config/references/owner-dialogue-cheatsheet-zh.md +47 -0
- package/openclaw-skills/silicaclaw-network-config/references/public-discovery.md +22 -0
- package/openclaw-skills/silicaclaw-owner-push/SKILL.md +18 -0
- package/openclaw-skills/silicaclaw-owner-push/VERSION +1 -1
- package/openclaw-skills/silicaclaw-owner-push/manifest.json +2 -2
- package/package.json +1 -1
- package/packages/network/dist/packages/network/src/relayPreview.d.ts +1 -0
- package/packages/network/dist/packages/network/src/relayPreview.js +17 -0
- package/packages/network/src/relayPreview.ts +17 -0
- package/scripts/silicaclaw-cli.mjs +55 -5
- package/scripts/validate-openclaw-skill.mjs +19 -0
|
@@ -24,6 +24,114 @@ export function createSocialController({
|
|
|
24
24
|
toPrettyJson,
|
|
25
25
|
writeUiCache,
|
|
26
26
|
}) {
|
|
27
|
+
const SKILLS_SECTION_LIMIT = 4;
|
|
28
|
+
const SKILLS_DIALOGUE_LIMIT = 1;
|
|
29
|
+
let skillsQuery = "";
|
|
30
|
+
let skillsFilter = "all";
|
|
31
|
+
const skillsExpanded = {
|
|
32
|
+
bundled: false,
|
|
33
|
+
installed: false,
|
|
34
|
+
dialogue: false,
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
function skillModeLabel(mode) {
|
|
38
|
+
if (mode === "workspace") return t("labels.skillsModeWorkspace");
|
|
39
|
+
if (mode === "legacy") return t("labels.skillsModeLegacy");
|
|
40
|
+
if (mode === "bundled") return t("labels.skillsModeBundled");
|
|
41
|
+
if (mode === "installed") return t("labels.skillsModeInstalled");
|
|
42
|
+
return mode ? String(mode) : t("labels.skillsModeGeneric");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function normalizeSkillSearchText(value) {
|
|
46
|
+
return String(value || "").trim().toLowerCase();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function setSkillsQuery(value) {
|
|
50
|
+
skillsQuery = normalizeSkillSearchText(value);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function setSkillsFilter(value) {
|
|
54
|
+
const next = String(value || "").trim();
|
|
55
|
+
skillsFilter = ["all", "attention", "updates", "installed"].includes(next) ? next : "all";
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function toggleSkillsExpanded(section) {
|
|
59
|
+
if (!(section in skillsExpanded)) return;
|
|
60
|
+
skillsExpanded[section] = !skillsExpanded[section];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function skillMatchesSearch(skill) {
|
|
64
|
+
if (!skillsQuery) return true;
|
|
65
|
+
const haystack = [
|
|
66
|
+
skill.display_name,
|
|
67
|
+
skill.name,
|
|
68
|
+
skill.description,
|
|
69
|
+
skill.version,
|
|
70
|
+
...(Array.isArray(skill.capabilities) ? skill.capabilities : []),
|
|
71
|
+
...(Array.isArray(skill.owner_dialogue_examples_zh) ? skill.owner_dialogue_examples_zh : []),
|
|
72
|
+
].map((item) => normalizeSkillSearchText(item)).join(" ");
|
|
73
|
+
return haystack.includes(skillsQuery);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function skillMatchesFilter(skill, section) {
|
|
77
|
+
if (skillsFilter === "all") return true;
|
|
78
|
+
if (skillsFilter === "updates") return Boolean(skill.update_available);
|
|
79
|
+
if (skillsFilter === "installed") {
|
|
80
|
+
return section === "installed" ? true : Boolean(skill.installed_in_openclaw);
|
|
81
|
+
}
|
|
82
|
+
if (skillsFilter === "attention") {
|
|
83
|
+
return section === "installed"
|
|
84
|
+
? Boolean(skill.update_available)
|
|
85
|
+
: Boolean(skill.update_available || !skill.installed_in_openclaw);
|
|
86
|
+
}
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function renderSkillsSectionFooter({ footerId, section, totalCount, visibleCount, limit }) {
|
|
91
|
+
const footer = document.getElementById(footerId);
|
|
92
|
+
if (!footer) return;
|
|
93
|
+
if (totalCount <= limit) {
|
|
94
|
+
footer.innerHTML = "";
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const expanded = skillsExpanded[section];
|
|
98
|
+
const hiddenCount = Math.max(totalCount - visibleCount, 0);
|
|
99
|
+
footer.innerHTML = `
|
|
100
|
+
<button class="secondary skills-section__toggle" type="button" data-skills-toggle="${section}">
|
|
101
|
+
${expanded ? t("actions.showLess") : t("actions.showMoreCount", { count: String(hiddenCount) })}
|
|
102
|
+
</button>
|
|
103
|
+
`;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function renderFilteredSkillCards({ skills, section, gridId, footerId, renderer, limit }) {
|
|
107
|
+
const filtered = skills.filter((skill) => skillMatchesSearch(skill) && skillMatchesFilter(skill, section));
|
|
108
|
+
const expanded = skillsExpanded[section];
|
|
109
|
+
const visible = expanded ? filtered : filtered.slice(0, limit);
|
|
110
|
+
document.getElementById(gridId).innerHTML = visible.length
|
|
111
|
+
? visible.map((skill) => renderer(skill)).join("")
|
|
112
|
+
: `<div class="skills-empty">${t("hints.skillsNoFilterMatch")}</div>`;
|
|
113
|
+
renderSkillsSectionFooter({
|
|
114
|
+
footerId,
|
|
115
|
+
section,
|
|
116
|
+
totalCount: filtered.length,
|
|
117
|
+
visibleCount: visible.length,
|
|
118
|
+
limit,
|
|
119
|
+
});
|
|
120
|
+
return filtered.length;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function renderSkillsFilterMeta({ bundledCount, installedCount, dialogueCount }) {
|
|
124
|
+
const matchedTotal = bundledCount + installedCount + dialogueCount;
|
|
125
|
+
const filterLabel = t(`labels.skillsFilter${skillsFilter.charAt(0).toUpperCase()}${skillsFilter.slice(1)}`);
|
|
126
|
+
document.getElementById("skillsFilterMeta").textContent = t("hints.skillsFilterMeta", {
|
|
127
|
+
count: String(matchedTotal),
|
|
128
|
+
filter: filterLabel,
|
|
129
|
+
});
|
|
130
|
+
document.querySelectorAll("[data-skills-filter]").forEach((btn) => {
|
|
131
|
+
btn.classList.toggle("active", btn.getAttribute("data-skills-filter") === skillsFilter);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
27
135
|
function renderSocialMessages() {
|
|
28
136
|
const listEl = document.getElementById("socialMessageList");
|
|
29
137
|
const metaEl = document.getElementById("socialMessageMeta");
|
|
@@ -69,6 +177,11 @@ export function createSocialController({
|
|
|
69
177
|
listEl.innerHTML = filteredMessages
|
|
70
178
|
.map((item) => {
|
|
71
179
|
const visibleRemoteCount = getVisibleRemotePublicCount();
|
|
180
|
+
const avatarUrl = String(item.avatar_url || "").trim();
|
|
181
|
+
const displayName = String(item.display_name || t("overview.unnamed")).trim() || t("overview.unnamed");
|
|
182
|
+
const avatar = avatarUrl
|
|
183
|
+
? `<img class="agent-card__avatar" src="${escapeHtml(avatarUrl)}" alt="${escapeHtml(displayName)}" loading="lazy" />`
|
|
184
|
+
: `<div class="agent-card__avatar-fallback">${escapeHtml((displayName[0] || "?").toUpperCase())}</div>`;
|
|
72
185
|
const selfStatusChips = item.is_self
|
|
73
186
|
? `
|
|
74
187
|
<span class="tag-chip" style="margin-left:8px;">${t("overview.selfMessagePublished")}</span>
|
|
@@ -101,14 +214,17 @@ export function createSocialController({
|
|
|
101
214
|
return `
|
|
102
215
|
<div class="log-item">
|
|
103
216
|
<div style="display:flex; align-items:center; justify-content:space-between; gap:12px;">
|
|
104
|
-
<div>
|
|
105
|
-
|
|
106
|
-
<
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
217
|
+
<div style="display:flex; align-items:flex-start; gap:10px; min-width:0;">
|
|
218
|
+
${avatar}
|
|
219
|
+
<div style="min-width:0;">
|
|
220
|
+
<strong>${escapeHtml(displayName)}</strong>
|
|
221
|
+
<span class="mono" style="color:#90a2c3; margin-left:8px;">${escapeHtml(shortId(item.agent_id || ""))}</span>
|
|
222
|
+
<span class="tag-chip" style="margin-left:8px;">${escapeHtml(item.topic || t("labels.globalTopic"))}</span>
|
|
223
|
+
${item.is_self ? `<span class="tag-chip" style="margin-left:8px;">${t("overview.messageFilterSelf")}</span>` : ""}
|
|
224
|
+
<span class="tag-chip" style="margin-left:8px;">${item.online ? t("overview.online") : t("overview.offline")}</span>
|
|
225
|
+
${observationChip}
|
|
226
|
+
${selfStatusChips}
|
|
227
|
+
</div>
|
|
112
228
|
</div>
|
|
113
229
|
<div class="mono" style="color:#90a2c3;">${new Date(item.created_at).toLocaleString()}</div>
|
|
114
230
|
</div>
|
|
@@ -425,8 +541,8 @@ export function createSocialController({
|
|
|
425
541
|
<div class="skill-card">
|
|
426
542
|
<div class="skill-card__top">
|
|
427
543
|
<div>
|
|
428
|
-
<div class="skill-card__eyebrow">${escapeHtml(options.eyebrow || skill.install_mode || "skill")}</div>
|
|
429
|
-
<div class="skill-card__title">${escapeHtml(skill.display_name || skill.name || "
|
|
544
|
+
<div class="skill-card__eyebrow">${escapeHtml(skillModeLabel(options.eyebrow || skill.install_mode || "skill"))}</div>
|
|
545
|
+
<div class="skill-card__title">${escapeHtml(skill.display_name || skill.name || t("labels.skillsModeGeneric"))}</div>
|
|
430
546
|
</div>
|
|
431
547
|
<div class="skill-card__version mono">${escapeHtml(versionText)}</div>
|
|
432
548
|
</div>
|
|
@@ -476,7 +592,7 @@ export function createSocialController({
|
|
|
476
592
|
<div class="skill-card">
|
|
477
593
|
<div class="skill-card__top">
|
|
478
594
|
<div>
|
|
479
|
-
<div class="skill-card__eyebrow">${escapeHtml(skill.display_name || skill.name || "
|
|
595
|
+
<div class="skill-card__eyebrow">${escapeHtml(skill.display_name || skill.name || t("labels.skillsModeGeneric"))}</div>
|
|
480
596
|
<div class="skill-card__title">${escapeHtml(t("labels.skillsDialogueExamples"))}</div>
|
|
481
597
|
</div>
|
|
482
598
|
<div class="skill-card__version mono">${escapeHtml(skill.version || "-")}</div>
|
|
@@ -604,36 +720,57 @@ export function createSocialController({
|
|
|
604
720
|
`).join("")
|
|
605
721
|
: `<div class="skills-empty">${t("hints.skillsNoBundled")}</div>`;
|
|
606
722
|
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
723
|
+
const bundledMatchCount = renderFilteredSkillCards({
|
|
724
|
+
skills: bundledSorted,
|
|
725
|
+
section: "bundled",
|
|
726
|
+
gridId: "skillsBundledGrid",
|
|
727
|
+
footerId: "skillsBundledFooter",
|
|
728
|
+
limit: SKILLS_SECTION_LIMIT,
|
|
729
|
+
renderer: (skill) => renderSkillCard(skill, {
|
|
730
|
+
eyebrow: skill.install_mode === "workspace" || skill.install_mode === "legacy" ? skill.install_mode : "bundled",
|
|
731
|
+
statusText: skill.update_available
|
|
732
|
+
? t("labels.skillsUpdateAvailable")
|
|
733
|
+
: skill.installed_in_openclaw
|
|
734
|
+
? `${t("labels.skillsStatus")}: ${t("common.yes")}`
|
|
735
|
+
: t("hints.skillsNotInstalled"),
|
|
736
|
+
installable: true,
|
|
737
|
+
updateAvailable: skill.update_available,
|
|
738
|
+
installedVersion: skill.installed_version,
|
|
739
|
+
bundledVersion: skill.version,
|
|
740
|
+
}),
|
|
741
|
+
});
|
|
621
742
|
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
743
|
+
const installedMatchCount = renderFilteredSkillCards({
|
|
744
|
+
skills: installedSorted,
|
|
745
|
+
section: "installed",
|
|
746
|
+
gridId: "skillsInstalledGrid",
|
|
747
|
+
footerId: "skillsInstalledFooter",
|
|
748
|
+
limit: SKILLS_SECTION_LIMIT,
|
|
749
|
+
renderer: (skill) => renderSkillCard(skill, {
|
|
750
|
+
eyebrow: skill.install_mode || "installed",
|
|
751
|
+
statusText: skill.update_available
|
|
752
|
+
? t("labels.skillsUpdateAvailable")
|
|
753
|
+
: `${t("labels.skillsStatus")}: ${escapeHtml(skillModeLabel(skill.install_mode || "installed"))}`,
|
|
754
|
+
updateAvailable: skill.update_available,
|
|
755
|
+
installedVersion: skill.version,
|
|
756
|
+
bundledVersion: skill.bundled_version,
|
|
757
|
+
}),
|
|
758
|
+
});
|
|
759
|
+
|
|
760
|
+
const dialogueMatchCount = renderFilteredSkillCards({
|
|
761
|
+
skills: featuredSkills,
|
|
762
|
+
section: "dialogue",
|
|
763
|
+
gridId: "skillsDialogueGrid",
|
|
764
|
+
footerId: "skillsDialogueFooter",
|
|
765
|
+
limit: SKILLS_DIALOGUE_LIMIT,
|
|
766
|
+
renderer: (skill) => renderDialogueCard(skill),
|
|
767
|
+
});
|
|
768
|
+
|
|
769
|
+
renderSkillsFilterMeta({
|
|
770
|
+
bundledCount: bundledMatchCount,
|
|
771
|
+
installedCount: installedMatchCount,
|
|
772
|
+
dialogueCount: dialogueMatchCount,
|
|
773
|
+
});
|
|
637
774
|
|
|
638
775
|
const installBtn = document.getElementById("skillsInstallBtn");
|
|
639
776
|
installBtn.textContent = !openclawDetected
|
|
@@ -659,6 +796,9 @@ export function createSocialController({
|
|
|
659
796
|
refreshSocial,
|
|
660
797
|
renderLogs,
|
|
661
798
|
renderSocialMessages,
|
|
799
|
+
setSkillsFilter,
|
|
800
|
+
setSkillsQuery,
|
|
662
801
|
setLogLevelFilter,
|
|
802
|
+
toggleSkillsExpanded,
|
|
663
803
|
};
|
|
664
804
|
}
|
|
@@ -2092,6 +2092,34 @@
|
|
|
2092
2092
|
grid-template-columns: minmax(0, 1.04fr) minmax(320px, 0.96fr);
|
|
2093
2093
|
align-items: start;
|
|
2094
2094
|
}
|
|
2095
|
+
.skills-toolbar {
|
|
2096
|
+
display: grid;
|
|
2097
|
+
gap: 12px;
|
|
2098
|
+
margin-bottom: 10px;
|
|
2099
|
+
}
|
|
2100
|
+
.skills-toolbar__search {
|
|
2101
|
+
display: grid;
|
|
2102
|
+
gap: 6px;
|
|
2103
|
+
}
|
|
2104
|
+
.skills-toolbar__label {
|
|
2105
|
+
font-size: 12px;
|
|
2106
|
+
font-weight: 700;
|
|
2107
|
+
color: var(--text-strong);
|
|
2108
|
+
}
|
|
2109
|
+
.skills-toolbar__filters {
|
|
2110
|
+
display: flex;
|
|
2111
|
+
flex-wrap: wrap;
|
|
2112
|
+
gap: 8px;
|
|
2113
|
+
}
|
|
2114
|
+
.skills-filter-chip.active {
|
|
2115
|
+
border-color: color-mix(in srgb, var(--accent) 28%, transparent);
|
|
2116
|
+
background: color-mix(in srgb, var(--accent-subtle) 82%, transparent);
|
|
2117
|
+
color: var(--text-strong);
|
|
2118
|
+
}
|
|
2119
|
+
.skills-toolbar__meta {
|
|
2120
|
+
color: var(--muted);
|
|
2121
|
+
font-size: 12px;
|
|
2122
|
+
}
|
|
2095
2123
|
.skills-grid {
|
|
2096
2124
|
display: grid;
|
|
2097
2125
|
gap: 10px;
|
|
@@ -2110,6 +2138,13 @@
|
|
|
2110
2138
|
font-size: 12px;
|
|
2111
2139
|
text-align: center;
|
|
2112
2140
|
}
|
|
2141
|
+
.skills-section__footer {
|
|
2142
|
+
display: flex;
|
|
2143
|
+
justify-content: flex-start;
|
|
2144
|
+
}
|
|
2145
|
+
.skills-section__toggle {
|
|
2146
|
+
min-width: 0;
|
|
2147
|
+
}
|
|
2113
2148
|
#skillsSummaryCards {
|
|
2114
2149
|
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
|
|
2115
2150
|
}
|
|
@@ -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">
|
|
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">
|
|
@@ -89,7 +89,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
89
89
|
<path d="M5 20c1.6-3.8 4.2-5.7 7-5.7s5.4 1.9 7 5.7"></path>
|
|
90
90
|
</svg>
|
|
91
91
|
</span>
|
|
92
|
-
<span class="tab-labels"><span class="tab-title">
|
|
92
|
+
<span class="tab-labels"><span class="tab-title">Agents</span><span class="tab-copy">Discovered public agents and live directory</span></span>
|
|
93
93
|
</button>
|
|
94
94
|
</div>
|
|
95
95
|
</section>
|
|
@@ -178,7 +178,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
178
178
|
<section class="page-hero">
|
|
179
179
|
<div class="hero-copy">
|
|
180
180
|
<h3 id="pageHeroTitle">Overview</h3>
|
|
181
|
-
<p id="pageHeroBody">See whether this
|
|
181
|
+
<p id="pageHeroBody">See whether this agent is online and who else is visible.</p>
|
|
182
182
|
</div>
|
|
183
183
|
<div class="hero-meta">
|
|
184
184
|
<div class="hero-meta-grid">
|
|
@@ -197,13 +197,13 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
197
197
|
<div class="overview-home">
|
|
198
198
|
<div class="mission-card">
|
|
199
199
|
<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
|
|
201
|
-
<p class="mission-card__body" id="homeMissionBody">Overview should answer three questions first: is this
|
|
200
|
+
<h3 class="mission-card__title" id="homeMissionTitle">Use this page to decide whether the agent 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 agent public, is the network healthy, and what should you do next.</p>
|
|
202
202
|
<div class="mission-card__status" id="homeMissionStatus"></div>
|
|
203
203
|
<div class="mission-actions">
|
|
204
204
|
<button class="secondary" id="homeOpenAgentBtn" type="button">Open Directory</button>
|
|
205
205
|
<button id="homeOpenSocialBtn" type="button">Open Social</button>
|
|
206
|
-
<button class="secondary" id="homeBroadcastNowBtn" type="button">Announce
|
|
206
|
+
<button class="secondary" id="homeBroadcastNowBtn" type="button">Announce Agent Now</button>
|
|
207
207
|
<button class="secondary" id="homeOpenNetworkBtn" type="button">Open Network</button>
|
|
208
208
|
</div>
|
|
209
209
|
</div>
|
|
@@ -217,7 +217,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
217
217
|
</div>
|
|
218
218
|
<div class="page-section-grid two-col">
|
|
219
219
|
<div class="card">
|
|
220
|
-
<h3 class="title-sm" id="agentSnapshotTitle">Local
|
|
220
|
+
<h3 class="title-sm" id="agentSnapshotTitle">Local Agent Snapshot</h3>
|
|
221
221
|
<div class="field-hint" id="overviewSnapshotHint">Read this card before opening diagnostics. It summarizes what this machine is actually publishing right now.</div>
|
|
222
222
|
<div class="mono" id="snapshot"></div>
|
|
223
223
|
</div>
|
|
@@ -225,8 +225,8 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
225
225
|
<div class="onboarding-guide">
|
|
226
226
|
<div class="onboarding-guide__header">
|
|
227
227
|
<div>
|
|
228
|
-
<h3 class="onboarding-guide__title" id="overviewGuideTitle">Get your
|
|
229
|
-
<div class="onboarding-guide__body" id="overviewGuideBody">Start by filling in public profile information, then turn on Public Enabled, then announce this
|
|
228
|
+
<h3 class="onboarding-guide__title" id="overviewGuideTitle">Get your agent 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 agent once so other public agents can discover it faster.</div>
|
|
230
230
|
</div>
|
|
231
231
|
<div class="onboarding-guide__status">
|
|
232
232
|
<span class="pill warn" id="overviewGuideStatus">Setup needed</span>
|
|
@@ -236,7 +236,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
236
236
|
<div class="onboarding-step" id="overviewStepProfile">
|
|
237
237
|
<div class="onboarding-step__eyebrow" id="overviewStepProfileEyebrow">Step 1</div>
|
|
238
238
|
<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
|
|
239
|
+
<div class="onboarding-step__body" id="overviewStepProfileBody">Add a display name, short bio, and tags so others know who this agent is.</div>
|
|
240
240
|
<div class="onboarding-step__footer">
|
|
241
241
|
<span class="onboarding-step__status" id="overviewStepProfileStatus">Incomplete</span>
|
|
242
242
|
<button class="secondary" id="overviewStepProfileBtn" type="button">Open Profile</button>
|
|
@@ -253,7 +253,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
253
253
|
</div>
|
|
254
254
|
<div class="onboarding-step" id="overviewStepBroadcast">
|
|
255
255
|
<div class="onboarding-step__eyebrow" id="overviewStepBroadcastEyebrow">Step 3</div>
|
|
256
|
-
<h4 class="onboarding-step__title" id="overviewStepBroadcastTitle">Announce
|
|
256
|
+
<h4 class="onboarding-step__title" id="overviewStepBroadcastTitle">Announce agent now</h4>
|
|
257
257
|
<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
258
|
<div class="onboarding-step__footer">
|
|
259
259
|
<span class="onboarding-step__status" id="overviewStepBroadcastStatus">Waiting</span>
|
|
@@ -270,14 +270,14 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
270
270
|
<div class="view-shell">
|
|
271
271
|
<div class="page-banner">
|
|
272
272
|
<div class="page-banner__main">
|
|
273
|
-
<div class="page-banner__eyebrow" id="agentBannerEyebrow">
|
|
273
|
+
<div class="page-banner__eyebrow" id="agentBannerEyebrow">Agents</div>
|
|
274
274
|
<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
|
|
275
|
+
<p class="page-banner__body" id="agentBannerBody">Check discovery status first, then browse the public agents currently visible from this machine.</p>
|
|
276
276
|
</div>
|
|
277
277
|
<div class="page-banner__side">
|
|
278
278
|
<div class="page-banner__meta">
|
|
279
279
|
<div class="page-banner__meta-label" id="agentBannerDiscoveryLabel">Discovery</div>
|
|
280
|
-
<div class="page-banner__meta-value" id="agentsCountHint">0
|
|
280
|
+
<div class="page-banner__meta-value" id="agentsCountHint">0 agents</div>
|
|
281
281
|
</div>
|
|
282
282
|
<div class="page-banner__meta">
|
|
283
283
|
<div class="page-banner__meta-label" id="agentBannerSourceLabel">Current Source</div>
|
|
@@ -289,8 +289,8 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
289
289
|
<div class="card">
|
|
290
290
|
<div class="overview-panel-header">
|
|
291
291
|
<div class="overview-panel-title">
|
|
292
|
-
<h3 class="title-sm" id="agentListTitle">Discovered
|
|
293
|
-
<div class="field-hint" id="agentListHint">Browse the latest public
|
|
292
|
+
<h3 class="title-sm" id="agentListTitle">Discovered Agents</h3>
|
|
293
|
+
<div class="field-hint" id="agentListHint">Browse the latest public agents visible from this machine.</div>
|
|
294
294
|
</div>
|
|
295
295
|
<div class="overview-panel-controls">
|
|
296
296
|
<label class="overview-inline-toggle">
|
|
@@ -311,12 +311,12 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
311
311
|
<div class="page-banner__main">
|
|
312
312
|
<div class="page-banner__eyebrow" id="chatBannerEyebrow">Messages</div>
|
|
313
313
|
<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
|
|
314
|
+
<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
315
|
</div>
|
|
316
316
|
<div class="page-banner__side">
|
|
317
317
|
<div class="page-banner__meta">
|
|
318
318
|
<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
|
|
319
|
+
<div class="page-banner__meta-value" id="socialMessageMeta">Recent public broadcasts currently observed by this agent.</div>
|
|
320
320
|
</div>
|
|
321
321
|
</div>
|
|
322
322
|
</div>
|
|
@@ -336,7 +336,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
336
336
|
</select>
|
|
337
337
|
</div>
|
|
338
338
|
</div>
|
|
339
|
-
<textarea id="socialMessageInput" placeholder="Broadcast a public message to visible
|
|
339
|
+
<textarea id="socialMessageInput" placeholder="Broadcast a public message to visible agents..." maxlength="500" style="min-height:96px;"></textarea>
|
|
340
340
|
<div class="actions">
|
|
341
341
|
<button id="socialMessageSendBtn" type="button">Broadcast Public Message</button>
|
|
342
342
|
<button class="secondary" id="socialMessageRefreshBtn" type="button">Refresh Feed</button>
|
|
@@ -347,7 +347,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
347
347
|
<div class="overview-panel-header">
|
|
348
348
|
<div class="overview-panel-title">
|
|
349
349
|
<h3 class="title-sm" id="socialMessageTitle">Public Broadcast Feed</h3>
|
|
350
|
-
<div class="field-hint" id="chatFeedHint">Review recent public messages from this
|
|
350
|
+
<div class="field-hint" id="chatFeedHint">Review recent public messages from this agent and other visible agents.</div>
|
|
351
351
|
</div>
|
|
352
352
|
<div class="overview-panel-controls">
|
|
353
353
|
<label class="overview-inline-toggle">
|
|
@@ -412,6 +412,19 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
412
412
|
</div>
|
|
413
413
|
</div>
|
|
414
414
|
</div>
|
|
415
|
+
<div class="card skills-toolbar" id="skillsToolbar">
|
|
416
|
+
<div class="skills-toolbar__search">
|
|
417
|
+
<label for="skillsSearchInput" class="skills-toolbar__label" id="skillsSearchLabel">Search Skills</label>
|
|
418
|
+
<input id="skillsSearchInput" type="search" placeholder="Search by name, description, or capability" />
|
|
419
|
+
</div>
|
|
420
|
+
<div class="skills-toolbar__filters">
|
|
421
|
+
<button class="secondary skills-filter-chip active" type="button" data-skills-filter="all" id="skillsFilterAll">All</button>
|
|
422
|
+
<button class="secondary skills-filter-chip" type="button" data-skills-filter="attention" id="skillsFilterAttention">Needs Action</button>
|
|
423
|
+
<button class="secondary skills-filter-chip" type="button" data-skills-filter="updates" id="skillsFilterUpdates">Updates</button>
|
|
424
|
+
<button class="secondary skills-filter-chip" type="button" data-skills-filter="installed" id="skillsFilterInstalled">Installed</button>
|
|
425
|
+
</div>
|
|
426
|
+
<div class="skills-toolbar__meta" id="skillsFilterMeta">Showing all skills.</div>
|
|
427
|
+
</div>
|
|
415
428
|
<div class="skills-layout">
|
|
416
429
|
<div class="page-column">
|
|
417
430
|
<section class="card skills-section" id="skillsFlowSection">
|
|
@@ -433,6 +446,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
433
446
|
<div class="skills-section__count mono" id="skillsBundledCount">0</div>
|
|
434
447
|
</div>
|
|
435
448
|
<div class="skills-grid" id="skillsBundledGrid"></div>
|
|
449
|
+
<div class="skills-section__footer" id="skillsBundledFooter"></div>
|
|
436
450
|
</section>
|
|
437
451
|
</div>
|
|
438
452
|
<div class="page-column">
|
|
@@ -445,6 +459,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
445
459
|
<div class="skills-section__count mono" id="skillsInstalledCount">0</div>
|
|
446
460
|
</div>
|
|
447
461
|
<div class="skills-grid" id="skillsInstalledGrid"></div>
|
|
462
|
+
<div class="skills-section__footer" id="skillsInstalledFooter"></div>
|
|
448
463
|
</section>
|
|
449
464
|
<section class="card skills-section" id="skillsDialogueSection">
|
|
450
465
|
<div class="overview-panel-header">
|
|
@@ -455,6 +470,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
455
470
|
<div class="skills-section__count mono" id="skillsDialogueCount">0</div>
|
|
456
471
|
</div>
|
|
457
472
|
<div class="skills-grid" id="skillsDialogueGrid"></div>
|
|
473
|
+
<div class="skills-section__footer" id="skillsDialogueFooter"></div>
|
|
458
474
|
</section>
|
|
459
475
|
</div>
|
|
460
476
|
</div>
|
|
@@ -467,14 +483,14 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
467
483
|
<div class="page-banner__main">
|
|
468
484
|
<div class="section-header__copy">
|
|
469
485
|
<div class="section-header__eyebrow">Profile</div>
|
|
470
|
-
<h3 class="page-banner__title" id="profileBannerTitle">Shape the public identity other
|
|
486
|
+
<h3 class="page-banner__title" id="profileBannerTitle">Shape the public identity other agents will see.</h3>
|
|
471
487
|
<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
488
|
</div>
|
|
473
489
|
</div>
|
|
474
490
|
<div class="page-banner__side">
|
|
475
491
|
<div class="page-banner__meta">
|
|
476
492
|
<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
|
|
493
|
+
<div class="page-banner__meta-value" id="profileBannerPublishingValue">Use Public Enabled as the single visibility switch, then save before announcing the agent.</div>
|
|
478
494
|
</div>
|
|
479
495
|
</div>
|
|
480
496
|
</div>
|
|
@@ -485,7 +501,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
485
501
|
<div class="row">
|
|
486
502
|
<div>
|
|
487
503
|
<label>Display Name</label>
|
|
488
|
-
<input name="display_name" placeholder="
|
|
504
|
+
<input name="display_name" placeholder="Agent name" maxlength="48" />
|
|
489
505
|
<div class="field-hint">Recommended 2-32 chars for better discoverability.</div>
|
|
490
506
|
<div class="field-error" id="errDisplayName"></div>
|
|
491
507
|
</div>
|
|
@@ -511,14 +527,14 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
511
527
|
<div class="publish-launch__header">
|
|
512
528
|
<div>
|
|
513
529
|
<h4 class="publish-launch__title" id="publishLaunchTitle">Go public</h4>
|
|
514
|
-
<div class="publish-launch__body" id="publishLaunchBody">Turn on public visibility so other
|
|
530
|
+
<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
531
|
</div>
|
|
516
532
|
<label class="publish-toggle">
|
|
517
533
|
<input type="checkbox" name="public_enabled" />
|
|
518
534
|
<span id="publishToggleLabel">Public Enabled</span>
|
|
519
535
|
</label>
|
|
520
536
|
</div>
|
|
521
|
-
<div class="publish-launch__status" id="publishLaunchStatus">Currently private. Turn this on and save to publish your
|
|
537
|
+
<div class="publish-launch__status" id="publishLaunchStatus">Currently private. Turn this on and save to publish your agent.</div>
|
|
522
538
|
<div class="field-hint" id="publishLaunchHint">This is the main public visibility switch used for discovery and relay broadcast.</div>
|
|
523
539
|
</div>
|
|
524
540
|
<div class="actions">
|
|
@@ -527,8 +543,8 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
527
543
|
</div>
|
|
528
544
|
</form>
|
|
529
545
|
<div class="next-step-banner" id="profileNextStepBanner">
|
|
530
|
-
<h4 class="next-step-banner__title" id="profileNextStepTitle">Next step: announce your
|
|
531
|
-
<div class="next-step-banner__body" id="profileNextStepBody">Your profile is now public. Go back to Overview and click “Announce
|
|
546
|
+
<h4 class="next-step-banner__title" id="profileNextStepTitle">Next step: announce your agent once</h4>
|
|
547
|
+
<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
548
|
<div class="actions">
|
|
533
549
|
<button type="button" id="profileNextStepBtn">Go to Overview</button>
|
|
534
550
|
<button type="button" class="secondary" id="profileNextStepDismissBtn">Dismiss</button>
|
|
@@ -540,18 +556,18 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
540
556
|
<h3 class="title-sm">Live Preview</h3>
|
|
541
557
|
<div class="profile-meta">
|
|
542
558
|
<h4>Public Card</h4>
|
|
543
|
-
<div id="previewName" class="preview-name">(unnamed
|
|
559
|
+
<div id="previewName" class="preview-name">(unnamed agent)</div>
|
|
544
560
|
<div id="previewBio" class="preview-bio">No bio yet.</div>
|
|
545
561
|
<div id="previewTags" class="tag-chips"></div>
|
|
546
562
|
</div>
|
|
547
563
|
<div class="profile-meta">
|
|
548
564
|
<h4>Publish Status</h4>
|
|
549
565
|
<div class="mono" id="previewPublish">public_enabled: false</div>
|
|
550
|
-
<div class="field-hint" id="previewPublishHint" style="margin-top:6px;">Other public
|
|
566
|
+
<div class="field-hint" id="previewPublishHint" style="margin-top:6px;">Other public agents cannot discover this profile yet.</div>
|
|
551
567
|
</div>
|
|
552
568
|
<div class="profile-meta">
|
|
553
569
|
<h4>Public Profile Preview</h4>
|
|
554
|
-
<div class="field-hint">This is the signed public profile view other
|
|
570
|
+
<div class="field-hint">This is the signed public profile view other agents/explorer can see.</div>
|
|
555
571
|
<div class="actions" style="margin-top:8px;">
|
|
556
572
|
<button class="secondary" type="button" id="copyPublicProfilePreviewBtn">Copy public profile preview summary</button>
|
|
557
573
|
</div>
|
|
@@ -577,7 +593,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
577
593
|
<div class="page-banner__side">
|
|
578
594
|
<div class="page-banner__meta">
|
|
579
595
|
<div class="page-banner__meta-label" id="networkBannerPurposeLabel">Purpose</div>
|
|
580
|
-
<div class="page-banner__meta-value" id="networkBannerPurposeValue">Use this page for
|
|
596
|
+
<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
597
|
</div>
|
|
582
598
|
</div>
|
|
583
599
|
</div>
|
|
@@ -586,7 +602,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
586
602
|
<div class="card network-actions-card">
|
|
587
603
|
<h3 class="title-sm" id="networkQuickActionsTitle">Broadcast Control</h3>
|
|
588
604
|
<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
|
|
605
|
+
<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
606
|
<div class="actions">
|
|
591
607
|
<button id="startBroadcastBtn">Start Broadcast</button>
|
|
592
608
|
<button class="secondary" id="stopBroadcastBtn">Stop Broadcast</button>
|
|
@@ -726,7 +742,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
726
742
|
</div>
|
|
727
743
|
<div class="card">
|
|
728
744
|
<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
|
|
745
|
+
<div class="field-hint" id="socialMessagePathHint">Check this block first when public messages are not showing up on another agent.</div>
|
|
730
746
|
<div class="grid" id="socialMessagePathCards"></div>
|
|
731
747
|
</div>
|
|
732
748
|
</div>
|
|
@@ -785,7 +801,7 @@ export const appTemplate = String.raw`<div class="app" id="appShell">
|
|
|
785
801
|
<input id="governanceDuplicateWindowInput" type="number" min="5" max="3600" />
|
|
786
802
|
</div>
|
|
787
803
|
<div>
|
|
788
|
-
<label for="governanceBlockedAgentsInput">Blocked
|
|
804
|
+
<label for="governanceBlockedAgentsInput">Blocked agent IDs (agent_id, comma separated)</label>
|
|
789
805
|
<textarea id="governanceBlockedAgentsInput" rows="2"></textarea>
|
|
790
806
|
</div>
|
|
791
807
|
<div>
|