918 lines
115 KiB
JavaScript
918 lines
115 KiB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{$t as t,Ei as n,Ut as r,Yt as i,Zt as a,er as o,mt as s,pt as c,rn as l,wn as u}from"./control-ui-foundation-CeFMP1Ly.js";import{$n as d,Ao as f,Dc as p,Fr as m,Gn as h,Gs as g,Jn as _,Ks as v,Nr as y,Pr as b,Qc as ee,Qn as x,Qs as S,Us as C,Ws as w,Ys as T,Zc as te,Zn as E,Zs as ne,_i as D,ac as O,ar as k,b as re,bc as A,cc as ie,di as ae,dr as oe,ec as j,el as se,er as ce,fl as le,fr as ue,fs as M,h as de,ic as fe,jo as pe,jr as me,lc as he,ml as ge,ms as N,nc as _e,nr as ve,oc as ye,or as be,pr as xe,ps as Se,qs as P,rc as Ce,sc as we,tc as Te,tr as Ee,uc as De,vr as Oe,w as ke,yl as Ae,yr as je}from"./control-ui-core-pH6nakZ-.js";import{C as Me,G as F,J as I,W as L,Z as Ne,at as Pe,i as Fe,n as Ie,rt as R,w as Le}from"./lit-runtime-BEtFSUCp.js";import{Cn as Re,Dt as ze,Sn as Be,Wn as Ve,ln as He,m as Ue,p as We,wt as Ge,zn as Ke}from"./control-ui-core-DGVkFhVB.js";import{Ft as qe,Ht as z,Lt as B,Nt as Je,Q as Ye,Rt as Xe,Z as Ze,qt as V}from"./control-ui-core-Br5DB0Zj.js";import{In as Qe,Ln as $e}from"./control-ui-boot-wpHCbPL9.js";import{n as et,r as tt}from"./gateway-runtime-DUNO4Mi1.js";import{$i as nt,Ca as rt,Cn as H,Zs as it,_n as at,ac as ot,an as st,as as ct,bn as U,cn as lt,ea as ut,gn as W,is as dt,nc as ft,on as G,pn as pt,tc as mt,uc as ht,un as K,vn as q,wa as gt,xn as _t,yc as vt,yn as yt}from"./control-ui-boot-Cdpgu1Gm.js";import{n as bt,t as xt}from"./hub-tabs-mHLCJmKB.js";import{n as St,t as Ct}from"./settings-workspace-Bo4nqRhI.js";import{n as wt,t as Tt}from"./gateway-page-controller-bzyUg03c.js";import{t as Et}from"./agent-select-registration-Bgp9CYzQ.js";import{a as Dt,n as Ot,o as kt,r as At,s as jt,t as Mt}from"./skills-shared-BNHPZbfC.js";import{t as Nt}from"./memory-panel-DzvRfI2l.js";import{n as Pt,t as Ft}from"./model-picker-CTfQ10Hi.js";import{n as It,t as Lt}from"./cron-jobs-pagination-BITiheQo.js";import{a as Rt,n as zt,r as Bt,s as Vt,t as Ht}from"./presenter-CKFufLDk.js";async function Ut(e,t,n,r){let i=r.kind===`write`,a=i?`agentFileSaving`:`agentFilesLoading`,o=e.client,s=e.agents;if(!o||!e.connected||e[a])return!1;if(r.kind===`read`&&!r.force&&Object.hasOwn(e.agentFileContents,n))return!0;let c=e.requestGeneration,l=()=>e.client===o&&e.agents===s&&e.connected&&e.requestGeneration===c,u=()=>{e.agentFileWriteRevisions.set(n,(e.agentFileWriteRevisions.get(n)??0)+1)};i&&u();let d=e.agentFileWriteRevisions.get(n),f=()=>l()&&(i||e.agentFileWriteRevisions.get(n)===d);e[a]=!0,e.agentFilesError=null;try{let a=await o.request(i?`agents.files.set`:`agents.files.get`,{agentId:t,name:n,...r.kind===`write`?{content:r.content}:{}});if(a?.file&&f()){let t=r.kind===`write`?r.content:a.file.content??``,o=e.agentFileContents[n]??``,c=e.agentFileDrafts[n];return e.agentFileContents={...e.agentFileContents,[n]:t},(!Object.hasOwn(e.agentFileDrafts,n)||c===(i?t:o))&&(e.agentFileDrafts={...e.agentFileDrafts,[n]:t}),e.agentFilesError=null,s.recordFile(a),!0}}catch(t){return f()&&(e.agentFilesError=M(t)),!1}finally{l()&&(i&&u(),e[a]=!1)}return!1}function Wt(e,t,n,r){return Ut(e,t,n,{kind:`read`,force:r?.force})}function Gt(e,t,n,r){return Ut(e,t,n,{kind:`write`,content:r})}function Kt(){return(Kt=e((()=>{N()})))()}async function qt(e,t){await e.request(`secrets.store.delete`,{name:t}).catch(()=>void 0)}async function Jt(e,t){return await e.runExternalMutation(n=>{if(n!==e.owner.client)throw Error(`Connection changed before the GitHub identity update started.`);return n.request(`tools.github.configure`,t)},{canDispatch:()=>e.isCurrent()&&e.isConfigurable(),dispatchError:`Access changed before the GitHub identity update started.`})}async function Yt(e){let t=e.draft.name.trim(),n=e.draft.email.trim();e.begin();let r=!1,i=``,a=!1;try{if(i=`github-setup-${f().replaceAll(`-`,``).toLowerCase()}`,await e.owner.client.request(`secrets.store.set`,{name:i,value:e.draft.token,kind:`secret`,allowedHosts:[]}),r=!0,!e.isCurrent()){await qt(e.owner.client,i);return}let o=await Jt(e,{scope:e.scope,agentId:e.owner.agentId,mode:`managed`,secretName:i,...t||n?{gitAuthor:{...t?{name:t}:{},...n?{email:n}:{}}}:{}});if(!o.ok)throw Error(o.error);r=!1,e.applyStatus(o.value,{...e.draft,token:``},o.refresh.ok?null:o.refresh.error),a=!0}catch(t){r&&await qt(e.owner.client,i),e.isCurrent()&&e.setError(M(t))}finally{e.finish(a)}}async function Xt(e){e.setConfirmationPending(!0);let t=!1;try{t=await gt({title:e.scope===`agent`?V(`agentTools.githubUseSystemConfirmTitle`):V(`agentTools.githubUseNativeConfirmTitle`),message:e.scope===`agent`?V(`agentTools.githubUseSystemConfirmMessage`):V(`agentTools.githubUseNativeConfirmMessage`),confirmLabel:e.scope===`agent`?V(`agentTools.githubUseSystemNewRuns`):V(`agentTools.githubUseNativeNewRuns`)})}finally{e.setConfirmationPending(!1)}if(!t||!e.isCurrent()||!e.canContinue())return;e.begin();let n=!1;try{let t=await Jt(e,{scope:e.scope,agentId:e.owner.agentId,mode:`inherit`});if(!t.ok)throw Error(t.error);e.isCurrent()&&(e.applyStatus(t.value,{token:``,name:``,email:``},t.refresh.ok?null:t.refresh.error),n=!0)}catch(t){e.isCurrent()&&e.setError(M(t))}finally{e.finish(n)}}function Zt(){return(Zt=e((()=>{rt(),z(),N(),pe()})))()}function J(e){return JSON.stringify(e??null)}function Y(e){let t=u(e)?e:void 0,n=u(t?.gitAuthor)?t.gitAuthor:void 0;return{token:``,name:typeof n?.name==`string`?n.name:``,email:typeof n?.email==`string`?n.email:``}}function Qt(e){e.requestId&&e.owner.client.request(`tools.github.authorize.cancel`,{requestId:e.requestId}).catch(()=>void 0)}function $t(){return($t=e((()=>{})))()}var en;function tn(){return(tn=e((()=>{c(),z(),P(),N(),Zt(),$t(),en=class{constructor(e){this.host=e,this.status=null,this.scope=`system`,this.authorization={phase:`idle`},this.loading=!1,this.busy=!1,this.error=null,this.statusReadable=!1,this.configurable=!1,this.authorizable=!1,this.tokenRevealed=!1,this.patVisible=!1,this.agentId=null,this.client=null,this.connected=!1,this.clientRevision=-1,this.agentRevision=-1,this.requestRevision=0,this.displayedIdentityFingerprint=``,this.identityInitialized=!1,this.verificationQueued=!1,this.confirmationPending=!1,this.mutationOwner=null,this.mutationIdentityChanged=!1,this.authorizationOperation=null,this.drafts={system:Y(void 0),agent:Y(void 0)},this.draftDirty={system:!1,agent:!1},this.configFingerprints={system:``,agent:``},this.dispose=()=>this.retireAuthorization(!0)}get authorizationActive(){return this.authorization.phase===`starting`||this.authorization.phase===`code`||this.authorization.phase===`pending`||this.authorization.phase===`network_error`||this.authorization.phase===`cancelling`||this.authorization.phase===`finishing`||this.authorization.phase===`cancel_error`}get connectionReady(){return this.connected&&this.client!==null}get draft(){return this.drafts[this.scope]}queueVerification(){this.verificationQueued||this.confirmationPending||!this.statusReadable||!this.connected||!this.agentId||this.authorizationActive||(this.verificationQueued=!0,queueMicrotask(()=>{this.verificationQueued=!1,this.verify()}))}sync(e){let t=this.client!==e.client||this.connected!==e.connected||this.clientRevision!==e.clientRevision,n=this.agentId!==e.agentId,r=this.statusReadable!==e.statusReadable||this.configurable!==e.configurable||this.authorizable!==e.authorizable;this.authorizationActive&&(t||n||!e.authorizable)&&(this.retireAuthorization(!0),this.authorization={phase:`idle`}),(t||n||r)&&(this.requestRevision+=1),this.client=e.client,this.connected=e.connected,this.clientRevision=e.clientRevision,this.statusReadable=e.statusReadable,this.configurable=e.configurable,this.authorizable=e.authorizable,this.agentId=e.agentId,n&&(this.agentRevision+=1);let i=e.agentId?S(e.config,e.agentId):null,a={system:i?.globalTools?.github,agent:i?.entry?.tools?.github},o=n?a.agent?`agent`:`system`:this.scope,s=J({effective:a.agent??a.system,selectedScope:o,selected:a[o]}),c=this.identityInitialized&&this.displayedIdentityFingerprint!==s;this.displayedIdentityFingerprint=s,this.identityInitialized=!0;let l=this.mutationOwner,u=c&&l!==null&&this.busy&&this.isCurrent(l);if(u?this.mutationIdentityChanged=!0:c&&(this.requestRevision+=1,this.authorizationActive&&(this.retireAuthorization(!0),this.authorization={phase:`idle`})),(t||n||r)&&(this.mutationOwner=null,this.mutationIdentityChanged=!1),t||n){this.status=null,this.error=null,this.loading=!1,this.busy=!1,this.tokenRevealed=!1,this.patVisible=!1,this.authorization={phase:`idle`},this.drafts={system:Y(a.system),agent:Y(a.agent)},this.draftDirty={system:!1,agent:!1},this.configFingerprints={system:J(a.system),agent:J(a.agent)},this.scope=o;return}r&&(this.loading=!1,this.busy=!1);for(let e of[`system`,`agent`]){let t=J(a[e]);!this.draftDirty[e]&&this.configFingerprints[e]!==t&&(this.drafts={...this.drafts,[e]:Y(a[e])},this.configFingerprints={...this.configFingerprints,[e]:t})}c&&!u&&(this.status=null,this.error=null,this.loading=!1,this.queueVerification())}selectScope(e){e===this.scope||this.authorizationActive||(this.retireAuthorization(!0),this.requestRevision+=1,this.scope=e,this.status=null,this.error=null,this.tokenRevealed=!1,this.authorization={phase:`idle`},this.host.requestUpdate(),this.queueVerification())}showPatFallback(){this.authorizationActive||(this.patVisible=!0,this.host.requestUpdate())}hidePatFallback(){this.busy||(this.patVisible=!1,this.tokenRevealed=!1,this.host.requestUpdate())}toggleTokenVisibility(){this.tokenRevealed=!this.tokenRevealed,this.host.requestUpdate()}setDraft(e,t){this.drafts={...this.drafts,[this.scope]:{...this.drafts[this.scope],[e]:t}},this.draftDirty={...this.draftDirty,[this.scope]:!0},this.host.requestUpdate()}captureRequest(){return!this.client||!this.connected||!this.agentId?null:{client:this.client,agentId:this.agentId,clientRevision:this.clientRevision,agentRevision:this.agentRevision,requestRevision:++this.requestRevision}}isCurrent(e){return this.client===e.client&&this.connected&&this.agentId===e.agentId&&this.clientRevision===e.clientRevision&&this.agentRevision===e.agentRevision&&this.requestRevision===e.requestRevision}isCurrentAuthorization(e){return this.authorizationOperation===e&&this.scope===e.scope&&this.authorizable&&this.isCurrent(e.owner)}retireAuthorization(e){let t=this.authorizationOperation;this.authorizationOperation=null,t&&(t.timer!==void 0&&clearTimeout(t.timer),t.controller.abort(),e&&Qt(t))}async cancelAuthorization(){let e=this.authorizationOperation;!e||e.cancelRequested||e.cancelInFlight||(e.cancelRequested=!0,e.cancelError=void 0,this.authorization=e.start?{...e.start,displayExpiresAtMs:e.displayExpiresAtMs??Date.now(),phase:`cancelling`}:{phase:`cancelling`},this.host.requestUpdate(),e.requestId&&await this.finishExplicitCancellation(e))}async finishExplicitCancellation(e){if(!(!e.requestId||e.cancelInFlight||!this.isCurrentAuthorization(e))){e.cancelInFlight=!0;try{let t=await e.owner.client.request(`tools.github.authorize.cancel`,{requestId:e.requestId});if(!this.isCurrentAuthorization(e))return;if(t.cancelled){this.retireAuthorization(!1),this.authorization={phase:`idle`},this.busy=!1,this.host.requestUpdate();return}e.cancelTooLate=!0,this.authorization={...e.start,displayExpiresAtMs:e.displayExpiresAtMs??Date.now(),phase:`finishing`},this.host.requestUpdate()}catch(t){if(!this.isCurrentAuthorization(e))return;e.cancelRequested=!1,e.cancelError=M(t),this.authorization=e.start?{...e.start,displayExpiresAtMs:e.displayExpiresAtMs??Date.now(),phase:`cancel_error`,message:e.cancelError}:{phase:`failed`,message:e.cancelError},this.host.requestUpdate()}finally{e.cancelInFlight=!1}}}scheduleAuthorizationPoll(e,t){if(!this.isCurrentAuthorization(e)||!e.start)return;e.timer!==void 0&&clearTimeout(e.timer);let n=s(t,{minMs:0});e.timer=setTimeout(()=>{e.timer=void 0,this.isCurrentAuthorization(e)&&this.pollAuthorization(e)},n)}async startAuthorization(){if(!this.authorizable||this.authorizationActive||this.busy)return;let e=this.captureRequest();if(!e)return;let t={owner:e,scope:this.scope,controller:new AbortController};this.authorizationOperation=t,this.authorization={phase:`starting`},this.error=null,this.patVisible=!1,this.host.requestUpdate();try{let n=await e.client.request(`tools.github.authorize.start`,{scope:t.scope,agentId:e.agentId},{signal:t.controller.signal});if(t.requestId=n.requestId,t.start=n,t.displayExpiresAtMs=Date.now()+n.expiresInMs,!this.isCurrentAuthorization(t)){Qt(t);return}if(t.cancelRequested){await this.finishExplicitCancellation(t);return}this.authorization={...n,displayExpiresAtMs:t.displayExpiresAtMs,phase:`code`},this.host.requestUpdate(),this.scheduleAuthorizationPoll(t,n.pollAfterMs)}catch(e){if(!this.isCurrentAuthorization(t))return;this.authorizationOperation=null,e instanceof Error&&e.name===`AbortError`||(this.authorization={phase:`failed`,message:M(e)},this.host.requestUpdate())}}async pollAuthorization(e){if(!e.requestId||!e.start||!this.isCurrentAuthorization(e))return;this.authorization={...e.start,displayExpiresAtMs:e.displayExpiresAtMs??Date.now(),phase:e.cancelTooLate?`finishing`:e.cancelError?`cancel_error`:`pending`,...e.cancelError?{message:e.cancelError}:{}},this.mutationOwner=e.owner,this.mutationIdentityChanged=!1,this.busy=!0,this.host.requestUpdate();let t=!1;try{let n=await this.host.runExternalMutation(t=>{if(t!==e.owner.client)throw Error(`Connection changed before GitHub authorization was checked.`);return t.request(`tools.github.authorize.poll`,{requestId:e.requestId},{signal:e.controller.signal})},{canDispatch:()=>this.isCurrentAuthorization(e),dispatchError:`Access changed before GitHub authorization was checked.`});if(!n.ok)throw Error(n.error);if(!this.isCurrentAuthorization(e))return;let r=n.value;if(r.status===`pending`||r.status===`slow_down`){this.authorization={...e.start,displayExpiresAtMs:e.displayExpiresAtMs??Date.now(),phase:e.cancelTooLate?`finishing`:e.cancelError?`cancel_error`:`pending`,...e.cancelError?{message:e.cancelError}:{},...r.status===`slow_down`?{slowedDown:!0}:{}},this.scheduleAuthorizationPoll(e,r.retryAfterMs);return}if(r.status===`network_error`){this.authorization={...e.start,displayExpiresAtMs:e.displayExpiresAtMs??Date.now(),phase:`network_error`},this.scheduleAuthorizationPoll(e,r.retryAfterMs);return}if(this.authorizationOperation=null,r.status===`success`){this.applyMutationStatus(e.owner,e.scope,r.githubStatus,{...this.drafts[e.scope],token:``},n.refresh.ok?null:n.refresh.error),this.authorization={phase:`idle`},t=!0;return}this.authorization={phase:r.status}}catch(t){this.isCurrentAuthorization(e)&&(this.authorizationOperation=null,t instanceof Error&&t.name===`AbortError`||(this.authorization={phase:`failed`,message:M(t)}))}finally{this.finishMutation(e.owner,t)}}finishMutation(e,t){if(this.mutationOwner!==e)return;let n=this.mutationIdentityChanged&&!t;this.mutationOwner=null,this.mutationIdentityChanged=!1,this.isCurrent(e)&&(this.busy=!1,this.host.requestUpdate(),n&&this.queueVerification())}applyMutationStatus(e,t,n,r,i){if(this.isCurrent(e)){if(n.agentId!==e.agentId||n.selectedScope!==t||n.selected.scope!==t)throw Error(`Gateway returned GitHub identity status for a different target.`);this.status=n,this.drafts={...this.drafts,[t]:r},this.draftDirty={...this.draftDirty,[t]:!1},this.tokenRevealed=!1,this.patVisible=!1,this.error=i?`GitHub identity was updated, but its configuration refresh failed: ${i}`:null}}async verify(){if(!this.statusReadable||this.loading||this.busy||this.confirmationPending||this.authorizationActive)return;let e=this.captureRequest(),t=this.scope;if(e){this.loading=!0,this.error=null,this.host.requestUpdate();try{let n=await e.client.request(`tools.github.status`,{agentId:e.agentId,selectedScope:t});if(this.isCurrent(e)){if(n.agentId!==e.agentId||n.selectedScope!==t||n.selected.scope!==t)throw Error(`Gateway returned GitHub identity status for a different target.`);this.status=n}}catch(t){this.isCurrent(e)&&(this.error=M(t))}finally{this.isCurrent(e)&&(this.loading=!1,this.host.requestUpdate())}}}async configure(){let e=this.scope,t={...this.draft};if(!this.client||!this.connected||!this.agentId||!this.configurable||this.busy||this.authorizationActive)return;if(!t.token.trim()){this.error=V(`agentTools.githubPasteToken`),this.host.requestUpdate();return}let n=this.captureRequest();n&&await Yt({...this.createMutationOwner(n,e),draft:t})}async inherit(){let e=this.scope;if(!this.configurable||this.busy||this.authorizationActive)return;let t=this.captureRequest();t&&await Xt({...this.createMutationOwner(t,e),canContinue:()=>this.configurable&&!this.busy&&!this.authorizationActive,setConfirmationPending:e=>{this.confirmationPending=e}})}createMutationOwner(e,t){return{owner:e,scope:t,isCurrent:()=>this.isCurrent(e),isConfigurable:()=>this.configurable,runExternalMutation:this.host.runExternalMutation,begin:()=>{this.mutationOwner=e,this.mutationIdentityChanged=!1,this.loading=!1,this.busy=!0,this.error=null,this.host.requestUpdate()},applyStatus:(n,r,i)=>this.applyMutationStatus(e,t,n,r,i),finish:t=>this.finishMutation(e,t),setError:e=>{this.error=e}}}}})))()}function nn(e){return e&&e.length<=sn?e:null}function rn(e){return new Promise(t=>{let n=new FileReader;n.addEventListener(`load`,()=>t(nn(typeof n.result==`string`?n.result:null))),n.addEventListener(`error`,()=>t(null)),n.readAsDataURL(e)})}async function an(e){if(!e.type.startsWith(`image/`)||e.size>2097152)return null;try{let t=await createImageBitmap(e),n=Math.min(1,on/Math.max(t.width,t.height)),r=Math.max(1,Math.round(t.width*n)),i=Math.max(1,Math.round(t.height*n)),a=document.createElement(`canvas`);a.width=r,a.height=i;let o=a.getContext(`2d`);if(!o)return rn(e);o.drawImage(t,0,0,r,i),t.close();let s=a.toDataURL(`image/webp`,.8);return nn(s.startsWith(`data:image/webp`)?s:a.toDataURL(`image/png`))}catch{return rn(e)}}var on,sn;function cn(){return(cn=e((()=>{r(),on=96,sn=16e3})))()}function ln(e){let t=(hn.get(e)??0)+1;return hn.set(e,t),t}function un(e){ln(e),e.identityDraft={name:null,emoji:null,avatar:null},e.identitySaving=!1,e.identityError=null}function dn(e,t,n){e.identityDraft={...e.identityDraft,[t]:n},e.identityError=null}function fn(e,t){let n=ln(e);an(t).then(t=>{hn.get(e)===n&&(t?(e.identityDraft={...e.identityDraft,avatar:t},e.identityError=null):e.identityError=V(`agents.identity.imageUnusable`))})}async function pn(e){let{host:t,expectedClient:n,agentId:r,agents:i,agentIdentity:a,runtimeConfig:o}=e,s=t.identityDraft,c=s.name?.trim(),l=s.emoji?.trim(),u=s.avatar??void 0;if(!(s.name!==null&&!c||s.emoji!==null&&!l)){if(!c&&!l&&!u){un(t);return}t.identitySaving=!0,t.identityError=null;try{let s=await o.runExternalMutation(e=>{if(e!==n)throw Error(`Connection changed before the agent identity update started.`);return Ee(e,{agentId:r,name:c,emoji:l,avatar:u})},{canDispatch:e.canDispatch,dispatchError:`Access changed before the agent identity update started.`});if(!s.ok)throw Error(s.error);let d=s.refresh.ok?[]:[s.refresh.error];a.invalidate([r]);try{await i.refreshList()}catch(e){d.push(`Agent identity was saved, but the agent list refresh failed: ${M(e)}`)}try{await a.ensure([r])}catch(e){d.push(`Agent identity was saved, but the identity refresh failed: ${M(e)}`)}e.isCurrent()&&(un(t),e.onSaved(),t.identityError=d.length>0?d.join(` `):null)}catch(n){e.isCurrent()&&(t.identityError=M(n))}finally{e.isCurrent()&&(t.identitySaving=!1)}}}function mn(e,t){let n=e.snapshot.pinnedAgentIds,r=n.includes(t)?n.filter(e=>e!==t):[...n,t];e.update({pinnedAgentIds:r})}var hn;function gn(){return(gn=e((()=>{z(),E(),N(),cn(),hn=new WeakMap})))()}function _n(e){return{path:[...e.path,`model`],existing:e.entry.model}}function vn(e,t,n,r){n&&r?e.patchForm(t,{primary:n,fallbacks:r}):n?e.patchForm(t,n):r?e.patchForm(t,{fallbacks:r}):e.removeFormValue(t)}function yn(e){if(typeof e==`string`)return{primary:e.trim()||null,fallbacks:null};if(e&&typeof e==`object`){let t=e;return{primary:typeof t.primary==`string`&&t.primary.trim()||null,fallbacks:Array.isArray(t.fallbacks)?t.fallbacks:null}}return{primary:null,fallbacks:null}}function bn(e,t,n){let r=e.agentEntry(t,{ensure:!!n});if(!r)return;let i=_n(r);vn(e,i.path,n,yn(i.existing).fallbacks)}function xn(e,n,r){let i=he(e.state),a=t(r),o=S(i,n),s=_e(o.entry?.model,o.defaults?.model),c=e.agentEntry(n),l=a.length>0||(s?.length??0)>0||c?c??e.agentEntry(n,{ensure:!0}):null;if(!l)return;let u=_n(l),d=yn(u.existing).primary??O(o.entry?.model)??O(o.defaults?.model)??null;vn(e,u.path,d,a.length>0?a:null)}function Sn(){return(Sn=e((()=>{i(),P(),De()})))()}function Cn(e,t,n){let r=t?.canonicalLocation;if(!r)return``;let i=`${t.location.pathname}${t.location.search}${t.location.hash}`;return n!==i&&e.replace(`agents`,r),i}function wn(e,t,n,r){n!==t&&e.navigate(`agents`,{pathname:Ve(t,r===`files`?null:r,e.basePath)})}function Tn(e,t,n,r){!t||r===n||e.navigate(`agents`,{pathname:Ve(t,r,e.basePath)})}function En(){return(En=e((()=>{Ke(),Ae()})))()}async function Dn(e,t){let n=e.client;if(!n||!e.connected||e.agentSkillsLoading)return;let r=e.requestGeneration,i=()=>e.client===n&&e.connected&&e.requestGeneration===r;e.agentSkillsLoading=!0,e.agentSkillsError=null;try{let r=await D(n,t);r&&i()&&(e.agentSkillsReport=r,e.agentSkillsAgentId=t)}catch(t){i()&&(e.agentSkillsError=M(t))}finally{i()&&(e.agentSkillsLoading=!1)}}async function On(e,t,n=()=>!0){let r=e.agentEntry(t);if(!r||!Array.isArray(r.entry.skills)||!n())return!1;let i=r.path[2];return typeof i==`string`&&e.patch({raw:{agents:{entries:{[i]:{skills:null}}}},note:`Reset agent skills to inherited defaults`,replacePaths:[`agents.entries.${i}.skills`],canDispatch:n})}function kn(){return(kn=e((()=>{N(),ae()})))()}function An(e){let{agent:t,configForm:n,agentFilesList:r,configLoading:i,configSaving:o,configDirty:s,onConfigReload:c,onConfigSave:l,onModelChange:u,onModelFallbacksChange:d,onSelectPanel:f}=e,p=w(t,n,r,e.defaultId,e.agentIdentity),m=p.isDefault,h=S(n,t.id),_=t.model,v=fe(h.defaults?.model??_),y=O(h.entry?.model),b=O(h.defaults?.model)||(v===`-`?null:ne(v))||(n?null:O(_)),ee=y??b??null,x=m?ee:y,C=_e(h.entry?.model,h.defaults?.model)??(n?null:Ce(_))??[],T=!e.canUpdateConfig||!n||i||o,E=t.thinkingDefault??`-`,D=e.identityDraft,k=D.name??e.agentIdentity?.name??t.identity?.name??t.name??``,re=D.emoji??e.agentIdentity?.emoji??t.identity?.emoji??``,A=D.avatar??se(t,e.agentIdentity),ie=Te(t,e.agentIdentity)??(te(k||t.id)||`?`),ae=D.name!==null||D.emoji!==null||D.avatar!==null,oe=D.name!==null&&!D.name.trim()||D.emoji!==null&&!D.emoji.trim(),j=e.identitySaving||!e.canUpdateIdentity,ce=t=>{let n=t.target,r=n.files?.[0];n.value=``,r&&e.onIdentityAvatarSelect(r)},le=e=>{let n=C.filter((t,n)=>n!==e);d(t.id,n)},ue=e=>{let n=e.target;if(e.key===`Enter`||e.key===`,`){e.preventDefault();let r=a(n.value);r.length>0&&(d(t.id,[...C,...r]),n.value=``)}};return I`
|
|
${q({title:V(`agents.identity.title`),description:V(`agents.identity.subtitle`)},I`
|
|
<div class="settings-row settings-row--stacked">
|
|
<div class="agent-identity-editor">
|
|
<span class="agent-identity-editor__avatar" aria-hidden="true">
|
|
${A?I`<img src=${A} alt="" decoding="async" />`:I`<span class="agent-identity-editor__avatar-text"
|
|
>${ie}</span
|
|
>`}
|
|
</span>
|
|
<div class="agent-identity-editor__fields">
|
|
<label class="field">
|
|
<span>${V(`agents.identity.name`)}</span>
|
|
<input
|
|
type="text"
|
|
maxlength="64"
|
|
.value=${k}
|
|
placeholder=${V(`agents.identity.namePlaceholder`)}
|
|
?disabled=${j}
|
|
@input=${t=>e.onIdentityFieldChange(`name`,t.target.value)}
|
|
/>
|
|
</label>
|
|
<label class="field agent-identity-editor__emoji">
|
|
<span>${V(`agents.identity.emoji`)}</span>
|
|
<input
|
|
type="text"
|
|
maxlength="8"
|
|
.value=${re}
|
|
placeholder="🦞"
|
|
?disabled=${j}
|
|
@input=${t=>e.onIdentityFieldChange(`emoji`,t.target.value)}
|
|
/>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
${e.identityError?I`<div class="settings-row__desc" role="alert" style="color: var(--danger);">
|
|
${e.identityError}
|
|
</div>`:F}
|
|
<div class="agent-identity-editor__actions">
|
|
<label class="btn btn--sm">
|
|
${V(A?`agents.identity.replaceImage`:`agents.identity.chooseImage`)}
|
|
<input
|
|
type="file"
|
|
accept="image/*"
|
|
hidden
|
|
?disabled=${j}
|
|
@change=${ce}
|
|
/>
|
|
</label>
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm primary"
|
|
?disabled=${j||!ae||oe}
|
|
@click=${()=>e.onIdentitySave()}
|
|
>
|
|
${e.identitySaving?V(`common.saving`):V(`common.save`)}
|
|
</button>
|
|
</div>
|
|
<div class="settings-row__desc agent-identity-editor__hint">
|
|
${V(`agents.identity.fileHint`)}
|
|
</div>
|
|
</div>
|
|
`)}
|
|
${q({title:V(`agents.overview.title`),description:V(`agents.overview.subtitle`)},I`
|
|
<dl class="settings-kv">
|
|
<dt>${V(`agents.context.workspace`)}</dt>
|
|
<dd>
|
|
<openclaw-tooltip .content=${V(`agents.context.openFilesTab`)}>
|
|
<button
|
|
type="button"
|
|
class="workspace-link mono"
|
|
@click=${()=>f(`files`)}
|
|
aria-label=${V(`agents.context.openFilesTab`)}
|
|
>
|
|
${p.workspace}
|
|
</button>
|
|
</openclaw-tooltip>
|
|
</dd>
|
|
<dt>${V(`agents.context.primaryModel`)}</dt>
|
|
<dd><code>${p.model}</code></dd>
|
|
<dt>${V(`agents.context.runtime`)}</dt>
|
|
<dd><code>${p.runtime}</code></dd>
|
|
<dt>${V(`agents.context.thinkingDefault`)}</dt>
|
|
<dd><code>${E}</code></dd>
|
|
<dt>${V(`agents.context.skillsFilter`)}</dt>
|
|
<dd>${p.skillsLabel}</dd>
|
|
</dl>
|
|
`)}
|
|
${s?I`<div class="callout warn">${V(`agents.overview.unsavedConfig`)}</div>`:F}
|
|
${q({title:V(`agents.overview.modelSelection`),actions:I`
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm"
|
|
?disabled=${i}
|
|
@click=${c}
|
|
>
|
|
${V(`common.reloadConfig`)}
|
|
</button>
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm primary"
|
|
?disabled=${!e.canUpdateConfig||o||!s}
|
|
@click=${l}
|
|
>
|
|
${V(o?`common.saving`:`common.save`)}
|
|
</button>
|
|
`},I`
|
|
${ct({status:{error:e.modelCatalogError,hasLoaded:e.modelCatalog.length>0,stale:!!(e.modelCatalogError&&e.modelCatalog.length>0)},onRetry:e.onModelCatalogRetry})}
|
|
${W({title:V(m?`agents.overview.primaryModelDefault`:`agents.overview.primaryModel`),control:Pt({label:V(m?`agents.overview.primaryModelDefault`:`agents.overview.primaryModel`),value:x??``,options:[{value:``,label:m?V(`agents.overview.notSet`):b?V(`agents.overview.inheritDefaultModel`,{model:b}):V(`agents.overview.inheritDefault`)},...g(n,ee??void 0,e.modelCatalog,t.id)],disabled:T,onChange:e=>u(t.id,e||null),onOpen:e.onModelCatalogRetry})})}
|
|
${W({title:V(`agents.overview.fallbacks`),stacked:!0,control:I`
|
|
<div
|
|
class="agent-chip-input"
|
|
@click=${e=>{let t=e.currentTarget.querySelector(`input`);t&&t.focus()}}
|
|
>
|
|
${C.map((e,t)=>I`
|
|
<span class="chip">
|
|
${e}
|
|
<button
|
|
type="button"
|
|
class="chip-remove"
|
|
?disabled=${T}
|
|
@click=${()=>le(t)}
|
|
>
|
|
×
|
|
</button>
|
|
</span>
|
|
`)}
|
|
<input
|
|
?disabled=${T}
|
|
placeholder=${C.length===0?`provider/model`:``}
|
|
@keydown=${ue}
|
|
@blur=${e=>{let n=e.target,r=a(n.value);r.length>0&&(d(t.id,[...C,...r]),n.value=``)}}
|
|
/>
|
|
</div>
|
|
`})}
|
|
`)}
|
|
`}function jn(){return(jn=e((()=>{i(),L(),Ft(),dt(),G(),qe(),z(),P(),ee()})))()}function Mn(e,t){if(!(e instanceof HTMLElement))return;let n=V(t?`agents.files.collapsePreview`:`agents.files.expandPreview`);e.classList.toggle(`is-fullscreen`,t),e.setAttribute(`aria-pressed`,String(t)),e.setAttribute(`aria-label`,n),e.setAttribute(`title`,n)}function Nn(e){e.querySelector(`.md-preview-dialog__panel`)?.classList.remove(`fullscreen`),Mn(e.querySelector(`.md-preview-expand-btn`),!1),e.classList.remove(`fullscreen`)}function Pn(){return(Pn=e((()=>{z()})))()}function Fn(e){let t=e.trim();return t?t.split(/\s+/).length:0}function In(e){return e.length===0?0:e.split(/\r?\n/).length}function Ln(e){return e<=0?V(`agents.files.emptyDraft`):V(`agents.files.minRead`,{count:String(Math.max(1,Math.round(e/220)))})}function Rn(e){let t=e.split(`.`).pop()?.trim().toLowerCase();return t===`md`||t===`markdown`?V(`agents.files.markdownPreview`):t?V(`agents.files.extensionPreview`,{ext:t.toUpperCase()}):V(`agents.files.preview`)}function zn(e,t){let n=e.trim(),r=t?.trim();if(!n)return``;if(r&&n===r)return`.`;if(r&&n.startsWith(`${r}/`))return n.slice(r.length+1)||`.`;let i=n.split(/[\\/]+/);for(let e=i.length-1;e>=0;--e){let t=i[e];if(t)return t}return n}function Bn(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)||`preview`}function Vn(e,t,n){return q({title:V(`agents.context.title`),description:t},I`
|
|
<dl class="settings-kv">
|
|
<dt>${V(`agents.context.workspace`)}</dt>
|
|
<dd>
|
|
<button type="button" class="workspace-link mono" @click=${()=>n(`files`)}>
|
|
${e.workspace}
|
|
</button>
|
|
</dd>
|
|
<dt>${V(`agents.context.primaryModel`)}</dt>
|
|
<dd><code>${e.model}</code></dd>
|
|
<dt>${V(`agents.context.runtime`)}</dt>
|
|
<dd><code>${e.runtime}</code></dd>
|
|
<dt>${V(`agents.context.identityName`)}</dt>
|
|
<dd>${e.identityName}</dd>
|
|
<dt>${V(`agents.context.identityAvatar`)}</dt>
|
|
<dd>${e.identityAvatar}</dd>
|
|
<dt>${V(`agents.context.skillsFilter`)}</dt>
|
|
<dd>${e.skillsLabel}</dd>
|
|
<dt>${V(`agents.context.default`)}</dt>
|
|
<dd>${e.isDefault?V(`common.yes`):V(`common.no`)}</dd>
|
|
</dl>
|
|
`)}function Hn(e,t){let n=e.channelMeta?.find(e=>e.id===t);return n?.label?n.label:e.channelLabels?.[t]??t}function Un(e){if(!e)return[];let t=new Set;for(let n of e.channelOrder??[])t.add(n);for(let n of e.channelMeta??[])t.add(n.id);for(let n of Object.keys(e.channelAccounts??{}))t.add(n);let n=[],r=e.channelOrder?.length?e.channelOrder:Array.from(t);for(let e of r)t.has(e)&&(n.push(e),t.delete(e));for(let e of t)n.push(e);return n.map(t=>({id:t,label:Hn(e,t),accounts:e.channelAccounts?.[t]??[]}))}function Wn(e){let t=0,n=0,r=0;for(let i of e){let e=i.probe&&typeof i.probe==`object`&&`ok`in i.probe?!!i.probe.ok:!1,a=typeof i.connected==`boolean`||typeof i.running==`boolean`;(i.connected===!0||i.running===!0||!a&&e)&&(t+=1),i.configured&&(n+=1),i.enabled&&(r+=1)}return{total:e.length,connected:t,configured:n,enabled:r}}function Gn(e){let t=Un(e.snapshot),n=e.lastSuccess?re(e.lastSuccess):V(`common.never`);return I`
|
|
${Vn(e.context,V(`agents.context.configurationSubtitle`),e.onSelectPanel)}
|
|
${e.error?I`<div class="callout danger">${e.error}</div>`:F}
|
|
${e.snapshot?F:I`<div class="callout info">${V(`agents.channels.loadHint`)}</div>`}
|
|
${q({title:V(`agents.channels.title`),description:I`${V(`agents.channels.subtitle`)}
|
|
${V(`agents.channels.lastRefresh`,{time:n})}`,actions:I`
|
|
<button class="btn btn--sm" ?disabled=${e.loading} @click=${e.onRefresh}>
|
|
${e.loading?V(`common.refreshing`):V(`common.refresh`)}
|
|
</button>
|
|
`},t.length===0?K(V(`agents.channels.empty`)):t.map(t=>{let n=Wn(t.accounts),r=n.total?V(`agents.channels.connectedCount`,{connected:String(n.connected),total:String(n.total)}):V(`agents.channels.noAccounts`),i=n.configured?V(`agents.channels.configuredCount`,{count:String(n.configured)}):V(`agents.channels.notConfigured`),a=n.total?V(`agents.channels.enabledCount`,{count:String(n.enabled)}):V(`common.disabled`),o=_({configForm:e.configForm,channelId:t.id,fields:Jn}),s=[t.id,i,a,...o.map(e=>`${e.label}: ${e.value}`)];return W({title:t.label,description:s.join(` · `),control:I`
|
|
${n.configured===0?I`
|
|
<a
|
|
class="settings-row__value"
|
|
href="https://docs.openclaw.ai/channels"
|
|
target="_blank"
|
|
rel="noopener"
|
|
>${V(`agents.channels.setupGuide`)}</a
|
|
>
|
|
`:F}
|
|
${U({kind:n.connected>0?`ok`:n.total?`warn`:`muted`,label:r})}
|
|
`})}))}
|
|
`}function Kn(e){return I`
|
|
${Vn(e.context,V(`agents.context.schedulingSubtitle`),e.onSelectPanel)}
|
|
${e.error?I`<div class="callout danger">${e.error}</div>`:F}
|
|
${q({title:V(`agents.cronPanel.schedulerTitle`),description:V(`agents.cronPanel.schedulerSubtitle`),actions:I`
|
|
<button class="btn btn--sm" ?disabled=${e.loading} @click=${e.onRefresh}>
|
|
${e.loading?V(`common.refreshing`):V(`common.refresh`)}
|
|
</button>
|
|
`},I`
|
|
${W({title:V(`common.enabled`),control:H(e.status?e.status.enabled?V(`common.yes`):V(`common.no`):V(`common.na`))})}
|
|
${W({title:V(`agents.cronPanel.jobs`),control:H(e.scopedTotal??V(`common.na`))})}
|
|
${W({title:V(`agents.cronPanel.nextWake`),control:H(Rt(e.status?.enabled===!1?null:e.scopedNextWakeAtMs))})}
|
|
`)}
|
|
${q({title:V(`agents.cronPanel.agentJobsTitle`),description:V(`agents.cronPanel.agentJobsSubtitle`)},e.jobs.length===0?K(V(`agents.cronPanel.noJobs`)):I`
|
|
${e.jobs.map(t=>{let n=[t.description,zt(t),t.sessionTarget,Bt(t),Ht(t)].filter(Boolean);return W({title:t.name,description:n.join(` · `),control:I`
|
|
${U({kind:t.enabled?`ok`:`warn`,label:t.enabled?V(`common.enabled`):V(`common.disabled`)})}
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${!e.canRunNow||!t.enabled}
|
|
@click=${()=>e.onRunNow(t.id)}
|
|
>
|
|
${V(`agents.cronPanel.runNow`)}
|
|
</button>
|
|
`})})}
|
|
${It({jobsShown:e.jobs.length,jobsTotal:e.jobsTotal,hasMore:e.jobsHasMore,loading:e.loading,loadingMore:e.jobsLoadingMore,onLoadMore:e.onLoadMore})}
|
|
`)}
|
|
`}function qn(e){let t=e.agentFilesList?.agentId===e.agentId?e.agentFilesList:null,n=t?.files??[],r=e.agentFileActive??null,i=e=>e.missing&&e.expectedAbsent===!0&&e.name!==r,a=n.filter(e=>!i(e)),o=n.filter(i),s=r?n.find(e=>e.name===r)??null:null,c=r?e.agentFileContents[r]??``:``,l=r?e.agentFileDrafts[r]??c:``,u=r?l!==c:!1,d=s?ut(l,{codeBlockChrome:`none`,mode:`document`}):``,f=v(new TextEncoder().encode(l).length),p=Fn(l),m=In(l),h=s?zn(s.path,t?.workspace):``,g=s?`agent-file-preview-title-${Bn(s.name)}`:``,_=s?.missing?V(`agents.files.willCreateOnSave`):V(u?`agents.files.liveDraftPreview`:`agents.files.savedPreview`),y=s?.missing?`is-missing`:u?`is-dirty`:`is-synced`,b=s?.updatedAtMs?V(`agents.files.updated`,{time:re(s.updatedAtMs)}):s?.missing?V(`agents.files.notCreatedYet`):V(`agents.files.updatedUnknown`);return I`
|
|
${e.agentFilesError?I`<div class="callout danger">${e.agentFilesError}</div>`:F}
|
|
${q({title:V(`agents.files.coreFilesTitle`),description:t?I`${V(`agents.files.coreFilesSubtitle`)} ${V(`agents.files.workspace`)}:
|
|
<code>${t.workspace}</code>`:V(`agents.files.coreFilesSubtitle`),actions:I`
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${e.agentFilesLoading}
|
|
@click=${()=>e.onLoadFiles(e.agentId)}
|
|
>
|
|
${e.agentFilesLoading?V(`common.loading`):V(`common.refresh`)}
|
|
</button>
|
|
`},t?n.length===0?K(V(`agents.files.empty`)):I`
|
|
<div class="agents-panel-body">
|
|
<div class="agent-file-tabs">
|
|
${bt({id:`agent-files`,active:r,tabs:a.map(t=>({value:t.name,label:t.name.replace(/\.md$/i,``),badge:t.missing&&t.expectedAbsent!==!0?V(`agents.files.missing`):void 0,disabled:e.agentFilesLoading})),ariaLabel:V(`agents.files.coreFilesTitle`),panelId:`agent-file-panel`,variant:`sub`,onSelect:e.onSelectFile})}
|
|
${o.length===0?F:I`
|
|
<select
|
|
class="agent-tab-add"
|
|
aria-label=${V(`agents.files.addFile`)}
|
|
.value=${``}
|
|
?disabled=${e.agentFilesLoading}
|
|
@change=${t=>{let n=t.target,r=n.value;n.value=``,r&&e.onSelectFile(r)}}
|
|
>
|
|
<option value="">${V(`agents.files.addFile`)}</option>
|
|
${o.map(e=>I`<option value=${e.name}>
|
|
${e.name.replace(/\.md$/i,``)}
|
|
</option>`)}
|
|
</select>
|
|
`}
|
|
</div>
|
|
<div
|
|
id="agent-file-panel"
|
|
role="tabpanel"
|
|
aria-labelledby=${r?`agent-files-tab-${r}`:F}
|
|
>
|
|
${s?I`
|
|
<div class="agent-file-header">
|
|
<div>
|
|
<div class="agent-file-sub mono">${s.path}</div>
|
|
</div>
|
|
<div class="agent-file-actions">
|
|
<button
|
|
class="btn btn--sm"
|
|
@click=${e=>{e.currentTarget.closest(`.settings-group`)?.querySelector(`openclaw-modal-dialog`)?.show()}}
|
|
>
|
|
${B.eye} ${V(`agents.files.preview`)}
|
|
</button>
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${!e.canWrite||!u}
|
|
@click=${()=>e.onFileReset(s.name)}
|
|
>
|
|
${V(`common.reset`)}
|
|
</button>
|
|
<button
|
|
class="btn btn--sm primary"
|
|
?disabled=${!e.canWrite||e.agentFileSaving||!u}
|
|
@click=${()=>e.onFileSave(s.name)}
|
|
>
|
|
${e.agentFileSaving?V(`common.saving`):V(`common.save`)}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
${s.missing?I`<div class="callout info">
|
|
${s.expectedAbsent===!0?V(`agents.files.createHint`):V(`agents.files.missingHint`)}
|
|
</div>`:F}
|
|
<label class="field agent-file-field">
|
|
<span>${V(`agents.files.content`)}</span>
|
|
<textarea
|
|
class="agent-file-textarea"
|
|
?disabled=${!e.canWrite}
|
|
.value=${l}
|
|
@input=${t=>e.onFileDraftChange(s.name,t.target.value)}
|
|
></textarea>
|
|
</label>
|
|
<openclaw-modal-dialog
|
|
manual
|
|
label=${s.name}
|
|
style="--openclaw-modal-width: min(1040px, calc(100vw - 32px));"
|
|
@modal-cancel=${e=>{Nn(e.currentTarget)}}
|
|
>
|
|
<div class="md-preview-dialog__panel">
|
|
<div class="md-preview-dialog__header">
|
|
<div class="md-preview-dialog__header-main">
|
|
<div class="md-preview-dialog__eyebrow">
|
|
${B.scrollText}
|
|
<span>${Rn(s.name)}</span>
|
|
</div>
|
|
<div class="md-preview-dialog__title-wrap">
|
|
<div
|
|
id=${g}
|
|
class="md-preview-dialog__title"
|
|
translate="no"
|
|
>
|
|
${s.name}
|
|
</div>
|
|
<div class="md-preview-dialog__path mono" translate="no">
|
|
${h}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="md-preview-dialog__actions">
|
|
<openclaw-tooltip .content=${V(`agents.files.expandPreview`)}>
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm md-preview-icon-btn md-preview-expand-btn"
|
|
aria-label=${V(`agents.files.expandPreview`)}
|
|
aria-pressed="false"
|
|
@click=${e=>{let t=e.currentTarget,n=t.closest(`.md-preview-dialog__panel`);if(!n)return;let r=n.classList.toggle(`fullscreen`);t.closest(`openclaw-modal-dialog`)?.classList.toggle(`fullscreen`,r),Mn(t,r)}}
|
|
>
|
|
<span class="when-normal" aria-hidden="true"
|
|
>${B.maximize}</span
|
|
><span class="when-fullscreen" aria-hidden="true"
|
|
>${B.minimize}</span
|
|
>
|
|
</button>
|
|
</openclaw-tooltip>
|
|
<openclaw-tooltip .content=${V(`agents.files.editFile`)}>
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm md-preview-icon-btn"
|
|
aria-label=${V(`agents.files.editFile`)}
|
|
@click=${e=>{let t=e.currentTarget.closest(`openclaw-modal-dialog`);t?.hide(),t&&Nn(t),document.querySelector(`.agent-file-textarea`)?.focus()}}
|
|
>
|
|
<span aria-hidden="true">${B.edit}</span>
|
|
</button>
|
|
</openclaw-tooltip>
|
|
<openclaw-tooltip .content=${V(`agents.files.closePreview`)}>
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm md-preview-icon-btn"
|
|
aria-label=${V(`agents.files.closePreview`)}
|
|
@click=${e=>{let t=e.currentTarget.closest(`openclaw-modal-dialog`);t?.hide(),t&&Nn(t)}}
|
|
>
|
|
<span aria-hidden="true">${B.x}</span>
|
|
</button>
|
|
</openclaw-tooltip>
|
|
</div>
|
|
</div>
|
|
<div class="md-preview-dialog__meta">
|
|
<div class="md-preview-dialog__chip ${y}">
|
|
<strong>${_}</strong>
|
|
</div>
|
|
<div class="md-preview-dialog__chip">
|
|
<strong>${Ln(p)}</strong>
|
|
<span
|
|
>${V(`agents.files.words`,{count:String(p)})}</span
|
|
>
|
|
</div>
|
|
<div class="md-preview-dialog__chip">
|
|
<strong>${m}</strong>
|
|
<span>${V(`agents.files.lines`)}</span>
|
|
</div>
|
|
<div class="md-preview-dialog__chip">
|
|
<strong>${f}</strong>
|
|
<span>${b}</span>
|
|
</div>
|
|
</div>
|
|
<div class="md-preview-dialog__body">
|
|
<article class="md-preview-dialog__reader sidebar-markdown">
|
|
${Fe(d)}
|
|
</article>
|
|
</div>
|
|
</div>
|
|
</openclaw-modal-dialog>
|
|
`:I`<div class="muted">${V(`agents.files.selectFile`)}</div>`}
|
|
</div>
|
|
</div>
|
|
`:K(V(`agents.files.loadHint`)))}
|
|
`}var Jn;function Yn(){return(Yn=e((()=>{L(),Ie(),Lt(),xt(),Xe(),nt(),Je(),qe(),G(),z(),P(),h(),ke(),Vt(),Pn(),Jn=[`groupPolicy`,`streamMode`,`dmPolicy`]})))()}var Xn,Zn,Qn,$n,er,tr,nr,rr,ir,ar,or,sr,cr,lr;function ur(){return(ur=e((()=>{Xn=`Run shell now.`,Zn=`Inspect/control exec sessions.`,Qn=`Schedule reminders, automations, wake events.`,$n=`List visible sessions; filters/previews.`,er=`Read sanitized session history.`,tr=`Search past session transcripts.`,nr=`Run same-Gateway session/agent.`,rr=`Spawn hidden subagent (ephemeral) or visible work session (durable).`,ir=`Wait for collector subagents.`,ar=`Show session status/model/usage.`,or=`Ask the user and wait for an answer.`,sr=`Suggest follow-up work for operator approval.`,cr=`Withdraw a pending task suggestion.`,lr=`Manage reusable-skill proposals; inspect can select one stored artifact and returns complete content only when it fits the model budget.`})))()}var dr;function fr(){return(fr=e((()=>{dr=`automations`})))()}function pr(e){return X.filter(t=>t.profiles.includes(e)).map(e=>e.id)}function mr(){let e=new Map;for(let t of X){let n=`group:${t.sectionId}`,r=e.get(n)??[];r.push(t.id),e.set(n,r)}return{"group:openclaw":X.filter(e=>e.includeInOpenClawGroup).map(e=>e.id),...Object.fromEntries(e.entries())}}function hr(e){if(!e)return;let t=gr[e];if(t&&!(!t.allow&&!t.deny))return{allow:t.allow?[...t.allow]:void 0,deny:t.deny?[...t.deny]:void 0}}var X,gr,_r;function vr(){return(vr=e((()=>{ur(),fr(),X=[{id:`read`,description:`Read file contents`,sectionId:`fs`,profiles:[`coding`]},{id:`write`,description:`Create or overwrite files`,sectionId:`fs`,profiles:[`coding`]},{id:`edit`,description:`Make precise edits`,sectionId:`fs`,profiles:[`coding`]},{id:`apply_patch`,description:`Patch files`,sectionId:`fs`,profiles:[`coding`]},{id:`exec`,description:Xn,sectionId:`runtime`,profiles:[`coding`]},{id:`process`,description:Zn,sectionId:`runtime`,profiles:[`coding`]},{id:`code_execution`,description:`Run sandboxed remote analysis`,sectionId:`runtime`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`secrets`,description:`Request and manage write-only credentials`,sectionId:`runtime`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`web_search`,description:`Search the web`,sectionId:`web`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`web_fetch`,description:`Fetch web content`,sectionId:`web`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`x_search`,description:`Search X posts`,sectionId:`web`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`memory_search`,description:`Semantic search`,sectionId:`memory`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`memory_get`,description:`Read memory files`,sectionId:`memory`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`sessions`,description:`Session settings: label, pin, archive, groups`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_list`,description:$n,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_history`,description:er,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_search`,description:tr,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`conversations_list`,description:`List exact external conversation addresses`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`conversations_send`,description:`Send to an exact external conversation`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`conversations_turn`,description:`Send and wait for a correlated external reply`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_send`,description:nr,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_spawn`,description:rr,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`github_identity_status`,description:`Inspect the effective GitHub identity and credential health`,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`github_publish`,description:`Publish the reconciled session worktree as a draft GitHub pull request`,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`agents_wait`,description:ir,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`sessions_yield`,description:`End turn to receive sub-agent results`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`subagents`,description:`Background work: subagents, media gen, automation runs. list/cancel.`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`session_status`,description:ar,sectionId:`sessions`,profiles:[`minimal`,`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`suggest_task`,description:sr,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`dismiss_task`,description:cr,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`browser`,description:`Control web browser`,sectionId:`ui`,profiles:[],includeInOpenClawGroup:!0},{id:`screen`,description:`Drive operator web UI`,sectionId:`ui`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`dashboard`,description:`Read and arrange the session dashboard`,sectionId:`ui`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`terminal`,description:`Use shared operator terminals with policy-governed input`,sectionId:`ui`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`portal`,description:`Expose local web apps through the gateway`,sectionId:`ui`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`canvas`,description:`Control node Canvas surfaces when the Canvas plugin is enabled`,sectionId:`ui`,profiles:[]},{id:`show_widget`,description:`Show an interactive widget on chat or an auto-fitting dashboard`,sectionId:`ui`,profiles:[],includeInOpenClawGroup:!0},{id:`message`,description:`Send messages`,sectionId:`messaging`,profiles:[`messaging`],includeInOpenClawGroup:!0},{id:`heartbeat_respond`,description:`Accept heartbeat outcomes for post-turn handling`,sectionId:`automation`,profiles:[],includeInOpenClawGroup:!0},{id:dr,description:Qn,sectionId:`automation`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`gateway`,description:`Read Gateway config and schema`,sectionId:`automation`,profiles:[],includeInOpenClawGroup:!0},{id:`nodes`,description:`Nodes + devices`,sectionId:`nodes`,profiles:[],includeInOpenClawGroup:!0},{id:`computer`,description:`Control a paired computer node desktop`,sectionId:`nodes`,profiles:[],includeInOpenClawGroup:!0},{id:`mobile_ui`,description:`Observe and control a paired Android app`,sectionId:`nodes`,profiles:[],includeInOpenClawGroup:!0},{id:`agents_list`,description:`List agents`,sectionId:`agents`,profiles:[],includeInOpenClawGroup:!0},{id:`get_goal`,description:`Get current thread goal`,sectionId:`agents`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`create_goal`,description:`Create a thread goal`,sectionId:`agents`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`update_goal`,description:`Complete or block a thread goal`,sectionId:`agents`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`progress_card`,description:`Maintain the session progress card`,sectionId:`agents`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`ask_user`,description:or,sectionId:`agents`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`skill_workshop`,description:lr,sectionId:`agents`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`view_image`,description:`Image understanding`,sectionId:`media`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`image_generate`,description:`Image generation`,sectionId:`media`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`music_generate`,description:`Music generation`,sectionId:`media`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`video_generate`,description:`Video generation`,sectionId:`media`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`tts`,description:`Text-to-speech conversion`,sectionId:`media`,profiles:[],includeInOpenClawGroup:!0}],new Map(X.map(e=>[e.id,e])),gr={minimal:{allow:pr(`minimal`)},coding:{allow:[...pr(`coding`),`bundle-mcp`]},messaging:{allow:[...pr(`messaging`),`bundle-mcp`]},full:{allow:[`*`]}},_r=mr()})))()}function Z(e){let t=n(e);return Sr[t]??t}function yr(e){return e?e.map(Z).filter(Boolean):[]}function br(e){let t=yr(e),n=[];for(let e of t){let t=Cr[e];if(t){n.push(...t);continue}n.push(e)}return l(n)}function xr(e){return hr(e)}var Sr,Cr;function wr(){return(wr=e((()=>{i(),vr(),Sr={bash:`exec`,"apply-patch":`apply_patch`,cron:`automations`},Cr={..._r}})))()}function Tr(e){switch(e){case`system-configured`:return V(`agentTools.githubSourceSystem`);case`agent-override`:return V(`agentTools.githubSourceAgent`);default:return V(`agentTools.githubSourceDetected`)}}function Er(e){switch(e.evidence){case`github-api`:return V(`agentTools.githubEvidenceApi`);case`rate-limited`:return V(`agentTools.githubEvidenceRateLimited`);case`unverified`:return V(`agentTools.githubEvidenceUnverified`);default:return}}function Dr(e,t){let n=Ar[e.credentialState],r=[e.gitAuthor.name,e.gitAuthor.email].filter(e=>typeof e==`string`&&e.length>0);return I`
|
|
${W({title:t.account,description:Tr(e.source),control:e.account?H(`@${e.account.login}`,{mono:!0}):H(V(`agentTools.githubNoAccount`))})}
|
|
${W({title:t.status,description:Er(e),control:U({kind:n.kind,label:V(n.label)})})}
|
|
${W({title:t.author,control:H(r.length>0?r.join(` · `):V(`agentTools.githubAuthorUnset`))})}
|
|
${W({title:t.credential,control:H(V(jr[e.credentialKind]))})}
|
|
${e.credentialKind===`managed-oauth`?I`
|
|
${W({title:t.accessExpiry,control:H(e.accessExpiresAtMs?de(e.accessExpiresAtMs,{dateStyle:`medium`,timeStyle:`short`}):V(`common.na`))})}
|
|
${W({title:t.refresh,control:H(V(Mr[e.refreshState]))})}
|
|
${W({title:t.scopes,control:H(e.oauthScopes.length?e.oauthScopes.join(`, `):V(`common.none`),{mono:!0})})}
|
|
`:F}
|
|
`}function Or(e){let t=e.authorization;if(!e.connectionReady)return W({title:V(`agentTools.githubConnection`),control:U({kind:`muted`,label:V(`agentTools.githubDisconnected`)})});if(!e.statusReadable)return W({title:U({kind:`danger`,label:V(`agentTools.githubAccessRequired`)}),description:V(`agentTools.githubReadRequired`)});if(!e.authorizable||!e.configurable)return W({title:U({kind:`warn`,label:V(`agentTools.githubAccessRequired`)}),description:V(`agentTools.githubAdminRequired`)});if(t.phase===`starting`||t.phase===`cancelling`&&!(`userCode`in t))return W({title:V(`agentTools.githubAuthorization`),control:I`
|
|
${U({kind:`accent`,label:t.phase===`cancelling`?V(`agentTools.githubCancelling`):V(`agentTools.githubStarting`)})}
|
|
${t.phase===`starting`?I`<button class="btn btn--sm" @click=${()=>void e.cancelAuthorization()}>
|
|
${V(`common.cancel`)}
|
|
</button>`:F}
|
|
`});if(t.phase===`code`||t.phase===`pending`||t.phase===`network_error`||t.phase===`cancelling`||t.phase===`finishing`||t.phase===`cancel_error`){if(!(`userCode`in t))return F;let n=V(`agentTools.githubCopyCode`),r=t.phase===`code`?V(`agentTools.githubCodeReady`):t.phase===`cancelling`?V(`agentTools.githubCancelling`):t.phase===`finishing`?V(`agentTools.githubFinishing`):t.phase===`cancel_error`?V(`agentTools.githubCancelFailed`):t.phase===`network_error`?V(`agentTools.githubNetworkRetry`):t.slowedDown?V(`agentTools.githubSlowDown`):V(`agentTools.githubWaiting`);return I`
|
|
${W({title:V(`agentTools.githubAuthorization`),description:t.phase===`cancel_error`?t.message?`${V(`agentTools.githubCancelFailedHint`)} ${t.message}`:V(`agentTools.githubCancelFailedHint`):V(`agentTools.githubAuthorizationHint`),control:U({kind:t.phase===`network_error`||t.phase===`cancel_error`?`warn`:`accent`,label:r})})}
|
|
${W({title:V(`agentTools.githubDeviceCode`),description:V(`agentTools.githubDeviceCodeHint`),control:I`
|
|
<code class="settings-row__value settings-row__value--mono github-device-code"
|
|
>${t.userCode}</code
|
|
>
|
|
`})}
|
|
${W({title:V(`agentTools.githubExpires`),control:H(de(t.displayExpiresAtMs,{dateStyle:`medium`,timeStyle:`short`}))})}
|
|
<div class="settings-row settings-row--actions">
|
|
<div class="settings-row__control">
|
|
<a
|
|
class="btn primary"
|
|
href=${t.verificationUri}
|
|
target=${oe}
|
|
rel=${ue()}
|
|
>
|
|
${V(`agentTools.githubOpen`)}
|
|
</a>
|
|
<button
|
|
type="button"
|
|
class="btn"
|
|
@click=${e=>void Ze(e,t.userCode,n)}
|
|
>
|
|
<span data-copy-label>${n}</span>
|
|
</button>
|
|
${t.phase===`cancelling`||t.phase===`finishing`?F:I`<button
|
|
type="button"
|
|
class="btn"
|
|
@click=${()=>void e.cancelAuthorization()}
|
|
>
|
|
${t.phase===`cancel_error`?V(`agentTools.githubRetryCancel`):V(`common.cancel`)}
|
|
</button>`}
|
|
</div>
|
|
</div>
|
|
`}if(e.patVisible)return F;if(t.phase===`access_denied`||t.phase===`expired`||t.phase===`incorrect_device_code`||t.phase===`failed`){let n=t.phase===`expired`?V(`agentTools.githubExpired`):t.phase===`access_denied`?V(`agentTools.githubDenied`):t.phase===`incorrect_device_code`?V(`agentTools.githubIncorrectCode`):t.message??V(`agentTools.githubAuthorizationFailed`);return W({title:U({kind:`danger`,label:V(`agentTools.githubAuthorizationFailed`)}),description:Se(n),control:I`
|
|
<button class="btn primary" @click=${()=>void e.startAuthorization()}>
|
|
${V(`agentTools.githubConnect`)}
|
|
</button>
|
|
<button class="btn" @click=${()=>e.showPatFallback()}>
|
|
${V(`agentTools.githubUsePat`)}
|
|
</button>
|
|
`})}return I`
|
|
${W({title:V(`agentTools.githubAuthorization`),description:V(`agentTools.githubConnectHint`),control:I`
|
|
<button class="btn primary" @click=${()=>void e.startAuthorization()}>
|
|
${V(`agentTools.githubConnect`)}
|
|
</button>
|
|
`})}
|
|
${W({title:V(`agentTools.githubPatFallback`),description:V(`agentTools.githubPatFallbackHint`),control:I`
|
|
<button class="btn" @click=${()=>e.showPatFallback()}>
|
|
${V(`agentTools.githubUsePat`)}
|
|
</button>
|
|
`})}
|
|
`}function kr(e){let t=e.status,n=e.draft,r=e.busy||!e.configurable||e.authorizationActive,i=(t,i)=>W({title:i,control:I`
|
|
<input
|
|
class="settings-input"
|
|
aria-label=${i}
|
|
autocomplete="off"
|
|
.value=${n[t]}
|
|
?disabled=${r}
|
|
@input=${n=>{n.currentTarget instanceof HTMLInputElement&&e.setDraft(t,n.currentTarget.value)}}
|
|
/>
|
|
`}),a=t?.effective??null,o=t?.selected.identity??null,s=!!(a&&o&&JSON.stringify(a)!==JSON.stringify(o)),c=t?I`
|
|
${Dr(t.effective,{account:V(`agentTools.githubEffectiveAccount`),status:V(`agentTools.githubEffectiveStatus`),author:V(`agentTools.githubEffectiveAuthor`),credential:V(`agentTools.githubEffectiveCredential`),accessExpiry:V(`agentTools.githubEffectiveAccessExpiry`),refresh:V(`agentTools.githubEffectiveRefresh`),scopes:V(`agentTools.githubEffectiveScopes`)})}
|
|
${W({title:V(`agentTools.githubSelectedConfiguration`,{scope:e.scope===`agent`?V(`agentTools.githubAgentOverride`):V(`agentTools.githubSystem`)}),description:t.selected.configured?V(`agentTools.githubConfiguredHere`):V(`agentTools.githubInheritedHere`),control:H(t.selected.configured?V(`agentTools.githubSelectedConfigured`):V(`agentTools.githubSelectedInherited`))})}
|
|
${s&&o?Dr(o,{account:V(`agentTools.githubSelectedAccount`),status:V(`agentTools.githubSelectedStatus`),author:V(`agentTools.githubSelectedAuthor`),credential:V(`agentTools.githubSelectedCredential`),accessExpiry:V(`agentTools.githubSelectedAccessExpiry`),refresh:V(`agentTools.githubSelectedRefresh`),scopes:V(`agentTools.githubSelectedScopes`)}):F}
|
|
`:W({title:V(`agentTools.githubAccount`),description:e.loading?V(`agentTools.githubVerifying`):void 0,control:H(V(`agentTools.githubNoAccount`))});return q({title:V(`agentTools.githubTitle`),description:V(`agentTools.githubSubtitle`),actions:e.statusReadable?I`<button
|
|
class="btn btn--sm"
|
|
?disabled=${e.loading}
|
|
@click=${()=>void e.verify()}
|
|
>
|
|
${e.loading?V(`agentTools.githubVerifying`):V(`agentTools.githubVerify`)}
|
|
</button>`:void 0},I`
|
|
${e.error?W({title:U({kind:`danger`,label:V(`agentTools.githubErrorTitle`)}),description:Se(e.error)}):F}
|
|
${c}
|
|
${W({title:V(`agentTools.githubScope`),description:e.scope===`agent`?V(`agentTools.githubScopeAgentDesc`):V(`agentTools.githubScopeSystemDesc`),control:yt({value:e.scope,options:[{value:`system`,label:V(`agentTools.githubSystem`)},{value:`agent`,label:V(`agentTools.githubAgentOverride`)}],disabled:e.busy||e.authorizationActive,ariaLabel:V(`agentTools.githubScope`),onChange:t=>e.selectScope(t)})})}
|
|
${Or(e)}
|
|
${e.patVisible?I`
|
|
<div class="settings-subrows">
|
|
${W({title:V(`agentTools.githubToken`),description:V(`agentTools.githubTokenDesc`),control:at({ariaLabel:V(`agentTools.githubToken`),value:n.token,visible:e.tokenRevealed,disabled:r,showLabel:V(`configForm.revealValue`),hideLabel:V(`configForm.hideValue`),toggleLabel:V(`agentTools.githubTokenToggle`),onInput:t=>e.setDraft(`token`,t),onToggle:()=>e.toggleTokenVisibility()})})}
|
|
${i(`name`,V(`agentTools.githubAuthorName`))}
|
|
${i(`email`,V(`agentTools.githubAuthorEmail`))}
|
|
<div class="settings-row settings-row--actions">
|
|
<div class="settings-row__control">
|
|
<button
|
|
class="btn"
|
|
?disabled=${e.busy}
|
|
@click=${()=>e.hidePatFallback()}
|
|
>
|
|
${V(`common.cancel`)}
|
|
</button>
|
|
<button
|
|
class="btn primary"
|
|
?disabled=${r}
|
|
@click=${()=>void e.configure()}
|
|
>
|
|
${e.busy?V(`common.saving`):V(`agentTools.githubConfigure`)}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
`:F}
|
|
<div class="settings-row">
|
|
<div class="settings-row__text">
|
|
<span class="settings-row__title">
|
|
${e.scope===`agent`?V(`agentTools.githubAgentOverride`):V(`agentTools.githubSystem`)}
|
|
</span>
|
|
<span class="settings-row__desc">
|
|
${e.scope===`agent`?V(`agentTools.githubAgentMutationHint`):V(`agentTools.githubSystemMutationHint`)}
|
|
</span>
|
|
</div>
|
|
<div class="settings-row__control">
|
|
${t?.selected.configured?I`<button
|
|
class="btn"
|
|
?disabled=${r}
|
|
@click=${()=>void e.inherit()}
|
|
>
|
|
${e.scope===`agent`?V(`agentTools.githubUseSystemNewRuns`):V(`agentTools.githubUseNativeNewRuns`)}
|
|
</button>`:F}
|
|
</div>
|
|
</div>
|
|
${W({title:V(`agentTools.githubCloudNoteTitle`),description:V(`agentTools.githubCloudNote`)})}
|
|
`)}var Ar,jr,Mr;function Nr(){return(Nr=e((()=>{L(),Ye(),G(),z(),xe(),N(),ke(),Ar={available:{kind:`ok`,label:`agentTools.githubStateVerified`},unverified:{kind:`warn`,label:`agentTools.githubStateUnverified`},rate_limited:{kind:`warn`,label:`agentTools.githubStateRateLimited`},unavailable:{kind:`danger`,label:`agentTools.githubStateUnavailable`},configured_unavailable:{kind:`danger`,label:`agentTools.githubStateConfiguredUnavailable`}},jr={native:`agentTools.githubKindNative`,"managed-pat":`agentTools.githubKindPat`,"managed-oauth":`agentTools.githubKindOAuth`},Mr={available:`agentTools.githubRefreshAvailable`,expired:`agentTools.githubRefreshExpired`,unavailable:`agentTools.githubRefreshUnavailable`,refreshing:`agentTools.githubRefreshRefreshing`,failed:`agentTools.githubRefreshFailed`,not_applicable:`common.na`}})))()}function Pr(e){let t=Z(e);if(!t)return{kind:`exact`,value:``};if(t===`*`)return{kind:`all`};if(!t.includes(`*`))return{kind:`exact`,value:t};let n=t.replace(/[.*+?^${}()|[\\]\\]/g,`\\$&`);return{kind:`regex`,value:RegExp(`^${n.replaceAll(`\\*`,`.*`)}$`)}}function Fr(e){return Array.isArray(e)?br(e).map(Pr).filter(e=>e.kind!==`exact`||e.value.length>0):[]}function Q(e,t){for(let n of t)if(n.kind===`all`||n.kind===`exact`&&e===n.value||n.kind===`regex`&&n.value.test(e))return!0;return!1}function Ir(e,t){if(!t)return!0;let n=Z(e);if(Q(n,Fr(t.deny)))return!1;let r=Fr(t.allow);return!!(r.length===0||Q(n,r)||n===`apply_patch`&&Q(`exec`,r))}function Lr(e,t){if(!Array.isArray(t)||t.length===0)return!1;let n=Z(e),r=Fr(t);return!!(Q(n,r)||n===`apply_patch`&&Q(`exec`,r))}function Rr(){return(Rr=e((()=>{wr()})))()}function zr(e){return e.length===0?F:I`
|
|
<div class="agent-tool-badges">
|
|
${e.map(e=>I`<span class="settings-row__value">${e}</span>`)}
|
|
</div>
|
|
`}function Br(e,t){let n=t.source??e.source,r=t.pluginId??e.pluginId,i=[];return n===`plugin`&&r?i.push(V(`agentTools.plugin`,{id:r})):n===`core`&&i.push(V(`agentTools.builtIn`)),t.optional&&i.push(V(`agentTools.optional`)),i}function Vr(e){let t=Br(e.section,e.tool);return e.activeEntry&&t.unshift(V(`agentTools.liveNow`)),t}function Hr(e){return e.denied?V(`agentTools.disabledByOverride`):e.allowed&&e.baseAllowed?V(`agentTools.enabledByProfile`):e.allowed?V(`agentTools.enabledByOverride`):V(`agentTools.notIncluded`)}function Ur(e,t){let n=t.source??e.source,r=t.pluginId??e.pluginId;return n===`plugin`&&r?V(`agentTools.plugin`,{id:r}):V(`agentTools.builtIn`)}function Wr(e){return e.denied?V(`agentTools.overrideOff`):e.allowed&&e.baseAllowed?V(`agentTools.enabled`):e.allowed?V(`agentTools.overrideOn`):V(`agentTools.profileOff`)}function Gr(e){return e.activeEntry?V(`agentTools.liveNow`):e.runtimeSessionMatchesSelectedAgent?V(`agentTools.notLive`):V(`agentTools.otherAgent`)}function Kr(e){return`agent-tool-${Z(e).replace(/[^a-z0-9_-]+/g,`-`)}`}function qr(e){return(e??[]).flatMap(e=>e.tools)}function Jr(e){let t=e.currentTarget;if(!(!(t instanceof HTMLDetailsElement)||t.open))for(let e of t.querySelectorAll(`.agent-tool-card[open]`))e.open=!1}function Yr(e,t){let n=document.getElementById(t);if(!(n instanceof HTMLDetailsElement))return;e.preventDefault();let r=n.closest(`.agent-tools-group`);r&&(r.open=!0),n.open=!0;let i=new URL(window.location.href);i.hash=t,window.history.replaceState(null,``,i),requestAnimationFrame(()=>{n.scrollIntoView?.({block:`center`,behavior:st()}),n.querySelector(`summary`)?.focus()})}function Xr(e){let t=e?.notices??[];return t.length===0?F:I`
|
|
<div class="agent-tools-notices">
|
|
${t.map(e=>I`
|
|
<div
|
|
class="callout ${e.severity===`warning`?`warning`:`info`}"
|
|
style="margin-top: 12px"
|
|
>
|
|
${Se(e.message)}
|
|
</div>
|
|
`)}
|
|
</div>
|
|
`}function Zr(e){return e.source===`plugin`?e.pluginId?V(`agentTools.connectedSource`,{id:e.pluginId}):V(`agentTools.connected`):e.source===`channel`?e.channelId?V(`agentTools.channelSource`,{id:e.channelId}):V(`agentTools.channel`):e.source===`mcp`?`MCP`:V(`agentTools.builtIn`)}function Qr(e){let t=S(e.configForm,e.agentId),n=t.entry?.tools??{},r=t.globalTools??{},i=n.profile??r.profile??`full`,a=ye(e.toolsCatalogResult),o=we(e.toolsCatalogResult),s=n.profile?V(`agentTools.profileSourceAgent`):r.profile?V(`agentTools.profileSourceGlobal`):V(`agentTools.profileSourceDefault`),c=Array.isArray(n.allow)&&n.allow.length>0,l=Array.isArray(r.allow)&&r.allow.length>0,u=e.canUpdateConfig&&!!e.configForm&&!e.configLoading&&!e.configSaving&&!c&&!(e.toolsCatalogLoading&&!e.toolsCatalogResult&&!e.toolsCatalogError),d=c?[]:Array.isArray(n.alsoAllow)?n.alsoAllow:[],f=c?[]:Array.isArray(n.deny)?n.deny:[],p=c?{allow:n.allow??[],deny:n.deny??[]}:xr(i),m=o.flatMap(e=>e.tools.map(e=>e.id)),h=e=>{let t=Ir(e,p),n=Lr(e,d),r=Lr(e,f);return{allowed:(t||n)&&!r,baseAllowed:t,denied:r}},g=m.filter(e=>h(e).allowed).length,_=e.runtimeSessionMatchesSelectedAgent&&!e.toolsEffectiveError?qr(e.toolsEffectiveResult?.groups):[],v=Array.from(new Map(_.map(e=>[Z(e.id),e])).values()),y=v.slice(0,ni),b=Math.max(0,v.length-y.length),ee=v.length,x=new Map(_.map(e=>[Z(e.id),e])),C=new Set(x.keys()),w=e=>e.toSorted((e,t)=>{let n=Z(e.id),r=Z(t.id),i=+!!C.has(n),a=+!!C.has(r);if(i!==a)return a-i;let o=+!!h(e.id).allowed,s=+!!h(t.id).allowed;return o===s?e.label.localeCompare(t.label):s-o}),T=(t,n)=>{let r=new Set(d.map(e=>Z(e)).filter(e=>e.length>0)),i=new Set(f.map(e=>Z(e)).filter(e=>e.length>0)),a=h(t).baseAllowed,o=Z(t);n?(i.delete(o),a||r.add(o)):(r.delete(o),i.add(o)),e.onOverridesChange(e.agentId,[...r],[...i])},te=t=>{let n=new Set(d.map(e=>Z(e)).filter(e=>e.length>0)),r=new Set(f.map(e=>Z(e)).filter(e=>e.length>0));for(let e of m){let i=h(e).baseAllowed,a=Z(e);t?(r.delete(a),i||n.add(a)):(n.delete(a),r.add(a))}e.onOverridesChange(e.agentId,[...n],[...r])},E=e.runtimeSessionMatchesSelectedAgent?e.toolsEffectiveLoading&&!e.toolsEffectiveResult&&!e.toolsEffectiveError?K(V(`agentTools.loadingAvailable`)):e.toolsEffectiveError?K(V(`agentTools.availableError`)):(e.toolsEffectiveResult?.groups?.length??0)===0?K(V(`agentTools.noAvailable`)):I`
|
|
<div class="agents-panel-body">
|
|
<div class="agent-tools-runtime">
|
|
${y.map(e=>{let t=Kr(e.id);return I`
|
|
<a
|
|
class="agent-tools-runtime-chip"
|
|
href="#${t}"
|
|
@click=${e=>Yr(e,t)}
|
|
>
|
|
<span class="mono" translate="no">${e.label}</span>
|
|
<span class="agent-tools-runtime-chip__meta"
|
|
>${Zr(e)}</span
|
|
>
|
|
</a>
|
|
`})}
|
|
${b>0?I`
|
|
<span
|
|
class="agent-tools-runtime-chip agent-tools-runtime-chip--more"
|
|
title=${V(`agentTools.moreLiveTitle`,{count:String(b)})}
|
|
>
|
|
${V(`agentTools.moreLive`,{count:String(b)})}
|
|
</span>
|
|
`:F}
|
|
</div>
|
|
</div>
|
|
`:K(V(`agentTools.switchAgent`));return I`
|
|
${e.configForm?F:I`<div class="callout info">${V(`agentTools.loadConfig`)}</div>`}
|
|
${c?I`<div class="callout info">${V(`agentTools.explicitAllowlist`)}</div>`:F}
|
|
${l?I`<div class="callout info">${V(`agentTools.globalAllowlist`)}</div>`:F}
|
|
${e.toolsCatalogLoading&&!e.toolsCatalogResult&&!e.toolsCatalogError?I`<div class="callout info">${V(`agentTools.loadingCatalog`)}</div>`:F}
|
|
${e.toolsCatalogError?I`<div class="callout info">${V(`agentTools.catalogFallback`)}</div>`:F}
|
|
${q({title:V(`agentTools.title`),description:I`${V(`agentTools.subtitle`)}
|
|
<span class="mono"
|
|
>${V(`agentTools.enabledSummary`,{enabled:String(g),total:String(m.length)})}</span
|
|
>`,actions:I`
|
|
<button class="btn btn--sm" ?disabled=${!u} @click=${()=>te(!0)}>
|
|
${V(`agentTools.enableAll`)}
|
|
</button>
|
|
<button class="btn btn--sm" ?disabled=${!u} @click=${()=>te(!1)}>
|
|
${V(`agentTools.disableAll`)}
|
|
</button>
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${e.configLoading}
|
|
@click=${e.onConfigReload}
|
|
>
|
|
${V(`common.reloadConfig`)}
|
|
</button>
|
|
<button
|
|
class="btn btn--sm primary"
|
|
?disabled=${!e.canUpdateConfig||e.configSaving||!e.configDirty}
|
|
@click=${e.onConfigSave}
|
|
>
|
|
${e.configSaving?V(`common.saving`):V(`common.save`)}
|
|
</button>
|
|
`},I`
|
|
<dl class="settings-kv">
|
|
<dt>${V(`agentTools.profile`)}</dt>
|
|
<dd><code>${i}</code></dd>
|
|
<dt>${V(`agentTools.source`)}</dt>
|
|
<dd>${s}</dd>
|
|
<dt>${V(`agentTools.enabled`)}</dt>
|
|
<dd><code>${g}/${m.length}</code></dd>
|
|
<dt>${V(`agentTools.live`)}</dt>
|
|
<dd><code>${ee}</code></dd>
|
|
<dt>${V(`agentTools.status`)}</dt>
|
|
<dd>
|
|
${e.configSaving?V(`agentTools.statusSaving`):e.configDirty?V(`agentTools.statusUnsaved`):V(`agentTools.statusSaved`)}
|
|
</dd>
|
|
</dl>
|
|
${W({title:V(`agentTools.quickPresets`),stacked:!0,control:I`
|
|
<div class="agent-tools-buttons">
|
|
${a.map(t=>I`
|
|
<button
|
|
class="btn btn--sm ${i===t.id?`active`:``}"
|
|
?disabled=${!u}
|
|
@click=${()=>e.onProfileChange(e.agentId,t.id,!0)}
|
|
>
|
|
${t.label}
|
|
</button>
|
|
`)}
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${!u}
|
|
@click=${()=>e.onProfileChange(e.agentId,null,!1)}
|
|
>
|
|
${V(`agentTools.inherit`)}
|
|
</button>
|
|
</div>
|
|
`})}
|
|
`)}
|
|
${q({title:V(`agentTools.availableNow`),description:I`${V(`agentTools.availableNowSubtitle`)}
|
|
<span class="mono">${e.runtimeSessionKey||V(`agentTools.noSession`)}</span>`},I`${Xr(e.toolsEffectiveResult)}${E}`)}
|
|
${kr(e.githubIdentity)}
|
|
${q({title:V(`agentTools.catalogTitle`)},I`
|
|
<div class="agents-panel-body agent-tools-grid">
|
|
${o.map(t=>{let n=w(t.tools),r=t.tools.filter(e=>h(e.id).allowed).length,i=t.tools.filter(e=>C.has(Z(e.id))).length,a=n.slice(0,4),o=Math.max(0,n.length-a.length);return I`
|
|
<details class="agent-tools-group" @toggle=${Jr}>
|
|
<summary class="agent-tools-group__summary">
|
|
<span class="agent-tools-group__summary-main">
|
|
<span class="agent-tools-group__title">
|
|
${t.label}
|
|
${t.source===`plugin`&&t.pluginId?I`<span class="settings-row__value"
|
|
>${V(`agentTools.plugin`,{id:t.pluginId})}</span
|
|
>`:F}
|
|
</span>
|
|
<span
|
|
class="agent-tools-group__preview"
|
|
aria-label=${V(`agentTools.toolPreview`)}
|
|
>
|
|
${a.map(e=>I`<span class="mono" translate="no" title=${e.label}
|
|
>${e.label}</span
|
|
>`)}
|
|
${o>0?I`<span
|
|
>${V(`agentTools.more`,{count:String(o)})}</span
|
|
>`:F}
|
|
</span>
|
|
</span>
|
|
<span class="agent-tools-group__counts">
|
|
<span
|
|
>${V(t.tools.length===1?`agentTools.toolsOne`:`agentTools.tools`,{count:String(t.tools.length)})}</span
|
|
>
|
|
<span
|
|
>${V(r===1?`agentTools.enabledToolsOne`:`agentTools.enabledTools`,{count:String(r)})}</span
|
|
>
|
|
${i>0?I`<span
|
|
>${V(i===1?`agentTools.liveToolsOne`:`agentTools.liveTools`,{count:String(i)})}</span
|
|
>`:F}
|
|
</span>
|
|
</summary>
|
|
<div class="agent-tools-list agent-tools-list--stacked">
|
|
${n.map(n=>{let r=Kr(n.id),i=h(n.id),a=x.get(Z(n.id))??null,o=n.defaultProfiles??[],s=Vr({section:t,tool:n,activeEntry:a}),c=Wr(i),l=Gr({activeEntry:a,runtimeSessionMatchesSelectedAgent:e.runtimeSessionMatchesSelectedAgent});return I`
|
|
<details class="agent-tool-card" id=${r}>
|
|
<summary class="agent-tool-summary">
|
|
<div class="agent-tool-summary__main">
|
|
<div class="agent-tool-summary__title-row">
|
|
<span class="agent-tool-title mono" translate="no"
|
|
>${n.label}</span
|
|
>
|
|
</div>
|
|
<div class="agent-tool-sub">${n.description}</div>
|
|
</div>
|
|
<dl class="agent-tool-summary__facts">
|
|
<div class="agent-tool-summary__fact">
|
|
<dt class="label">${V(`agentTools.access`)}</dt>
|
|
<dd>${c}</dd>
|
|
</div>
|
|
<div class="agent-tool-summary__fact">
|
|
<dt class="label">${V(`agentTools.session`)}</dt>
|
|
<dd>${l}</dd>
|
|
</div>
|
|
</dl>
|
|
<div class="agent-tool-summary__badges">
|
|
${zr(s)}
|
|
</div>
|
|
<span
|
|
class="agent-tool-toggle"
|
|
@click=${e=>e.stopPropagation()}
|
|
@keydown=${e=>e.stopPropagation()}
|
|
>
|
|
${_t({checked:i.allowed,disabled:!u,ariaLabel:V(i.allowed?`agentTools.disableNamed`:`agentTools.enableNamed`,{name:n.label}),onChange:e=>T(n.id,e)})}
|
|
</span>
|
|
</summary>
|
|
<div class="agent-tool-details">
|
|
<div class="agent-tool-details-strip">
|
|
<div class="agent-tool-detail agent-tool-detail--inline">
|
|
<div class="label">${V(`agentTools.access`)}</div>
|
|
<div>${Hr(i)}</div>
|
|
</div>
|
|
<div class="agent-tool-detail agent-tool-detail--inline">
|
|
<div class="label">${V(`agentTools.source`)}</div>
|
|
<div>${Ur(t,n)}</div>
|
|
</div>
|
|
${o.length>0?I`
|
|
<div class="agent-tool-detail agent-tool-detail--inline">
|
|
<div class="label">${V(`agentTools.defaultPresets`)}</div>
|
|
<div class="agent-tool-badges">
|
|
${o.map(e=>I`<span class="settings-row__value"
|
|
>${e}</span
|
|
>`)}
|
|
</div>
|
|
</div>
|
|
`:F}
|
|
<div class="agent-tool-detail agent-tool-detail--inline">
|
|
<div class="label">${V(`agentTools.session`)}</div>
|
|
<div>
|
|
${a?V(`agentTools.availableVia`,{source:Zr(a)}):e.runtimeSessionMatchesSelectedAgent?V(`agentTools.unavailableSession`):V(`agentTools.inspectAgent`)}
|
|
</div>
|
|
</div>
|
|
<a class="agent-tool-jump" href="#${r}">
|
|
${V(`agentTools.linkTool`)}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</details>
|
|
`})}
|
|
</div>
|
|
</details>
|
|
`})}
|
|
</div>
|
|
`)}
|
|
`}function $r(e){let r=e.canUpdateConfig&&!!e.configForm&&!e.configLoading&&!e.configSaving,i=S(e.configForm,e.agentId),a=Array.isArray(i.entry?.skills)?t(i.entry.skills):void 0,o=j(e.configForm,e.agentId),s=new Set(o??[]),c=o!==void 0,l=a===void 0&&c,u=e.canPatchConfig&&a!==void 0&&!!e.configForm&&!e.configLoading&&!e.configSaving,d=!!(e.report&&e.activeAgentId===e.agentId),f=d?e.report?.skills??[]:[],p=n(e.filter),m=p?f.filter(e=>n([e.name,e.description,e.source].join(` `)).includes(p)):f,h=kt(m),g=c?f.filter(e=>s.has(e.name)).length:f.length,_=f.length;return I`
|
|
${e.configForm?F:I`<div class="callout info">${V(`agents.skillsPanel.loadConfig`)}</div>`}
|
|
${c?I`<div class="callout info">
|
|
${V(l?`agents.skillsPanel.inheritedAllowlist`:`agents.skillsPanel.customAllowlist`)}
|
|
</div>`:I`<div class="callout info">${V(`agents.skillsPanel.allEnabled`)}</div>`}
|
|
${!d&&!e.loading?I`<div class="callout info">${V(`agents.skillsPanel.loadAgent`)}</div>`:F}
|
|
${e.error?I`<div class="callout danger">${e.error}</div>`:F}
|
|
${q({title:V(`agents.skillsPanel.title`),description:I`${V(`agents.skillsPanel.subtitle`)}
|
|
${_>0?I`<span class="mono">${g}/${_}</span>`:F}`,actions:I`
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${!r}
|
|
@click=${()=>e.onDisableAll(e.agentId)}
|
|
>
|
|
${V(`agentTools.disableAll`)}
|
|
</button>
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${!u}
|
|
@click=${()=>e.onClear(e.agentId)}
|
|
>
|
|
${V(`common.reset`)}
|
|
</button>
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${e.configLoading}
|
|
@click=${e.onConfigReload}
|
|
>
|
|
${V(`common.reloadConfig`)}
|
|
</button>
|
|
<button class="btn btn--sm" ?disabled=${e.loading} @click=${e.onRefresh}>
|
|
${e.loading?V(`common.loading`):V(`common.refresh`)}
|
|
</button>
|
|
<button
|
|
class="btn btn--sm primary"
|
|
?disabled=${!e.canUpdateConfig||e.configSaving||!e.configDirty}
|
|
@click=${e.onConfigSave}
|
|
>
|
|
${e.configSaving?V(`common.saving`):V(`common.save`)}
|
|
</button>
|
|
`},I`
|
|
${W({title:V(`agents.skillsPanel.filter`),description:V(`agents.skillsPanel.shown`,{count:String(m.length)}),control:I`
|
|
<input
|
|
class="settings-input"
|
|
.value=${e.filter}
|
|
@input=${t=>e.onFilterChange(t.target.value)}
|
|
placeholder=${V(`agents.skillsPanel.searchPlaceholder`)}
|
|
autocomplete="off"
|
|
name="agent-skills-filter"
|
|
/>
|
|
`})}
|
|
${m.length===0?K(V(`agents.skillsPanel.empty`)):I`
|
|
<div class="agents-panel-body agent-skills-groups">
|
|
${h.map(t=>ei(t,{agentId:e.agentId,allowSet:s,usingAllowlist:c,editable:r,filterActive:!!p,onToggle:e.onToggle}))}
|
|
</div>
|
|
`}
|
|
`)}
|
|
`}function ei(e,t){let n=!t.filterActive&&(e.id===`workspace`||e.id===`built-in`);return I`
|
|
<details class="agent-skills-group" ?open=${!n}>
|
|
<summary class="agent-skills-header">
|
|
<span>${e.label}</span>
|
|
<span class="muted">${e.skills.length}</span>
|
|
</summary>
|
|
<div class="list skills-grid">
|
|
${e.skills.map(e=>ti(e,{agentId:t.agentId,allowSet:t.allowSet,usingAllowlist:t.usingAllowlist,editable:t.editable,onToggle:t.onToggle}))}
|
|
</div>
|
|
</details>
|
|
`}function ti(e,t){let n=!t.usingAllowlist||t.allowSet.has(e.name),r=Mt(e),i=Ot(e);return I`
|
|
<div class="settings-row agent-skill-row">
|
|
<div class="settings-row__text">
|
|
<span class="settings-row__title"
|
|
>${e.emoji?`${e.emoji} `:``}${e.name}</span
|
|
>
|
|
<span class="settings-row__desc">${e.description}</span>
|
|
${Dt({skill:e})}
|
|
${r.length>0?I`<span class="settings-row__desc">
|
|
${V(`agents.skillsPanel.missing`,{items:r.join(`, `)})}
|
|
</span>`:F}
|
|
${i.length>0?I`<span class="settings-row__desc">
|
|
${V(`agents.skillsPanel.reason`,{items:i.join(`, `)})}
|
|
</span>`:F}
|
|
</div>
|
|
<div class="settings-row__control">
|
|
${_t({checked:n,disabled:!t.editable,ariaLabel:e.name,onChange:n=>t.onToggle(t.agentId,e.name,n)})}
|
|
</div>
|
|
</div>
|
|
`}var ni;function ri(){return(ri=e((()=>{i(),L(),wr(),G(),z(),P(),N(),jt(),At(),Nr(),Rr(),ni=12})))()}function ii(e){let t=new Map(e.map(e=>[e.id,e])),n=new Map,r=[];for(let i of e){let e=i.creatorAgentId;if(e&&e!==i.id&&t.has(e)){let t=n.get(e)??[];t.push(i),n.set(e,t)}else r.push(i)}let i=[],a=new Set,o=(e,t)=>{if(!a.has(e.id)){a.add(e.id),i.push({agent:e,...t>0&&e.creatorAgentId?{creatorAgentId:e.creatorAgentId}:{}});for(let r of n.get(e.id)??[])o(r,t+1)}};return r.forEach(e=>o(e,0)),e.forEach(e=>o(e,0)),i}function ai(e){let t=e.agentsList?.agents??[],n=e.agentsList?.defaultId??null,r=e.selectedAgentId??n??t[0]?.id??null,i=r?t.find(e=>e.id===r)??null:null,a=ii(t).map(({agent:e,creatorAgentId:t})=>({value:e.id,label:T(e),agent:e,description:t?V(`agents.createdBy`,{id:t}):void 0,badge:C(e.id,n)??void 0})),o=r&&e.agentSkills.agentId===r?e.agentSkills.report?.skills?.length??null:null,s=e.channels.snapshot?Object.keys(e.channels.snapshot.channelAccounts??{}).length:null,c=r?e.cron.jobsTotal:null,l={files:e.agentFiles.list?.files?.length??null,skills:o,channels:s,cron:c||null};return I`
|
|
<div class="agents-layout">
|
|
<section class="agents-toolbar">
|
|
<div class="agents-toolbar-row">
|
|
${a.length>1?I`
|
|
<div class="agents-control-select">
|
|
<openclaw-agent-select
|
|
.options=${a}
|
|
.value=${r??``}
|
|
.accessibleLabel=${V(`usage.filters.agent`)}
|
|
.identityById=${e.agentIdentityById}
|
|
.authToken=${e.authToken}
|
|
.disabled=${e.loading}
|
|
.onSelect=${e.onSelectAgent}
|
|
.onCreateAgent=${e.access.canCreateAgent?e.onCreateAgent:null}
|
|
></openclaw-agent-select>
|
|
</div>
|
|
`:F}
|
|
<div class="agents-toolbar-actions">
|
|
${a.length<=1&&e.access.canCreateAgent?I`
|
|
<button
|
|
class="btn btn--sm btn--ghost agents-create-btn"
|
|
?disabled=${e.loading}
|
|
@click=${e.onCreateAgent}
|
|
>
|
|
${V(`custodian.newAgent`)}
|
|
</button>
|
|
`:F}
|
|
${i?I`
|
|
${Le(i.id,I`
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm btn--ghost"
|
|
@click=${e=>void Ze(e,i.id,V(`agents.copyId`))}
|
|
>
|
|
<span data-copy-label>${V(`agents.copyId`)}</span>
|
|
</button>
|
|
`)}
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm btn--ghost"
|
|
?disabled=${!e.access.canUpdateConfig||!!(n&&i.id===n)}
|
|
@click=${()=>e.onSetDefault(i.id)}
|
|
>
|
|
${n&&i.id===n?V(`agents.default`):V(`agents.setDefault`)}
|
|
</button>
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm btn--ghost"
|
|
@click=${()=>e.onTogglePinnedAgent(i.id)}
|
|
>
|
|
${e.pinnedAgentIds.includes(i.id)?V(`agents.unpinFromSwitcher`):V(`agents.pinToSwitcher`)}
|
|
</button>
|
|
`:F}
|
|
<button
|
|
class="btn btn--sm agents-refresh-btn"
|
|
?disabled=${e.loading}
|
|
@click=${e.onRefresh}
|
|
>
|
|
${e.loading?V(`common.loading`):V(`common.refresh`)}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
${e.error?I`<div class="callout danger" style="margin-top: 8px;">${e.error}</div>`:F}
|
|
</section>
|
|
<section class="agents-main">
|
|
<div class="settings-group">
|
|
${pt({title:V(`agents.defaults.title`),description:V(`agents.defaults.description`),onClick:e.onOpenAgentDefaults})}
|
|
</div>
|
|
${i?I`
|
|
${oi(e.activePanel,t=>e.onSelectPanel(t),l)}
|
|
<div
|
|
id="agent-panel"
|
|
class="settings-stack"
|
|
role="tabpanel"
|
|
aria-labelledby=${`agents-tab-${e.activePanel}`}
|
|
>
|
|
${e.config.error?I`<div class="callout danger" role="alert">${e.config.error}</div>`:F}
|
|
${e.activePanel===`overview`?Le(i.id,An({agent:i,basePath:e.basePath,defaultId:n,configForm:e.config.form,agentFilesList:e.agentFiles.list,agentIdentity:e.agentIdentityById[i.id]??null,agentIdentityError:e.agentIdentityError,agentIdentityLoading:e.agentIdentityLoading,identityDraft:e.identityDraft,identitySaving:e.identitySaving,identityError:e.identityError,canUpdateConfig:e.access.canUpdateConfig,canUpdateIdentity:e.access.canUpdateIdentity,configLoading:e.config.loading,configSaving:e.config.saving,configDirty:e.config.dirty,modelCatalog:e.modelCatalog,modelCatalogError:e.modelCatalogError,onConfigReload:e.onConfigReload,onConfigSave:e.onConfigSave,onIdentityFieldChange:e.onIdentityFieldChange,onIdentityAvatarSelect:e.onIdentityAvatarSelect,onIdentitySave:e.onIdentitySave,onModelChange:e.onModelChange,onModelFallbacksChange:e.onModelFallbacksChange,onModelCatalogRetry:e.onModelCatalogRetry,onSelectPanel:e.onSelectPanel})):F}
|
|
${e.activePanel===`files`?qn({agentId:i.id,agentFilesList:e.agentFiles.list,agentFilesLoading:e.agentFiles.loading,agentFilesError:e.agentFiles.error,agentFileActive:e.agentFiles.active,agentFileContents:e.agentFiles.contents,agentFileDrafts:e.agentFiles.drafts,agentFileSaving:e.agentFiles.saving,canWrite:e.access.canWriteFiles,onLoadFiles:e.onLoadFiles,onSelectFile:e.onSelectFile,onFileDraftChange:e.onFileDraftChange,onFileReset:e.onFileReset,onFileSave:e.onFileSave}):F}
|
|
${e.activePanel===`tools`?Qr({agentId:i.id,configForm:e.config.form,configLoading:e.config.loading,configSaving:e.config.saving,configDirty:e.config.dirty,toolsCatalogLoading:e.toolsCatalog.loading,toolsCatalogError:e.toolsCatalog.error,toolsCatalogResult:e.toolsCatalog.result,toolsEffectiveLoading:e.toolsEffective.loading,toolsEffectiveError:e.toolsEffective.error,toolsEffectiveResult:e.toolsEffective.result,runtimeSessionKey:e.runtimeSessionKey,runtimeSessionMatchesSelectedAgent:e.runtimeSessionMatchesSelectedAgent,canUpdateConfig:e.access.canUpdateConfig,githubIdentity:e.githubIdentity,onProfileChange:e.onToolsProfileChange,onOverridesChange:e.onToolsOverridesChange,onConfigReload:e.onConfigReload,onConfigSave:e.onConfigSave}):F}
|
|
${e.activePanel===`skills`?$r({agentId:i.id,report:e.agentSkills.report,loading:e.agentSkills.loading,error:e.agentSkills.error,activeAgentId:e.agentSkills.agentId,configForm:e.config.form,configLoading:e.config.loading,configSaving:e.config.saving,configDirty:e.config.dirty,filter:e.agentSkills.filter,canPatchConfig:e.access.canPatchConfig,canUpdateConfig:e.access.canUpdateConfig,onFilterChange:e.onSkillsFilterChange,onRefresh:e.onSkillsRefresh,onToggle:e.onAgentSkillToggle,onClear:e.onAgentSkillsClear,onDisableAll:e.onAgentSkillsDisableAll,onConfigReload:e.onConfigReload,onConfigSave:e.onConfigSave}):F}
|
|
${e.activePanel===`channels`?Gn({context:w(i,e.config.form,e.agentFiles.list,n,e.agentIdentityById[i.id]??null),configForm:e.config.form,snapshot:e.channels.snapshot,loading:e.channels.loading,error:e.channels.error,lastSuccess:e.channels.lastSuccess,onRefresh:e.onChannelsRefresh,onSelectPanel:e.onSelectPanel}):F}
|
|
${e.activePanel===`cron`?Kn({context:w(i,e.config.form,e.agentFiles.list,n,e.agentIdentityById[i.id]??null),agentId:i.id,jobs:e.cron.jobs,jobsTotal:e.cron.jobsTotal,jobsHasMore:e.cron.jobsHasMore,jobsLoadingMore:e.cron.jobsLoadingMore,status:e.cron.status,scopedTotal:e.cron.scopedTotal,scopedNextWakeAtMs:e.cron.scopedNextWakeAtMs,loading:e.cron.loading,error:e.cron.error,canRunNow:e.access.canRunCron,onRefresh:e.onCronRefresh,onLoadMore:e.onCronLoadMore,onRunNow:e.onCronRunNow,onSelectPanel:e.onSelectPanel}):F}
|
|
${e.activePanel===`memory`?I`
|
|
<div class="settings-group agent-memory-import-row">
|
|
${pt({title:V(`tabs.memory`),description:V(`subtitles.memory`),onClick:()=>e.onOpenMemorySettings?.()})}
|
|
${pt({title:V(`tabs.memoryImport`),description:V(`subtitles.memoryImport`),onClick:()=>e.onOpenMemoryImport?.()})}
|
|
</div>
|
|
<openclaw-agent-memory-panel
|
|
.agentId=${i.id}
|
|
></openclaw-agent-memory-panel>
|
|
`:F}
|
|
</div>
|
|
`:q({title:V(`agents.selectTitle`)},K(V(`agents.selectSubtitle`)))}
|
|
</section>
|
|
</div>
|
|
`}function oi(e,t,n){let r=[{id:`overview`,label:V(`agents.tabs.overview`)},{id:`files`,label:V(`agents.tabs.files`)},{id:`tools`,label:V(`agents.tabs.tools`)},{id:`skills`,label:V(`agents.tabs.skills`)},{id:`channels`,label:V(`agents.tabs.channels`)},{id:`cron`,label:V(`agents.tabs.cronJobs`)},{id:`memory`,label:V(`agents.tabs.memory`)}];return bt({id:`agents`,active:e,tabs:r.map(e=>({value:e.id,label:e.label,count:n[e.id]})),ariaLabel:V(`tabs.agents`),panelId:`agent-panel`,onSelect:t})}function si(){return(si=e((()=>{L(),Me(),Et(),Ye(),xt(),G(),z(),P(),Nt(),jn(),Yn(),ri()})))()}var ci,$;function li(){return(li=e((()=>{$e(),L(),Ne(),He(),Ue(),Ge(),G(),Ct(),z(),P(),E(),Ae(),me(),De(),mt(),N(),tt(),A(),wt(),ge(),je(),Kt(),tn(),gn(),Sn(),En(),kn(),si(),ci=`https://docs.openclaw.ai/concepts/multi-agent`,$=class extends le{constructor(...e){super(...e),this.agentsList=null,this.agentsSelectedId=null,this.toolsCatalogLoading=!1,this.toolsCatalogLoadingAgentId=null,this.toolsCatalogError=null,this.toolsCatalogResult=null,this.toolsEffectiveLoading=!1,this.toolsEffectiveLoadingKey=null,this.toolsEffectiveResultKey=null,this.toolsEffectiveError=null,this.toolsEffectiveResult=null,this.chatModelCatalog=[],this.chatModelCatalogError=null,this.agentFilesLoading=!1,this.agentFilesError=null,this.agentFilesList=null,this.agentFileContents={},this.agentFileDrafts={},this.agentFileActive=null,this.agentFileSaving=!1,this.agentFileWriteRevisions=new Map,this.agentIdentityLoading=!1,this.agentIdentityError=null,this.identityDraft={name:null,emoji:null,avatar:null},this.identitySaving=!1,this.identityError=null,this.agentSkillsLoading=!1,this.agentSkillsError=null,this.agentSkillsReport=null,this.agentSkillsAgentId=null,this.skillsFilter=``,this.cron=it(),this.routeDataInitialized=!1,this.hasBoundAgents=!1,this.agentsSource=null,this.hasBoundAgentIdentity=!1,this.agentIdentitySource=null,this.hasBoundSessions=!1,this.sessionsSource=null,this.chatModelCatalogAgentId=null,this.chatModelCatalogRequest=null,this.normalizedLocation=``,this.githubIdentity=new en({requestUpdate:()=>this.requestUpdate(),runExternalMutation:(e,t)=>this.context.runtimeConfig.runExternalMutation(e,t)}),this.gateway=new Tt(this,{getGateway:()=>this.context?.gateway,onIdentityChange:()=>this.resetForClientChange(),invalidateRequests:e=>{e.identityChanged||(this.invalidateTransientRequests(),this.chatModelCatalog=[],this.chatModelCatalogAgentId=null,this.chatModelCatalogError=null)},onSnapshot:()=>this.syncGatewayState(),ensureInitialData:()=>this.ensureInitialData()}),this.subscriptions=new Oe(this).effect(()=>this.context?.agents,e=>{let t=this.hasBoundAgents;this.hasBoundAgents=!0,this.agentsSource=e,t&&this.resetForAgentsSourceChange(),this.syncAgentState(e),this.ensureInitialData();let n=e.subscribe(()=>{this.agentsSource===e&&this.context.agents===e&&(this.syncAgentState(e),this.ensureAgentIdentities(),this.loadActivePanelData(),this.requestUpdate())});return()=>{n(),this.agentsSource===e&&(this.agentsSource=null)}}).effect(()=>this.context?.agentIdentity,e=>{let t=this.hasBoundAgentIdentity;this.hasBoundAgentIdentity=!0,this.agentIdentitySource=e,t&&(this.invalidateTransientRequests(),this.agentIdentityError=null),this.ensureAgentIdentities(),this.ensureInitialData();let n=e.subscribe(()=>{this.agentIdentitySource===e&&this.context.agentIdentity===e&&this.requestUpdate()});return()=>{n(),this.agentIdentitySource===e&&(this.agentIdentitySource=null)}}).watch(()=>this.context?.channels,(e,t)=>e.subscribe(t)).watch(()=>this.context?.navigation,(e,t)=>e.subscribe(t)).watch(()=>this.context?.runtimeConfig,(e,t)=>e.subscribe(t)).effect(()=>this.context?.sessions,e=>{let t=this.hasBoundSessions;this.hasBoundSessions=!0,this.sessionsSource=e,t&&(this.invalidateTransientRequests(),be(this),this.loadActivePanelData());let n=e.subscribe(()=>{this.sessionsSource===e&&this.context.sessions===e&&(k(this),this.requestUpdate())});return()=>{n(),this.sessionsSource===e&&(this.sessionsSource=null)}})}get sessions(){return this.context.sessions}get agents(){return this.context.agents}get client(){return this.gateway.client}get connected(){return this.gateway.connected}get requestGeneration(){return this.gateway.epoch}get sessionsResult(){return this.context.sessions.state.result}get sessionKey(){return this.context.gateway.snapshot.sessionKey}get agentsPanel(){return this.routeData?.panel??`files`}connectedCallback(){super.connectedCallback(),this.syncCanonicalLocation()}disconnectedCallback(){this.githubIdentity.dispose(),this.subscriptions.clear(),super.disconnectedCallback()}willUpdate(e){e.has(`routeData`)&&(this.applyRouteData(),this.syncCanonicalLocation(),this.ensureInitialData())}syncGatewayState(){(this.cron.client!==this.client||this.cron.connected!==this.connected)&&(this.cron={...this.cron,client:this.client,connected:this.connected})}canCall(e,t){return et(this.context?.gateway?.snapshot,e,t)}syncAgentState(e=this.context.agents){let t=e.state;this.agentsList=t.agentsList?ie(t.agentsList):null,this.agentsList&&this.ensureSelectedAgentInList(this.agentsList),this.syncCurrentAgentFiles(e)}ensureSelectedAgentInList(e){let t=this.agentsSelectedId;(!t||!e.agents.some(e=>e.id===t))&&(this.agentsSelectedId=e.defaultId??e.agents[0]?.id??null)}syncCurrentAgentFiles(e=this.context.agents){let t=this.resolveSelectedAgentId();if(!t||this.agentsPanel!==`files`)return;let n=e.files(t);n.list&&(this.agentFilesList=n.list,this.selectDefaultAgentFile(t))}async selectDefaultAgentFile(e,t=!1){let n=this.agentFilesList?.files??[];(!this.agentFileActive||!n.some(e=>e.name===this.agentFileActive))&&(this.agentFileActive=n.find(e=>e.name===`AGENTS.md`)?.name??null),this.agentFileActive&&await Wt(this,e,this.agentFileActive,{force:t})}resetForClientChange(){this.agentsList=null,this.agentsSelectedId=null,this.chatModelCatalog=[],this.chatModelCatalogAgentId=null,this.chatModelCatalogError=null,this.resetSelectionState()}resetForAgentsSourceChange(){this.agentsList=null,this.agentsSelectedId=null,this.resetSelectionState()}invalidateTransientRequests(){this.gateway.invalidate(),this.agentFilesLoading=!1,this.agentFileSaving=!1,this.agentIdentityLoading=!1,this.agentSkillsLoading=!1,this.toolsCatalogLoading=!1,this.toolsCatalogLoadingAgentId=null,be(this),this.cron={...this.cron,cronLoading:!1,cronJobsLoadingMore:!1,cronJobsReloadPending:!1,cronJobsReloadPendingTableFilters:!1,cronRunsLoadingMore:!1,cronBusy:!1}}applyRouteData(){let e=this.routeData;if(e&&(this.routeDataInitialized=!0,this.gateway.isRouteDataCurrent(e)&&e.agentsList)){this.agentsList=e.agentsList;let t=e.selectedAgentId??this.resolveSelectedAgentId();t!==this.agentsSelectedId&&(this.agentsSelectedId=t,this.resetSelectionState())}}syncCanonicalLocation(){this.normalizedLocation=Cn(this.context,this.routeData,this.normalizedLocation)}resolveSelectedAgentId(){return this.agentsSelectedId??this.agentsList?.defaultId??this.agentsList?.agents?.[0]?.id??null}chatAgentId(){return p(this.sessionKey)?.agentId??this.context.gateway.snapshot.assistantAgentId??this.agentsList?.defaultId??`main`}agentIdentityById(){return Object.fromEntries(this.context.agentIdentity.entries().map(e=>[e.agentId,e]))}controlUiAuthToken(){let{snapshot:e,connection:t}=this.context.gateway;return ze({hello:e.hello,settings:t,password:t.password})}ensureInitialData(){if(!(!this.connected||!this.client||!this.routeDataInitialized)){if(!this.context.runtimeConfig.state.configSnapshot&&!this.context.runtimeConfig.state.configLoading&&this.context.runtimeConfig.ensureLoaded(),!this.agentsList&&!this.context.agents.state.agentsLoading){this.loadAgentsAndCommit();return}this.ensureAgentIdentities(),this.loadActivePanelData()}}isCurrentRequest(e,t,n,r={}){return this.client===e&&this.connected&&this.requestGeneration===t&&(!r.agents||this.context.agents===r.agents)&&(!r.agentIdentity||this.context.agentIdentity===r.agentIdentity)&&(!r.sessions||this.context.sessions===r.sessions)&&(!n||this.resolveSelectedAgentId()===n)}ensureAgentIdentities(){let e=this.client,t=this.context.agentIdentity,n=this.agentsList?.agents.map(e=>e.id).filter(e=>!t.get(e))??[];if(!e||!this.connected||n.length===0||this.agentIdentityLoading)return;let r=this.requestGeneration;this.agentIdentityLoading=!0,this.agentIdentityError=null,t.ensure(n).catch(n=>{this.isCurrentRequest(e,r,void 0,{agentIdentity:t})&&(this.agentIdentityError=M(n))}).finally(()=>{this.isCurrentRequest(e,r,void 0,{agentIdentity:t})&&(this.agentIdentityLoading=!1)})}loadActivePanelData(){let e=this.resolveSelectedAgentId();if(e){if(this.agentsPanel===`overview`){this.ensureModelCatalog();return}if(this.agentsPanel===`files`&&this.agentFilesList?.agentId!==e){this.loadAgentFiles(e);return}if(this.agentsPanel===`skills`&&this.agentSkillsAgentId!==e){Dn(this,e);return}if(this.agentsPanel===`tools`){this.syncGitHubIdentity(e),this.toolsCatalogResult?.agentId!==e&&!this.toolsCatalogLoading&&x(this,e),this.loadEffectiveToolsForAgent(e),this.githubIdentity.statusReadable&&!this.githubIdentity.status&&!this.githubIdentity.loading&&!this.githubIdentity.error&&this.githubIdentity.verify();return}if(this.agentsPanel===`channels`&&!this.context.channels.state.channelsSnapshot){this.context.channels.refresh(!1);return}this.agentsPanel===`cron`&&(this.cron.cronAgentId!==e&&(this.cron=it({client:this.client,connected:this.connected}),this.cron.cronAgentId=e),!this.cron.cronLoading&&!this.cron.cronStatus&&this.refreshCron())}}syncGitHubIdentity(e){let t=this.context.gateway.snapshot,n=(e,n)=>et(t,e,n,{requireAdvertisement:!1});this.githubIdentity.sync({client:this.client,connected:this.connected,agentId:e,config:he(this.context.runtimeConfig.state),statusReadable:n(`tools.github.status`,`operator.read`),configurable:n(`tools.github.configure`,`operator.admin`),authorizable:[`tools.github.authorize.start`,`tools.github.authorize.poll`,`tools.github.authorize.cancel`].every(e=>n(e,`operator.admin`)),clientRevision:this.requestGeneration})}ensureModelCatalog(e={}){let t=this.client,n=this.resolveSelectedAgentId();if(!t||!this.connected||!n)return;if(!e.refresh){let e=b(t,{agentId:n});if(e){this.chatModelCatalog=e.models??[],this.chatModelCatalogAgentId=n,this.chatModelCatalogError=null;return}}let r=this.requestGeneration,i=this.chatModelCatalogRequest;if(i?.client===t&&i.generation===r&&i.agentId===n)return;this.chatModelCatalogAgentId!==n&&(this.chatModelCatalog=[]);let a={client:t,generation:r,agentId:n};this.chatModelCatalogRequest=a,this.chatModelCatalogError=null,(e.refresh?m(t,{agentId:n}):y(t,{agentId:n})).then(e=>{if(this.isCurrentRequest(t,r,n)){let t=e.models??[];this.chatModelCatalog=t,this.chatModelCatalogAgentId=n,this.chatModelCatalogError=null}}).catch(e=>{this.isCurrentRequest(t,r,n)&&(this.chatModelCatalogAgentId=null,this.chatModelCatalogError=M(e))}).finally(()=>{this.chatModelCatalogRequest===a&&(this.chatModelCatalogRequest=null)})}async loadAgentsAndCommit(){let e=this.client,t=this.requestGeneration,n=this.context.agents;e&&(await n.ensureList(),this.isCurrentRequest(e,t,void 0,{agents:n})&&(this.syncAgentState(n),this.ensureAgentIdentities(),this.loadActivePanelData()))}async loadAgentFiles(e,t=!1){let n=this.client,r=this.context.agents;if(!n||!this.connected||this.agentFilesLoading)return;if(r.files(e).list&&!t){this.syncCurrentAgentFiles(r);return}let i=this.requestGeneration;this.agentFilesLoading=!0,this.agentFilesError=null;try{let a=t?await r.refreshFiles(e):await r.ensureFiles(e);if(!this.isCurrentRequest(n,i,e,{agents:r}))return;this.agentFilesList=a??r.files(e).list}finally{this.isCurrentRequest(n,i,e,{agents:r})&&(this.agentFilesLoading=!1)}this.isCurrentRequest(n,i,e,{agents:r})&&await this.selectDefaultAgentFile(e,t)}async refreshCron(){let e=this.cron;!e.connected||!e.client||e.cronLoading||await Promise.all([this.runCronTask(e=>ot(e)),this.runCronTask(e=>vt(e)),this.runCronTask(e=>ft(e,{tableFilters:!0}))])}async runCronTask(e){let t=this.cron;try{let n=e(t);return this.cron===t&&this.requestUpdate(),await n}finally{this.cron===t&&this.requestUpdate()}}saveIdentityDraft(){if(!this.canCall(`agents.update`,`operator.admin`))return;let e=this.client,t=this.resolveSelectedAgentId();if(!e||!t||this.identitySaving)return;let n=this.requestGeneration,r=this.context.agents,i=this.context.agentIdentity;pn({host:this,expectedClient:e,agentId:t,agents:r,agentIdentity:i,runtimeConfig:this.context.runtimeConfig,canDispatch:()=>this.canCall(`agents.update`,`operator.admin`),isCurrent:()=>this.isCurrentRequest(e,n,t,{agents:r,agentIdentity:i}),onSaved:()=>this.syncAgentState(r)})}resetSelectionState(){this.gateway.invalidate(),this.chatModelCatalog=[],this.chatModelCatalogAgentId=null,this.chatModelCatalogError=null,this.agentFilesList=null,this.agentFilesError=null,this.agentFileActive=null,this.agentFileContents={},this.agentFileDrafts={},this.agentFileWriteRevisions.clear(),this.agentFilesLoading=!1,this.agentFileSaving=!1,this.agentSkillsReport=null,this.agentSkillsLoading=!1,this.agentSkillsError=null,this.agentSkillsAgentId=null,this.agentIdentityLoading=!1,this.agentIdentityError=null,un(this),this.toolsCatalogResult=null,this.toolsCatalogError=null,this.toolsCatalogLoading=!1,this.toolsCatalogLoadingAgentId=null,be(this),this.cron=it({client:this.client,connected:this.connected})}toolsPath(e,t){let n=this.context.runtimeConfig.agentEntry(e,{ensure:t});return n?[...n.path,`tools`]:null}loadEffectiveToolsForAgent(e){if(e!==this.chatAgentId()){be(this);return}let t=ve(this,{agentId:e,sessionKey:this.sessionKey});this.toolsEffectiveResultKey===t&&!this.toolsEffectiveError||d(this,{agentId:e,sessionKey:this.sessionKey})}refreshAgents(){let e=this.client,t=this.requestGeneration,n=this.context.agents;e&&(async()=>{await n.refreshList(),this.isCurrentRequest(e,t,void 0,{agents:n})&&(this.syncAgentState(n),this.loadActivePanelData())})()}saveAgentConfig(){if(!this.canCall(`config.set`,`operator.admin`))return;let e=this.client,t=this.requestGeneration,n=this.context.agents;if(!e)return;let r=this.agentsSelectedId;(async()=>{await this.context.runtimeConfig.save()&&(await n.refreshList(),this.isCurrentRequest(e,t,void 0,{agents:n})&&(this.syncAgentState(n),r&&this.agentsList?.agents.some(e=>e.id===r)&&(this.agentsSelectedId=r),this.ensureAgentIdentities(),this.loadActivePanelData()))})()}setDefaultAgent(e){if(!this.canCall(`config.set`,`operator.admin`))return;let t=this.client,n=this.requestGeneration,r=this.context.agents,i=this.context.runtimeConfig;if(!t)return;let a=()=>this.context.runtimeConfig===i&&this.isCurrentRequest(t,n,void 0,{agents:r})&&this.canCall(`config.set`,`operator.admin`);(async()=>{await i.ensureLoaded(),a()&&await ce(i,e,()=>r.refreshList(),a)})()}saveSelectedAgentFile(e,t,n){this.canCall(`agents.files.set`,`operator.admin`)&&Gt(this,e,t,n)}reloadConfig(){this.context.runtimeConfig.refresh({discardPendingChanges:!0})}clearAgentSkills(e){if(!this.canCall(`config.patch`,`operator.admin`))return;let t=this.client,n=this.requestGeneration,r=this.context.agents,i=this.context.runtimeConfig;if(!t)return;let a=()=>this.context.runtimeConfig===i&&this.isCurrentRequest(t,n,e,{agents:r})&&this.canCall(`config.patch`,`operator.admin`);On(i,e,a).then(t=>{if(a()){if(!t){this.agentSkillsError=i.state.lastError??V(`agents.skillsPanel.updateError`);return}this.agentSkillsError=null,Dn(this,e)}})}runCronJobNow(e){this.canCall(`cron.run`,`operator.admin`)&&this.cron.cronJobs.some(t=>t.id===e)&&this.runCronTask(t=>ht(t,e,`force`))}render(){let e=this.context.runtimeConfig.state,t=this.context.agents.state,n=this.resolveSelectedAgentId(),r=he(e),i={canCreateAgent:this.canCall(`openclaw.chat`,`operator.admin`),canPatchConfig:this.canCall(`config.patch`,`operator.admin`),canUpdateConfig:this.canCall(`config.set`,`operator.admin`),canUpdateIdentity:this.canCall(`agents.update`,`operator.admin`),canWriteFiles:this.canCall(`agents.files.set`,`operator.admin`),canRunCron:this.canCall(`cron.run`,`operator.admin`)};return this.syncGitHubIdentity(n),I`
|
|
<section class="content-header">
|
|
<div>
|
|
<div class="page-title">${Re(`agents`)}</div>
|
|
<div class="page-subtitle">
|
|
${Be(`agents`)} ${lt(ci)}
|
|
</div>
|
|
</div>
|
|
</section>
|
|
${St(ai({access:i,basePath:this.context.basePath,authToken:this.controlUiAuthToken(),loading:t.agentsLoading,error:t.agentsError,agentsList:this.agentsList,selectedAgentId:n,activePanel:this.agentsPanel,config:{form:r,loading:e.configLoading,saving:e.configSaving,dirty:e.configFormDirty,error:e.lastError},channels:{snapshot:this.context.channels.state.channelsSnapshot,loading:this.context.channels.state.channelsLoading,error:this.context.channels.state.channelsError,lastSuccess:this.context.channels.state.channelsLastSuccess},cron:{status:this.cron.cronStatus,jobs:this.cron.cronJobs,jobsTotal:this.cron.cronJobsTotal,jobsHasMore:this.cron.cronJobsHasMore,jobsLoadingMore:this.cron.cronJobsLoadingMore,scopedTotal:this.cron.cronScopedTotal,scopedNextWakeAtMs:this.cron.cronScopedNextWakeAtMs,loading:this.cron.cronLoading,error:this.cron.cronError},agentFiles:{list:this.agentFilesList,loading:this.agentFilesLoading,error:this.agentFilesError??this.context.agents.files(n).error,active:this.agentFileActive,contents:this.agentFileContents,drafts:this.agentFileDrafts,saving:this.agentFileSaving},agentIdentityLoading:this.agentIdentityLoading,agentIdentityError:this.agentIdentityError,agentIdentityById:this.agentIdentityById(),identityDraft:this.identityDraft,identitySaving:this.identitySaving,identityError:this.identityError,agentSkills:{report:this.agentSkillsReport,loading:this.agentSkillsLoading,error:this.agentSkillsError,agentId:this.agentSkillsAgentId,filter:this.skillsFilter},toolsCatalog:{loading:this.toolsCatalogLoading,error:this.toolsCatalogError,result:this.toolsCatalogResult},toolsEffective:{loading:this.toolsEffectiveLoading,error:this.toolsEffectiveError,result:this.toolsEffectiveResult},githubIdentity:this.githubIdentity,runtimeSessionKey:this.sessionKey,runtimeSessionMatchesSelectedAgent:n===this.chatAgentId(),modelCatalog:this.chatModelCatalog,modelCatalogError:this.chatModelCatalogError,pinnedAgentIds:this.context.navigation.snapshot.pinnedAgentIds,onTogglePinnedAgent:e=>mn(this.context.navigation,e),onRefresh:()=>this.refreshAgents(),onSelectAgent:e=>wn(this.context,e,n,this.agentsPanel),onCreateAgent:()=>{this.canCall(`openclaw.chat`,`operator.admin`)&&this.context.navigate(`custodian`,{search:`?intent=new-agent`})},onSelectPanel:e=>Tn(this.context,n,this.agentsPanel,e),onLoadFiles:e=>void this.loadAgentFiles(e,!0),onSelectFile:e=>{this.agentFileActive=e,n&&Wt(this,n,e)},onFileDraftChange:(e,t)=>{this.agentFileDrafts={...this.agentFileDrafts,[e]:t}},onFileReset:e=>{this.agentFileDrafts={...this.agentFileDrafts,[e]:this.agentFileContents[e]??``}},onFileSave:e=>{n&&this.saveSelectedAgentFile(n,e,this.agentFileDrafts[e]??this.agentFileContents[e]??``)},onToolsProfileChange:(e,t,n)=>{if(!this.canCall(`config.set`,`operator.admin`))return;let r=this.toolsPath(e,!!(t||n));r&&(t?this.context.runtimeConfig.patchForm([...r,`profile`],t):this.context.runtimeConfig.removeFormValue([...r,`profile`]),n&&this.context.runtimeConfig.removeFormValue([...r,`allow`]))},onToolsOverridesChange:(e,t,n)=>{if(!this.canCall(`config.set`,`operator.admin`))return;let r=this.toolsPath(e,t.length>0||n.length>0);r&&(t.length?this.context.runtimeConfig.patchForm([...r,`alsoAllow`],t):this.context.runtimeConfig.removeFormValue([...r,`alsoAllow`]),n.length?this.context.runtimeConfig.patchForm([...r,`deny`],n):this.context.runtimeConfig.removeFormValue([...r,`deny`]))},onConfigReload:()=>this.reloadConfig(),onConfigSave:()=>this.saveAgentConfig(),onIdentityFieldChange:(e,t)=>{this.canCall(`agents.update`,`operator.admin`)&&dn(this,e,t)},onIdentityAvatarSelect:e=>{this.canCall(`agents.update`,`operator.admin`)&&fn(this,e)},onIdentitySave:()=>this.saveIdentityDraft(),onChannelsRefresh:()=>void this.context.channels.refresh(!1),onOpenMemoryImport:()=>this.context.navigate(`memory-import`),onOpenMemorySettings:()=>this.context.navigate(`memory`),onOpenAgentDefaults:()=>this.context.navigate(`ai-agents`),onCronRefresh:()=>void this.refreshCron(),onCronLoadMore:()=>void this.runCronTask(e=>ft(e,{append:!0,tableFilters:!0})),onCronRunNow:e=>this.runCronJobNow(e),onSkillsFilterChange:e=>this.skillsFilter=e,onSkillsRefresh:()=>{n&&Dn(this,n)},onAgentSkillToggle:(e,t,n)=>{if(!this.canCall(`config.set`,`operator.admin`))return;let r=this.context.runtimeConfig.agentEntry(e,{ensure:!0});if(!r||!t.trim())return;let i=j(he(this.context.runtimeConfig.state),e)??this.agentSkillsReport?.agentSkillFilter??this.agentSkillsReport?.skills?.map(e=>e.name).filter(Boolean)??[],a=new Set(i);n?a.add(t.trim()):a.delete(t.trim()),this.context.runtimeConfig.patchForm([...r.path,`skills`],[...a])},onAgentSkillsClear:e=>this.clearAgentSkills(e),onAgentSkillsDisableAll:e=>{if(!this.canCall(`config.set`,`operator.admin`))return;let t=this.context.runtimeConfig.agentEntry(e,{ensure:!0});t&&this.context.runtimeConfig.patchForm([...t.path,`skills`],[])},onModelChange:(e,t)=>{this.canCall(`config.set`,`operator.admin`)&&(bn(this.context.runtimeConfig,e,t),k(this))},onModelCatalogRetry:()=>this.ensureModelCatalog({refresh:!0}),onModelFallbacksChange:(e,t)=>{this.canCall(`config.set`,`operator.admin`)&&xn(this.context.runtimeConfig,e,t)},onSetDefault:e=>this.setDefaultAgent(e)}))}
|
|
`}},o([Qe({context:We,subscribe:!0})],$.prototype,`context`,void 0),o([Pe({attribute:!1})],$.prototype,`routeData`,void 0),o([R()],$.prototype,`agentsList`,void 0),o([R()],$.prototype,`agentsSelectedId`,void 0),o([R()],$.prototype,`toolsCatalogLoading`,void 0),o([R()],$.prototype,`toolsCatalogLoadingAgentId`,void 0),o([R()],$.prototype,`toolsCatalogError`,void 0),o([R()],$.prototype,`toolsCatalogResult`,void 0),o([R()],$.prototype,`toolsEffectiveLoading`,void 0),o([R()],$.prototype,`toolsEffectiveLoadingKey`,void 0),o([R()],$.prototype,`toolsEffectiveResultKey`,void 0),o([R()],$.prototype,`toolsEffectiveError`,void 0),o([R()],$.prototype,`toolsEffectiveResult`,void 0),o([R()],$.prototype,`chatModelCatalog`,void 0),o([R()],$.prototype,`chatModelCatalogError`,void 0),o([R()],$.prototype,`agentFilesLoading`,void 0),o([R()],$.prototype,`agentFilesError`,void 0),o([R()],$.prototype,`agentFilesList`,void 0),o([R()],$.prototype,`agentFileContents`,void 0),o([R()],$.prototype,`agentFileDrafts`,void 0),o([R()],$.prototype,`agentFileActive`,void 0),o([R()],$.prototype,`agentFileSaving`,void 0),o([R()],$.prototype,`agentIdentityLoading`,void 0),o([R()],$.prototype,`agentIdentityError`,void 0),o([R()],$.prototype,`identityDraft`,void 0),o([R()],$.prototype,`identitySaving`,void 0),o([R()],$.prototype,`identityError`,void 0),o([R()],$.prototype,`agentSkillsLoading`,void 0),o([R()],$.prototype,`agentSkillsError`,void 0),o([R()],$.prototype,`agentSkillsReport`,void 0),o([R()],$.prototype,`agentSkillsAgentId`,void 0),o([R()],$.prototype,`skillsFilter`,void 0),o([R()],$.prototype,`cron`,void 0),customElements.get(`openclaw-agents-page`)||customElements.define(`openclaw-agents-page`,$)})))()}li();
|
|
//# sourceMappingURL=agents-page-DdvclcMH.js.map
|