245 lines
38 KiB
JavaScript
245 lines
38 KiB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Ci as t,Di as n,Fi as r,bn as i,er as a,wn as o}from"./control-ui-foundation-CeFMP1Ly.js";import{Ao as s,Da as c,Oa as l,bc as u,fl as d,fs as f,hc as p,hl as m,ja as ee,jc as te,jo as ne,ml as re,ms as ie,ps as h}from"./control-ui-core-pH6nakZ-.js";import{G as g,J as _,W as v,Z as y,at as b,rt as ae}from"./lit-runtime-BEtFSUCp.js";import{$t as oe,Dn as se,M as ce,Ot as le,Rn as ue,S as de,T as fe,Tn as pe,Xn as me,en as he,j as ge,kt as _e,m as ve,p as ye,zn as be}from"./control-ui-core-DGVkFhVB.js";import{Ht as x,Lt as xe,Rt as Se,kt as Ce,qt as S}from"./control-ui-core-Br5DB0Zj.js";import{In as we,Ln as Te,mt as Ee,pt as De}from"./control-ui-boot-wpHCbPL9.js";import{a as C,i as Oe,n as w,r as T}from"./gateway-runtime-DUNO4Mi1.js";import{aa as ke,as as Ae,ba as je,es as Me,ga as Ne,ia as Pe,is as E,na as Fe,ns as D,ra as Ie,rs as Le,ts as Re,ya as ze}from"./control-ui-boot-Cdpgu1Gm.js";import{Fn as Be,In as Ve,Sn as He,bn as Ue}from"./control-ui-boot-B1lcIXow.js";import{r as We,t as Ge}from"./wizard-step-controls-D3s65of1.js";import"./text-BRLnxsjx.js";import{n as Ke,t as qe}from"./update-confirmation-BNyRSVb0.js";import{n as Je,t as O}from"./custodian-alert-store-BIkN3I10.js";function Ye(e){if(!o(e))return;let t=e.code;return t===k.INFERENCE_UNAVAILABLE?{code:t}:void 0}function Xe(e){if(!o(e))return;let t=e.code;return t===k.SESSION_INVALIDATED?{code:t}:void 0}var k;function A(){return(A=e((()=>{k={INFERENCE_UNAVAILABLE:`system_agent_inference_unavailable`,SESSION_INVALIDATED:`system_agent_session_invalidated`}})))()}async function Ze(e){let{context:t}=e,n=t.gateway.snapshot.sessionKey?.trim();if(e.agentId){let r=await t.agents.refreshList();if(!e.isCurrent())return`stale`;n=p({agentId:e.agentId,mainKey:r?.mainKey}),_e({selection:t.agentSelection,gateway:t.gateway,sessionKey:n,agentId:e.agentId})}return e.hatchDraft&&n?(t.navigate(`chat`,{pathname:Qe(t,n),search:`?draft=${encodeURIComponent(S(`custodian.hatchDraft`))}`}),`navigated`):`exit-setup`}function Qe(e,t){return ee({face:`chat`,sessionKey:t,fallbackAgentId:l(e),basePath:e.basePath,mainKey:te({agentsList:e.agents.state.agentsList,hello:e.gateway.snapshot.hello})}).href}function j(){return(j=e((()=>{le(),x(),c(),u()})))()}function $e(e){return e!==null&&e.length<=512&&e.trim().length>0}function M(){return`control-ui-onboarding-${s()}`}function N(e){try{m()?.setItem(P,e)}catch{}}function et(){let e=null;try{e=m()?.getItem(P)??null}catch{}if($e(e))return{sessionId:e,restored:!0};let t=M();return N(t),{sessionId:t,restored:!1}}var P,F;function I(){return(I=e((()=>{ne(),P=`openclaw.custodian.session.v1`,F=class{constructor(){this.lastDeviceToken=``}key(e){if(!e)return``;let{gatewayUrl:t,token:n,password:r,bootstrapToken:i}=e.connection,a=e.snapshot.hello?.auth;return a&&(this.lastDeviceToken=a.deviceToken??``),JSON.stringify([t,n,r,i,this.lastDeviceToken])}}})))()}function tt(e){if(!e||e.gateway.snapshot.phase!==`connected`)return`unresolved`;let n=e.agents.state.agentsList;if(!n)return`unresolved`;let r=t(e.gateway.snapshot.assistantAgentId??n.defaultId??``),i=n.agents.find(e=>t(e.id)===r);return i?i.model?.primary?.trim()?`ready`:`required`:`unresolved`}function L(){return(L=e((()=>{u()})))()}function R(e,t){return e.options?.find(e=>Object.is(e.value,t))}function nt(e,t){if(e.type===`note`||e.type===`action`||e.type===`progress`)return{answer:{stepId:e.id},display:S(`common.continue`)};if(e.type===`text`)return typeof t==`string`?{answer:{stepId:e.id,value:t},display:t}:null;if(e.type===`confirm`)return typeof t==`boolean`?{answer:{stepId:e.id,value:t},display:S(t?`common.yes`:`common.no`)}:null;if(e.type===`select`){let n=R(e,t);return n?{answer:{stepId:e.id,value:t},display:n.label}:null}if(!Array.isArray(t))return null;if(t.length===0)return{answer:{stepId:e.id,value:[]},display:S(`common.none`)};let n=t.map(t=>R(e,t)?.label);return n.every(e=>e!==void 0)?{answer:{stepId:e.id,value:t},display:n.join(`, `)}:null}function rt(e){return e.type===`multiselect`?Array.isArray(e.initialValue)?[...e.initialValue]:[]:e.initialValue}function it(e){return Oe(e?.gateway.snapshot??{},De.SYSTEM_AGENT_WIZARD_CANCEL)??!1}function z(){return(z=e((()=>{Ee(),x(),T()})))()}function at(e,t){return t===`received`?`sent`:e instanceof oe||t===`unsent`?`rejected`:`unknown`}function ot(e,t){return t===`sent`?!1:t===`unknown`||e}function st(e,t,n){return n!==`rejected`&&e!==null&&e.severity===t.severity&&e.message===t.message}function ct(e,t,n){if(n.event!==`health`)return[e,t];let r=_t(n);return t?[r,t]:[r,null]}function lt(e){if(e.kind===`config-reload`)return S(`custodian.nudge.configReload`);let t=e.channelLabel??S(`custodian.nudge.channelFallback`);return e.kind===`channel-auth`?S(`custodian.nudge.channelAuth`,{channel:t}):e.kind===`channel-disconnected`?S(`custodian.nudge.channelDisconnected`,{channel:t}):S(`custodian.nudge.channelDegraded`,{channel:t})}function ut(e){return _`<div class="custodian__nudge" role="status">
|
||
<button
|
||
class="custodian__nudge-action"
|
||
type="button"
|
||
?disabled=${e.disabled}
|
||
@click=${e.onSend}
|
||
>
|
||
${lt(e.nudge)}
|
||
</button>
|
||
<button
|
||
class="custodian__nudge-dismiss"
|
||
type="button"
|
||
aria-label=${S(`custodian.nudge.dismiss`)}
|
||
@click=${e.onDismiss}
|
||
>
|
||
×
|
||
</button>
|
||
</div>`}function dt(e){return _`<div class="custodian__nudge custodian__nudge--channel-onboarding" role="status">
|
||
<div class="custodian__nudge-copy">
|
||
<strong>${S(`custodian.nudge.channelSetupTitle`)}</strong>
|
||
<span>${S(`custodian.nudge.channelSetupBody`)}</span>
|
||
</div>
|
||
<button
|
||
class="btn btn--sm primary custodian__nudge-cta"
|
||
type="button"
|
||
@click=${e.onOpenChannels}
|
||
>
|
||
${S(`custodian.nudge.channelSetupAction`)}
|
||
</button>
|
||
<button
|
||
class="custodian__nudge-dismiss"
|
||
type="button"
|
||
aria-label=${S(`custodian.nudge.channelSetupDismiss`)}
|
||
@click=${e.onDismiss}
|
||
>
|
||
×
|
||
</button>
|
||
</div>`}function ft(e){return _`<div class="custodian__nudge custodian__nudge--channel-onboarding" role="alert">
|
||
<div class="custodian__nudge-copy">
|
||
<strong>${S(`custodian.nudge.channelStatusErrorTitle`)}</strong>
|
||
<span>${S(`custodian.nudge.channelStatusErrorBody`)}</span>
|
||
</div>
|
||
<button
|
||
class="btn btn--sm primary custodian__nudge-cta"
|
||
type="button"
|
||
?disabled=${e.retrying}
|
||
@click=${e.onRetry}
|
||
>
|
||
${e.retrying?S(`common.loading`):S(`common.retry`)}
|
||
</button>
|
||
<button
|
||
class="custodian__nudge-dismiss"
|
||
type="button"
|
||
aria-label=${S(`custodian.nudge.channelSetupDismiss`)}
|
||
@click=${e.onDismiss}
|
||
>
|
||
×
|
||
</button>
|
||
</div>`}function pt(e){return V.some(t=>e[t]===`configured_unavailable`)}function mt(e){return i(e.probe)?.ok===!1}function ht(e,t,n){if(n.configured===!1||n.enabled===!1)return null;let r=e.toLowerCase();if(pt(n))return{severity:3,kind:`channel-auth`,channelLabel:t,message:`what happened with ${r} authentication?`};let i=typeof n.healthState==`string`?n.healthState.trim().toLowerCase():void 0;if(i===`terminal-disconnect`||mt(n))return{severity:3,kind:`channel-degraded`,channelLabel:t,message:`what happened with ${r}?`};if(i===`not-running`&&n.running===!1){let e=typeof n.reconnectAttempts==`number`?n.reconnectAttempts:0,t=typeof n.lastStartAt==`number`?n.lastStartAt:void 0,r=typeof n.lastStopAt==`number`?n.lastStopAt:void 0;if(n.restartPending===!1&&r!==void 0&&(t===void 0||r>=t)&&e<10)return null}return n.connected!==!0&&i!==`healthy`&&typeof n.lastError==`string`&&n.lastError.trim()?{severity:3,kind:`channel-degraded`,channelLabel:t,message:`what happened with ${r}?`}:n.connected===!1&&n.running===!0?{severity:2,kind:`channel-disconnected`,channelLabel:t,message:`what happened with ${r}?`}:i&&B.has(i)?{severity:1,kind:`channel-degraded`,channelLabel:t,message:`what happened with ${r}?`}:null}function gt(e){let t=i(e);if(!t)return null;if(i(t.configReload)?.hotReloadStatus===`disabled`)return{severity:3,kind:`config-reload`,message:`what happened with configuration reload?`};let n=i(t.channels);if(!n)return null;let r=i(t.channelLabels),a=null;for(let[e,t]of Object.entries(n)){let n=i(t);if(!n)continue;let o=typeof r?.[e]==`string`?r[e]:e,s=i(n.accounts),c=s?Object.values(s).map(i).filter(e=>e!==null):[],l=c.length>0?c:[n];for(let t of l){let n=ht(e,o,t);n&&(!a||n.severity>a.severity)&&(a=n)}}return a}function _t(e){return e.event===`health`?gt(e.payload):null}var B,V;function H(){return(H=e((()=>{v(),he(),x(),B=new Set([`disconnected`,`stale-socket`,`stuck`,`terminal-disconnect`]),V=[`tokenStatus`,`botTokenStatus`,`appTokenStatus`,`signingSecretStatus`,`userTokenStatus`]})))()}function vt(e,t){return e?`onboarding`:t?`new-agent`:`caretaker`}function U(e,t){let n=e===`caretaker`?{}:{welcomeVariant:e};if(t===void 0)return n;let r=window.location.pathname,i=me(r,ue(r));return{...n,message:t,...i?{context:{page:i}}:{}}}function W(e){return e.message!==void 0||e.wizardAnswer!==void 0||e.wizardCancel!==void 0}function yt(e){return Xe(e&&typeof e==`object`?e.details:void 0)!==void 0}function G(){return(G=e((()=>{A(),be()})))()}function bt(e){if(!e||typeof e!=`object`)return null;let t=n(e.id),r=n(e.header),i=n(e.question);if(!t||!r||!i||!Array.isArray(e.options)||e.options.length<2||e.options.length>4)return null;let a=[];for(let t of e.options){let e=n(t?.label);if(!e)return null;let r=n(t.description??null),i=n(t.reply??null);a.push({label:e,...r?{description:r}:{},...t.recommended===!0?{recommended:!0}:{},...i?{reply:i}:{}})}return new Set(a.map(e=>e.label.toLocaleLowerCase())).size!==a.length||a.filter(e=>e.recommended).length>1?null:{id:t,header:r,question:i,options:a,isOther:e.isOther===!0,...e.skipAction===`exit`?{skipAction:`exit`}:{}}}function K(){return(K=e((()=>{})))()}var q;function xt(){return(xt=e((()=>{v(),y(),x(),q=class extends r{constructor(...e){super(...e),this.selectedValue=``,this.requestKey=``,this.focusPreselection=!1}createRenderRoot(){return this}willUpdate(){let e=this.props,t=e?JSON.stringify([e.header??``,e.question,e.options.map(e=>[e.value,e.label,e.recommended===!0])]):``;t!==this.requestKey&&(this.requestKey=t,this.selectedValue=e?.options.slice(0,4).find(e=>e.recommended)?.value??``,this.focusPreselection=!!this.selectedValue)}updated(e){!this.focusPreselection||this.props?.disabled||(this.focusPreselection=!1,[...this.querySelectorAll(`.option-card__choice`)].find(e=>e.dataset.optionValue===this.selectedValue)?.focus({preventScroll:!0}))}select(e){this.props?.disabled||(this.selectedValue=e,this.props?.onSelect?.(e),this.dispatchEvent(new CustomEvent(`option-select`,{bubbles:!0,composed:!0,detail:{value:e}})))}skip(){this.props?.disabled||(this.props?.onSkip?.(),this.dispatchEvent(new CustomEvent(`option-skip`,{bubbles:!0,composed:!0})))}render(){let e=this.props;if(!e)return g;let t=e.options.slice(0,4),n=t.findIndex(e=>e.recommended===!0);return _`
|
||
<section class="option-card" role="group" aria-label=${e.question}>
|
||
${e.header?_`<div class="option-card__chip">${e.header}</div>`:g}
|
||
<div class="option-card__question">${e.question}</div>
|
||
<div class="option-card__choices" role="radiogroup">
|
||
${t.map((t,r)=>{let i=r===n,a=t.value===this.selectedValue;return _`
|
||
<button
|
||
class=${`option-card__choice ${i?`option-card__choice--recommended`:``} ${a?`option-card__choice--selected`:``}`}
|
||
type="button"
|
||
role="radio"
|
||
aria-checked=${a?`true`:`false`}
|
||
data-option-value=${t.value}
|
||
?disabled=${e.disabled}
|
||
@click=${()=>this.select(t.value)}
|
||
>
|
||
<span class="option-card__choice-copy">
|
||
<strong>${t.label}</strong>
|
||
${t.description?_`<span class="option-card__description">${t.description}</span>`:g}
|
||
</span>
|
||
${i?_`<span class="option-card__recommended">
|
||
${S(`optionCard.recommended`)}
|
||
</span>`:g}
|
||
</button>
|
||
`})}
|
||
</div>
|
||
<button
|
||
class="option-card__skip"
|
||
type="button"
|
||
?disabled=${e.disabled}
|
||
@click=${()=>this.skip()}
|
||
>
|
||
${S(`optionCard.skip`)}
|
||
</button>
|
||
</section>
|
||
`}},a([b({attribute:!1})],q.prototype,`props`,void 0),a([ae()],q.prototype,`selectedValue`,void 0),customElements.get(`openclaw-option-card`)||customElements.define(`openclaw-option-card`,q)})))()}function St(e){return _`<div class="custodian__option-card">
|
||
<openclaw-option-card
|
||
.props=${{header:e.question.header,question:e.question.question,options:e.question.options.map(e=>({value:e.label,label:e.label,description:e.description,recommended:e.recommended})),disabled:e.disabled,onSelect:e.onSelect,onSkip:e.onSkip}}
|
||
></openclaw-option-card>
|
||
</div>`}function Ct(){return(Ct=e((()=>{v(),xt()})))()}function wt(e,t,n,r){return{id:e,role:`assistant`,text:t,at:Date.now(),question:n,step:r}}function Tt(e,t,n,r,i){return r||i||e.some(e=>e.question!==null&&!t.has(`${e.id}:${e.question.id}`)&&!n.has(`${e.id}:${e.question.id}`))}function Et(e,t){let n=new Set(t);for(let t of e)t.question&&n.add(`${t.id}:${t.question.id}`);return n}function J(e){return f(e,S(`custodian.requestFailed`))}function Dt(e){let t=`msg-${e.id}`;return{kind:`group`,key:t,role:e.role,messages:[{message:{role:e.role,content:e.text},key:t}],timestamp:e.at,isStreaming:!1}}async function Ot(e){try{return{ok:!0,turns:(await e.request(`openclaw.chat.history`,{},{timeoutMs:Mt})).turns}}catch(e){return{ok:!1,error:J(e)}}}function kt(e,t){let n=t;return{messages:e.map(e=>({id:n++,role:e.role,text:e.role===`user`&&e.text===Pt?S(`custodian.sensitiveReply`):e.text,at:e.at,question:null,step:null})),nextMessageId:n}}function At(e,t){return e.id===t?Ve({kind:`divider`,key:`custodian-earlier`,label:S(`custodian.earlier`),timestamp:e.at}):g}function jt(e){let t=e.message.question,n=e.message.step;return _`
|
||
${e.message.text?He(Dt(e.message),{showReasoning:!1,showToolCalls:!1,assistantName:S(`custodian.title`),assistantAvatar:e.assistantAvatar}):g}
|
||
${At(e.message,e.boundaryAfterId)}
|
||
${e.showQuestion&&t?St({question:t,disabled:e.questionDisabled,onSelect:e.onSelect,onSkip:e.onSkip}):g}
|
||
${e.showWizardStep&&n?_`<section
|
||
class="custodian__wizard-step"
|
||
aria-label=${h(n.title??n.message,`Setup`)}
|
||
>
|
||
${n.title?_`<strong class="custodian__wizard-title"
|
||
>${h(n.title)}</strong
|
||
>`:g}
|
||
${We({step:n,value:e.wizardValue,busy:e.wizardDisabled,inputId:`custodian-wizard-input-${e.message.id}`,sensitiveRevealed:e.wizardSecretVisible,onValueChange:e.onWizardValueChange,onAnswer:e.onWizardAnswer,leadingAction:e.showWizardCancel?_`<button
|
||
class="btn btn--ghost custodian__wizard-cancel"
|
||
type="button"
|
||
?disabled=${e.wizardDisabled}
|
||
@click=${e.onWizardCancel}
|
||
>
|
||
${S(`custodian.cancel`)}
|
||
</button>`:void 0,onToggleSensitiveVisibility:e.onToggleWizardSecretVisibility})}
|
||
</section>`:g}
|
||
`}var Mt,Nt,Pt;function Y(){return(Y=e((()=>{v(),E(),Ge(),x(),ie(),Be(),Ue(),Ct(),Mt=15e3,Nt=class{constructor(e){this.onStatusChange=e,this.status=D(),this.generation=0,this.inFlight=null}get refreshing(){return this.inFlight!==null}invalidate(){this.generation+=1,this.inFlight=null}reset(){this.invalidate(),this.status=D()}async read(e,t,n){let r=this.inFlight;if(r&&r.client===e&&r.epoch===t)return await r.promise,null;let i=++this.generation;this.status=Me(this.status,{clearError:!1});let a=Ot(e);this.inFlight={client:e,epoch:t,promise:a},this.onStatusChange();try{let e=await a;return!n()||i!==this.generation?null:(this.status=e.ok?Re():Le(this.status,e.error),e)}finally{this.inFlight?.promise===a&&(this.inFlight=null,this.onStatusChange())}}async loadMessages(e,t,n,r){let i=await this.read(e,t,r);return i?.ok&&r()?kt(i.turns,n):null}},Pt=`<redacted secret>`})))()}var Ft,It,Lt,X;function Z(){return(Z=e((()=>{A(),x(),T(),j(),I(),L(),z(),H(),G(),K(),Y(),Ft=19e4,It=/^\s*NO_REPLY\s*$/,Lt=class{constructor(){this.messages=[],this.input=``,this.sending=!1,this.sensitive=!1,this.wizardInputPending=!1,this.wizardSecretVisible=!1,this.questionReplyUncertain=!1,this.error=null,this.transcript=new Nt(()=>this.emit()),this.setupIssue=null,this.dismissedQuestions=new Set,this.answeredQuestions=new Set,this.activeClient=null,this.chatAvailable=!1,this.eventNudge=null,this.eventNudgePending=null,this.channelOnboardingNudgeClosed=!1,this.earlierBoundaryAfterId=null,this.abandonedTurnOutcomeUnknown=!1,this.context=null,this.variant=`caretaker`,this.sessionVariant=null,this.restoredIdentity=et(),this.sessionId=this.restoredIdentity.sessionId,this.rejoinBarrierPending=this.restoredIdentity.restored,this.requestEpoch=0,this.requestAbort=null,this.nextMessageId=1,this.retryParams=null,this.sessionClient=null,this.sessionOwnershipKey=null,this.sessionOwner=new F,this.sessionStarted=!1,this.configuredInferenceState=`unresolved`,this.eventNudgeClosed=!1,this.gatewayCleanup=null,this.agentCleanup=null,this.eventCleanup=null,this.listeners=new Set}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}connect(e,t){let n=this.context!==e,r=this.variant!==t;!n&&!r||(n&&(this.gatewayCleanup?.(),this.agentCleanup?.(),this.eventCleanup?.(),this.context=e,this.gatewayCleanup=e.gateway.subscribe(()=>{this.synchronizeClient(),this.emit()}),this.agentCleanup=e.agents.subscribe(()=>{this.synchronizeClient(),this.emit()}),this.eventCleanup=e.gateway.subscribeEvents(e=>{this.variant!==`caretaker`||this.eventNudgeClosed||([this.eventNudge,this.eventNudgePending]=ct(this.eventNudge,this.eventNudgePending,e),this.emit())})),this.variant=t,this.synchronizeClient(),this.emit())}setInput(e){this.input=e,this.emit()}setWizardValue(e){this.wizardValue=e,this.emit()}toggleWizardSecretVisibility(){this.wizardSecretVisible=!this.wizardSecretVisible,this.emit()}hasRealUserTurn(){return this.messages.some(e=>e.role===`user`)}get activeVariant(){return this.variant}hasUnresolvedQuestion(){return Tt(this.messages,this.dismissedQuestions,this.answeredQuestions,this.wizardInputPending,this.questionReplyUncertain)}async refreshTranscriptIfIdle(){let e=this.activeClient;!e||!this.canRefreshTranscript()||await this.refreshTranscriptHistory(e,this.requestEpoch)&&this.abandonedTurnOutcomeUnknown&&(this.abandonedTurnOutcomeUnknown=!1,this.emit())}canRefreshTranscript(){let e=this.sending||this.hasUnresolvedQuestion()||this.transcript.refreshing;return this.activeClient!==null&&this.sessionStarted&&this.chatAvailable&&!e}canRetry(){return this.retryParams!==null&&!W(this.retryParams)}get setupRequired(){return this.setupIssue!==null}get wizardCancelAvailable(){return it(this.context)}retry(){let e=this.activeClient,t=this.retryParams;e&&t&&!W(t)&&this.chatAvailable&&!this.sending&&this.initializeSession(e,t)}async send(e=this.input,t,n=this.hasUnresolvedQuestion()){let r=this.sensitive?e:e.trim(),i=this.activeClient;if(!r.trim()||!i||!this.chatAvailable||this.sending||this.setupRequired)return this.emit(),`rejected`;let a=this.sensitive?S(`custodian.sensitiveReply`):t??r;return await this.sendUserTurn(i,{sessionId:this.sessionId,...U(this.variant,r)},a,n)}async sendUserTurn(e,t,n,r){let i=[this.answeredQuestions,this.questionReplyUncertain];r&&(this.questionReplyUncertain=!0),this.abandonedTurnOutcomeUnknown=!1,this.answeredQuestions=Et(this.messages,this.answeredQuestions),this.messages=[...this.messages,{id:this.nextMessageId++,role:`user`,text:n,at:Date.now(),question:null,step:null}],this.input=``,this.emit();let a=this.requestReply(e,t),o=this.requestEpoch,s=await a;return r&&this.requestEpoch===o&&(this.questionReplyUncertain=ot(i[1],s),s===`rejected`&&(this.answeredQuestions=i[0]),this.emit()),s}async sendEventNudge(){let e=this.eventNudge;if(!e||this.sensitive||this.hasUnresolvedQuestion())return;this.eventNudgePending=e,this.emit();let t=await this.send(e.message);if(this.eventNudgePending===e){this.eventNudgePending=null;let n=st(this.eventNudge,e,t);[this.eventNudgeClosed,this.eventNudge]=[n,n?null:this.eventNudge],this.emit()}}dismissEventNudge(){[this.eventNudge,this.eventNudgeClosed]=[null,!0],this.emit()}dismissChannelOnboardingNudge(){this.channelOnboardingNudgeClosed=!0,this.emit(),this.context?.replace(`custodian`)}openChannelsFromOnboarding(){this.channelOnboardingNudgeClosed=!0,this.revokeNavigationAuthority(),this.emit(),this.context?.navigate(`channels`)}async dismissQuestion(e){let t=e.question;if(t){if(t.skipAction===`exit`){this.exitSetup();return}await this.send(t.isOther?S(`optionCard.skip`):`cancel`,S(`optionCard.skip`),!0)!==`rejected`&&this.messages.includes(e)&&(this.dismissedQuestions=new Set(this.dismissedQuestions).add(`${e.id}:${t.id}`),this.emit())}}answerQuestion(e,t){let n=e.question;if(!n)return;let r=n.options.find(e=>e.label===t);this.send(r?.reply??t,t,!0)}answerWizardStep(e,t){if(!e.step||!this.wizardInputPending)return;let n=nt(e.step,t),r=this.activeClient;if(!n||!r||!this.chatAvailable||this.sending||this.setupRequired){this.emit();return}let i=e.step.sensitive?S(`custodian.sensitiveReply`):n.display;this.sendUserTurn(r,{sessionId:this.sessionId,wizardAnswer:n.answer},i,!0)}cancelWizardStep(e){let t=e.step,n=this.activeClient;if(!t||!this.wizardInputPending||!n||!this.chatAvailable||!this.wizardCancelAvailable||this.sending||this.setupRequired){this.emit();return}this.sendUserTurn(n,{sessionId:this.sessionId,wizardCancel:{stepId:t.id}},S(`custodian.cancel`),!0)}exitSetup(){this.revokeNavigationAuthority(),this.context?.navigate(`chat`)}revokeNavigationAuthority(){this.requestAbort?.abort(),this.requestAbort=null,this.advanceRequestEpoch(),this.sending=!1,this.questionReplyUncertain=!1,this.retryParams=null,this.error=null}advanceRequestEpoch(){return this.transcript.invalidate(),++this.requestEpoch}openModelSetup(){this.revokeNavigationAuthority(),this.context?.navigate(`model-setup`)}emit(){for(let e of this.listeners)e()}startSession(e,t,n){this.sessionVariant=t,this.sessionClient=e,this.sessionOwnershipKey=this.sessionOwner.key(this.context?.gateway??null),this.sessionStarted=!0,this.initializeSession(e,{sessionId:this.sessionId,...U(t)},n)}replaceSessionId(e){e===void 0&&(this.rejoinBarrierPending=!1);let t=e??M();this.sessionId=t,N(t)}abandonPendingUserTurn(e){!e||!W(e)||(this.retryParams=null,this.abandonedTurnOutcomeUnknown=!0)}restartVolatileSession(e,t,n){n&&this.replaceSessionId(),this.answeredQuestions=Et(this.messages,this.answeredQuestions),this.retryParams=null,this.input=``,this.wizardValue=void 0,this.wizardSecretVisible=!1,this.sensitive=this.wizardInputPending=this.questionReplyUncertain=!1,this.error=null,this.setupIssue=null,this.earlierBoundaryAfterId=this.messages.at(-1)?.id??null,this.startSession(e,t,!1)}synchronizeClient(){let e=this.context;if(!e)return;let t=e.gateway.snapshot,n=t.phase===`connected`?t.client:null,r=n!==null&&w(t,`openclaw.chat`,`operator.admin`),i=C(t,`openclaw.chat`)===!1,a=tt(this.context),o=a!==this.configuredInferenceState;this.configuredInferenceState=a;let s=this.sessionStarted&&this.sessionVariant!==this.variant,c=this.sessionOwner.key(e.gateway),l=this.sessionStarted&&n!==null&&this.activeClient===null,u=this.sessionStarted&&n!==null&&this.sessionClient!==null&&n!==this.sessionClient,d=this.sessionOwnershipKey!==null&&c!==this.sessionOwnershipKey;if(n===this.activeClient&&!s&&!u&&!d&&this.chatAvailable===(r&&a!==`unresolved`)&&!o)return;let f=this.sending&&this.retryParams!==null,p=f?this.retryParams:null;if(this.activeClient=n,this.advanceRequestEpoch(),this.sending=!1,this.chatAvailable=!1,s||d)d&&this.replaceSessionId(),[this.eventNudge,this.eventNudgePending]=[null,null],this.eventNudgeClosed=!1,this.abandonedTurnOutcomeUnknown=!1,this.sessionStarted=!1,this.clearConversation();else if(n&&(u||l)){if(!r){this.sessionStarted=!1,this.abandonPendingUserTurn(p),this.error=i?S(`custodian.unsupportedGateway`):null;return}this.chatAvailable=!0,this.abandonPendingUserTurn(p),this.requestAbort?.abort(),this.requestAbort=null,this.sessionClient=n,this.sessionOwnershipKey=c,this.questionReplyUncertain||this.abandonedTurnOutcomeUnknown?(this.questionReplyUncertain=!1,this.wizardInputPending=!1,this.abandonedTurnOutcomeUnknown=!1,this.rejoinBarrierPending=!0,this.initializeSession(n,{sessionId:this.sessionId,...U(this.variant)})):this.refreshTranscriptIfIdle();return}else f&&(p?.message===void 0&&(this.error=S(`custodian.connectionChanged`)),this.abandonPendingUserTurn(p));if(n){if(!r){this.error=i?S(`custodian.unsupportedGateway`):null;return}if(a!==`unresolved`){if(this.chatAvailable=!0,a===`required`){this.sessionStarted=!1,this.clearConversation(),this.setupIssue=`missing`;return}if(o&&(this.setupIssue=null),this.sessionStarted){this.retryParams||(this.error=f?this.error:null);return}this.clearConversation(),this.startSession(n,this.variant,!0)}}}async initializeSession(e,t,n=!0){let r=this.advanceRequestEpoch();this.sending=!0,this.error=null,this.retryParams=t,this.emit(),n&&await this.refreshTranscriptHistory(e,r),r===this.requestEpoch&&e===this.activeClient&&await this.requestReply(e,t)}async refreshTranscriptHistory(e,t){let n=this.context;if(!n||C(n.gateway.snapshot,`openclaw.chat.history`)!==!0)return!1;let r=await this.transcript.loadMessages(e,t,this.nextMessageId,()=>t===this.requestEpoch&&e===this.activeClient);return r?([this.messages,this.nextMessageId]=[r.messages,r.nextMessageId],this.earlierBoundaryAfterId=this.messages.at(-1)?.id??null,this.emit(),!0):!1}clearConversation(){this.messages=[],this.dismissedQuestions=new Set,this.answeredQuestions=new Set,this.retryParams=null,this.error=null,this.transcript.reset(),this.setupIssue=null,this.input=``,[this.wizardValue,this.wizardSecretVisible]=[void 0,!1],this.sensitive=this.wizardInputPending=this.questionReplyUncertain=!1,this.earlierBoundaryAfterId=null}async requestReply(e,t){let n=this.context;if(!n)return`rejected`;let r=n.gateway.snapshot;if(r.client!==e||!w(r,`openclaw.chat`,`operator.admin`))return`rejected`;this.requestAbort?.abort();let i=new AbortController;this.requestAbort=i;let a=this.advanceRequestEpoch(),o=`unsent`;this.sending=!0,this.error=null,W(t)&&(this.setupIssue=null),this.retryParams=t,this.emit();try{let r=await e.request(`openclaw.chat`,t,{timeoutMs:Ft,onSent:()=>o=`sent`,signal:i.signal});if(o=`received`,a!==this.requestEpoch||e!==this.activeClient)return`sent`;this.replaceSessionId(r.sessionId),this.sensitive=r.sensitive===!0,this.wizardInputPending=r.wizardInputPending===!0,this.retryParams=null,this.setupIssue=null;let s=r.step??null,c=s?null:bt(r.question);if(this.rejoinBarrierPending&&!W(t)&&(this.rejoinBarrierPending=!1,await this.refreshTranscriptHistory(e,a),a!==this.requestEpoch||e!==this.activeClient))return`sent`;this.wizardValue=s?rt(s):void 0,this.wizardSecretVisible=!1;let l=It.test(r.reply);if(!l||c||s){let e=wt(this.nextMessageId++,l?``:r.reply,c,s);this.messages=[...this.messages,e]}return r.action===`open-agent`?await Ze({context:n,...r.agentId?{agentId:r.agentId}:{},hatchDraft:r.agentDraft===`hatch`,isCurrent:()=>a===this.requestEpoch&&e===this.activeClient})===`exit-setup`&&this.exitSetup():r.action===`exit`&&this.exitSetup(),`sent`}catch(n){if(a===this.requestEpoch&&e===this.activeClient){this.error=J(n);let r=n&&typeof n==`object`?n.details:void 0;this.setupIssue=Ye(r)===void 0?null:this.configuredInferenceState===`required`?`missing`:`unavailable`;let i=yt(n);i&&W(t)?(this.restartVolatileSession(e,this.variant,!0),this.error=S(`custodian.sessionRestarted`,{error:J(n)})):i&&(this.replaceSessionId(),this.retryParams={...t,sessionId:this.sessionId},this.error=S(`custodian.sessionRestarted`,{error:J(n)}))}return W(t)&&this.retryParams===t&&(this.retryParams=null),at(n,o)}finally{this.requestAbort===i&&(this.requestAbort=null),a===this.requestEpoch&&(this.sending=!1),this.emit()}}},X=new Lt})))()}function Rt(){return(Rt=e((()=>{})))()}function zt(e,t,n){e.kind===`navigate`?t.navigate(e.routeId):n&&qe({startGatewayUpdate:()=>void t.overlays.runUpdate(),watchUpdateProgress:de(t),updateAvailable:t.overlays.snapshot.updateAvailable,updateSchedule:t.overlays.snapshot.updateSchedule,viaNativeApp:ge()})}function Bt(e){let{action:t}=e.alert,n=w(e.context.gateway.snapshot,`update.run`,`operator.admin`),r=t?.target.kind===`update`&&!n;return _`<article class="custodian__nudge custodian__alert-card" role="status">
|
||
<div class="custodian__alert-heading">
|
||
<strong>${e.alert.title}</strong>
|
||
<button
|
||
class="custodian__nudge-dismiss"
|
||
type="button"
|
||
aria-label=${S(`common.dismiss`)}
|
||
@click=${e.onDismiss}
|
||
>
|
||
×
|
||
</button>
|
||
</div>
|
||
<ul class="custodian__alert-facts">
|
||
${e.alert.facts.map(e=>_`<li>${e}</li>`)}
|
||
</ul>
|
||
${t?_`<button
|
||
class="btn btn--sm primary custodian__alert-action"
|
||
type="button"
|
||
title=${r?S(`updates.adminRequired`):g}
|
||
?disabled=${r}
|
||
@click=${()=>zt(t.target,e.context,n)}
|
||
>
|
||
${t.label}
|
||
</button>`:g}
|
||
</article>`}function Vt(){return(Vt=e((()=>{v(),ce(),Ke(),fe(),x(),T()})))()}var Q;function $(){return($=e((()=>{Te(),v(),y(),ve(),se(),Se(),ze(),Pe(),E(),Ce(),x(),re(),Vt(),Je(),Z(),H(),G(),Y(),Q=class extends d{constructor(...e){super(...e),this.store=X,this.onboarding=!1,this.newAgentIntent=!1,this.showChannelOnboardingNudge=!1,this.channelOnboardingError=null,this.channelOnboardingRetrying=!1,this.onRetryChannelOnboarding=()=>void 0,this.compact=!1,this.historyContent=g,this.subscribedStore=null,this.storeCleanup=null,this.alertCleanup=null,this.lastMessageId=null,this.markdownHost=null}connectedCallback(){super.connectedCallback(),this.subscribeToStore(),this.alertCleanup=O.subscribe(()=>this.requestUpdate())}disconnectedCallback(){this.markdownHost&&=(ke(this.markdownHost),null),this.storeCleanup?.(),this.storeCleanup=null,this.alertCleanup?.(),this.alertCleanup=null,this.subscribedStore=null,super.disconnectedCallback()}async getUpdateComplete(){let e=await super.getUpdateComplete();return await Promise.all(Array.from(this.querySelectorAll(`openclaw-option-card`)).map(e=>e.updateComplete)),e}willUpdate(e){e.has(`store`)&&this.subscribeToStore(),this.store.connect(this.context,vt(this.onboarding,this.newAgentIntent))}updated(){let e=this.store;e.chatAvailable&&!e.sending&&!e.hasUnresolvedQuestion()&&!e.setupRequired&&O.askIfReady(t=>void e.send(t));let t=this.querySelector(`.custodian__messages`);t&&(this.markdownHost=t,je(t),Fe(t));let n=this.store.messages.at(-1)?.id??null;if(n!==this.lastMessageId){this.lastMessageId=n;let e=t?.lastElementChild;e instanceof HTMLElement&&e.scrollIntoView?.({block:`nearest`})}}subscribeToStore(){!this.isConnected||this.subscribedStore===this.store||(this.storeCleanup?.(),this.subscribedStore=this.store,this.storeCleanup=this.store.subscribe(()=>this.requestUpdate()))}handleComposerKeydown(e){e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),this.store.send())}render(){let e=this.store,t=pe(`favicon.svg`,this.context.resourceBasePath),n=O.alert?Bt({alert:O.alert,context:this.context,onDismiss:()=>O.dismiss()}):g;if(e.setupRequired){let t=e.setupIssue===`unavailable`;return _`
|
||
<section
|
||
class="custodian-surface custodian-surface--setup-required ${this.compact?`custodian-surface--panel`:``}"
|
||
>
|
||
${n}
|
||
<div class="custodian__setup-state" role="alert">
|
||
<openclaw-mascot mood="idle" .size=${this.compact?72:96}></openclaw-mascot>
|
||
<h2>
|
||
${S(t?`modelSetup.connectionFailure.title`:`modelSetup.required.title`)}
|
||
</h2>
|
||
<p>
|
||
${S(t?`modelSetup.connectionFailure.body`:`modelSetup.required.body`)}
|
||
</p>
|
||
<div class="custodian__setup-actions">
|
||
<button class="btn primary" type="button" @click=${()=>e.openModelSetup()}>
|
||
${S(t?`modelSetup.connectionFailure.action`:`modelSetup.required.action`)}
|
||
</button>
|
||
${e.activeClient&&e.chatAvailable&&e.canRetry()?_`<button
|
||
class="btn"
|
||
type="button"
|
||
?disabled=${e.sending}
|
||
@click=${()=>e.retry()}
|
||
>
|
||
${S(`common.retry`)}
|
||
</button>`:g}
|
||
</div>
|
||
</div>
|
||
</section>
|
||
`}let r=e.messages.length===0&&e.error!==null&&!e.sending,i=e.wizardInputPending?e.messages.findLast(e=>e.step!==null):void 0;return _`
|
||
<section
|
||
class="custodian-surface ${this.compact?`custodian-surface--panel`:``} ${r?`custodian-surface--empty-error`:``}"
|
||
>
|
||
<div
|
||
class="custodian__messages"
|
||
aria-live="polite"
|
||
@click=${e=>{Ne(e),Ie(e)}}
|
||
>
|
||
${n}
|
||
${this.channelOnboardingError?ft({retrying:this.channelOnboardingRetrying,onRetry:this.onRetryChannelOnboarding,onDismiss:()=>e.dismissChannelOnboardingNudge()}):this.showChannelOnboardingNudge?dt({onOpenChannels:()=>e.openChannelsFromOnboarding(),onDismiss:()=>e.dismissChannelOnboardingNudge()}):g}
|
||
${!this.onboarding&&e.eventNudge&&!e.eventNudgePending?ut({nudge:e.eventNudge,disabled:!e.activeClient||!e.chatAvailable||e.sending||e.sensitive||e.hasUnresolvedQuestion(),onSend:()=>void e.sendEventNudge(),onDismiss:()=>e.dismissEventNudge()}):g}
|
||
${e.messages.map(n=>{let r=n.question?`${n.id}:${n.question.id}`:``,a=n.question!==null&&!e.dismissedQuestions.has(r);return jt({message:n,boundaryAfterId:e.earlierBoundaryAfterId,assistantAvatar:t,showQuestion:a,questionDisabled:e.sending||!e.chatAvailable||e.answeredQuestions.has(r),onSelect:t=>e.answerQuestion(n,t),onSkip:()=>void e.dismissQuestion(n),showWizardStep:n===i,wizardValue:e.wizardValue,wizardDisabled:e.sending||!e.chatAvailable,wizardSecretVisible:e.wizardSecretVisible,onWizardValueChange:t=>e.setWizardValue(t),onWizardAnswer:t=>e.answerWizardStep(n,t),showWizardCancel:e.wizardCancelAvailable,onWizardCancel:()=>e.cancelWizardStep(n),onToggleWizardSecretVisibility:()=>e.toggleWizardSecretVisibility()})})}
|
||
${e.sending?_`<div class="chat-group assistant custodian__thinking-row" role="status">
|
||
<div class="chat-avatar assistant custodian__mascot-avatar" aria-hidden="true">
|
||
<openclaw-mascot mood="thinking" .size=${26}></openclaw-mascot>
|
||
</div>
|
||
<div class="chat-group-messages custodian__thinking">
|
||
<span></span><span></span><span></span>
|
||
<span class="sr-only">${S(`custodian.thinking`)}</span>
|
||
</div>
|
||
</div>`:g}
|
||
${e.abandonedTurnOutcomeUnknown?_`<div class="custodian__error" role="alert">
|
||
<span>${S(`custodian.connectionChanged`)}</span>
|
||
</div>`:g}
|
||
${Ae({status:e.transcript.status,onRetry:()=>void e.refreshTranscriptIfIdle(),retryDisabled:!e.canRefreshTranscript(),className:`custodian__transcript-status`})}
|
||
${e.error&&!(e.abandonedTurnOutcomeUnknown&&e.error===S(`custodian.connectionChanged`))?_`<div class="custodian__error" role="alert">
|
||
<span>${e.error}</span>
|
||
${e.activeClient&&e.chatAvailable&&e.canRetry()?_`<button class="btn btn--sm" type="button" @click=${()=>e.retry()}>
|
||
${S(`common.retry`)}
|
||
</button>`:g}
|
||
</div>`:g}
|
||
</div>
|
||
|
||
${this.historyContent}
|
||
${i?g:_`<div class="agent-chat__composer-shell">
|
||
<div class="agent-chat__input">
|
||
<div class="agent-chat__composer-input-row">
|
||
<div class="agent-chat__composer-combobox">
|
||
${e.sensitive?_`<input
|
||
type="password"
|
||
.value=${e.input}
|
||
autocomplete="off"
|
||
placeholder=${S(`custodian.sensitivePlaceholder`)}
|
||
aria-label=${S(`custodian.sensitivePlaceholder`)}
|
||
?disabled=${!e.activeClient||!e.chatAvailable||e.sending||e.setupRequired}
|
||
@input=${t=>e.setInput(t.target.value)}
|
||
@keydown=${e=>this.handleComposerKeydown(e)}
|
||
/>`:_`<textarea
|
||
rows="1"
|
||
.value=${e.input}
|
||
autocomplete="on"
|
||
placeholder=${S(`custodian.placeholder`)}
|
||
aria-label=${S(`custodian.placeholder`)}
|
||
?disabled=${!e.activeClient||!e.chatAvailable||e.sending||e.setupRequired}
|
||
@input=${t=>e.setInput(t.target.value)}
|
||
@keydown=${e=>this.handleComposerKeydown(e)}
|
||
></textarea>`}
|
||
</div>
|
||
<div class="agent-chat__composer-actions">
|
||
<button
|
||
class="chat-send-btn"
|
||
type="button"
|
||
aria-label=${S(`custodian.send`)}
|
||
?disabled=${!e.input.trim()||!e.activeClient||!e.chatAvailable||e.sending||e.setupRequired}
|
||
@click=${()=>void e.send()}
|
||
>
|
||
${xe.arrowUp}
|
||
<span class="agent-chat__control-label">${S(`custodian.send`)}</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>`}
|
||
</section>
|
||
`}},a([we({context:ye,subscribe:!0})],Q.prototype,`context`,void 0),a([b({attribute:!1})],Q.prototype,`store`,void 0),a([b({attribute:!1})],Q.prototype,`onboarding`,void 0),a([b({attribute:!1})],Q.prototype,`newAgentIntent`,void 0),a([b({attribute:!1})],Q.prototype,`showChannelOnboardingNudge`,void 0),a([b({attribute:!1})],Q.prototype,`channelOnboardingError`,void 0),a([b({attribute:!1})],Q.prototype,`channelOnboardingRetrying`,void 0),a([b({attribute:!1})],Q.prototype,`onRetryChannelOnboarding`,void 0),a([b({attribute:!1})],Q.prototype,`compact`,void 0),a([b({attribute:!1})],Q.prototype,`historyContent`,void 0),customElements.get(`openclaw-custodian-surface`)||customElements.define(`openclaw-custodian-surface`,Q)})))()}export{Z as i,Rt as n,X as r,$ as t};
|
||
//# sourceMappingURL=custodian-surface-BijreBg_.js.map
|