openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
69 lines • 15.7 kB
JavaScript
import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Ac as t,Cu as n,Eu as r,Tu as i,dn as a,du as o,ju as s,kc as c,ml as l,mn as u,pl as d,pu as f}from"./control-ui-core-BncvAZjR.js";import{So as p,Sr as ee,Ti as te,mo as m,wi as h,xr as ne}from"./control-ui-core-9qYjK5B2.js";import{$ as g,X as _,Y as v,ct as y,d as b,nt as x,u as S}from"./lit-runtime-B8uOr6OX.js";import{K as re,q as ie}from"./control-ui-boot-shared-DJkUdZmL.js";import{Hr as ae,Ur as oe,Xr as se,Zr as ce,_a as le,fa as C,ii as w}from"./ui-DuRgK6kL.js";import{B as T,G as ue,I as E,K as D,R as O,U as k,V as A,W as j,Y as M,Z as N,a as P,et as F,l as I,o as L,q as R,u as z}from"./control-ui-boot-shared-xfDhIVun.js";import{Hc as B,Uc as V}from"./control-ui-boot-shared-D3oo_6Fq.js";import{n as H,t as U}from"./en-settings-KEcvGj5Z.js";import{ot as de,st as fe}from"./control-ui-boot-new-CxgnwT6A.js";import{n as pe,s as me}from"./config-form.search-DJEvDtN5.js";import{c as he,n as W,t as ge}from"./config-form-D5QdC_Am.js";import{n as G,t as _e}from"./settings-select-row-C4LcPBBS.js";import{r as ve,t as ye}from"./settings-model-D2N5Sxkb.js";import{n as be,t as K}from"./credential-editor-CkvILw07.js";function q(e,t){return t.reduce((e,t)=>Array.isArray(e)&&typeof t==`number`||le(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 g`<div role="alert" class="callout danger">
${t||e?.error||s(`searchPage.failure`)}
</div>`;if(!e)return _;let n=[...e.results??[],...e.citations??[]],r=n.filter((e,t)=>n.findIndex(t=>t.url===e.url)===t);return g`
${e.content?M({title:s(`searchPage.result`)},R({title:e.content})):_}
${r.length?M({title:s(`searchPage.sources`),count:r.length},r.map(e=>{let t=u(e.url,window.location.href),n=t&&/^https?:/u.test(t)?t:null;return R({title:n?g`<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?_:T(s(`searchPage.noResults`))}
`}function Z(){return(Z=e((()=>{v(),E(),r(),a()})))()}var Q;function $(){return($=e((()=>{ce(),ae(),v(),x(),S(),m(),te(),ne(),pe(),ge(),P(),E(),I(),r(),U(),l(),f(),re(),V(),i(),t(),_e(),de(),K(),ye(),X(),Z(),H(),Q=class extends n{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=s(`searchPage.queryDefault`),this.generation=0,this.testGeneration=0,this.selectedAgent=``,this.configRevision=``,this.gateway=new B(this,{getGateway:()=>this.context?.gateway,onIdentityChange:()=>{this.model=``,this.setupProvider=``},invalidateRequests:()=>this.invalidate(),ensureInitialData:()=>{this.syncAgent(),this.load()}}),this.subscriptions=new c(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=oe(this.model);return{...this.selectedAgent?{agentId:this.selectedAgent}:{},...e?{modelProvider:e.provider,modelId:e.modelId}:{}}}get canEdit(){return this.gateway.connected&&ee(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 ie(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=o(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,s=()=>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});s()&&(this.testResult=t)}catch(e){s()&&(this.testError=o(e))}finally{s()&&(this.testing=!1)}}renderConfigField(e,t,n,r,i){let a=this.context.runtimeConfig.state.configUiHints,o=me(t,e,a);return R({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=d(n.state),a=W(n.state.configSchema),o=new Set(a.unsupportedPaths),c=e.configPath.length?e.configPath.slice(4).reduce((e,t)=>e?.properties?.[t]??null,ve(a.schema,e.pluginId)):null,l=C(q(i,e.configPath)),u=e.credential;return g`
${R({title:s(`searchPage.configuration`),description:s(`searchPage.credentialSources.${e.credentialSource}`),control:N({kind:e.available&&e.configured?`ok`:`warn`,label:s(e.installed?e.available?e.configured?`searchPage.configured`:`searchPage.needsSetup`:`searchPage.pluginUnavailable`:`searchPage.pluginMissing`)})})}
${u?R({title:u.label,stackedOnNarrow:!0,control:be({path:u.path,value:q(i,u.path),disabled:!this.canEdit||this.busy,onPatch:(e,t)=>{r(e,t)}},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)})}):_}
${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],o,r)):_}
${R({title:s(`searchPage.pluginSettings`),description:s(`searchPage.pluginSettingsHint`),control:g`<a
class="btn btn--sm"
href=${`${p(`plugin-settings`,this.context.basePath)}/${encodeURIComponent(e.pluginId)}?view=settings`}
>${s(`pluginsPage.detailSettings`)}</a
>`})}
${e.docsUrl?R({title:s(`searchPage.docs`),control:O(e.docsUrl)}):_}
`}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,a=d(e.state),o=C(C(C(a?.tools)?.web)?.search),c=Object.entries(i?.properties??{}).filter(([e])=>e!==`enabled`&&e!==`provider`);return c.length?g`<details class="settings-section config-advanced-disclosure">
<summary class="settings-section__heading config-advanced-disclosure__summary">
${s(`searchPage.advanced`)}
</summary>
${A(c.map(([e,n])=>this.renderConfigField(n,[`tools`,`web`,`search`,e],o?.[e],r,(e,n)=>this.patch(t,e,n))))}
</details>`:_}render(){if(!this.context)return _;let e=this.result,t=this.gateway.capture(),n=this.generation,r=this.context.runtimeConfig.state,i=d(r),a=C(C(C(i?.tools)?.web)?.search),o=(e?.providers??[]).toSorted((e,t)=>e.label.localeCompare(t.label)),c=i?typeof a?.provider==`string`?a.provider:``:e?.provider??``,l=o.find(e=>e.id===this.setupProvider),u=(this.context.agents.state.agentsList?.agents??[]).filter(e=>e.kind!==`system`),f=!this.canEdit||this.busy||!r.configSnapshot,p=z(ue(g`
${this.gateway.connected?_:T(s(`searchPage.offline`))}
${this.error?g`<div role="alert" class="callout danger">${this.error}<button class="btn btn--sm" =${()=>this.load()}>${s(`common.retry`)}</button></div>`:_}
${r.lastError?g`<div role="alert" class="callout danger">${r.lastError}<button class="btn btn--sm" =${()=>this.retryConfig(t)}>${s(`common.retry`)}</button></div>`:_}
${!e&&this.loading?k({rows:4}):_}
${e?g`
${M({description:s(`searchPage.scopeHint`),notice:this.canEdit?_:g`<p class="callout">${s(`searchPage.readOnly`)}</p>`},g`
${F({title:s(`searchPage.enabled`),description:s(`searchPage.enabledHint`),checked:typeof a?.enabled==`boolean`?a.enabled:e.enabled,disabled:f,onChange:e=>{this.patch(t,[`tools`,`web`,`search`,`enabled`],e)}})}
${G({title:s(`searchPage.provider`),description:s(`searchPage.automaticHint`),value:c,options:[{value:``,label:s(`searchPage.automatic`)},...o.map(e=>({value:e.id,label:e.label})),...c&&!o.some(e=>e.id===c)?[{value:c,label:c}]:[]],disabled:f,onChange:e=>{this.setupProvider=e||this.setupProvider,this.patch(t,[`tools`,`web`,`search`,`provider`],e||void 0)}})}
`)}
${M({title:s(`searchPage.route`)},g`
${G({title:s(`searchPage.agent`),value:this.selectedAgent,options:u.map(e=>({value:e.id,label:e.name||e.id})),onChange:e=>this.context.settingsAgentSelection.set(e),disabled:!this.gateway.connected})}
${R({title:s(`searchPage.model`),description:e.model.runtimeLabel,control:L({label:s(`searchPage.model`),value:this.model,options:[{value:``,label:e.model?`${s(`searchPage.agentDefault`)} · ${e.model.provider}/${e.model.id}`:s(`searchPage.agentDefault`)},...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()}})})}
${R({title:e.route.label,description:e.route.reason,control:N({kind:e.route.kind===`unavailable`?`warn`:e.route.kind===`disabled`||e.route.kind===`external`?`muted`:`ok`,label:this.loading?s(`searchPage.loading`):s(`searchPage.routeKinds.${e.route.kind}`)})})}
`)}
${M({title:s(`searchPage.health`),description:s(`searchPage.untestedHint`),actions:g`<button
class="btn btn--sm"
?disabled=${this.loading||this.testing||!this.gateway.connected}
=${()=>this.load()}
>
${s(`searchPage.refresh`)}
</button>`},g`
${R({title:s(`searchPage.health`),description:this.testResult?`${this.testResult.provider} · ${s(`searchPage.duration`,{ms:String(this.testResult.latencyMs)})}${this.testResult.cached?` · ${s(`searchPage.cached`)}`:``}`:void 0,control:g`<span role="status">${N({kind:this.testError||this.testResult?.status===`error`?`danger`:this.testResult?`ok`:`muted`,label:this.testing?s(`searchPage.testing`):this.testError||this.testResult?.status===`error`?s(`searchPage.failure`):this.testResult?s(`searchPage.success`):s(`searchPage.untested`)})}</span>`})}
${e.testProvider||e.route.testable?g`
${R({title:s(`searchPage.query`),control:g`<input
class="settings-input"
aria-label=${s(`searchPage.query`)}
maxlength="500"
?disabled=${this.testing}
.value=${this.query}
placeholder=${s(`searchPage.queryPlaceholder`)}
=${e=>{e.currentTarget instanceof HTMLInputElement&&!this.testing&&(this.query=e.currentTarget.value,this.invalidateTest())}}
=${e=>{e.key===`Enter`&&this.test(t,n)}}
/>`})}
${R({title:s(`searchPage.test`),control:g`<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?s(`searchPage.testing`):e.testProvider?s(`searchPage.testProvider`,{provider:e.testProvider.label}):s(`searchPage.test`)}</button>`})}
`:_}
${e.route.kind===`native`||e.route.kind===`external`?j({title:s(`searchPage.testInChat`),description:s(`searchPage.testInChatHint`),onClick:()=>{t&&this.gateway.isCurrent(t)&&n===this.generation&&!this.loading&&this.context.navigate(`new-session`,{search:fe(e.agentId,`${e.model.provider}/${e.model.id}`)})}}):_}
`)}
${xe(this.testResult,this.testError)}
${M({title:s(`searchPage.setup`),description:s(`searchPage.setupHint`)},g`
${G({title:s(`searchPage.setupProvider`),description:l?.hint,value:this.setupProvider,options:o.map(e=>({value:e.id,label:e.label})),onChange:e=>{this.setupProvider=e}})}
${l?b(l.id,this.renderSetup(l)):_}
${j({title:s(`searchPage.moreProviders`),description:s(`searchPage.moreProvidersHint`),onClick:()=>this.context.navigate(`plugins`)})}
`)}
${this.renderAdvanced()}
`:_}
`));return g`${D({title:s(`tabs.search`),subtitle:s(`subtitles.search`)})}${p}`}},w([se({context:h,subscribe:!0})],Q.prototype,`context`,void 0),w([y()],Q.prototype,`result`,void 0),w([y()],Q.prototype,`error`,void 0),w([y()],Q.prototype,`loading`,void 0),w([y()],Q.prototype,`testing`,void 0),w([y()],Q.prototype,`testResult`,void 0),w([y()],Q.prototype,`testError`,void 0),w([y()],Q.prototype,`models`,void 0),w([y()],Q.prototype,`model`,void 0),w([y()],Q.prototype,`setupProvider`,void 0),w([y()],Q.prototype,`query`,void 0),customElements.define(`openclaw-search-page`,Q)})))()}$();