@silicaclaw/cli 2026.3.20-19 → 2026.3.20-20
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 +6 -0
- package/VERSION +1 -1
- package/apps/local-console/public/app/events.js +3 -3
- package/apps/local-console/public/app/social.js +26 -12
- package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -1
- package/openclaw-skills/silicaclaw-broadcast/manifest.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## v1.0 beta - 2026-03-20
|
|
4
4
|
|
|
5
|
+
### 2026.3.20-20
|
|
6
|
+
|
|
7
|
+
- release build:
|
|
8
|
+
- prepared another fresh latest-channel package build without publishing
|
|
9
|
+
- regenerated the npm tarball through the verified release packing workflow
|
|
10
|
+
|
|
5
11
|
### 2026.3.20-19
|
|
6
12
|
|
|
7
13
|
- release build:
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v2026.3.20-
|
|
1
|
+
v2026.3.20-20
|
|
@@ -321,13 +321,13 @@ export function bindAppEvents({
|
|
|
321
321
|
|
|
322
322
|
document.getElementById("skillsSearchInput").addEventListener("input", async (event) => {
|
|
323
323
|
socialController.setSkillsQuery(String(event.target?.value || ""));
|
|
324
|
-
await
|
|
324
|
+
await socialController.rerenderSkills();
|
|
325
325
|
});
|
|
326
326
|
|
|
327
327
|
document.querySelectorAll("[data-skills-filter]").forEach((btn) => {
|
|
328
328
|
btn.addEventListener("click", async () => {
|
|
329
329
|
socialController.setSkillsFilter(String(btn.getAttribute("data-skills-filter") || "all"));
|
|
330
|
-
await
|
|
330
|
+
await socialController.rerenderSkills();
|
|
331
331
|
});
|
|
332
332
|
});
|
|
333
333
|
|
|
@@ -336,7 +336,7 @@ export function bindAppEvents({
|
|
|
336
336
|
const btn = event.target instanceof Element ? event.target.closest("[data-skills-toggle]") : null;
|
|
337
337
|
if (!btn) return;
|
|
338
338
|
socialController.toggleSkillsExpanded(String(btn.getAttribute("data-skills-toggle") || ""));
|
|
339
|
-
await
|
|
339
|
+
await socialController.rerenderSkills();
|
|
340
340
|
});
|
|
341
341
|
});
|
|
342
342
|
|
|
@@ -36,6 +36,7 @@ export function createSocialController({
|
|
|
36
36
|
installed: false,
|
|
37
37
|
dialogue: false,
|
|
38
38
|
};
|
|
39
|
+
let lastSkillsPayload = null;
|
|
39
40
|
|
|
40
41
|
function skillModeLabel(mode) {
|
|
41
42
|
if (mode === "workspace") return t("labels.skillsModeWorkspace");
|
|
@@ -106,13 +107,13 @@ export function createSocialController({
|
|
|
106
107
|
`;
|
|
107
108
|
}
|
|
108
109
|
|
|
109
|
-
function renderFilteredSkillCards({ skills, section, gridId, footerId, renderer, limit }) {
|
|
110
|
+
function renderFilteredSkillCards({ skills, section, gridId, footerId, renderer, limit, emptyText }) {
|
|
110
111
|
const filtered = skills.filter((skill) => skillMatchesSearch(skill) && skillMatchesFilter(skill, section));
|
|
111
112
|
const expanded = skillsExpanded[section];
|
|
112
113
|
const visible = expanded ? filtered : filtered.slice(0, limit);
|
|
113
114
|
document.getElementById(gridId).innerHTML = visible.length
|
|
114
115
|
? visible.map((skill) => renderer(skill)).join("")
|
|
115
|
-
: `<div class="skills-empty">${t("hints.skillsNoFilterMatch")}</div>`;
|
|
116
|
+
: `<div class="skills-empty">${filtered.length === 0 && skills.length > 0 ? t("hints.skillsNoFilterMatch") : emptyText}</div>`;
|
|
116
117
|
renderSkillsSectionFooter({
|
|
117
118
|
footerId,
|
|
118
119
|
section,
|
|
@@ -135,6 +136,10 @@ export function createSocialController({
|
|
|
135
136
|
});
|
|
136
137
|
}
|
|
137
138
|
|
|
139
|
+
function formatSectionCount(visibleCount, totalCount) {
|
|
140
|
+
return visibleCount === totalCount ? String(totalCount) : `${visibleCount}/${totalCount}`;
|
|
141
|
+
}
|
|
142
|
+
|
|
138
143
|
function setCachedContent(id, value, mode = "html") {
|
|
139
144
|
const cacheKey = `${mode}:${id}`;
|
|
140
145
|
if (sectionRenderCache.get(cacheKey) === value) {
|
|
@@ -701,8 +706,12 @@ export function createSocialController({
|
|
|
701
706
|
`;
|
|
702
707
|
}
|
|
703
708
|
|
|
704
|
-
async function refreshSkills() {
|
|
705
|
-
const
|
|
709
|
+
async function refreshSkills(options = {}) {
|
|
710
|
+
const useCached = options.useCached === true;
|
|
711
|
+
const payload = useCached && lastSkillsPayload
|
|
712
|
+
? lastSkillsPayload
|
|
713
|
+
: ((await api("/api/skills")).data || {});
|
|
714
|
+
lastSkillsPayload = payload;
|
|
706
715
|
const bundled = Array.isArray(payload.bundled_skills) ? payload.bundled_skills : [];
|
|
707
716
|
const installed = Array.isArray(payload.installed_skills) ? payload.installed_skills : [];
|
|
708
717
|
const openclaw = payload.openclaw || {};
|
|
@@ -784,13 +793,9 @@ export function createSocialController({
|
|
|
784
793
|
[t("labels.skillsAutoPush"), ownerPushSkill?.installed_in_openclaw ? t("common.yes") : t("common.no")],
|
|
785
794
|
].map(([k, v]) => `<div class="skills-summary-card"><div class="label">${k}</div><div class="value">${escapeHtml(v)}</div></div>`).join("");
|
|
786
795
|
|
|
787
|
-
|
|
788
|
-
document.getElementById("
|
|
789
|
-
|
|
790
|
-
document.getElementById("skillsDialogueCount").textContent = `${featuredSkills.length}`;
|
|
791
|
-
|
|
792
|
-
document.getElementById("skillsFeaturedSpotlights").innerHTML = featuredSkills.length
|
|
793
|
-
? featuredSkills.map((skill) => `
|
|
796
|
+
const filteredFeaturedSkills = featuredSkills.filter((skill) => skillMatchesSearch(skill) && skillMatchesFilter(skill, "bundled"));
|
|
797
|
+
document.getElementById("skillsFeaturedSpotlights").innerHTML = filteredFeaturedSkills.length
|
|
798
|
+
? filteredFeaturedSkills.map((skill) => `
|
|
794
799
|
<div class="skills-spotlight">
|
|
795
800
|
<div class="skill-card__eyebrow">${escapeHtml(skill.name === "silicaclaw-owner-push" ? t("labels.skillsAutoPush") : t("labels.skillsBroadcastLearning"))}</div>
|
|
796
801
|
<div class="skills-spotlight__title">${escapeHtml(skill.display_name || skill.name)}</div>
|
|
@@ -801,7 +806,7 @@ export function createSocialController({
|
|
|
801
806
|
</div>
|
|
802
807
|
</div>
|
|
803
808
|
`).join("")
|
|
804
|
-
: `<div class="skills-empty">${t("hints.skillsNoBundled")}</div>`;
|
|
809
|
+
: `<div class="skills-empty">${featuredSkills.length > 0 ? t("hints.skillsNoFilterMatch") : t("hints.skillsNoBundled")}</div>`;
|
|
805
810
|
|
|
806
811
|
const bundledMatchCount = renderFilteredSkillCards({
|
|
807
812
|
skills: bundledSorted,
|
|
@@ -809,6 +814,7 @@ export function createSocialController({
|
|
|
809
814
|
gridId: "skillsBundledGrid",
|
|
810
815
|
footerId: "skillsBundledFooter",
|
|
811
816
|
limit: SKILLS_SECTION_LIMIT,
|
|
817
|
+
emptyText: t("hints.skillsNoBundled"),
|
|
812
818
|
renderer: (skill) => renderSkillCard(skill, {
|
|
813
819
|
eyebrow: skill.install_mode === "workspace" || skill.install_mode === "legacy" ? skill.install_mode : "bundled",
|
|
814
820
|
statusText: skill.update_available
|
|
@@ -829,6 +835,7 @@ export function createSocialController({
|
|
|
829
835
|
gridId: "skillsInstalledGrid",
|
|
830
836
|
footerId: "skillsInstalledFooter",
|
|
831
837
|
limit: SKILLS_SECTION_LIMIT,
|
|
838
|
+
emptyText: t("hints.skillsNoInstalled"),
|
|
832
839
|
renderer: (skill) => renderSkillCard(skill, {
|
|
833
840
|
eyebrow: skill.install_mode || "installed",
|
|
834
841
|
statusText: skill.update_available
|
|
@@ -846,9 +853,15 @@ export function createSocialController({
|
|
|
846
853
|
gridId: "skillsDialogueGrid",
|
|
847
854
|
footerId: "skillsDialogueFooter",
|
|
848
855
|
limit: SKILLS_DIALOGUE_LIMIT,
|
|
856
|
+
emptyText: t("hints.skillsNoDialogueExamples"),
|
|
849
857
|
renderer: (skill) => renderDialogueCard(skill),
|
|
850
858
|
});
|
|
851
859
|
|
|
860
|
+
document.getElementById("skillsFeaturedCount").textContent = formatSectionCount(filteredFeaturedSkills.length, featuredSkills.length);
|
|
861
|
+
document.getElementById("skillsBundledCount").textContent = formatSectionCount(bundledMatchCount, bundled.length);
|
|
862
|
+
document.getElementById("skillsInstalledCount").textContent = formatSectionCount(installedMatchCount, installed.length);
|
|
863
|
+
document.getElementById("skillsDialogueCount").textContent = formatSectionCount(dialogueMatchCount, featuredSkills.length);
|
|
864
|
+
|
|
852
865
|
renderSkillsFilterMeta({
|
|
853
866
|
bundledCount: bundledMatchCount,
|
|
854
867
|
installedCount: installedMatchCount,
|
|
@@ -879,6 +892,7 @@ export function createSocialController({
|
|
|
879
892
|
refreshSocial,
|
|
880
893
|
renderLogs,
|
|
881
894
|
renderSocialMessages,
|
|
895
|
+
rerenderSkills: () => refreshSkills({ useCached: true }),
|
|
882
896
|
setSkillsFilter,
|
|
883
897
|
setSkillsQuery,
|
|
884
898
|
setLogLevelFilter,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
2026.3.20-beta.
|
|
1
|
+
2026.3.20-beta.20
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "silicaclaw-broadcast",
|
|
3
|
-
"version": "2026.3.20-beta.
|
|
3
|
+
"version": "2026.3.20-beta.20",
|
|
4
4
|
"display_name": "SilicaClaw Broadcast",
|
|
5
5
|
"description": "Official OpenClaw skill for a bounded local SilicaClaw broadcast workflow: read public broadcasts, publish public broadcasts, and optionally forward owner-relevant summaries through OpenClaw's native channel.",
|
|
6
6
|
"entrypoints": {
|