UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

54 lines 11.5 kB
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Cn as t,En as n,Kn as r,jn as i,na as a}from"./control-ui-foundation-Cydpkyqa.js";import{Eo as o,Oo as s,k as c,w as l}from"./control-ui-core-Rwzhj6nO.js";import{J as u,K as d,X as f,q as p,ut as m}from"./lit-runtime-CV_MH99K.js";import{Qt as h,Yt as g,_t as _,bt as v,en as y,gt as b,vt as x}from"./control-ui-core-vvcQQV2m.js";import{B as S,V as C,z as w}from"./control-ui-boot-shared-BYq7Cchl.js";import{Cr as T,Sr as E,xr as D}from"./control-ui-boot-shared-DfZ39Yj9.js";import{n as O,r as k,t as A}from"./portaled-hovercard-CdHol2CK.js";function j(e,t){let n=a(e[t]);if(n===void 0)throw Error(`GitHub response omitted ${t}`);return n}function M(e){return typeof e==`string`&&/^data:image\/(?:gif|jpeg|png|webp);base64,/u.test(e)?e:void 0}function N(e){if(!Array.isArray(e))return;let t=e.flatMap(e=>{if(!r(e))return[];let t=a(e.login);if(!t)return[];let n=M(e.avatarDataUrl);return[n?{login:t,avatarDataUrl:n}:{login:t}]});return t.length>0?t:void 0}function P(e,t){if(!r(t))throw Error(`GitHub response was not an object`);if(t.kind!==e.kind||typeof t.owner!=`string`||t.owner.toLowerCase()!==e.owner.toLowerCase()||typeof t.repo!=`string`||t.repo.toLowerCase()!==e.repo.toLowerCase()||t.number!==e.number)throw Error(`GitHub response did not match the requested link`);return{additions:n(t.additions),avatarDataUrl:M(t.avatarDataUrl),closedAt:a(t.closedAt),coAuthorCount:n(t.coAuthorCount),coAuthors:N(t.coAuthors),comments:n(t.comments),createdAt:j(t,`createdAt`),deletions:n(t.deletions),draft:typeof t.draft==`boolean`?t.draft:void 0,kind:e.kind,login:a(t.login)??`ghost`,mergedAt:a(t.mergedAt),number:e.number,owner:e.owner,repo:e.repo,state:j(t,`state`),stateReason:a(t.stateReason),title:j(t,`title`),updatedAt:j(t,`updatedAt`)}}function F(e){return e.kind===`pull`?e.mergedAt?{label:y(`githubPreview.states.merged`),tone:`purple`}:e.draft&&e.state===`open`?{label:y(`githubPreview.states.draft`),tone:`muted`}:e.state===`open`?{label:y(`githubPreview.states.open`),tone:`open`}:{label:y(`githubPreview.states.closed`),tone:`danger`}:e.state===`open`?{label:y(`githubPreview.states.open`),tone:`open`}:e.stateReason===`not_planned`?{label:y(`githubPreview.states.notPlanned`),tone:`muted`}:{label:y(`githubPreview.states.closed`),tone:`purple`}}function I(e){return e?f`<img class="github-link-hovercard__avatar" alt="" decoding="async" referrerpolicy="no-referrer" src=${e} />`:p}function L(e){let t=e.coAuthors??[],n=e.coAuthorCount??t.length;if(t.length===0)return p;let r=t.filter(e=>e.avatarDataUrl).length,i=Math.max(0,n-r);if(r===0&&i===0)return p;let a=y(`githubPreview.coAuthors`,{logins:t.map(e=>e.login).join(`, `)});return f`<span class="github-link-hovercard__coauthors" title=${a} role="img" aria-label=${a} >${t.map(e=>I(e.avatarDataUrl))}${i>0?f`<span class="github-link-hovercard__coauthors-more">+${i}</span>`:p}</span >`}function R(e,t,n){return f`<a class=${e} href=${t} target=${D} rel=${E()} >${n}</a >`}function z(e){e.dataset.loading=`true`,e.removeAttribute(`data-state`),e.setAttribute(`aria-label`,y(`githubPreview.loading`)),u(f`<div class="github-link-hovercard__skeleton" aria-hidden="true"> ${[[`header`,[`badge`,`repo`,`time`]],[`title`,[`title`]],[`footer`,[`author`,`metrics`]]].map(([e,t])=>f`<div class=${`github-link-hovercard__${e}`}> ${t.map(e=>f`<span class=${`skeleton github-link-hovercard__placeholder--${e}`}></span>`)} </div>`)} </div>`,e)}function B(e,t){e.dataset.loading=`false`,e.dataset.state=`unavailable`;let n=y(`githubPreview.unavailable`);e.setAttribute(`aria-label`,n);let r=t&&t!==n,i=`${e.id}-error`;r&&e.setAttribute(`aria-describedby`,i),u(f`<div class="github-link-hovercard__unavailable"> <div>${n}</div> ${r?f`<div class="github-link-hovercard__error" id=${i}>${t}</div>`:p} </div>`,e)}function V(e,t){e.dataset.loading=`false`;let n=F(t);e.dataset.state=n.tone;let r=t.comments??0;u(f`<div class="github-link-hovercard__header"> <span class="github-link-hovercard__state" data-tone=${n.tone} ><span class="github-link-hovercard__state-dot" aria-hidden="true"></span >${n.label}</span > ${R(`github-link-hovercard__repo`,t.href,`${t.owner}/${t.repo} #${t.number}`)} <time class="github-link-hovercard__time" >${l(Date.parse(t.updatedAt))}</time > </div> ${R(`github-link-hovercard__title`,t.href,t.title)} <div class="github-link-hovercard__footer"> ${R(`github-link-hovercard__author`,b(t.login),f`${I(t.avatarDataUrl)}${t.login}`)}${L(t)} ${t.kind===`pull`?f`<span class="github-link-hovercard__metrics github-link-hovercard__metrics--diff" > <span class="github-link-hovercard__metric github-link-hovercard__metric--additions" >+${t.additions??0}</span > <span class="github-link-hovercard__metric github-link-hovercard__metric--deletions" >−${t.deletions??0}</span > </span>`:f`<span class="github-link-hovercard__metrics"> <span class="github-link-hovercard__metric" >${y(r===1?`githubPreview.comment`:`githubPreview.comments`,{count:String(r)})}</span > </span>`} </div>`,e),e.setAttribute(`aria-label`,y(`githubPreview.ariaLabel`,{state:n.label,kind:t.kind===`pull`?y(`githubPreview.pullRequest`):y(`githubPreview.issue`),repo:`${t.owner}/${t.repo}`,number:String(t.number),title:t.title,author:t.login}))}var H,U,W,G,K;function q(){return(q=e((()=>{w(),i(),d(),g(),T(),s(),c(),x(),k(),H=3e5,U=3e4,W=100,G=0,K=class extends m{constructor(...e){super(...e),this.gatewayClient=null,this.cache=new Map,this.activeAnchor=null,this.activeTarget=null,this.activeTrigger=null,this.hovercard=new A(()=>this.close()),this.stopI18n=null,this.suppressFocusOpen=!1,this.previewTask=new S(this,{autoRun:!1,args:()=>[this.activeTarget],task:async([e],{signal:t})=>e?{...await this.loadPreview(e,t),...e}:C}),this.activeAnchorObserver=new MutationObserver(()=>{let e=this.activeAnchor;e&&!this.contains(e)&&this.close()}),this.handlePointerOver=e=>{if(e.pointerType===`touch`)return;let t=_(e),n=t?v(t.href):null;!t||!n||this.activateFromBootstrap(t,n,`pointer`,250)},this.handlePointerOut=e=>{let t=_(e);!t||t!==this.activeAnchor||e.relatedTarget instanceof Node&&t.contains(e.relatedTarget)||(this.hovercard.pointerInside=!1,this.hovercard.scheduleClose())},this.handleCardPointerEnter=()=>{this.hovercard.pointerOverCard=!0,this.hovercard.clearClose()},this.handleCardPointerLeave=()=>{this.hovercard.pointerOverCard=!1,this.activeTrigger===`pointer`&&(this.hovercard.cardFocusInside=!1),this.hovercard.scheduleClose()},this.handleCardFocusIn=()=>{this.hovercard.cardFocusInside=!0,this.hovercard.clearClose()},this.handleCardFocusOut=e=>{e.relatedTarget instanceof Node&&this.hovercard.card?.contains(e.relatedTarget)||(this.hovercard.cardFocusInside=!1,this.hovercard.scheduleClose())},this.handleFocusIn=e=>{if(this.suppressFocusOpen)return;let t=_(e),n=t?v(t.href):null;!t||!n||this.activateFromBootstrap(t,n,`focus`,0)},this.handleFocusOut=e=>{this.activeAnchor&&(e.relatedTarget instanceof Node&&this.activeAnchor.contains(e.relatedTarget)||(this.hovercard.focusInside=!1,this.hovercard.scheduleClose()))},this.handleKeyDown=e=>{if(e.key===`Escape`){this.close();return}if(e.key!==`Tab`||e.shiftKey||e.target!==this.activeAnchor)return;let[t]=this.hovercard.focusables();t&&(e.preventDefault(),t.focus())},this.handleCardKeyDown=e=>{if(e.key!==`Escape`&&e.key!==`Tab`)return;let t=this.hovercard.focusables(),n=e.shiftKey?t[0]:t.at(-1);if(e.key===`Tab`&&document.activeElement!==n)return;e.preventDefault();let r=this.activeAnchor;this.close(),this.suppressFocusOpen=!0,r?.focus({preventScroll:!0}),this.suppressFocusOpen=!1},this.handleClick=()=>{this.close()}}static{this.properties={client:{attribute:!1,noAccessor:!0},agentId:{attribute:!1,noAccessor:!0}}}get client(){return this.gatewayClient}set client(e){e!==this.gatewayClient&&(this.close(),this.cache.clear(),this.gatewayClient=e)}get agentId(){return this.selectedAgentId}set agentId(e){e!==this.selectedAgentId&&(this.close(),this.cache.clear(),this.selectedAgentId=e)}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.style.display=`contents`,this.addEventListener(`pointerover`,this.handlePointerOver),this.addEventListener(`pointerout`,this.handlePointerOut),this.addEventListener(`focusin`,this.handleFocusIn),this.addEventListener(`focusout`,this.handleFocusOut),this.addEventListener(`keydown`,this.handleKeyDown),this.addEventListener(`click`,this.handleClick),this.stopI18n??=h.subscribe(()=>this.requestUpdate())}disconnectedCallback(){this.removeEventListener(`pointerover`,this.handlePointerOver),this.removeEventListener(`pointerout`,this.handlePointerOut),this.removeEventListener(`focusin`,this.handleFocusIn),this.removeEventListener(`focusout`,this.handleFocusOut),this.removeEventListener(`keydown`,this.handleKeyDown),this.removeEventListener(`click`,this.handleClick),this.stopI18n?.(),this.stopI18n=null,this.close(),super.disconnectedCallback()}updated(){let e=this.hovercard.card;e&&(e.removeAttribute(`aria-describedby`),this.previewTask.render({initial:()=>z(e),pending:()=>z(e),complete:t=>V(e,t),error:n=>B(e,t(o(n),320))}),this.hovercard.position())}activateFromBootstrap(e,t,n,r){this.activate(e,t,r),this.activeTrigger=n,n===`pointer`?this.hovercard.pointerInside=!0:this.hovercard.focusInside=!0}activate(e,t,n){(e!==this.activeAnchor||this.activeTarget?.href!==t.href)&&(this.close(),this.activeAnchor=e,this.activeTarget=t,this.hovercard.markTrigger(e),this.activeAnchorObserver.observe(this,{childList:!0,subtree:!0}),this.hovercard.scheduleOpen(n,()=>this.show(e,t)))}show(e,t){if(this.activeAnchor!==e||this.activeTarget?.href!==t.href)return;G+=1;let n=O(`openclaw-github-hovercard-${G}`,`github-link-hovercard`);z(n),n.addEventListener(`pointerenter`,this.handleCardPointerEnter),n.addEventListener(`pointerleave`,this.handleCardPointerLeave),n.addEventListener(`focusin`,this.handleCardFocusIn),n.addEventListener(`focusout`,this.handleCardFocusOut),n.addEventListener(`keydown`,this.handleCardKeyDown),this.hovercard.mount(e,n,`vertical`,!0,()=>u(p,n)),this.previewTask.run([t])}loadPreview(e,t){let n=`${e.kind}:${e.owner.toLowerCase()}/${e.repo.toLowerCase()}#${e.number}`,r=Date.now(),i=this.cache.get(n);if(this.cache.delete(n),i&&!i.signal.aborted&&i.expiresAt>r)return this.cache.set(n,i),i.promise;let a={expiresAt:r+H,signal:t,promise:(async()=>{if(!this.client)throw Error(`GitHub preview requires a connected Gateway`);return P(e,await this.client.request(`controlUi.githubPreview`,{...this.agentId?{agentId:this.agentId}:{},kind:e.kind,number:e.number,owner:e.owner,repo:e.repo},{signal:t}))})().catch(e=>{throw a.expiresAt=Date.now()+U,e})};for(this.cache.set(n,a);this.cache.size>W;){let e=this.cache.keys().next().value;if(!e)break;this.cache.delete(e)}return a.promise}close(){this.hovercard.reset(),this.activeAnchorObserver.disconnect(),this.previewTask.run([null]),this.activeAnchor=null,this.activeTarget=null,this.activeTrigger=null}}})))()}q();export{K as GitHubLinkHovercardProvider}; //# sourceMappingURL=github-link-hovercard.runtime-_UamOvxd.js.map