Files
T

355 lines
29 KiB
JavaScript

import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Ei as t,er as n}from"./control-ui-foundation-CeFMP1Ly.js";import{Ci as r,Js as i,Si as a,Ys as o,bi as s,di as c,fi as l,fl as u,fs as d,gi as f,hi as p,l as m,li as ee,mi as te,ml as h,ms as g,pi as ne,ps as _,qs as re,ui as v,vi as y,vr as ie,w as ae,wi as oe,xi as se,yi as ce,yr as le}from"./control-ui-core-pH6nakZ-.js";import{G as b,J as x,W as S,Z as ue,at as de,h as fe,i as pe,m as me,n as he,rt as C}from"./lit-runtime-BEtFSUCp.js";import{Kn as ge,m as _e,p as ve,zn as w}from"./control-ui-core-DGVkFhVB.js";import{Ht as T,Lt as E,Nt as D,Rt as O,qt as k}from"./control-ui-core-Br5DB0Zj.js";import{F as A,I as j,In as M,L as N,Ln as P,z as F}from"./control-ui-boot-wpHCbPL9.js";import{n as I,r as ye}from"./gateway-runtime-DUNO4Mi1.js";import{$i as be,Cn as xe,bn as L,ea as Se,fo as Ce,ga as we,ho as Te,mn as Ee,on as De,un as R,vn as Oe,xn as z,ya as ke,yn as Ae}from"./control-ui-boot-Cdpgu1Gm.js";import{n as je,t as Me}from"./hub-tabs-mHLCJmKB.js";import{n as Ne,t as Pe}from"./settings-workspace-Bo4nqRhI.js";import{n as Fe,t as Ie}from"./gateway-page-controller-bzyUg03c.js";import{t as Le}from"./agent-select-registration-Bgp9CYzQ.js";import{a as Re,i as B,n as ze,o as Be,r as Ve,s as He,t as Ue}from"./skills-shared-BNHPZbfC.js";import{i as We,n as Ge,r as Ke,t as qe}from"./plugins-hub-header-2-MSECVZ.js";function V(e){return e.installRef??e.slug}async function Je(e,t,n){return t.trim()?(await e.request(`skills.search`,{query:t,limit:20},{signal:n}))?.results??[]:[]}function H(e){return e?Te(e,window.location.href):null}function Ye(e,t){switch(t){case`all`:return!0;case`ready`:return!e.disabled&&B(e);case`needs-setup`:return!e.disabled&&!B(e);case`disabled`:return e.disabled}throw Error(`Unsupported skills status filter`)}function Xe(e){return e.disabled?`muted`:B(e)?`ok`:`warn`}function Ze(e){return e.disabled?L({kind:`muted`,label:k(`skillsPage.tabs.disabled`)}):B(e)?L({kind:`ok`,label:k(`skillsPage.tabs.ready`)}):L({kind:`warn`,label:k(`skillsPage.tabs.needsSetup`)})}function U(e,t){let n=e.clawhub;return!n||n.status!==`linked`||!n.valid?null:t[ee({registry:n.registry,slug:n.slug,ownerHandle:n.ownerHandle,version:n.installedVersion})]??null}function W(e,t){if(!e)return t?{label:k(`skillsPage.refreshing`),kind:`muted`,chipClass:`chip`}:{label:k(`skillsPage.verdict.unavailable`),kind:`warn`,chipClass:`chip-warn`};let n=e.securityStatus?.trim()||null;return e.ok&&e.decision===`pass`?{label:n===`clean`||!n?k(`skillsPage.verdict.clean`):n,kind:`ok`,chipClass:`chip-ok`}:n===`pending`||n===`not-run`?{label:k(`skillsPage.verdict.pending`),kind:`muted`,chipClass:`chip`}:{label:k(n===`malicious`?`skillsPage.verdict.blocked`:n===`suspicious`?`skillsPage.verdict.review`:`skillsPage.verdict.unavailable`),kind:`warn`,chipClass:`chip-warn`}}function G(e){return e.loading||e.operation!==null}function K(e){return G(e)||!e.canUpdate}function q(e){return G(e)||!e.canInstall}function Qe(e,t){return e.operation?.kind===`skill`&&e.operation.skillKey===t}function J(e,t){return e.operation?.kind===`clawhub`&&e.operation.ref===t}function $e(e,t){if(t.installOnly!==!0)return!1;let n=V(t);return(e.report?.skills??[]).some(e=>e.clawhub?.valid===!0&&e.clawhub.requestedReference===n)}function et(e){let n=e.report?.skills??[],r={all:n.length,ready:0,"needs-setup":0,disabled:0};for(let e of n)e.disabled?r.disabled++:B(e)?r.ready++:r[`needs-setup`]++;let i=e.statusFilter===`all`?n:n.filter(t=>Ye(t,e.statusFilter)),a=t(e.filter),o=a?i.filter(e=>t([e.name,e.description,e.source].join(` `)).includes(a)):i,s=Be(o),c=e.detailKey?n.find(t=>t.skillKey===e.detailKey)??null:null;return x`
${Ee(x`
${Y(e,r,o.length)}
${e.error?x`<div class="callout danger" role="alert">${e.error}</div>`:b}
${nt(e)}
${o.length===0?R(!e.connected&&!e.report?k(`skillsPage.disconnected`):k(`skillsPage.empty`)):s.map(t=>tt(t,e))}
`,{wide:!0})}
${c?ot(c,e):b}
${e.clawhubDetailRef?it(e):b}
`}function tt(e,t){return x`
<details class="settings-section skills-group" open>
<summary class="settings-section__header skills-group__summary">
<h2 class="settings-section__heading">
${e.label} <span class="settings-count">${e.skills.length}</span>
</h2>
<span class="skills-group__chevron" aria-hidden="true">${E.chevronDown}</span>
</summary>
<div class="settings-group">
${fe(e.skills,e=>e.skillKey,e=>at(e,t))}
</div>
</details>
`}function Y(e,t,n){let r=i(e.agentsList?.agents??[]),a=r.some(t=>t.id===e.selectedAgentId)?e.selectedAgentId??``:r.some(t=>t.id===e.agentsList?.defaultId)?e.agentsList?.defaultId??``:r[0]?.id??``;return x`
<div class="plugins-toolbar plugins-toolbar--fields">
${Ae({value:e.statusFilter,ariaLabel:k(`skillsPage.title`),options:X.map(e=>({value:e.id,label:x`${k(e.labelKey)}
<span class="settings-count">${t[e.id]}</span>`})),onChange:t=>e.onStatusFilterChange(t)})}
${r.length>1?x`
<div class="plugins-field skills-toolbar__agent">
<span>${k(`usage.filters.agent`)}</span>
<openclaw-agent-select
class="agent-select--settings"
name="skills-agent"
.options=${r.map(t=>{let n=o(t);return{value:t.id,label:t.id===e.agentsList?.defaultId?k(`skillsPage.defaultAgent`,{name:n}):n,agent:t}})}
.value=${a}
.accessibleLabel=${k(`usage.filters.agent`)}
.disabled=${G(e)||!e.connected}
.onSelect=${e.onAgentChange}
></openclaw-agent-select>
</div>
`:b}
<label class="plugins-field skills-toolbar__search">
<span>${k(`common.search`)}</span>
<input
class="settings-input"
.value=${e.filter}
@input=${t=>e.onFilterChange(t.target.value)}
placeholder=${k(`skillsPage.filterPlaceholder`)}
autocomplete="off"
name="skills-filter"
/>
</label>
<span class="plugins-toolbar__hint">
${k(`skillsPage.shown`,{count:String(n)})}
</span>
<button
type="button"
class="btn"
?disabled=${G(e)||!e.connected}
@click=${e.onRefresh}
>
${e.loading?k(`common.loading`):k(`common.refresh`)}
</button>
</div>
`}function nt(e){return Oe({title:k(`skillsPage.clawHub`),description:k(`skillsPage.clawHubSubtitle`)},x`
<div class="settings-row">
<input
class="settings-input plugins-row-input"
.value=${e.clawhubQuery}
@input=${t=>e.onClawHubQueryChange(t.target.value)}
placeholder=${k(`skillsPage.searchClawHub`)}
autocomplete="off"
name="clawhub-search"
/>
${e.clawhubSearchLoading?x`<span class="plugins-toolbar__hint">${k(`skillsPage.searching`)}</span>`:b}
</div>
${e.clawhubSearchError?x`<div class="callout danger plugins-group-message">${e.clawhubSearchError}</div>`:b}
${e.clawhubInstallMessage?x`<div
class="callout ${e.clawhubInstallMessage.kind===`error`?`danger`:`success`} plugins-group-message"
>
<div
style="max-width: 100%; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"
>
${e.clawhubInstallMessage.text}
</div>
</div>`:b}
${rt(e)}
`)}function rt(e){let t=e.clawhubResults;return t?t.length===0?R(k(`skillsPage.noClawHubResults`)):x`
${t.map(t=>{let n=H(t.icon??void 0),r=V(t),i=t.installOnly?void 0:r,a=$e(e,t),o=t.trustState?` · ${k(`skillsPage.notScannedByClawHub`)}`:``,s=x`
${n?x`<img class="clawhub-skill-icon" src=${n} alt="" loading="lazy" />`:b}
<span class="clawhub-skill-result__copy">
<span class="settings-row__title">${t.displayName}</span>
<span class="settings-row__desc">
${t.summary?`${m(t.summary,100)} · ${r}`:r}${o}
</span>
</span>
`;return x`
<div class="settings-row plugins-item ${i?`plugins-item--clickable`:``}">
${i?x`<button
type="button"
class="settings-row__text plugins-item__detail-button clawhub-skill-result__button"
aria-label=${k(`skillsPage.openDetails`,{name:i})}
@click=${()=>e.onClawHubDetailOpen(i)}
>
${s}
</button>`:x`<div class="settings-row__text clawhub-skill-result__button">${s}</div>`}
<div class="settings-row__control">
${t.version?xe(`v${t.version}`):b}
<button
class="btn btn--sm"
?disabled=${a||q(e)}
@click=${()=>{a||e.onClawHubInstall(r)}}
>
${a?k(`skillsPage.installed`):J(e,r)?k(`skillsPage.installing`):k(`skillsPage.install`)}
</button>
</div>
</div>
`})}
`:b}function it(e){let t=e.clawhubDetail,n=H(t?.skill?.icon??void 0),r=n?null:H(t?.owner?.image??void 0),i=n??r;return x`
<openclaw-modal-dialog
label=${t?.skill?.displayName??e.clawhubDetailRef??k(`skillsPage.notFound`)}
style="--openclaw-modal-width: min(1040px, calc(100vw - 32px));"
@modal-cancel=${e.onClawHubDetailClose}
>
<div
class="md-preview-dialog__panel ${e.clawhubDetailError&&!e.clawhubDetailLoading?`md-preview-dialog__panel--message-only`:``}"
>
<div class="md-preview-dialog__header">
<div class="clawhub-skill-detail__identity">
${i?x`<img
class="clawhub-skill-icon clawhub-skill-icon--detail ${r?`clawhub-skill-icon--profile`:``}"
src=${i}
alt=""
/>`:b}
<div class="md-preview-dialog__title">
${t?.skill?.displayName??e.clawhubDetailRef}
</div>
</div>
<button class="btn btn--sm" @click=${e.onClawHubDetailClose}>
${k(`skillsPage.close`)}
</button>
</div>
<div class="md-preview-dialog__body" style="display: grid; gap: 16px;">
${e.clawhubDetailLoading?x`<div class="muted">${k(`common.loading`)}</div>`:e.clawhubDetailError?x`<div class="callout danger">${e.clawhubDetailError}</div>`:t?.skill?x`
<div style="font-size: 14px; line-height: 1.5;">
${t.skill.summary??``}
</div>
${t.owner?.displayName?x`<div class="muted" style="font-size: 13px;">
${k(`skillsPage.by`)}
${t.owner.displayName}${t.owner.handle?x` (@${t.owner.handle})`:b}
</div>`:b}
${t.latestVersion?x`<div class="muted" style="font-size: 13px;">
${k(`skillsPage.latest`,{version:t.latestVersion.version})}
</div>`:b}
${t.latestVersion?.changelog?x`<div
style="font-size: 13px; border-top: 1px solid var(--border); padding-top: 12px; white-space: pre-wrap;"
>
${t.latestVersion.changelog}
</div>`:b}
${t.metadata?.os?x`<div class="muted" style="font-size: 12px;">
${k(`skillsPage.platforms`,{platforms:t.metadata.os.join(`, `)})}
</div>`:b}
<button
class="btn primary"
?disabled=${q(e)}
@click=${()=>{e.clawhubDetailRef&&e.onClawHubInstall(e.clawhubDetailRef)}}
>
${J(e,e.clawhubDetailRef??``)?k(`skillsPage.installing`):k(`skillsPage.installNamed`,{name:t.skill.displayName})}
</button>
`:x`<div class="muted">${k(`skillsPage.notFound`)}</div>`}
</div>
</div>
</openclaw-modal-dialog>
`}function at(e,t){let n=K(t),r=U(e,t.clawhubVerdicts);return x`
<div class="settings-row plugins-item plugins-item--clickable">
<button
type="button"
class="settings-row__text plugins-item__detail-button"
aria-label=${k(`skillsPage.openDetails`,{name:e.name})}
@click=${()=>t.onDetailOpen(e.skillKey)}
>
<span class="settings-row__title">
${e.emoji?x`<span>${e.emoji}</span> `:b}${e.name}
</span>
<span class="settings-row__desc">${m(e.description,140)}</span>
</button>
<div class="settings-row__control">
${Ze(e)}
${e.clawhub?.status===`linked`?L(W(r,t.clawhubVerdictsLoading)):e.clawhub?.status===`invalid`?L({kind:`warn`,label:k(`skillsPage.invalidLink`)}):b}
${z({checked:!e.disabled,disabled:n,ariaLabel:k(`skillsPage.enabledNamed`,{name:e.name}),onChange:()=>t.onToggle(e.skillKey,e.disabled)})}
</div>
</div>
`}function ot(e,t){let n=K(t),r=q(t),i=Qe(t,e.skillKey),a=t.edits[e.skillKey]??``,o=t.messages[e.skillKey]??null,s=new Set([...e.missing.bins,...e.missing.anyBins]),c=e.install.find(e=>e.bins.some(e=>s.has(e))),l=!!(e.bundled&&e.source!==`openclaw-bundled`),u=Ue(e),d=ze(e),f=U(e,t.clawhubVerdicts),p=t.detailTab===`card`&&e.skillCard?.present?`card`:`overview`;return x`
<openclaw-modal-dialog
label=${e.name}
style="--openclaw-modal-width: min(1040px, calc(100vw - 32px));"
@modal-cancel=${t.onDetailClose}
>
<div class="md-preview-dialog__panel">
<div class="md-preview-dialog__header">
<div
class="md-preview-dialog__title"
style="display: flex; align-items: center; gap: 8px;"
>
<span class="statusDot ${Xe(e)}"></span>
${e.emoji?x`<span style="font-size: 18px;">${e.emoji}</span>`:b}
<span>${e.name}</span>
</div>
<button class="btn btn--sm" @click=${t.onDetailClose}>
${k(`skillsPage.close`)}
</button>
</div>
<div class="md-preview-dialog__body" style="display: grid; gap: 16px;">
<div>
<div style="font-size: 14px; line-height: 1.5; color: var(--text);">
${e.description}
</div>
${Re({skill:e,showBundledBadge:l})}
</div>
${e.clawhub||e.skillCard?.present?x`
${je({id:`skill-detail`,active:p,tabs:[{value:`overview`,label:k(`skillsPage.overview`)},...e.skillCard?.present?[{value:`card`,label:k(`skillsPage.skillCard`)}]:[]],ariaLabel:e.name,panelId:`skill-detail-panel`,variant:`sub`,onSelect:t.onDetailTabChange})}
`:b}
<div
id="skill-detail-panel"
role=${e.clawhub||e.skillCard?.present?`tabpanel`:b}
aria-labelledby=${e.clawhub||e.skillCard?.present?`skill-detail-tab-${p}`:b}
>
${p===`overview`?st(e,t,f):ct(e,t)}
</div>
${u.length>0?x`
<div
class="callout"
style="border-color: var(--warn-subtle); background: var(--warn-subtle); color: var(--warn);"
>
<div style="font-weight: 600; margin-bottom: 4px;">
${k(`skillsPage.missingRequirements`)}
</div>
<div>${u.join(`, `)}</div>
</div>
`:b}
${d.length>0?x`
<div class="muted" style="font-size: 13px;">
${k(`skillsPage.reason`,{reasons:d.join(`, `)})}
</div>
`:b}
<div style="display: flex; align-items: center; gap: 12px;">
${z({checked:!e.disabled,disabled:n,ariaLabel:e.name,onChange:()=>t.onToggle(e.skillKey,e.disabled)})}
<span style="font-size: 13px; font-weight: 500;">
${e.disabled?k(`skillsPage.disabled`):k(`skillsPage.enabled`)}
</span>
${c?x`<button
class="btn"
?disabled=${r}
@click=${()=>c&&t.onInstall(e.skillKey,e.name,c.id)}
>
${i?k(`skillsPage.installing`):c?.label}
</button>`:b}
</div>
${o?x`<div class="callout ${o.kind===`error`?`danger`:`success`}">
${_(o.message)}
</div>`:b}
${e.primaryEnv?x`
<div style="display: grid; gap: 8px;">
<div class="field">
<span
>${k(`skillsPage.apiKey`)}
<span class="muted" style="font-weight: normal; font-size: 0.88em;"
>(${e.primaryEnv})</span
></span
>
<input
type="password"
required
?disabled=${n}
.value=${a}
@input=${n=>t.onEdit(e.skillKey,n.target.value)}
/>
</div>
${(()=>{let t=H(e.homepage);return t?x`<div class="muted" style="font-size: 13px;">
${k(`skillsPage.getKey`)}
<a href="${t}" target="_blank" rel="noopener noreferrer"
>${e.homepage}</a
>
</div>`:b})()}
<button
class="btn primary"
?disabled=${n||!a.trim()}
@click=${()=>t.onSaveKey(e.skillKey)}
>
${k(`skillsPage.saveKey`)}
</button>
</div>
`:b}
<div
style="border-top: 1px solid var(--border); padding-top: 12px; display: grid; gap: 6px; font-size: 12px; color: var(--muted);"
>
<div>
<span style="font-weight: 600;">${k(`skillsPage.source`)}</span> ${e.source}
</div>
<div style="font-family: var(--mono); word-break: break-all;">${e.filePath}</div>
${(()=>{let t=H(e.homepage);return t?x`<div>
<a href="${t}" target="_blank" rel="noopener noreferrer"
>${e.homepage}</a
>
</div>`:b})()}
</div>
</div>
</div>
</openclaw-modal-dialog>
`}function st(e,t,n){let r=e.clawhub;if(!r)return b;if(r.status===`invalid`)return x`<div class="callout danger">
<div style="font-weight: 600; margin-bottom: 4px;">${k(`skillsPage.invalidLink`)}</div>
<div>${_(r.reason)}</div>
</div>`;let i=H(n?.securityAuditUrl??void 0),a=n?.reasons?.length?_(n.reasons.join(`, `)):null,o=W(n,t.clawhubVerdictsLoading),s=`${r.ownerHandle?`@${r.ownerHandle}/`:``}${r.slug}@${r.installedVersion}`;return x`
<div
class="callout"
style="display: grid; gap: 8px; border-color: var(--border); background: var(--panel-strong);"
>
<div style="display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
<span class="chip ${o.chipClass}">${o.label}</span>
<span class="muted" style="font-size: 12px;">${s}</span>
${t.clawhubVerdictsLoading&&n?x`<span class="muted">${k(`skillsPage.refreshing`)}</span>`:b}
</div>
${t.clawhubVerdictsError?x`<div class="muted" style="font-size: 13px;">${t.clawhubVerdictsError}</div>`:a?x`<div class="muted" style="font-size: 13px;">${a}</div>`:b}
${i?x`<div style="font-size: 13px;">
<a href="${i}" target="_blank" rel="noopener noreferrer"
>${k(`skillsPage.fullSecurityReport`)}</a
>
</div>`:b}
</div>
`}function ct(e,t){if(!e.skillCard?.present)return b;let n=t.skillCardContents[e.skillKey];if(n===void 0){let n=t.skillCardErrors[e.skillKey];return n?x`<div class="callout danger">${n}</div>`:x`<div class="muted" style="font-size: 13px;">
${t.skillCardLoadingKey===e.skillKey?k(`skillsPage.loadingSkillCard`):k(`skillsPage.skillCardNotLoaded`)}
</div>`}return x`
<article
class="sidebar-markdown"
style="max-width: 100%; overflow-wrap: anywhere;"
@click=${we}
>
${pe(Se(n))}
</article>
`}var X;function Z(){return(Z=e((()=>{S(),me(),he(),Le(),Me(),O(),D(),ke(),be(),De(),T(),re(),g(),ae(),Ce(),He(),Ve(),c(),X=[{id:`all`,labelKey:`skillsPage.tabs.all`},{id:`ready`,labelKey:`skillsPage.tabs.ready`},{id:`needs-setup`,labelKey:`skillsPage.tabs.needsSetup`},{id:`disabled`,labelKey:`skillsPage.tabs.disabled`}]})))()}var Q;function $(){return($=e((()=>{P(),A(),S(),ue(),w(),_e(),Pe(),g(),ye(),c(),Fe(),h(),le(),qe(),We(),Z(),Q=class extends u{constructor(...e){super(...e),this.skillsAgentId=null,this.skillsAgentRevision=0,this.skillsLoading=!1,this.skillsReport=null,this.skillsError=null,this.skillOperation=null,this.skillsFilter=``,this.skillsStatusFilter=`all`,this.skillEdits={},this.skillMessages={},this.skillsDetailKey=null,this.skillsDetailTab=`overview`,this.clawhubSearchQuery=``,this.clawhubDetail=null,this.clawhubDetailRef=null,this.clawhubDetailLoading=!1,this.clawhubDetailError=null,this.clawhubInstallMessage=null,this.clawhubVerdicts={},this.clawhubVerdictsLoading=!1,this.clawhubVerdictsError=null,this.skillCardContents={},this.skillCardContentKeys={},this.skillCardLoadingKey=null,this.skillCardErrors={},this.clawhubSearchTimer=null,this.routeDataInitialized=!1,this.routeDataEnabled=!0,this.debouncedClawHubSearchQuery=``,this.gateway=new Ie(this,{getGateway:()=>this.context?.gateway,invalidateRequests:()=>this.resetLoadedSkillState(),ensureInitialData:()=>this.ensureInitialData()}),this.clawhubSearchTask=new j(this,{autoRun:!1,args:()=>[this.gateway.connected?this.gateway.client:null,this.debouncedClawHubSearchQuery],task:([e,t],{signal:n})=>e&&t?Je(e,t,n):N}),this.subscriptions=new ie(this).effect(()=>this.context?.agents,e=>{let t=e.subscribe(()=>{this.reconcileAgentState(),this.ensureInitialData(),this.requestUpdate()});return this.reconcileAgentState(),this.ensureInitialData(),t})}get runtimeConfig(){return this.context.runtimeConfig}get client(){return this.gateway.client}get connected(){return this.gateway.connected}willUpdate(e){e.has(`routeData`)&&(this.applyRouteData(),this.ensureInitialData())}disconnectedCallback(){this.subscriptions.clear(),this.clawhubSearchTimer&&=(clearTimeout(this.clawhubSearchTimer),null),super.disconnectedCallback()}reconcileAgentState(){let e=this.context.agents.state;if(e.agentsList){let t=this.skillsAgentId;ce(this,e.agentsList),t!==this.skillsAgentId&&(this.skillsDetailKey=null,this.skillsDetailTab=`overview`)}}resetLoadedSkillState(){this.clawhubSearchTask.run([null,``]),this.clawhubSearchTimer&&=(clearTimeout(this.clawhubSearchTimer),null),this.routeDataInitialized&&(this.routeDataEnabled=!1),this.skillsAgentId=null,this.skillsAgentRevision++,this.skillsLoading=!1,this.skillsReport=null,this.skillsError=null,this.skillOperation=null,this.skillEdits={},this.skillMessages={},this.skillsDetailKey=null,this.skillsDetailTab=`overview`,this.debouncedClawHubSearchQuery=``,this.clawhubDetail=null,this.clawhubDetailRef=null,this.clawhubDetailLoading=!1,this.clawhubDetailError=null,this.clawhubInstallMessage=null,this.clawhubVerdicts={},this.clawhubVerdictsLoading=!1,this.clawhubVerdictsError=null,this.skillCardContents={},this.skillCardContentKeys={},this.skillCardLoadingKey=null,this.skillCardErrors={}}applyRouteData(){let e=this.routeData;if(e){if(this.routeDataInitialized=!0,this.routeDataEnabled=!0,!this.gateway.isRouteDataCurrent(e)||e.agents!==this.context.agents){this.routeDataEnabled=!1;return}this.skillsAgentId&&e.selectedAgentId&&e.selectedAgentId!==this.skillsAgentId||(this.skillsAgentId=e.selectedAgentId??this.skillsAgentId,this.skillsLoading=!1,this.skillsReport=e.report,this.skillsError=e.error,e.report&&p(this,e.report))}}ensureInitialData(){if(this.routeDataEnabled||!this.routeDataInitialized||!this.gateway.connected||!this.gateway.client)return;let e=this.context.agents.state;if(!e.agentsList){e.agentsLoading||this.loadAgents();return}this.reconcileAgentState(),!this.skillsReport&&!this.skillsLoading&&y(this),this.clawhubSearchQuery.trim()&&this.clawhubSearchTask.status!==F.PENDING&&this.clawhubSearchResults===null&&this.clawhubSearchError===null&&this.runClawHubSearch(this.clawhubSearchQuery)}async loadAgents(){if(!this.gateway.client||!this.gateway.connected)return;let e=this.context.agents;e.state.agentsList||await e.ensureList(),this.context.agents===e&&(this.reconcileAgentState(),this.ensureInitialData())}async refreshPage(){await s(this,()=>this.loadAgents())}changeAgent(e){if(this.skillOperation||this.skillsLoading)return;let t=this.skillsAgentId;a(this,e),t!==this.skillsAgentId&&(this.skillsDetailKey=null,this.skillsDetailTab=`overview`),y(this,{clearMessages:!0})}changeClawHubQuery(e){this.clawhubSearchQuery=e,this.clawhubInstallMessage=null,this.debouncedClawHubSearchQuery=``,this.clawhubSearchTask.run([null,``]),this.clawhubSearchTimer&&clearTimeout(this.clawhubSearchTimer),this.clawhubSearchTimer=setTimeout(()=>this.runClawHubSearch(e),300)}runClawHubSearch(e){let t=e.trim();if(this.debouncedClawHubSearchQuery=t,!t||!this.gateway.connected||!this.gateway.client){this.clawhubSearchTask.run([null,``]);return}this.clawhubSearchTask.run([this.gateway.client,t])}get clawhubSearchResults(){return this.clawhubSearchTask.status===F.COMPLETE&&this.debouncedClawHubSearchQuery===this.clawhubSearchQuery.trim()?this.clawhubSearchTask.value??null:null}get clawhubSearchLoading(){return this.debouncedClawHubSearchQuery.length>0&&this.clawhubSearchTask.status===F.PENDING}get clawhubSearchError(){if(this.clawhubSearchTask.status!==F.ERROR||this.debouncedClawHubSearchQuery!==this.clawhubSearchQuery.trim())return null;let e=this.clawhubSearchTask.error;return d(e)}changeDetailTab(e){this.skillsDetailTab=e,e===`card`&&this.skillsDetailKey&&f(this,this.skillsDetailKey)}canUpdateSkills(){return I(this.context?.gateway?.snapshot,`skills.update`,`operator.admin`)}canInstallSkills(){return I(this.context?.gateway?.snapshot,`skills.install`,`operator.admin`)}selectHubTab(e){if(e!==`skills`){if(e===`workshop`){this.context.navigate(`skill-workshop`);return}this.context.navigate(`plugins`,{pathname:ge(e,this.context.basePath)})}}render(){let e=this.context.agents.state,t=this.skillsError??e.agentsError;return x`
${Ge({active:`skills`,onSelect:e=>this.selectHubTab(e)})}
${Ne(x`
<wa-tab-panel
id=${Ke}
name="skills"
active
aria-labelledby="plugins-tab-skills"
>
${et({canUpdate:this.canUpdateSkills(),canInstall:this.canInstallSkills(),connected:this.gateway.connected,loading:this.skillsLoading||e.agentsLoading,report:this.skillsReport,agentsList:e.agentsList,selectedAgentId:this.skillsAgentId??e.agentsList?.defaultId??null,error:t,filter:this.skillsFilter,statusFilter:this.skillsStatusFilter,edits:this.skillEdits,messages:this.skillMessages,operation:this.skillOperation,detailKey:this.skillsDetailKey,detailTab:this.skillsDetailTab,clawhubVerdicts:this.clawhubVerdicts,clawhubVerdictsLoading:this.clawhubVerdictsLoading,clawhubVerdictsError:this.clawhubVerdictsError,skillCardContents:this.skillCardContents,skillCardLoadingKey:this.skillCardLoadingKey,skillCardErrors:this.skillCardErrors,clawhubQuery:this.clawhubSearchQuery,clawhubResults:this.clawhubSearchResults,clawhubSearchLoading:this.clawhubSearchLoading,clawhubSearchError:this.clawhubSearchError,clawhubDetail:this.clawhubDetail,clawhubDetailRef:this.clawhubDetailRef,clawhubDetailLoading:this.clawhubDetailLoading,clawhubDetailError:this.clawhubDetailError,clawhubInstallMessage:this.clawhubInstallMessage,onAgentChange:e=>this.changeAgent(e),onFilterChange:e=>this.skillsFilter=e,onStatusFilterChange:e=>this.skillsStatusFilter=e,onRefresh:()=>void this.refreshPage(),onToggle:(e,t)=>{this.canUpdateSkills()&&oe(this,e,t,()=>this.canUpdateSkills())},onEdit:(e,t)=>{this.canUpdateSkills()&&r(this,e,t)},onSaveKey:e=>{this.canUpdateSkills()&&se(this,e,()=>this.canUpdateSkills())},onInstall:(e,t,n)=>{this.canInstallSkills()&&ne(this,e,t,n)},onDetailOpen:e=>{this.skillsDetailKey=e,this.skillsDetailTab=`overview`},onDetailClose:()=>this.skillsDetailKey=null,onDetailTabChange:e=>this.changeDetailTab(e),onClawHubQueryChange:e=>this.changeClawHubQuery(e),onClawHubDetailOpen:e=>void te(this,e),onClawHubDetailClose:()=>v(this),onClawHubInstall:(e,t)=>{this.canInstallSkills()&&l(this,e,t)}})}
</wa-tab-panel>
`)}
`}},n([M({context:ve,subscribe:!0})],Q.prototype,`context`,void 0),n([de({attribute:!1})],Q.prototype,`routeData`,void 0),n([C()],Q.prototype,`skillsAgentId`,void 0),n([C()],Q.prototype,`skillsAgentRevision`,void 0),n([C()],Q.prototype,`skillsLoading`,void 0),n([C()],Q.prototype,`skillsReport`,void 0),n([C()],Q.prototype,`skillsError`,void 0),n([C()],Q.prototype,`skillOperation`,void 0),n([C()],Q.prototype,`skillsFilter`,void 0),n([C()],Q.prototype,`skillsStatusFilter`,void 0),n([C()],Q.prototype,`skillEdits`,void 0),n([C()],Q.prototype,`skillMessages`,void 0),n([C()],Q.prototype,`skillsDetailKey`,void 0),n([C()],Q.prototype,`skillsDetailTab`,void 0),n([C()],Q.prototype,`clawhubSearchQuery`,void 0),n([C()],Q.prototype,`clawhubDetail`,void 0),n([C()],Q.prototype,`clawhubDetailRef`,void 0),n([C()],Q.prototype,`clawhubDetailLoading`,void 0),n([C()],Q.prototype,`clawhubDetailError`,void 0),n([C()],Q.prototype,`clawhubInstallMessage`,void 0),n([C()],Q.prototype,`clawhubVerdicts`,void 0),n([C()],Q.prototype,`clawhubVerdictsLoading`,void 0),n([C()],Q.prototype,`clawhubVerdictsError`,void 0),n([C()],Q.prototype,`skillCardContents`,void 0),n([C()],Q.prototype,`skillCardContentKeys`,void 0),n([C()],Q.prototype,`skillCardLoadingKey`,void 0),n([C()],Q.prototype,`skillCardErrors`,void 0),customElements.get(`openclaw-skills-page`)||customElements.define(`openclaw-skills-page`,Q)})))()}$();
//# sourceMappingURL=skills-page-DvrFExzp.js.map