UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

69 lines • 16 kB
import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Br as t,Fr as n,Ji as r,Pr as i,Ui as a,qr as o,zr as s}from"./control-ui-foundation-ZY_Flbbd.js";import{Gl as c,Jc as l,an as u,cc as d,cn as f,hu as p,lu as ee,qc as m,ql as te,sc as ne,su as re,uu as h}from"./control-ui-core-3P365fbR.js";import{_r as g,co as _,go as v,vi as y,vr as b,yi as x}from"./control-ui-core-CFW9Qtjn.js";import{$ as S,X as C,Y as w,ct as T,m as ie,nt as ae,p as oe}from"./lit-runtime-P5vbNq6b.js";import{ct as se,no as ce,ro as le,st as ue}from"./control-ui-boot-shared-DoKu-5Ju.js";import{At as E,Dt as D,Et as O,Ft as k,Mt as A,Ot as j,St as M,Tt as N,_t as P,wt as F,xt as I,yt as L}from"./control-ui-boot-shared-CG9HtEG-.js";import{n as R,t as z}from"./en-settings-CTjRjKt9.js";import{lt as B,ut as V}from"./control-ui-boot-new-BTHisEC4.js";import{n as H,s as U}from"./config-form.search-Cgp2izNk.js";import{n as de,t as fe}from"./settings-workspace-whxhPRxQ.js";import{n as pe,t as me}from"./model-picker-DGuSm00e.js";import{c as he,n as W,t as ge}from"./config-form-CJ1yQ7qT.js";import{n as G,t as _e}from"./settings-select-row-YlQk8ZwW.js";import{r as ve,t as ye}from"./settings-model-BpgA2Bjs.js";import{n as be,t as K}from"./credential-editor-wA0iUUNI.js";function q(e,t){return t.reduce((e,t)=>Array.isArray(e)&&typeof t==`number`||r(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 S`<div role="alert" class="callout danger"> ${t||e?.error||p(`searchPage.failure`)} </div>`;if(!e)return C;let n=[...e.results??[],...e.citations??[]],r=n.filter((e,t)=>n.findIndex(t=>t.url===e.url)===t);return S` ${e.content?E({title:p(`searchPage.result`)},j({title:e.content})):C} ${r.length?E({title:p(`searchPage.sources`),count:r.length},r.map(e=>{let t=f(e.url,window.location.href),n=t&&/^https?:/u.test(t)?t:null;return j({title:n?S`<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?C:I(p(`searchPage.noResults`))} `}function Z(){return(Z=e((()=>{w(),P(),h(),u()})))()}var Q;function $(){return($=e((()=>{t(),i(),w(),ae(),oe(),_(),x(),g(),H(),ge(),me(),P(),fe(),h(),z(),l(),te(),ue(),le(),ee(),d(),_e(),B(),K(),ye(),X(),Z(),R(),Q=class extends re{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=p(`searchPage.queryDefault`),this.generation=0,this.testGeneration=0,this.selectedAgent=``,this.configRevision=``,this.gateway=new ce(this,{getGateway:()=>this.context?.gateway,onIdentityChange:()=>{this.model=``,this.setupProvider=``},invalidateRequests:()=>this.invalidate(),ensureInitialData:()=>{this.syncAgent(),this.load()}}),this.subscriptions=new ne(this).watch(()=>this.context?.runtimeConfig,(e,t)=>e.subscribe(t),e=>{Y(e.state)||this.invalidateTest();let t=J(e.state);t!==this.configRevision&&(this.configRevision=t,this.load())}).watch(()=>this.context?.settingsAgentSelection,(e,t)=>e.subscribe(t),()=>this.syncAgent()).watch(()=>this.context?.agents,(e,t)=>e.subscribe(t))}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=n(this.model);return{...this.selectedAgent?{agentId:this.selectedAgent}:{},...e?{modelProvider:e.provider,modelId:e.modelId}:{}}}get canEdit(){return this.gateway.connected&&b(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 se(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=c(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=c(e))}finally{o()&&(this.testing=!1)}}renderConfigField(e,t,n,r,i){let a=this.context.runtimeConfig.state.configUiHints,o=U(t,e,a);return j({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=m(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=a(q(i,e.configPath)),u=e.credential;return S` ${j({title:p(`searchPage.configuration`),description:p(`searchPage.credentialSources.${e.credentialSource}`),control:A({kind:e.available&&e.configured?`ok`:`warn`,label:p(e.installed?e.available?e.configured?`searchPage.configured`:`searchPage.needsSetup`:`searchPage.pluginUnavailable`:`searchPage.pluginMissing`)})})} ${u?j({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} ${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)):C} ${j({title:p(`searchPage.pluginSettings`),description:p(`searchPage.pluginSettingsHint`),control:S`<a class="btn btn--sm" href=${`${v(`plugin-settings`,this.context.basePath)}/${encodeURIComponent(e.pluginId)}?view=settings`} >${p(`pluginsPage.detailSettings`)}</a >`})} ${e.docsUrl?j({title:p(`searchPage.docs`),control:L(e.docsUrl)}):C} `}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=m(e.state),s=a(a(a(o?.tools)?.web)?.search),c=Object.entries(i?.properties??{}).filter(([e])=>e!==`enabled`&&e!==`provider`);return c.length?S`<details class="settings-section config-advanced-disclosure"> <summary class="settings-section__heading config-advanced-disclosure__summary"> ${p(`searchPage.advanced`)} </summary> ${M(c.map(([e,n])=>this.renderConfigField(n,[`tools`,`web`,`search`,e],s?.[e],r,(e,n)=>this.patch(t,e,n))))} </details>`:C}render(){if(!this.context)return C;let e=this.result,t=this.gateway.capture(),n=this.generation,r=this.context.runtimeConfig.state,i=m(r),o=a(a(a(i?.tools)?.web)?.search),s=(e?.providers??[]).toSorted((e,t)=>e.label.localeCompare(t.label)),c=i?typeof o?.provider==`string`?o.provider:``:e?.provider??``,l=s.find(e=>e.id===this.setupProvider),u=(this.context.agents.state.agentsList?.agents??[]).filter(e=>e.kind!==`system`),d=!this.canEdit||this.busy||!r.configSnapshot,f=de(O(S` ${this.gateway.connected?C:I(p(`searchPage.offline`))} ${this.error?S`<div role="alert" class="callout danger">${this.error}<button class="btn btn--sm" @click=${()=>this.load()}>${p(`common.retry`)}</button></div>`:C} ${r.lastError?S`<div role="alert" class="callout danger">${r.lastError}<button class="btn btn--sm" @click=${()=>this.retryConfig(t)}>${p(`common.retry`)}</button></div>`:C} ${!e&&this.loading?F({rows:4}):C} ${e?S` ${E({description:p(`searchPage.scopeHint`),notice:this.canEdit?C:S`<p class="callout">${p(`searchPage.readOnly`)}</p>`},S` ${k({title:p(`searchPage.enabled`),description:p(`searchPage.enabledHint`),checked:typeof o?.enabled==`boolean`?o.enabled:e.enabled,disabled:d,onChange:e=>{this.patch(t,[`tools`,`web`,`search`,`enabled`],e)}})} ${G({title:p(`searchPage.provider`),description:p(`searchPage.automaticHint`),value:c,options:[{value:``,label:p(`searchPage.automatic`)},...s.map(e=>({value:e.id,label:e.label})),...c&&!s.some(e=>e.id===c)?[{value:c,label:c}]:[]],disabled:d,onChange:e=>{this.setupProvider=e||this.setupProvider,this.patch(t,[`tools`,`web`,`search`,`provider`],e||void 0)}})} `)} ${E({title:p(`searchPage.route`)},S` ${G({title:p(`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})} ${j({title:p(`searchPage.model`),description:e.model.runtimeLabel,control:pe({label:p(`searchPage.model`),value:this.model,options:[{value:``,label:e.model?`${p(`searchPage.agentDefault`)} · ${e.model.provider}/${e.model.id}`:p(`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()}})})} ${j({title:e.route.label,description:e.route.reason,control:A({kind:e.route.kind===`unavailable`?`warn`:e.route.kind===`disabled`||e.route.kind===`external`?`muted`:`ok`,label:this.loading?p(`searchPage.loading`):p(`searchPage.routeKinds.${e.route.kind}`)})})} `)} ${E({title:p(`searchPage.health`),description:p(`searchPage.untestedHint`),actions:S`<button class="btn btn--sm" ?disabled=${this.loading||this.testing||!this.gateway.connected} @click=${()=>this.load()} > ${p(`searchPage.refresh`)} </button>`},S` ${j({title:p(`searchPage.health`),description:this.testResult?`${this.testResult.provider} · ${p(`searchPage.duration`,{ms:String(this.testResult.latencyMs)})}${this.testResult.cached?` · ${p(`searchPage.cached`)}`:``}`:void 0,control:S`<span role="status">${A({kind:this.testError||this.testResult?.status===`error`?`danger`:this.testResult?`ok`:`muted`,label:this.testing?p(`searchPage.testing`):this.testError||this.testResult?.status===`error`?p(`searchPage.failure`):this.testResult?p(`searchPage.success`):p(`searchPage.untested`)})}</span>`})} ${e.testProvider||e.route.testable?S` ${j({title:p(`searchPage.query`),control:S`<input class="settings-input" aria-label=${p(`searchPage.query`)} maxlength="500" ?disabled=${this.testing} .value=${this.query} placeholder=${p(`searchPage.queryPlaceholder`)} @input=${e=>{e.currentTarget instanceof HTMLInputElement&&!this.testing&&(this.query=e.currentTarget.value,this.invalidateTest())}} @keydown=${e=>{e.key===`Enter`&&this.test(t,n)}} />`})} ${j({title:p(`searchPage.test`),description:!e.testProvider&&!e.route.testable?e.route.reason:void 0,control:S`<button class="btn" ?disabled=${!this.canEdit||!(e.testProvider||e.route.testable)||!this.query.trim()||this.query.trim().length>500||this.testing||this.loading||!Y(r)||!this.gateway.connected} @click=${()=>this.test(t,n)}>${this.testing?p(`searchPage.testing`):e.testProvider?p(`searchPage.testProvider`,{provider:e.testProvider.label}):p(`searchPage.test`)}</button>`})} `:C} ${e.route.kind===`native`||e.route.kind===`external`?N({title:p(`searchPage.testInChat`),description:p(`searchPage.testInChatHint`),onClick:()=>{t&&this.gateway.isCurrent(t)&&n===this.generation&&!this.loading&&this.context.navigate(`new-session`,{search:V(e.agentId,`${e.model.provider}/${e.model.id}`)})}}):C} `)} ${xe(this.testResult,this.testError)} ${E({title:p(`searchPage.setup`),description:p(`searchPage.setupHint`)},S` ${G({title:p(`searchPage.setupProvider`),description:l?.hint,value:this.setupProvider,options:s.map(e=>({value:e.id,label:e.label})),onChange:e=>{this.setupProvider=e}})} ${l?ie(l.id,this.renderSetup(l)):C} ${N({title:p(`searchPage.moreProviders`),description:p(`searchPage.moreProvidersHint`),onClick:()=>this.context.navigate(`plugins`)})} `)} ${this.renderAdvanced()} `:C} `));return S`${D({title:p(`tabs.search`),subtitle:p(`subtitles.search`)})}${f}`}},o([s({context:y,subscribe:!0})],Q.prototype,`context`,void 0),o([T()],Q.prototype,`result`,void 0),o([T()],Q.prototype,`error`,void 0),o([T()],Q.prototype,`loading`,void 0),o([T()],Q.prototype,`testing`,void 0),o([T()],Q.prototype,`testResult`,void 0),o([T()],Q.prototype,`testError`,void 0),o([T()],Q.prototype,`models`,void 0),o([T()],Q.prototype,`model`,void 0),o([T()],Q.prototype,`setupProvider`,void 0),o([T()],Q.prototype,`query`,void 0),customElements.define(`openclaw-search-page`,Q)})))()}$();