@keyueclaw/web-sdk 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -686,22 +686,8 @@ else:
686
686
  </div>
687
687
  `}function zA(e){let t=e.form,n=`display:flex;flex-direction:column;gap:5px;`,r=`font-size:13px;color:var(--keyueclaw-text);font-weight:500;`,a=e=>{e.target.style.borderColor=`var(--keyueclaw-border-hover)`},o=e=>{e.target.style.borderColor=`var(--keyueclaw-border-strong)`},s=t.url===``||EA.test(t.url),c=e.saveAttempted,l=c&&!t.name.trim()?`请填写接口名称`:null,u=c&&!t.url.trim()?`请填写请求地址`:s?null:`请输入合法的请求地址:支持 /path 或 http(s)://host/path,纯域名不支持`;return S`
688
688
  <div style="height:100%;overflow:hidden;display:flex;flex-direction:column;">
689
- <!-- 面包屑 + 操作栏 -->
690
- <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;">
691
- <div style="display:flex;align-items:center;gap:6px;font-size:14px;color:var(--keyueclaw-muted-foreground);">
692
- <button type="button" style="background:none;border:none;padding:0;cursor:pointer;color:var(--keyueclaw-muted-foreground);font-size:14px;" @click=${e.onCancelEdit}>接口管理</button>
693
- <span>/</span>
694
- <span style="color:var(--keyueclaw-text);">${t.id?`编辑接口`:`新增接口`}</span>
695
- </div>
696
- <div style="display:flex;gap:8px;">
697
- <button class="btn" type="button" @click=${e.onCancelEdit}>取消</button>
698
- <button class="btn btn-primary" type="button" ?disabled=${e.saving} @click=${e.onSave}>
699
- ${e.saving?`保存中…`:`保存`}
700
- </button>
701
- </div>
702
- </div>
703
-
704
- <section class="card" style="padding:0 18px;flex:1;overflow:auto;">
689
+ <section class="card" style="padding:0;flex:1;overflow:hidden;display:flex;flex-direction:column;">
690
+ <div style="flex:1;overflow:auto;padding:0 18px;">
705
691
  <!-- 接口基本信息 -->
706
692
  ${PA(`接口基本信息`,S`
707
693
  <div style="display:flex;flex-direction:column;gap:12px;">
@@ -830,7 +816,7 @@ else:
830
816
  `)}
831
817
 
832
818
  <!-- 备注 -->
833
- ${PA(`备注`,S`
819
+ ${PA(`请求 / 响应示例`,S`
834
820
  <div style="display:flex;flex-direction:column;gap:14px;">
835
821
  ${RA({label:`输入示例`,value:t.inputExample,params:t.inputParams,onInput:t=>e.onFormPatch({inputExample:t}),onGenerate:()=>e.onFormPatch({inputExample:LA(t.inputParams)}),focusOn:a,focusOff:o})}
836
822
  ${RA({label:`输出示例`,value:t.outputExample,params:t.outputParams,onInput:t=>e.onFormPatch({outputExample:t}),onGenerate:()=>e.onFormPatch({outputExample:LA(t.outputParams)}),focusOn:a,focusOff:o})}
@@ -838,20 +824,26 @@ else:
838
824
  <!-- 备注(Markdown / 纯文本均可) -->
839
825
  <div style="display:flex;flex-direction:column;gap:5px;">
840
826
  <span style=${r}>备注</span>
841
- <div style="border:1px solid var(--keyueclaw-border-strong);border-radius:8px;overflow:hidden;min-height:140px;display:flex;flex-direction:column;">
842
- <skill-code-editor
843
- .value=${t.remarks}
844
- .filename=${`remarks.md`}
845
- style="flex:1;min-height:140px;display:flex;"
846
- @change=${t=>e.onFormPatch({remarks:t.detail.value})}
847
- ></skill-code-editor>
848
- </div>
827
+ <skill-code-editor
828
+ .value=${t.remarks}
829
+ .filename=${`remarks.md`}
830
+ style="min-height:140px;display:flex;"
831
+ @change=${t=>e.onFormPatch({remarks:t.detail.value})}
832
+ ></skill-code-editor>
849
833
  </div>
850
834
  </div>
851
835
  `)}
836
+ </div>
837
+ <!-- 底部操作栏 -->
838
+ <div style="display:flex;gap:8px;padding:12px 18px;flex-shrink:0;border-top:1px solid var(--keyueclaw-border);">
839
+ <button class="btn" type="button" @click=${e.onCancelEdit}>取消</button>
840
+ <button class="btn btn-primary" type="button" ?disabled=${e.saving} @click=${e.onSave}>
841
+ ${e.saving?`保存中…`:`保存`}
842
+ </button>
843
+ </div>
852
844
  </section>
853
845
  </div>
854
- `}var BA=null,VA=8;function HA(e){if(BA?.disconnect(),BA=null,!(e instanceof HTMLElement))return;let t=()=>{let t=e.parentElement;if(!t)return;let n=0;for(let r of Array.from(t.children)){if(r===e)break;n+=r.offsetHeight}let r=getComputedStyle(t),i=parseFloat(r.paddingTop)+parseFloat(r.paddingBottom),a=Math.max(t.clientHeight-n-i,100);e.style.height=a+`px`;let o=e.querySelector(`thead`),s=e.querySelector(`tbody`);o&&s&&(s.style.height=Math.max(a-o.offsetHeight-VA,50)+`px`)};BA=new ResizeObserver(t),BA.observe(e.parentElement),t()}function UA(e){let t=`background:none;border:none;padding:4px 6px;cursor:pointer;color:#3658ff;display:inline-flex;align-items:center;gap:4px;border-radius:4px;font-size:13px;`,n=new Set(e.selectedIds),r=e.items.filter(e=>n.has(e.id)).length,i=e.items.length>0&&r===e.items.length;return S`
846
+ `}var BA=null,VA=8;function HA(e){if(BA?.disconnect(),BA=null,!(e instanceof HTMLElement))return;let t=()=>{let t=e.parentElement;if(!t)return;let n=0;for(let r of Array.from(t.children)){if(r===e)break;n+=r.offsetHeight}let r=getComputedStyle(t),i=parseFloat(r.paddingTop)+parseFloat(r.paddingBottom),a=Math.max(t.clientHeight-n-i,100);if(e.style.height===a+`px`)return;e.style.height=a+`px`;let o=e.querySelector(`thead`),s=e.querySelector(`tbody`);o&&s&&(s.style.height=Math.max(a-o.offsetHeight-VA,50)+`px`)};BA=new ResizeObserver(t),BA.observe(e.parentElement.parentElement??e.parentElement),t()}function UA(e){let t=`background:none;border:none;padding:4px 6px;cursor:pointer;color:#3658ff;display:inline-flex;align-items:center;gap:4px;border-radius:4px;font-size:13px;`,n=new Set(e.selectedIds),r=e.items.filter(e=>n.has(e.id)).length,i=e.items.length>0&&r===e.items.length;return S`
855
847
  <section class="card">
856
848
  <div style="display:flex;align-items:center;gap:12px;margin-bottom:16px;">
857
849
  <input class="input"
@@ -1461,7 +1453,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
1461
1453
  `)}}catch(e){return{content:`Failed to get model info: ${String(e)}`}}try{let r=await e.request(`sessions.patch`,{key:t,model:n.trim()}),i=Sz(r.resolved?.model??n.trim(),r.resolved?.modelProvider);return{content:`Model set to \`${n.trim()}\`.`,action:`refresh`,sessionPatch:{modelOverride:xz(i)}}}catch(e){return{content:`Failed to set model: ${String(e)}`}}}async function Dz(e,t,n){let r=n.trim();if(!r)try{let{session:n,models:r}=await Vz(e,t);return{content:Rz(`Current thinking level: ${Hz(n,r)}.`,mz(n?.modelProvider,n?.model))}}catch(e){return{content:`Failed to get thinking level: ${String(e)}`}}let i=dz(r);if(!i)try{let n=await zz(e,t);return{content:`Unrecognized thinking level "${r}". Valid levels: ${mz(n?.modelProvider,n?.model)}.`}}catch(e){return{content:`Failed to validate thinking level: ${String(e)}`}}try{return await e.request(`sessions.patch`,{key:t,thinkingLevel:i}),{content:`Thinking level set to **${i}**.`,action:`refresh`}}catch(e){return{content:`Failed to set thinking level: ${String(e)}`}}}async function Oz(e,t,n){let r=n.trim();if(!r)try{return{content:Rz(`Current verbose level: ${_z((await zz(e,t))?.verboseLevel)??`off`}.`,`on, full, off`)}}catch(e){return{content:`Failed to get verbose level: ${String(e)}`}}let i=_z(r);if(!i)return{content:`Unrecognized verbose level "${r}". Valid levels: off, on, full.`};try{return await e.request(`sessions.patch`,{key:t,verboseLevel:i}),{content:`Verbose mode set to **${i}**.`,action:`refresh`}}catch(e){return{content:`Failed to set verbose mode: ${String(e)}`}}}async function kz(e,t,n){let r=n.trim().toLowerCase();if(!r||r===`status`)try{return{content:Rz(`Current fast mode: ${Uz(await zz(e,t))}.`,`status, on, off`)}}catch(e){return{content:`Failed to get fast mode: ${String(e)}`}}if(r!==`on`&&r!==`off`)return{content:`Unrecognized fast mode "${n.trim()}". Valid levels: status, on, off.`};try{return await e.request(`sessions.patch`,{key:t,fastMode:r===`on`}),{content:`Fast mode ${r===`on`?`enabled`:`disabled`}.`,action:`refresh`}}catch(e){return{content:`Failed to set fast mode: ${String(e)}`}}}async function Az(e,t){try{let n=Bz(await e.request(`sessions.list`,{}),t);if(!n)return{content:`No active session.`};let r=n.inputTokens??0,i=n.outputTokens??0,a=n.totalTokens??r+i,o=n.contextTokens??0,s=o>0?Math.round(r/o*100):null,c=[`**Session Usage**`,`Input: **${Wz(r)}** tokens`,`Output: **${Wz(i)}** tokens`,`Total: **${Wz(a)}** tokens`];return s!==null&&c.push(`Context: **${s}%** of ${Wz(o)}`),n.model&&c.push(`Model: \`${n.model}\``),{content:c.join(`
1462
1454
  `)}}catch(e){return{content:`Failed to get usage: ${String(e)}`}}}async function jz(e){try{let t=await e.request(`agents.list`,{}),n=t?.agents??[];if(n.length===0)return{content:`No agents configured.`};let r=[`**Agents** (${n.length})\n`];for(let e of n){let n=e.id===t?.defaultId,i=e.identity?.name||e.name||e.id,a=n?` *(default)*`:``;r.push(`- \`${e.id}\` — ${i}${a}`)}return{content:r.join(`
1463
1455
  `)}}catch(e){return{content:`Failed to list agents: ${String(e)}`}}}async function Mz(e,t,n){let r=n.trim();if(!r)return{content:"Usage: `/kill <id|all>`"};try{let n=Nz((await e.request(`sessions.list`,{}))?.sessions??[],t,r);if(n.length===0)return{content:r.toLowerCase()===`all`?`No active sub-agent sessions found.`:`No matching sub-agent sessions found for \`${r}\`.`};let i=await Promise.allSettled(n.map(t=>e.request(`chat.abort`,{sessionKey:t}))),a=i.filter(e=>e.status===`rejected`),o=i.filter(e=>e.status===`fulfilled`&&e.value?.aborted!==!1).length;if(o===0){if(a.length===0)return{content:r.toLowerCase()===`all`?`No active sub-agent runs to abort.`:`No active runs matched \`${r}\`.`};throw a[0]?.reason??Error(`abort failed`)}return r.toLowerCase()===`all`?{content:o===n.length?`Aborted ${o} sub-agent session${o===1?``:`s`}.`:`Aborted ${o} of ${n.length} sub-agent sessions.`}:{content:o===n.length?`Aborted ${o} matching sub-agent session${o===1?``:`s`} for \`${r}\`.`:`Aborted ${o} of ${n.length} matching sub-agent sessions for \`${r}\`.`}}catch(e){return{content:`Failed to abort: ${String(e)}`}}}function Nz(e,t,n){let r=n.trim().toLowerCase();if(!r)return[];let i=new Set,a=t.trim().toLowerCase(),o=GA(a)?.agentId??(a===`main`?`main`:void 0),s=Fz(e);for(let t of e){let e=t?.key?.trim();if(!e||!KA(e))continue;let n=e.toLowerCase(),c=GA(n),l=Pz(n,a,s,o,c?.agentId);(r===`all`&&l||l&&n===r||l&&((c?.agentId??``)===r||n.endsWith(`:subagent:${r}`)||n===`subagent:${r}`))&&i.add(e)}return[...i]}function Pz(e,t,n,r,i){if(!r||i!==r)return!1;let a=Lz(t,r),o=new Set,s=Iz(n.get(e)?.spawnedBy);for(;s&&!o.has(s);){if(a.has(s))return!0;o.add(s),s=Iz(n.get(s)?.spawnedBy)}return KA(t)?e.startsWith(`${t}:subagent:`):!1}function Fz(e){let t=new Map;for(let n of e){let e=Iz(n?.key);e&&t.set(e,n)}return t}function Iz(e){return e?.trim().toLowerCase()||void 0}function Lz(e,t){let n=new Set([e]);if(t===`main`){let t=`agent:${vz}:main`;e===`main`?n.add(t):e===t&&n.add(yz)}return n}function Rz(e,t){return`${e}\nOptions: ${t}.`}async function zz(e,t){return Bz(await e.request(`sessions.list`,{}),t)}function Bz(e,t){let n=Iz(t),r=GA(n??``)?.agentId??(n===`main`?`main`:void 0),i=n?Lz(n,r):new Set;return e?.sessions?.find(e=>{let t=Iz(e.key);return t?i.has(t):!1})}async function Vz(e,t){let[n,r]=await Promise.all([e.request(`sessions.list`,{}),e.request(`models.list`,{})]);return{session:Bz(n,t),models:r?.models??[]}}function Hz(e,t){return dz(e?.thinkingLevel)||(!e?.modelProvider||!e.model?`off`:hz({provider:e.modelProvider,model:e.model,catalog:t}))}function Uz(e){return e?.fastMode===!0?`on`:`off`}function Wz(e){return e>=1e6?`${(e/1e6).toFixed(1).replace(/\.0$/,``)}M`:e>=1e3?`${(e/1e3).toFixed(1).replace(/\.0$/,``)}k`:String(e)}var Gz={AUTH_REQUIRED:`AUTH_REQUIRED`,AUTH_UNAUTHORIZED:`AUTH_UNAUTHORIZED`,AUTH_TOKEN_MISSING:`AUTH_TOKEN_MISSING`,AUTH_TOKEN_MISMATCH:`AUTH_TOKEN_MISMATCH`,AUTH_TOKEN_NOT_CONFIGURED:`AUTH_TOKEN_NOT_CONFIGURED`,AUTH_PASSWORD_MISSING:`AUTH_PASSWORD_MISSING`,AUTH_PASSWORD_MISMATCH:`AUTH_PASSWORD_MISMATCH`,AUTH_PASSWORD_NOT_CONFIGURED:`AUTH_PASSWORD_NOT_CONFIGURED`,AUTH_BOOTSTRAP_TOKEN_INVALID:`AUTH_BOOTSTRAP_TOKEN_INVALID`,AUTH_DEVICE_TOKEN_MISMATCH:`AUTH_DEVICE_TOKEN_MISMATCH`,AUTH_RATE_LIMITED:`AUTH_RATE_LIMITED`,AUTH_TAILSCALE_IDENTITY_MISSING:`AUTH_TAILSCALE_IDENTITY_MISSING`,AUTH_TAILSCALE_PROXY_MISSING:`AUTH_TAILSCALE_PROXY_MISSING`,AUTH_TAILSCALE_WHOIS_FAILED:`AUTH_TAILSCALE_WHOIS_FAILED`,AUTH_TAILSCALE_IDENTITY_MISMATCH:`AUTH_TAILSCALE_IDENTITY_MISMATCH`,CONTROL_UI_ORIGIN_NOT_ALLOWED:`CONTROL_UI_ORIGIN_NOT_ALLOWED`,CONTROL_UI_DEVICE_IDENTITY_REQUIRED:`CONTROL_UI_DEVICE_IDENTITY_REQUIRED`,DEVICE_IDENTITY_REQUIRED:`DEVICE_IDENTITY_REQUIRED`,DEVICE_AUTH_INVALID:`DEVICE_AUTH_INVALID`,DEVICE_AUTH_DEVICE_ID_MISMATCH:`DEVICE_AUTH_DEVICE_ID_MISMATCH`,DEVICE_AUTH_SIGNATURE_EXPIRED:`DEVICE_AUTH_SIGNATURE_EXPIRED`,DEVICE_AUTH_NONCE_REQUIRED:`DEVICE_AUTH_NONCE_REQUIRED`,DEVICE_AUTH_NONCE_MISMATCH:`DEVICE_AUTH_NONCE_MISMATCH`,DEVICE_AUTH_SIGNATURE_INVALID:`DEVICE_AUTH_SIGNATURE_INVALID`,DEVICE_AUTH_PUBLIC_KEY_INVALID:`DEVICE_AUTH_PUBLIC_KEY_INVALID`,PAIRING_REQUIRED:`PAIRING_REQUIRED`},Kz=new Set([`retry_with_device_token`,`update_auth_configuration`,`update_auth_credentials`,`wait_then_retry`,`review_auth_configuration`]);function qz(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e.code;return typeof t==`string`&&t.trim().length>0?t:null}function Jz(e){if(!e||typeof e!=`object`||Array.isArray(e))return{};let t=e,n=typeof t.canRetryWithDeviceToken==`boolean`?t.canRetryWithDeviceToken:void 0,r=typeof t.recommendedNextStep==`string`?t.recommendedNextStep.trim():``;return{canRetryWithDeviceToken:n,recommendedNextStep:Kz.has(r)?r:void 0}}function Yz(e){let t=e.scopes.join(`,`),n=e.token??``;return[`v2`,e.deviceId,e.clientId,e.clientMode,e.role,t,String(e.signedAtMs),n,e.nonce].join(`|`)}var Xz={WEBCHAT_UI:`webchat-ui`,CONTROL_UI:`openclaw-control-ui`,WEBCHAT:`webchat`,CLI:`cli`,GATEWAY_CLIENT:`gateway-client`,MACOS_APP:`openclaw-macos`,IOS_APP:`openclaw-ios`,ANDROID_APP:`openclaw-android`,NODE_HOST:`node-host`,TEST:`test`,FINGERPRINT:`fingerprint`,PROBE:`openclaw-probe`},Zz=Xz,Qz={WEBCHAT:`webchat`,CLI:`cli`,UI:`ui`,BACKEND:`backend`,NODE:`node`,PROBE:`probe`,TEST:`test`};new Set(Object.values(Xz)),new Set(Object.values(Qz));var $z=!1;function eB(e){e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t=``;for(let n=0;n<e.length;n++)t+=e[n].toString(16).padStart(2,`0`);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}function tB(){let e=new Uint8Array(16),t=Date.now();for(let t=0;t<e.length;t++)e[t]=Math.floor(Math.random()*256);return e[0]^=t&255,e[1]^=t>>>8&255,e[2]^=t>>>16&255,e[3]^=t>>>24&255,e}function nB(){$z||($z=!0,console.warn(`[uuid] crypto API missing; falling back to weak randomness`))}function rB(e=globalThis.crypto){if(e&&typeof e.randomUUID==`function`)return e.randomUUID();if(e&&typeof e.getRandomValues==`function`){let t=new Uint8Array(16);return e.getRandomValues(t),eB(t)}return nB(),eB(tB())}var iB=class extends Error{constructor(e){super(e.message),this.name=`GatewayRequestError`,this.gatewayCode=e.code,this.details=e.details}};function aB(e){return qz(e?.details)}function oB(e){if(!e)return!1;let t=aB(e);return t===Gz.AUTH_TOKEN_MISSING||t===Gz.AUTH_BOOTSTRAP_TOKEN_INVALID||t===Gz.AUTH_PASSWORD_MISSING||t===Gz.AUTH_PASSWORD_MISMATCH||t===Gz.AUTH_RATE_LIMITED||t===Gz.PAIRING_REQUIRED||t===Gz.CONTROL_UI_DEVICE_IDENTITY_REQUIRED||t===Gz.DEVICE_IDENTITY_REQUIRED}function sB(e){try{let t=new URL(e,window.location.href),n=t.hostname.trim().toLowerCase(),r=n===`localhost`||n===`::1`||n===`[::1]`||n===`127.0.0.1`,i=n.startsWith(`127.`);if(r||i)return!0;let a=new URL(window.location.href);return t.host===a.host}catch{return!1}}var cB=4008,lB=class{constructor(e){this.opts=e,this.ws=null,this.pending=new Map,this.closed=!1,this.lastSeq=null,this.connectNonce=null,this.connectSent=!1,this.connectTimer=null,this.backoffMs=800,this.pendingDeviceTokenRetry=!1,this.deviceTokenRetryBudgetUsed=!1}start(){this.closed=!1,this.connect()}stop(){this.closed=!0,this.ws?.close(),this.ws=null,this.pendingConnectError=void 0,this.pendingDeviceTokenRetry=!1,this.deviceTokenRetryBudgetUsed=!1,this.flushPending(Error(`gateway client stopped`))}get connected(){return this.ws?.readyState===WebSocket.OPEN}connect(){this.closed||(this.ws=new WebSocket(this.opts.url),this.ws.addEventListener(`open`,()=>this.queueConnect()),this.ws.addEventListener(`message`,e=>this.handleMessage(String(e.data??``))),this.ws.addEventListener(`close`,e=>{let t=String(e.reason??``),n=this.pendingConnectError;this.pendingConnectError=void 0,this.ws=null,this.flushPending(Error(`gateway closed (${e.code}): ${t}`)),this.opts.onClose?.({code:e.code,reason:t,error:n}),!(aB(n)===Gz.AUTH_TOKEN_MISMATCH&&this.deviceTokenRetryBudgetUsed&&!this.pendingDeviceTokenRetry)&&(oB(n)||this.scheduleReconnect())}),this.ws.addEventListener(`error`,()=>{}))}scheduleReconnect(){if(this.closed)return;let e=this.backoffMs;this.backoffMs=Math.min(this.backoffMs*1.7,15e3),window.setTimeout(()=>this.connect(),e)}flushPending(e){for(let[,t]of this.pending)t.reject(e);this.pending.clear()}async sendConnect(){if(this.connectSent)return;this.connectSent=!0,this.connectTimer!==null&&(window.clearTimeout(this.connectTimer),this.connectTimer=null);let e=typeof crypto<`u`&&!!crypto.subtle,t=[`operator.admin`,`operator.approvals`,`operator.pairing`],n=`operator`,r=this.opts.token?.trim()||void 0,i=this.opts.password?.trim()||void 0,a=null,o={authToken:r,authPassword:i,canFallbackToShared:!1};e&&(a=await QN(),o=this.selectConnectAuth({role:n,deviceId:a.deviceId}),this.pendingDeviceTokenRetry&&o.authDeviceToken&&(this.pendingDeviceTokenRetry=!1));let s=o.authToken,c=o.authDeviceToken??o.resolvedDeviceToken,l=s||o.authPassword?{token:s,deviceToken:c,password:o.authPassword}:void 0,u;if(e&&a){let e=Date.now(),r=this.connectNonce??``,i=Yz({deviceId:a.deviceId,clientId:this.opts.clientName??Zz.CONTROL_UI,clientMode:this.opts.mode??Qz.WEBCHAT,role:n,scopes:t,signedAtMs:e,token:s??null,nonce:r}),o=await $N(a.privateKey,i);u={id:a.deviceId,publicKey:a.publicKey,signature:o,signedAt:e,nonce:r}}let d={minProtocol:3,maxProtocol:3,client:{id:this.opts.clientName??Zz.CONTROL_UI,version:this.opts.clientVersion??`control-ui`,platform:this.opts.platform??navigator.platform??`web`,mode:this.opts.mode??Qz.WEBCHAT,instanceId:this.opts.instanceId},role:n,scopes:t,device:u,caps:[`tool-events`],auth:l,userAgent:navigator.userAgent,locale:navigator.language,userPhone:this.opts.phone};this.request(`connect`,d).then(e=>{this.pendingDeviceTokenRetry=!1,this.deviceTokenRetryBudgetUsed=!1,e?.auth?.deviceToken&&a&&IM({deviceId:a.deviceId,role:e.auth.role??n,token:e.auth.deviceToken,scopes:e.auth.scopes??[]}),this.backoffMs=800,this.opts.onHello?.(e)}).catch(e=>{let t=e instanceof iB?aB(e):null,i=e instanceof iB?Jz(e.details):{},s=i.recommendedNextStep===`retry_with_device_token`,c=i.canRetryWithDeviceToken===!0||s||t===Gz.AUTH_TOKEN_MISMATCH;!this.deviceTokenRetryBudgetUsed&&!o.authDeviceToken&&r&&a&&o.storedToken&&c&&sB(this.opts.url)&&(this.pendingDeviceTokenRetry=!0,this.deviceTokenRetryBudgetUsed=!0),e instanceof iB?this.pendingConnectError={code:e.gatewayCode,message:e.message,details:e.details}:this.pendingConnectError=void 0,o.canFallbackToShared&&a&&t===Gz.AUTH_DEVICE_TOKEN_MISMATCH&&LM({deviceId:a.deviceId,role:n}),this.ws?.close(cB,`connect failed`)})}handleMessage(e){let t;try{t=JSON.parse(e)}catch{return}let n=t;if(n.type===`event`){let e=t;if(e.event===`connect.challenge`){let t=e.payload,n=t&&typeof t.nonce==`string`?t.nonce:null;n&&(this.connectNonce=n,this.sendConnect());return}let n=typeof e.seq==`number`?e.seq:null;n!==null&&(this.lastSeq!==null&&n>this.lastSeq+1&&this.opts.onGap?.({expected:this.lastSeq+1,received:n}),this.lastSeq=n);try{this.opts.onEvent?.(e)}catch(e){console.error(`[gateway] event handler error:`,e)}return}if(n.type===`res`){let e=t,n=this.pending.get(e.id);if(!n)return;this.pending.delete(e.id),e.ok?n.resolve(e.payload):n.reject(new iB({code:e.error?.code??`UNAVAILABLE`,message:e.error?.message??`request failed`,details:e.error?.details}));return}}selectConnectAuth(e){let t=this.opts.token?.trim()||void 0,n=this.opts.password?.trim()||void 0,r=FM({deviceId:e.deviceId,role:e.role})?.token,i=this.pendingDeviceTokenRetry&&!!t&&!!r&&sB(this.opts.url),a=t||n?void 0:r??void 0;return{authToken:t??a,authDeviceToken:i?r??void 0:void 0,authPassword:n,resolvedDeviceToken:a,storedToken:r??void 0,canFallbackToShared:!!(r&&t)}}request(e,t){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return Promise.reject(Error(`gateway not connected`));let n=rB(),r={type:`req`,id:n,method:e,params:t},i=new Promise((e,t)=>{this.pending.set(n,{resolve:t=>e(t),reject:t})});return this.ws.send(JSON.stringify(r)),i}queueConnect(){this.connectNonce=null,this.connectSent=!1,this.connectTimer!==null&&window.clearTimeout(this.connectTimer),this.connectTimer=window.setTimeout(()=>{this.sendConnect()},750)}};function uB(e){return typeof e==`string`?e:e instanceof Error&&typeof e.message==`string`?e.message:`unknown error`}function dB(e){let t=uB(e.message);switch(aB(e)){case Gz.AUTH_TOKEN_MISMATCH:return`gateway token mismatch`;case Gz.AUTH_UNAUTHORIZED:return`gateway auth failed`;case Gz.AUTH_RATE_LIMITED:return`too many failed authentication attempts`;case Gz.PAIRING_REQUIRED:return`gateway pairing required`;case Gz.CONTROL_UI_DEVICE_IDENTITY_REQUIRED:return`device identity required (use HTTPS/localhost or allow insecure auth explicitly)`;case Gz.CONTROL_UI_ORIGIN_NOT_ALLOWED:return`origin not allowed (open the Control UI from the gateway host or allow it in gateway.controlUi.allowedOrigins)`;case Gz.AUTH_TOKEN_MISSING:return`gateway token missing`;default:break}let n=t.trim().toLowerCase();return n===`fetch failed`||n===`failed to fetch`||n===`connect failed`?`gateway connect failed`:t}function fB(e){return e&&typeof e==`object`?dB(e):uB(e)}var pB=/^\s*NO_REPLY\s*$/;function mB(e){return pB.test(e)}function hB(e){if(!e||typeof e!=`object`)return!1;let t=e;if((typeof t.role==`string`?t.role.toLowerCase():``)!==`assistant`)return!1;if(typeof t.text==`string`)return mB(t.text);let n=yF(e);return typeof n==`string`&&mB(n)}function gB(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(!n||typeof n!=`object`)continue;let r=n;if((typeof r.role==`string`?r.role.toLowerCase():``)!==`assistant`)continue;let i=r.__runLatency&&typeof r.__runLatency==`object`?r.__runLatency:null;return typeof i?.ttftMs==`number`||typeof i?.totalMs==`number`}return!1}function _B(e,t){if(!t)return e;for(let n=e.length-1;n>=0;--n){let r=e[n];if(!r||typeof r!=`object`)continue;let i=r;if((typeof i.role==`string`?i.role.toLowerCase():``)!==`assistant`)continue;let a=[...e];return a[n]={...i,__runLatency:{ttftMs:t.ttftMs,totalMs:t.totalMs}},a}return e}function vB(e){let t=e;t.toolStreamById instanceof Map&&Array.isArray(t.toolStreamOrder)&&Array.isArray(t.chatToolMessages)&&Array.isArray(t.chatStreamSegments)&&$R(t)}async function yB(e,t){if(!(!e.client||!e.connected)){e.chatLoading=!0,e.lastError=null;try{let n=await e.client.request(`chat.history`,{sessionKey:e.sessionKey,limit:200}),r=(Array.isArray(n.messages)?n.messages:[]).filter(e=>!hB(e));e.chatMessages=t?.preserveLastLatency&&!gB(r)?_B(r,e.lastLatency):r,e.chatThinkingLevel=n.thinkingLevel??null,vB(e),e.chatStream=null,e.chatStreamStartedAt=null,t?.preserveLastLatency&&!gB(r)||(e.lastLatency=null)}catch(t){e.lastError=String(t)}finally{e.chatLoading=!1}}}function bB(e){let t=/^data:([^;]+);base64,(.+)$/.exec(e);return t?{mimeType:t[1],content:t[2]}:null}function xB(e,t){if(!e||typeof e!=`object`)return null;let n=e,r=n.role;if(typeof r==`string`){if((t.roleCaseSensitive?r:r.toLowerCase())!==`assistant`)return null}else if(t.roleRequirement===`required`)return null;return t.requireContentArray?Array.isArray(n.content)?n:null:!(`content`in n)&&!(t.allowTextField&&`text`in n)?null:n}function SB(e){return xB(e,{roleRequirement:`required`,roleCaseSensitive:!0,requireContentArray:!0})}function CB(e){return xB(e,{roleRequirement:`optional`,allowTextField:!0})}async function wB(e,t,n,r){if(!e.client||!e.connected)return null;let i=t.trim(),a=n&&n.length>0;if(!i&&!a)return null;let o=Date.now(),s=[];if(i&&s.push({type:`text`,text:i}),a)for(let e of n)s.push({type:`image`,source:{type:`base64`,media_type:e.mimeType,data:e.dataUrl}});r?.optimisticUserMessage!==!1&&(e.chatMessages=[...e.chatMessages,{role:`user`,content:s,timestamp:o}]),e.chatSending=!0,e.lastError=null,e.lastLatency=null;let c=rB();e.chatRunId=c,e.chatStream=``,e.chatStreamStartedAt=o;let l=a?n.map(e=>{let t=bB(e.dataUrl);return t?{type:`image`,mimeType:t.mimeType,content:t.content}:null}).filter(e=>e!==null):void 0;try{return await e.client.request(`chat.send`,{sessionKey:e.sessionKey,message:i,deliver:!1,idempotencyKey:c,attachments:l,clientSentAt:o}),c}catch(t){let n=fB(t);return e.chatRunId=null,e.chatStream=null,e.chatStreamStartedAt=null,e.lastError=n,e.chatMessages=[...e.chatMessages,{role:`assistant`,content:[{type:`text`,text:`Error: `+n}],timestamp:Date.now()}],null}finally{e.chatSending=!1}}async function TB(e){if(!e.client||!e.connected)return!1;let t=e.chatRunId;try{return await e.client.request(`chat.abort`,t?{sessionKey:e.sessionKey,runId:t}:{sessionKey:e.sessionKey}),!0}catch(t){return e.lastError=fB(t),!1}}function EB(e,t){if(!t||t.sessionKey!==e.sessionKey)return null;if(t.runId&&e.chatRunId&&t.runId!==e.chatRunId){if(t.state===`final`){let n=CB(t.message);return n&&!hB(n)?(e.chatMessages=[...e.chatMessages,n],null):`final`}return null}if(t.state===`delta`){t.retract&&(e.chatStream=null);let n=yF(t.message);if(typeof n==`string`&&!mB(n)){let t=e.chatStream??``;(!t||n.length>=t.length)&&(e.chatStream=n)}t.firstTokenAt!=null&&e.chatStreamStartedAt!=null&&!e.lastLatency&&(e.lastLatency={ttftMs:t.firstTokenAt-e.chatStreamStartedAt,totalMs:null})}else if(t.state===`final`){let n=CB(t.message),r=e.chatStreamStartedAt==null?null:{ttftMs:t.firstTokenAt==null?null:t.firstTokenAt-e.chatStreamStartedAt,totalMs:t.endedAt==null?null:t.endedAt-e.chatStreamStartedAt};if(n&&!hB(n))r&&(n.__runLatency=r),e.chatMessages=[...e.chatMessages,n];else if(e.chatStream?.trim()&&!mB(e.chatStream)){let t={role:`assistant`,content:[{type:`text`,text:e.chatStream}],timestamp:Date.now()};r&&(t.__runLatency=r),e.chatMessages=[...e.chatMessages,t]}e.lastLatency=r,e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null}else if(t.state===`aborted`){let n=SB(t.message);if(n&&!hB(n))e.chatMessages=[...e.chatMessages,n];else{let t=e.chatStream??``;t.trim()&&!mB(t)&&(e.chatMessages=[...e.chatMessages,{role:`assistant`,content:[{type:`text`,text:t}],timestamp:Date.now()}])}e.chatStreamStartedAt!=null&&(e.lastLatency={ttftMs:e.lastLatency?.ttftMs??null,totalMs:Date.now()-e.chatStreamStartedAt}),e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null}else t.state===`error`&&(e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null,e.lastError=t.errorMessage??`chat error`);return t.state}async function DB(e){try{return(await e.request(`models.list`,{}))?.models??[]}catch{return[]}}var OB=`/new`,kB=new Set;function AB(e){return e.chatSending||!!e.chatRunId}function jB(e){return!e.connected||e.tab!=null&&e.tab!==`chat`||e.chatLoading||e.chatSending||e.chatRunId||(e.chatQueue?.length??0)>0||e.chatMessages.length>0?!1:!e.chatStream?.trim()}async function MB(e,t){e.chatLoading=!0;try{await yB(e,t)}finally{e.chatLoading=!1}let n=e.sessionKey;if(n){if(e.chatMessages.length>0){kB.delete(n);return}if(jB(e)&&!kB.has(n)){if(kB.add(n),!await wB(e,OB,void 0,{optimisticUserMessage:!1})){kB.delete(n);return}TR(e,n)}}}async function NB(e){e.connected&&(e.chatMessage=``,await TB(e))}async function PB(e,t,n){$R(e),ZA(e);let r=await wB(e,t,n?.attachments),i=!!r;return!i&&n?.previousDraft!=null&&(e.chatMessage=n.previousDraft),!i&&n?.previousAttachments&&(e.chatAttachments=n.previousAttachments),i&&TR(e,e.sessionKey),i&&n?.restoreDraft&&n.previousDraft?.trim()&&(e.chatMessage=n.previousDraft),i&&n?.restoreAttachments&&n.previousAttachments?.length&&(e.chatAttachments=n.previousAttachments),YA(e,!0),i&&!e.chatRunId&&FB(e),i&&n?.refreshSessions&&r&&e.refreshSessionsAfterChat.add(r),i}async function FB(e){if(!e.connected||AB(e))return;let[t,...n]=e.chatQueue;if(!t)return;e.chatQueue=n;let r=!1;try{t.localCommandName?(await IB(e,t.localCommandName,t.localCommandArgs??``),r=!0):r=await PB(e,t.text,{attachments:t.attachments,refreshSessions:t.refreshSessions})}catch(t){e.lastError=String(t)}r?e.chatQueue.length>0&&FB(e):e.chatQueue=[t,...e.chatQueue]}async function IB(e,t,n,r){switch(t){case`stop`:await NB(e);return;case`new`:await PB(e,`/new`,{refreshSessions:!0,previousDraft:r?.previousDraft,restoreDraft:r?.restoreDraft});return;case`reset`:await PB(e,`/reset`,{refreshSessions:!0,previousDraft:r?.previousDraft,restoreDraft:r?.restoreDraft});return;case`clear`:await LB(e);return;case`focus`:e.onSlashAction?.(`toggle-focus`);return;case`export`:e.onSlashAction?.(`export`);return}if(!e.client)return;let i=e.sessionKey,a=await Cz(e.client,i,t,n);a.content&&RB(e,a.content),a.sessionPatch&&`modelOverride`in a.sessionPatch&&(e.chatModelOverrides={...e.chatModelOverrides,[i]:a.sessionPatch.modelOverride??null}),a.action===`refresh`&&await zB(e),YA(e)}async function LB(e){if(!(!e.client||!e.connected)){try{await e.client.request(`sessions.reset`,{key:e.sessionKey}),e.chatMessages=[],e.chatStream=null,e.chatRunId=null,await MB(e)}catch(t){e.lastError=String(t)}YA(e)}}function RB(e,t){e.chatMessages=[...e.chatMessages,{role:`system`,content:t,timestamp:Date.now()}]}async function zB(e,t){await Promise.all([MB(e),aP(e,{activeMinutes:0,limit:0,includeGlobal:!0,includeUnknown:!0}),WB(e),BB(e)]),t?.scheduleScroll!==!1&&YA(e)}async function BB(e){if(!e.client||!e.connected){e.chatModelsLoading=!1,e.chatModelCatalog=[];return}e.chatModelsLoading=!0;try{e.chatModelCatalog=await DB(e.client)}finally{e.chatModelsLoading=!1}}var VB=FB;function HB(e){let t=GA(e.sessionKey);return t?.agentId?t.agentId:(e.hello?.snapshot)?.sessionDefaults?.defaultAgentId?.trim()||`main`}function UB(e,t){let n=NP(e),r=encodeURIComponent(t);return n?`${n}/avatar/${r}?meta=1`:`avatar/${r}?meta=1`}async function WB(e){if(!e.connected){e.chatAvatarUrl=null;return}let t=HB(e);if(!t){e.chatAvatarUrl=null;return}e.chatAvatarUrl=null;let n=UB(e.basePath,t);try{let t=await fetch(n,{method:`GET`});if(!t.ok){e.chatAvatarUrl=null;return}let r=await t.json();e.chatAvatarUrl=(typeof r.avatarUrl==`string`?r.avatarUrl.trim():``)||null}catch{e.chatAvatarUrl=null}}function GB(e){if(!e||e.state!==`final`)return!1;if(!e.message||typeof e.message!=`object`)return!0;let t=e.message,n=typeof t.role==`string`?t.role.toLowerCase():``;return!!(n&&n!==`assistant`)}function KB(e,t){if(typeof e!=`string`)return;let n=e.trim();if(n)return n.length<=t?n:n.slice(0,t)}var qB=50,JB=200;function YB(e){let t=KB(e?.name,qB)??`Assistant`,n=KB(e?.avatar??void 0,JB)??null;return{agentId:typeof e?.agentId==`string`&&e.agentId.trim()?e.agentId.trim():null,name:t,avatar:n}}async function XB(e,t){if(!e.client||!e.connected)return;let n=t?.sessionKey?.trim()||e.sessionKey.trim(),r=n?{sessionKey:n}:{};try{let t=await e.client.request(`agent.identity.get`,r);if(!t)return;let n=YB(t);e.assistantName=n.name,e.assistantAvatar=n.avatar,e.assistantAgentId=n.agentId??null}catch{}}function ZB(e){return typeof e==`object`&&!!e}function QB(e){if(!ZB(e))return null;let t=typeof e.id==`string`?e.id.trim():``,n=e.request;if(!t||!ZB(n))return null;let r=typeof n.command==`string`?n.command.trim():``;if(!r)return null;let i=typeof e.createdAtMs==`number`?e.createdAtMs:0,a=typeof e.expiresAtMs==`number`?e.expiresAtMs:0;return!i||!a?null:{id:t,request:{command:r,cwd:typeof n.cwd==`string`?n.cwd:null,host:typeof n.host==`string`?n.host:null,security:typeof n.security==`string`?n.security:null,ask:typeof n.ask==`string`?n.ask:null,agentId:typeof n.agentId==`string`?n.agentId:null,resolvedPath:typeof n.resolvedPath==`string`?n.resolvedPath:null,sessionKey:typeof n.sessionKey==`string`?n.sessionKey:null},createdAtMs:i,expiresAtMs:a}}function $B(e){if(!ZB(e))return null;let t=typeof e.id==`string`?e.id.trim():``;return t?{id:t,decision:typeof e.decision==`string`?e.decision:null,resolvedBy:typeof e.resolvedBy==`string`?e.resolvedBy:null,ts:typeof e.ts==`number`?e.ts:null}:null}function eV(e){let t=Date.now();return e.filter(e=>e.expiresAtMs>t)}function tV(e,t){let n=eV(e).filter(e=>e.id!==t.id);return n.push(t),n}function nV(e,t){return eV(e).filter(e=>e.id!==t)}var rV={ok:!1,ts:0,durationMs:0,heartbeatSeconds:0,defaultAgentId:``,agents:[],sessions:{path:``,count:0,recent:[]}};async function iV(e){try{return await e.request(`health`,{})??rV}catch{return rV}}async function aV(e){if(!(!e.client||!e.connected)&&!e.healthLoading){e.healthLoading=!0,e.healthError=null;try{e.healthResult=await iV(e.client)}catch(t){e.healthError=String(t)}finally{e.healthLoading=!1}}}function oV(e,t){return`${e}::${t}`}async function sV(e,t,n){if(!e.client||!e.connected||!n?.force&&e.skillFilesLoading)return;e.skillFilesLoading=!0,e.skillFilesError=null;let r=null;try{let n=await e.client.request(`skills.files.list`,{skillKey:t});n&&(e.skillFilesLists={...e.skillFilesLists,[t]:n},!e.skillFilesActiveName&&n.files.length>0&&(e.skillFilesActiveName=n.files[0].name,r=n.files[0].name))}catch(t){e.skillFilesError=t instanceof Error?t.message:String(t)}finally{e.skillFilesLoading=!1}r&&await cV(e,t,r)}async function cV(e,t,n,r){if(!e.client||!e.connected||!r?.force&&e.skillFilesLoading)return;let i=oV(t,n);if(!(!r?.force&&Object.hasOwn(e.skillFilesContents,i))){e.skillFilesLoading=!0,e.skillFilesError=null;try{let r=await e.client.request(`skills.files.get`,{skillKey:t,name:n});if(r){let t=e.skillFilesContents[i],n=e.skillFilesDrafts[i];e.skillFilesContents={...e.skillFilesContents,[i]:r.content},(!Object.hasOwn(e.skillFilesDrafts,i)||n===t)&&(e.skillFilesDrafts={...e.skillFilesDrafts,[i]:r.content})}}catch(t){e.skillFilesError=t instanceof Error?t.message:String(t)}finally{e.skillFilesLoading=!1}}}var lV=`skill-creator`;async function uV(e){if(!(await e.request(`agents.list`,{})).agents.some(e=>e.id===lV))try{await e.request(`agents.create`,{name:lV,skills:[lV],templatePrefix:`SKILL_`})}catch{}}function dV(e){return/^(?:typeerror:\s*)?(?:fetch failed|failed to fetch)$/i.test(e.trim())}function fV(e){let t=e.serverVersion?.trim();if(!t)return;let n=e.pageUrl??(typeof window>`u`?void 0:window.location.href);if(n)try{let r=new URL(n),i=new URL(e.gatewayUrl,r);return!new Set([`ws:`,`wss:`,`http:`,`https:`]).has(i.protocol)||i.host!==r.host?void 0:t}catch{return}}function pV(e,t){let n=(e??``).trim(),r=t.mainSessionKey?.trim();if(!r)return n;if(!n)return r;let i=t.mainKey?.trim()||`main`,a=t.defaultAgentId?.trim();return n===`main`||n===i||a&&(n===`agent:${a}:main`||n===`agent:${a}:${i}`)?r:n}function mV(e,t){if(!t?.mainSessionKey)return;let n=e.userPhone&&/^\d{7,15}$/.test(e.userPhone)?`agent:phone-${e.userPhone}:webchat`:null;if(n){e.sessionKey!==n&&(e.sessionKey=n);return}let r=pV(e.sessionKey,t),i=pV(e.settings.sessionKey,t),a=pV(e.settings.lastActiveSessionKey,t),o=r||i||e.sessionKey,s={...e.settings,sessionKey:i||o,lastActiveSessionKey:a||o},c=s.sessionKey!==e.settings.sessionKey||s.lastActiveSessionKey!==e.settings.lastActiveSessionKey;o!==e.sessionKey&&(e.sessionKey=o),c&&wR(e,s)}function hV(e){let t=e;t.pendingShutdownMessage=null,e.lastError=null,e.lastErrorCode=null,e.hello=null,e.connected=!1,e.execApprovalQueue=[],e.execApprovalError=null;let n=e.client,r=fV({gatewayUrl:e.settings.gatewayUrl,serverVersion:e.serverVersion}),i=new lB({url:e.settings.gatewayUrl,token:e.settings.token.trim()?e.settings.token:void 0,password:e.password.trim()?e.password:void 0,clientName:`openclaw-control-ui`,clientVersion:r,mode:`webchat`,instanceId:e.clientInstanceId,phone:e.userPhone??void 0,onHello:n=>{e.client===i&&(t.pendingShutdownMessage=null,e.connected=!0,e.lastError=null,e.lastErrorCode=null,e.hello=n,xV(e,n),e.chatRunId=null,e.chatStream=null,e.chatStreamStartedAt=null,$R(e),XB(e),Pj(e),aV(e),hj(e,{quiet:!0}),eP(e,{quiet:!0}),DR(e),(async()=>{e.userPhone&&await i.request(`user.provision`,{}).catch(()=>{}),await uV(i)})())},onClose:({code:n,reason:r,error:a})=>{if(e.client===i)if(e.connected=!1,e.lastErrorCode=aB(a)??(typeof a?.code==`string`?a.code:null),n!==1012){if(a?.message){e.lastError=e.lastErrorCode&&dV(a.message)?fB({message:a.message,details:a.details,code:a.code}):a.message;return}e.lastError=t.pendingShutdownMessage??`disconnected (${n}): ${r||`no reason`}`}else e.lastError=t.pendingShutdownMessage??null,e.lastErrorCode=null},onEvent:t=>{e.client===i&&gV(e,t)},onGap:({expected:t,received:n})=>{e.client===i&&(e.lastError=`event gap detected (expected seq ${t}, got ${n}); refresh recommended`,e.lastErrorCode=null)}});e.client=i,n?.stop(),i.start()}function gV(e,t){try{bV(e,t)}catch(e){console.error(`[gateway] handleGatewayEvent error:`,t.event,e)}}function _V(e,t,n){if(n!==`final`&&n!==`error`&&n!==`aborted`)return!1;let r=e,i=r.toolStreamOrder.length>0;$R(r),VB(e);let a=t?.runId;return a&&e.refreshSessionsAfterChat.has(a)&&(e.refreshSessionsAfterChat.delete(a),n===`final`&&aP(e,{activeMinutes:120})),i&&n===`final`?(MB(e,{preserveLastLatency:!0}),!0):!1}function vV(e,t){if(!(!e.skillAiChatRunId&&t.state!==`delta`))if(t.state===`delta`){let n=yF(t.message);typeof n==`string`&&(e.skillAiChatStream=n)}else if(t.state===`final`){if(t.runId&&t.runId!==e.skillAiChatRunId)return;let n=t.message;if(n&&typeof n==`object`){let t=n;typeof t.role==`string`&&t.role.toLowerCase()===`assistant`&&(e.skillAiChatMessages=[...e.skillAiChatMessages,t])}else e.skillAiChatStream?.trim()&&(e.skillAiChatMessages=[...e.skillAiChatMessages,{role:`assistant`,content:[{type:`text`,text:e.skillAiChatStream}],timestamp:Date.now()}]);e.skillAiChatStream=null,e.skillAiChatRunId=null,e.skillAiChatStreamStartedAt=null,e.skillAiChatSending=!1,e.skillAiBuilderBuilding=!1;let r=e.skillAiBuilderSkillKey,i=new Set(e.skillsReport?.skills.filter(e=>e.source===`openclaw-managed`&&!e.bundled).map(e=>e.skillKey)??[]);(async()=>{await lP(e);let t=e.skillAiBuilderSkillKey??r;if(r&&!e.skillsReport?.skills.some(e=>e.skillKey===r)){let n=(e.skillsReport?.skills??[]).filter(e=>e.source===`openclaw-managed`&&!e.bundled&&!i.has(e.skillKey)).map(e=>e.skillKey);n.length===1&&(e.skillAiBuilderSkillKey=n[0],e.skillFilesActiveKey===r&&(e.skillFilesActiveKey=n[0]),t=n[0])}t&&await sV(e,t,{force:!0})})()}else (t.state===`aborted`||t.state===`error`)&&(e.skillAiChatStream=null,e.skillAiChatRunId=null,e.skillAiChatStreamStartedAt=null,e.skillAiChatSending=!1,e.skillAiBuilderBuilding=!1)}function yV(e,t){t?.sessionKey&&TR(e,t.sessionKey);let n=e;if(n.skillAiBuilderMode&&n.skillAiBuilderSkillKey&&t){let e=t.sessionKey===`agent:skill-creator:${n.skillAiBuilderSkillKey}`,r=!!n.skillAiChatRunId&&t.runId===n.skillAiChatRunId;if(e||r){vV(n,t);return}}let r=EB(e,t),i=_V(e,t,r);r===`final`&&!i&&GB(t)&&MB(e)}function bV(e,t){if(e.eventLogBuffer=[{ts:Date.now(),event:t.event,payload:t.payload},...e.eventLogBuffer].slice(0,250),(e.tab===`debug`||e.tab===`overview`)&&(e.eventLog=e.eventLogBuffer),t.event===`agent`){if(e.onboarding)return;let n=t.payload;if(n?.stream===`tool`){let t=e,r=n.sessionKey,i=!!r&&t.skillAiBuilderSkillKey!=null&&r===`agent:skill-creator:${t.skillAiBuilderSkillKey}`,a=!!t.skillAiChatRunId&&n.runId===t.skillAiChatRunId;if(t.skillAiBuilderMode&&(i||a)){let e=n.data??{},r=typeof e.toolCallId==`string`?e.toolCallId:``,i=typeof e.name==`string`?e.name:`tool`,a=typeof e.phase==`string`?e.phase:``;if(r){let e=t.skillAiToolCalls??[];e.find(e=>e.toolCallId===r)?a===`result`&&(t.skillAiToolCalls=e.map(e=>e.toolCallId===r?{...e,phase:`done`}:e)):t.skillAiToolCalls=[...e,{toolCallId:r,name:i,phase:`pending`}]}return}}az(e,n);return}if(t.event===`chat`){yV(e,t.payload);return}if(t.event===`presence`){let n=t.payload;n?.presence&&Array.isArray(n.presence)&&(e.presenceEntries=n.presence,e.presenceError=null,e.presenceStatus=null);return}if(t.event===`shutdown`){let n=t.payload,r=n&&typeof n.reason==`string`&&n.reason.trim()?n.reason.trim():`gateway stopping`,i=typeof n?.restartExpectedMs==`number`?`Restarting: ${r}`:`Disconnected: ${r}`;e.pendingShutdownMessage=i,e.lastError=i,e.lastErrorCode=null;return}if(t.event===`cron`&&e.tab===`cron`&&RR(e),(t.event===`device.pair.requested`||t.event===`device.pair.resolved`)&&eP(e,{quiet:!0}),t.event===`exec.approval.requested`){let n=QB(t.payload);if(n){e.execApprovalQueue=tV(e.execApprovalQueue,n),e.execApprovalError=null;let t=Math.max(0,n.expiresAtMs-Date.now()+500);window.setTimeout(()=>{e.execApprovalQueue=nV(e.execApprovalQueue,n.id)},t)}return}if(t.event===`exec.approval.resolved`){let n=$B(t.payload);n&&(e.execApprovalQueue=nV(e.execApprovalQueue,n.id));return}t.event===`update.available`&&(e.updateAvailable=t.payload?.updateAvailable??null)}function xV(e,t){let n=t.snapshot;n?.presence&&Array.isArray(n.presence)&&(e.presenceEntries=n.presence),n?.health&&(e.debugHealth=n.health,e.healthResult=n.health),n?.sessionDefaults&&mV(e,n.sessionDefaults),e.updateAvailable=n?.updateAvailable??null}var SV=`/__openclaw/control-ui-config.json`;async function CV(e){if(typeof window>`u`||typeof fetch!=`function`)return;let t=NP(e.basePath??``),n=t?`${t}${SV}`:SV;try{let t=await fetch(n,{method:`GET`,headers:{Accept:`application/json`},credentials:`same-origin`});if(!t.ok)return;let r=await t.json(),i=YB({agentId:r.assistantAgentId??null,name:r.assistantName,avatar:r.assistantAvatar??null});e.assistantName=i.name,e.assistantAvatar=i.avatar,e.assistantAgentId=i.agentId??null,e.serverVersion=r.serverVersion??null}catch{}}function wV(e){return e.replace(/^http:\/\//i,`ws://`).replace(/^https:\/\//i,`wss://`)}function TV(e,t){e.themeResolved=t;let n=t.endsWith(`light`)?`light`:`dark`;e.dataset.theme=t,e.dataset.themeMode=n,e.style.colorScheme=n}function EV(e){if(e.themeMode!==`system`){e.systemThemeCleanup?.(),e.systemThemeCleanup=null;return}if(e.systemThemeCleanup||typeof globalThis.matchMedia!=`function`)return;let t=globalThis.matchMedia(`(prefers-color-scheme: light)`),n=()=>{e.themeMode===`system`&&TV(e,UP(e.theme,`system`))};if(typeof t.addEventListener==`function`){t.addEventListener(`change`,n),e.systemThemeCleanup=()=>t.removeEventListener(`change`,n);return}try{t.addListener(n),e.systemThemeCleanup=()=>t.removeListener(n)}catch{}}function DV(e){e.theme=e.settings.theme??`dash`,e.themeMode=e.settings.themeMode??`system`,TV(e,UP(e.theme,e.themeMode)),EV(e)}function OV(e){if(!e.endpoint)return;let t=wV(e.endpoint);e.settings={...e.settings,gatewayUrl:t},e.token&&(rF(t,e.token),e.settings={...e.settings,token:e.token})}var kV=class extends bt{constructor(...e){super(...e),this.endpoint=``,this.token=``,this.theme=`dash`,this.clientInstanceId=rB(),this.connectGeneration=0,this.settings=aF(),this.connected=!1,this.hello=null,this.lastError=null,this.lastErrorCode=null,this.themeMode=`system`,this.themeResolved=`dash-dark`,this.themeOrder=[...LP],this.pendingGatewayUrl=null,this.systemThemeCleanup=null,this.pendingGatewayToken=null,this.basePath=``,this.client=null,this.password=``,this.serverVersion=null,this.assistantName=``,this.assistantAvatar=null,this.assistantAgentId=null,this.noUrlSync=!0,this.chatRunId=null,this.refreshSessionsAfterChat=new Set,this.eventLogBuffer=[],this.eventLog=[],this.presenceEntries=[],this.presenceError=null,this.presenceStatus=null,this.agentsLoading=!1,this.agentsList=null,this.agentsError=null,this.healthLoading=!1,this.healthResult=null,this.healthError=null,this.debugHealth=null,this.execApprovalQueue=[],this.execApprovalError=null,this.updateAvailable=null,this.gatewayBootstrapDone=!1}createRenderRoot(){return this}beforeGatewayConnectSetup(){}afterGatewayConnected(){}shouldReconnectOnPropChange(){return this.gatewayBootstrapDone}startEmbeddedGatewayConnection(){OV(this),this.settings={...this.settings,theme:this.theme},this.gatewayBootstrapDone=!1,++this.connectGeneration;let e=this.connectGeneration;DV(this),CV(this).finally(()=>{this.connectGeneration===e&&(this.gatewayBootstrapDone=!0,hV(this))})}stopEmbeddedGatewayConnection(){this.connectGeneration+=1,this.client?.stop(),this.client=null,this.connected=!1,OR(this)}handleEmbeddedGatewayUpdates(e){this.shouldReconnectOnPropChange()&&(e.has(`endpoint`)||e.has(`token`))&&(OV(this),this.endpoint&&hV(this)),e.has(`theme`)&&(this.settings={...this.settings,theme:this.theme},DV(this)),e.has(`connected`)&&this.connected&&this.afterGatewayConnected()}connectedCallback(){super.connectedCallback(),this.beforeGatewayConnectSetup(),this.startEmbeddedGatewayConnection()}disconnectedCallback(){super.disconnectedCallback(),this.stopEmbeddedGatewayConnection()}updated(e){super.updated(e),this.handleEmbeddedGatewayUpdates(e)}};Y([Jk({type:String})],kV.prototype,`endpoint`,void 0),Y([Jk({type:String})],kV.prototype,`token`,void 0),Y([Jk({type:String})],kV.prototype,`theme`,void 0),Y([J()],kV.prototype,`settings`,void 0),Y([J()],kV.prototype,`connected`,void 0),Y([J()],kV.prototype,`hello`,void 0),Y([J()],kV.prototype,`lastError`,void 0),Y([J()],kV.prototype,`lastErrorCode`,void 0),Y([J()],kV.prototype,`themeMode`,void 0),Y([J()],kV.prototype,`themeResolved`,void 0),Y([J()],kV.prototype,`themeOrder`,void 0),Y([J()],kV.prototype,`pendingGatewayUrl`,void 0),Y([J()],kV.prototype,`systemThemeCleanup`,void 0);function AV(e,t,n=`text/plain`){let r=new Blob([t],{type:n}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=e,a.click(),URL.revokeObjectURL(i)}var jV=class extends kV{constructor(...e){super(...e),this.sessionKey=`main`,this.tab=`apiManagement`,this.toolStreamById=new Map,this.toolStreamOrder=[],this.toolStreamSyncTimer=null,this.chatToolMessages=[],this.chatStreamSegments=[],this.chatStream=null,this.chatStreamStartedAt=null,this.apiDefinitionsLoading=!1,this.apiDefinitionsSaving=!1,this.apiDefinitionsExporting=!1,this.apiDefinitionsImporting=!1,this.apiDefinitionsError=null,this.apiDefinitionsSaveAttempted=!1,this.apiDefinitionsItems=[],this.apiDefinitionsQuery=``,this.apiDefinitionsHash=null,this.apiDefinitionsMode=`list`,this.apiDefinitionsEditingId=null,this.apiDefinitionsForm=l(),this.apiDefinitionsToast=null,this.apiDefinitionsDeleteConfirmItem=null,this.apiDefinitionsSelectedIds=[],this.apiDefinitionsDeleteConfirmItems=null}afterGatewayConnected(){p(this)}render(){let e=this.apiDefinitionsForm;return S`
1464
- <div class="keyueclaw-api-management-scope">
1456
+ <div class="keyueclaw-api-management-scope content--api">
1465
1457
  ${WA({loading:this.apiDefinitionsLoading,saving:this.apiDefinitionsSaving,exporting:this.apiDefinitionsExporting,importing:this.apiDefinitionsImporting,error:this.apiDefinitionsError,saveAttempted:this.apiDefinitionsSaveAttempted,mode:this.apiDefinitionsMode,query:this.apiDefinitionsQuery,items:this.apiDefinitionsItems,selectedIds:this.apiDefinitionsSelectedIds,form:e,onQueryChange:async e=>{this.apiDefinitionsQuery=e,await p(this)},onRefresh:()=>p(this),onCreate:()=>m(this),onEdit:e=>h(this,e),onDelete:e=>{this.apiDefinitionsDeleteConfirmItem=e},onExportAll:async()=>{let e=await le(this,{format:`json`,ids:this.apiDefinitionsSelectedIds.length>0?this.apiDefinitionsSelectedIds:void 0});e&&AV(e.filename,e.content,e.mimeType)},onExportOne:async e=>{let t=await le(this,{id:e.id,format:`json`});t&&AV(t.filename,t.content,t.mimeType)},onImport:e=>{de(this,e)},onToggleSelectAll:e=>{this.apiDefinitionsSelectedIds=e?this.apiDefinitionsItems.map(e=>e.id):[]},onToggleSelectOne:(e,t)=>{let n=new Set(this.apiDefinitionsSelectedIds);t?n.add(e):n.delete(e),this.apiDefinitionsSelectedIds=[...n]},onDeleteSelected:()=>{let e=this.apiDefinitionsItems.filter(e=>this.apiDefinitionsSelectedIds.includes(e.id));e.length>0&&(this.apiDefinitionsDeleteConfirmItems=e)},onCancelEdit:()=>{this.apiDefinitionsSaveAttempted=!1,g(this)},onFormPatch:e=>_(this,e),onSave:()=>{if(this.apiDefinitionsSaveAttempted=!0,!e.name.trim()||!e.url.trim())return;let t=e.headers.map(e=>e.name.trim().toLowerCase()).filter(Boolean),n=new Set(t);e.headers.some(e=>!!(e.name.trim()||e.description.trim()||(e.example??``).trim())&&(!e.name.trim()||!e.description.trim()))||n.size!==t.length||[...e.inputParams,...e.outputParams].some(e=>!e.name.trim()||!e.description.trim())||oe(this)},onAddHeader:()=>y(this),onAddInputParam:()=>v(this),onAddOutputParam:()=>b(this),onUpdateHeader:(e,t)=>ee(this,e,t),onUpdateInputParam:(e,t)=>te(this,e,t),onUpdateOutputParam:(e,t)=>ne(this,e,t),onRemoveHeader:e=>re(this,e),onRemoveInputParam:e=>ie(this,e),onRemoveOutputParam:e=>ae(this,e)})}
1466
1458
  ${this.renderDeleteConfirm()}
1467
1459
  ${this.renderDeleteSelectedConfirm()}