openclaw/src
samzong 37ab4b7fdc
[Feat] Add ClawHub skill search and detail in Control UI (#60134)
* feat(gateway): add skills.search and skills.detail RPC methods

Expose ClawHub search and detail capabilities through the Gateway protocol,
enabling desktop/web clients to browse and inspect skills from the registry.

New RPCs:
- skills.search: search ClawHub skills by query with optional limit
- skills.detail: fetch full detail for a single skill by slug

Both methods delegate to existing agent-layer functions
(searchSkillsFromClawHub, fetchSkillDetailFromClawHub) which wrap
the ClawHub HTTP client. No new external dependencies.

Signed-off-by: samzong <samzong.lu@gmail.com>

* feat(skills): add ClawHub skill search and detail in Control UI

Add skills.search and skills.detail Gateway RPC methods with typed
protocol schemas, AJV validators, and handler implementations. Wire
the new RPCs into the Control UI Skills panel with a debounced search
input, results list, detail dialog, and one-click install from ClawHub.

Gateway:
- SkillsSearchParams/ResultSchema and SkillsDetailParams/ResultSchema
- Handler calls searchClawHubSkills and fetchClawHubSkillDetail directly
- Remove zero-logic fetchSkillDetailFromClawHub wrapper
- 9 handler tests including boundary validation

Control UI:
- searchClawHub, loadClawHubDetail, installFromClawHub controllers
- 300ms debounced search input to avoid 429 rate limits
- Dedicated install busy state (clawhubInstallSlug) with success/error feedback
- Install buttons disabled during install with progress text
- Detail dialog with owner, version, changelog, platform metadata

Part of #43301

Signed-off-by: samzong <samzong.lu@gmail.com>

* fix(skills): guard search and detail responses against stale writes

Signed-off-by: samzong <samzong.lu@gmail.com>

* fix(skills): reset loading flags on query clear and detail close

Signed-off-by: samzong <samzong.lu@gmail.com>

* fix(gateway): register skills.search/detail in read scope and method list

Add skills.search and skills.detail to the operator READ scope group
and the server methods list. Without this, unclassified methods default
to operator.admin, blocking read-only operator sessions.

Also guard the detail loading reset in the finally block by the active
slug to prevent a transient flash when rapidly switching skills.

Signed-off-by: samzong <samzong.lu@gmail.com>

* fix(skills): guard search loading reset by active query

Signed-off-by: samzong <samzong.lu@gmail.com>

* test: cover ClawHub skills UI flow

* fix: clear stale ClawHub search results

---------

Signed-off-by: samzong <samzong.lu@gmail.com>
Co-authored-by: Frank Yang <frank.ekn@gmail.com>
2026-04-03 19:30:44 +08:00
..
acp test: reduce agent test import churn 2026-04-03 04:41:09 +01:00
agents fix(sessions): harden session id resolution 2026-04-03 20:29:20 +09:00
auto-reply refactor: share session model resolution helpers 2026-04-03 19:37:56 +09:00
bindings
bootstrap
canvas-host
channels refactor(plugin-sdk): genericize web channel runtime seams 2026-04-03 11:17:28 +01:00
chat
cli fix(ci): make gateway audit path test platform-safe 2026-04-03 12:22:29 +01:00
commands refactor(gateway): clarify local mode guardrails 2026-04-03 20:02:32 +09:00
compat
config fix: support default subagent allowlists (#59944) (thanks @hclsys) 2026-04-03 19:43:17 +09:00
context-engine
cron refactor(plugin-sdk): remove channel-specific sdk seams 2026-04-03 10:45:10 +01:00
daemon test: stabilize Windows startup fallback daemon tests 2026-04-03 10:43:42 +01:00
docs
flows test: move extension-owned coverage out of core 2026-04-03 10:58:44 +01:00
gateway [Feat] Add ClawHub skill search and detail in Control UI (#60134) 2026-04-03 19:30:44 +08:00
generated
hooks refactor(plugins): separate activation from enablement (#59844) 2026-04-03 03:22:37 +09:00
i18n
image-generation test: dedupe core test teardown paths 2026-04-03 07:14:58 +01:00
infra refactor(plugin-sdk): genericize web channel runtime seams 2026-04-03 11:17:28 +01:00
interactive
link-understanding
logging test: streamline runtime wrapper test reloads 2026-04-03 04:41:38 +01:00
markdown
mcp
media test: reduce import wrapper reload churn 2026-04-03 07:14:58 +01:00
media-understanding feat(media): add request transport overrides (#59848) 2026-04-03 17:35:26 +09:00
node-host test: align strict inline-eval awk denial expectation 2026-04-02 19:09:39 +01:00
pairing fix(pairing): allow private lan mobile ws 2026-04-03 14:51:24 +05:30
plugin-sdk test(plugin-sdk): tighten boundary guardrails 2026-04-03 11:35:37 +01:00
plugins test(plugin-sdk): tighten boundary guardrails 2026-04-03 11:35:37 +01:00
process test: reduce agent test import churn 2026-04-03 04:41:09 +01:00
routing
scripts
secrets feat(providers): add model request transport overrides (#60200) 2026-04-03 19:00:06 +09:00
security feat: add configurable context visibility 2026-04-03 04:34:57 +09:00
sessions fix(sessions): harden session id resolution 2026-04-03 20:29:20 +09:00
shared feat(media): add request transport overrides (#59848) 2026-04-03 17:35:26 +09:00
tasks test: avoid windows task-owner tempdir hangs 2026-04-03 09:26:04 +01:00
terminal
test-helpers
test-utils test: isolate bundled plugin coverage from unit 2026-04-03 10:58:44 +01:00
tts test: isolate bundled plugin coverage from unit 2026-04-03 10:58:44 +01:00
tui refactor: share session model resolution helpers 2026-04-03 19:37:56 +09:00
types
utils Matrix: restore ordered progress delivery with explicit streaming modes (#59266) 2026-04-01 19:35:03 -04:00
web-fetch test: make web fetch runtime env handling hermetic 2026-04-02 15:02:40 +01:00
web-search !refactor(xai): move x_search config behind plugin boundary (#59674) 2026-04-02 22:08:59 +09:00
wizard
channel-web.ts refactor(plugin-sdk): genericize web channel runtime seams 2026-04-03 11:17:28 +01:00
docker-build-cache.test.ts
docker-image-digests.test.ts
docker-setup.e2e.test.ts
dockerfile.test.ts
entry.respawn.test.ts
entry.respawn.ts
entry.test.ts
entry.ts
entry.version-fast-path.test.ts test: streamline runtime wrapper test reloads 2026-04-03 04:41:38 +01:00
extensionAPI.ts
global-state.ts
globals.ts
index.test.ts
index.ts
install-sh-version.test.ts
library.test.ts refactor(plugin-sdk): genericize web channel runtime seams 2026-04-03 11:17:28 +01:00
library.ts refactor(plugin-sdk): genericize web channel runtime seams 2026-04-03 11:17:28 +01:00
logger.test.ts
logger.ts
logging.ts
param-key.ts
plugin-activation-boundary.test.ts refactor(plugin-sdk): remove channel-specific sdk seams 2026-04-03 10:45:10 +01:00
poll-params.test.ts
poll-params.ts
polls.test.ts
polls.ts
runtime.ts
ui-app-settings.agents-files-refresh.test.ts
utils.test.ts
utils.ts
version.test.ts
version.ts