Files
openclaw-config/cache/control-ui-assets/d08fd045b9cb86d13f0b4aa403c8a06ddcd32e533058ae463245169e5cff5e85/assets/devices-page-yBUnBvjB.js
T

388 lines
46 KiB
JavaScript

import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{$ as t,U as n,Yt as r,an as i,en as a,er as o,et as s,ki as c,nt as l,s as u,un as d,wn as f}from"./control-ui-foundation-CeFMP1Ly.js";import{$o as p,Bo as m,Fo as h,Go as ee,Io as te,Jo as ne,Ko as re,Lo as ie,Mo as ae,No as oe,Uo as se,Vo as g,Wo as ce,Xo as le,Yo as ue,b as _,fl as de,l as v,lc as fe,ml as pe,ni as me,qo as he,ti as ge,uc as _e,v as y,vr as ve,w as b,x as ye,yr as be,zo as x}from"./control-ui-core-pH6nakZ-.js";import{G as S,J as C,K as w,W as T,Z as xe,at as Se,rt as E}from"./lit-runtime-BEtFSUCp.js";import{Cn as Ce,F as D,Gt as we,Jt as Te,Sn as Ee,Ut as De,ln as Oe,m as ke,p as Ae}from"./control-ui-core-DGVkFhVB.js";import{Ht as O,Lt as k,Nt as je,Q as Me,Rt as A,et as Ne,qt as j}from"./control-ui-core-Br5DB0Zj.js";import{F as Pe,I as Fe,In as Ie,L as Le,Ln as Re}from"./control-ui-boot-wpHCbPL9.js";import{Ca as ze,Cn as M,Ns as Be,Ps as Ve,bn as N,cn as He,gn as P,mn as Ue,on as F,un as I,vn as L,wa as We,xn as Ge}from"./control-ui-boot-Cdpgu1Gm.js";import{n as Ke,t as qe}from"./settings-workspace-Bo4nqRhI.js";import{n as Je,t as Ye}from"./gateway-page-controller-bzyUg03c.js";import{t as Xe}from"./agent-select-registration-Bgp9CYzQ.js";import{n as R,t as Ze}from"./platform-label-BHGXql4m.js";import{n as Qe,t as $e}from"./worker-capacity-AlsLTAW4.js";function z(e){let t=document.createElement(`div`);return document.body.append(t),new Promise(n=>{let r=!1,i=()=>{w(S,t),t.remove(),n()},a=t=>{if(!e.secret){i();return}t.preventDefault(),!r&&(r=!0,s())},o=e.secret?`btn primary`:`btn secret-reveal__dismiss`,s=()=>{w(C`
<openclaw-modal-dialog
label=${e.title}
description=${e.message}
@modal-cancel=${a}
>
<div class="exec-approval-card">
<div class="secret-reveal__header">
${e.status===`success`?C`<span class="secret-reveal__status" aria-hidden="true"
>${k.check}</span
>`:S}
<div class="exec-approval-title">${e.title}</div>
</div>
<div class="secret-reveal__body"><p>${e.message}</p></div>
${e.callout?C`<div class="callout info secret-reveal__callout">${e.callout}</div>`:S}
${e.secret?C`
<div class="secret-reveal__value">
<code class="secret-reveal__code">${e.secret}</code>
${Ne(e.secret,j(`common.copy`))}
</div>
`:S}
${r?C`<p class="secret-reveal__hint" role="status">${e.dismissHint}</p>`:S}
${e.note?C`<p class="secret-reveal__note">${e.note}</p>`:S}
<div class="exec-approval-actions">
<button type="button" class=${o} autofocus @click=${i}>
${e.acknowledgeLabel}
</button>
</div>
</div>
</openclaw-modal-dialog>
`,t)};s()})}function B(){return(B=e((()=>{T(),O(),Me(),A(),je()})))()}function V(e){let t=f(e?.agents)?e.agents:null,n=f(t?.entries)?t.entries:{},r=[];for(let[e,t]of Object.entries(n)){if(!f(t))continue;let n=c(t.name),i=t.default===!0;r.push({id:e,name:n,isDefault:i,record:t})}return r}function H(e,t){let n=[];for(let r of e){let e=Array.isArray(r.commands)?r.commands:[],i=new Set(e.map(String));if(!t.every(e=>i.has(e)))continue;let a=c(r.nodeId)??``;if(!a)continue;let o=c(r.displayName)??a;n.push({id:a,label:o===a?a:`${o} · ${a}`})}return n.sort((e,t)=>e.label.localeCompare(t.label)),n}function U(e){let n=e.platform?.trim().toLowerCase()??``,r=e.clientId?.trim().toLowerCase()??``,i=e.clientMode?.trim().toLowerCase()??``;return nt.test(n)||r===t.WATCHOS_APP?tt:rt.test(n)?et:it.test(n)||at.has(r)?k.smartphone:ot.has(r)||i===s.WEBCHAT?k.globe:st.has(i)||ct.has(r)?k.terminal:k.monitor}function W(e){return C`
<div class="device-entry__tile" aria-hidden="true">
<span class="device-entry__tile-icon">${e}</span>
</div>
`}var et,tt,nt,rt,it,at,ot,st,ct;function G(){return(G=e((()=>{T(),l(),A(),et=C`
<svg viewBox="0 0 24 24">
<rect width="16" height="20" x="4" y="2" rx="2" ry="2" />
<path d="M12 18h.01" />
</svg>
`,tt=C`
<svg viewBox="0 0 24 24">
<circle cx="12" cy="12" r="6" />
<polyline points="12 10 12 12 13 13" />
<path d="m16.13 7.66-.81-4.05a2 2 0 0 0-2-1.61h-2.68a2 2 0 0 0-2 1.61l-.78 4.05" />
<path d="m7.88 16.36.8 4a2 2 0 0 0 2 1.61h2.72a2 2 0 0 0 2-1.61l.81-4.05" />
</svg>
`,nt=/\bwatchos\b/,rt=/\b(ipados|ipad)\b/,it=/\b(ios|android|iphone)\b/,at=new Set([t.IOS_APP,t.ANDROID_APP]),ot=new Set([t.CONTROL_UI,t.WEBCHAT_UI,t.WEBCHAT]),st=new Set([s.CLI,s.BACKEND,s.PROBE,s.TEST]),ct=new Set([t.CLI,t.TUI])})))()}function lt(e){return e===`allowlist`||e===`full`||e===`deny`?e:`deny`}function ut(e){return e===`always`||e===`off`||e===`on-miss`?e:`on-miss`}function dt(e,t,n){let r=e?.defaults??{},i=n?e?.agents?.[`*`]??{}:{};return{security:lt(i.security??r.security??t?.security),ask:ut(i.ask??r.ask??t?.ask),askFallback:lt(i.askFallback??r.askFallback??t?.askFallback??`deny`),autoAllowSkills:i.autoAllowSkills??r.autoAllowSkills??t?.autoAllowSkills??!1}}function ft(e){return V(e).map(e=>({id:e.id,name:e.name,isDefault:e.isDefault}))}function pt(e,t){let n=ft(e),r=Object.keys(t?.agents??{}),i=new Map;n.forEach(e=>i.set(e.id,e)),r.forEach(e=>{i.has(e)||i.set(e,{id:e})});let a=Array.from(i.values());return a.length===0&&a.push({id:`main`,isDefault:!0}),a.sort((e,t)=>{if(e.isDefault&&!t.isDefault)return-1;if(!e.isDefault&&t.isDefault)return 1;let n=e.name?.trim()?e.name:e.id,r=t.name?.trim()?t.name:t.id;return n.localeCompare(r)}),a}function mt(e,t){return e===q?q:e&&t.some(t=>t.id===e)?e:q}function ht(e){let t=e.execApprovalsSnapshot,n=ie(t)?t:null,r=t&&!ie(t)?t:null,i=n?null:e.execApprovalsForm??r?.file??null,a=!!(i||n),o=pt(e.configForm,i),s=Ct(e.nodes),c=e.execApprovalsTarget,l=c===`node`&&e.execApprovalsTargetNodeId?e.execApprovalsTargetNodeId:null;c===`node`&&l&&!s.some(e=>e.id===l)&&(l=null);let u=mt(e.execApprovalsSelectedAgent,o),d=dt(i,r?.resolvedDefaults,u!==q),f=u===q?null:(i?.agents??{})[u]??null,p=Array.isArray(f?.allowlist)?f.allowlist??[]:[];return{ready:a,disabled:!e.canAdmin||e.execApprovalsSaving||e.execApprovalsLoading,dirty:e.execApprovalsDirty,loading:e.execApprovalsLoading,saving:e.execApprovalsSaving,form:i,nativePolicy:n,defaults:d,selectedScope:u,selectedAgent:f,agents:o,allowlist:p,target:c,targetNodeId:l,targetNodes:s,onSelectScope:e.onExecApprovalsSelectAgent,onSelectTarget:e.onExecApprovalsTargetChange,onPatch:e.onExecApprovalsPatch,onRemove:e.onExecApprovalsRemove,onLoad:e.onLoadExecApprovals,onSave:e.onSaveExecApprovals,canAdmin:e.canAdmin}}function gt(e){let t=e.ready,n=e.target!==`node`||!!e.targetNodeId,r=C`
<button
class="btn"
?disabled=${e.disabled||!e.dirty||!n||!!e.nativePolicy}
@click=${e.onSave}
>
${e.saving?j(`common.saving`):j(`common.save`)}
</button>
`,i=C`
${e.canAdmin?C`
${vt(e)}
${t?e.nativePolicy?_t(e.nativePolicy):C`${yt(e)} ${bt(e)}`:P({title:j(`devices.execApprovals.loadHint`),control:C`
<button
class="btn"
?disabled=${e.loading||!n}
@click=${e.onLoad}
>
${e.loading?j(`common.loading`):j(`common.loadApprovals`)}
</button>
`})}
`:P({title:j(`devices.readOnly.adminRequired`)})}
`;return C`
${L({title:j(`devices.execApprovals.title`),description:C`
${j(`devices.execApprovals.subtitlePrefix`)}
<span class="mono">exec host=gateway/node</span>.
`,actions:r},i)}
${e.canAdmin&&t&&!e.nativePolicy&&e.selectedScope!==q?xt(e):S}
`}function _t(e){let t=e.enabled&&Array.isArray(e.rules)?e.rules:[],n=e.enabled?e.defaultAction:e.message??`unavailable`;return C`
${P({title:j(`devices.execApprovals.hostNativePolicy`),description:j(`devices.execApprovals.hostNativeHint`),control:M(j(`devices.execApprovals.native`))})}
${P({title:j(`devices.execApprovals.defaultAction`),description:n,control:M(j(t.length===1?`devices.execApprovals.rule`:`devices.execApprovals.rules`,{count:String(t.length)}))})}
${t.map(e=>P({title:e.pattern,description:C`
${e.action} · ${e.shells?.join(`, `)||j(`devices.execApprovals.allShells`)} ·
${e.enabled===!1?j(`devices.execApprovals.off`):j(`devices.execApprovals.on`)}
${e.description?C`<br />${v(e.description,120)}`:S}
`}))}
`}function vt(e){let t=e.targetNodes.length>0,n=e.targetNodeId??``;return C`
${P({title:j(`devices.execApprovals.target`),description:j(`devices.execApprovals.targetHint`),control:C`
<select
class="settings-select"
aria-label=${j(`devices.execApprovals.host`)}
?disabled=${e.disabled}
@change=${t=>{if(t.target.value===`node`){let t=e.targetNodes[0]?.id??null;e.onSelectTarget(`node`,n||t)}else e.onSelectTarget(`gateway`,null)}}
>
<option value="gateway" ?selected=${e.target===`gateway`}>
${j(`devices.execApprovals.gateway`)}
</option>
<option value="node" ?selected=${e.target===`node`}>
${j(`devices.execApprovals.node`)}
</option>
</select>
`})}
${e.target===`node`?P({title:j(`devices.execApprovals.node`),description:t?void 0:j(`devices.execApprovals.noNodes`),control:C`
<select
class="settings-select"
aria-label=${j(`devices.execApprovals.node`)}
?disabled=${e.disabled||!t}
@change=${t=>{let n=t.target.value.trim();e.onSelectTarget(`node`,n||null)}}
>
<option value="" ?selected=${n===``}>
${j(`devices.execApprovals.selectNode`)}
</option>
${e.targetNodes.map(e=>C`<option value=${e.id} ?selected=${n===e.id}>
${e.label}
</option>`)}
</select>
`}):S}
`}function yt(e){let t=[{value:q,label:j(`devices.execApprovals.defaults`),icon:k.settings},...e.agents.map(e=>({value:e.id,label:e.name?.trim()?`${e.name} (${e.id})`:e.id,agent:{id:e.id,...e.name?{name:e.name}:{}},badge:e.isDefault?j(`agents.default`):void 0}))];return P({title:j(`devices.execApprovals.scope`),stacked:!0,control:C`
<openclaw-agent-select
class="agent-select--settings"
.options=${t}
.value=${e.selectedScope}
.accessibleLabel=${j(`devices.execApprovals.scope`)}
.disabled=${e.disabled}
.onSelect=${e.onSelectScope}
></openclaw-agent-select>
`})}function K(e,t){return C`
<select
class="settings-select"
aria-label=${t.ariaLabel}
?disabled=${e.disabled}
@change=${n=>{let r=n.target.value;!t.isDefaults&&r===`__default__`?e.onRemove([...t.basePath,t.key]):e.onPatch([...t.basePath,t.key],r)}}
>
${t.isDefaults?S:C`<option value="__default__" ?selected=${t.currentValue===`__default__`}>
${j(`devices.execApprovals.useDefaultValue`,{value:t.defaultValue})}
</option>`}
${t.values.map(e=>C`<option value=${e.value} ?selected=${t.currentValue===e.value}>
${j(e.labelKey)}
</option>`)}
</select>
`}function bt(e){let t=e.selectedScope===q,n=e.defaults,r=e.selectedAgent??{},i=t?[`defaults`]:[`agents`,e.selectedScope],a=typeof r.security==`string`?r.security:void 0,o=typeof r.ask==`string`?r.ask:void 0,s=typeof r.askFallback==`string`?r.askFallback:void 0,c=t?n.security:a??`__default__`,l=t?n.ask:o??`__default__`,u=t?n.askFallback:s??`__default__`,d=typeof r.autoAllowSkills==`boolean`?r.autoAllowSkills:void 0,f=d??n.autoAllowSkills,p=d==null;return C`
${P({title:j(`devices.execApprovals.security`),description:t?j(`devices.execApprovals.defaultSecurity`):j(`devices.execApprovals.defaultValue`,{value:n.security}),control:K(e,{key:`security`,ariaLabel:j(`devices.execApprovals.mode`),values:J,currentValue:c,defaultValue:n.security,isDefaults:t,basePath:i})})}
${P({title:j(`devices.execApprovals.ask`),description:t?j(`devices.execApprovals.defaultPrompt`):j(`devices.execApprovals.defaultValue`,{value:n.ask}),control:K(e,{key:`ask`,ariaLabel:j(`devices.execApprovals.mode`),values:wt,currentValue:l,defaultValue:n.ask,isDefaults:t,basePath:i})})}
${P({title:j(`devices.execApprovals.askFallback`),description:t?j(`devices.execApprovals.promptUnavailable`):j(`devices.execApprovals.defaultValue`,{value:n.askFallback}),control:K(e,{key:`askFallback`,ariaLabel:j(`devices.execApprovals.fallback`),values:J,currentValue:u,defaultValue:n.askFallback,isDefaults:t,basePath:i})})}
${P({title:j(`devices.execApprovals.autoAllowSkills`),description:t?j(`devices.execApprovals.autoAllowSkillsHint`):p?j(`devices.execApprovals.usingDefault`,{value:n.autoAllowSkills?j(`devices.execApprovals.on`):j(`devices.execApprovals.off`)}):j(`devices.execApprovals.override`,{value:j(f?`devices.execApprovals.on`:`devices.execApprovals.off`)}),control:C`
${!t&&!p?C`<button
class="btn btn--sm"
?disabled=${e.disabled}
@click=${()=>e.onRemove([...i,`autoAllowSkills`])}
>
${j(`devices.execApprovals.useDefault`)}
</button>`:S}
${Ge({checked:f,disabled:e.disabled,ariaLabel:j(`devices.execApprovals.autoAllowSkills`),onChange:t=>e.onPatch([...i,`autoAllowSkills`],t)})}
`})}
`}function xt(e){let t=[`agents`,e.selectedScope,`allowlist`],n=e.allowlist;return L({title:j(`devices.execApprovals.allowlist`),description:j(`devices.execApprovals.allowlistHint`),actions:C`
<button
class="btn btn--sm"
?disabled=${e.disabled}
@click=${()=>{let r=[...n,{pattern:``}];e.onPatch(t,r)}}
>
${j(`devices.execApprovals.addPattern`)}
</button>
`},n.length===0?I(j(`devices.execApprovals.emptyAllowlist`)):n.map((t,n)=>St(e,t,n)))}function St(e,t,n){let r=t.lastUsedAt?_(t.lastUsedAt):j(`common.never`),i=t.lastUsedCommand?v(t.lastUsedCommand,120):null,a=t.lastResolvedPath?v(t.lastResolvedPath,120):null;return P({title:t.pattern?.trim()?t.pattern:j(`devices.execApprovals.newPattern`),description:C`
${j(`devices.execApprovals.lastUsed`,{time:r})}
${i?C`<br /><span class="mono">${i}</span>`:S}
${a?C`<br /><span class="mono">${a}</span>`:S}
`,control:C`
<input
class="settings-input"
type="text"
aria-label=${j(`devices.execApprovals.pattern`)}
.value=${t.pattern??``}
?disabled=${e.disabled}
@input=${t=>{let r=t.target;e.onPatch([`agents`,e.selectedScope,`allowlist`,n,`pattern`],r.value)}}
/>
<button
class="btn btn--sm danger"
?disabled=${e.disabled}
@click=${()=>{if(e.allowlist.length<=1){e.onRemove([`agents`,e.selectedScope,`allowlist`]);return}e.onRemove([`agents`,e.selectedScope,`allowlist`,n])}}
>
${j(`devices.execApprovals.remove`)}
</button>
`})}function Ct(e){return H(e,[`system.execApprovals.get`,`system.execApprovals.set`])}var q,J,wt;function Tt(){return(Tt=e((()=>{T(),Xe(),A(),F(),O(),b(),te(),G(),q=`__defaults__`,J=[{value:`deny`,labelKey:`devices.execApprovals.options.deny`},{value:`allowlist`,labelKey:`devices.execApprovals.options.allowlist`},{value:`full`,labelKey:`devices.execApprovals.options.full`}],wt=[{value:`off`,labelKey:`devices.execApprovals.options.off`},{value:`on-miss`,labelKey:`devices.execApprovals.options.onMiss`},{value:`always`,labelKey:`devices.execApprovals.options.always`}]})))()}function Y(e){return Array.isArray(e)?e.map(e=>c(e)).filter(e=>e!==void 0):[]}function Et(e){if(!f(e))return;let t=Object.keys(e),n=e.total,r=e.available;return t.length===2&&t.includes(`total`)&&t.includes(`available`)&&typeof n==`number`&&typeof r==`number`&&Number.isSafeInteger(n)&&Number.isSafeInteger(r)&&n>=1&&n<=1024&&r>=0&&r<=n?{total:n,available:r}:void 0}function Dt(e){if(!f(e))return;let t=e;if(t.status===`missing`&&Object.keys(t).length===1)return{status:`missing`};let n=c(t.version);return t.status===`installed`&&n&&Object.keys(t).length===2?{status:`installed`,version:n}:void 0}function Ot(e){let t=c(e.nodeId);if(!t)return null;let n=c(e.approvalState);return{nodeId:t,displayName:c(e.displayName),platform:c(e.platform),version:c(e.version),coreVersion:c(e.coreVersion),uiVersion:c(e.uiVersion),modelIdentifier:c(e.modelIdentifier),clientId:c(e.clientId),clientMode:c(e.clientMode),remoteIp:c(e.remoteIp),caps:Y(e.caps),commands:Y(e.commands),approvalState:n&&Vt.has(n)?n:void 0,pendingRequestId:c(e.pendingRequestId),workerSlots:Et(e.workerSlots),workerBundle:Dt(e.workerBundle),connected:e.connected===!0,paired:e.paired===!0,connectedAtMs:i(e.connectedAtMs),lastSeenAtMs:i(e.lastSeenAtMs),approvedAtMs:i(e.approvedAtMs)}}function kt(e){let t=new Set;for(let n of[...e.roles??[],e.role]){let e=c(n);e&&t.add(e)}return[...t]}function At(...e){let t;for(let n of e)n!==void 0&&(t===void 0||n>t)&&(t=n);return t}function jt(e,t,n,r){let a=t?kt(t):[];n?.paired&&!a.includes(`node`)&&a.push(`node`);let o=c(t?.operatorLabel),s=c(t?.displayName)??c(n?.displayName),l=c(t?.clientId)??n?.clientId;return{id:e,name:o??s??l??e,displayName:s,clientId:l,clientMode:c(t?.clientMode)??n?.clientMode,platform:c(r?.platform)??c(t?.platform)??n?.platform,version:c(r?.version)??n?.version,modelIdentifier:c(r?.modelIdentifier)??n?.modelIdentifier,remoteIp:c(t?.remoteIp)??n?.remoteIp,roles:a,scopes:Y(t?.scopes),connected:n?.connected===!0||t?.connected===!0,autoApproved:t?.approvedVia===`silent`||t?.approvedVia===`trusted-cidr`||t?.approvedVia===`ssh-verified`,lastSeenAtMs:At(t?.lastSeenAtMs,n?.lastSeenAtMs,n?.connectedAtMs,i(r?.ts)),approvedAtMs:At(t?.approvedAtMs,n?.approvedAtMs),presence:r,device:t,node:n}}function Mt(e){let t=e.displayName?.trim().toLowerCase();if(t)return`name:${t}`;let n=e.clientId?.trim().toLowerCase(),r=e.clientMode?.trim().toLowerCase();return n||r?`client:${n??``}:${r??``}`:`id:${e.id}`}function Nt(e){return e.lastSeenAtMs??e.approvedAtMs??0}function Pt(e,t){if(e.connected!==t.connected)return e.connected?-1:1;let n=Nt(t)-Nt(e);return n===0?e.id.localeCompare(t.id):n}function Ft(e,t){let n=Pt(e.primary,t.primary);return n===0?e.name.localeCompare(t.name):n}function It(e){let t=new Map;for(let n of e.nodes){let e=Ot(n);e&&t.set(e.nodeId,e)}let n=new Map;for(let t of e.presence??[])for(let e of[t.deviceId,t.instanceId]){let r=c(e)?.toLowerCase();r&&n.set(r,t)}let r=[],i=new Set;for(let a of e.paired){let e=c(a.deviceId);!e||i.has(e)||(i.add(e),r.push(jt(e,a,t.get(e),n.get(e.toLowerCase()))))}for(let[e,a]of t)i.has(e)||r.push(jt(e,void 0,a,n.get(e.toLowerCase())));let a=new Map;for(let e of r){let t=Mt(e),n=a.get(t);n?n.push(e):a.set(t,[e])}let o=[];for(let[e,t]of a){let n=t.toSorted(Pt),r=n[0];r&&o.push({key:e,name:r.name,primary:r,duplicates:n.slice(1)})}return o.toSorted(Ft)}function Lt(e){return e.flatMap(e=>e.duplicates.filter(e=>!e.connected&&(e.autoApproved||e.device!==void 0&&e.device.approvedVia===void 0)))}function Rt(e){return e.find(e=>c(e.mode)?.toLowerCase()===`gateway`)}function zt(e,t){let n=new Set;for(let e of t)for(let t of[e.primary,...e.duplicates])n.add(t.id.toLowerCase());return e.filter(e=>{if(c(e.mode)?.toLowerCase()===`gateway`||c(e.reason)?.toLowerCase()===`disconnect`)return!1;let t=[e.deviceId,e.instanceId].map(e=>c(e)?.toLowerCase()).filter(e=>e!==void 0);return t.length===0&&!c(e.host)&&!c(e.mode)?!1:!t.some(e=>n.has(e))})}function Bt(e){let t=e.roles.includes(`node`),n=e.roles.filter(e=>e!==`node`);return{removeNode:t||e.node?.paired===!0,removeDevice:!!e.device&&(n.length>0||e.roles.length===0)}}var Vt;function Ht(){return(Ht=e((()=>{d(),Vt=new Set([`approved`,`pending-approval`,`pending-reapproval`,`unapproved`])})))()}function X(...e){let t=new Set;for(let n of e)for(let e of a(n))t.add(e);return[...t].toSorted()}function Ut(e,t){let n=new Set(e);return t.every(e=>n.has(e))}function Wt(e){return{roles:X(e.roles,e.role),scopes:n(e.scopes)}}function Gt(e){let t=X(e.roles,e.role),r=Array.isArray(e.tokens)?e.tokens:e.tokens?Object.values(e.tokens):void 0;return{roles:r===void 0?t:X(r.filter(e=>!e.revokedAtMs).flatMap(e=>e.role??[])).filter(e=>t.includes(e)),scopes:n(e.scopes)}}function Kt(e,t){let n=Wt(e),r=t?Gt(t):null;return r?Ut(r.roles,n.roles)?Ut(r.scopes,n.scopes)?{kind:`re-approval`,requested:n,approved:r}:{kind:`scope-upgrade`,requested:n,approved:r}:{kind:`role-upgrade`,requested:n,approved:r}:{kind:`new-pairing`,requested:n,approved:null}}function qt(){return(qt=e((()=>{r()})))()}function Jt(e,t,n){let r=new Map(t.map(e=>[c(e.deviceId),e]).filter(e=>!!e[0]));return e.map(e=>Qt(e,n,Yt(r,e)))}function Yt(e,t){let n=c(t.deviceId);if(!n)return;let r=e.get(n);if(!r)return;let i=c(t.publicKey),a=c(r.publicKey);if(!(i&&a&&i!==a))return r}function Xt(e){return e?j(`devices.inventory.rolesAndScopes`,{roles:y(e.roles),scopes:y(e.scopes)}):j(`devices.inventory.none`)}function Zt(e){switch(e){case`scope-upgrade`:return j(`devices.inventory.scopeUpgrade`);case`role-upgrade`:return j(`devices.inventory.roleUpgrade`);case`re-approval`:return j(`devices.inventory.reapproval`);case`new-pairing`:return j(`devices.inventory.newPairing`)}throw Error(`unsupported pending approval kind`)}function Qt(e,t,n){let r=c(e.displayName)||e.deviceId,i=typeof e.ts==`number`?_(e.ts):j(`common.na`),a=Kt(e,n),o=e.isRepair?` · ${j(`devices.inventory.repair`)}`:``,s=e.remoteIp?` · ${e.remoteIp}`:``;return C`
<div class="settings-row device-entry">
${W(k.monitorSmartphone)}
<div class="settings-row__text">
<span class="settings-row__title">${r}</span>
<span class="settings-row__desc">${e.deviceId}${s}</span>
<span class="settings-row__desc">
${j(`devices.inventory.requestedAt`,{note:Zt(a.kind),time:i})}${o}
</span>
<span class="settings-row__desc">
${j(`devices.inventory.requestedAccess`,{access:Xt(a.requested)})}
</span>
${a.approved?C`
<span class="settings-row__desc">
${j(`devices.inventory.approvedAccess`,{access:Xt(a.approved)})}
</span>
`:S}
</div>
<div class="settings-row__control">
<button
class="btn btn--sm"
?disabled=${!t.canManagePairing}
@click=${()=>t.onDeviceApprove(e.requestId)}
>
${j(`devices.inventory.approve`)}
</button>
<button
class="btn btn--sm"
?disabled=${!t.canManagePairing}
@click=${()=>t.onDeviceReject(e.requestId)}
>
${j(`devices.inventory.reject`)}
</button>
</div>
</div>
`}function $t(){return($t=e((()=>{T(),qt(),A(),O(),b(),G()})))()}function en(e){let t=Bt(e);return{id:e.id,name:e.name,...t}}function tn(e,t,n){if(n&&e.length===0)return j(`common.loading`);let r=e.filter(e=>e.primary.connected).length,i=[j(`devices.inventory.summaryConnected`,{connected:String(r),total:String(e.length)})];return t>0&&i.push(j(`devices.inventory.summaryPending`,{count:String(t)})),i.join(` · `)}function nn(e){let t=e.devicesList??{pending:[],paired:[]},n=Array.isArray(t.pending)?t.pending:[],r=Array.isArray(t.paired)?t.paired:[],i=It({paired:r,nodes:e.nodes,presence:e.presence}),a=Rt(e.presence),o=zt(e.presence,i),s=Lt(i),c=e.loading||e.devicesLoading,l=C`
${s.length>0?C`
<button
class="btn btn--sm danger"
title=${e.canManagePairing?``:j(`devices.readOnly.pairingRequired`)}
?disabled=${!e.canManagePairing}
@click=${()=>e.onInventoryCleanup(s.map(en))}
>
${k.trash} ${j(`devices.inventory.cleanupStale`,{count:String(s.length)})}
</button>
`:S}
<button
class="btn"
title=${e.canPairDevice?``:j(`devices.pairing.adminRequired`)}
?disabled=${!e.canPairDevice}
@click=${e.onDevicePairSetupOpen}
>
${k.plus} ${j(`devices.pairing.button`)}
</button>
`,u=i.length===0&&!a,d=C`
${a?pn({kind:`gateway`,entry:a}):S}
${u?I(j(c?`common.loading`:`devices.inventory.empty`)):i.map(t=>rn(t,e))}
`;return C`
${e.devicesError?C`<div class="callout danger">${e.devicesError}</div>`:S}
${e.lastError?C`<div class="callout danger">${e.lastError}</div>`:S}
${n.length>0?L({title:j(`devices.inventory.pendingApproval`),count:n.length},Jt(n,r,e)):S}
${L({title:j(`devices.inventory.title`),description:tn(i,n.length,c),actions:l},d)}
${o.length>0?L({title:j(`devices.inventory.connectedWithoutPairing`)},o.map(e=>pn({kind:`unpaired`,entry:e}))):S}
`}function rn(e,t){return e.duplicates.length===0?Q(e.primary,t):C`
${Q(e.primary,t)}
<details class="device-group__dups">
<summary>
${j(e.duplicates.length===1?`devices.inventory.olderPairing`:`devices.inventory.olderPairings`,{count:String(e.duplicates.length),name:e.name})}
</summary>
${e.duplicates.map(e=>Q(e,t))}
</details>
`}function an(e){let t=c(e)?.toLowerCase();return t===`win32`||t===`windows`||t?.startsWith(`windows `)===!0}function on(e){let t=e.node;return t?.paired?t.approvalState===void 0||t.approvalState===`approved`:!1}function sn(e){let t=c(e.node?.coreVersion);if(t)return t;if(c(e.node?.uiVersion))return;let n=c(e.node?.platform)?.toLowerCase();return n===`darwin`||n===`linux`||n===`win32`||n===`windows`?c(e.node?.version):void 0}function cn(e,t){let n=[],r=on(e),i=sn(e),a=c(t);if(r&&i&&a&&i!==a){let e=j(`devices.inventory.versionDriftTitle`,{nodeVersion:i,gatewayVersion:a});n.push(C`<span title=${e}>
${N({kind:`warn`,label:j(`devices.inventory.versionDrift`)})}
</span>`)}e.node?.workerBundle?.status===`missing`&&n.push(C`<span title=${j(`devices.inventory.workerMissingTitle`)}>
${N({kind:`warn`,label:j(`devices.inventory.workerMissing`)})}
</span>`),r&&e.node?.connected===!1&&an(e.platform)&&n.push(C`<span title=${j(`devices.inventory.manualWakeTitle`)}>
${N({kind:`warn`,label:j(`devices.inventory.manualWake`)})}
</span>`);let o=e.node?.approvalState;return(o===`pending-approval`||o===`pending-reapproval`)&&n.push(N({kind:`warn`,label:j(`devices.inventory.approvalNeeded`)})),n}function ln(e){return j(`devices.inventory.inputAgo`,{time:ye(e*1e3,{suffix:!1})})}function un(e){let t=[];e.platform&&t.push(R(e.platform)),e.modelIdentifier&&t.push(e.modelIdentifier),e.version&&t.push(e.version),e.node?.workerBundle?.status===`installed`&&t.push(j(`devices.inventory.workerVersion`,{version:e.node.workerBundle.version})),e.connected&&e.presence?.lastInputSeconds!=null?t.push(ln(e.presence.lastInputSeconds)):!e.connected&&e.lastSeenAtMs?t.push(j(`devices.inventory.seen`,{time:_(e.lastSeenAtMs)})):!e.connected&&e.approvedAtMs&&t.push(j(`devices.inventory.approved`,{time:_(e.approvedAtMs)}));for(let n of e.roles)t.push(n);return e.autoApproved&&t.push(j(`devices.inventory.autoPaired`)),t.join(` · `)}function Z(e,t){if(t.length===0)return S;let n=t.slice(0,hn),r=t.length-n.length,i=r>0?` +${r}`:``;return C`<div class="muted">${e}: ${y(n)}${i}</div>`}function dn(e,t){let n=e.device?.tokens??[],r=e.node?.caps??[],i=e.node?.commands??[],a=e.scopes;return C`
<details class="device-entry__details">
<summary>${j(`devices.inventory.details`)}</summary>
<div class="muted">${j(`devices.inventory.deviceId`,{id:e.id})}</div>
${e.remoteIp?C`<div class="muted">${j(`devices.inventory.remoteIp`,{ip:e.remoteIp})}</div>`:S}
${a.length>0?C`<div class="muted">
${j(`devices.inventory.scopes`,{scopes:y(a)})}
</div>`:S}
${n.length>0?C`
<div class="muted">${j(`devices.inventory.tokens`)}</div>
${n.map(n=>mn({id:e.id,name:e.name},n,t))}
`:S}
${Z(j(`devices.inventory.capabilities`),r)}
${Z(j(`devices.inventory.commands`),i)}
</details>
`}function Q(e,t){let n=Qe({workerSlots:e.node?.workerSlots,capabilities:e.node?.caps,commands:e.node?.commands,unavailable:e.node?.connected!==!0||!on(e)}),r=e.node?.approvalState===`pending-approval`||e.node?.approvalState===`pending-reapproval`?e.node.pendingRequestId:void 0,i=e.node?.connected??e.connected?S:N({kind:`muted`,label:j(`devices.inventory.offline`)});return C`
<div class="settings-row device-entry" title=${n?.title??S}>
${W(U(e))}
<div class="settings-row__text">
<span class="settings-row__title">${e.name}</span>
<span class="settings-row__desc">${un(e)}</span>
${dn(e,t)}
</div>
<div class="settings-row__control">
${n?.meter??S} ${i}
${cn(e,t.gatewayVersion)}
${r?C`
<button
class="btn btn--sm"
?disabled=${!t.canManagePairing}
@click=${()=>t.onNodeApprove(r)}
>
${j(`devices.inventory.approve`)}
</button>
<button
class="btn btn--sm"
?disabled=${!t.canManagePairing}
@click=${()=>t.onNodeReject(r)}
>
${j(`devices.inventory.reject`)}
</button>
`:S}
<button
class="btn btn--sm danger"
aria-label=${j(`devices.inventory.removeName`,{name:e.name})}
title=${j(`devices.inventory.remove`)}
?disabled=${!t.canManagePairing}
@click=${()=>t.onInventoryRemove(en(e))}
>
${k.x}
</button>
</div>
</div>
`}function fn(e){let t=[];return e.platform&&t.push(R(e.platform)),e.modelIdentifier&&t.push(e.modelIdentifier),e.version&&t.push(e.version),e.lastInputSeconds!=null&&t.push(ln(e.lastInputSeconds)),t}function pn(e){let{entry:t}=e,n=e.kind===`gateway`,r=fn(t);!n&&Array.isArray(t.roles)&&r.push(...t.roles.filter(Boolean));let i=n?k.server:U({clientMode:t.mode??void 0,platform:t.platform??void 0}),a=n?t.host??j(`devices.execApprovals.gateway`):t.host??t.mode??j(`devices.inventory.unknownClient`);return C`
<div class="settings-row device-entry">
${W(i)}
<div class="settings-row__text">
<span class="settings-row__title">${a}</span>
${r.length>0?C`<span class="settings-row__desc">${r.join(` · `)}</span>`:S}
</div>
<div class="settings-row__control">
${N(n?{kind:`accent`,label:j(`devices.inventory.gateway`)}:{kind:`muted`,label:j(`devices.inventory.unpaired`)})}
</div>
</div>
`}function mn(e,t,n){let r=t.revokedAtMs?j(`devices.inventory.revoked`):j(`devices.inventory.active`),i=j(`devices.inventory.scopes`,{scopes:y(t.scopes)}),a=_(t.rotatedAtMs??t.createdAtMs??t.lastUsedAtMs??null);return C`
<div class="device-entry__token">
<span class="muted">${t.role} · ${r} · ${i} · ${a}</span>
<span class="device-entry__token-actions">
<button
class="btn btn--sm"
?disabled=${!n.canManagePairing}
@click=${()=>n.onDeviceRotate(e,t.role,t.scopes)}
>
${j(`devices.inventory.rotate`)}
</button>
${t.revokedAtMs?S:C`
<button
class="btn btn--sm danger"
?disabled=${!n.canManagePairing}
@click=${()=>n.onDeviceRevoke(e.id,t.role)}
>
${j(`devices.inventory.revoke`)}
</button>
`}
</span>
</div>
`}var hn;function gn(){return(gn=e((()=>{T(),A(),F(),$e(),O(),b(),Ht(),Ze(),$t(),G(),hn=16})))()}function _n(e){let t=vn(e),n=ht(e);return Ue(C`
${!e.canManagePairing||!e.canAdmin?C`<div class="callout info" role="note">
${j(!e.canManagePairing&&!e.canAdmin?`devices.readOnly.pairingAndAdminRequired`:e.canManagePairing?`devices.readOnly.adminRequired`:`devices.readOnly.pairingRequired`)}
</div>`:S}
${nn(e)} ${gt(n)}
${yn(t)}
`,{wide:!0})}function vn(e){let t=e.configForm,n=Sn(e.nodes),{defaultBinding:r,agents:i}=Cn(t);return{ready:!!t,disabled:!e.canAdmin||e.configSaving||e.configFormMode===`raw`,configDirty:e.configDirty,configLoading:e.configLoading,configSaving:e.configSaving,defaultBinding:r,agents:i,nodes:n,onBindDefault:e.onBindDefault,onBindAgent:e.onBindAgent,onSave:e.onSaveBindings,onLoadConfig:e.onLoadConfig,formMode:e.configFormMode,canAdmin:e.canAdmin}}function yn(e){let t=e.nodes.length>0,n=C`
<button class="btn" ?disabled=${e.disabled||!e.configDirty} @click=${e.onSave}>
${e.configSaving?j(`common.saving`):j(`common.save`)}
</button>
`,r=C`
${e.canAdmin?S:P({title:j(`devices.readOnly.adminRequired`)})}
${e.formMode===`raw`?P({title:j(`devices.binding.formModeHint`)}):S}
${e.ready?C`
${P({title:j(`devices.binding.defaultBinding`),description:t?j(`devices.binding.defaultBindingHint`):C`${j(`devices.binding.defaultBindingHint`)} ${j(`devices.binding.noNodes`)}`,control:xn(null,e)})}
${e.agents.length===0?P({title:j(`devices.binding.noAgents`)}):e.agents.map(t=>bn(t,e))}
`:P({title:j(`devices.binding.loadConfigHint`),control:C`
<button class="btn" ?disabled=${e.configLoading} @click=${e.onLoadConfig}>
${e.configLoading?j(`common.loading`):j(`common.loadConfig`)}
</button>
`})}
`;return L({title:j(`devices.binding.execNodeBinding`),description:j(`devices.binding.execNodeBindingSubtitle`),actions:n},r)}function bn(e,t){let n=e.binding??`__default__`,r=e.name?.trim()?`${e.name} (${e.id})`:e.id;return P({title:r,description:C`
${e.isDefault?j(`devices.binding.defaultAgent`):j(`devices.binding.agent`)} ·
${n===`__default__`?j(`devices.binding.usesDefault`,{node:t.defaultBinding??j(`devices.binding.any`)}):j(`devices.binding.override`,{node:e.binding??``})}
`,control:xn(e,t)})}function xn(e,t){let n=e===null,r=n?``:`__default__`,i=n?t.defaultBinding??``:e.binding??`__default__`;return C`
<select
class="settings-select"
aria-label=${j(n?`devices.binding.node`:`devices.binding.binding`)}
?disabled=${t.disabled||t.nodes.length===0}
@change=${n=>{let r=n.target.value.trim();e===null?t.onBindDefault(r||null):t.onBindAgent(e.id,r===`__default__`?null:r)}}
>
<option value=${r} ?selected=${i===r}>
${j(n?`devices.binding.anyNode`:`devices.binding.useDefault`)}
</option>
${t.nodes.map(e=>C`<option value=${e.id} ?selected=${i===e.id}>${e.label}</option>`)}
</select>
`}function Sn(e){return H(e,[`system.run`])}function Cn(e){let t={id:`main`,name:void 0,isDefault:!0,binding:null};if(!e||typeof e!=`object`)return{defaultBinding:null,agents:[t]};let n=(e.tools??{}).exec??{},r=typeof n.node==`string`&&n.node.trim()?n.node.trim():null,i=V(e).map(e=>{let t=(e.record.tools??{}).exec??{},n=typeof t.node==`string`&&t.node.trim()?t.node.trim():null;return{id:e.id,name:e.name,isDefault:e.isDefault,binding:n}});return i.length===0?{defaultBinding:r,agents:[t]}:{defaultBinding:r,agents:i}}function wn(){return(wn=e((()=>{T(),F(),O(),Tt(),gn(),G()})))()}function Tn(e){let t=new Map;for(let n of e){let e=(n.deviceId??n.instanceId)?.trim().toLowerCase();if(!e||n.mode?.trim().toLowerCase()===`gateway`)continue;let r=n.roles?.includes(`node`)?`${e}:node`:e;t.set(r,n.reason?.trim().toLowerCase()===`disconnect`?`offline`:`connected`)}return JSON.stringify([...t].toSorted(([e],[t])=>e.localeCompare(t)))}var En,Dn,$;function On(){return(On=e((()=>{Re(),Pe(),T(),xe(),u(),Oe(),ke(),Te(),ze(),B(),F(),qe(),O(),_e(),ge(),te(),Je(),pe(),Ve(),be(),wn(),En=`https://docs.openclaw.ai/nodes`,Dn=3e4,$=class extends de{constructor(...e){super(...e),this.presence=[],this.pageState=h(),this.canPairDevice=!1,this.canManagePairing=!1,this.canAdmin=!1,this.execApprovalsTarget=`gateway`,this.execApprovalsTargetNodeId=null,this.pendingConfirmation=null,this.routeDataInitialized=!1,this.gateway=new Ye(this,{getGateway:()=>this.context?.gateway,onIdentityChange:e=>this.resetServerState(e.snapshot),invalidateRequests:e=>{this.pageState.requestGeneration=this.gateway.epoch,!e.identityChanged&&e.snapshot.phase!==`connected`&&this.resetServerState(e.snapshot),this.presenceTask.run([null,null])},onSnapshot:e=>this.handleGatewaySnapshot(e),ensureInitialData:()=>this.ensureInitialData()}),this.presenceTask=new Fe(this,{autoRun:!1,args:()=>[this.gateway.connected?this.gateway.gateway:null,this.gateway.connected?this.gateway.client:null],task:([e,t],{signal:n})=>e&&t?t.request(`system-presence`,{},{signal:n}):Le,onComplete:e=>{Array.isArray(e)&&(this.presence=e)},onError:e=>{me(e)&&(this.presence=[])}}),this.polling=new Be(this,Dn,()=>{this.runPageTask(e=>g(e,{quiet:!0})),this.canManagePairing&&this.runPageTask(e=>x(e,{quiet:!0}))},!1),this.subscriptions=new ve(this).watch(()=>this.context?.runtimeConfig,(e,t)=>e.subscribe(t)).effect(()=>this.context?.gateway,e=>e.subscribeEvents(t=>{if(this.gateway.gateway!==e||this.context.gateway!==e)return;let n=t.event===`presence`?D(t.payload):null;if(n){let e=Tn(n)!==Tn(this.presence);this.presenceTask.run([null,null]),this.presence=n,e&&(this.canManagePairing&&this.runPageTask(e=>x(e,{quiet:!0})),this.runPageTask(e=>g(e,{quiet:!0})))}(t.event===`device.pair.changed`||t.event===`device.pair.requested`||t.event===`device.pair.resolved`)&&this.canManagePairing&&this.runPageTask(e=>x(e,{quiet:!0})),(t.event===`node.pair.requested`||t.event===`node.pair.resolved`||t.event===`node.runnerInventory.changed`)&&this.runPageTask(e=>g(e,{quiet:!0}))}))}willUpdate(e){e.has(`routeData`)&&this.applyRouteData()}updated(e){e.has(`routeData`)&&this.ensureInitialData()}disconnectedCallback(){this.cancelPendingConfirmation(),this.subscriptions.clear(),this.presenceTask.run([null,null]),this.presence=[],this.canPairDevice=!1,this.canManagePairing=!1,this.canAdmin=!1,super.disconnectedCallback()}get requestGeneration(){return this.pageState.requestGeneration}handleGatewaySnapshot(e){let t=e.snapshot;if(this.pageState.client=t.client,this.pageState.connected=t.phase===`connected`,this.pageState.requestGeneration=this.gateway.epoch,this.syncGatewayState(t),this.routeDataInitialized&&t.phase===`connected`&&t.client&&(e.identityChanged||e.connectionChanged)){let e=D(t.hello?.snapshot);this.presence=e??[],this.loadPresence()}this.syncPolling()}syncGatewayState(e){let t=e.phase===`connected`,n=e.hello?.auth??null;this.canAdmin=t&&De(n),this.canManagePairing=t&&(!n||we(n)),this.canPairDevice=this.canAdmin}applyRouteData(){let e=this.routeData;if(!e)return;this.routeDataInitialized=!0;let t=this.context.gateway.snapshot;if(!this.gateway.isRouteDataCurrent(e)){this.resetServerState(t),this.presence=D(t.hello?.snapshot)??[],this.loadPresence(),this.ensureInitialData();return}this.pageState={...e.devices,client:t.client,connected:t.phase===`connected`,requestGeneration:this.gateway.epoch};let n=D(t.hello?.snapshot);n&&(this.presence=n),this.loadPresence()}resetServerState(e){this.cancelPendingConfirmation(),this.pageState.requestGeneration+=1;let t=h({client:e.client,connected:e.phase===`connected`});t.requestGeneration=this.gateway.epoch,this.pageState=t,this.presenceTask.run([null,null]),this.presence=[]}async runPageTask(e){let t=this.pageState;try{let n=e(t);return this.pageState===t&&this.requestUpdate(),await n}finally{this.pageState===t&&this.requestUpdate()}}ensureInitialData(){let e=this.pageState;if(!e.connected||!e.client||!this.routeDataInitialized)return;!e.nodes.length&&!e.nodesLoading&&this.runPageTask(e=>g(e)),this.canManagePairing&&!e.devicesList&&!e.devicesLoading&&this.runPageTask(e=>x(e));let t=this.context.runtimeConfig.state;!t.configSnapshot&&!t.configLoading&&this.context.runtimeConfig.refresh(),this.canAdmin&&!e.execApprovalsSnapshot&&!e.execApprovalsLoading&&this.runPageTask(e=>m(e,this.resolveExecApprovalsTarget()))}syncPolling(){if(this.gateway.connected&&this.gateway.client){this.polling.start();return}this.polling.stop()}loadPresence(){let e=this.gateway.gateway,t=this.gateway.client;return!e||!this.gateway.connected||!t?Promise.resolve():this.presenceTask.run([e,t])}cancelPendingConfirmation(){this.pendingConfirmation?.abort(),this.pendingConfirmation=null}async confirmDestructiveAction(e,t){if(this.pendingConfirmation)return;let n=new AbortController;this.pendingConfirmation=n;let r=this.requestGeneration,i=this.gateway.client,a=await We({...e,danger:!0,signal:n.signal});this.pendingConfirmation===n&&(this.pendingConfirmation=null),!(!a||n.signal.aborted||r!==this.requestGeneration||i!==this.gateway.client||!this.gateway.connected||!this.canManagePairing)&&await this.runPageTask(t)}confirmInventoryRemoval(e){if(!this.canManagePairing)return Promise.resolve();if(e.kind===`entry`){let t=e.entry;return this.confirmDestructiveAction({title:j(`devices.inventory.removePromptTitle`,{name:t.name}),message:j(`devices.inventory.removePromptBody`),details:j(`devices.inventory.deviceId`,{id:t.id}),confirmLabel:j(`devices.inventory.remove`)},e=>re(e,t))}let t=e.entries;return this.confirmDestructiveAction({title:j(t.length===1?`devices.inventory.removeStalePromptTitleOne`:`devices.inventory.removeStalePromptTitle`,{count:String(t.length)}),message:j(`devices.inventory.removeStalePromptBody`),confirmLabel:j(`devices.inventory.remove`)},e=>he(e,t))}confirmPairingReject(e,t){return this.canManagePairing?this.confirmDestructiveAction({title:j(e===`device`?`devices.inventory.rejectDevicePromptTitle`:`devices.inventory.rejectNodePromptTitle`),message:j(`devices.inventory.rejectPromptBody`),confirmLabel:j(`devices.inventory.reject`)},n=>e===`device`?se(n,t):ce(n,t)):Promise.resolve()}confirmTokenRevoke(e,t){return this.canManagePairing?this.confirmDestructiveAction({title:j(`devices.inventory.revokePromptTitle`,{role:t}),message:j(`devices.inventory.revokePromptBody`),details:j(`devices.inventory.deviceId`,{id:e}),confirmLabel:j(`devices.inventory.revoke`)},n=>ne(n,{deviceId:e,gatewayUrl:this.context.gateway.connection.gatewayUrl,role:t})):Promise.resolve()}async reportRotationOutcome(e,t,n){if(!this.canManagePairing)return;let r=await this.runPageTask(r=>ue(r,{deviceId:e.id,gatewayUrl:this.context.gateway.connection.gatewayUrl,role:t,scopes:n}));r&&await(r.delivery===`in-band`?z({title:j(`devices.inventory.rotatePromptTitle`,{role:t}),message:j(`devices.inventory.rotatePromptBody`),secret:r.token,acknowledgeLabel:j(`devices.inventory.rotateAcknowledge`),dismissHint:j(`devices.inventory.rotateDismissHint`)}):z({title:j(`devices.inventory.rotateWithheldTitle`,{device:e.name}),status:`success`,message:j(`devices.inventory.rotateWithheldNext`),callout:j(`devices.inventory.rotateWithheldException`),acknowledgeLabel:j(`common.close`),note:j(`devices.inventory.rotateWithheldNote`)}))}resolveExecApprovalsTarget(){return this.execApprovalsTarget===`node`&&this.execApprovalsTargetNodeId?{kind:`node`,nodeId:this.execApprovalsTargetNodeId}:{kind:`gateway`}}render(){let e=this.pageState,t=this.context.runtimeConfig.state,n=this.context.gateway.snapshot,r=n.phase===`connected`&&n.hello?.server?.version?.trim()||null;return C`
<section class="content-header">
<div>
<div class="page-title">${Ce(`devices`)}</div>
<div class="page-subtitle">
${Ee(`devices`)} ${He(En)}
</div>
</div>
</section>
${Ke(_n({loading:e.nodesLoading,nodes:e.nodes,presence:this.presence,gatewayVersion:r,lastError:e.lastError,devicesLoading:e.devicesLoading,devicesError:e.devicesError,devicesList:e.devicesList,canPairDevice:this.canPairDevice,canManagePairing:this.canManagePairing,canAdmin:this.canAdmin,configForm:fe(t),configLoading:t.configLoading,configSaving:t.configSaving,configDirty:t.configFormDirty,configFormMode:t.configFormMode,execApprovalsLoading:e.execApprovalsLoading,execApprovalsSaving:e.execApprovalsSaving,execApprovalsDirty:e.execApprovalsDirty,execApprovalsSnapshot:e.execApprovalsSnapshot,execApprovalsForm:e.execApprovalsForm,execApprovalsSelectedAgent:e.execApprovalsSelectedAgent,execApprovalsTarget:this.execApprovalsTarget,execApprovalsTargetNodeId:this.execApprovalsTargetNodeId,onDevicePairSetupOpen:()=>{this.canAdmin&&this.context.overlays.openDevicePairSetup()},onDeviceApprove:e=>{this.canManagePairing&&this.runPageTask(t=>ae(t,e))},onDeviceReject:e=>void this.confirmPairingReject(`device`,e),onNodeApprove:e=>{this.canManagePairing&&this.runPageTask(t=>oe(t,e))},onNodeReject:e=>void this.confirmPairingReject(`node`,e),onInventoryRemove:e=>void this.confirmInventoryRemoval({kind:`entry`,entry:e}),onInventoryCleanup:e=>{e.length>0&&this.confirmInventoryRemoval({kind:`stale`,entries:e})},onDeviceRotate:(e,t,n)=>void this.reportRotationOutcome(e,t,n),onDeviceRevoke:(e,t)=>void this.confirmTokenRevoke(e,t),onLoadConfig:()=>void this.context.runtimeConfig.refresh({discardPendingChanges:!0}),onLoadExecApprovals:()=>this.canAdmin?void this.runPageTask(e=>m(e,this.resolveExecApprovalsTarget())):void 0,onBindDefault:e=>{this.canAdmin&&(e?this.context.runtimeConfig.patchForm([`tools`,`exec`,`node`],e):this.context.runtimeConfig.removeFormValue([`tools`,`exec`,`node`]))},onBindAgent:(e,t)=>{if(!this.canAdmin)return;let n=this.context.runtimeConfig.agentEntry(e,{ensure:!!t});if(!n)return;let r=[...n.path,`tools`,`exec`,`node`];t?this.context.runtimeConfig.patchForm(r,t):this.context.runtimeConfig.removeFormValue(r)},onSaveBindings:()=>{this.canAdmin&&this.context.runtimeConfig.save()},onExecApprovalsTargetChange:(t,n)=>{this.execApprovalsTarget=t,this.execApprovalsTargetNodeId=n,e.execApprovalsSnapshot=null,e.execApprovalsForm=null,e.execApprovalsDirty=!1,e.execApprovalsSelectedAgent=null,this.requestUpdate()},onExecApprovalsSelectAgent:t=>{e.execApprovalsSelectedAgent=t,this.requestUpdate()},onExecApprovalsPatch:(e,t)=>this.canAdmin?void this.runPageTask(n=>p(n,e,t)):void 0,onExecApprovalsRemove:e=>this.canAdmin?void this.runPageTask(t=>ee(t,e)):void 0,onSaveExecApprovals:()=>this.canAdmin?void this.runPageTask(e=>le(e,this.resolveExecApprovalsTarget())):void 0}))}
`}},o([Ie({context:Ae,subscribe:!0})],$.prototype,`context`,void 0),o([Se({attribute:!1})],$.prototype,`routeData`,void 0),o([E()],$.prototype,`presence`,void 0),o([E()],$.prototype,`pageState`,void 0),o([E()],$.prototype,`canPairDevice`,void 0),o([E()],$.prototype,`canManagePairing`,void 0),o([E()],$.prototype,`canAdmin`,void 0),o([E()],$.prototype,`execApprovalsTarget`,void 0),o([E()],$.prototype,`execApprovalsTargetNodeId`,void 0),customElements.get(`openclaw-devices-page`)||customElements.define(`openclaw-devices-page`,$)})))()}On();
//# sourceMappingURL=devices-page-yBUnBvjB.js.map