Files
openclaw-config/cache/control-ui-assets/d08fd045b9cb86d13f0b4aa403c8a06ddcd32e533058ae463245169e5cff5e85/assets/model-setup-page-GgzvZ28q.js
T

479 lines
57 KiB
JavaScript

import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{bt as t,er as n}from"./control-ui-foundation-CeFMP1Ly.js";import{bc as r,fl as i,fs as a,hl as o,ii as s,kc as c,ml as ee,ms as l,ps as u,ri as te,ti as ne,vr as re,yr as ie}from"./control-ui-core-pH6nakZ-.js";import{G as d,J as f,W as p,Z as ae,_ as oe,at as se,b as ce,rt as m}from"./lit-runtime-BEtFSUCp.js";import{Cn as le,Jt as ue,Sn as de,Ut as fe,ln as pe,m as me,p as he}from"./control-ui-core-DGVkFhVB.js";import{Ht as h,Lt as g,N as ge,Nt as _e,P as ve,Rt as _,qt as v}from"./control-ui-core-Br5DB0Zj.js";import{An as ye,F as be,Fn as xe,I as y,In as Se,L as b,Ln as Ce,Mn as we,Pn as Te,Sn as Ee,jn as De,kn as Oe,wn as ke}from"./control-ui-boot-wpHCbPL9.js";import{a as x,r as S}from"./gateway-runtime-DUNO4Mi1.js";import{Gl as C,Jl as w,Kl as T,Xl as Ae,Yl as E,an as je,cn as Me,on as Ne,ql as Pe}from"./control-ui-boot-Cdpgu1Gm.js";import{K as Fe,U as Ie}from"./control-ui-boot-D1DWJlBr.js";import{r as Le,t as Re}from"./wizard-step-controls-D3s65of1.js";import{n as ze,t as Be}from"./settings-workspace-Bo4nqRhI.js";var D,O;function k(){return(k=e((()=>{xe(),D=class{oHash;iHash;blockLen;outputLen;canXOF=!1;finished=!1;destroyed=!1;constructor(e,t){if(De(e),Oe(t,void 0,`key`),this.iHash=e.create(),typeof this.iHash.update!=`function`)throw Error(`expected Hash instance`);this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;let n=this.blockLen,r=new Uint8Array(n);r.set(t.length>n?e.create().update(t).digest():t);for(let e=0;e<r.length;e++)r[e]^=54;this.iHash.update(r),this.oHash=e.create();for(let e=0;e<r.length;e++)r[e]^=106;this.oHash.update(r),Te(r)}update(e){return ye(this),this.iHash.update(e),this}digestInto(e){ye(this),we(e,this),this.finished=!0;let t=e.subarray(0,this.outputLen);this.iHash.digestInto(t),this.oHash.update(t),this.oHash.digestInto(t),this.destroy()}digest(){let e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||=Object.create(Object.getPrototypeOf(this),{});let{oHash:t,iHash:n,finished:r,destroyed:i,blockLen:a,outputLen:o,canXOF:s}=this;return e=e,e.finished=r,e.destroyed=i,e.blockLen=a,e.outputLen=o,e.canXOF=s,e.oHash=t._cloneInto(e.oHash),e.iHash=n._cloneInto(e.iHash),e}clone(){return this._cloneInto()}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}},O=(()=>{let e=((e,t,n)=>new D(e,t).update(n).digest());return e.create=(e,t)=>new D(e,t),e})()})))()}function A(e){return e===`provider-auth`?15e5:e===`codex-cli`?Ge:P}function j(e,t){return`${e}\u0000${t}`}function Ve(e){let{result:t}=e;if(t.ok&&t.modelRef){let n=[t.gatewayRestartRequired?e.restartWarning:null,e.refreshWarning].filter(Boolean).join(`
`);return{phase:`success`,modelRef:t.modelRef,...typeof t.latencyMs==`number`?{latencyMs:t.latencyMs}:{},...n?{warning:n}:{}}}return{phase:`failure`,targetId:e.targetId,status:t.status&&t.status!==`ok`?t.status:`unknown`,error:u(t.error,e.fallbackError)}}function He(e){return e.ok?{phase:`ok`,modelRef:e.modelRef,...typeof e.latencyMs==`number`?{latencyMs:e.latencyMs}:{}}:{phase:`failed`,status:e.status,error:u(e.error)}}function Ue(e,t,n){return!t.done&&t.step?{phase:`step`,authChoice:e,step:t.step,busy:!1,validationError:t.error?.trim()?u(t.error):null}:t.done&&t.status===`done`?{phase:`done`,authChoice:e,...t.preparedModelRef?{preparedModelRef:t.preparedModelRef}:{}}:t.status===`cancelled`?{phase:`cancelled`,message:u(t.error,n)}:{phase:`error`,message:u(t.error,n)}}function We(e){return e.type===`multiselect`?Array.isArray(e.initialValue)?[...e.initialValue]:[]:e.initialValue}var M,N,P,Ge,F;function I(){return(I=e((()=>{l(),M=4e4,N=3e4,P=15e4,Ge=48e4,F=3e4})))()}function Ke(e){let t=t=>{t.key===B&&t.newValue===null&&t.oldValue&&e(t.oldValue)};return V.add(e),window.addEventListener(`storage`,t),()=>{V.delete(e),window.removeEventListener(`storage`,t)}}function qe(e,t,n){try{let r=JSON.parse(n.getItem(Ze)??`null`);if(r?.version!==1||typeof r.privateKey!=`string`||!r.privateKey)return null;let i=e.gateway.connection,a=i.token||i.password||i.bootstrapToken,o=a?``:e.gateway.snapshot.hello?.auth?.deviceToken;if(!a&&!o)return null;let s=[t.gatewayUrl,t.agentId,t.modelRef??``,t.kind,String(t.deadlineMs),i.token,i.password,i.bootstrapToken,i.bootstrapProfile??``,o??``],c=new TextEncoder,ee=s.map(e=>`${c.encode(e).length}:${e}`).join(`|`);return Array.from(O(ke,c.encode(r.privateKey),c.encode(ee))).map(e=>e.toString(16).padStart(2,`0`)).join(``)}catch{return null}}function L(e,t){try{let n=e.getItem(B);if((t===void 0||t&&n===JSON.stringify(t))&&(e.removeItem(B),n))for(let e of V)e(n)}catch{}}function R(e,n){let r=o();if(!r||e.gateway.snapshot.phase!==`connected`)return null;try{let i=r.getItem(B);if(!i||n&&i!==JSON.stringify(n))return null;let a=JSON.parse(i);if(a?.version!==1||typeof a.gatewayUrl!=`string`||typeof a.agentId!=`string`||a.modelRef!==null&&typeof a.modelRef!=`string`||typeof a.kind!=`string`||typeof a.deadlineMs!=`number`||!Number.isFinite(a.deadlineMs)||a.deadlineMs<=Date.now()||typeof a.owner!=`string`||a.gatewayUrl!==t(e.gateway.connection.gatewayUrl)||a.agentId!==(e.agentSelection.state.selectedId??``))return L(r),null;let{owner:o,...s}=a;return qe(e,s,r)===o?a:(L(r),null)}catch{return L(r),null}}function Je(e){return Date.now()+A(e)+Qe}function Ye(e,n){let r=o();if(!r||e.gateway.snapshot.phase!==`connected`)return null;try{let i={version:1,gatewayUrl:t(e.gateway.connection.gatewayUrl),agentId:e.agentSelection.state.selectedId??``,modelRef:n.modelRef??null,kind:n.kind,deadlineMs:n.deadlineMs??Je(n.kind)},a=qe(e,i,r);if(!a)return null;let o={...i,owner:a};return r.setItem(B,JSON.stringify(o)),o}catch{return null}}function z(e){let t=o();t&&L(t,e)}function Xe(e,t,n,r,i,a){let{context:o}=e,s=o.gateway.snapshot;!i()&&s.phase===`connected`&&s.client===t.client&&s.hello===t.hello&&o.gateway.connectionRevision===n&&(o.agentSelection.state.selectedId?.trim()||null)===r&&e.isStillDefaultLanding()&&R(o)!==null&&e.redirect(),a()}var B,Ze,Qe,V;function H(){return(H=e((()=>{k(),Ee(),I(),B=`openclaw.modelSetup.pendingActivation.v1`,Ze=`openclaw-device-identity-v1`,Qe=5e3,V=new Set})))()}function U(e){return a(e,v(`modelSetup.errors.requestFailed`))}async function W(e,t){try{return{client:e,value:await t()}}catch(t){return{client:e,error:t}}}function G(){return(G=e((()=>{h(),l()})))()}var $e;function et(){return(et=e((()=>{h(),S(),H(),G(),I(),$e=class{constructor(e){this.host=e,this.generation=0,this.started=!1,this.attempts=new Set,this.readyConnection=null,this.pending=null}subscribe(e){return Ke(t=>{let n=this.pending;n?.receipt&&JSON.stringify(n.receipt)===t&&(this.pending=null,n.outcome===`verified`&&this.host.setActivationState({phase:`idle`}),this.host.setVerifyState({phase:`idle`}),e())})}setReadyConnection(e){this.readyConnection=e}routeChanged(){this.reset(),this.readyConnection=null,this.pending=null,this.host.routeData()?.firstRun===!1&&z()}connectionChanged(e){this.reset(),this.readyConnection=null,this.pending&&(e.client!==this.pending.owner.connection.client||e.agentId!==this.pending.owner.connection.agentId||this.host.context().gateway.connectionRevision!==this.pending.owner.connectionRevision)&&(this.pending=null)}retryDetection(){if(this.host.actionsDisabled())return!1;if(this.pending&&Date.now()<this.pending.deadlineMs)return this.host.setRefreshWarning(v(`modelSetup.recovery.wait`)),!1;if(this.host.routeData()?.firstRun){let e=this.host.pageState(),t=this.pending&&e.phase===`ready`&&e.result.configuredModel;this.pending=null,z(),this.host.setRefreshWarning(null),this.reset(),this.started=!!t}return!0}dispose(){this.reset(),this.readyConnection=null,this.pending=null}visiblePageState(e){let t=this.host.pageState();return this.host.routeData()?.firstRun&&t.phase===`ready`&&t.result.setupComplete&&t.result.configuredModel&&!e?{...t,result:{...t.result,setupComplete:!1}}:t}start(){let e=this.host.routeData(),t=this.host.context(),n=t.gateway.snapshot,r=this.host.pageState(),i=this.readyConnection;if(!e?.firstRun||this.started||r.phase!==`ready`||!i||i.client!==n.client||i.hello!==n.hello||i.agentId!==t.agentSelection.state.selectedId||this.host.actionsDisabled()||!this.host.canUseSetup(n.client))return;let a=R(t);this.pending?.receipt&&a?.owner!==this.pending.receipt.owner&&(this.pending=null);let o=a??this.pending;o&&(this.pending={owner:this.owner(e.firstRun),modelRef:o.modelRef,kind:o.kind,deadlineMs:o.deadlineMs,receipt:a,outcome:`pending`});let s=r.result.setupComplete&&r.result.configuredModel;if(this.pending&&(!s||!this.pending.modelRef)){this.started=!0,this.showUnresolved();return}if(s&&!this.host.canVerify(n.client)){this.started=!0,this.host.setVerifyState({phase:`failed`,status:`unknown`,error:`${v(`modelSetup.access.gatewayTooOld`)}. ${v(`updates.confirm.action`)}. ${v(`desktop.reconnect`)}.`});return}!s&&x(n,`openclaw.setup.activate`)!==!0||(this.started=!0,this.run(this.owner(e.firstRun),r.result))}beginActivation(e){let t=this.host.routeData();if(!t?.firstRun)return null;let n=this.owner(t.firstRun),r=Ye(this.host.context(),e);return this.pending={owner:n,kind:e.kind,modelRef:e.modelRef??null,receipt:r,outcome:`pending`,deadlineMs:r?.deadlineMs??Je(e.kind)},this.started=!0,this.pending}recordActivation(e,t){if(e){if(!t.ok){this.ownsActivation(e)&&(e.outcome=`rejected`),z(e.receipt),this.pending===e&&(this.pending=null);return}!t.modelRef||this.pending!==e||!this.ownsActivation(e)||(e.modelRef=t.modelRef,e.outcome=`verified`,e.receipt=Ye(this.host.context(),e))}}finishActivation(e,t,n){!this.pending||!this.ownsActivation()||!e.ok||!e.modelRef||(e.gatewayRestartRequired?(this.host.setActivationState({phase:`testing`,targetId:t}),this.host.setRefreshWarning(n??v(`updates.dialog.restarting`))):n||this.completeNavigation())}get unresolved(){return this.pending!==null}async useCurrentModel(){let e=this.host.pageState(),t=this.pending;if(!t||e.phase!==`ready`||!e.result.configuredModel||this.host.actionsDisabled())return;let n=e.result.configuredModel,r=this.owner(t.owner.firstRun),i=await this.verify();!this.owns(r)||this.pending!==t||!i||`error`in i||(i.value.ok&&i.value.modelRef===n?this.completeNavigation():i.value.ok&&this.showUnresolved())}owner(e){let t=this.host.context();return{generation:this.generation,firstRun:e,connectionRevision:t.gateway.connectionRevision,connection:{client:t.gateway.snapshot.client,hello:t.gateway.snapshot.hello,agentId:t.agentSelection.state.selectedId}}}clearPending(){this.pending=null,z()}ownsActivation(e=this.pending){return e?this.owns(e.owner)?e.outcome===`rejected`?this.pending===null:this.pending===e&&(!e.receipt||R(this.host.context(),e.receipt)!==null)&&Date.now()<e.deadlineMs:!1:!this.host.routeData()?.firstRun}async verify(){let e=this.host.routeData();if(!e)return;let t=this.owner(e.firstRun),n=this.pending,r=await this.host.verify();if(!(!this.owns(t)||!r)){if(this.pending!==n||n&&!this.ownsActivation(n)){this.host.setVerifyState({phase:`idle`});return}return this.host.setVerifyState(`error`in r?{phase:`failed`,status:`unknown`,error:U(r.error)}:He(r.value)),r}}continueSetup(){this.pending?this.pending.outcome===`verified`&&this.ownsActivation()&&this.completeNavigation():this.host.context().navigate(`chat`)}completeNavigation(){this.clearPending(),this.host.setRefreshWarning(null),this.host.context().navigate(`custodian`,{search:`?onboarding=1`})}showUnresolved(){this.host.setRefreshWarning(null),this.host.setVerifyState({phase:`failed`,status:`unknown`,error:`${v(`modelSetup.errors.activationFailed`)} ${this.pending?.modelRef??``}`.trim()})}reset(){this.generation+=1,this.started=!1,this.attempts.clear()}owns(e){let t=this.host.context(),n=t.gateway.snapshot;return e.generation===this.generation&&e.connectionRevision===t.gateway.connectionRevision&&e.firstRun===this.host.routeData()?.firstRun&&n.phase===`connected`&&n.client===e.connection.client&&n.hello===e.connection.hello&&t.agentSelection.state.selectedId===e.connection.agentId}async run(e,t){if(t.setupComplete&&t.configuredModel){if(this.pending&&t.configuredModel!==this.pending.modelRef){this.showUnresolved();return}let n=await this.verify();if(!this.owns(e)||!n||`error`in n)return;if(n.value.ok){this.finishVerified(n.value.modelRef);return}if(this.pending)return}let n=this.host.context();if(x(n.gateway.snapshot,`openclaw.setup.activate`)===!0)for(let n of t.candidates){let r=j(n.kind,n.modelRef);if(n.credentials===!1||t.configuredModel&&(n.kind===`existing-model`||n.modelRef===t.configuredModel)||this.attempts.has(r))continue;if(!this.owns(e))return;this.attempts.add(r);let i=await this.host.activate(n,r);if(!this.owns(e)||!i||`error`in i||!i.isCurrent()||i.value.result.ok)return}}finishVerified(e){this.pending?this.pending.modelRef===e?this.completeNavigation():this.showUnresolved():this.host.context().navigate(`chat`)}}})))()}function tt(e){return e.brandId&&C(e.brandId)?e.brandId:null}function K(e,t,n=``){let r=tt(t);if(r)return E(r,{className:`model-setup__icon ${n}`.trim()});let i=t.icon?e.iconUrls[t.icon]:void 0;return!t.icon||!i?Ae(t.label,{className:`model-setup__icon ${n}`.trim()}):f`<img
class=${`model-setup__icon ${n}`.trim()}
src=${i}
alt=${t.label}
width="24"
height="24"
@error=${()=>e.onIconError(t.icon)}
/>`}var nt;function q(){return(q=e((()=>{p(),T(),Fe(),nt=class{constructor(e,t,n){this.getContext=e,this.getPageState=t,this.onChange=n,this.urls={},this.misses=new Set,this.requests=new Map}reconcile(){let e=this.currentIconUrls(),t={...this.urls},n=!1;for(let[r,i]of Object.entries(t))e.has(r)||(URL.revokeObjectURL(i),delete t[r],n=!0);n&&this.publish(t);for(let[t,n]of this.requests)e.has(t)||(clearTimeout(n.timeout),n.controller.abort(),this.requests.delete(t));for(let t of this.misses)e.has(t)||this.misses.delete(t);for(let t of e)!this.urls[t]&&!this.misses.has(t)&&!this.requests.has(t)&&this.fetch(t)}invalidate(e){let t=this.requests.get(e);t&&(clearTimeout(t.timeout),t.controller.abort(),this.requests.delete(e));let n=this.urls[e];n&&URL.revokeObjectURL(n);let r={...this.urls};delete r[e],this.publish(r),this.misses.add(e)}reset(){for(let e of this.requests.values())clearTimeout(e.timeout),e.controller.abort();for(let e of Object.values(this.urls))URL.revokeObjectURL(e);this.requests.clear(),this.misses.clear(),this.publish({})}currentIconUrls(){let e=this.getPageState();if(e.phase!==`ready`)return new Set;let t=e.result;return new Set([...t.candidates,...t.unavailableCandidates??[],...t.manualProviders,...t.authOptions??[],...t.prepareOptions??[],...t.recommendedInstalls??[]].flatMap(e=>e.icon&&!tt(e)?[e.icon]:[]))}fetch(e){let t=new AbortController,n=setTimeout(()=>t.abort(new DOMException(`catalog icon fetch timed out`,`TimeoutError`)),1e4),r={controller:t,timeout:n};this.requests.set(e,r);let i=this.getContext();Ie({iconUrl:e,resourceBasePath:i.resourceBasePath,gatewayUrl:i.gateway.connection.gatewayUrl,auth:{hello:i.gateway.snapshot.hello,settings:{token:i.gateway.connection.token},password:i.gateway.connection.password},signal:t.signal}).then(t=>{if(this.requests.get(e)!==r||this.getContext().gateway.snapshot.phase!==`connected`||!this.currentIconUrls().has(e)){t&&URL.revokeObjectURL(t);return}t?this.publish({...this.urls,[e]:t}):this.misses.add(e)}).catch(()=>{this.requests.get(e)===r&&this.misses.add(e)}).finally(()=>{clearTimeout(n),this.requests.get(e)===r&&this.requests.delete(e)})}publish(e){this.urls=e,this.onChange(e)}}})))()}function J(e){return`provider-auto:${encodeURIComponent(e)}`}function rt(e){let t=[{id:`ollama`,brandId:`ollama`,label:v(`modelSetup.prepare.ollamaLabel`),hint:v(`modelSetup.prepare.ollamaHint`)},{id:`llama-cpp`,brandId:`llama-cpp`,label:v(`modelSetup.prepare.llamaCppLabel`)}];return(e.prepareOptions??t).filter(t=>!e.candidates.some(e=>e.credentials!==!1&&(e.kind===J(t.id)||e.modelRef.startsWith(`${t.brandId??t.id}/`))))}function it(e,t){return e.candidates.find(e=>e.kind===J(t)&&e.credentials!==!1)}function Y(){return(Y=e((()=>{h()})))()}function at(e,t,n){return e.request(`openclaw.setup.detect`,t?{agentId:t}:{},{timeoutMs:M,...n?{signal:n}:{}})}function ot(e,t,n){return e.request(`openclaw.setup.verify`,t?{agentId:t}:{},{timeoutMs:N,...n?{signal:n}:{}})}function st(){return(st=e((()=>{I()})))()}function ct(e){let t={auth:v(`modelSetup.failure.auth`),rate_limit:v(`modelSetup.failure.rateLimit`),billing:v(`modelSetup.failure.billing`),timeout:v(`modelSetup.failure.timeout`),format:v(`modelSetup.failure.format`),unavailable:v(`modelSetup.failure.unavailable`),unknown:v(`modelSetup.failure.unknown`)};return t[e]??t.unknown}function lt(e){let t={auth:v(`modelSetup.failureGuidance.auth`),rate_limit:v(`modelSetup.failureGuidance.rateLimit`),billing:v(`modelSetup.failureGuidance.billing`),timeout:v(`modelSetup.failureGuidance.timeout`),format:v(`modelSetup.failureGuidance.format`),unavailable:v(`modelSetup.failureGuidance.unavailable`),unknown:v(`modelSetup.failureGuidance.unknown`)};return t[e]??t.unknown}function ut(e,t){return f`
<div class="model-setup__failure" role="alert">
<span class="model-setup__failure-icon" aria-hidden="true">${g.alertTriangle}</span>
<span><strong>${ct(e)}.</strong> ${t} ${lt(e)}</span>
</div>
`}function dt(e){let t=e.indexOf(`/`);return t<0?e:e.slice(t+1)}function ft(e,t){return e.candidates.find(e=>e.modelRef===t)}function pt(e,t){let n=dt(t),r=e?.detail.trim();return!r||e?.kind===`existing-model`?n:r.toLowerCase().includes(n.toLowerCase())?r:`${n} · ${r}`}function mt(e){switch(e.phase){case`checking`:return v(`modelSetup.verify.checkingButton`);case`failed`:return v(`modelSetup.verify.retry`);case`ok`:return v(`modelSetup.verify.checkAgain`);default:return v(`modelSetup.verify.button`)}}function ht(e){let t=e.result.configuredModel,n=e.verify.phase===`ok`?e.verify.modelRef:t,r=w(n),i=n===t?ft(e.result,t):void 0,a=r?Pe(r):n,o=pt(i,n);return f`
<section class="settings-section model-setup__current" data-verify-phase=${e.verify.phase}>
<div class="settings-section__header">
<h2>${v(`modelSetup.verify.title`)}</h2>
</div>
<div class="model-setup__row">
<div class="model-setup__provider-copy">
${r?E(r,{className:`model-setup__icon`}):d}
<div class="model-setup__current-copy">
<strong>${a}</strong>
<div class="muted">${o}</div>
${e.verify.phase===`checking`?f`<div class="model-setup__testing" role="status">
${v(`modelSetup.verify.checking`,{modelRef:t})}
</div>`:e.verify.phase===`ok`?f`<div class="model-setup__verified" role="status">
${e.verify.latencyMs===void 0?v(`modelSetup.verify.ready`):v(`modelSetup.verify.readyIn`,{latencyMs:String(e.verify.latencyMs)})}
</div>`:e.verify.phase===`failed`?e.verify.status===`unavailable`?f`<div class="model-setup__failure" role="alert">
<span class="model-setup__failure-icon" aria-hidden="true">
${g.alertTriangle}
</span>
<span>
${v(`modelSetup.verify.providerUnavailable`,{provider:a})}
</span>
</div>`:ut(e.verify.status,e.verify.error):d}
</div>
</div>
<div class="model-setup__row-actions">
${e.canVerify?f`<button
type="button"
class="btn"
?disabled=${e.actionsDisabled}
@click=${e.onVerify}
>
${mt(e.verify)}
</button>`:d}
${e.onContinue?f`<button type="button" class="btn primary" @click=${e.onContinue}>
${g.messageSquare} ${v(`modelSetup.success.continueSetup`)}
</button>`:d}
</div>
</div>
</section>
`}function gt(){return(gt=e((()=>{p(),_(),T(),h()})))()}function _t(e){let t=e.currentTarget,n=Array.from(t.querySelectorAll(`wa-dropdown-item[data-manual-provider]:not([disabled])`)),r=n.find(e=>e.hasAttribute(`data-selected`))??n[0];if(r){for(let e of n)e.active=e===r;r.focus({preventScroll:!0}),r.scrollIntoView?.({block:`nearest`})}}function vt(e){let t=e.currentTarget;if(t.open){if(e.key===`Tab`){e.preventDefault(),e.stopPropagation();let n=e.shiftKey?t.querySelector(`[slot="trigger"]`):t.closest(`.model-setup__manual`)?.querySelector(`input[type="password"]`);t.addEventListener(`wa-after-hide`,()=>n?.focus({preventScroll:!0}),{once:!0}),t.open=!1;return}e.key===`Escape`&&(e.preventDefault(),t.addEventListener(`wa-after-hide`,()=>t.querySelector(`[slot="trigger"]`)?.focus({preventScroll:!0}),{once:!0}))}}function yt(e,t,n){let r=e.detail.item,i=e.currentTarget,a=r.value??r.getAttribute(`value`);if(a){if(a!==t){i.addEventListener(`wa-after-hide`,()=>i.querySelector(`[slot="trigger"]`)?.focus({preventScroll:!0}),{once:!0}),n(a);return}e.preventDefault(),r.checked=!0,i.querySelector(`[slot="trigger"]`)?.focus({preventScroll:!0}),i.open=!1}}function bt(e,t,n,r){let i=w(e.modelRef),a=i&&C(i)?i:null,o=e.warning??v(`modelSetup.success.body`,{modelRef:e.modelRef}),s=r?v(`modelSetup.success.continueSetup`):e.warning?v(`tabs.chat`):v(`modelSetup.success.openChat`);return f`
<openclaw-modal-dialog
label=${v(`modelSetup.success.title`)}
description=${o}
@modal-cancel=${n}
>
<section class="model-setup-success" role="status">
<div
class=${`model-setup-success__icon${a?` model-setup-success__icon--provider`:``}`}
aria-hidden="true"
>
${a?f`
${E(a,{className:`model-setup-success__provider-icon`})}
<span class="model-setup-success__status-badge">${g.check}</span>
`:g.shieldCheck}
</div>
<div class="model-setup-success__copy">
<h2>${v(`modelSetup.success.title`)}</h2>
${e.warning?d:f`<p>${o}</p>`}
</div>
${e.warning?f`<div class="model-setup-success__warning">${e.warning}</div>`:d}
<div class="model-setup-success__summary">
<span>${v(`modelSetup.success.activeModel`)}</span>
<strong>${e.modelRef}</strong>
${e.latencyMs===void 0?d:f`<span>
${v(`modelSetup.success.latency`,{latencyMs:String(e.latencyMs)})}
</span>`}
</div>
<footer class="model-setup-success__actions">
<button type="button" class="btn" @click=${n}>
${v(`modelSetup.success.stayHere`)}
</button>
<button type="button" class="btn primary" autofocus @click=${t}>
${g.messageSquare} ${s}
</button>
</footer>
</section>
</openclaw-modal-dialog>
`}function xt(){return(xt=e((()=>{p(),_(),_e(),T(),h()})))()}function St(e){if(e.state.phase===`idle`)return d;let t=e.state.phase===`starting`||e.state.phase===`step`||e.state.phase===`done`;return f`
<openclaw-modal-dialog
label=${v(e.mode===`prepare`?`modelSetup.wizard.prepareDialogLabel`:`modelSetup.wizard.dialogLabel`)}
@modal-cancel=${t?e.onCancel:e.onClose}
>
<div class="model-setup-wizard">
<div class="model-setup-wizard__header">
<h2>
${e.state.phase===`step`&&e.state.step.title?e.state.step.title:v(e.mode===`prepare`?`modelSetup.wizard.prepareTitle`:`modelSetup.wizard.title`)}
</h2>
</div>
<div class="model-setup-wizard__body">
${e.refreshWarning?f`<div class="callout warning" role="alert">${e.refreshWarning}</div>`:d}
${e.state.phase===`starting`?f`<div role="status">
${v(e.mode===`prepare`?`modelSetup.wizard.prepareStarting`:`modelSetup.wizard.starting`)}
</div>`:e.state.phase===`done`?f`<div role="status">${v(`modelSetup.wizard.checking`)}</div>`:e.state.phase===`error`||e.state.phase===`cancelled`?f`<div class="callout danger" role="alert">${e.state.message}</div>`:f`
${e.state.validationError?f`<div class="callout danger" role="alert">
${e.state.validationError}
</div>`:d}
${Le({step:e.state.step,value:e.value,busy:e.state.busy,inputId:Ct,confirmAffirmativeLabel:e.mode===`prepare`&&e.state.step.type===`confirm`?v(`modelSetup.wizard.continue`):void 0,leadingAction:f`<button
type="button"
class="btn"
@click=${e.onCancel}
>
${v(`common.cancel`)}
</button>`,onValueChange:e.onValueChange,onAnswer:e.onAnswer})}
${e.state.busy?f`<div role="status">${v(`modelSetup.wizard.working`)}</div>`:d}
`}
</div>
${e.state.phase===`step`?d:f`
<div class="model-setup-wizard__footer">
<button
type="button"
class="btn"
@click=${t?e.onCancel:e.onClose}
>
${v(t?`common.cancel`:`common.close`)}
</button>
</div>
`}
</div>
</openclaw-modal-dialog>
`}var Ct;function wt(){return(wt=e((()=>{p(),Re(),h(),_e(),Ct=`model-setup-wizard-text-input`})))()}function Tt(e){return e.recommended?v(`modelSetup.candidates.recommended`):e.credentials===!0?v(`modelSetup.candidates.credentialsReady`):e.credentials===!1?v(`modelSetup.candidates.signInNeeded`):v(`modelSetup.candidates.detected`)}function Et(e,t){let n=t.configuredModel?t.candidates.filter(e=>e.kind!==`existing-model`&&e.modelRef!==t.configuredModel):t.candidates;return n.length===0?d:f`
<section class="settings-section">
<div class="settings-section__header">
<h2>${v(`modelSetup.candidates.title`)}</h2>
</div>
<div class="model-setup__rows">
${n.map(t=>{let n=e.activation.phase===`testing`&&e.activation.targetId===j(t.kind,t.modelRef),r=e.activation.phase===`failure`&&e.activation.targetId===j(t.kind,t.modelRef)?e.activation:null;return f`
<div class="model-setup__row" data-candidate-kind=${t.kind}>
<div class="model-setup__row-main">
<div class="model-setup__row-title">
${K(e,t)}
<strong>${t.label}</strong>
<span class="model-setup__chip">${Tt(t)}</span>
</div>
<div class="muted">
${t.modelRef} · ${u(t.detail)}
</div>
</div>
<div class="model-setup__row-actions">
<button
type="button"
class=${`btn ${r?``:`primary`}`}
?disabled=${e.actionsDisabled}
@click=${()=>e.onActivateCandidate(t)}
>
<span>
${v(n?`modelSetup.candidates.testingButton`:r?`modelSetup.candidates.retry`:`modelSetup.candidates.testAndUse`)}
</span>
</button>
</div>
</div>
`})}
</div>
</section>
`}function Dt(e,t){let n=t.recommendedInstalls??[];return t.candidates.length>0||(t.authOptions?.length??0)>0||n.length===0?d:f`
<section class="settings-section model-setup__empty">
<div class="settings-section__header">
<h2>${v(`modelSetup.empty.title`)}</h2>
</div>
<p class="muted">${v(`modelSetup.empty.intro`)}</p>
<div class="model-setup__recommendations">
${n.map(t=>f`
<div class="model-setup__recommendation" data-recommended-install=${t.id}>
${K(e,t,`model-setup__icon--recommendation`)}
<div class="model-setup__row-main">
<strong>${t.label}</strong>
<div class="muted">${t.hint}</div>
<a href=${t.website} target="_blank" rel="noopener">${t.website}</a>
</div>
</div>
`)}
</div>
</section>
`}function Ot(e,t){return t.unavailableCandidates?.length?f`
<section class="settings-section">
<div class="settings-section__header">
<h2>${v(`modelSetup.unavailable.title`)}</h2>
</div>
<div class="model-setup__rows">
${t.unavailableCandidates.map(n=>{let r=(t.authOptions??[]).find(e=>e.id===n.authOptionId),i=t.manualProviders.find(e=>e.id===n.manualProviderId);return f`
<div
class="model-setup__row model-setup__row--info"
data-unavailable-candidate=${n.id}
>
<div class="model-setup__provider-copy">
${K(e,n)}
<div>
<div>
<strong>${n.label}</strong> — ${u(n.detail)}
</div>
<div class="muted">${u(n.reason)}</div>
</div>
</div>
<div class="model-setup__row-actions">
${r?f`<button
type="button"
class="btn primary"
?disabled=${e.actionsDisabled}
@click=${()=>e.onStartAuth(r)}
>
${v(`modelSetup.unavailable.signIn`,{provider:r.groupLabel??r.label})}
</button>`:d}
${i?f`<button
type="button"
class="btn"
?disabled=${e.actionsDisabled}
@click=${()=>e.onUseManualProvider(i.id)}
>
${v(`modelSetup.unavailable.useApiKey`)}
</button>`:d}
<button
type="button"
class="btn"
?disabled=${e.actionsDisabled}
@click=${e.onDetect}
>
${v(`modelSetup.checkAgain`)}
</button>
</div>
</div>
`})}
</div>
</section>
`:d}function X(e,t){return f`
<div class="model-setup__row" data-auth-choice=${t.id}>
<div class="model-setup__provider-copy">
${K(e,t)}
<div>
<strong>${t.label}</strong>
${t.groupLabel?f`<div class="muted">${t.groupLabel}</div>`:d}
${t.hint?f`<div class="muted">${t.hint}</div>`:d}
</div>
</div>
<button
type="button"
class="btn"
?disabled=${e.actionsDisabled}
@click=${()=>e.onStartAuth(t)}
>
${t.kind===`device-code`?v(`modelSetup.signIn.pair`):v(`modelSetup.signIn.signIn`)}
</button>
</div>
`}function kt(e,t){let n=(t.authOptions??[]).toSorted((e,t)=>Number(t.featured)-Number(e.featured));if(n.length===0)return d;let r=n.filter(e=>e.featured),i=n.filter(e=>!e.featured);return f`
<section class="settings-section">
<div class="settings-section__header">
<h2>${v(`modelSetup.signIn.title`)}</h2>
</div>
<div class="model-setup__rows">${r.map(t=>X(e,t))}</div>
${i.length?f`<details
class="model-setup__more"
.open=${e.moreSignInOpen}
@toggle=${t=>e.onMoreSignInToggle(t.currentTarget.open)}
>
<summary>${v(`modelSetup.signIn.more`)}</summary>
<div class="model-setup__rows">
${i.map(t=>X(e,t))}
</div>
</details>`:d}
</section>
`}function At(e,t){if(!e.canPrepare)return d;let n=rt(t);return n.length===0?d:f`
<section class="settings-section">
<div class="settings-section__header">
<h2>${v(`modelSetup.prepare.title`)}</h2>
</div>
<p class="muted">${v(`modelSetup.prepare.intro`)}</p>
<div class="model-setup__rows">
${n.map(t=>f`
<div class="model-setup__row" data-prepare-choice=${t.id}>
<div class="model-setup__provider-copy">
${K(e,t)}
<div>
<strong>${t.label}</strong>
${t.hint?f`<div class="muted">${t.hint}</div>`:d}
</div>
</div>
<button
type="button"
class="btn"
?disabled=${e.actionsDisabled}
@click=${()=>e.onStartPrepare(t)}
>
${t.actionLabel??v(`modelSetup.prepare.ollamaButton`)}
</button>
</div>
`)}
</div>
</section>
`}function Z(e){return e.groupLabel?.trim()||e.label}function jt(e){let t=e.label.trim();return t===Z(e)?void 0:t}function Mt(e,t,n){let r=n?jt(n):void 0,i=n?[Z(n),r].filter(Boolean).join(`, `):v(`modelSetup.manual.selectProvider`);return f`
<wa-dropdown
class="model-setup-provider-select"
placement="bottom-start"
aria-label=${v(`modelSetup.manual.provider`)}
@wa-select=${t=>yt(t,e.manualProviderId,e.onManualProviderChange)}
@wa-after-show=${_t}
@keydown=${vt}
>
<button
slot="trigger"
type="button"
class="model-setup-provider-select__trigger"
aria-label=${`${v(`modelSetup.manual.provider`)}: ${i}`}
?disabled=${e.actionsDisabled||t.manualProviders.length===0}
>
${n?K(e,n,`model-setup__icon--picker`):f`<span class="model-setup-provider-select__placeholder-icon" aria-hidden="true">
${g.key}
</span>`}
<span class="model-setup-provider-select__copy">
<strong>
${n?Z(n):v(`modelSetup.manual.selectProvider`)}
</strong>
${n?r?f`<span>${r}</span>`:d:f`<span>${v(`modelSetup.manual.selectProviderHint`)}</span>`}
</span>
<span class="model-setup-provider-select__chevron" aria-hidden="true">
${g.chevronDown}
</span>
</button>
${t.manualProviders.map(t=>{let n=t.id===e.manualProviderId,r=jt(t),i=[Z(t),r,t.hint].filter(Boolean).join(`, `);return f`
<wa-dropdown-item
class="model-setup-provider-select__option"
data-manual-provider=${t.id}
?data-selected=${n}
aria-label=${i}
.value=${t.id}
type="checkbox"
.checked=${n}
?disabled=${e.actionsDisabled}
${ce(e=>ve(e,n))}
>
<span slot="icon">
${K(e,t,`model-setup__icon--picker`)}
</span>
<span class="model-setup-provider-select__copy">
<strong>${Z(t)}</strong>
${r?f`<span>${r}</span>`:d}
${t.hint?f`<small>${t.hint}</small>`:d}
</span>
</wa-dropdown-item>
`})}
</wa-dropdown>
`}function Nt(e,t){let n=t.manualProviders.find(t=>t.id===e.manualProviderId),r=`manual:${e.manualProviderId}`,i=e.activation.phase===`testing`&&e.activation.targetId===r;return f`
<section class="settings-section">
<div class="settings-section__header">
<h2>${v(`modelSetup.manual.title`)}</h2>
</div>
<div class="model-setup__manual">
<div class="field">
<span>${v(`modelSetup.manual.provider`)}</span>
${Mt(e,t,n)}
</div>
<label class="field">
<span>
${n?v(`modelSetup.manual.accessValueFor`,{provider:Z(n)}):v(`modelSetup.manual.accessValue`)}
</span>
<input
class="input"
type="password"
autocomplete="off"
.value=${e.manualApiKey}
?disabled=${e.actionsDisabled}
placeholder=${v(`modelSetup.manual.accessValuePlaceholder`)}
@input=${t=>e.onManualApiKeyChange(t.currentTarget.value)}
/>
</label>
<div class="model-setup__manual-help">
${g.shieldCheck}
<span>${v(`modelSetup.manual.verifyHint`)}</span>
</div>
${e.manualError?f`<div class="callout danger" role="alert">${e.manualError}</div>`:d}
<button
type="button"
class="btn primary"
?disabled=${e.actionsDisabled||!e.manualProviderId}
@click=${e.onManualConnect}
>
${v(i?`modelSetup.candidates.testingButton`:`modelSetup.manual.connectAndVerify`)}
</button>
</div>
</section>
`}function Pt(e){e.querySelector(`.model-setup > .model-setup__testing, .model-setup > .model-setup__failure`)?.scrollIntoView?.({block:`nearest`,behavior:`auto`})}function Ft(e){return e.phase===`testing`?f`<div class="model-setup__testing" role="status">${v(`modelSetup.testing`)}</div>`:e.phase===`failure`?ut(e.status,e.error):d}function It(e,t){let n=e.firstRun&&t.setupComplete&&e.activation.phase!==`success`?e.onOpenChat:void 0,r=t.configuredModel?ht({result:t,verify:e.verify,canVerify:e.canVerify,actionsDisabled:e.actionsDisabled,onVerify:e.onVerify,onContinue:n}):d;return e.canAdmin?e.gatewayTooOld?f`${r}
<div class="callout warning" role="note">${v(`modelSetup.access.gatewayTooOld`)}</div>`:f`
${r} ${Dt(e,t)} ${Et(e,t)}
${Ot(e,t)} ${At(e,t)}
${kt(e,t)} ${Nt(e,t)}
`:f`${r}
<div class="callout warning" role="note">${v(`modelSetup.access.adminRequired`)}</div>`}function Q(e){return f`
<section class=${`settings-section ${e.className??``}`.trim()}>
<div class="settings-section__header"><h2>${e.title}</h2></div>
${e.intro?f`<p class="muted">${e.intro}</p>`:d}
<div class="model-setup__rows">
${Array.from({length:e.rows??1},(t,n)=>f`
<div class="model-setup__row model-setup__loading-row">
<span class="model-setup__loading-icon skeleton"></span>
<span class="model-setup__loading-copy">
${n===0&&e.status?f`<span class="model-setup__loading-status">${e.status}</span>`:f`<span class="skeleton skeleton-line skeleton-line--medium"></span>`}
<span class="skeleton skeleton-line skeleton-line--long"></span>
</span>
<span class="model-setup__loading-action skeleton"></span>
</div>
`)}
</div>
</section>
`}function Lt(e){return f`
<div
class="model-setup__loading"
role="status"
aria-busy="true"
aria-label=${v(`modelSetup.loading`)}
>
<div class="model-setup__loading-sections" aria-hidden="true">
${e?Q({title:v(`modelSetup.verify.title`),className:`model-setup__loading-section--selected`,status:v(`modelSetup.loading`)}):d}
${Q({title:v(`modelSetup.candidates.title`),className:`model-setup__loading-section--candidates`,status:e?void 0:v(`modelSetup.loading`)})}
${Q({title:v(`modelSetup.prepare.title`),intro:v(`modelSetup.prepare.intro`),rows:2})}
${Q({title:v(`modelSetup.signIn.title`),className:`model-setup__loading-section--sign-in`})}
${Q({title:v(`modelSetup.manual.title`)})}
</div>
</div>
`}function Rt(e){let t;e.page.phase===`ready`?t=It({...e,actionsDisabled:e.actionsDisabled||e.activationUnresolved===!0},e.page.result):e.canAdmin?e.gatewayTooOld?t=f`<div class="callout warning" role="note">
${v(`modelSetup.access.gatewayTooOld`)}
</div>`:e.page.phase===`loading`?t=Lt(e.modelConfigured===!0):e.page.phase===`detect-error`&&(t=f`
<div class="callout danger" role="alert">${e.page.message}</div>
<button type="button" class="btn" @click=${e.onDetect}>${v(`modelSetup.retry`)}</button>
`):t=f`<div class="callout warning" role="note">
${v(`modelSetup.access.adminRequired`)}
</div>`;let n=f`
<div class="model-setup">
<div class="model-setup__intro">
<div>
<h1>${v(`modelSetup.heading`)}</h1>
<p>${v(`modelSetup.intro`)}</p>
</div>
${e.page.phase===`ready`&&!e.page.result.configuredModel&&e.activation.phase!==`success`&&e.canAdmin&&!e.gatewayTooOld?f`<button
type="button"
class="btn"
?disabled=${e.actionsDisabled}
@click=${e.onDetect}
>
${v(`modelSetup.checkAgain`)}
</button>`:d}
</div>
${e.canAdmin&&!e.gatewayTooOld?Ft(e.activation):d}
${e.refreshWarning?f`<div class="callout warning" role="alert">${e.refreshWarning}</div>`:d}
${e.activationUnresolved&&!e.actionsDisabled&&e.activation.phase!==`success`?f`<div class="model-setup__recovery">
<p>${v(`modelSetup.recovery.unknown`)}</p>
${e.page.phase===`ready`&&e.page.result.configuredModel&&e.canVerify?f`<button type="button" class="btn primary" @click=${e.onUseCurrentModel}>
${v(`modelSetup.recovery.useCurrent`)}
</button>`:d}
<button type="button" class="btn" @click=${e.onDetect}>
${v(`modelSetup.checkAgain`)}
</button>
</div>`:d}
${t}
</div>
${St({mode:e.wizardMode,state:e.wizard,refreshWarning:e.refreshWarning,value:e.wizardValue,onValueChange:e.onWizardValueChange,onAnswer:e.onWizardAnswer,onCancel:e.onWizardCancel,onClose:e.onWizardClose})}
${e.activation.phase===`success`?bt(e.activation,e.onOpenChat,e.onSuccessClose,e.firstRun):d}
`;return f`
<section class="content-header">
<div>
<div class="page-title">${le(`model-setup`)}</div>
<div class="page-subtitle">
${de(`model-setup`)} ${Me(zt)}
</div>
</div>
</section>
${ze(n)}
`}var zt;function Bt(){return(Bt=e((()=>{p(),oe(),pe(),_(),Ne(),Be(),ge(),h(),l(),gt(),q(),Y(),I(),xt(),wt(),zt=`https://docs.openclaw.ai/concepts/model-providers`})))()}var Vt;function Ht(){return(Ht=e((()=>{l(),ne(),I(),Vt=class{constructor(e){this.options=e,this.currentState={phase:`idle`},this.session=null}get state(){return this.currentState}async start(e,t=`openclaw.setup.auth.start`){let n=this.options.getClient();if(!n||this.currentState.phase!==`idle`)return null;let r={client:n,sessionId:crypto.randomUUID(),abortController:new AbortController,startMethod:t,onTerminalResult:this.options.onStart?.(t)};this.session=r,this.setState({phase:`starting`,authChoice:e});try{let i=this.options.getAgentId(),o=n.request(t,{sessionId:r.sessionId,authChoice:e,...i?{agentId:i}:{}},{timeoutMs:null}).catch(e=>{if(!te(e))throw e;return{sessionId:r.sessionId,done:!0,status:`error`,error:a(e,this.options.requestFailedMessage())}}),s=await this.awaitWizardStart(r,o);return r!==this.session&&!s.done?(await this.cancelSession(r),null):s.done?this.applyResult(r,e,s):await this.requestNext(r,e)}catch(e){return this.handleError(e,r),null}}async answer(e,t=!0){let n=this.currentState,r=this.session;if(n.phase!==`step`||n.busy||!r)return null;this.setState({...n,busy:!0,validationError:null});let i=t?{stepId:n.step.id,value:e}:{stepId:n.step.id};try{return await this.requestNext(r,n.authChoice,i)}catch(e){return this.handleError(e,r),null}}async cancel(e={}){let t=this.session;e.settleActiveRequest||t?.abortController.abort(),this.session=null,this.setState({phase:`idle`}),t&&await this.cancelSession(t)}close(){this.session?.abortController.abort(),this.session=null,this.setState({phase:`idle`})}fail(e){this.session=null,this.setState({phase:`error`,message:e})}async awaitWizardStart(e,t){let n=!1,r,i=t.then(async t=>(n&&(t.done?this.reportTerminalResult(e,t):await this.cancelSession(e)),t));try{return await Promise.race([i,new Promise((t,i)=>{r=setTimeout(()=>{n=!0,i(Error(`gateway request timed out after ${F}ms: ${e.startMethod}`))},F)})])}finally{clearTimeout(r)}}async requestNext(e,t,n){let{client:r,sessionId:i,abortController:a}=e,o=a.signal,s=n;for(;;){let n=await r.request(`wizard.next`,{sessionId:i,...s?{answer:s}:{}},{timeoutMs:null,signal:o}),a=this.applyResult(e,t,n);if(e!==this.session||a)return a;let c=this.currentState;if(c.phase!==`step`||c.step.executor!==`gateway`)return null;s=void 0}}applyResult(e,t,n){let r=this.reportTerminalResult(e,n);if(e!==this.session)return null;let i=Ue(t,n,n.status===`cancelled`?this.options.cancelledMessage():this.options.requestFailedMessage());return n.done&&(this.session=null),this.setState(i),i.phase===`done`?{startMethod:e.startMethod,...r?{isCurrent:r}:{},...i.preparedModelRef?{preparedModelRef:i.preparedModelRef}:{},...n.modelActivation?{modelActivation:n.modelActivation}:{}}:null}handleError(e,t){if(t!==this.session)return;this.session=null,t.abortController.abort();let n=s(e);n||this.cancelSession(t);let r=n?this.options.sessionExpiredMessage():a(e,this.options.requestFailedMessage());this.setState({phase:`error`,message:r})}async cancelSession(e){try{let t=await e.client.request(`wizard.cancel`,{sessionId:e.sessionId},{timeoutMs:F});(t.status===`cancelled`||t.status===`error`)&&this.reportTerminalResult(e,{done:!0,...t})}catch{}}reportTerminalResult(e,t){let n=t.status===`cancelled`||t.status===`error`;if(t.done&&(e===this.session||n))return e.onTerminalResult?.(t)}setState(e){this.currentState=e,this.options.onChange(e)}}})))()}var $;function Ut(){return(Ut=e((()=>{Ce(),be(),ae(),me(),ue(),h(),ne(),S(),r(),ee(),ie(),et(),q(),G(),Y(),st(),I(),Bt(),Ht(),H(),$=class extends i{constructor(...e){super(...e),this.pageState={phase:`loading`},this.activationState={phase:`idle`},this.verifyState={phase:`idle`},this.wizardState={phase:`idle`},this.wizardMode=`auth`,this.manualProviderId=``,this.manualApiKey=``,this.manualError=null,this.moreSignInOpen=!1,this.iconUrls={},this.setupRefreshWarning=null,this.observedConnection=null,this.pendingPrepareOption=null,this.wizardMutationGeneration=0,this.wizardMutationActive=!1,this.firstRun=new $e({context:()=>this.context,routeData:()=>this.routeData,pageState:()=>this.pageState,actionsDisabled:()=>this.actionsDisabled(),canUseSetup:e=>this.canUseSetup(e),canVerify:e=>this.canVerify(e),verify:()=>this.verifyConnection().then(()=>this.verifyTask.value),activate:(e,t)=>this.activate({kind:e.kind,modelRef:e.modelRef},t).then(()=>this.activationTask.value),setVerifyState:e=>this.verifyState=e,setActivationState:e=>this.activationState=e,setRefreshWarning:e=>this.setupRefreshWarning=e}),this.iconLoader=new nt(()=>this.context,()=>this.pageState,e=>this.iconUrls=e),this.subscriptions=new re(this).watch(()=>this.context?.gateway,(e,t)=>e.subscribe(t),e=>this.synchronizeGateway(e.snapshot)).watch(()=>this.context?.agentSelection,(e,t)=>e.subscribe(t),()=>this.synchronizeGateway(this.context.gateway.snapshot)).watch(()=>this.firstRun,(e,t)=>e.subscribe(t)),this.wizard=new Vt({getClient:()=>this.context?.gateway.snapshot.client??null,getAgentId:()=>this.context?.agentSelection.state.selectedId??null,onChange:e=>{let t=this.wizardState.phase===`step`?this.wizardState.step.id:null;this.wizardState=e.phase===`step`&&this.wizardMutationActive?{...e,busy:!0}:e,e.phase===`step`&&e.step.id!==t&&(this.wizardValue=We(e.step))},onStart:e=>{if(e!==`openclaw.setup.auth.start`)return;let t=this.firstRun.beginActivation({kind:`provider-auth`});return e=>{if(e.status===`done`&&e.modelActivation)return this.firstRun.recordActivation(t,{ok:!0,...e.modelActivation}),()=>this.firstRun.ownsActivation(t);(e.status===`cancelled`||e.status===`error`)&&(this.firstRun.recordActivation(t,{ok:!1}),this.requestUpdate())}},requestFailedMessage:()=>v(`modelSetup.errors.requestFailed`),cancelledMessage:()=>v(`modelSetup.wizard.cancelled`),sessionExpiredMessage:()=>v(`modelSetup.wizard.sessionExpired`)}),this.detectTask=new y(this,{autoRun:!1,args:()=>{let e=this.context?.gateway.snapshot.client??null;return[this.canUseSetup(e)?e:null,this.context?.agentSelection.state.selectedId??null,null]},task:async([e,t,n],{signal:r})=>{if(!e||!n)return b;let i=this.context.gateway.snapshot.hello;return{...await W(e,()=>at(e,t??void 0,r)),agentId:t,hello:i,token:n}},onComplete:e=>{if(this.context.gateway.snapshot.client===e.client&&this.context.gateway.snapshot.hello===e.hello&&this.context.agentSelection.state.selectedId===e.agentId){if(`error`in e){this.firstRun.setReadyConnection(null),this.pageState={phase:`detect-error`,message:U(e.error)};return}this.firstRun.setReadyConnection({client:e.client,hello:e.hello,agentId:e.agentId}),this.pageState={phase:`ready`,result:e.value},this.syncManualProvider(this.pageState)}}}),this.activationTask=new y(this,{autoRun:!1,args:()=>[null,null],task:async([e,t],{signal:n})=>{if(!e||!t)return b;let r=()=>!0;return{...await W(e,async()=>{let i=await this.context.runtimeConfig.runExternalMutation(async i=>{if(i!==e)throw Error(`Connection changed before model activation started.`);n.throwIfAborted();let a=this.firstRun.beginActivation(t);r=()=>this.firstRun.ownsActivation(a);let o=await i.request(`openclaw.setup.activate`,t,{timeoutMs:A(t.kind),signal:n}).catch(e=>{throw te(e)&&this.firstRun.recordActivation(a,{ok:!1}),e});return this.firstRun.recordActivation(a,o),o});if(!i.ok)throw Error(i.error);return{result:i.value,refreshError:i.refresh.ok?null:i.refresh.error}}),isCurrent:r}},onComplete:e=>{let t=this.activationState;if(t.phase===`testing`&&this.context.gateway.snapshot.client===e.client){if(!e.isCurrent()){this.activationState={phase:`idle`};return}if(`error`in e){this.activationState={phase:`failure`,targetId:t.targetId,status:`unknown`,error:U(e.error)};return}this.finishActivation(e.value.result,t.targetId,e.value.refreshError)}}}),this.verifyTask=new y(this,{autoRun:!1,args:()=>[null,null],task:async([e,t],{signal:n})=>e?W(e,()=>ot(e,t??void 0,n)):b})}disconnectedCallback(){this.firstRun.dispose(),this.resetActivity(),this.observedConnection=null,this.subscriptions.clear(),super.disconnectedCallback()}willUpdate(){this.synchronizeGateway(this.context.gateway.snapshot)}updated(e){this.isConnected&&(e.has(`activationState`)&&this.activationState.phase!==`idle`&&Pt(this.renderRoot),this.iconLoader.reconcile(),this.firstRun.start())}synchronizeGateway(e){let t=this.routeData;if(!this.isConnected||!t)return;let n={client:e.client,hello:e.hello,agentId:this.context.agentSelection.state.selectedId,connected:e.phase===`connected`,firstRun:t.firstRun},r=this.observedConnection;r&&n.client===r.client&&n.hello===r.hello&&n.agentId===r.agentId&&n.connected===r.connected&&n.firstRun===r.firstRun||(this.observedConnection=n,n.firstRun===r?.firstRun?this.firstRun.connectionChanged(n):this.firstRun.routeChanged(),this.resetActivity(),this.pageState={phase:`loading`},this.canUseSetup(n.client)&&this.detect())}resetActivity(){this.wizardMutationGeneration+=1,this.wizardMutationActive=!1,this.detectTask.run([null,null,null]),this.activationState={phase:`idle`},this.activationTask.run([null,null]),this.verifyState={phase:`idle`},this.verifyTask.run([null,null]),this.iconLoader.reset(),this.pendingPrepareOption=null,this.wizard.cancel()}canUseSetup(e){let t=this.context.gateway.snapshot;return!!(e&&t.phase===`connected`&&fe(t.hello?.auth??null)&&x(t,`openclaw.setup.detect`)===!0)}syncManualProvider(e){e.phase===`ready`&&(e.result.manualProviders.some(e=>e.id===this.manualProviderId)||(this.manualProviderId=e.result.manualProviders[0]?.id??``))}async detect(){let e=this.context.gateway.snapshot.client;if(!this.canUseSetup(e))return null;this.resetVerify(),this.pageState={phase:`loading`};let t={};await this.detectTask.run([e,this.context.agentSelection.state.selectedId,t]);let n=this.detectTask.value;return n?.token===t&&`value`in n?n.value:null}canVerify(e){let t=this.context.gateway.snapshot;return this.canUseSetup(e)&&x(t,`openclaw.setup.verify`)===!0}resetVerify(){this.verifyState={phase:`idle`},this.verifyTask.run([null,null])}async verifyConnection(){let e=this.context.gateway.snapshot.client;!this.canVerify(e)||this.actionsDisabled()||(this.verifyState={phase:`checking`},await this.verifyTask.run([e,this.context.agentSelection.state.selectedId]))}async activate(e,t){let n=this.context.gateway.snapshot.client;if(!this.canUseSetup(n)||this.actionsDisabled()||this.firstRun.unresolved)return;this.manualError=null,this.activationState={phase:`testing`,targetId:t};let r=this.context.agentSelection.state.selectedId;await this.activationTask.run([n,{...e,...r?{agentId:r}:{}}])}finishActivation(e,t,n){this.activationState=Ve({result:e,targetId:t,fallbackError:v(`modelSetup.errors.activationFailed`),restartWarning:v(`labsPage.restartRequired`),refreshWarning:n}),this.activationState.phase===`success`&&(this.manualApiKey=``),this.firstRun.finishActivation(e,t,n)}activateCandidate(e){this.activate({kind:e.kind,modelRef:e.modelRef},j(e.kind,e.modelRef))}connectManual(){let e=this.manualApiKey.trim();if(!this.manualProviderId||!e){this.manualError=v(`modelSetup.manual.required`);return}this.activate({kind:`api-key`,authChoice:this.manualProviderId,apiKey:e},`manual:${this.manualProviderId}`)}selectManualProvider(e){e!==this.manualProviderId&&(this.manualApiKey=``),this.manualProviderId=e,this.manualError=null}async useManualProvider(e){this.selectManualProvider(e),await this.updateComplete;let t=this.renderRoot.querySelector(`.model-setup__manual input[type="password"]`);t?.scrollIntoView?.({block:`center`,behavior:je()}),t?.focus()}async handleWizardDone({startMethod:e,preparedModelRef:t,modelActivation:n,isCurrent:r}){let i=e===`openclaw.setup.prepare.start`?this.pendingPrepareOption:null;if(this.pendingPrepareOption=null,i&&t){let e=J(i.id);this.wizard.close(),this.activate({kind:e,modelRef:t},j(e,t));return}if(e===`openclaw.setup.auth.start`){if(r?.()===!1){this.wizard.close();return}if(!n){this.wizard.fail(v(`modelSetup.wizard.notComplete`));return}this.wizard.close(),this.finishActivation({ok:!0,...n},`provider-auth`,this.setupRefreshWarning);return}let a=await this.detect();if(!a){this.wizard.fail(v(`modelSetup.errors.requestFailed`));return}if(i){this.pageState={phase:`ready`,result:{...a,configuredModel:void 0,setupComplete:!1}};let e=it(a,i.id);if(!e){this.wizard.fail(v(`modelSetup.prepare.providerNotReady`,{provider:i.label}));return}this.wizard.close(),this.activateCandidate(e);return}this.wizard.close()}closeWizard(){this.wizardMutationGeneration+=1,this.wizardMutationActive=!1,this.pendingPrepareOption=null,this.wizard.close()}async runWizardMutation(e){let t=this.context.gateway.snapshot.client;if(this.wizardMutationActive||!this.canUseSetup(t)||this.wizard.state.phase===`idle`&&this.firstRun.unresolved)return;let n=++this.wizardMutationGeneration;this.wizardMutationActive=!0,this.requestUpdate();try{let r=await this.context.runtimeConfig.runExternalMutation(async n=>{if(n!==t)throw Error(`Connection changed before model setup continued.`);return await e()},{canDispatch:()=>n===this.wizardMutationGeneration&&this.context.gateway.snapshot.client===t&&this.canUseSetup(t),dispatchError:v(`modelSetup.errors.requestFailed`)});if(n!==this.wizardMutationGeneration){r.ok&&!r.refresh.ok&&this.isConnected&&(this.setupRefreshWarning=r.refresh.error),this.isConnected&&this.canUseSetup(this.context.gateway.snapshot.client)&&this.detect();return}if(!r.ok){this.wizard.fail(r.error);return}this.setupRefreshWarning=r.refresh.ok?null:r.refresh.error;let i=r.value;i?(this.wizardMutationActive=!1,await this.handleWizardDone(i)):this.wizardState.phase===`step`&&this.wizardState.busy&&(this.wizardState={...this.wizardState,busy:!1})}catch(e){n===this.wizardMutationGeneration&&this.wizard.fail(U(e))}finally{n===this.wizardMutationGeneration&&(this.wizardMutationActive=!1,this.requestUpdate())}}cancelWizard(){this.wizardMutationGeneration+=1,this.wizardMutationActive=!1,this.pendingPrepareOption=null,this.wizard.cancel({settleActiveRequest:!0})}actionsDisabled(){return this.activationState.phase===`testing`||this.verifyState.phase===`checking`||this.wizardMutationActive||this.wizardState.phase!==`idle`&&this.wizardState.phase!==`error`&&this.wizardState.phase!==`cancelled`}render(){let e=this.context.gateway.snapshot,t=fe(e.hello?.auth??null),n=e.phase===`connected`&&x(e,`openclaw.setup.detect`)!==!0,r=t&&!n&&x(e,`openclaw.setup.verify`)===!0;return Rt({page:this.firstRun.visiblePageState(this.verifyState.phase===`ok`),activation:this.activationState,verify:this.verifyState,wizard:this.wizardState,wizardMode:this.wizardMode,wizardValue:this.wizardValue,canAdmin:t,canVerify:r,canPrepare:t&&!n&&x(e,`openclaw.setup.prepare.start`)===!0,modelConfigured:c(e)?.modelConfigured===!0,gatewayTooOld:n,refreshWarning:this.setupRefreshWarning,activationUnresolved:this.firstRun.unresolved,onUseCurrentModel:()=>void this.firstRun.useCurrentModel(),actionsDisabled:this.actionsDisabled(),manualProviderId:this.manualProviderId,manualApiKey:this.manualApiKey,manualError:this.manualError,moreSignInOpen:this.moreSignInOpen,firstRun:this.routeData?.firstRun===!0,iconUrls:this.iconUrls,onDetect:()=>{this.firstRun.retryDetection()&&this.detect()},onVerify:()=>void this.firstRun.verify(),onActivateCandidate:e=>this.activateCandidate(e),onStartAuth:e=>{this.pendingPrepareOption=null,this.wizardMode=`auth`,this.runWizardMutation(()=>this.wizard.start(e.id))},onStartPrepare:e=>{this.pendingPrepareOption=e,this.wizardMode=`prepare`,this.runWizardMutation(()=>this.wizard.start(e.id,`openclaw.setup.prepare.start`))},onManualProviderChange:e=>this.selectManualProvider(e),onUseManualProvider:e=>void this.useManualProvider(e),onManualApiKeyChange:e=>{this.manualApiKey=e,this.manualError=null},onManualConnect:()=>this.connectManual(),onMoreSignInToggle:e=>this.moreSignInOpen=e,onIconError:e=>this.iconLoader.invalidate(e),onOpenChat:()=>this.firstRun.continueSetup(),onSuccessClose:()=>{this.activationState={phase:`idle`},this.detect()},onWizardValueChange:e=>this.wizardValue=e,onWizardAnswer:(e,t)=>void this.runWizardMutation(()=>this.wizard.answer(e,t)),onWizardCancel:()=>this.cancelWizard(),onWizardClose:()=>this.closeWizard()})}},n([Se({context:he,subscribe:!0})],$.prototype,`context`,void 0),n([se({attribute:!1})],$.prototype,`routeData`,void 0),n([m()],$.prototype,`pageState`,void 0),n([m()],$.prototype,`activationState`,void 0),n([m()],$.prototype,`verifyState`,void 0),n([m()],$.prototype,`wizardState`,void 0),n([m()],$.prototype,`wizardMode`,void 0),n([m()],$.prototype,`wizardValue`,void 0),n([m()],$.prototype,`manualProviderId`,void 0),n([m()],$.prototype,`manualApiKey`,void 0),n([m()],$.prototype,`manualError`,void 0),n([m()],$.prototype,`moreSignInOpen`,void 0),n([m()],$.prototype,`iconUrls`,void 0),n([m()],$.prototype,`setupRefreshWarning`,void 0),customElements.get(`openclaw-model-setup-page`)||customElements.define(`openclaw-model-setup-page`,$)})))()}Ut();export{Xe as resumeFirstRunActivation};
//# sourceMappingURL=model-setup-page-GgzvZ28q.js.map