UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

71 lines 17.3 kB
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Cn as t,Qi as n,R as r,ta as i,wr as a,z as o}from"./control-ui-foundation-Cydpkyqa.js";import{As as s,Bn as c,Fa as l,Ki as u,Ks as d,Ls as ee,Sc as f,ga as p,ha as te,k as m,w as ne,yc as h,za as g,zn as _}from"./control-ui-core-Rwzhj6nO.js";import{$ as re,C as ie,K as ae,X as v,at as y,b as oe,q as b,st as x}from"./lit-runtime-CV_MH99K.js";import{$n as se,An as ce,En as le,Mn as ue,Yn as de,Zt as fe,_ as pe,_n as me,g as he,mn as ge,nn as _e}from"./control-ui-core-YphAl4aM.js";import{F as ve,Gt as ye,N as be,Rt as xe,V as Se,Wt as S,Yt as C,b as Ce,en as w,y as we}from"./control-ui-core-vvcQQV2m.js";import{a as T,r as Te}from"./gateway-runtime-Bqqcp9-I.js";import{n as Ee,t as E}from"./transcript-search-BNkA0vxn.js";function D(e){switch(e){case`search`:return w(`palette.categories.search`);case`navigation`:return w(`palette.categories.navigation`);case`skills`:return w(`palette.categories.skills`);case`agents`:return w(`palette.items.agents`);case`apps`:return w(`palette.items.apps`);case`automations`:return w(`palette.items.scheduled`);case`models`:return w(`routeTitles.modelProviders`);case`plugins`:return w(`palette.items.plugins`);case`settings`:return w(`palette.items.settings`);case`chats`:return w(`sessionsView.title`);default:return e}}function De(e,t){return[{id:`nav-new-session`,label:w(`newSession.title`),icon:`plus`,category:`navigation`,action:`nav:new-session`},{id:`nav-sessions`,label:w(`palette.items.sessions`),icon:`fileText`,category:`navigation`,action:`nav:sessions`},{id:`nav-cron`,label:w(`palette.items.scheduled`),icon:`scrollText`,category:`navigation`,action:`nav:cron`},{id:`nav-skills`,label:w(`palette.items.skills`),icon:`zap`,category:`navigation`,action:`nav:skills`},{id:`nav-plugins`,label:w(`palette.items.plugins`),icon:`puzzle`,category:`navigation`,action:`nav:plugins`},{id:`nav-apps`,label:w(`palette.items.apps`),icon:`layoutGrid`,category:`navigation`,action:`nav:apps`},{id:`nav-config`,label:w(`palette.items.settings`),icon:`settings`,category:`navigation`,action:`nav:config`},{id:`nav-agents`,label:w(`palette.items.agents`),icon:`folder`,category:`navigation`,action:`nav:agents`},{id:`slash:verbose`,label:`/verbose`,icon:`terminal`,category:`search`,action:`/verbose full`,description:w(`palette.descriptions.verboseMode`)},...e?[{id:`panel-desktop`,label:w(`palette.items.desktop`),icon:`monitor`,category:`navigation`,action:`panel:desktop`}]:[],...t?[{id:`panel-custodian`,label:w(`nav.askOpenClaw`),icon:`lobster`,category:`navigation`,action:`panel:custodian`}]:[]]}function Oe(e){let t=De(e.desktopAvailable,e.custodianAvailable).filter(t=>e.includeSlashCommands||t.category!==`search`);if(!e.query)return t;let r=n(e.query),i=e=>{let t=n(e.label);return t===r?3:t.startsWith(r)?2:t.includes(r)||n(e.description).includes(r)||n(e.searchText).includes(r)?1:0},a=t.filter(e=>i(e)>0),o=e.catalogItems.map(e=>({item:e,rank:i(e)})).filter(({rank:e})=>e>0).toSorted((e,t)=>t.rank-e.rank||e.item.label.localeCompare(t.item.label)).slice(0,k).map(({item:e})=>e);return[...e.sessionItems,...a,...o]}function O(e){return e.map(e=>({id:e.id,label:e.label,icon:e.icon,category:e.category,action:`nav:${e.routeId}`,agentId:e.agentId,description:e.description,searchText:e.searchText}))}function ke(e,t=null){let n=ue(e,t).flatMap(e=>e.routes).concat(ge).map(e=>({id:`settings-${e}`,label:le(e),icon:`settings`,category:`settings`,routeId:e,description:ce(e),searchText:e})),r=A.map(e=>({id:`app-${e}`,label:w(`appsPage.cards.${e}.title`),icon:`layoutGrid`,category:`apps`,routeId:`apps`,description:w(`appsPage.cards.${e}.desc`),searchText:e}));return[...n,...r]}async function Ae(e){let t=async(t,n)=>e.methodAvailable(t)?e.client.request(t,n).catch(()=>null):null,[n,r,i,a,o]=await Promise.all([e.agents().catch(()=>null),t(`cron.list`,{includeDisabled:!0,limit:200,offset:0,sortBy:`name`,sortDir:`asc`,compact:!0}),t(`skills.status`,{agentId:e.agentId}),t(`plugins.list`,{}),t(`models.list`,{view:`configured`,agentId:e.agentId,preparedOnly:!0})]);return[...(n?.agents??[]).map(e=>({id:`agent-${e.id}`,label:e.identity?.name??e.name??e.id,icon:`bot`,category:`agents`,routeId:`agents`,agentId:e.id,description:e.id,searchText:[e.id,e.workspace,e.model?.primary,e.identity?.theme].filter(Boolean).join(` `)})),...(r?.jobs??[]).map(e=>({id:`automation-${e.id}`,label:e.displayName??e.name,icon:`calendarClock`,category:`automations`,routeId:`cron`,description:e.description,searchText:[e.id,e.declarationKey,e.name,e.agentId].filter(Boolean).join(` `)})),...(i?.skills??[]).map(e=>({id:`skill-${e.skillKey}`,label:e.name,icon:`zap`,category:`skills`,routeId:`skills`,description:e.description,searchText:[e.skillKey,e.source].filter(Boolean).join(` `)})),...(a?.plugins??[]).map(e=>({id:`plugin-${e.id}`,label:e.name,icon:`puzzle`,category:`plugins`,routeId:`plugins`,description:e.description,searchText:[e.id,e.packageName,e.category,e.kind?.join(` `)].filter(Boolean).join(` `)})),...(o?.models??[]).map(e=>({id:`model-${JSON.stringify([e.provider,e.id])}`,label:e.name||e.id,icon:`brain`,category:`models`,routeId:`model-providers`,description:e.provider,searchText:[e.id,e.provider,e.alias,e.tags?.join(` `)].filter(Boolean).join(` `)}))]}var k,A;function j(){return(j=e((()=>{me(),C(),k=10,A=[`ios`,`android`,`appleWatch`,`wearOs`,`macos`,`windows`,`linux`,`chrome`,`plugins`]})))()}function M(e,t){let r=n(t),i=[g(e.key,e),e.key,e.label,e.subject,e.category,e.kind,e.model,e.modelProvider,e.owner?.actor.label,e.owner?.actor.id,e.createdActor?.label,e.createdActor?.id].map(e=>n(e)).filter(Boolean);return i.some(e=>e===r)?3:i.some(e=>e.startsWith(r))?2:+!!i.some(e=>e.includes(r))}function je(e){let n=e.replace(/\s+/gu,` `).trim();return n.length>N?`${t(n,159)}…`:n}var N;function P(){return(P=e((()=>{l(),N=160})))()}function Me(e){let t=new Map;for(let n of e){let e=t.get(n.category)??[];e.push(n),t.set(n.category,e)}return[...t.entries()]}function F(e,t){if(e.action.startsWith(`nav:`)){let n=e.action.slice(4);e.agentId?t.onNavigate?.(n,{pathname:se(e.agentId,null,t.basePath)}):t.onNavigate?.(n)}else e.action.startsWith(z)?t.onSelectSession?.(e.action.slice(8)):e.action===`panel:desktop`?window.dispatchEvent(new CustomEvent(ve,{detail:{open:!0}})):e.action===`panel:custodian`?window.dispatchEvent(new CustomEvent(be,{detail:{open:!0}})):t.onSlashCommand?.(e.action);t.onToggle()}function I(e){e.onToggle()}function L(){requestAnimationFrame(()=>{document.querySelector(`.cmd-palette__item--active`)?.scrollIntoView({block:`nearest`})})}function Ne(e,t,n,r){if(n.length!==0||e.key!==`ArrowDown`&&e.key!==`ArrowUp`&&e.key!==`Enter`)switch(e.key){case`ArrowDown`:e.preventDefault(),t.onActiveIdChange(n[(r+1)%n.length].id),L();break;case`ArrowUp`:e.preventDefault(),t.onActiveIdChange(n[(r-1+n.length)%n.length].id),L();break;case`Enter`:e.preventDefault();{let e=n[r];e&&F(e,t)}break;case`Escape`:e.preventDefault(),e.stopPropagation(),I(t)}}function R(e){return`cmd-palette-option-${e}`}function Pe(e){e instanceof HTMLInputElement&&requestAnimationFrame(()=>{e.isConnected&&e.focus()})}function Fe(e){if(!e.open)return b;let t=Me(Oe({...e,includeSlashCommands:!!e.onSlashCommand})),n=t.flatMap(([,e])=>e),r=Math.max(0,n.findIndex(t=>t.id===e.activeId)),i=n[r]?R(r):b,a=w(`palette.placeholder`);return v` <openclaw-modal-dialog class="cmd-palette-overlay palette" label=${a} style="--openclaw-modal-width: min(640px, calc(100vw - 32px));" @modal-cancel=${()=>I(e)} > <div class="cmd-palette" @click=${e=>e.stopPropagation()} @keydown=${t=>Ne(t,e,n,r)} > <label id=${Y} class="cmd-palette__label" for=${X} >${a}</label > <input ${ie(e.onInputRef)} autofocus id=${X} class="cmd-palette__input" role="combobox" aria-autocomplete="list" aria-controls=${Z} aria-activedescendant=${i} aria-expanded="true" placeholder=${a} .value=${e.query} @input=${t=>e.onQueryChange(t.target.value)} /> <div id=${Z} class="cmd-palette__results" role="listbox"> ${e.sessionSearchPartial||e.sessionSearchIncomplete?v`<div class="cmd-palette__empty" role="status"> ${w(e.sessionSearchIncomplete?`palette.searchIncomplete`:`palette.searchPartial`)} </div>`:b} ${t.length===0?v`<div class="cmd-palette__empty"> <span class="nav-item__icon" style="opacity:0.3;width:20px;height:20px" >${S.search}</span > <span >${e.sessionSearchFailed?w(`palette.searchFailed`):w(`palette.noResults`)}</span > </div>`:t.map(([t,i])=>v` <div class="cmd-palette__group-label"> ${D(t)} </div> ${i.map(t=>{let i=n.indexOf(t),a=i===r;return v` <div id=${R(i)} class="cmd-palette__item ${a?`cmd-palette__item--active`:``}" role="option" aria-selected=${a?`true`:`false`} @click=${n=>{n.stopPropagation(),F(t,e)}} @mouseenter=${()=>e.onActiveIdChange(t.id)} > <span class="nav-item__icon">${S[t.icon]}</span> <span>${t.label}</span> ${t.description?v`<span class="cmd-palette__item-desc muted" >${t.description}</span >`:b} </div> `})} `)} </div> <div class="cmd-palette__footer"> <span><kbd>↑↓</kbd> ${w(`palette.footer.navigate`)}</span> <span><kbd>↵</kbd> ${w(`palette.footer.select`)}</span> <span><kbd>esc</kbd> ${w(`palette.footer.close`)}</span> </div> </div> </openclaw-modal-dialog> `}var z,B,V,H,U,W,G,K,q,J,Y,X,Z,Q;function $(){return($=e((()=>{o(),ae(),re(),oe(),de(),pe(),_e(),C(),m(),Te(),l(),u(),s(),E(),f(),c(),j(),we(),P(),ye(),xe(),Se(),z=`session:`,B=50,V=2,H=10,U=4,W=50,G=4,K=4,q=200,J=3e4,Y=`cmd-palette-label`,X=`cmd-palette-input`,Z=`cmd-palette-listbox`,Q=class extends h{constructor(){super(),this.desktopAvailable=!1,this.custodianAvailable=!1,this.open=!1,this.query=``,this.activeId=null,this.sessionItems=[],this.catalogItems=[],this.sessionSearchFailed=!1,this.sessionSearchPartial=!1,this.sessionSearchIncomplete=!1,this.subscriptions=new _(this),this.sessionSearchTimer=null,this.sessionSearchId=0,this.togglePalette=()=>{if(this.open){this.open=!1,this.clearSessionSearch();return}this.openPalette()},this.handleInputRef=e=>{this.open&&Pe(e)},this.handleGlobalKeydown=e=>{if(!e.defaultPrevented&&e.key===`Escape`&&this.open){e.preventDefault(),this.togglePalette();return}Ce(e)&&(e.preventDefault(),this.togglePalette())},this.subscriptions.watch(()=>this.context?.gateway,(e,t)=>e.subscribe(t),e=>this.synchronizeGateway(e))}connectedCallback(){super.connectedCallback(),document.addEventListener(`keydown`,this.handleGlobalKeydown)}disconnectedCallback(){document.removeEventListener(`keydown`,this.handleGlobalKeydown),this.open=!1,this.query=``,this.activeId=null,this.clearSessionSearch(),this.clearCatalogSearch(),this.sessionSearchSource=void 0,super.disconnectedCallback()}openPalette(){this.open=!0,this.query=``,this.activeId=null,this.clearSessionSearch()}get isOpen(){return this.open}synchronizeGateway(e){let t=e.snapshot,n=this.sessionSearchSource,r=n?.gateway!==e,i=n?.client!==t.client,a=n?.connected===!1&&t.phase===`connected`;this.sessionSearchSource={gateway:e,client:t.client,connected:t.phase===`connected`},(r||i||t.phase!==`connected`)&&(this.clearSessionSearch(),this.clearCatalogSearch()),t.phase===`connected`&&(r||i||a)&&this.scheduleSessionSearch(this.query)}clearSessionSearch(){this.sessionSearchTimer!==null&&(globalThis.clearTimeout(this.sessionSearchTimer),this.sessionSearchTimer=null),this.sessionSearchId+=1,this.sessionItems=[],this.sessionSearchFailed=!1,this.sessionSearchPartial=!1,this.sessionSearchIncomplete=!1}clearCatalogSearch(){this.catalogLoad=void 0,this.catalogItems=[]}ensureCatalogItems(){let e=this.context,t=e?.gateway,n=t?.snapshot.client;if(!e||t?.snapshot.phase!==`connected`||!n)return Promise.resolve();let r=d(t.snapshot),i=this.catalogLoad;if(i?.client===n&&i.agentId===r&&(i.loadedAt===void 0||Date.now()-i.loadedAt<J))return i.promise;let a=t.snapshot,o=Ae({client:n,agentId:r,agents:()=>e.agents?.ensureList?.()??Promise.resolve(null),methodAvailable:e=>!!T(a,e)}).then(e=>{this.catalogLoad?.promise===o&&this.context?.gateway===t&&t.snapshot.client===n&&(this.catalogItems=O(e),this.catalogLoad.loadedAt=Date.now())});return this.catalogLoad={client:n,agentId:r,promise:o},o}scheduleSessionSearch(e){this.clearSessionSearch();let t=i(e);!this.open||!t||t.length<V||(this.sessionSearchTimer=globalThis.setTimeout(()=>{this.sessionSearchTimer=null,this.ensureCatalogItems(),this.onSelectSession&&this.searchSessions(t)},B))}async searchSessions(e){let t=this.context,n=t?.sessions,r=t?.gateway,i=r?.snapshot.client;if(!n||r?.snapshot.phase!==`connected`||!i)return;let a=++this.sessionSearchId,o=()=>a===this.sessionSearchId&&this.open&&this.context?.sessions===n&&this.context?.gateway===r&&r.snapshot.client===i&&r.snapshot.phase===`connected`,s=T(r.snapshot,`sessions.search`),c=d(r.snapshot),l=s?Ee({client:i,query:e,result:void 0,listSessions:n.list,listOptions:{includeGlobal:!1,includeUnknown:!1,configuredAgentsOnly:!0},resolveAgentId:e=>ee(e)?.agentId??c,isCurrent:o,maxListPages:G,maxSearchRequests:K,maxSessionKeys:q,mapPageRows:e=>te(e,{agentId:``,defaultAgentId:c,filterByAgent:!1})}).then(e=>({error:!1,result:e})).catch(()=>({error:!0,result:null})):Promise.resolve(null),u=[],f=new Set,m=new Set([0]),h=0,_;try{for(;u.length<H&&h<U;){let t=await n.list({search:e,limit:W,..._===void 0?{}:{offset:_},includeGlobal:!1,includeUnknown:!1});if(h+=1,!o()||!t)return;let r=p(t,{agentId:``,defaultAgentId:c,filterByAgent:!1});for(let e of r)f.has(e.key)||(f.add(e.key),u.push(e));if(u.length>=H||!t.hasMore)break;let i=typeof t.nextOffset==`number`&&Number.isFinite(t.nextOffset)?Math.max(0,Math.floor(t.nextOffset)):t.sessions.length>0?(_??0)+t.sessions.length:null;if(i===null||m.has(i))break;m.add(i),_=i}let t=await l;if(!o())return;let r=t?.result??null;this.sessionSearchPartial=t?.error===!0,this.sessionSearchIncomplete=t?.error!==!0&&(r?.indexing===!0||r?.truncated===!0);let i=new Map;for(let e of r?.results??[])i.has(e.sessionKey)||i.set(e.sessionKey,e);let a=new Map(u.map(e=>[e.key,e]));for(let e of r?.sessions??[])a.has(e.key)||a.set(e.key,e);this.sessionItems=[...a.values()].map(t=>({row:t,metadataRank:Math.max(+!!f.has(t.key),M(t,e)),transcriptHit:i.get(t.key)})).filter(({metadataRank:e,transcriptHit:t})=>e>0||t).toSorted((e,t)=>{let n=t.metadataRank-e.metadataRank;return n===0?(t.transcriptHit?.score??-1/0)-(e.transcriptHit?.score??-1/0)||(t.row.updatedAt??0)-(e.row.updatedAt??0):n}).slice(0,H).map(({row:t,transcriptHit:n})=>({id:`session-${t.key}`,label:g(t.key,t),icon:`messageSquare`,category:`chats`,action:`${z}${t.key}`,description:n&&M(t,e)===0?je(n.snippet):ne(t.updatedAt,{fallback:``})}))}catch{a===this.sessionSearchId&&this.open&&(this.sessionSearchFailed=!0)}}render(){return Fe({basePath:this.context?.basePath??``,open:this.open,query:this.query,activeId:this.activeId,sessionItems:this.sessionItems,catalogItems:[...O(ke(fe(this.context?.gateway.snapshot.hello?.auth??null),this.context?.nativeDeviceSettings)),...this.catalogItems],sessionSearchFailed:this.sessionSearchFailed,sessionSearchPartial:this.sessionSearchPartial,sessionSearchIncomplete:this.sessionSearchIncomplete,desktopAvailable:this.desktopAvailable,custodianAvailable:this.custodianAvailable,onToggle:this.togglePalette,onQueryChange:e=>{this.query=e,this.activeId=null,this.scheduleSessionSearch(e)},onActiveIdChange:e=>{this.activeId=e},onNavigate:this.onNavigate,onSelectSession:this.onSelectSession,onSlashCommand:this.onSlashCommand,onInputRef:this.handleInputRef})}},a([x({attribute:!1})],Q.prototype,`onNavigate`,void 0),a([x({attribute:!1})],Q.prototype,`onSelectSession`,void 0),a([x({attribute:!1})],Q.prototype,`onSlashCommand`,void 0),a([x({attribute:!1})],Q.prototype,`desktopAvailable`,void 0),a([x({attribute:!1})],Q.prototype,`custodianAvailable`,void 0),a([r({context:he,subscribe:!0})],Q.prototype,`context`,void 0),a([y()],Q.prototype,`open`,void 0),a([y()],Q.prototype,`query`,void 0),a([y()],Q.prototype,`activeId`,void 0),a([y()],Q.prototype,`sessionItems`,void 0),a([y()],Q.prototype,`catalogItems`,void 0),a([y()],Q.prototype,`sessionSearchFailed`,void 0),a([y()],Q.prototype,`sessionSearchPartial`,void 0),a([y()],Q.prototype,`sessionSearchIncomplete`,void 0),customElements.get(`openclaw-command-palette`)||customElements.define(`openclaw-command-palette`,Q)})))()}$();export{Q as CommandPalette}; //# sourceMappingURL=command-palette-DutMicI_.js.map