openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
1,118 lines • 71 kB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./applied-history.runtime-Aovx0ctz.js","./rolldown-runtime-DkW27tQK.js","./lit-runtime-CV_MH99K.js","./control-ui-foundation-Cydpkyqa.js","./control-ui-core-Rwzhj6nO.js","./control-ui-core-YphAl4aM.js","./control-ui-core-vvcQQV2m.js","./gateway-runtime-Bqqcp9-I.js","./control-ui-core-ClxHIvNM.css","./control-ui-boot-chat-_QSl8fbH.js","./control-ui-boot-shared-BYq7Cchl.js","./control-ui-boot-shared-Deak_Sjt.js","./control-ui-boot-shared-gfE6fZcA.js","./markdown-runtime-Bn6OdBVq.js","./control-ui-boot-shared-DfZ39Yj9.js","./control-ui-boot-shared-CXVvK2AW.js","./control-ui-boot-shared-3juXI2I2.js","./control-ui-boot-shared-BVNXvWX-.js","./control-ui-boot-shared-KspYIvAF.css","./control-ui-boot-chat-Cgwe4GEM.js","./config-runtime-D-5ybyEi.js"])))=>i.map(i=>d[i]);
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Cn as t,Ii as n,R as r,St as i,Vn as a,ii as o,ri as s,vt as c,wr as l,z as u}from"./control-ui-foundation-Cydpkyqa.js";import{As as d,Bi as f,Bn as p,Cc as m,Do as h,Eo as g,Ga as _,Ki as v,Oo as ee,Sc as te,Wa as ne,Wi as re,bc as ie,bs as ae,ea as oe,k as se,qs as ce,ta as le,w as ue,ws as de,xc as fe,xs as pe,ya as me,zn as he}from"./control-ui-core-Rwzhj6nO.js";import{$ as ge,C as _e,D as ve,K as y,X as b,_ as ye,b as be,dt as xe,i as Se,k as Ce,nt as we,q as x,s as S,st as C,v as Te}from"./lit-runtime-CV_MH99K.js";import{J as Ee,Yn as De,Z as Oe,_ as ke,g as Ae,tr as je}from"./control-ui-core-YphAl4aM.js";import{Gt as w,Ht as T,It as Me,Rt as E,Wt as D,Yt as O,en as k}from"./control-ui-core-vvcQQV2m.js";import{B as Ne,V as Pe,z as Fe}from"./control-ui-boot-shared-BYq7Cchl.js";import{n as Ie,r as Le}from"./gateway-runtime-Bqqcp9-I.js";import{Cn as Re,Sn as ze,er as Be,nr as Ve}from"./control-ui-boot-shared-DfZ39Yj9.js";import{n as He,t as Ue}from"./hub-tabs-DLM-pY5z.js";import{i as We,n as Ge,r as Ke,t as qe}from"./plugins-hub-header-TMK2CKRh.js";import{a as Je,i as Ye,n as Xe,r as Ze,t as Qe}from"./history-scan-page-controller-C3BVU3x_.js";import{a as $e,c as et,f as tt,i as nt,l as A,n as j,o as rt,p as M,s as N,t as it}from"./proposals-CINy8LJX.js";function P(e,t){return Ie(e,t,`operator.admin`)}function at(e){return{canEvaluate:P(e,`skills.proposals.evaluate`),canApply:P(e,`skills.proposals.apply`),canRevise:P(e,`skills.proposals.requestRevision`),canReject:P(e,`skills.proposals.reject`),canScanHistory:P(e,`skills.proposals.historyScan`)}}function F(){return(F=e((()=>{Le()})))()}function ot(e){let t=a(a(e.skills)?.workshop);return a(t?.autonomous)?.mode!==`off`}function st(e,t,n,r){let i=pe(e?.state.configSnapshot);return i?{enabled:ot(i),busy:t,canUpdate:r,error:n}:null}async function ct(e,t,n=()=>!0){let r={raw:{skills:{workshop:{autonomous:{mode:t?`auto`:`off`}}}},note:t?`Enable Skill Workshop self-learning`:`Disable Skill Workshop self-learning`},i=await e.patch(r);if(!n())return null;if(!i&&e.state.lastError?.includes(I)){if(await e.refresh(),!n())return null;if(e.state.lastError)return e.state.lastError;if(i=await e.patch(r),!n())return null}return i?(await e.refresh(),n(),null):e.state.lastError??k(`skillWorkshop.selfLearning.updateError`)}function lt(e,t){return e?b`
<label
class="sw-revision-session-toggle"
title=${k(`skillWorkshop.header.selfLearningTooltip`)}
>
<input
type="checkbox"
aria-label=${k(`skillWorkshop.header.selfLearningAria`)}
.checked=${e.enabled}
?disabled=${e.busy||!e.canUpdate}
@change=${e=>t(e.currentTarget.checked)}
/>
<span class="sw-revision-session-toggle__track" aria-hidden="true"></span>
<span class="sw-revision-session-toggle__label"
>${k(`skillWorkshop.header.selfLearning`)}</span
>
</label>
`:x}function ut(e,t){return!e||e.enabled?x:b`
<div class="sw-empty-state__selflearn">
<h3>${k(`skillWorkshop.selfLearning.pitchTitle`)}</h3>
<p>${k(`skillWorkshop.selfLearning.pitchBody`)}</p>
<button
type="button"
class="sw-btn sw-btn--primary ${e.busy?`is-busy`:``}"
?disabled=${e.busy||!e.canUpdate}
@click=${()=>t(!0)}
>
${e.busy?k(`skillWorkshop.selfLearning.enabling`):k(`skillWorkshop.selfLearning.enable`)}
</button>
</div>
`}function dt(e){return e?.error?b`<div class="sw-error" role="status"><span>${e.error}</span></div>`:x}var I;function L(){return(L=e((()=>{y(),O(),ae(),I=`config changed since last load`})))()}function ft(){try{return m()?.getItem(R)===`board`?`board`:`today`}catch{return`today`}}function pt(e){try{m()?.setItem(R,e)}catch{}}function mt(){try{return m()?.getItem(z)===`true`}catch{return!1}}function ht(e){try{m()?.setItem(z,String(e))}catch{}}var R,z;function B(){return(B=e((()=>{R=`openclaw:control-ui:skill-workshop-mode:v1`,z=`openclaw:control-ui:skill-workshop-current-chat-revisions:v1`})))()}function gt(e,t,n){e.skillWorkshopUseCurrentChatForRevisions!==t&&(e.skillWorkshopUseCurrentChatForRevisions=t,ht(t),n())}function _t(e,t,n){e.skillWorkshopMode!==t&&(e.skillWorkshopMode=t,pt(t),n())}function vt(e,{selfLearning:t,onSelfLearningToggle:n},r){let i=k(`skillWorkshop.header.useCurrentChat`);return b`
<div class="sw-header-controls">
${lt(t,n)}
<label
class="sw-revision-session-toggle"
title=${k(`skillWorkshop.header.useCurrentChatTooltip`)}
>
<input
type="checkbox"
aria-label=${k(`skillWorkshop.header.useCurrentChatAria`)}
.checked=${e.skillWorkshopUseCurrentChatForRevisions}
@change=${t=>gt(e,t.currentTarget.checked,r)}
/>
<span class="sw-revision-session-toggle__track" aria-hidden="true"></span>
<span class="sw-revision-session-toggle__label">${i}</span>
</label>
${He({id:`skill-workshop-mode`,active:e.skillWorkshopMode,tabs:[{value:`board`,label:b`
<svg viewBox="0 0 24 24" class="sw-mode-tabs__icon" aria-hidden="true">
<rect x="3" y="4" width="7" height="16" rx="1.5" />
<rect x="14" y="4" width="7" height="9" rx="1.5" />
<rect x="14" y="15" width="7" height="5" rx="1.5" />
</svg>
<span>${k(`skillWorkshop.header.board`)}</span>
`},{value:`today`,label:b`
<svg viewBox="0 0 24 24" class="sw-mode-tabs__icon" aria-hidden="true">
<circle cx="12" cy="12" r="4" />
<path
d="M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6l1.4 1.4M17 17l1.4 1.4M5.6 18.4 7 17M17 7l1.4-1.4"
/>
</svg>
<span>${k(`skillWorkshop.header.today`)}</span>
`}],ariaLabel:k(`skillWorkshop.header.view`),panelId:`skill-workshop-mode-panel`,variant:`sub`,onSelect:t=>_t(e,t,r)})}
</div>
`}function yt(){return(yt=e((()=>{y(),Ue(),O(),L(),B()})))()}function bt(e,t){if(t!==`workshop`){if(t===`skills`){e.navigate(`skills`);return}e.navigate(`plugins`,{pathname:je(t,e.basePath)})}}function xt(){return(xt=e((()=>{De()})))()}function V(e){return{...e.value}}function St(){let e=new Map,t=new Set,r=!1,i=()=>{for(let e of t)e()},a=t=>{let n=t.generation;return{completion:t.execute(V(t),a=>r||e.get(t.value.id)!==t||t.generation!==n||t.value.phase!==`pending`?null:(t.value={...t.value,...a},i(),V(t))).then(r=>(e.get(t.value.id)===t&&t.generation===n&&(e.delete(t.value.id),i()),r.status===`admitted`?{id:t.value.id,sessionKey:r.sessionKey,status:`admitted`}:{id:t.value.id,status:`revision-changed`})).catch(r=>{let a=r instanceof Error?r.message:String(r);return e.get(t.value.id)===t&&t.generation===n&&(t.value={...t.value,error:a,phase:`retryable-failed`},i()),{error:a,id:t.value.id,status:`retryable-failed`}}),entry:V(t)}};return{start(t,n){let o=ne(),s={execute:n,generation:0,value:{...t,id:o,idempotencyKey:ne(),phase:`pending`}};if(r)throw Error(`Skill Workshop revision admission owner is disposed.`);return e.set(o,s),i(),a(s)},retry(t){let n=e.get(t);return!n||n.value.phase!==`retryable-failed`||r?null:(n.generation+=1,n.value={...n.value,error:void 0,phase:`pending`},i(),a(n))},get(t){let n=e.get(t);return n?V(n):null},firstFailed(t){let r=n(t);for(let t of e.values())if(t.value.phase===`retryable-failed`&&n(t.value.proposalAgentId)===r)return V(t);return null},subscribe(e){return t.add(e),()=>t.delete(e)},dispose(){r=!0,e.clear(),t.clear()}}}function Ct(){return(Ct=e((()=>{d(),_()})))()}function wt(e,t){let n=t?.trim();return n?e?.sessions.find(e=>de(e.key,n))??null:null}function Tt(e){return!!(e&&!e.archived&&!e.hasActiveRun)}async function Et(e,t){let n=e.sessions.state;return n.agentId===t&&n.result?.sessions.length?n.result:e.sessions.list({agentId:t})}function H(e,t,r){let i=r?.sessionId?.trim();return{sessionKey:e,targetAgentId:n(r?.agentId??t),...i?{sessionId:i}:{}}}async function Dt(e,r,i){if(!i())return null;let a=r.gateway.snapshot,o=a.hello;if(e.useCurrentChatForRevisions){let t=me(Oe().sessionKey,o).trim();if(!t)return null;let n=ce({assistantAgentId:a.assistantAgentId,agentsList:r.agents.state.agentsList,hello:o,sessionKey:t},t)??e.proposalAgentId,s=await Et(r,n);return i()?H(t,n,wt(s,t)):null}let s=n(e.proposalOriginAgentId??e.proposalAgentId),c=await Et(r,s);if(!i())return null;let l=wt(c,e.proposalOriginSessionKey);if(Tt(l))return H(l.key,s,l);let u={agentId:s,label:t(`Skill Workshop: ${e.proposalSlug||e.proposalId}`,80)},d=le(r.gateway.snapshot,{method:`sessions.create`,params:u});if(!d.allowed)throw Error(d.reason);if(!i())return null;let f=await r.sessions.create(u);if(!i())return null;let p=me(f,o).trim();if(!p)throw Error(r.sessions.state.error??`Could not prepare a Skill Workshop thread.`);return H(p,s)}function Ot(){return(Ot=e((()=>{Ee(),oe(),v(),d()})))()}async function kt(e){let t=e.context.gateway.snapshot,r=t.client;if(!r)throw Error(`Gateway is not connected.`);let a=()=>{let n=e.context.gateway.snapshot;return n.phase===`connected`&&n.client===r&&n.hello===t.hello},o=e.entry;if(!o.expectedRevisionHash){let t=await r.request(`skills.proposals.inspect`,{agentId:n(o.proposalAgentId),proposalId:o.proposalId});if(!a())throw Error(`Revision request was interrupted before proposal inspection completed.`);let i=t.revisionHash?.trim();if(!i)throw Error(`The proposal revision binding is unavailable.`);let s=t.record.origin,c=e.materialize({expectedRevisionHash:i,...s?.agentId?{proposalOriginAgentId:s.agentId}:{},...s?.sessionKey?{proposalOriginSessionKey:s.sessionKey}:{}});if(!c)throw Error(`Revision recovery is no longer available.`);o=c}if(!o.expectedRevisionHash)throw Error(`Revision recovery is no longer available.`);let s=await Dt(o,e.context,a);if(!s)throw Error(`Revision request was interrupted before admission.`);let c=await r.request(`skills.proposals.requestRevision`,{agentId:n(o.proposalOriginAgentId??o.proposalAgentId),targetAgentId:s.targetAgentId,proposalId:o.proposalId,expectedRevisionHash:o.expectedRevisionHash,instructions:o.instructions,sessionKey:s.sessionKey,...s.sessionId?{sessionId:s.sessionId}:{},idempotencyKey:o.idempotencyKey}).catch(e=>{if(i(e))return{status:`revision-changed`};throw e});if(c.status===`revision-changed`)return c;if(c.status!==`started`&&c.status!==`in_flight`&&c.status!==`ok`)throw Error(`Gateway returned ${c.status} before admitting the revision request.`);return{sessionKey:s.sessionKey,status:`admitted`}}function At(){return(At=e((()=>{c(),d(),Ot()})))()}function U(e){let t=W.get(e);return t||(t=St(),W.set(e,t),e.lifecycleAbortSignal?.addEventListener(`abort`,()=>{t?.dispose(),W.delete(e)},{once:!0})),t}var W,jt;function Mt(){return(Mt=e((()=>{Ct(),O(),ee(),j(),At(),W=new WeakMap,jt=class{constructor(e){this.requestUpdate=e,this.recoveryId=null}get active(){return this.recoveryId!==null}request(e){let t=U(e.context),n=this.recoveryId?t.retry(this.recoveryId):t.start({...e.expectedRevisionHash?{expectedRevisionHash:e.expectedRevisionHash}:{},instructions:e.instructions,proposalAgentId:e.proposalAgentId,proposalId:e.proposal.key,...e.proposal.origin?.agentId?{proposalOriginAgentId:e.proposal.origin.agentId}:{},...e.proposal.origin?.sessionKey?{proposalOriginSessionKey:e.proposal.origin.sessionKey}:{},proposalSlug:e.proposal.slug,useCurrentChatForRevisions:e.state.skillWorkshopUseCurrentChatForRevisions},(t,n)=>kt({context:e.context,entry:t,materialize:n}));return n?(this.recoveryId=n.entry.id,n.completion):Promise.resolve({error:`Revision recovery is no longer available.`,id:this.recoveryId??`missing`,status:`retryable-failed`})}sync(e,t){if(this.recoveryId){let n=U(e).get(this.recoveryId);if(n?.phase===`retryable-failed`){this.restore(t,n);return}if(n)return;this.recoveryId=null;let r=!!(t.skillWorkshopRevisionKey||t.skillWorkshopRevisionDraft||t.skillWorkshopActionBusy||t.skillWorkshopError);t.skillWorkshopRevisionKey=null,t.skillWorkshopRevisionDraft=``,t.skillWorkshopActionBusy=null,t.skillWorkshopError=null,r&&this.requestUpdate()}if(t.skillWorkshopRevisionKey||t.skillWorkshopRevisionDraft)return;let n=U(e).firstFailed($e(e));n&&(this.recoveryId=n.id,this.restore(t,n))}restore(e,t){let n=k(`skillWorkshop.revision.notAdmitted`,{error:g(t.error??`Retry the revision request.`)}),r=e.skillWorkshopRevisionKey!==t.proposalId||e.skillWorkshopRevisionDraft!==t.instructions||e.skillWorkshopActionBusy!==null||e.skillWorkshopError!==n;e.skillWorkshopRevisionKey=t.proposalId,e.skillWorkshopRevisionDraft=t.instructions,e.skillWorkshopActionBusy=null,e.skillWorkshopError=n,r&&this.requestUpdate()}}})))()}function Nt(e){let{state:t,context:n}=e;return t&&n?{state:t,context:n,epoch:e.epoch,gateway:n.gateway,agentSelection:n.agentSelection,sessions:n.sessions,navigate:n.navigate}:null}function Pt(e,t){let n=t.context;return t.state===e.state&&n===e.context&&t.epoch===e.epoch&&n?.gateway===e.gateway&&n.agentSelection===e.agentSelection&&n.sessions===e.sessions&&n.navigate===e.navigate}function Ft(e){let t=e.split(`
`),n=[];for(let e=0;e<t.length;e+=K)n.push(t.slice(e,e+K).join(`
`));return n}function It(e){let t=e.split(`.`).pop()?.toLowerCase()??``;return{md:`Markdown`,txt:k(`filePreview.kind.text`),json:`JSON`,yaml:`YAML`,yml:`YAML`,ts:`TypeScript`,js:`JavaScript`,py:`Python`,sh:k(`filePreview.kind.shell`)}[t]??(t?t.toUpperCase():k(`filePreview.kind.file`))}function Lt(e){return Rt[ze(e)]}var G,K,Rt;function zt(){return(zt=e((()=>{y(),ge(),O(),te(),Be(),Re(),w(),E(),G=class extends fe{constructor(...e){super(...e),this.files=[],this.activePath=``,this.query=``,this.label=``,this.listLabel=``,this.searchPlaceholder=``,this.contextLabel=``,this.readOnlyLabel=``,this.emptyTitle=``,this.emptySubtitle=``,this.copyLabel=``,this.filteredFiles=[],this.derivedInputsReady=!1,this.codeChunks=[],this.resetScrollAfterUpdate=!0,this.focusAfterUpdate=!1,this.handleQueryInput=e=>{let t=e.target.value??``;this.dispatchEvent(new CustomEvent(`file-preview-query-change`,{bubbles:!0,composed:!0,detail:t}))},this.preventItemPointerFocus=e=>{e.preventDefault()},this.handleKeydown=e=>{switch(e.key){case`Escape`:e.preventDefault(),e.stopPropagation(),this.emitClose();return;case`ArrowDown`:this.moveSelection(1,e);return;case`ArrowUp`:this.moveSelection(-1,e)}},this.emitClose=()=>{this.dispatchEvent(new CustomEvent(`file-preview-close`,{bubbles:!0,composed:!0}))}}static{this.styles=xe`
:host {
display: contents;
}
.modal {
width: 100%;
height: min(780px, 86vh);
background: var(--bg);
border: 1px solid var(--border-strong);
border-radius: var(--radius-lg);
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
display: flex;
flex-direction: column;
overflow: hidden;
}
.head {
display: flex;
align-items: center;
gap: 12px;
padding: 16px 20px;
border-bottom: 1px solid var(--border);
background: var(--bg);
}
.search-icon {
color: var(--muted);
font-size: 18px;
}
.search {
flex: 1;
min-width: 0;
background: transparent;
border: none;
outline: none;
color: var(--text-strong);
font: inherit;
font-size: 18px;
font-weight: 400;
padding: 4px 0;
}
.search:focus,
.search:focus-visible {
outline: none;
border: none;
box-shadow: none;
}
.search::placeholder {
color: var(--muted);
}
.state {
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 12px;
color: var(--muted);
padding: 5px 10px;
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--bg-elevated);
}
.body {
flex: 1;
display: grid;
grid-template-columns: 360px 1fr;
min-height: 0;
}
.list {
border-right: 1px solid var(--border);
padding: 14px 10px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 2px;
}
.list-section {
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--muted);
padding: 4px 12px 8px;
}
.item {
display: grid;
grid-template-columns: 16px 1fr auto;
gap: 12px;
align-items: center;
padding: 12px 14px;
border-radius: var(--radius-md);
border: none;
background: transparent;
color: var(--text);
font: inherit;
outline: none;
text-align: left;
}
.item:focus-visible {
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 55%, transparent);
}
.item:hover {
background: var(--bg-elevated);
}
.item.is-active {
background: var(--accent-subtle);
}
.item.is-active .item-name {
color: var(--text-strong);
}
.item-icon {
width: 16px;
height: 16px;
display: inline-flex;
align-items: center;
justify-content: center;
color: var(--muted);
opacity: 0.85;
}
.item.is-active .item-icon {
color: var(--accent);
opacity: 1;
}
.item-icon svg,
.chat-copy-btn svg {
width: 16px;
height: 16px;
stroke: currentColor;
fill: none;
stroke-width: 1.5px;
stroke-linecap: round;
stroke-linejoin: round;
}
.item-name {
font-family: var(--mono);
font-size: 14px;
color: var(--text);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.item-meta {
color: var(--muted);
font-size: 12px;
}
.empty-list {
color: var(--muted);
font-size: 13px;
padding: 12px;
}
.detail {
display: flex;
flex-direction: column;
min-width: 0;
min-height: 0;
}
.detail.empty {
align-items: center;
justify-content: center;
text-align: center;
padding: 24px;
}
.detail-head {
padding: 20px 24px 14px;
border-bottom: 1px solid var(--border);
}
.detail-title-row {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 10px;
}
.title {
flex: 1;
min-width: 0;
margin: 0;
font-family: var(--mono);
font-size: 22px;
color: var(--text-strong);
font-weight: 700;
letter-spacing: -0.01em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.chat-copy-btn {
width: 32px;
height: 32px;
display: inline-flex;
align-items: center;
justify-content: center;
flex: 0 0 auto;
padding: 0;
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--bg-elevated);
color: var(--muted);
}
.chat-copy-btn:hover {
border-color: var(--border-strong);
color: var(--text-strong);
}
.chat-copy-btn:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.chat-copy-btn__icon {
display: inline-flex;
width: 16px;
height: 16px;
position: relative;
}
.chat-copy-btn__icon-copy,
.chat-copy-btn__icon-check {
position: absolute;
inset: 0;
transition: opacity 150ms ease;
}
.chat-copy-btn__icon-check,
.chat-copy-btn[data-copy-state="copied"] .chat-copy-btn__icon-copy {
opacity: 0;
}
.chat-copy-btn[data-copy-state="copied"] .chat-copy-btn__icon-check {
opacity: 1;
}
.chat-copy-btn[data-copy-state="copying"] {
opacity: 0;
pointer-events: none;
}
.chat-copy-btn[data-copy-state="error"] {
border-color: var(--danger-subtle);
background: var(--danger-subtle);
color: var(--danger);
}
.chat-copy-btn[data-copy-state="copied"] {
border-color: var(--ok-subtle);
background: var(--ok-subtle);
color: var(--ok);
}
.chips {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.chip {
display: inline-flex;
align-items: center;
padding: 3px 10px;
border-radius: 999px;
font-size: 11.5px;
background: var(--bg-elevated);
border: 1px solid var(--border);
color: var(--muted);
}
.chip.accent {
background: var(--accent-subtle);
border-color: color-mix(in srgb, var(--accent) 30%, transparent);
color: var(--accent);
}
.chip.ok {
background: color-mix(in srgb, var(--ok) 12%, transparent);
border-color: color-mix(in srgb, var(--ok) 30%, transparent);
color: var(--ok);
}
.detail-body {
flex: 1;
overflow-x: hidden;
overflow-y: auto;
padding: 20px 24px 24px;
}
.code-content {
min-width: 0;
}
.code-chunk {
margin: 0;
min-width: 0;
font-family: var(--mono);
font-size: 13px;
line-height: 1.7;
color: var(--text);
white-space: pre-wrap;
word-break: break-word;
content-visibility: auto;
contain-intrinsic-block-size: auto 1414px;
}
.foot {
display: flex;
align-items: center;
gap: 18px;
padding: 12px 20px;
border-top: 1px solid var(--border);
background: var(--bg);
font-size: 12px;
color: var(--muted);
}
.foot-group {
display: inline-flex;
align-items: center;
gap: 6px;
}
.kbd {
font-family: var(--mono);
font-size: 10.5px;
padding: 2px 6px;
border: 1px solid var(--border);
border-radius: 4px;
background: var(--bg-elevated);
color: var(--text);
}
.spacer {
flex: 1;
}
.button {
height: 36px;
padding: 0 14px;
border-radius: var(--radius-md);
border: 1px solid var(--border);
background: var(--bg-elevated);
color: var(--text);
font-weight: 600;
}
.button:hover {
border-color: var(--border-strong);
color: var(--text-strong);
}
.empty-title {
font-size: 16px;
font-weight: 600;
color: var(--text-strong);
margin: 0 0 8px;
}
.empty-subtitle {
margin: 0;
font-size: 13px;
color: var(--muted);
max-width: 380px;
}
@media (max-width: 640px) {
.head {
padding: 12px;
}
.body {
grid-template-columns: minmax(0, 1fr);
grid-template-rows: minmax(0, min(180px, 30dvh)) minmax(0, 1fr);
}
.list {
min-width: 0;
border-right: 0;
border-bottom: 1px solid var(--border);
padding: 10px 8px;
}
.item {
min-width: 0;
}
.foot {
gap: 8px;
padding: 10px 12px;
}
}
`}willUpdate(e){if(!(!this.derivedInputsReady||e.has(`activePath`)||e.has(`query`)||e.has(`files`)))return;this.derivedInputsReady=!0,this.filteredFiles=this.filterFiles();let t=this.resolveActiveFile(this.filteredFiles);this.activeFile=t;let n=t?.contents;n!==this.codeSource&&(this.codeSource=n,this.codeChunks=n===void 0?[]:Ft(n)),this.resetScrollAfterUpdate=!0}render(){let e=this.filteredFiles,t=this.activeFile,n=e.length===this.files.length?k(`filePreview.fileCount`,{count:String(this.files.length)}):k(`filePreview.filteredFileCount`,{count:String(e.length),total:String(this.files.length)}),r=this.label||k(`filePreview.label`),i=this.listLabel||k(`filePreview.listLabel`),a=this.searchPlaceholder||k(`filePreview.searchPlaceholder`);return b`
<openclaw-modal-dialog
label=${r}
style="--openclaw-modal-width: min(1100px, 92vw); --openclaw-modal-max-height: 86vh;"
@modal-cancel=${this.emitClose}
@keydown=${this.handleKeydown}
>
<div class="modal">
<header class="head">
<span class="search-icon">⌕</span>
<input
class="search"
placeholder=${a}
.value=${this.query}
@input=${this.handleQueryInput}
/>
<span class="state">${n}</span>
</header>
<div class="body">
<aside class="list">
<div class="list-section">${i} · ${e.length}</div>
${e.length===0?b`<div class="empty-list">${k(`filePreview.noMatches`)}</div>`:e.map(e=>b`
<button
class="item ${e.path===t?.path?`is-active`:``}"
@pointerdown=${this.preventItemPointerFocus}
@mousedown=${this.preventItemPointerFocus}
@click=${()=>this.emitSelect(e.path)}
>
<span class="item-icon">${Lt(e.path)}</span>
<span class="item-name">${e.path}</span>
<span class="item-meta">${e.size}</span>
</button>
`)}
</aside>
${t?this.renderFile(t):this.renderEmpty()}
</div>
<footer class="foot">
<span class="foot-group"><span class="kbd">↑↓</span> ${k(`filePreview.navigate`)}</span>
<span class="spacer"></span>
<button class="button" @click=${this.emitClose}>
${k(`common.close`)} <span class="kbd">esc</span>
</button>
</footer>
</div>
</openclaw-modal-dialog>
`}renderFile(e){return b`
<section class="detail">
<div class="detail-head">
<div class="detail-title-row">
<h2 class="title">${e.path}</h2>
${e.contents?Ve(e.contents,this.copyLabel||k(`filePreview.copyFile`)):``}
</div>
<div class="chips">
<span class="chip accent">${It(e.path)}</span>
<span class="chip">${e.size}</span>
<span class="chip">${this.readOnlyLabel||k(`filePreview.readOnly`)}</span>
${this.contextLabel?b`<span class="chip ok">${this.contextLabel}</span>`:``}
</div>
</div>
<div class="detail-body">
<div class="code-content">
${this.codeChunks.map((e,t)=>b`<pre class="code-chunk" data-chunk=${t}>${e}</pre>`)}
</div>
</div>
</section>
`}renderEmpty(){return b`
<section class="detail empty">
<p class="empty-title">${this.emptyTitle||k(`filePreview.emptyTitle`)}</p>
<p class="empty-subtitle">${this.emptySubtitle||k(`filePreview.emptySubtitle`)}</p>
</section>
`}filterFiles(){let e=this.query.trim().toLowerCase();return e?this.files.filter(t=>`${t.path}\n${t.contents}`.toLowerCase().includes(e)):this.files}resolveActiveFile(e){return e.find(e=>e.path===this.activePath)??e[0]}connectedCallback(){super.connectedCallback(),this.resetScrollAfterUpdate=!0,this.focusAfterUpdate=!0,this.requestUpdate()}updated(e){if(this.resetScrollAfterUpdate){this.resetScrollAfterUpdate=!1;let e=this.detailBody;e&&(e.scrollTop=0,e.scrollLeft=0)}(e.has(`activePath`)||e.has(`query`)||e.has(`files`))&&this.scrollActiveFileIntoView(),this.focusAfterUpdate&&this.isConnected&&(this.focusAfterUpdate=!1,this.focusModal())}focusModal(){(this.searchInput??this.shadowRoot?.querySelector(`.modal`))?.focus({preventScroll:!0})}moveSelection(e,t){t.preventDefault(),t.stopPropagation();let n=this.filterFiles();if(n.length===0)return;let r=this.resolveActiveFile(n),i=r?n.findIndex(e=>e.path===r.path):-1,a=n[Math.max(0,Math.min(n.length-1,i+e))];a&&a.path!==r?.path&&this.emitSelect(a.path)}scrollActiveFileIntoView(){this.updateComplete.then(()=>{this.isConnected&&this.shadowRoot?.querySelector(`.item.is-active`)?.scrollIntoView({block:`nearest`})}).catch(()=>{})}emitSelect(e){this.dispatchEvent(new CustomEvent(`file-preview-select`,{bubbles:!0,composed:!0,detail:e})),this.focusModal()}},l([C({attribute:!1})],G.prototype,`files`,void 0),l([C()],G.prototype,`activePath`,void 0),l([C()],G.prototype,`query`,void 0),l([C()],G.prototype,`label`,void 0),l([C()],G.prototype,`listLabel`,void 0),l([C()],G.prototype,`searchPlaceholder`,void 0),l([C()],G.prototype,`contextLabel`,void 0),l([C()],G.prototype,`readOnlyLabel`,void 0),l([C()],G.prototype,`emptyTitle`,void 0),l([C()],G.prototype,`emptySubtitle`,void 0),l([C()],G.prototype,`copyLabel`,void 0),l([we(`.search`)],G.prototype,`searchInput`,void 0),l([we(`.detail-body`)],G.prototype,`detailBody`,void 0),K=64,Rt={code:D.fileCode,component:D.layoutGrid,data:D.braces,file:D.fileText,image:D.image,markdown:D.book,package:D.box,shell:D.terminal}})))()}function Bt(){return(Bt=e((()=>{zt(),customElements.get(`openclaw-file-preview-modal`)||customElements.define(`openclaw-file-preview-modal`,G)})))()}function Vt(){return Jt??=s(()=>import(`./applied-history.runtime-Aovx0ctz.js`).then(e=>(q=e,e)),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]),import.meta.url)}function Ht(){return b`<p class="sw-muted" aria-busy="true">${k(`common.loading`)}</p>`}function Ut(e,t,n){let r=tt(e,t),i=r.find(e=>e.revisions.some(({proposal:e})=>e.key===n))??r[0];return{skills:r,selectedSkill:i,selectedProposal:i?.revisions.find(({proposal:e})=>e.key===n)?.proposal??i?.latest}}function Wt(e,t,n){return!n||e.appliedDiffMode===`full`?{kind:`full`}:n.bodyLoaded?n.body.length+t.body.length>qt?{kind:`tooLarge`}:{kind:`diff`,previous:n}:e.inspectingKey===n.key?{kind:`loadingPrevious`}:{kind:`previousUnavailable`}}function Gt(e,t){return q?q.renderAppliedHistory(e,t):S(Vt().then(n=>n.renderAppliedHistory(e,t)),Ht())}function Kt(e,t){return q?q.renderAppliedRevisionDiff(e,t):S(Vt().then(n=>n.renderAppliedRevisionDiff(e,t)),Ht())}var qt,q,Jt;function Yt(){return(Yt=e((()=>{y(),Se(),O(),o(),qt=12e4})))()}function Xt(e,t){let n=Zt(e,t);return b`
<div class="sw-detail sw-detail--empty">
<div class="sw-filter-empty">
<div class="sw-filter-empty__icon" aria-hidden="true">
${Qt(n.icon)}
</div>
<p class="sw-empty__title">${n.title}</p>
<p class="sw-empty__sub">${n.body}</p>
</div>
</div>
`}function Zt(e,t){if(e.trim())return{icon:`search`,title:k(`skillWorkshop.empty.searchTitle`),body:k(`skillWorkshop.empty.searchBody`)};switch(t){case`pending`:return{icon:`clock`,title:k(`skillWorkshop.empty.pendingTitle`),body:k(`skillWorkshop.empty.pendingBody`)};case`applied`:return{icon:`check`,title:k(`skillWorkshop.empty.appliedTitle`),body:k(`skillWorkshop.empty.appliedBody`)};case`rejected`:return{icon:`x`,title:k(`skillWorkshop.empty.rejectedTitle`),body:k(`skillWorkshop.empty.rejectedBody`)};case`quarantined`:return{icon:`shield`,title:k(`skillWorkshop.empty.quarantinedTitle`),body:k(`skillWorkshop.empty.quarantinedBody`)};case`stale`:return{icon:`refresh`,title:k(`skillWorkshop.empty.staleTitle`),body:k(`skillWorkshop.empty.staleBody`)};case`all`:return{icon:`search`,title:k(`skillWorkshop.empty.allTitle`),body:k(`skillWorkshop.empty.allBody`)}}return{icon:`search`,title:k(`skillWorkshop.empty.allTitle`),body:k(`skillWorkshop.empty.allBody`)}}function Qt(e){return en[e]}function $t(e){return b`
<div class="sw-empty-state">
<section class="sw-empty-state__panel" aria-label=${k(`skillWorkshop.empty.noProposalsAria`)}>
<div class="sw-empty-state__glyph" aria-hidden="true">
<span></span>
<span></span>
<span></span>
</div>
<p class="sw-empty-state__eyebrow">${k(`skillWorkshop.title`)}</p>
<h2>${k(`skillWorkshop.empty.noProposalsTitle`)}</h2>
<p>${k(`skillWorkshop.empty.noProposalsBody`,{agent:e.agentName})}</p>
<div class="sw-empty-state__footer">${k(`skillWorkshop.empty.noProposalsFooter`)}</div>
${ut(e.selfLearning,e.onSelfLearningToggle)}
</section>
</div>
`}var en;function tn(){return(tn=e((()=>{y(),w(),O(),L(),en={search:D.search,clock:D.clock,check:D.check,x:D.x,shield:D.shieldCheck,refresh:D.refresh}})))()}function nn(e,t,n,r,i){let a=t.reduce((e,t)=>e+t.items.length,0),o=new Map(r.map(e=>[e.slug,e]));return b`
<aside class="sw-queue">
<div class="sw-queue__search">
<input
placeholder=${k(`skillWorkshop.queue.search`)}
.value=${e.query}
@input=${t=>e.onQueryChange(t.currentTarget.value??``)}
/>
</div>
<div class="sw-queue__body">
${a===0?b`<div class="sw-queue__empty">${i}</div>`:t.map(t=>b`
<div class="sw-queue__group">
${k(t.label)}
<span class="settings-count">${t.items.length}</span>
</div>
${t.items.map(t=>rn(e,t,n,o.get(t.slug)))}
`)}
</div>
</aside>
`}function rn(e,t,n,r){let i=r?.latest??t,a=r?r.revisions.some(({proposal:t})=>t.key===e.selectedKey):n?.key===t.key,o=r?.revisions.length===1?`skillWorkshop.applied.revision`:`skillWorkshop.applied.revisions`;return b`
<button
class="sw-row ${i.isNew?`is-new`:`is-seen`} ${a?`is-selected`:``}"
@click=${()=>e.onSelect(i.key)}
>
<span class="sw-row__dot"></span>
<span>
<span class="sw-row__title">${r?.slug??t.name}</span>
<span class="sw-row__desc">${i.oneLine}</span>
</span>
${r?b`
<span class="sw-row__meta sw-row__meta--applied">
<span class="sw-row__revision-count">
${k(o,{count:String(r.revisions.length)})}
</span>
<span>${i.ageLabel}</span>
</span>
`:b`<span class="sw-row__meta">${t.ageLabel}</span>`}
</button>
`}function an(){return(an=e((()=>{y(),O()})))()}function on(e){let t=e.statusFilter===`applied`?Ut(e.proposals,e.query,e.selectedKey):void 0,n=t?t.skills.map(e=>e.latest):M(e.proposals,e.statusFilter,e.query),r=t?.selectedProposal??n.find(t=>t.key===e.selectedKey)??n[0],i=Nn(n),a=r&&e.filePreviewKey?r.supportFiles.find(t=>t.path===e.filePreviewKey):null,o=e.revisionKey?e.proposals.find(t=>t.key===e.revisionKey):null,s=e.proposals.filter(e=>e.status===`pending`),c=r??s[0]??e.proposals[0],l=e.proposals.length===0&&!e.loading&&!e.error?$t({agentName:_n(e,k(`skillWorkshop.empty.defaultAgent`)),selfLearning:e.selfLearning,onSelfLearningToggle:e.onSelfLearningToggle}):e.mode===`today`?vn(e,c,s):cn(e,i,r,t?.skills??[],t?.selectedSkill);return b`
<section class="skill-workshop sw-mode-${e.mode}">
${e.error?b`<div class="sw-error" role="status">
<span>${e.error}</span>
<button type="button" class="btn btn--sm" @click=${e.onRetry}>
${k(`pluginsPage.tryAgain`)}
</button>
</div>`:x}
${dt(e.selfLearning)}
${Je({state:e.historyScan,canScan:e.access.canScanHistory,onScan:e.onHistoryScan})}
<div class="sw-view" data-mode=${e.mode}>
${Te(e.mode,b`<div class="sw-view__pane">${l}</div>`)}
</div>
</section>
${a&&r?b`
<openclaw-file-preview-modal
.files=${r.supportFiles}
.activePath=${a.path}
.query=${e.filePreviewQuery}
.contextLabel=${k(`skillWorkshop.previewContext`,{slug:r.slug})}
@file-preview-query-change=${t=>e.onFilePreviewQueryChange(t.detail)}
@file-preview-select=${t=>e.onPreviewFile(r.key,t.detail)}
@file-preview-close=${e.onClosePreview}
></openclaw-file-preview-modal>
`:x}
${o?sn(e,o):x}
`}function sn(e,t){let n=e.actionBusy?.key===t.key&&e.actionBusy.action===`revise`,r=!!e.actionBusy||e.revisionRecoveryActive,i=e.access.canRevise&&e.revisionDraft.trim().length>0&&!e.actionBusy,a=e.mode===`board`?k(`skillWorkshop.actions.revise`):k(`skillWorkshop.actions.tweak`);return b`
<openclaw-modal-dialog
.label=${`${k(`skillWorkshop.revision.title`,{verb:a})}: ${t.slug}`}
.description=${k(`skillWorkshop.revision.description`)}
style="--openclaw-modal-width: 560px"
@modal-cancel=${r?void 0:e.onRevisionCancel}
>
<section class="sw-revision-dialog ${n?`sw-revision-dialog--sending`:``}">
<div class="sw-revision-dialog__head">
<div>
<div class="sw-revision-dialog__eyebrow">
${k(`skillWorkshop.revision.title`,{verb:a})}
</div>
<h2 id="sw-revision-title">${t.slug}</h2>
</div>
<openclaw-tooltip content=${k(`skillWorkshop.actions.close`)}>
<button
type="button"
class="sw-revision-dialog__close"
aria-label=${k(`skillWorkshop.actions.close`)}
?disabled=${r}
@click=${e.onRevisionCancel}
>
×
</button>
</openclaw-tooltip>
</div>
<p class="sw-revision-dialog__copy">${k(`skillWorkshop.revision.description`)}</p>
<textarea
class="sw-revision-dialog__input"
autofocus
placeholder=${k(`skillWorkshop.revision.placeholder`)}
.value=${e.revisionDraft}
?disabled=${!e.access.canRevise||!!e.actionBusy||e.revisionRecoveryActive}
@input=${t=>e.onRevisionDraftChange(t.target.value??``)}
></textarea>
${n?b`
<div class="sw-revision-dialog__status" role="status">
<span class="sw-revision-dialog__status-dot" aria-hidden="true"></span>
<span>${k(`skillWorkshop.revision.preparing`)}</span>
</div>
`:x}
<div class="sw-revision-dialog__actions">
<button
type="button"
class="sw-btn sw-btn--ghost"
?disabled=${r}
@click=${e.onRevisionCancel}
>
${k(`skillWorkshop.actions.cancel`)}
</button>
<button
type="button"
class="sw-btn sw-btn--primary ${n?`is-busy`:``}"
?disabled=${!i}
@click=${()=>e.onRevisionSubmit(t.key)}
>
${k(n?`skillWorkshop.actions.sending`:`skillWorkshop.revision.send`)}
</button>
</div>
</section>
</openclaw-modal-dialog>
`}function cn(e,t,n,r,i){return b`
${un(e)}
<div class="sw-triage" style=${Ce({"--sw-queue-width":`${e.queueWidth}px`})}>
${nn(e,t,n,r,Pn(e))}
${ln(e)}
${n?mn(e,n,i):Xt(e.query,e.statusFilter)}
</div>
`}function ln(e){let t,n=()=>(t?.previousElementSibling?.getBoundingClientRect().width??0)+(t?.nextElementSibling?.getBoundingClientRect().width??0);return b`<resizable-divider
${_e(e=>t=e instanceof HTMLElement?e:void 0)}
class="sw-queue-resizer"
.label=${k(`skillWorkshop.queue.resize`)}
.splitRatio=${.5}
.minRatio=${.2}
.maxRatio=${.8}
.measureRatio=${()=>e.queueWidth/n()}
.measureSize=${n}
@resize=${t=>e.onQueueWidthChange(t.detail.splitRatio*n())}
></resizable-divider>`}function un(e){return b`
<div class="sw-lifecycle-tabs">
${Fn.map(t=>{let n=e.statusFilter===t,r=e.counts[t]??0;return b`
<button
class="sw-lifecycle-tab ${n?`is-active`:``}"
@click=${()=>e.onStatusFilterChange(t)}
>
${k(Z[t])} <span class="settings-count">${r}</span>
</button>
`})}
</div>
`}function dn(e,t,n){let r=e.appliedDiffMode===t;return b`
<button
class="sw-body-mode__button ${r?`is-active`:``}"
aria-pressed=${r?`true`:`false`}
@click=${()=>e.onAppliedDiffModeChange(t)}
>
${n}
</button>
`}function fn(e){return b`
<div class="sw-body-mode" role="group" aria-label=${k(`skillWorkshop.diff.viewLabel`)}>
${dn(e,`changes`,k(`skillWorkshop.diff.changes`))}
${dn(e,`full`,k(`skillWorkshop.diff.fullBody`))}
</div>
`}function pn(e,t){return e.kind===`diff`?Kt(e.previous.body,t.body):e.kind===`loadingPrevious`?b`<p class="sw-muted" aria-busy="true">
${k(`skillWorkshop.diff.loadingPrevious`)}
</p>`:e.kind===`previousUnavailable`?b`
<p class="sw-muted">${k(`skillWorkshop.diff.previousUnavailable`)}</p>
${jn(t.body)}
`:e.kind===`tooLarge`?b`<p class="sw-muted">${k(`skillWorkshop.diff.tooLarge`)}</p>`:jn(t.body)}function mn(e,t,n){let r=t.updatedAt&&t.updatedAt>t.createdAt?t.updatedAt:null,i=r?k(`skillWorkshop.detail.edited`,{time:X(r)}):k(`skillWorkshop.detail.created`,{time:X(t.createdAt)}),a=e.inspectingKey===t.key&&!t.bodyLoaded,o=t.supportFiles[0],s=n?.revisions.find(({proposal:e})=>e.key===t.key)?.previous??null,c=Wt(e,t,s);return b`
<div class="sw-detail">
<div class="sw-detail__head">
<div class="sw-detail__head-left">
<h1 class="sw-detail__title">${t.name}</h1>
<div class="sw-detail__one-line">${t.oneLine}</div>
<div class="sw-detail__meta">
<span>${i}</span>
<span>·</span>
<span>v${t.version}</span>
<span>·</span>
${o?b`<button
class="sw-detail__meta-link"
@click=${()=>e.onPreviewFile(t.key,o.path)}
>
${k(`skillWorkshop.detail.supportFiles`,{count:String(t.supportFiles.length)})}
</button>`:b`<span>${k(`skillWorkshop.detail.noSupportFiles`)}</span>`}
</div>
</div>
<div class="sw-detail__nav">
<openclaw-tooltip content=${k(`skillWorkshop.actions.previous`)}>
<button aria-label=${k(`skillWorkshop.actions.previous`)} @click=${e.onPrev}>
↑
</button>
</openclaw-tooltip>
<openclaw-tooltip content=${k(`skillWorkshop.actions.next`)}>
<button aria-label=${k(`skillWorkshop.actions.next`)} @click=${e.onNext}>↓</button>
</openclaw-tooltip>
</div>
</div>
<div class="sw-detail__body">
<div class="sw-body-card">
<div class="sw-body-card__head">
<h1>${t.slug}</h1>
${s?fn(e):x}
</div>
${a?b`<p class="sw-muted">${k(`skillWorkshop.detail.loading`)}</p>`:pn(c,t)}
</div>
${n?Gt(e,n):x}
${t.supportFiles.length>0?b`
<div class="sw-section" style="margin-top: 18px;">
<h3 class="sw-section__label">${k(`skillWorkshop.detail.supportFilesTitle`)}</h3>
<div class="sw-files">
${t.supportFiles.map(n=>b`
<button
class="sw-file"
@click=${()=>e.onPreviewFile(t.key,n.path)}
>
<span>📄</span>
<span class="sw-file__name">${n.path}</span>
<span class="sw-file__size"
>${n.size}
<span class="sw-file__hint"
>${k(`skillWorkshop.detail.clickToPreview`)}</span
></span
>
</button>
`)}
</div>
</div>
`:x}
${t.evaluation?Y(t.evaluation):x}
</div>
${e.actionNotice?.key===t.key?hn(e.actionNotice):x}
${t.status===`pending`?gn(e,t):x}
</div>
`}function hn(e){return b`
<div class="sw-action-toast" role="status" aria-live="polite">
<span>${e.label}</span>
<strong>${e.slug}</strong>
<span>·</span>
</div>
`}function J(e){return{proposalId:e.key,expectedRevisionHash:e.revisionHash}}function gn(e,t){let n=e.actionBusy?.key===t.key?e.actionBusy.action:null,r=!!e.actionBusy;return b`
<div class="sw-action-bar" aria-busy=${n?`true`:`false`}>
<button
class="sw-btn ${n===`evaluate`?`is-busy`:``}"
?disabled=${r||!e.access.canEvaluate}
@click=${()=>e.onEvaluate(t.key)}
>
${k(n===`evaluate`?`skillWorkshop.actions.evaluating`:`skillWorkshop.actions.evaluate`)}
</button>
<button
class="sw-btn sw-btn--primary ${n===`apply`?`is-busy`:``}"
?disabled=${r||!e.access.canApply}
@click=${()=>e.onApply(J(t))}
>
${k(n===`apply`?`skillWorkshop.actions.applying`:`skillWorkshop.actions.apply`)}
</button>
<button
class="sw-btn ${n===`revise`?`is-busy`:``}"
?disabled=${r||!e.access.canRevise}
@click=${()=>e.onRevise(t.key)}
>
${k(n===`revise`?`skillWorkshop.actions.opening`:`skillWorkshop.actions.revise`)}
</button>
<button
class="sw-btn sw-btn--ghost sw-btn--danger ${n===`reject`?`is-busy`:``}"
?disabled=${r||!e.access.canReject}
@click=${()=>e.onReject(J(t))}
>
${k(n===`reject`?`skillWorkshop.actions.rejecting`:`skillWorkshop.actions.reject`)}
</button>
</div>
`}function _n(e,t){return e.workshopAgentName.trim()||e.assistantName.trim()||t}function vn(e,t,n){if(!t)return b`
<div class="sw-today sw-today--empty">
<p class="sw-empty__title">${k(`skillWorkshop.today.emptyTitle`)}</p>
<p class="sw-empty__sub">${k(`skillWorkshop.today.emptyBody`)}</p>
</div>
`;let r=Math.max(0,n.findIndex(e=>e.key===t.key)),i=Math.max(n.length,1),a=n.filter(e=>e.key!==t.key).slice(0,3),o=e.proposals.filter(e=>e.status===`applied`).slice(0,3),s=t.isNew?k(`skillWorkshop.today.new`):t.status===`pending`?k(`skillWorkshop.today.waiting`):k(`skillWorkshop.today.reviewed`),c=t.ageLabel,l=An(Date.now()),u=t.status===`pending`,d=e.actionBusy?.key===t.key?e.actionBusy.action:null,f=!!e.actionBusy,p=_n(e,k(`skillWorkshop.today.agent`)),m=t.supportFiles[0];return b`
<div class="sw-today">
<div class="sw-today__head">
<div class="sw-today__date">${l}</div>
<h1 class="sw-today__h1">
${k(`skillWorkshop.today.proposalsWaiting`,{count:String(n.length)})}
</h1>
${n.length===0?b`<div class="sw-today__sub">${k(`skillWorkshop.today.browseApplied`)}</div>`:x}
${n.length>0?b`
<div class="sw-today__progress">
<span
>${k(`skillWorkshop.today.progress`,{current:String(r+1),total:String(i)})}</span
>
<div class="sw-today__dots">
${n.map((e,t)=>b`
<span
class="sw-today__dot ${t<r?`is-done`:t===r?`is-now`:``}"
></span>
`)}
</div>
</div>
`:x}
</div>
<article class="sw-today__hero">
<div class="sw-today__label">
<span class="sw-today__ping"></span>
${s} · ${c}
</div>
<h2 class="sw-today__name">${t.slug}</h2>
<p class="sw-today__one-liner">${t.oneLine}</p>
${Sn(t)}
<div class="sw-today__author">
<span class="sw-today__avatar">v${t.version}</span>
<span>
${k(`skillWorkshop.today.draftedBy`)}
<strong>${p}</strong> · ${c}.
${m?b`
<button
class="sw-today__files-link"
@click=${()=>e.onPreviewFile(t.key,m.path)}
>
${k(t.supportFiles.length===1?`skillWorkshop.today.supportFile`:`skillWorkshop.today.supportFiles`,{count:String(t.supportFiles.length)})}
</button>
${k(`skillWorkshop.today.comeWithIt`)}
`:x}
</span>
</div>
${t.evaluation?Y(t.evaluation,!0):x}
${u?b`
<div class="sw-today__actions" aria-busy=${d?`true`:`false`}>
<button
class="sw-today__big sw-today__big--evaluate ${d===`evaluate`?`is-busy`:``}"
?disabled=${f||!e.access.canEvaluate}
@click=${()=>e.onEvaluate(t.key)}
>
${k(d===`evaluate`?`skillWorkshop.actions.evaluating`:`skillWorkshop.today.evaluate`)}
<span class="sw-today__big-sub">${k(`skillWorkshop.today.runChecks`)}</span>
</button>
<button
class="sw-today__big sw-today__big--primary ${d===`apply`?`is-busy`:``}"
?disabled=${f||!e.access.canApply}
@click=${()=>e.onApply(J(t))}
>
${k(d===`apply`?`skillWorkshop.actions.applying`:`skillWorkshop.today.useIt`)}
<span class="sw-today__big-sub">${k(`skillWorkshop.today.addToSkills`)}</span>
</button>
<button
class="sw-today__big sw-today__big--tweak ${d===`revise`?`is-busy`:``}"
?disabled=${f||!e.access.canRevise}
@click=${()=>e.onRevise(t.key)}
>
${k(d===`revise`?`skillWorkshop.actions.opening`:`skillWorkshop.today.tweakIt`)}
<span class="sw-today__big-sub">${k(`skillWorkshop.today.askAgent`)}</span>
</button>
<button
class="sw-today__big sw-today__big--skip ${d===`reject`?`is-busy`:``}"
?disabled=${f||!e.access.canReject}
@click=${()=>e.onReject(J(t))}
>
${k(d===`reject`?`skillWorkshop.today.skipping`:`skillWorkshop.today.skip`)}
<span class="sw-today__big-sub">${k(`skillWorkshop.today.notForMe`)}</span>
</button>
</div>
`:x}
${e.actionNotice?.key===t.key?hn(e.actionNotice):x}
</article>
${a.length>0?b`
<section class="sw-today__section">
<header class="sw-today__section-head">
<h3>
${k(`skillWorkshop.today.upNext`,{count:String(n.length-1)})}
</h3>
<button class="sw-today__link" @click=${()=>e.onModeChange(`board`)}>
${k(`skillWorkshop.today.seeAll`)}
</button>
</header>
<div class="sw-today__upnext">
${a.map(t=>b`
<button class="sw-today__mini" @click=${()=>e.onSelect(t.key)}>
<div class="sw-today__mini-name">${t.slug}</div>
<div class="sw-today__mini-desc">${t.oneLine}</div>
<div class="sw-today__mini-meta">${t.ageLabel}</div>
</button>
`)}
</div>
</section>
`:x}
${o.length>0?b`
<section class="sw-today__section">
<header class="sw-today__section-head">
<h3>
${k(`skillWorkshop.today.collection`,{count:String(e.counts.applied)})}
</h3>
<button
class="sw-today__link sw-today__link--muted"
@click=${()=>e.onModeChange(`board`)}
>
${k(`skillWorkshop.today.manage`)}
</button>
</header>
<div class="sw-today__applied">
${o.map(t=>b`
<button
class="sw-today__applied-row"
@click=${()=>{e.onSelect(t.key),e.onModeChange(`board`)}}
>
<span class="sw-today__check">✓</span>
<span class="sw-today__applied-name">
<strong>${t.slug}</strong> — ${t.oneLine}
</span>
<span class="sw-today__applied-when">${t.ageLabel}</span>
</button>
`)}
</div>
</section>
`:x}
</div>
`}function Y(e,t=!1){let n=Date.parse(e.completedAt);return b`
<section class="sw-evaluation ${t?`sw-evaluation--today`:``}">
<header class="sw-evaluation__head">
<h3>${k(`skillWorkshop.evaluation.title`)}</h3>
<div class="sw-evaluation__meta">
<span>
${k(`skillWorkshop.evaluation.version`,{version:e.proposedVersion})}
</span>
${Number.isFinite(n)?b`<span>
${k(`skillWorkshop.evaluation.completedAt`,{time:X(n)})}
</span>`:x}
</div>
</header>
<div class="sw-evaluation__outcomes">
${e.outcomes.map(e=>yn(e))}
</div>
</section>
`}function yn(e){let t=e.result,n=e.pluginVersion?`${e.pluginId} ${e.pluginVersion}`:e.pluginId;return b`
<section class="sw-evaluation__outcome">
<div class="sw-evaluation__outcome-head">
<div class="sw-evaluation__identity">
<strong>${e.evaluatorId}</strong>
<span>${n}</span>
</div>
<div class="sw-evaluation__badges">
<span class="sw-evaluation__badge is-${e.status}">
${k(`skillWorkshop.evaluation.status.${e.status}`)}
</span>
${t?.decision?b`<span class="sw-evaluation__badge is-${t.decision}">
${k(`skillWorkshop.evaluation.decision.${t.decision}`)}
</span>`:x}
</div>
</div>
${t?.summary?b`<p class="sw-evaluation__summary">${t.summary}</p>`:x}
${t?.decisionReason?b`<p class="sw-evaluation__reason">
${h(t.decisionReason)}
</p>`:x}
${e.error?b`<p class="sw-evaluation__error">${h(e.error)}</p>`:x}
${t?.findings?.length?bn(t.findings):x}
${t?.metrics&&Object.keys(t.metrics).length>0?xn(t.metrics):x}
${t?.evaluatorVersion||t?.mode?b`
<div class="sw-evaluation__runtime">
${t.evaluatorVersion?b`<span>
${k(`skillWorkshop.evaluation.evaluatorVersion`,{version:t.evaluatorVersion})}
</span>`:x}
${t.mode?b`<span>
${k(`skillWorkshop.evaluation.mode`,{mode:t.mode})}
</span>`:x}
</div>
`:x}
</section>
`}function bn(e){return b`
<div class="sw-evaluation__findings">
<h4>${k(`skillWorkshop.evaluation.findings`)}</h4>
<ul>
${e.map(e=>{let t=e.file?e.line?k(`skillWorkshop.evaluation.fileLine`,{file:e.file,line:String(e.line)}):e.file:null;return b`
<li>
<span class="sw-evaluation__severity is-${e.severity}">
${k(`skillWorkshop.evaluation.severity.${e.severity}`)}
</span>
<span>
<code class="sw-evaluation__rule">${e.ruleId}</code>
${h(e.message)}
${t?b`<small>${t}</small>`:x}
</span>
</li>
`})}
</ul>
</div>
`}function xn(e){return b`
<div class="sw-evaluation__metrics">
<h4>${k(`skillWorkshop.evaluation.metrics`)}</h4>
<dl>
${Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>b`
<div>
<dt>${e}</dt>
<dd>${String(t)}</dd>
</div>
`)}
</dl>
</div>
`}function Sn(e){let t=Cn(e.body);return t?b`
<div class="sw-today__does">
<div class="sw-today__does-h">${t.heading}</div>
<ul>
${t.items.map(e=>b`<li>${e}</li>`)}
</ul>
</div>
`:x}function Cn(e){let t=wn(e),n=Tn(t,[`workflow`,`procedure`,`steps`,`agent workflow`,`process`]),r=n?Dn(n.lines):[];if(r.length>0)return{heading:k(`skillWorkshop.today.workflowHeading`),items:r.slice(0,Q)};let i=Tn(t,[`when to use`,`use when`,`applies when`,`trigger`,`triggers`]),a=i?Dn(i.lines):[];return a.length>0?{heading:k(`skillWorkshop.today.applicabilityHeading`),items:a.slice(0,Q)}:null}function wn(e){let t=[],n=null,r=!1;for(let i of e.split(`
`)){let e=i.trim();e.startsWith("```")&&(r=!r);let a=(r?null:/^(#{2,4})\s+(.+?)\s*$/.exec(e))?.[2];if(a){n={title:En(a),lines:[]},t.push(n);continue}n?.lines.push(i)}return t}function Tn(e,t){let n=new Set(t.map(En));return e.find(e=>n.has(e.title))}function En(e){return e.replace(/[#*_`[\]().:]/g,` `).replace(/\s+/g,` `).trim().toLowerCase()}function Dn(e){let t=[];for(let n of e){if(/^\s{2,}/.test(n))continue;let e=n.trim(),r=/^(?:[-*]|\d+\.)\s+(.+)/.exec(e)?.[1];r&&t.push(On(r))}return t.filter(Boolean)}function On(e){return kn(e.replace(/^\*\*[^*]+\*\*\s*/,``).replace(/\[([^\]]+)\]\([^)]+\)/g,`$1`).replace(/`([^`]+)`/g,`$1`).replace(/\s+/g,` `).trim(),In)}function kn(e,n){if(e.length<=n)return e;let r=t(e,n-1),i=r.lastIndexOf(` `);return`${(i>48?r.slice(0,i):r).trimEnd()}…`}function An(e){let t=new Date(e);return`${t.toLocaleDateString(void 0,{weekday:`long`})} · ${t.toLocaleDateString(void 0,{month:`short`,day:`numeric`})}`}function jn(e){let t=e.split(`
`),n=[],r=[],i=[],a=!1,o=[],s=()=>{r.length&&(n.push(b`<p>${Mn(r.join(` `))}</p>`),r=[])},c=()=>{if(i.length){let e=i;n.push(b`
<ol>
${e.map(e=>b`<li>${Mn(e)}</li>`)}
</ol>
`),i=[]}};for(let e of t){let t=e.trimEnd();if(t.startsWith("```")){s(),c(),a?(n.push(b`<pre>${o.join(`
`)}</pre>`),o=[],a=!1):a=!0;continue}if(a){o.push(e);continue}if(t===``){s(),c();continue}if(t.startsWith(`## `)){s(),c(),n.push(b`<h3>${t.slice(3)}</h3>`);continue}if(t.startsWith(`# `)){s(),c(),n.push(b`<h3>${t.slice(2)}</h3>`);continue}let l=/^\d+\.\s+(.+)/.exec(t)?.[1];if(l){s(),i.push(l);continue}r.push(t)}return s(),c(),a&&o.length&&n.push(b`<pre>${o.join(`
`)}</pre>`),n}function Mn(e){let t=[],n=/(`[^`]+`|\*\*[^*]+\*\*)/g,r=0,i;for(;i=n.exec(e);){i.index>r&&t.push(e.slice(r,i.index));let n=i[0];n.startsWith("`")?t.push(b`<code>${n.slice(1,-1)}</code>`):t.push(b`<strong>${n.slice(2,-2)}</strong>`),r=i.index+n.length}return r<e.length&&t.push(e.slice(r)),t}function Nn(e){let t=new Map;for(let n of e){let e=t.get(n.recencyGroup)??[];e.push(n),t.set(n.recencyGroup,e)}return[`today`,`yesterday`,`earlier`].filter(e=>t.has(e)).map(e=>({label:Ln[e],items:t.get(e)??[]}))}function Pn(e){return e.error?k(`skillWorkshop.queue.loadError`):e.loading?k(`skillWorkshop.queue.loading`):e.statusFilter===`all`?k(`skillWorkshop.queue.noMatch`):k(`skillWorkshop.queue.noStatus`,{status:k(Z[e.statusFilter]).toLocaleLowerCase()})}function X(e){return ue(e,{dateFallback:!0})}var Fn,Z,Q,In,Ln;function Rn(){return(Rn=e((()=>{y(),ye(),be(),ve(),Bt(),E(),Me(),T(),O(),ee(),se(),Yt(),tn(),Ye(),an(),L(),Fn=[`all`,`pending`,`applied`,`rejected`,`quarantined`,`stale`],Z={all:`skillWorkshop.status.all`,pending:`skillWorkshop.status.pending`,applied:`skillWorkshop.status.applied`,rejected:`skillWorkshop.status.rejected`,quarantined:`skillWorkshop.status.quarantined`,stale:`skillWorkshop.status.stale`},Q=3,In=120,Ln={today:`skillWorkshop.recency.today`,yesterday:`skillWorkshop.recency.yesterday`,earlier:`skillWorkshop.recency.earlier`}})))()}function zn(e,t,n){let{context:r,revisionRecoveryActive:i,workshopAgentName:a,onEvaluate:o,onRevisionSubmit:s,selfLearning:c,onSelfLearningToggle:l,onHistoryScan:u,onRetry:d}=t,f=e.skillWorkshopMode===`today`?`content--skill-workshop content--skill-workshop-today`:`content--skill-workshop`,p=at(r.gateway.snapshot);return b`
<section class=${f}>
${Ge({active:`workshop`,onSelect:e=>bt(r,e)})}
<wa-tab-panel
id=${Ke}
class="sw-hub-panel"
name="workshop"
active
aria-labelledby="plugins-tab-workshop"
>
<div class="sw-workshop-toolbar">
${vt(e,t,n)}
</div>
${(()=>{let t=M(e.skillWorkshopProposals,e.skillWorkshopStatusFilter,e.skillWorkshopQuery),f=e.skillWorkshopProposals.find(t=>t.key===e.skillWorkshopSelectedKey),m=t=>t.key===e.skillWorkshopSelectedKey||e.skillWorkshopStatusFilter===`applied`&&f?.status===`applied`&&t.slug===f?.slug,h=t.findIndex(m),g=t=>{e.skillWorkshopFilePreviewKey=null,et(e,r,t).finally(n),n()},_=e=>{if(t.length===0)return;let n=h<0?0:(h+e+t.length)%t.length,r=t[n];r&&g(r.key)},v=e=>{if(e.length===0||e.some(m))return;let t=e[0];t&&g(t.key)};return b`<wa-tab-panel
id="skill-workshop-mode-panel"
name=${e.skillWorkshopMode}
active
aria-labelledby=${`skill-workshop-mode-tab-${e.skillWorkshopMode}`}
>
${on({access:p,loading:e.skillWorkshopLoading,error:e.skillWorkshopError,inspectingKey:e.skillWorkshopInspectingKey,proposals:e.skillWorkshopProposals,selectedKey:e.skillWorkshopSelectedKey,appliedDiffMode:e.skillWorkshopAppliedDiffMode,statusFilter:e.skillWorkshopStatusFilter,query:e.skillWorkshopQuery,filePreviewKey:e.skillWorkshopFilePreviewKey,filePreviewQuery:e.skillWorkshopFilePreviewQuery,queueWidth:e.skillWorkshopQueueWidth,mode:e.skillWorkshopMode,actionBusy:e.skillWorkshopActionBusy,actionNotice:e.skillWorkshopActionNotice,revisionKey:e.skillWorkshopRevisionKey,revisionDraft:e.skillWorkshopRevisionDraft,revisionRecoveryActive:i,assistantName:r.config.current.assistantIdentity.name,workshopAgentName:a,selfLearning:c,historyScan:e.skillWorkshopHistoryScan,counts:it(e.skillWorkshopProposals),onRetry:()=>{d()},onStatusFilterChange:t=>{e.skillWorkshopStatusFilter=t,n(),v(M(e.skillWorkshopProposals,t,e.skillWorkshopQuery))},onQueryChange:t=>{e.skillWorkshopQuery=t,n(),v(M(e.skillWorkshopProposals,e.skillWorkshopStatusFilter,t))},onFilePreviewQueryChange:t=>{e.skillWorkshopFilePreviewQuery=t,n()},onQueueWidthChange:t=>{e.skillWorkshopQueueWidth=t,n()},onModeChange:t=>_t(e,t,n),onSelect:g,onAppliedDiffModeChange:t=>{e.skillWorkshopAppliedDiffMode=t,n()},onPrev:()=>_(-1),onNext:()=>_(1),onApply:t=>{P(r.gateway.snapshot,`skills.proposals.apply`)&&(N(e,r,`apply`,t).finally(n),n())},onEvaluate:e=>{P(r.gateway.snapshot,`skills.proposals.evaluate`)&&(o(e),n())},onRevise:t=>{P(r.gateway.snapshot,`skills.proposals.requestRevision`)&&(e.skillWorkshopRevisionKey=t,e.skillWorkshopRevisionDraft=``,n())},onReject:t=>{P(r.gateway.snapshot,`skills.proposals.reject`)&&(N(e,r,`reject`,t).finally(n),n())},onRevisionDraftChange:t=>{e.skillWorkshopRevisionDraft=t,n()},onRevisionCancel:()=>{i||(e.skillWorkshopRevisionKey=null,e.skillWorkshopRevisionDraft=``,n())},onRevisionSubmit:e=>P(r.gateway.snapshot,`skills.proposals.requestRevision`)?s(e):void 0,onPreviewFile:(t,r)=>{e.skillWorkshopSelectedKey=t,e.skillWorkshopFilePreviewKey=r,n()},onClosePreview:()=>{e.skillWorkshopFilePreviewKey=null,e.skillWorkshopFilePreviewQuery=``,n()},onSelfLearningToggle:l,onHistoryScan:u})}
</wa-tab-panel>`})()}
</wa-tab-panel>
</section>
`}var $;function Bn(){return(Bn=e((()=>{u(),Fe(),y(),ge(),ke(),T(),f(),te(),p(),qe(),We(),F(),yt(),Qe(),xt(),j(),Mt(),L(),B(),Rn(),$=class extends ie{constructor(...e){super(...e),this.operationEpoch=0,this.hasBoundContext=!1,this.gatewayClient=null,this.gatewayHello=null,this.gatewayConnected=!1,this.hasBoundAgentSelection=!1,this.hasBoundSessions=!1,this.selfLearningBusy=!1,this.selfLearningError=null,this.requestPageUpdate=()=>{this.isConnected&&this.requestUpdate()},this.revisionRecovery=new jt(this.requestPageUpdate),this.proposalsTask=new Ne(this,{autoRun:!1,args:()=>[this.gatewayConnected?this.context??null:null,this.gatewayConnected?this.state??null:null,this.selectedAgentId??null,!1],task:([e,t,n,r])=>e&&t?Xe({state:t,context:e,force:r}):Pe,onComplete:()=>{this.requestPageUpdate()},onError:()=>{this.requestPageUpdate()}}),this.subscriptions=new he(this).effect(()=>this.context,e=>{let t=this.hasBoundContext&&this.contextSource!==e;if(this.hasBoundContext=!0,this.contextSource=e,t){let t=e.gateway;this.gatewaySource=t,this.gatewayClient=t.snapshot.client,this.gatewayHello=t.snapshot.hello,this.gatewayConnected=t.snapshot.phase===`connected`,this.agentSelectionSource=e.agentSelection,this.selectedAgentId=e.agentSelection.state.selectedId,this.sessionsSource=e.sessions,this.resetSourceState(),this.loadProposals(!0)}}).effect(()=>this.context?.gateway,e=>{let t=e.snapshot,n=this.gatewaySource!==void 0&&this.gatewaySource!==e,r=this.gatewaySource!==void 0&&this.gatewayClient!==t.client,i=this.gatewaySource!==void 0&&this.gatewayConnected!==(t.phase===`connected`),a=this.gatewaySource!==void 0&&this.gatewayHello!==t.hello;return this.applyGatewaySnapshot(e,t,n||r||i||a),e.subscribe(t=>{if(this.gatewaySource!==e||this.context?.gateway!==e)return;let n=t.client!==this.gatewayClient||t.phase===`connected`!==this.gatewayConnected||t.hello!==this.gatewayHello;this.applyGatewaySnapshot(e,t,n)})}).watch(()=>this.context?.config,(e,t)=>e.subscribe(t)).effect(()=>this.context?.agentSelection,e=>{let t=this.hasBoundAgentSelection&&this.agentSelectionSource!==e;this.hasBoundAgentSelection=!0,this.agentSelectionSource=e;let n=!0,r=()=>{if(this.agentSelectionSource!==e||this.context?.agentSelection!==e)return;let r=e.state.selectedId,i=!n&&this.selectedAgentId!==r;this.selectedAgentId=r;let a=t||i;t=!1,n=!1,a&&this.resetSourceState(),this.loadProposals(a)};return r(),e.subscribe(r)}).effect(()=>this.context?.sessions,e=>{let t=this.hasBoundSessions&&this.sessionsSource!==e;this.hasBoundSessions=!0,this.sessionsSource=e,t&&(this.resetSourceState(),this.loadProposals(!0))}).watch(()=>this.context?.agentIdentity,(e,t)=>e.subscribe(t)).watch(()=>this.context?.runtimeConfig,(e,t)=>e.subscribe(t)).watch(()=>this.context?U(this.context):void 0,(e,t)=>e.subscribe(t)),this.handleRevisionRequest=async(e,t,n,r)=>{let i=this.captureSourceScope();return i?await this.revisionRecovery.request({context:i.context,expectedRevisionHash:r,instructions:e,proposal:t,proposalAgentId:n,state:i.state}):{error:`Skill Workshop is not ready.`,id:`unowned`,status:`retryable-failed`}},this.handleEvaluation=e=>{let t=this.captureSourceScope();t&&rt(t.state,t.context,e,()=>this.isCurrentSourceScope(t)).finally(this.requestPageUpdate)},this.handleRevisionSubmit=e=>{let t=this.captureSourceScope(),n=this.onRevisionRequest??this.handleRevisionRequest;t&&nt(t.state,t.context,e,n,()=>this.isCurrentSourceScope(t)).then(e=>{!e||e.status!==`admitted`||!this.isCurrentSourceScope(t)||t.navigate(`chat`,re({context:t.context,face:`chat`,sessionKey:e.sessionKey}).options)}).finally(this.requestPageUpdate)},this.handleHistoryScan=()=>{if(!P(this.context?.gateway?.snapshot,`skills.proposals.historyScan`))return;let e=this.captureSourceScope();e&&(Ze({state:e.state,context:e.context,isCurrent:()=>this.isCurrentSourceScope(e),current:()=>{let e=this.state,t=this.context;return e&&t?{state:e,context:t}:void 0}}).finally(this.requestPageUpdate),this.requestPageUpdate())},this.handleSelfLearningToggle=e=>{this.applySelfLearningToggle(e)}}willUpdate(){!this.state&&this.context&&(this.state=A(this.data),this.state.skillWorkshopMode=ft(),this.state.skillWorkshopUseCurrentChatForRevisions=mt())}updated(){this.state&&this.context&&this.revisionRecovery.sync(this.context,this.state);let e=this.state,t=e&&!e.skillWorkshopLoaded&&!e.skillWorkshopLoading&&!e.skillWorkshopError;this.gatewayConnected&&t&&this.loadProposals(!1),this.ensureWorkshopAgentIdentity();let n=this.context?.runtimeConfig;n&&this.gatewayConnected&&!n.state.configSnapshot&&!n.state.configLoading&&n.ensureLoaded()}resetSourceState(){this.operationEpoch+=1,this.selfLearningBusy=!1,this.selfLearningError=null,this.proposalsTask.run([null,null,null,!1]);let e=this.state;if(!e)return;e.skillWorkshopActionNoticeTimer&&globalThis.clearTimeout(e.skillWorkshopActionNoticeTimer);let t=A();t.skillWorkshopAgentId=e.skillWorkshopAgentId,t.skillWorkshopStatusFilter=e.skillWorkshopStatusFilter,t.skillWorkshopQuery=e.skillWorkshopQuery,t.skillWorkshopQueueWidth=e.skillWorkshopQueueWidth,t.skillWorkshopMode=e.skillWorkshopMode,t.skillWorkshopUseCurrentChatForRevisions=e.skillWorkshopUseCurrentChatForRevisions,this.state=t,this.requestPageUpdate()}applyGatewaySnapshot(e,t,n){this.gatewaySource=e,this.gatewayClient=t.client,this.gatewayHello=t.hello,this.gatewayConnected=t.phase===`connected`,n&&this.resetSourceState(),t.phase===`connected`&&(n||!this.state?.skillWorkshopLoaded)&&this.loadProposals(n)}captureSourceScope(){return Nt({state:this.state,context:this.context,epoch:this.operationEpoch})}isCurrentSourceScope(e){return Pt(e,{state:this.state,context:this.context,epoch:this.operationEpoch})}loadProposals(e){let t=this.state,n=this.context;!t||!n||n.gateway.snapshot.phase!==`connected`||this.proposalsTask.run([n,t,n.agentSelection.state.selectedId,e])}async applySelfLearningToggle(e){if(!P(this.context?.gateway?.snapshot,`config.patch`))return;let t=this.captureSourceScope(),n=t?.context.runtimeConfig;if(!(!t||!n||this.selfLearningBusy)){this.selfLearningBusy=!0,this.selfLearningError=null,this.requestPageUpdate();try{let r=await ct(n,e,()=>this.isCurrentSourceScope(t));this.isCurrentSourceScope(t)&&(this.selfLearningError=r)}finally{this.isCurrentSourceScope(t)&&(this.selfLearningBusy=!1,this.requestPageUpdate())}}}ensureWorkshopAgentIdentity(){let e=this.context,t=this.state?.skillWorkshopAgentId;!e||!t||e.agentIdentity.get(t)||e.agentIdentity.ensure([t])}disconnectedCallback(){this.subscriptions.clear(),this.resetSourceState(),super.disconnectedCallback()}render(){return this.state&&this.context?zn(this.state,{context:this.context,revisionRecoveryActive:this.revisionRecovery.active,workshopAgentName:this.context.agentIdentity.get(this.state.skillWorkshopAgentId)?.name?.trim()??``,onEvaluate:this.handleEvaluation,onRevisionSubmit:this.handleRevisionSubmit,selfLearning:st(this.context.runtimeConfig,this.selfLearningBusy,this.selfLearningError,P(this.context.gateway.snapshot,`config.patch`)),onSelfLearningToggle:this.handleSelfLearningToggle,onHistoryScan:this.handleHistoryScan,onRetry:()=>this.loadProposals(!0)},this.requestPageUpdate):x}},l([r({context:Ae,subscribe:!0})],$.prototype,`context`,void 0),l([C({attribute:!1})],$.prototype,`data`,void 0),l([C({attribute:!1})],$.prototype,`onRevisionRequest`,void 0),customElements.get(`openclaw-skill-workshop-page`)||customElements.define(`openclaw-skill-workshop-page`,$)})))()}Bn();
//# sourceMappingURL=skill-workshop-page-tiHPO8J8.js.map