openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
69 lines • 15.6 kB
JavaScript
import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Ic as t,Lc as n,Nu as r,Pu as i,bl as a,ju as o,pn as s,un as c,xl as l,xu as u,yu as d,zu as f}from"./control-ui-core-CBJ5efDh.js";import{Ai as p,Tr as m,go as ee,ki as te,wo as ne,wr as h}from"./control-ui-core-DtLivg_r.js";import{G as g,J as _,W as v,Z as re,c as y,l as b,rt as x}from"./lit-runtime-IOnANfcZ.js";import{Rr as S,Ur as ie,Wr as ae,Zr as C,wa as oe,ya as w,zr as se}from"./ui-CmSP4d14.js";import{B as T,G as ce,I as E,K as le,R as D,U as O,V as k,W as A,Y as j,Z as M,a as N,et as P,l as F,o as I,q as L,u as R}from"./control-ui-boot-shared-XreXSF7h.js";import{Ml as z,Nl as B,Sn as V,xn as H}from"./control-ui-boot-shared-dOnP4mAA.js";import{n as ue,t as U}from"./en-settings-dSQ-fDvm.js";import{dt as de,ut as fe}from"./control-ui-boot-new-CkyIHJ_L.js";import{n as pe,s as me}from"./config-form.search-cybY4IfR.js";import{c as he,n as W,t as ge}from"./config-form-vWijKdnV.js";import{n as G,t as _e}from"./settings-select-row-D5tjxm-Z.js";import{r as ve,t as ye}from"./settings-model-Cx1r5SjY.js";import{n as be,t as K}from"./credential-editor-Ce-Uo77e.js";function q(e,t){return t.reduce((e,t)=>Array.isArray(e)&&typeof t==`number`||oe(e)&&typeof t==`string`&&Object.hasOwn(e,t)?e[t]:void 0,e)}function J(e){let t=e.configSnapshot;return JSON.stringify([t?.hash??null,t?.configRevisionHash??null,t?.appliedConfigHash??null])}function Y(e){return e.connected&&e.configSnapshot?.valid===!0&&!e.configLoading&&!e.configSaving&&!e.configApplying&&!e.configFormDirty&&!e.configNeedsApply&&!e.configRecoveryError&&(e.configAutoSaveStatus===`idle`||e.configAutoSaveStatus===`saved`)}function X(){return(X=e((()=>{})))()}function xe(e,t){if(t||e?.status===`error`)return _`<div role="alert" class="callout danger">
${t||e?.error||f(`searchPage.failure`)}
</div>`;if(!e)return g;let n=[...e.results??[],...e.citations??[]],r=n.filter((e,t)=>n.findIndex(t=>t.url===e.url)===t);return _`
${e.content?j({title:f(`searchPage.result`)},L({title:e.content})):g}
${r.length?j({title:f(`searchPage.sources`),count:r.length},r.map(e=>{let t=s(e.url,window.location.href),n=t&&/^https?:/u.test(t)?t:null;return L({title:n?_`<a href=${n} target="_blank" rel="noopener noreferrer"
>${e.title||e.url}</a
>`:e.title||e.url,description:`snippet`in e?e.snippet:e.url})})):e.content?g:T(f(`searchPage.noResults`))}
`}function Z(){return(Z=e((()=>{v(),E(),i(),c()})))()}var Q;function $(){return($=e((()=>{ae(),S(),v(),re(),y(),ee(),p(),h(),pe(),ge(),N(),E(),F(),i(),U(),l(),u(),H(),B(),r(),n(),_e(),fe(),K(),ye(),X(),Z(),ue(),Q=class extends o{constructor(...e){super(...e),this.result=null,this.error=``,this.loading=!1,this.testing=!1,this.testResult=null,this.testError=``,this.models=[],this.model=``,this.setupProvider=``,this.query=f(`searchPage.queryDefault`),this.generation=0,this.testGeneration=0,this.selectedAgent=``,this.configRevision=``,this.gateway=new z(this,{getGateway:()=>this.context?.gateway,onIdentityChange:()=>{this.model=``,this.setupProvider=``},invalidateRequests:()=>this.invalidate(),ensureInitialData:()=>{this.syncAgent(),this.load()}}),this.subscriptions=new t(this).watchStore(()=>this.context?.runtimeConfig,e=>{Y(e.state)||this.invalidateTest();let t=J(e.state);t!==this.configRevision&&(this.configRevision=t,this.load())}).watchStore(()=>this.context?.settingsAgentSelection,()=>this.syncAgent()).watchStore(()=>this.context?.agents)}disconnectedCallback(){this.invalidate(),this.subscriptions.clear(),super.disconnectedCallback()}invalidateTest(){this.testGeneration++,this.testResult=null,this.testError=``,this.testing=!1}invalidate(){this.generation++,this.invalidateTest(),this.result=null,this.error=``,this.loading=!1,this.models=[]}syncAgent(){let e=this.context?.settingsAgentSelection.state.selectedId??``;e!==this.selectedAgent&&(this.selectedAgent=e,this.model=``,this.invalidate(),this.load())}get selection(){let e=se(this.model);return{...this.selectedAgent?{agentId:this.selectedAgent}:{},...e?{modelProvider:e.provider,modelId:e.modelId}:{}}}get canEdit(){return this.gateway.connected&&m(this.context.gateway.snapshot).canAdmin&&this.context.runtimeConfig.canPatch!==!1}get busy(){let e=this.context.runtimeConfig.state;return e.configLoading||e.configSaving||e.configApplying}async load(){let e=this.gateway.capture();if(!e)return;let t=++this.generation;this.invalidateTest(),this.loading=!0,this.error=``;let n=()=>this.isConnected&&t===this.generation&&this.gateway.isCurrent(e),r=this.selection;if(this.canEdit){let e=this.context.runtimeConfig;e.ensureLoaded().then(()=>e.ensureSchemaLoaded()).catch(()=>void 0)}try{let t=await V(e.client,{agentId:r.agentId}).catch(()=>null);if(!n())return;this.models=t?.models??[];let i=await e.client.request(`webSearch.status`,r);if(n()&&(this.result=i,!i.providers.some(e=>e.id===this.setupProvider))){let e=i.provider??i.route.provider;this.setupProvider=i.providers.find(t=>t.id===e)?.id??i.providers.find(e=>e.available&&e.configured)?.id??i.providers.toSorted((e,t)=>e.label.localeCompare(t.label))[0]?.id??``}}catch(e){n()&&(this.error=d(e))}finally{n()&&(this.loading=!1)}}async patch(e,t,n){if(!e||!this.gateway.isCurrent(e)||!this.canEdit||this.busy)return!1;let r=this.context.runtimeConfig;this.invalidateTest(),n===void 0?r.removeFormValue(t):r.patchForm(t,n);let i=await r.flushFormChanges();return this.gateway.isCurrent(e)&&i&&await this.load(),i}async retryConfig(e){if(!e||!this.gateway.isCurrent(e))return;let t=this.context.runtimeConfig;if(t.state.configFormDirty){await t.retry();return}await t.refresh(),this.gateway.isCurrent(e)&&await t.refreshSchema()}async test(e,t){let n=this.query.trim(),r=this.context.runtimeConfig,i=J(r.state);if(!e||!this.gateway.isCurrent(e)||t!==this.generation||!this.canEdit||!n||n.length>500||!(this.result?.testProvider||this.result?.route.testable)||this.testing||!Y(r.state)||this.loading)return;let a=++this.testGeneration,o=()=>this.isConnected&&a===this.testGeneration&&this.gateway.isCurrent(e)&&this.context.runtimeConfig===r&&Y(r.state)&&J(r.state)===i;this.testing=!0,this.testResult=null,this.testError=``;try{let t=await e.client.request(`webSearch.test`,{...this.selection,...this.result?.testProvider?{providerId:this.result.testProvider.id}:{},query:n});o()&&(this.testResult=t)}catch(e){o()&&(this.testError=d(e))}finally{o()&&(this.testing=!1)}}renderConfigField(e,t,n,r,i){let a=this.context.runtimeConfig.state.configUiHints,o=me(t,e,a);return L({title:o.label,description:o.help,stackedOnNarrow:!0,control:he({schema:e,value:n,path:t,hints:a,unsupported:r,disabled:!this.canEdit||this.busy,compact:!0,commitOnBlur:!0,showLabel:!1,rawAvailable:!1,maskSensitive:!0,onPatch:(e,t)=>void i(e,t),onRemove:e=>void i(e,void 0)})})}renderSetup(e){let t=this.gateway.capture(),n=this.context.runtimeConfig,r=(n,r)=>this.setupProvider===e.id?this.patch(t,n,r):Promise.resolve(!1),i=a(n.state),o=W(n.state.configSchema),s=new Set(o.unsupportedPaths),c=e.configPath.length?e.configPath.slice(4).reduce((e,t)=>e?.properties?.[t]??null,ve(o.schema,e.pluginId)):null,l=w(q(i,e.configPath)),u=e.credential;return _`
${L({title:f(`searchPage.configuration`),description:f(`searchPage.credentialSources.${e.credentialSource}`),control:M({kind:e.available&&e.configured?`ok`:`warn`,label:f(e.installed?e.available?e.configured?`searchPage.configured`:`searchPage.needsSetup`:`searchPage.pluginUnavailable`:`searchPage.pluginMissing`)})})}
${u?L({title:u.label,stackedOnNarrow:!0,control:be({path:u.path,value:q(i,u.path),disabled:!this.canEdit||this.busy},u,{pluginId:e.pluginId,baseHash:n.state.configSnapshot?.hash??null,gateway:this.gateway,canInspect:this.canEdit,saveError:n.state.lastError,onCommit:r,onDiscard:()=>n.discardFormValue(u.path)})}):g}
${c?.properties?Object.entries(c.properties).filter(([t])=>!u||u.path.length!==e.configPath.length+1||!e.configPath.every((e,t)=>e===u.path[t])||u.path.at(-1)!==t).map(([t,n])=>this.renderConfigField(n,[...e.configPath,t],l?.[t],s,r)):g}
${L({title:f(`searchPage.pluginSettings`),description:f(`searchPage.pluginSettingsHint`),control:_`<a
class="btn btn--sm"
href=${`${ne(`plugin-settings`,this.context.basePath)}/${encodeURIComponent(e.pluginId)}?view=settings`}
>${f(`pluginsPage.detailSettings`)}</a
>`})}
${e.docsUrl?L({title:f(`searchPage.docs`),control:D(e.docsUrl)}):g}
`}renderAdvanced(){let e=this.context.runtimeConfig,t=this.gateway.capture(),n=W(e.state.configSchema),r=new Set(n.unsupportedPaths),i=n.schema?.properties?.tools?.properties?.web?.properties?.search,o=a(e.state),s=w(w(w(o?.tools)?.web)?.search),c=Object.entries(i?.properties??{}).filter(([e])=>e!==`enabled`&&e!==`provider`);return c.length?_`<details class="settings-section config-advanced-disclosure">
<summary class="settings-section__heading config-advanced-disclosure__summary">
${f(`searchPage.advanced`)}
</summary>
${k(c.map(([e,n])=>this.renderConfigField(n,[`tools`,`web`,`search`,e],s?.[e],r,(e,n)=>this.patch(t,e,n))))}
</details>`:g}render(){if(!this.context)return g;let e=this.result,t=this.gateway.capture(),n=this.generation,r=this.context.runtimeConfig.state,i=a(r),o=w(w(w(i?.tools)?.web)?.search),s=(e?.providers??[]).toSorted((e,t)=>e.label.localeCompare(t.label)),c=s.map(({id:e,label:t})=>({value:e,label:t})),l=i?typeof o?.provider==`string`?o.provider:``:e?.provider??``,u=s.find(e=>e.id===this.setupProvider),d=(this.context.agents.state.agentsList?.agents??[]).filter(e=>e.kind!==`system`),p=!this.canEdit||this.busy||!r.configSnapshot,m=R(ce(_`
${this.gateway.connected?g:T(f(`searchPage.offline`))}
${this.error?_`<div role="alert" class="callout danger">${this.error}<button class="btn btn--sm" =${()=>this.load()}>${f(`common.retry`)}</button></div>`:g}
${r.lastError?_`<div role="alert" class="callout danger">${r.lastError}<button class="btn btn--sm" =${()=>this.retryConfig(t)}>${f(`common.retry`)}</button></div>`:g}
${!e&&this.loading?O({rows:4}):g}
${e?_`
${j({description:f(`searchPage.scopeHint`),notice:this.canEdit?g:_`<p class="callout">${f(`searchPage.readOnly`)}</p>`},_`
${P({title:f(`searchPage.enabled`),description:f(`searchPage.enabledHint`),checked:typeof o?.enabled==`boolean`?o.enabled:e.enabled,disabled:p,onChange:e=>{this.patch(t,[`tools`,`web`,`search`,`enabled`],e)}})}
${G({title:f(`searchPage.provider`),description:f(`searchPage.automaticHint`),value:l,options:[{value:``,label:f(`searchPage.automatic`)},...c,...l&&!s.some(e=>e.id===l)?[{value:l,label:l}]:[]],disabled:p,onChange:e=>{this.setupProvider=e||this.setupProvider,this.patch(t,[`tools`,`web`,`search`,`provider`],e||void 0)}})}
`)}
${j({title:f(`searchPage.route`)},_`
${G({title:f(`searchPage.agent`),value:this.selectedAgent,options:d.map(e=>({value:e.id,label:e.name||e.id})),onChange:e=>this.context.settingsAgentSelection.set(e),disabled:!this.gateway.connected})}
${L({title:f(`searchPage.model`),description:e.model.runtimeLabel,control:I({label:f(`searchPage.model`),value:this.model,options:[{value:``,label:`${f(`searchPage.agentDefault`)} · ${e.model.provider}/${e.model.id}`},...this.models.map(e=>({value:`${e.provider}/${e.id}`,label:e.name||e.id,provider:e.provider}))],disabled:!this.gateway.connected,onChange:e=>{this.model=e,this.load()}})})}
${L({title:e.route.label,description:e.route.reason,control:M({kind:e.route.kind===`unavailable`?`warn`:e.route.kind===`disabled`||e.route.kind===`external`?`muted`:`ok`,label:this.loading?f(`searchPage.loading`):f(`searchPage.routeKinds.${e.route.kind}`)})})}
`)}
${j({title:f(`searchPage.health`),description:f(`searchPage.untestedHint`),actions:_`<button
class="btn btn--sm"
?disabled=${this.loading||this.testing||!this.gateway.connected}
=${()=>this.load()}
>
${f(`searchPage.refresh`)}
</button>`},_`
${L({title:f(`searchPage.health`),description:this.testResult?`${this.testResult.provider} · ${f(`searchPage.duration`,{ms:String(this.testResult.latencyMs)})}${this.testResult.cached?` · ${f(`searchPage.cached`)}`:``}`:void 0,control:_`<span role="status">${M({kind:this.testError||this.testResult?.status===`error`?`danger`:this.testResult?`ok`:`muted`,label:this.testing?f(`searchPage.testing`):this.testError||this.testResult?.status===`error`?f(`searchPage.failure`):this.testResult?f(`searchPage.success`):f(`searchPage.untested`)})}</span>`})}
${e.testProvider||e.route.testable?_`
${L({title:f(`searchPage.query`),control:_`<input
class="settings-input"
aria-label=${f(`searchPage.query`)}
maxlength="500"
?disabled=${this.testing}
.value=${this.query}
placeholder=${f(`searchPage.queryPlaceholder`)}
=${e=>{e.currentTarget instanceof HTMLInputElement&&!this.testing&&(this.query=e.currentTarget.value,this.invalidateTest())}}
=${e=>{e.key===`Enter`&&this.test(t,n)}}
/>`})}
${L({title:f(`searchPage.test`),control:_`<button class="btn" ?disabled=${!this.canEdit||!this.query.trim()||this.query.trim().length>500||this.testing||this.loading||!Y(r)||!this.gateway.connected} =${()=>this.test(t,n)}>${this.testing?f(`searchPage.testing`):e.testProvider?f(`searchPage.testProvider`,{provider:e.testProvider.label}):f(`searchPage.test`)}</button>`})}
`:g}
${e.route.kind===`native`||e.route.kind===`external`?A({title:f(`searchPage.testInChat`),description:f(`searchPage.testInChatHint`),onClick:()=>{t&&this.gateway.isCurrent(t)&&n===this.generation&&!this.loading&&this.context.navigate(`new-session`,{search:de(e.agentId,`${e.model.provider}/${e.model.id}`)})}}):g}
`)}
${xe(this.testResult,this.testError)}
${j({title:f(`searchPage.setup`),description:f(`searchPage.setupHint`)},_`
${G({title:f(`searchPage.setupProvider`),description:u?.hint,value:this.setupProvider,options:c,onChange:e=>{this.setupProvider=e}})}
${u?b(u.id,this.renderSetup(u)):g}
${A({title:f(`searchPage.moreProviders`),description:f(`searchPage.moreProvidersHint`),onClick:()=>this.context.navigate(`plugins`)})}
`)}
${this.renderAdvanced()}
`:g}
`));return _`${le({title:f(`tabs.search`),subtitle:f(`subtitles.search`)})}${m}`}},C([ie({context:te,subscribe:!0})],Q.prototype,`context`,void 0),C([x()],Q.prototype,`result`,void 0),C([x()],Q.prototype,`error`,void 0),C([x()],Q.prototype,`loading`,void 0),C([x()],Q.prototype,`testing`,void 0),C([x()],Q.prototype,`testResult`,void 0),C([x()],Q.prototype,`testError`,void 0),C([x()],Q.prototype,`models`,void 0),C([x()],Q.prototype,`model`,void 0),C([x()],Q.prototype,`setupProvider`,void 0),C([x()],Q.prototype,`query`,void 0),customElements.define(`openclaw-search-page`,Q)})))()}$();