openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
656 lines • 53.5 kB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Qi as t,R as n,Vn as r,wr as i,z as a}from"./control-ui-foundation-Cydpkyqa.js";import{Ar as o,Bn as s,Cr as c,Do as l,Dr as u,Eo as d,Er as f,Oo as p,Or as m,Sc as ee,Sr as te,Tr as h,_r as ne,bc as re,br as ie,cs as ae,gr as oe,jr as se,k as ce,kr as le,os as ue,p as g,ss as de,vr as fe,xr as pe,yr as me,zn as he}from"./control-ui-core-Rwzhj6nO.js";import{$ as ge,K as _,X as v,at as y,c as _e,h as b,m as x,q as S,r as ve,st as ye,t as be,u as C}from"./lit-runtime-CV_MH99K.js";import{Yn as xe,_ as Se,cn as Ce,g as we,sn as Te,tr as Ee}from"./control-ui-core-YphAl4aM.js";import{Gt as De,Rt as w,Wt as Oe,Yt as T,en as E}from"./control-ui-core-vvcQQV2m.js";import{B as ke,U as D,V as Ae,z as je}from"./control-ui-boot-shared-BYq7Cchl.js";import{n as O,r as k}from"./gateway-runtime-Bqqcp9-I.js";import{An as Me,Dn as Ne,dn as Pe,dt as Fe,un as Ie,ut as Le}from"./control-ui-boot-shared-DfZ39Yj9.js";import{$ as A,K as Re,L as j,Q as M,V as N,X as P,Z as F,tt as ze}from"./control-ui-boot-chat-_QSl8fbH.js";import{Is as Be,Ls as Ve,Sa as He,ba as Ue}from"./control-ui-boot-shared-CXVvK2AW.js";import{D as We}from"./control-ui-boot-new-Bj2SAUyl.js";import"./control-ui-boot-chat-BhPddYSI.js";import{a as I,i as L,l as R,n as Ge,o as Ke,s as qe,t as Je}from"./control-ui-boot-chat-D85X0PFX.js";import{n as Ye,t as Xe}from"./hub-tabs-DLM-pY5z.js";import{n as Ze,t as Qe}from"./settings-workspace-Bseic8Tf.js";import{a as $e,i as z,n as et,o as tt,r as nt,s as rt,t as it}from"./skills-shared-DpaM2QiY.js";import{i as at,n as ot,r as st,t as ct}from"./plugins-hub-header-TMK2CKRh.js";function B(e){return e.installRef??e.slug}async function lt(e,t,n){return t.trim()?(await e.request(`skills.search`,{query:t,limit:20},{signal:n}))?.results??[]:[]}var V;function H(){return(H=e((()=>{Ce(),T(),p(),k(),L(),V=class{constructor(e,t,n,r){this.host=e,this.gateway=t,this.selectedAgent=n,this.refreshWorkspace=r,this.list=null,this.view=null,this.loading=!1,this.busy=!1,this.error=null,this.notice=null,this.draft=null,this.importVisible=!1,this.importSlug=``,this.importSource=null,this.importSelection=[],this.newFilePath=``,this.query=``,this.readSequence=0}changed(){this.host.requestUpdate()}clearFeedback(){this.error=null,this.notice=null}get importOpen(){return this.importVisible}set importOpen(e){this.clearFeedback(),this.importVisible=e,e||(this.importSlug=``,this.importSource=null,this.importSelection=[])}reset(){this.readSequence++,this.list=null,this.view=null,this.loading=!1,this.busy=!1,this.draft=null,this.importOpen=!1,this.newFilePath=``,this.query=``}get showWorkspace(){return this.view===null||this.view===`workspace`}get canWrite(){return O(this.gateway.snapshot,`skills.library.save`,`operator.write`,{requireAdvertisement:!1})}get canTransfer(){return O(this.gateway.snapshot,`skills.library.mutate`,`operator.admin`,{requireAdvertisement:!1})}get createTarget(){return this.showWorkspace&&this.list?.canManageWorkspace?`workspace`:this.list?.profileId?`personal`:`unavailable`}get canCreate(){return this.loading?!1:this.createTarget===`workspace`?O(this.gateway.snapshot,`skills.proposals.create`,`operator.admin`,{requireAdvertisement:!1}):this.createTarget===`personal`&&this.canWrite}get canEdit(){return this.canWrite&&(this.draft?.entry?.canEdit??!0)}async load(){let e=this.gateway.capture();if(!(!e||this.loading)){this.loading=!0,this.error=null,this.changed();try{let t=await e.client.request(`skills.library.list`,{scope:`all`});if(!this.gateway.isCurrent(e))return;this.list=t,this.view??=t.defaultTarget===`personal`?`mine`:`workspace`}catch(t){this.gateway.isCurrent(e)&&(this.error=d(t))}finally{this.gateway.isCurrent(e)&&(this.loading=!1,this.changed())}}}create(){let e=this.gateway.capture();!e||!this.canCreate||this.createTarget===`unavailable`||(this.draft={target:this.createTarget,connection:e,agentId:this.selectedAgent(),entry:null,slug:``,description:``,content:``,files:[],revisions:[],selectedFile:`SKILL.md`,rollbackRevision:``,dirty:!1,proposal:null},this.clearFeedback(),this.newFilePath=``,this.changed())}close(){this.busy||this.draft?.dirty&&!window.confirm(E(`skillLibrary.discard`))||(this.readSequence++,this.draft=null,this.importOpen=!1,this.newFilePath=``,this.changed())}async open(e){if(this.draft?.dirty&&!window.confirm(E(`skillLibrary.discard`)))return;let t=this.gateway.capture();if(!t||this.busy)return;let n=++this.readSequence;await this.perform(async()=>{let r=await t.client.request(`skills.library.read`,{skillId:e});!this.gateway.isCurrent(t)||n!==this.readSequence||(this.draft={target:`personal`,connection:t,agentId:null,entry:r.entry,slug:r.entry.slug,description:r.entry.description,content:r.content,files:r.files,revisions:r.revisions,selectedFile:`SKILL.md`,rollbackRevision:``,dirty:!1,proposal:null})})}async perform(e){if(this.busy||this.loading)return;let t=this.gateway.capture();if(!t){this.error=E(`skillLibrary.connectionChanged`),this.changed();return}this.busy=!0,this.clearFeedback(),this.changed();try{await e()}catch(e){if(this.gateway.isCurrent(t)){let t=e instanceof Te?r(e.details)?.code:void 0;this.error=t===`SKILL_LIBRARY_CONFLICT`?E(`skillLibrary.conflict`):t===`SKILL_LIBRARY_IDENTITY_REQUIRED`?E(`skillLibrary.signIn`):d(e)}}finally{this.gateway.isCurrent(t)&&(this.busy=!1,this.changed())}}async receipt(e){this.notice=E(`skillLibrary.receipt.${e.state}`,{slug:e.entry.slug,target:e.target,owner:e.entry.ownerLabel})+` `+e.nextAction,await this.load()}async save(){let e=this.draft;!e||!this.canEdit||await this.perform(async()=>{if(!this.gateway.isCurrent(e.connection))throw Error(E(`skillLibrary.connectionChanged`));let t=e.connection.client;if(e.target===`workspace`){if(!e.agentId)throw Error(E(`skillLibrary.selectAgent`));let n=e.files.map(e=>{let t=I(e);if(t===null||e.executable)throw Error(E(`skillLibrary.workspaceTextOnly`));return{path:e.path,content:t}}),r=await t.request(`skills.proposals.create`,{agentId:e.agentId,name:e.slug,description:e.description,content:e.content,supportFiles:n});if(!this.gateway.isCurrent(e.connection))return;e.proposal=r,e.dirty=!1,this.notice=E(`skillLibrary.pending`,{id:r.record.id,agent:e.agentId});return}let n=await t.request(`skills.library.save`,{...e.entry?{skillId:e.entry.skillId}:{},expectedRevision:e.entry?.revision??null,slug:e.slug,content:e.content,files:e.files});this.gateway.isCurrent(e.connection)&&(e.entry=n.entry,e.dirty=!1,e.revisions=[{revision:n.entry.revision,createdAt:n.entry.updatedAt},...e.revisions.filter(e=>e.revision!==n.entry.revision)],await this.receipt(n))})}async applyWorkspace(){let e=this.draft,t=e?.proposal,n=e?.agentId;!e||!t||!n||await this.perform(async()=>{if(!this.gateway.isCurrent(e.connection))throw Error(E(`skillLibrary.connectionChanged`));let r=await e.connection.client.request(`skills.proposals.apply`,{agentId:n,proposalId:t.record.id,expectedRevisionHash:t.revisionHash});this.gateway.isCurrent(e.connection)&&(this.draft=null,this.notice=E(`skillLibrary.workspaceSaved`,{agent:n,state:r.record.status}),await this.refreshWorkspace())})}async mutate(e){let t=this.draft,n=t?.entry;!t||!n||!this.canEdit||t.dirty||(e===`remove`||e===`transfer`)&&!window.confirm(E(`skillLibrary.confirm.${e}`,{slug:t.slug}))||await this.perform(async()=>{if(!this.gateway.isCurrent(t.connection))throw Error(E(`skillLibrary.connectionChanged`));let r=await t.connection.client.request(`skills.library.mutate`,{skillId:n.skillId,expectedRevision:n.revision,action:e,...e===`rollback`?{revision:t.rollbackRevision}:{}});if(this.gateway.isCurrent(t.connection)&&(e===`remove`&&(this.draft=null),await this.receipt(r),this.gateway.isCurrent(t.connection)&&e!==`remove`)){if(e===`rollback`){let e=await t.connection.client.request(`skills.library.read`,{skillId:r.entry.skillId,revision:r.entry.revision});if(!this.gateway.isCurrent(t.connection))return;t.content=e.content,t.files=e.files,t.revisions=e.revisions,t.selectedFile=`SKILL.md`,t.rollbackRevision=``}t.entry=r.entry}})}async importFiles(e){if(!e.length)return;let t=this.gateway.capture();t&&await this.perform(async()=>{let[n]=e;if(n&&e.length===1&&n.name.toLowerCase().endsWith(`.zip`)){if(this.createTarget===`workspace`)throw Error(E(`skillLibrary.workspaceTextOnly`));if(!this.list?.profileId)throw Error(E(`skillLibrary.signIn`));let e=await qe(t.client,n,this.importSlug,()=>this.gateway.isCurrent(t));this.gateway.isCurrent(t)&&(this.importOpen=!1,await this.receipt(e));return}let r=await Ke(e);this.gateway.isCurrent(t)&&(this.create(),this.draft&&(Object.assign(this.draft,r,{slug:this.importSlug,dirty:!0}),this.importOpen=!1))})}async importClawHub(e,t,n){let r=this.gateway.capture();!r||!this.list?.profileId||!this.canWrite||await this.perform(async()=>{let i=await r.client.request(`skills.library.import`,{slug:e,source:{kind:`clawhub`,slug:t,...n?{version:n}:{}}});this.gateway.isCurrent(r)&&(this.importOpen=!1,await this.receipt(i))})}}})))()}function ut(e){let t=e.list,n=[],r=!!t?.entries.length;(t?.multipleProfiles||r||t?.defaultTarget===`personal`)&&(t?.profileId&&n.push({value:`mine`,label:E(`skillLibrary.mine`)}),(t?.multipleProfiles||t?.entries.some(e=>e.shared||e.ownerProfileId===null))&&n.push({value:`team`,label:E(`skillLibrary.team`)}),n.push({value:`all`,label:E(`skillLibrary.all`)},{value:`workspace`,label:E(`skillLibrary.inventory`)}));let i=e.query.toLowerCase().trim(),a=(t?.entries??[]).filter(n=>(e.view===`mine`?n.ownerProfileId===t?.profileId:e.view!==`team`||n.shared||n.ownerProfileId===null)&&(!i||`${n.slug} ${n.name} ${n.description} ${n.ownerLabel}`.toLowerCase().includes(i)));return v`
<div class="plugins-toolbar">
${n.length>0?F({value:e.view??`workspace`,ariaLabel:E(`skillLibrary.library`),options:n,onChange:t=>{e.view=t,e.changed()}}):S}
<button
type="button"
class="btn"
?disabled=${!e.canCreate||e.busy}
@click=${()=>e.create()}
>
${E(`skillLibrary.create`)}
</button>
<button
type="button"
class="btn"
?disabled=${!e.canCreate||e.busy}
@click=${()=>{e.importOpen=!0,e.importSource=null,e.changed()}}
>
${E(`skillLibrary.import`)}
</button>
${e.showWorkspace?S:v`<button
type="button"
class="btn"
?disabled=${e.loading||e.busy}
@click=${()=>void e.load()}
>
${E(`common.refresh`)}
</button>`}
</div>
${t?.defaultTarget===`unavailable`?v`<p class="muted">${E(`skillLibrary.signIn`)}</p>`:S}
${e.error&&!e.draft&&!e.importOpen?v`<div class="callout danger" role="alert">${e.error}</div>`:S}
${e.notice&&!e.draft?v`<div class="callout success" role="status">${e.notice}</div>`:S}
${t&&!e.showWorkspace?v`<p class="muted">
${E(`skillLibrary.defaultLimit`,{count:String(t.defaultSelectionLimit)})}
</p>
${t.defaultSelectionNotice?v`<p class="callout" role="status">${t.defaultSelectionNotice}</p>`:S}`:S}
${e.showWorkspace?S:v`
<label class="field"
><span>${E(`common.search`)}</span
><input
class="settings-input"
name="library-search"
.value=${e.query}
placeholder=${E(`skillLibrary.search`)}
@input=${t=>{e.query=R(t,HTMLInputElement).value,e.changed()}}
/></label>
${e.loading?v`<p role="status">${E(`common.loading`)}</p>`:P({title:E(`skillLibrary.${e.view}`),count:a.length},a.length===0?N(E(`skillLibrary.empty`)):b(a,e=>e.skillId,t=>v` <div class="settings-row">
<button
type="button"
class="settings-row__text plugins-item__detail-button"
?disabled=${e.loading||e.busy}
@click=${()=>void e.open(t.skillId)}
>
<span class="settings-row__title">${t.slug}</span>
<span class="settings-row__desc">${t.description}</span>
<span class="settings-row__desc"
>${t.ownerLabel} ·
${t.shared?E(`skillLibrary.shared`):E(`skillLibrary.private`)}
· ${t.revision.slice(0,8)}</span
>
</button>
<div class="settings-row__control">
${M({kind:t.enabled?`ok`:`muted`,label:E(t.enabled?`skillsPage.enabled`:`skillsPage.disabled`)})}
</div>
</div>`))}
`}
${dt(e)} ${ft(e)}
`}function dt(e){let t=e.draft;if(!t)return S;let n=t.proposal!==null,r=!e.canEdit||e.busy||e.loading||n,i=t.files.find(e=>e.path===t.selectedFile),a=t.selectedFile===`SKILL.md`?t.content:i?I(i):null,o=n=>{r||(t.selectedFile===`SKILL.md`?t.content=n:t.files=t.files.map(e=>e.path===t.selectedFile?{...e,content:n,encoding:`utf8`}:e),t.dirty=!0,e.changed())},s=r||t.dirty,c=(t,n=s)=>v`<button
type="button"
class=${t===`remove`?`btn danger`:`btn`}
?disabled=${n}
@click=${()=>void e.mutate(t)}
>
${E(`skillLibrary.${t}`)}
</button>`;return v` <openclaw-modal-dialog
label=${t.entry?.slug??E(`skillLibrary.create`)}
style="--openclaw-modal-width: 960px;"
@modal-cancel=${t=>{t.preventDefault(),e.close()}}
>
<form
class="md-preview-dialog__panel"
@submit=${t=>{t.preventDefault(),e.save()}}
@keydown=${e=>{(e.ctrlKey||e.metaKey)&&e.key===`Enter`&&!r&&(e.preventDefault(),R(e,HTMLFormElement).requestSubmit())}}
>
<div class="md-preview-dialog__header">
<strong>${t.entry?.slug??E(`skillLibrary.create`)}</strong
><button
type="button"
class="btn btn--sm"
?disabled=${e.busy}
@click=${()=>e.close()}
>
${E(`common.close`)}
</button>
</div>
<div
class="md-preview-dialog__body"
style="display: grid; gap: var(--space-4); min-width: 0;"
>
<p class="muted">
${t.target===`workspace`?E(`skillLibrary.workspaceTarget`,{agent:t.agentId??``}):t.entry?E(`skillLibrary.ownerRevision`,{owner:t.entry.ownerLabel,revision:t.entry.revision.slice(0,8)}):E(`skillLibrary.personalTarget`)}
</p>
${t.entry?Ge(t.entry):S}
${e.canEdit?S:v`<p role="status">${E(`skillLibrary.readOnly`)}</p>`}
<label class="field"
><span>${E(`skillLibrary.slug`)}</span
><input
class="settings-input"
name="library-slug"
required
pattern="[a-z0-9][a-z0-9-]{0,62}"
maxlength="63"
?disabled=${r}
.value=${C(t.slug)}
@input=${n=>{t.slug=R(n,HTMLInputElement).value,t.dirty=!0,e.changed()}}
/></label>
${t.target===`workspace`?v`<label class="field"
><span>${E(`skillLibrary.description`)}</span
><input
class="settings-input"
name="library-description"
required
?disabled=${r}
.value=${t.description}
@input=${n=>{t.description=R(n,HTMLInputElement).value,t.dirty=!0,e.changed()}}
/></label>`:S}
<div class="plugins-toolbar">
<label class="field" style="min-width: 0; flex: 1;"
><span>${E(`skillLibrary.file`)}</span
><select
class="settings-select"
aria-label=${E(`skillLibrary.file`)}
.value=${t.selectedFile}
@change=${n=>{t.selectedFile=R(n,HTMLSelectElement).value,e.changed()}}
>
<option value="SKILL.md" ?selected=${t.selectedFile===`SKILL.md`}>
SKILL.md
</option>
${t.files.map(e=>v`<option value=${e.path} ?selected=${t.selectedFile===e.path}>
${e.path}${e.executable?` *`:``}
</option>`)}
</select></label
>
${i&&e.canEdit?v`<button
type="button"
class="btn"
?disabled=${r}
@click=${()=>{window.confirm(E(`skillLibrary.deleteFileConfirm`,{path:i.path}))&&(t.files=t.files.filter(e=>e.path!==i.path),t.selectedFile=`SKILL.md`,t.dirty=!0,e.changed())}}
>
${E(`skillLibrary.deleteFile`)}
</button>`:S}
</div>
${i&&e.canEdit?v`<label class="field checkbox"
><input
type="checkbox"
name="library-file-executable"
?disabled=${r}
.checked=${i.executable===!0}
@change=${n=>{let r=R(n,HTMLInputElement).checked;t.files=t.files.map(e=>e.path===i.path?{...e,executable:r}:e),t.dirty=!0,e.changed()}}
/><span>${E(`skillLibrary.executable`)}</span></label
>`:S}
${a===null?v`<p class="muted">${E(`skillLibrary.binary`)}</p>`:v`<label class="field"
><span>${t.selectedFile}</span
><textarea
name="library-content"
class="settings-input"
spellcheck="false"
rows="18"
style="font-family: var(--mono); min-width: 0; max-width: 100%; box-sizing: border-box; resize: vertical;"
?readonly=${r}
.value=${C(a)}
@input=${e=>o(R(e,HTMLTextAreaElement).value)}
></textarea>
</label>`}
${r?S:v`<div class="plugins-toolbar">
<label class="field" style="flex: 1; min-width: 0;"
><span>${E(`skillLibrary.newFile`)}</span
><input
class="settings-input"
name="library-file-path"
.value=${e.newFilePath}
@input=${t=>{e.newFilePath=R(t,HTMLInputElement).value,e.changed()}} /></label
><button
type="button"
class="btn"
?disabled=${!e.newFilePath.trim()}
@click=${()=>{let n=e.newFilePath.trim();n===`SKILL.md`||t.files.some(e=>e.path===n)?e.error=E(`skillLibrary.fileExists`):(t.files=[...t.files,{path:n,content:``,encoding:`utf8`}],t.selectedFile=n,t.dirty=!0,e.newFilePath=``),e.changed()}}
>
${E(`skillLibrary.addFile`)}
</button>
</div>`}
${e.error?v`<div class="callout danger" role="alert">${e.error}</div>`:S}
${e.notice?v`<div class="callout success" role="status">${e.notice}</div>`:S}
<div class="plugins-toolbar">
${e.canEdit?n?v`<button
type="button"
class="btn primary"
?disabled=${e.busy}
@click=${()=>void e.applyWorkspace()}
>
${E(`skillLibrary.apply`)}
</button>`:v`<button
type="submit"
class="btn primary"
?disabled=${r||!t.dirty||!t.content.trim()}
>
${e.busy?E(`common.loading`):t.target===`workspace`?E(`skillLibrary.propose`):E(`skillLibrary.save`)}
</button>`:S}
${e.canEdit&&t.entry?v`
${c(t.entry.enabled?`disable`:`enable`)}
${t.entry.ownerProfileId?c(t.entry.shared?`unshare`:`share`):S}
`:S}
</div>
${e.canEdit&&t.entry&&t.revisions.length>1?v`<div class="plugins-toolbar">
<label class="field" style="flex: 1; min-width: 0;"
><span>${E(`skillLibrary.revision`)}</span
><select
class="settings-select"
aria-label=${E(`skillLibrary.revision`)}
.value=${t.rollbackRevision}
?disabled=${s}
@change=${n=>{t.rollbackRevision=R(n,HTMLSelectElement).value,e.changed()}}
>
<option value="" ?selected=${t.rollbackRevision===``}>
${E(`skillLibrary.selectRevision`)}
</option>
${t.revisions.filter(e=>e.revision!==t.entry?.revision).map(e=>v`<option
value=${e.revision}
?selected=${t.rollbackRevision===e.revision}
>
${new Date(e.createdAt).toLocaleString()} ·
${e.revision.slice(0,8)}
</option>`)}
</select></label
>${c(`rollback`,s||!t.rollbackRevision)}
</div>`:S}
${e.canEdit&&t.entry?v`<div
class="plugins-toolbar"
style="border-top: 1px solid var(--border); padding-top: var(--space-4);"
>
${e.canTransfer&&t.entry.ownerProfileId?c(`transfer`):S}
${c(`remove`)}
</div>`:S}
</div>
</form>
</openclaw-modal-dialog>`}function ft(e){if(!e.importOpen)return S;let t=()=>e.close();return v`<openclaw-modal-dialog
label=${E(`skillLibrary.import`)}
@modal-cancel=${e=>{e.preventDefault(),t()}}
>
<form
class="md-preview-dialog__panel"
@submit=${t=>{t.preventDefault(),e.importSource?e.importClawHub(e.importSlug,e.importSource.slug,e.importSource.version):e.importFiles(e.importSelection)}}
>
<div class="md-preview-dialog__header">
<strong>${E(`skillLibrary.import`)}</strong
><button type="button" class="btn btn--sm" ?disabled=${e.busy} @click=${t}>
${E(`common.close`)}
</button>
</div>
<div
class="md-preview-dialog__body"
style="display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-4);"
>
<p class="muted">
${e.importSource?E(`skillLibrary.importClawHub`,{source:e.importSource.slug}):e.createTarget===`workspace`?E(`skillLibrary.importWorkspace`):E(`skillLibrary.importHelp`)}
</p>
<label class="field"
><span>${E(`skillLibrary.slug`)}</span
><input
class="settings-input"
required
name="library-import-slug"
pattern="[a-z0-9][a-z0-9-]{0,62}"
.value=${e.importSlug}
?disabled=${e.busy}
@input=${t=>{e.importSlug=R(t,HTMLInputElement).value,e.changed()}}
/></label>
${e.importSource?S:[!1,!0].map(t=>v`<label class="field"
><span
>${E(t?`skillLibrary.chooseFolder`:`skillLibrary.chooseFiles`)}</span
><input
type="file"
style="min-width: 0;"
?webkitdirectory=${t}
multiple
name=${t?`library-import-directory`:`library-import-files`}
?disabled=${e.busy}
@change=${t=>{e.importSelection=Array.from(R(t,HTMLInputElement).files??[]),e.changed()}}
/></label>`)}
${e.error?v`<div class="callout danger" role="alert">${e.error}</div>`:S}
<button
type="submit"
class="btn primary"
?disabled=${e.busy||!e.importSource&&e.importSelection.length===0}
>
${e.busy?E(`common.loading`):E(`skillLibrary.import`)}
</button>
</div>
</form>
</openclaw-modal-dialog>`}function U(){return(U=e((()=>{_(),_e(),x(),j(),w(),T(),Je(),L()})))()}function W(e){return e?He(e,window.location.href):null}function pt(e,t){switch(t){case`all`:return!0;case`ready`:return!e.disabled&&z(e);case`needs-setup`:return!e.disabled&&!z(e);case`disabled`:return e.disabled}throw Error(`Unsupported skills status filter`)}function mt(e){return e.disabled?`muted`:z(e)?`ok`:`warn`}function ht(e){return e.disabled?M({kind:`muted`,label:E(`skillsPage.tabs.disabled`)}):z(e)?M({kind:`ok`,label:E(`skillsPage.tabs.ready`)}):M({kind:`warn`,label:E(`skillsPage.tabs.needsSetup`)})}function G(e,t){let n=e.clawhub;return!n||n.status!==`linked`||!n.valid?null:t[oe({registry:n.registry,slug:n.slug,ownerHandle:n.ownerHandle,version:n.installedVersion})]??null}function K(e,t){if(!e)return t?{label:E(`skillsPage.refreshing`),kind:`muted`,chipClass:`chip`}:{label:E(`skillsPage.verdict.unavailable`),kind:`warn`,chipClass:`chip-warn`};let n=e.securityStatus?.trim()||null;return e.ok&&e.decision===`pass`?{label:n===`clean`||!n?E(`skillsPage.verdict.clean`):n,kind:`ok`,chipClass:`chip-ok`}:n===`pending`||n===`not-run`?{label:E(`skillsPage.verdict.pending`),kind:`muted`,chipClass:`chip`}:{label:E(n===`malicious`?`skillsPage.verdict.blocked`:n===`suspicious`?`skillsPage.verdict.review`:`skillsPage.verdict.unavailable`),kind:`warn`,chipClass:`chip-warn`}}function q(e){return e.loading||e.operation!==null}function J(e){return q(e)||!e.canUpdate}function Y(e){return q(e)||!e.canInstall}function gt(e,t){return e.operation?.kind===`skill`&&e.operation.skillKey===t}function X(e,t){return e.operation?.kind===`clawhub`&&e.operation.ref===t}function _t(e,t){if(e.personalImport||t.installOnly!==!0)return!1;let n=B(t);return(e.report?.skills??[]).some(e=>e.clawhub?.valid===!0&&e.clawhub.requestedReference===n)}function vt(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++:z(e)?r.ready++:r[`needs-setup`]++;let i=e.statusFilter===`all`?n:n.filter(t=>pt(t,e.statusFilter)),a=t(e.filter),o=a?i.filter(e=>t([e.name,e.description,e.source].join(` `)).includes(a)):i,s=tt(o),c=e.detailKey?n.find(t=>t.skillKey===e.detailKey)??null:null;return v`
${Re(v`
${e.library??S}
${e.showInventory===!1?S:bt(e,r,o.length)}
${e.error?v`<div class="callout danger" role="alert">${e.error}</div>`:S}
${xt(e)}
${e.showInventory===!1?S:o.length===0?N(!e.connected&&!e.report?E(`skillsPage.disconnected`):E(`skillsPage.empty`)):s.map(t=>yt(t,e))}
`,{wide:!0})}
${c?Tt(c,e):S}
${e.clawhubDetailRef?Ct(e):S}
`}function yt(e,t){return v`
<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">${Oe.chevronDown}</span>
</summary>
<div class="settings-group">
${b(e.skills,e=>e.skillKey,e=>wt(e,t))}
</div>
</details>
`}function bt(e,t,n){let r=de(e.agentsList?.agents??[]),i=r.some(t=>t.id===e.selectedAgentId)?e.selectedAgentId??``:r.some(t=>t.id===e.agentsList?.defaultId)?e.agentsList?.defaultId??``:r[0]?.id??``;return v`
<div class="plugins-toolbar plugins-toolbar--fields">
${F({value:e.statusFilter,ariaLabel:E(`skillsPage.title`),options:Z.map(e=>({value:e.id,label:v`${E(e.labelKey)}
<span class="settings-count">${t[e.id]}</span>`})),onChange:t=>e.onStatusFilterChange(t)})}
${r.length>1?v`
<div class="plugins-field skills-toolbar__agent">
<span>${E(`usage.filters.agent`)}</span>
<openclaw-agent-select
class="agent-select--settings"
name="skills-agent"
.options=${r.map(t=>{let n=ae(t);return{value:t.id,label:t.id===e.agentsList?.defaultId?E(`skillsPage.defaultAgent`,{name:n}):n,agent:t}})}
.value=${i}
.accessibleLabel=${E(`usage.filters.agent`)}
.disabled=${q(e)||!e.connected}
.onSelect=${e.onAgentChange}
></openclaw-agent-select>
</div>
`:S}
<label class="plugins-field skills-toolbar__search">
<span>${E(`common.search`)}</span>
<input
class="settings-input"
.value=${e.filter}
@input=${t=>e.onFilterChange(t.target.value)}
placeholder=${E(`skillsPage.filterPlaceholder`)}
autocomplete="off"
name="skills-filter"
/>
</label>
<span class="plugins-toolbar__hint">
${E(`skillsPage.shown`,{count:String(n)})}
</span>
<button
type="button"
class="btn"
?disabled=${q(e)||!e.connected}
@click=${e.onRefresh}
>
${e.loading?E(`common.loading`):E(`common.refresh`)}
</button>
</div>
`}function xt(e){return P({title:E(`skillsPage.clawHub`),description:E(`skillsPage.clawHubSubtitle`)},v`
<div class="settings-row">
<input
class="settings-input plugins-row-input"
.value=${e.clawhubQuery}
@input=${t=>e.onClawHubQueryChange(t.target.value)}
placeholder=${E(`skillsPage.searchClawHub`)}
autocomplete="off"
name="clawhub-search"
/>
${e.clawhubSearchLoading?v`<span class="plugins-toolbar__hint">${E(`skillsPage.searching`)}</span>`:S}
</div>
${e.clawhubSearchError?v`<div class="callout danger plugins-group-message">
${e.clawhubSearchError}
</div>`:S}
${e.clawhubInstallMessage?v`<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>`:S}
${St(e)}
`)}function St(e){let t=e.clawhubResults;return t?t.length===0?N(E(`skillsPage.noClawHubResults`)):v`
${t.map(t=>{let n=W(t.icon??void 0),r=B(t),i=t.installOnly?void 0:r,a=_t(e,t),o=t.trustState?` · ${E(`skillsPage.notScannedByClawHub`)}`:``,s=v`
${n?v`<img class="clawhub-skill-icon" src=${n} alt="" loading="lazy" />`:S}
<span class="clawhub-skill-result__copy">
<span class="settings-row__title">${t.displayName}</span>
<span class="settings-row__desc">
${t.summary?`${g(t.summary,100)} · ${r}`:r}${o}
</span>
</span>
`;return v`
<div class="settings-row plugins-item ${i?`plugins-item--clickable`:``}">
${i?v`<button
type="button"
class="settings-row__text plugins-item__detail-button clawhub-skill-result__button"
aria-label=${E(`skillsPage.openDetails`,{name:i})}
@click=${()=>e.onClawHubDetailOpen(i)}
>
${s}
</button>`:v`<div class="settings-row__text clawhub-skill-result__button">${s}</div>`}
<div class="settings-row__control">
${t.version?ze(`v${t.version}`):S}
<button
class="btn btn--sm"
?disabled=${a||Y(e)}
@click=${()=>{a||e.onClawHubInstall(r)}}
>
${a?E(`skillsPage.installed`):X(e,r)?E(`skillsPage.installing`):E(e.personalImport?`skillLibrary.import`:`skillsPage.install`)}
</button>
</div>
</div>
`})}
`:S}function Ct(e){let t=e.clawhubDetail,n=W(t?.skill?.icon??void 0),r=n?null:W(t?.owner?.image??void 0),i=n??r;return v`
<openclaw-modal-dialog
label=${t?.skill?.displayName??e.clawhubDetailRef??E(`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?v`<img
class="clawhub-skill-icon clawhub-skill-icon--detail ${r?`clawhub-skill-icon--profile`:``}"
src=${i}
alt=""
/>`:S}
<div class="md-preview-dialog__title">
${t?.skill?.displayName??e.clawhubDetailRef}
</div>
</div>
<button class="btn btn--sm" @click=${e.onClawHubDetailClose}>
${E(`skillsPage.close`)}
</button>
</div>
<div class="md-preview-dialog__body" style="display: grid; gap: 16px;">
${e.clawhubDetailLoading?v`<div class="muted">${E(`common.loading`)}</div>`:e.clawhubDetailError?v`<div class="callout danger">${e.clawhubDetailError}</div>`:t?.skill?v`
<div style="font-size: 14px; line-height: 1.5;">
${t.skill.summary??``}
</div>
${t.owner?.displayName?v`<div class="muted" style="font-size: 13px;">
${E(`skillsPage.by`)}
${t.owner.displayName}${t.owner.handle?v` (@${t.owner.handle})`:S}
</div>`:S}
${t.latestVersion?v`<div class="muted" style="font-size: 13px;">
${E(`skillsPage.latest`,{version:t.latestVersion.version})}
</div>`:S}
${t.latestVersion?.changelog?v`<div
style="font-size: 13px; border-top: 1px solid var(--border); padding-top: 12px; white-space: pre-wrap;"
>
${t.latestVersion.changelog}
</div>`:S}
${t.metadata?.os?v`<div class="muted" style="font-size: 12px;">
${E(`skillsPage.platforms`,{platforms:t.metadata.os.join(`, `)})}
</div>`:S}
<button
class="btn primary"
?disabled=${Y(e)}
@click=${()=>{e.clawhubDetailRef&&e.onClawHubInstall(e.clawhubDetailRef)}}
>
${X(e,e.clawhubDetailRef??``)?E(`skillsPage.installing`):e.personalImport?E(`skillLibrary.import`):E(`skillsPage.installNamed`,{name:t.skill.displayName})}
</button>
`:v`<div class="muted">${E(`skillsPage.notFound`)}</div>`}
</div>
</div>
</openclaw-modal-dialog>
`}function wt(e,t){let n=J(t),r=G(e,t.clawhubVerdicts);return v`
<div class="settings-row plugins-item plugins-item--clickable">
<button
type="button"
class="settings-row__text plugins-item__detail-button"
aria-label=${E(`skillsPage.openDetails`,{name:e.name})}
@click=${()=>t.onDetailOpen(e.skillKey)}
>
<span class="settings-row__title">
${e.emoji?v`<span>${e.emoji}</span> `:S}${e.name}
</span>
<span class="settings-row__desc">${g(e.description,140)}</span>
</button>
<div class="settings-row__control">
${ht(e)}
${e.clawhub?.status===`linked`?M(K(r,t.clawhubVerdictsLoading)):e.clawhub?.status===`invalid`?M({kind:`warn`,label:E(`skillsPage.invalidLink`)}):S}
${A({checked:!e.disabled,disabled:n,ariaLabel:E(`skillsPage.enabledNamed`,{name:e.name}),onChange:()=>t.onToggle(e.skillKey,e.disabled)})}
</div>
</div>
`}function Tt(e,t){let n=J(t),r=Y(t),i=gt(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))),u=!!(e.bundled&&e.source!==`openclaw-bundled`),d=it(e),f=et(e),p=G(e,t.clawhubVerdicts),m=t.detailTab===`card`&&e.skillCard?.present?`card`:`overview`;return v`
<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 ${mt(e)}"></span>
${e.emoji?v`<span style="font-size: 18px;">${e.emoji}</span>`:S}
<span>${e.name}</span>
</div>
<button class="btn btn--sm" @click=${t.onDetailClose}>
${E(`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>
${$e({skill:e,showBundledBadge:u})}
</div>
${e.clawhub||e.skillCard?.present?v`
${Ye({id:`skill-detail`,active:m,tabs:[{value:`overview`,label:E(`skillsPage.overview`)},...e.skillCard?.present?[{value:`card`,label:E(`skillsPage.skillCard`)}]:[]],ariaLabel:e.name,panelId:`skill-detail-panel`,variant:`sub`,onSelect:t.onDetailTabChange})}
`:S}
<div
id="skill-detail-panel"
role=${e.clawhub||e.skillCard?.present?`tabpanel`:S}
aria-labelledby=${e.clawhub||e.skillCard?.present?`skill-detail-tab-${m}`:S}
>
${m===`overview`?Et(e,t,p):Dt(e,t)}
</div>
${d.length>0?v`
<div
class="callout"
style="border-color: var(--warn-subtle); background: var(--warn-subtle); color: var(--warn);"
>
<div style="font-weight: 600; margin-bottom: 4px;">
${E(`skillsPage.missingRequirements`)}
</div>
<div>${d.join(`, `)}</div>
</div>
`:S}
${f.length>0?v`
<div class="muted" style="font-size: 13px;">
${E(`skillsPage.reason`,{reasons:f.join(`, `)})}
</div>
`:S}
<div style="display: flex; align-items: center; gap: 12px;">
${A({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?E(`skillsPage.disabled`):E(`skillsPage.enabled`)}
</span>
${c?v`<button
class="btn"
?disabled=${r}
@click=${()=>c&&t.onInstall(e.skillKey,e.name,c.id)}
>
${i?E(`skillsPage.installing`):c?.label}
</button>`:S}
</div>
${o?v`<div class="callout ${o.kind===`error`?`danger`:`success`}">
${l(o.message)}
</div>`:S}
${e.primaryEnv?v`
<div style="display: grid; gap: 8px;">
<div class="field">
<span
>${E(`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=W(e.homepage);return t?v`<div class="muted" style="font-size: 13px;">
${E(`skillsPage.getKey`)}
<a href="${t}" target="_blank" rel="noopener noreferrer"
>${e.homepage}</a
>
</div>`:S})()}
<button
class="btn primary"
?disabled=${n||!a.trim()}
@click=${()=>t.onSaveKey(e.skillKey)}
>
${E(`skillsPage.saveKey`)}
</button>
</div>
`:S}
<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;">${E(`skillsPage.source`)}</span> ${e.source}
</div>
<div style="font-family: var(--mono); word-break: break-all;">${e.filePath}</div>
${(()=>{let t=W(e.homepage);return t?v`<div>
<a href="${t}" target="_blank" rel="noopener noreferrer"
>${e.homepage}</a
>
</div>`:S})()}
</div>
</div>
</div>
</openclaw-modal-dialog>
`}function Et(e,t,n){let r=e.clawhub;if(!r)return S;if(r.status===`invalid`)return v`<div class="callout danger">
<div style="font-weight: 600; margin-bottom: 4px;">${E(`skillsPage.invalidLink`)}</div>
<div>${l(r.reason)}</div>
</div>`;let i=W(n?.securityAuditUrl??void 0),a=n?.reasons?.length?l(n.reasons.join(`, `)):null,o=K(n,t.clawhubVerdictsLoading),s=`${r.ownerHandle?`@${r.ownerHandle}/`:``}${r.slug}@${r.installedVersion}`;return v`
<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?v`<span class="muted">${E(`skillsPage.refreshing`)}</span>`:S}
</div>
${t.clawhubVerdictsError?v`<div class="muted" style="font-size: 13px;">${t.clawhubVerdictsError}</div>`:a?v`<div class="muted" style="font-size: 13px;">${a}</div>`:S}
${i?v`<div style="font-size: 13px;">
<a href="${i}" target="_blank" rel="noopener noreferrer"
>${E(`skillsPage.fullSecurityReport`)}</a
>
</div>`:S}
</div>
`}function Dt(e,t){if(!e.skillCard?.present)return S;let n=t.skillCardContents[e.skillKey];if(n===void 0){let n=t.skillCardErrors[e.skillKey];return n?v`<div class="callout danger">${n}</div>`:v`<div class="muted" style="font-size: 13px;">
${t.skillCardLoadingKey===e.skillKey?E(`skillsPage.loadingSkillCard`):E(`skillsPage.skillCardNotLoaded`)}
</div>`}return v`
<article
class="sidebar-markdown"
style="max-width: 100%; overflow-wrap: anywhere;"
@click=${Ne}
>
${ve(Pe(n))}
</article>
`}var Z;function Ot(){return(Ot=e((()=>{_(),x(),be(),We(),Xe(),De(),w(),Me(),Ie(),j(),T(),Le(),ue(),p(),ce(),Ue(),rt(),nt(),fe(),Fe(),Z=[{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((()=>{a(),je(),_(),ge(),xe(),Se(),Qe(),p(),k(),fe(),Ve(),ee(),s(),ct(),at(),H(),U(),Ot(),Q=class extends re{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 Be(this,{getGateway:()=>this.context?.gateway,invalidateRequests:()=>this.resetLoadedSkillState(),ensureInitialData:()=>this.ensureInitialData()}),this.library=new V(this,this.gateway,()=>this.skillsAgentId??this.context.agents.state.agentsList?.defaultId??null,()=>this.refreshPage()),this.clawhubSearchTask=new ke(this,{autoRun:!1,args:()=>[this.gateway.connected?this.gateway.client:null,this.debouncedClawHubSearchQuery],task:([e,t],{signal:n})=>e&&t?lt(e,t,n):Ae}),this.subscriptions=new he(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;f(this,e.agentsList),t!==this.skillsAgentId&&(this.skillsDetailKey=null,this.skillsDetailTab=`overview`)}}resetLoadedSkillState(){this.library.reset(),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&&te(this,e.report))}}ensureInitialData(){if(this.library&&!this.library.list&&!this.library.loading&&!this.library.error&&this.library.load(),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&&h(this),this.clawhubSearchQuery.trim()&&this.clawhubSearchTask.status!==D.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 Promise.all([u(this,()=>this.loadAgents()),this.library.load()])}changeAgent(e){if(this.skillOperation||this.skillsLoading)return;let t=this.skillsAgentId;le(this,e),t!==this.skillsAgentId&&(this.skillsDetailKey=null,this.skillsDetailTab=`overview`),h(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===D.COMPLETE&&this.debouncedClawHubSearchQuery===this.clawhubSearchQuery.trim()?this.clawhubSearchTask.value??null:null}get clawhubSearchLoading(){return this.debouncedClawHubSearchQuery.length>0&&this.clawhubSearchTask.status===D.PENDING}get clawhubSearchError(){if(this.clawhubSearchTask.status!==D.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&&c(this,this.skillsDetailKey)}canUpdateSkills(){return O(this.context?.gateway?.snapshot,`skills.update`,`operator.admin`)}canInstallSkills(){return O(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:Ee(e,this.context.basePath)})}}render(){let e=this.context.agents.state,t=this.skillsError??e.agentsError;return v`
${ot({active:`skills`,onSelect:e=>this.selectHubTab(e)})}
${Ze(v`
<wa-tab-panel
id=${st}
name="skills"
active
aria-labelledby="plugins-tab-skills"
>
${vt({library:ut(this.library),showInventory:this.library.showWorkspace,personalImport:!this.library.showWorkspace,canUpdate:this.canUpdateSkills(),canInstall:this.library.showWorkspace?this.canInstallSkills():this.library.canWrite&&!!this.library.list?.profileId,connected:this.gateway.connected,loading:this.skillsLoading||e.agentsLoading||this.library.busy,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()&&se(this,e,t,()=>this.canUpdateSkills())},onEdit:(e,t)=>{this.canUpdateSkills()&&o(this,e,t)},onSaveKey:e=>{this.canUpdateSkills()&&m(this,e,()=>this.canUpdateSkills())},onInstall:(e,t,n)=>{this.canInstallSkills()&&ie(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 pe(this,e),onClawHubDetailClose:()=>ne(this),onClawHubInstall:(e,t)=>{this.library.showWorkspace?this.canInstallSkills()&&me(this,e,t):(this.clawhubDetailRef=null,this.library.importSource={slug:e,version:t},this.library.importSlug=``,this.library.importOpen=!0,this.requestUpdate())}})}
</wa-tab-panel>
`)}
`}},i([n({context:we,subscribe:!0})],Q.prototype,`context`,void 0),i([ye({attribute:!1})],Q.prototype,`routeData`,void 0),i([y()],Q.prototype,`skillsAgentId`,void 0),i([y()],Q.prototype,`skillsAgentRevision`,void 0),i([y()],Q.prototype,`skillsLoading`,void 0),i([y()],Q.prototype,`skillsReport`,void 0),i([y()],Q.prototype,`skillsError`,void 0),i([y()],Q.prototype,`skillOperation`,void 0),i([y()],Q.prototype,`skillsFilter`,void 0),i([y()],Q.prototype,`skillsStatusFilter`,void 0),i([y()],Q.prototype,`skillEdits`,void 0),i([y()],Q.prototype,`skillMessages`,void 0),i([y()],Q.prototype,`skillsDetailKey`,void 0),i([y()],Q.prototype,`skillsDetailTab`,void 0),i([y()],Q.prototype,`clawhubSearchQuery`,void 0),i([y()],Q.prototype,`clawhubDetail`,void 0),i([y()],Q.prototype,`clawhubDetailRef`,void 0),i([y()],Q.prototype,`clawhubDetailLoading`,void 0),i([y()],Q.prototype,`clawhubDetailError`,void 0),i([y()],Q.prototype,`clawhubInstallMessage`,void 0),i([y()],Q.prototype,`clawhubVerdicts`,void 0),i([y()],Q.prototype,`clawhubVerdictsLoading`,void 0),i([y()],Q.prototype,`clawhubVerdictsError`,void 0),i([y()],Q.prototype,`skillCardContents`,void 0),i([y()],Q.prototype,`skillCardContentKeys`,void 0),i([y()],Q.prototype,`skillCardLoadingKey`,void 0),i([y()],Q.prototype,`skillCardErrors`,void 0),customElements.get(`openclaw-skills-page`)||customElements.define(`openclaw-skills-page`,Q)})))()}$();
//# sourceMappingURL=skills-page-ByEBuPA5.js.map