UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

110 lines 15.7 kB
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Kn as t,R as n,ta as r,wr as i,z as a}from"./control-ui-foundation-Cydpkyqa.js";import{Bn as o,Eo as s,Oo as c,Sc as l,bc as u,bs as d,xs as f,zn as p}from"./control-ui-core-Rwzhj6nO.js";import{$ as m,K as ee,X as h,at as g,q as _}from"./lit-runtime-CV_MH99K.js";import{_ as v,_n as te,g as y,jn as ne}from"./control-ui-core-YphAl4aM.js";import{Yt as re,en as b}from"./control-ui-core-vvcQQV2m.js";import{n as x,r as S}from"./gateway-runtime-Bqqcp9-I.js";import{J as C,K as ie,L as w,Q as T,R as E,V as D,X as O,et as ae,in as oe,q as se,rn as k,tt as A,z as j}from"./control-ui-boot-chat-_QSl8fbH.js";import{Is as M,Ls as N}from"./control-ui-boot-shared-CXVvK2AW.js";import{n as P,t as F}from"./control-ui-boot-shared-3juXI2I2.js";import{n as I,t as L}from"./en-settings-D_ebb5Hk.js";import{n as R,t as z}from"./settings-workspace-Bseic8Tf.js";function B(e){let n=t(e.cloudWorkers)?e.cloudWorkers:null;return t(n?.profiles)?n.profiles:{}}function V(e){return t(e.settings)?e.settings:{}}function H(e,t){return r(e[t])??``}function U(e){return e?Object.entries(B(e)).flatMap(([e,n])=>{if(!t(n))return[];let i=V(n);return[{id:e,providerId:r(n.provider)??``,install:n.install===`npm`?`npm`:`bundle`,backend:H(i,`provider`),machineClass:H(i,`class`),ttl:H(i,`ttl`),idleTimeout:H(i,`idleTimeout`),setup:H(i,`setup`),desktop:i.desktop===!0,binary:H(i,`binary`)}]}).toSorted((e,t)=>e.id.localeCompare(t.id)):[]}function W(e){return{id:e?.id??``,backend:e?.backend??``,machineClass:e?.machineClass??``,ttl:e?.ttl||`8h`,idleTimeout:e?.idleTimeout||`45m`,setup:e?.setup??``,desktop:e?.desktop??!1,binary:e?.binary??``}}function G(e,t,n){let r=e.id.trim();if(!K.test(r)||r!==e.id)return`profileId`;if(!n&&Object.hasOwn(t,r))return`profileExists`;if(n&&!Object.hasOwn(t,n))return`profileMissing`;if(!e.backend.trim())return`backend`;let i=e.machineClass.trim();if(!i||i.length>128)return`machineClass`;if(!q.test(e.ttl.trim()))return`ttl`;if(!q.test(e.idleTimeout.trim()))return`idleTimeout`;let a=e.binary.trim();return a&&!a.startsWith(`/`)&&!J.test(a)?`binary`:null}function ce(e,n,i){let a=B(e),o=G(n,a,i);if(o)return{error:o};let s=i??n.id,c=t(a[s])?a[s]:{},l=V(c);if(i&&(r(c.provider)!==`crabbox`||!H(l,`class`)))return{error:`profileMissing`};let u=n.setup.trim(),d=!u&&Array.isArray(l.setupEnv)&&l.setupEnv.length>0,f={provider:n.backend.trim(),class:n.machineClass.trim(),ttl:n.ttl.trim(),idleTimeout:n.idleTimeout.trim(),setup:u||null,...d?{setupEnv:null}:{},desktop:n.desktop?!0:null,binary:n.binary.trim()||null},p={provider:r(c.provider)??`crabbox`,install:c.install===`npm`?`npm`:`bundle`,settings:f};return{patch:{cloudWorkers:{profiles:{[s]:p}}},replacePaths:d?F(l.setupEnv,`cloudWorkers.profiles.${s}.settings.setupEnv`):[]}}function le(e,n){let r=B(e);if(!Object.hasOwn(r,n))return{error:`profileMissing`};let i=t(e.cloudWorkers)?e.cloudWorkers:null,a=t(i?.projectProfiles)?i.projectProfiles:{},o=Object.fromEntries(Object.entries(a).filter(([,e])=>e===n).map(([e])=>[e,null]));return{patch:{cloudWorkers:{profiles:{[n]:null},...Object.keys(o).length>0?{projectProfiles:o}:{}}},replacePaths:F(r[n],`cloudWorkers.profiles.${n}`)}}function ue(e,t,n){return n?t.has(e)?`advertised`:`restart-required`:`loading`}var K,q,J;function Y(){return(Y=e((()=>{P(),K=/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/u,q=/^(?=.*[1-9])\+?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:ns|us|µs|μs|ms|s|m|h))+$/u,J=/^[A-Za-z]:[\\/]/u})))()}function X(e){let t=e.currentTarget;return t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement?t.value:``}var Z,Q;function $(){return($=e((()=>{a(),ee(),m(),te(),v(),k(),w(),z(),re(),L(),d(),c(),S(),N(),l(),o(),Y(),I(),Z=`https://docs.openclaw.ai/gateway/cloud-workers`,Q=class extends u{constructor(...e){super(...e),this.advertisedProfileIds=new Set,this.catalogLoaded=!1,this.catalogLoading=!1,this.catalogError=null,this.editor=null,this.draft=W(),this.formError=null,this.notice=null,this.busyProfileId=null,this.gateway=new M(this,{getGateway:()=>this.context?.gateway,invalidateRequests:()=>this.resetGatewayState(),onSnapshot:e=>{e.initial&&this.resetGatewayState()},ensureInitialData:()=>void this.loadCatalog()}),this.subscriptions=new p(this).effect(()=>this.context?.runtimeConfig,e=>(e.ensureLoaded(),e.subscribe(()=>this.requestUpdate())))}disconnectedCallback(){this.subscriptions.clear(),super.disconnectedCallback()}resetGatewayState(){this.busyProfileId=null,this.advertisedProfileIds=new Set,this.catalogLoaded=!1,this.catalogLoading=!1,this.catalogError=null}async loadCatalog(){if(this.catalogLoading||this.catalogLoaded)return;let e=this.gateway.capture();if(!e||!x(this.gateway.snapshot,`environments.list`,`operator.admin`)){this.catalogLoaded=!0;return}this.catalogLoading=!0,this.catalogError=null;try{let t=await e.client.request(`environments.list`,{});if(!this.gateway.isCurrent(e))return;this.advertisedProfileIds=new Set((t.profiles??[]).map(e=>e.id)),this.catalogLoaded=!0}catch(t){this.gateway.isCurrent(e)&&(this.catalogError=s(t),this.catalogLoaded=!0)}finally{this.gateway.isCurrent(e)&&(this.catalogLoading=!1)}}editableConfig(){return f(this.context?.runtimeConfig.state.configSnapshot)}profiles(){return U(this.editableConfig())}hasManageAccess(){return x(this.gateway.snapshot,`config.patch`,`operator.admin`)}canManage(){let e=this.context?.runtimeConfig.state;return!!(this.hasManageAccess()&&e?.configSnapshot?.hash&&!e.configLoading&&!e.configSaving&&this.busyProfileId===null)}openAdd(){this.canManage()&&(this.editor={kind:`add`},this.draft=W(),this.formError=null,this.notice=null)}openEdit(e){if(this.canManage()){if(e.providerId!==`crabbox`||!e.machineClass){this.context.navigate(`advanced`,{search:`?section=cloudWorkers`});return}this.editor={kind:`edit`,profileId:e.id},this.draft=W(e),this.formError=null,this.notice=null}}closeEditor(){this.busyProfileId===null&&(this.editor=null,this.formError=null)}patchDraft(e){this.draft={...this.draft,...e},this.formError=null}errorText(e){return b(`cloudWorkersPage.errors.${e}`)}async saveProfile(e){let t=this.gateway.capture(),n=this.context.runtimeConfig,r=this.editor?.kind===`edit`?this.editor.profileId:null,i=this.editableConfig();if(!t||!this.editor||!i||!this.canManage())return;let a=G(e,Object.fromEntries(this.profiles().map(e=>[e.id,!0])),r);if(a){this.formError=this.errorText(a);return}let o=r??e.id;this.busyProfileId=o,this.formError=null,this.notice=null;let c=()=>this.gateway.isCurrent(t)&&this.context.runtimeConfig===n;try{let t=await n.patchFromSnapshot(t=>{let n=ce(t,e,r);return`error`in n?{error:this.errorText(n.error)}:{options:{raw:n.patch,replacePaths:n.replacePaths,note:`cloud workers: ${r?`update`:`add`} ${o}`,canDispatch:c}}});if(!c())return;if(!t){this.formError=n.state.lastError??b(`cloudWorkersPage.errors.saveFailed`);return}this.editor=null,this.notice=b(`labsPage.restartRequired`)}catch(e){c()&&(this.formError=s(e))}finally{c()&&(this.busyProfileId=null)}}async deleteProfile(e){let t=this.context.gateway,n=t.snapshot.client,r=t.connection.gatewayUrl,i=this.context.runtimeConfig;if(!this.canManage()||!await oe({title:b(`cloudWorkersPage.deleteTitle`),message:b(`cloudWorkersPage.deleteConfirm`,{profile:e.id}),confirmLabel:b(`common.delete`),danger:!0}))return;let a=this.gateway.capture();if(!a||a.client!==n||this.context.gateway!==t||t.connection.gatewayUrl!==r||this.context.runtimeConfig!==i||!this.canManage()){this.formError=b(`cloudWorkersPage.errors.deleteFailed`);return}this.busyProfileId=e.id,this.formError=null,this.notice=null;let o=()=>this.gateway.isCurrent(a)&&this.context.runtimeConfig===i;try{let t=await i.patchFromSnapshot(t=>{let n=le(t,e.id);return`error`in n?{error:this.errorText(n.error)}:{options:{raw:n.patch,replacePaths:n.replacePaths,note:`cloud workers: delete ${e.id}`,canDispatch:o}}});if(!o())return;if(!t){this.formError=i.state.lastError??b(`cloudWorkersPage.errors.deleteFailed`);return}this.editor?.kind===`edit`&&this.editor.profileId===e.id&&(this.editor=null),this.notice=b(`labsPage.restartRequired`)}catch(e){o()&&(this.formError=s(e))}finally{o()&&(this.busyProfileId=null)}}profileDescription(e){return e.providerId===`crabbox`?[b(`cloudWorkersPage.backendFact`,{backend:e.backend||b(`common.unknown`)}),b(`cloudWorkersPage.classFact`,{value:e.machineClass||b(`common.unknown`)}),b(`cloudWorkersPage.ttlFact`,{value:e.ttl||b(`common.unknown`)}),b(`cloudWorkersPage.idleFact`,{value:e.idleTimeout||b(`common.unknown`)}),b(`cloudWorkersPage.desktopFact`,{value:e.desktop?b(`common.enabled`):b(`common.disabled`)})].join(` · `):b(`cloudWorkersPage.providerFact`,{provider:e.providerId||b(`common.unknown`)})}renderProfile(e){let t=ue(e.id,this.advertisedProfileIds,this.catalogLoaded),n=T(t===`advertised`?{kind:`ok`,label:b(`cloudWorkersPage.advertised`)}:t===`restart-required`?{kind:`warn`,label:b(`cloudWorkersPage.restartRequired`)}:{kind:`muted`,label:b(`common.loading`)}),r=this.canManage();return C({title:h`<code>${e.id}</code>`,description:this.profileDescription(e),control:h` ${n} <button class="btn btn--sm" type="button" ?disabled=${!r} @click=${()=>this.openEdit(e)} > ${b(`cloudWorkersPage.editAction`)} </button> <button class="btn btn--sm danger" type="button" ?disabled=${!r} @click=${()=>void this.deleteProfile(e)} > ${b(`common.delete`)} </button> `})}renderEditor(){if(!this.editor)return _;let e=this.busyProfileId!==null,t=this.canManage(),n=this.editor.kind===`edit`;return O({title:b(n?`cloudWorkersPage.editProfile`:`cloudWorkersPage.addProfile`)},[C({title:b(`cloudWorkersPage.fields.profileId`),description:b(`cloudWorkersPage.fields.profileIdHelp`),control:n?A(this.draft.id,{mono:!0}):h`<input class="settings-input mono" aria-label=${b(`cloudWorkersPage.fields.profileId`)} autocomplete="off" spellcheck="false" .value=${this.draft.id} ?disabled=${e} @input=${e=>this.patchDraft({id:X(e)})} />`}),C({title:b(`cloudWorkersPage.fields.backend`),description:h`${b(`cloudWorkersPage.fields.backendHelp`)} ${E(Z,b(`cloudWorkersPage.providerList`))}`,control:h`<input class="settings-input mono" aria-label=${b(`cloudWorkersPage.fields.backend`)} placeholder=${b(`cloudWorkersPage.fields.backendPlaceholder`)} autocomplete="off" spellcheck="false" .value=${this.draft.backend} ?disabled=${e} @input=${e=>this.patchDraft({backend:X(e)})} />`}),C({title:b(`cloudWorkersPage.fields.machineClass`),description:b(`cloudWorkersPage.fields.machineClassHelp`),control:h`<input class="settings-input mono" aria-label=${b(`cloudWorkersPage.fields.machineClass`)} autocomplete="off" spellcheck="false" .value=${this.draft.machineClass} ?disabled=${e} @input=${e=>this.patchDraft({machineClass:X(e)})} />`}),C({title:b(`cloudWorkersPage.fields.ttl`),description:b(`cloudWorkersPage.fields.ttlHelp`),control:h`<input class="settings-input mono" aria-label=${b(`cloudWorkersPage.fields.ttl`)} placeholder=${b(`cloudWorkersPage.fields.ttlPlaceholder`)} autocomplete="off" spellcheck="false" .value=${this.draft.ttl} ?disabled=${e} @input=${e=>this.patchDraft({ttl:X(e)})} />`}),C({title:b(`cloudWorkersPage.fields.idleTimeout`),description:b(`cloudWorkersPage.fields.idleTimeoutHelp`),control:h`<input class="settings-input mono" aria-label=${b(`cloudWorkersPage.fields.idleTimeout`)} placeholder=${b(`cloudWorkersPage.fields.idleTimeoutPlaceholder`)} autocomplete="off" spellcheck="false" .value=${this.draft.idleTimeout} ?disabled=${e} @input=${e=>this.patchDraft({idleTimeout:X(e)})} />`}),C({title:b(`cloudWorkersPage.fields.setup`),description:b(`cloudWorkersPage.fields.setupHelp`),stacked:!0,control:h`<textarea class="settings-input mono" aria-label=${b(`cloudWorkersPage.fields.setup`)} placeholder=${b(`cloudWorkersPage.fields.setupPlaceholder`)} autocomplete="off" spellcheck="false" .value=${this.draft.setup} ?disabled=${e} @input=${e=>this.patchDraft({setup:X(e)})} ></textarea>`}),ae({title:b(`cloudWorkersPage.fields.desktop`),description:b(`cloudWorkersPage.fields.desktopHelp`),checked:this.draft.desktop,disabled:e,onChange:e=>this.patchDraft({desktop:e})}),C({title:b(`cloudWorkersPage.fields.binary`),description:b(`cloudWorkersPage.fields.binaryHelp`),control:h`<input class="settings-input mono" aria-label=${b(`cloudWorkersPage.fields.binary`)} placeholder=${b(`cloudWorkersPage.fields.binaryPlaceholder`)} autocomplete="off" spellcheck="false" .value=${this.draft.binary} ?disabled=${e} @input=${e=>this.patchDraft({binary:X(e)})} />`}),...this.formError?[C({title:b(`cloudWorkersPage.errors.title`),description:h`<span role="alert">${this.formError}</span>`})]:[],C({title:b(`cloudWorkersPage.fields.actions`),description:b(`cloudWorkersPage.fields.actionsHelp`),control:h` <button class="btn primary" type="button" ?disabled=${!t} @click=${()=>void this.saveProfile(this.draft)} > ${b(e?`common.saving`:`common.save`)} </button> <button class="btn" type="button" ?disabled=${e} @click=${()=>this.closeEditor()}> ${b(`common.cancel`)} </button> `})])}render(){let e=this.profiles(),t=this.canManage()?h`<button class="btn btn--sm primary" type="button" @click=${()=>this.openAdd()}> ${b(`cloudWorkersPage.addProfile`)} </button>`:void 0,n=e.length?e.map(e=>this.renderProfile(e)):D(b(`cloudWorkersPage.empty`)),r=ie(h` ${this.hasManageAccess()?_:h`<div class="callout warning" role="note"> ${b(`cloudWorkersPage.adminRequired`)} </div>`} ${this.catalogError?h`<div class="callout warning" role="status"> ${b(`cloudWorkersPage.catalogFailed`,{error:this.catalogError})} </div>`:_} ${this.formError&&!this.editor?h`<div class="callout warning" role="alert">${this.formError}</div>`:_} ${this.notice?h`<div class="callout warning" role="status">${this.notice}</div>`:_} ${O({title:b(`cloudWorkersPage.sectionTitle`),description:b(`cloudWorkersPage.sectionDescription`),actions:t,count:e.length},n)} ${this.renderEditor()} `);return h` ${se({title:ne(`cloud-workers`),subtitle:h`${b(`cloudWorkersPage.intro`)} ${j(Z)}`})} ${R(r)} `}},i([n({context:y,subscribe:!0})],Q.prototype,`context`,void 0),i([g()],Q.prototype,`advertisedProfileIds`,void 0),i([g()],Q.prototype,`catalogLoaded`,void 0),i([g()],Q.prototype,`catalogLoading`,void 0),i([g()],Q.prototype,`catalogError`,void 0),i([g()],Q.prototype,`editor`,void 0),i([g()],Q.prototype,`draft`,void 0),i([g()],Q.prototype,`formError`,void 0),i([g()],Q.prototype,`notice`,void 0),i([g()],Q.prototype,`busyProfileId`,void 0),customElements.get(`openclaw-cloud-workers-page`)||customElements.define(`openclaw-cloud-workers-page`,Q)})))()}$(); //# sourceMappingURL=cloud-workers-page-a1p-QSQu.js.map