@kimiclaw/cli 1.0.42 → 1.0.44

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.
Files changed (90) hide show
  1. package/README.md +19 -21
  2. package/bin/dscode.exe +4 -0
  3. package/install.cjs +15 -0
  4. package/package.json +9 -9
  5. package/web/dist/assets/AssistantsView-Y4TXobGE.js +1 -0
  6. package/web/dist/assets/AutomationView-DfAF2L92.js +3 -0
  7. package/web/dist/assets/Button-D-g7PgYh.js +1 -0
  8. package/web/dist/assets/ChannelConfigView-WJ-zUV8p.js +12 -0
  9. package/web/dist/assets/ChartsView-CSAfGqTC.js +1 -0
  10. package/web/dist/assets/ConnectorsView-DaHmxnGE.js +2 -0
  11. package/web/dist/assets/{MessageBubble-CVGXupVH.js → DiffPreview-D8tIj_aF.js} +64 -67
  12. package/web/dist/assets/FileContextMenu-C5WYeBNu.js +1 -0
  13. package/web/dist/assets/FileTreeView-B7IN0KmE.js +1 -0
  14. package/web/dist/assets/HookConfigView-9gqvrRhQ.js +2 -0
  15. package/web/dist/assets/InboxView-BcEfijbj.js +1 -0
  16. package/web/dist/assets/InputArea-D5F91Uwk.js +14 -0
  17. package/web/dist/assets/Install-Cuelo0If.js +2 -0
  18. package/web/dist/assets/MemoryView-BvZSh5-T.js +1 -0
  19. package/web/dist/assets/ModelsView-BgvMN8xv.js +1 -0
  20. package/web/dist/assets/PluginsView-C3d6e8vV.js +1 -0
  21. package/web/dist/assets/ProjectsView-CM7GOsoK.js +1 -0
  22. package/web/dist/assets/SessionGrid-BQSrCDqQ.js +4 -0
  23. package/web/dist/assets/SettingsModal-BvGXq5EE.js +4 -0
  24. package/web/dist/assets/SkillsView-87kGRliE.js +1 -0
  25. package/web/dist/assets/TemplatesTab-8MLwVNwV.js +1 -0
  26. package/web/dist/assets/ToolsView-CjdYiaNz.js +1 -0
  27. package/web/dist/assets/{agentIconSet-B5GUQwel.js → agentIconSet-CDeMxTHf.js} +1 -1
  28. package/web/dist/assets/api-ZQf0Ys8y.js +1 -0
  29. package/web/dist/assets/channelMeta-BO645sjD.js +1 -0
  30. package/web/dist/assets/common-CPZxdYLs.js +304 -0
  31. package/web/dist/assets/icons-B8Ngx6rM.js +1 -0
  32. package/web/dist/assets/imageUrl-CrQM4gmf.js +74 -0
  33. package/web/dist/assets/index-Bm7r92T3.css +1 -0
  34. package/web/dist/assets/index-STsyoFCk.js +145 -0
  35. package/web/dist/assets/installDiagnosis-ZYUVgJIJ.js +3 -0
  36. package/web/dist/assets/{markdown-N5__3T-w.js → markdown-Cps-36Z5.js} +1 -1
  37. package/web/dist/assets/{panels-CIPgN61N.js → panels-DCwx2Pbu.js} +1 -1
  38. package/web/dist/assets/{react-vendor-CB4cLN-6.js → react-vendor-CXI113IS.js} +1 -1
  39. package/web/dist/assets/sessionKind-CZ1kQQII.js +1 -0
  40. package/web/dist/assets/{settingsStore-Xqln0d91.js → settingsStore-BSdi9gNd.js} +1 -1
  41. package/web/dist/assets/src-BK8SoTFV.js +1 -0
  42. package/web/dist/assets/{state-CSZ50keL.js → state-pOTP5BEk.js} +1 -1
  43. package/web/dist/assets/statusAxesRefresh--2evRuAU.js +1 -0
  44. package/web/dist/assets/sttLanguages-BPcOF0nQ.js +2 -0
  45. package/web/dist/assets/{types-JssxRFJn.js → threads-lr33dwqg.js} +1 -1
  46. package/web/dist/assets/useConfirm-CQjBnYuP.js +1 -0
  47. package/web/dist/assets/{useTranslation-B-mfApCn.js → useTranslation-gGKZZfux.js} +1 -1
  48. package/web/dist/assets/websocket-CeKJTCdp.js +1 -0
  49. package/web/dist/assets/whatsNewStore-C0hbStfc.js +1 -0
  50. package/web/dist/assets/{workspaceSemantics-RaIRer76.js → workspaceSemantics-CW8ytHq2.js} +3 -3
  51. package/web/dist/favicon.svg +31 -14
  52. package/web/dist/icons/icon-1024.png +0 -0
  53. package/web/dist/icons/icon-180.png +0 -0
  54. package/web/dist/icons/icon-192.png +0 -0
  55. package/web/dist/icons/icon-512.png +0 -0
  56. package/web/dist/icons/icon-maskable-512.png +0 -0
  57. package/web/dist/index.html +38 -35
  58. package/web/dist/logo.svg +42 -20
  59. package/web/dist/manifest.webmanifest +2 -2
  60. package/web/dist/assets/AssistantsView-Ct3BBpYf.js +0 -1
  61. package/web/dist/assets/AutomationView-CO-jVhee.js +0 -3
  62. package/web/dist/assets/ChannelConfigView-Ct1W584x.js +0 -8
  63. package/web/dist/assets/ChartsView-CAc37Sam.js +0 -1
  64. package/web/dist/assets/ConnectorsView-DP4bbh58.js +0 -1
  65. package/web/dist/assets/FileTreeView-DwsYfssO.js +0 -1
  66. package/web/dist/assets/HookConfigView-uFsqieii.js +0 -2
  67. package/web/dist/assets/InputArea-BY8quOiH.js +0 -14
  68. package/web/dist/assets/MemoryView-Bgd_lcTf.js +0 -1
  69. package/web/dist/assets/ModelsView-B271UV9L.js +0 -1
  70. package/web/dist/assets/PluginsView-Dz4fqQR1.js +0 -2
  71. package/web/dist/assets/ProjectsView-DF-YCV8y.js +0 -1
  72. package/web/dist/assets/SessionGrid-BIREstN2.js +0 -4
  73. package/web/dist/assets/SettingsModal-ZJeoZcCd.js +0 -4
  74. package/web/dist/assets/SkillsView-CH2ghYL2.js +0 -1
  75. package/web/dist/assets/TemplatesTab-BGe7_67s.js +0 -1
  76. package/web/dist/assets/ThreadsView-XditIHZ4.js +0 -2
  77. package/web/dist/assets/ToolsView-BBzsFdVZ.js +0 -1
  78. package/web/dist/assets/api-plEYhRn0.js +0 -1
  79. package/web/dist/assets/channelMeta-BGQXQxgj.js +0 -1
  80. package/web/dist/assets/common-Bbatsa0-.js +0 -192
  81. package/web/dist/assets/icons-CYDRRPKW.js +0 -1
  82. package/web/dist/assets/index-CTbLW314.js +0 -133
  83. package/web/dist/assets/index-DdzVrZye.css +0 -1
  84. package/web/dist/assets/src-49LUQhkG.js +0 -1
  85. package/web/dist/assets/sttLanguages-CSNMgUTz.js +0 -2
  86. package/web/dist/assets/ttsSettings-BwXYpDnk.js +0 -2
  87. package/web/dist/assets/useConfirm-Da8iQ_DZ.js +0 -1
  88. package/web/dist/assets/websocket-BnDwh01e.js +0 -1
  89. package/web/dist/assets/whatsNewStore-LpdLRLGl.js +0 -1
  90. /package/web/dist/assets/{MessageBubble-CCTRbIMZ.css → DiffPreview-CCTRbIMZ.css} +0 -0
@@ -1 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Kr as t,Ut as n,n as r}from"./icons-CYDRRPKW.js";import{t as i}from"./useTranslation-B-mfApCn.js";import{n as a}from"./state-CSZ50keL.js";import{I as o}from"./markdown-N5__3T-w.js";var s=4e3,c=new Map;function l(e,t){let n=c.get(e);n&&clearTimeout(n),!(t<=0)&&c.set(e,setTimeout(()=>{c.delete(e),u.setState(t=>({toasts:t.toasts.filter(t=>t.id!==e)}))},t))}var u=a(e=>({toasts:[],addToast:(t,n,r)=>{let i=r??s;e(e=>{let r=e.toasts.find(e=>e.type===t&&e.message===n);if(r)return l(r.id,i),{toasts:e.toasts.map(e=>e.id===r.id?{...e,count:e.count+1,createdAt:Date.now()}:e)};let a=`toast-${Date.now()}-${Math.random().toString(36).slice(2,7)}`;l(a,i);let o={id:a,type:t,message:n,duration:i,createdAt:Date.now(),count:1};return{toasts:[...e.toasts,o].slice(-10)}})},dismissToast:t=>{let n=c.get(t);n&&(clearTimeout(n),c.delete(t)),e(e=>({toasts:e.toasts.filter(e=>e.id!==t)}))},clearAll:()=>{for(let e of c.values())clearTimeout(e);c.clear(),e({toasts:[]})}})),d={info:(e,t)=>u.getState().addToast(`info`,e,t),success:(e,t)=>u.getState().addToast(`success`,e,t),warning:(e,t)=>u.getState().addToast(`warning`,e,t),error:(e,t)=>u.getState().addToast(`error`,e,t??6e3)},f=e(t(),1);function p(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`){if(Array.isArray(e)){var i=e.length;for(t=0;t<i;t++)e[t]&&(n=p(e[t]))&&(r&&(r+=` `),r+=n)}else for(n in e)e[n]&&(r&&(r+=` `),r+=n)}return r}function m(){for(var e,t,n=0,r=``,i=arguments.length;n<i;n++)(e=arguments[n])&&(t=p(e))&&(r&&(r+=` `),r+=t);return r}function h(...e){return m(e)}var g=20;function _(){if(typeof window>`u`||typeof getComputedStyle!=`function`)return 220;let e=getComputedStyle(document.documentElement).getPropertyValue(`--dur-base`).trim(),t=Number.parseFloat(e);return!Number.isFinite(t)||t<=0?220:(e.endsWith(`ms`)?t:t*1e3)+g}function v(e){let[t,n]=(0,f.useState)(e),[r,i]=(0,f.useState)(!1),a=(0,f.useRef)(e);return a.current!==e&&(a.current=e,e?(n(!0),i(!1)):t&&i(!0)),(0,f.useEffect)(()=>{if(!r)return;let e=window.setTimeout(()=>{i(!1),n(!1)},_());return()=>window.clearTimeout(e)},[r]),{visible:t,phase:r?`exit`:`enter`}}var y=o(),b={primary:`btn-primary`,accent:`btn-accent`,secondary:`btn-secondary`,ghost:`btn-ghost`,danger:`btn-danger`},x={sm:`btn-sm`,lg:`btn-lg`},S={sm:13,md:15,lg:17};function C({variant:e=`secondary`,size:t=`md`,shape:r=`default`,loading:i=!1,leftIcon:a,rightIcon:o,type:s=`button`,disabled:c,className:l,children:u,ref:d,...f}){return(0,y.jsxs)(`button`,{ref:d,type:s,disabled:c||i,"aria-busy":i||void 0,className:h(`btn`,b[e],t!==`md`&&x[t],r===`pill`&&`btn-pill`,l),...f,children:[i?(0,y.jsx)(n,{size:S[t],className:`shrink-0 animate-spin`,"aria-hidden":`true`}):a,u,!i&&o]})}var w=0,T=``;function E(){w===0&&(T=document.body.style.overflow),w+=1,document.body.style.overflow=`hidden`}function D(){w=Math.max(0,w-1),w===0&&(document.body.style.overflow=T)}var O=[];function k({isOpen:e,onClose:t,lockScroll:n=!0}){let r=(0,f.useRef)(t);(0,f.useEffect)(()=>{r.current=t}),(0,f.useEffect)(()=>{if(!e)return;let t=Symbol(`overlay`);O.push(t);let i=e=>{e.key===`Escape`&&O[O.length-1]===t&&(e.defaultPrevented||(e.preventDefault(),e.stopPropagation(),r.current()))};return document.addEventListener(`keydown`,i,!0),n&&E(),()=>{document.removeEventListener(`keydown`,i,!0);let e=O.indexOf(t);e>=0&&O.splice(e,1),n&&D()}},[e,n])}var A=`a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex="-1"])`;function j(e){let t=(0,f.useRef)(null);return(0,f.useEffect)(()=>{if(!e)return;let n=t.current;if(!n)return;let r=document.activeElement,i=()=>Array.from(n.querySelectorAll(A)),a=n.querySelector(`[data-modal-body]`);(n.querySelector(`[data-autofocus]`)??(a?a.querySelector(A):null)??i()[0]??n).focus();let o=e=>{if(e.key!==`Tab`)return;let t=i();if(t.length===0){e.preventDefault(),n.focus();return}let r=t[0],a=t[t.length-1],o=document.activeElement,s=o!==null&&n.contains(o);e.shiftKey?s&&o!==r||(e.preventDefault(),a.focus()):s&&o!==a||(e.preventDefault(),r.focus())};return document.addEventListener(`keydown`,o),()=>{document.removeEventListener(`keydown`,o),r&&typeof r.focus==`function`&&r.focus()}},[e]),t}function M({isOpen:e,onClose:t,title:n,children:i,size:a=`md`,className:o,bodyClassName:s=`p-6`}){k({isOpen:e,onClose:t});let{visible:c,phase:l}=v(e),u=(0,f.useId)(),d=j(c);return c?(0,y.jsxs)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center overflow-hidden p-4`,children:[(0,y.jsx)(`div`,{className:`absolute inset-0 ui-scrim ui-overlay-backdrop`,"data-phase":l,onClick:t}),(0,y.jsxs)(`div`,{ref:d,role:`dialog`,"aria-modal":`true`,"aria-labelledby":n?u:void 0,"data-phase":l,tabIndex:-1,className:h(`relative w-full mx-4 bg-dark-overlay ui-surface-overlay border border-dark-border rounded-xl shadow-pop ui-overlay-panel`,`max-h-[calc(100vh-2rem)] flex flex-col overflow-hidden`,{sm:`max-w-sm`,md:`max-w-md`,lg:`max-w-lg`,xl:`max-w-xl`,"2xl":`max-w-3xl`,"3xl":`max-w-5xl`}[a],o),children:[n&&(0,y.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between px-6 py-4 border-b border-dark-border`,children:[(0,y.jsx)(`h2`,{id:u,className:`text-lg font-semibold text-dark-text`,children:n}),(0,y.jsx)(`button`,{onClick:t,"aria-label":`Close`,className:`p-1 rounded-lg text-dark-muted hover:text-dark-text hover:bg-dark-hover transition-colors`,children:(0,y.jsx)(r,{className:`w-5 h-5`,"aria-hidden":`true`})})]}),(0,y.jsx)(`div`,{"data-modal-body":!0,className:h(`min-h-0 overflow-y-auto custom-scrollbar`,s),children:i})]})]}):null}function N({isOpen:e,onClose:t,onConfirm:n,title:r,message:a,confirmText:o,cancelText:s,variant:c=`default`}){let{t:l}=i();return(0,y.jsxs)(M,{isOpen:e,onClose:t,title:r??l(`common.confirm`),size:`sm`,children:[(0,y.jsx)(`p`,{className:`text-dark-muted mb-6`,children:a}),(0,y.jsxs)(`div`,{className:`flex gap-3 justify-end`,children:[(0,y.jsx)(C,{onClick:t,children:s??l(`common.cancel`)}),(0,y.jsx)(C,{variant:c===`danger`?`danger`:`accent`,onClick:()=>{n(),t()},children:o??l(`common.confirm`)})]})]})}function P(){let[e,t]=(0,f.useState)(null),n=(0,f.useRef)(null),r=(0,f.useCallback)(e=>{let r=n.current;n.current=null,t(null),r?.(e)},[]),i=(0,f.useCallback)(e=>{let r=n.current;return n.current=null,r?.(!1),new Promise(r=>{n.current=r,t(e)})},[]);return[e?(0,y.jsx)(N,{isOpen:!0,onClose:()=>r(!1),onConfirm:()=>r(!0),title:e.title,message:e.message,confirmText:e.confirmText,cancelText:e.cancelText,variant:e.variant}):null,i]}export{C as a,d as c,k as i,u as l,N as n,v as o,M as r,h as s,P as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./state-CSZ50keL.js";import"./src-49LUQhkG.js";var t=e()(e=>({serverVersion:null,protocolVersion:null,capabilities:[],setHelloAck:t=>e({serverVersion:t.serverVersion||null,protocolVersion:t.protocolVersion||null,capabilities:t.capabilities})}));function n(){return`err-${Date.now()}-${Math.random().toString(36).slice(2,7)}`}var r=e(e=>({errors:[],push:(t,r,i,a,o)=>{let s=``;return e(e=>{let c=e.errors.find(e=>!e.dismissed&&!e.action&&e.level===t&&e.title===r);if(c)return s=c.id,{errors:e.errors.map(e=>e.id===c.id?{...e,count:e.count+1,timestamp:Date.now()}:e)};let l=n();s=l;let u={id:l,level:t,title:r,detail:i,action:a,timestamp:Date.now(),dismissed:!1,durationMs:o,count:1};return{errors:[...e.errors.slice(-49),u]}}),s},dismiss:t=>e(e=>({errors:e.errors.map(e=>e.id===t?{...e,dismissed:!0}:e)})),clearAll:()=>e({errors:[]})})),i={info:(e,t,n)=>r.getState().push(`info`,e,t,void 0,n),warn:(e,t,n)=>r.getState().push(`warning`,e,t,void 0,n),error:(e,t,n)=>r.getState().push(`error`,e,t,void 0,n),critical:(e,t,n)=>r.getState().push(`critical`,e,t,void 0,n)},a=20,o=15e3,s=[500,1e3,2e3,5e3,1e4,o],c=3,l=`dscode_pending_frames`,u=new Set([`question_answer`,`hook_allow`,`hook_deny`,`form_answer`]);function d(){try{let e=localStorage.getItem(l);if(!e)return[];let t=JSON.parse(e);if(!Array.isArray(t))return[];let n=Date.now()-6e5;return t.filter(e=>!!e&&typeof e.type==`string`&&u.has(e.type)&&typeof e.queuedAt==`number`&&e.queuedAt>=n)}catch{return[]}}function f(e){try{localStorage.setItem(l,JSON.stringify(e.slice(-20)))}catch{}}var p=()=>{let e=window.location.protocol===`https:`?`wss:`:`ws:`,t=window.location.hostname,n=window.location.port,r=n?String(Number(n)+1):``;return`${e}//${r?`${t}:${r}`:t}/ws`},m=p(),h=`dscode_client_id`;function g(){try{let e=localStorage.getItem(h);if(e)return e;let t=`web-${typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():Math.random().toString(36).slice(2,10)}`;return localStorage.setItem(h,t),t}catch{return`web-${Math.random().toString(36).slice(2,10)}`}}var _=new class e{ws=null;url;clientId=g();messageHandlers=new Set;openHandlers=new Set;closeHandlers=new Set;errorHandlers=new Set;reconnectAttempts=0;reconnectHandlers=new Set;reconnectSuccessHandlers=new Set;reconnectGiveUpHandlers=new Set;isManualClose=!1;authenticated=!1;bfCached=!1;sessionId=null;visibleSessions=new Set;pendingFrames=d();heartbeatInterval=null;reconnectTimer=null;awaitingPong=0;HEARTBEAT_INTERVAL=15e3;MAX_MISSED_PONGS=3;static FOREGROUND_PROBE_TIMEOUT_MS=3e3;constructor(e){this.url=e||m,typeof window<`u`&&(window.addEventListener(`pagehide`,e=>{e.persisted&&this.enterBfCache()}),window.addEventListener(`pageshow`,e=>{e.persisted&&this.exitBfCache()}),window.addEventListener(`online`,()=>this.retryImmediately(`网络恢复`)),document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`&&this.probeOnForeground()}))}setSessionId(e){this.sessionId=e}setVisibleSessions(e){let t=new Set;for(let n of e)n&&t.add(n);if(t.size===this.visibleSessions.size){let e=!0;for(let n of t)if(!this.visibleSessions.has(n)){e=!1;break}if(e)return}this.visibleSessions=t,this.sendSubscribeSessions()}sendSubscribeSessions(){if(this.visibleSessions.size!==0&&this.ws?.readyState===WebSocket.OPEN)try{this.ws.send(JSON.stringify({type:`subscribe_sessions`,data:JSON.stringify({sessionIds:[...this.visibleSessions]})}))}catch{}}getSessionId(){return this.sessionId}getPendingFrameCount(){return this.pendingFrames.length}getPendingFrameIds(){return this.pendingFrames.map(e=>e.id||e.type).filter(Boolean)}clearPendingQueue(){this.pendingFrames=[],f([])}enqueueReliableFrame(e){let t=(()=>{try{return e.data?JSON.parse(e.data):{}}catch{return{}}})(),n={type:e.type,sessionId:e.sessionId,data:e.data,id:typeof t.questionId==`string`?t.questionId:typeof t.approvalId==`string`?t.approvalId:typeof t.formId==`string`?t.formId:void 0,queuedAt:Date.now()},r=n.id?this.pendingFrames.filter(e=>e.id!==n.id||e.type!==n.type):this.pendingFrames;this.pendingFrames=[...r,n].slice(-20),f(this.pendingFrames),console.warn(`[WS] reliable frame queued (awaiting ack) ${e.type}${n.id?` (${n.id})`:``}`)}ackReliableFrame(e){if(!e)return;let t=this.pendingFrames.filter(t=>t.id!==e);t.length!==this.pendingFrames.length&&(this.pendingFrames=t,f(t))}flushPendingFrames(){if(this.ws?.readyState!==WebSocket.OPEN)return;let e=d(),t=[...this.pendingFrames];for(let n of e){let e=t.findIndex(e=>e.id===n.id&&e.type===n.type);e>=0?t[e]=n:t.push(n)}if(t.length!==0){this.pendingFrames=t.slice(-20),f(this.pendingFrames);for(let e of this.pendingFrames){if(this.ws?.readyState!==WebSocket.OPEN)break;try{this.ws.send(JSON.stringify({type:e.type,sessionId:e.sessionId,data:e.data}))}catch(t){console.warn(`[WS] Failed to replay pending frame`,e.type,String(t));break}}}}getReconnectState(){return{attempts:this.reconnectAttempts,maxAttempts:a,reconnecting:this.reconnectAttempts>0&&this.ws?.readyState!==WebSocket.OPEN}}onReconnectAttempt(e){return this.reconnectHandlers.add(e),()=>this.reconnectHandlers.delete(e)}onReconnectSuccess(e){return this.reconnectSuccessHandlers.add(e),()=>this.reconnectSuccessHandlers.delete(e)}onReconnectGiveUp(e){return this.reconnectGiveUpHandlers.add(e),()=>this.reconnectGiveUpHandlers.delete(e)}connect(){if(this.ws?.readyState===WebSocket.OPEN||this.ws?.readyState===WebSocket.CONNECTING)return;this.isManualClose=!1;let e=new URLSearchParams;this.sessionId&&e.set(`sessionId`,this.sessionId),e.set(`clientId`,this.clientId);let t=e.toString()?`${this.url}?${e.toString()}`:this.url;this.ws=new WebSocket(t),this.ws.binaryType=`arraybuffer`,this.ws.onopen=()=>{let e=this.reconnectAttempts>0;if(this.reconnectAttempts=0,this.awaitingPong=0,e&&this.reconnectSuccessHandlers.forEach(e=>e()),this.ws?.readyState===WebSocket.OPEN)try{this.ws.send(JSON.stringify({type:`hello`,clientType:`web`,protocolVersion:1,capabilities:[]}))}catch{}this.startHeartbeat(),this.ws?.readyState===WebSocket.OPEN&&(this.awaitingPong=1,this.ws.send(JSON.stringify({type:`ping`}))),this.flushPendingFrames(),this.sendSubscribeSessions(),this.openHandlers.forEach(e=>e())},this.ws.onclose=()=>{this.stopHeartbeat(),this.closeHandlers.forEach(e=>e()),!this.isManualClose&&!this.bfCached&&this.scheduleReconnect()},this.ws.onerror=e=>{this.reportConnectionTrouble(e.message||`Connection failed`),this.errorHandlers.forEach(e=>e())},this.ws.onmessage=e=>{this._onMessage(e)}}async _onMessage(e){try{let n;if(n=e.data instanceof Blob?await e.data.text():e.data instanceof ArrayBuffer?new TextDecoder().decode(e.data):typeof e.data==`string`?e.data:String(e.data),n=n.trim(),!n)return;let r=JSON.parse(n);if((r.type===`pong`||r.type===`ping`)&&(this.awaitingPong=0,r.type===`pong`))return;if(r.type===`hello_ack`){try{let e=typeof r.data==`string`?JSON.parse(r.data):r.data;e&&typeof e==`object`&&t.getState().setHelloAck({serverVersion:typeof e.serverVersion==`string`?e.serverVersion:``,protocolVersion:typeof e.protocolVersion==`number`?e.protocolVersion:0,capabilities:Array.isArray(e.capabilities)?e.capabilities.filter(e=>typeof e==`string`):[]})}catch{}return}if(r.seq!==void 0&&r.seq>=0&&this.send({type:`message_ack`,data:JSON.stringify({seq:r.seq})}),r.type===`question_answer_ack`||r.type===`hook_response_ack`)try{let e=(typeof r.data==`string`?JSON.parse(r.data):r.data)||{};this.ackReliableFrame(typeof e.questionId==`string`?e.questionId:typeof e.approvalId==`string`?e.approvalId:void 0)}catch{}this.messageHandlers.forEach(e=>e(r))}catch(t){let n=e.data?.constructor?.name||typeof e.data,r;if(r=e.data instanceof Blob?`[Blob ${e.data.size} bytes]`:e.data instanceof ArrayBuffer?`[ArrayBuffer ${e.data.byteLength} bytes]`:String(e.data).slice(0,500),typeof e.data==`string`&&e.data.trim()){let t=e.data.trim();try{this.messageHandlers.forEach(e=>e({type:`log`,data:JSON.stringify({level:`info`,message:t})}));return}catch{}}i.error(`Failed to parse WebSocket message`,`type=${n} data=${r} error=${t}`)}}startHeartbeat(){this.stopHeartbeat(),this.awaitingPong=0,this.heartbeatInterval=setInterval(()=>{this.bfCached||(this.awaitingPong>=this.MAX_MISSED_PONGS?this.forceReconnect(`Heartbeat timeout (${this.awaitingPong} missed pongs)`):this.ws?.readyState===WebSocket.OPEN&&(this.awaitingPong+=1,this.send({type:`ping`})))},this.HEARTBEAT_INTERVAL)}stopHeartbeat(){this.heartbeatInterval&&=(clearInterval(this.heartbeatInterval),null),this.awaitingPong=0}enterBfCache(){this.bfCached=!0,this.stopHeartbeat(),this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),null)}exitBfCache(){this.bfCached=!1,this.reconnectAttempts=0,this.ws?.readyState!==WebSocket.OPEN&&this.ws?.readyState!==WebSocket.CONNECTING&&this.connect()}scheduleReconnect(){if(this.reconnectAttempts++,this.reconnectAttempts>a){console.error(`[WS] Max reconnect attempts (${a}) reached — giving up.`),i.error(`WebSocket`,`Connection lost — max reconnect attempts (${a}) reached. Refresh the page to try again.`),this.reconnectGiveUpHandlers.forEach(e=>e());return}let e=s[Math.min(this.reconnectAttempts-1,s.length-1)]??o,t=Math.max(100,Math.round(e*(.8+Math.random()*.4)));this.reconnectHandlers.forEach(e=>e(this.reconnectAttempts,a)),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}reportConnectionTrouble(e){let t=Math.min(this.reconnectAttempts+1,a);this.reconnectAttempts<c?console.debug(`[WS] connection error (attempt ${t}/${a}): ${e}`):i.warn(`WebSocket 连接不稳定`,`正在重连(第 ${t}/${a} 次):${e}`)}retryImmediately(e){if(this.bfCached)return;let t=this.ws?.readyState;t!==WebSocket.OPEN&&t!==WebSocket.CONNECTING&&(this.reconnectAttempts!==0||this.reconnectTimer!==null)&&(console.debug(`[WS] ${e} → 立即重连(重置退避)`),this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),null),this.reconnectAttempts=0,this.connect())}forceReconnect(e){console.warn(`[WS] ${e}, reconnecting...`),this.stopHeartbeat(),this.isManualClose=!0,this.ws?.close(),this.ws=null,this.scheduleReconnect()}probeOnForeground(){if(this.bfCached)return;let t=this.ws?.readyState;if(t===WebSocket.CONNECTING)return;if(t!==WebSocket.OPEN){this.retryImmediately(`标签页恢复可见`);return}if(this.awaitingPong<=0)return;this.awaitingPong+=1,this.send({type:`ping`});let n=this.awaitingPong;setTimeout(()=>{this.bfCached||this.ws?.readyState===WebSocket.OPEN&&this.awaitingPong>=n&&this.forceReconnect(`前台探活无应答(半开连接)`)},e.FOREGROUND_PROBE_TIMEOUT_MS)}disconnect(){this.isManualClose=!0,this.reconnectAttempts=0,this.stopHeartbeat(),this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),null),this.ws?.close(),this.ws=null}send(e){if(e.type&&u.has(e.type)){if(this.enqueueReliableFrame(e),this.ws?.readyState===WebSocket.OPEN)try{this.ws.send(JSON.stringify(e))}catch{}return!0}if(this.ws?.readyState===WebSocket.OPEN){let t=JSON.stringify(e);return this.ws.send(t),!0}return console.warn(`[WS] NOT CONNECTED — dropping:`,e.type,e.sessionId,`readyState=`,this.ws?.readyState),!1}onMessage(e){return this.messageHandlers.add(e),()=>this.messageHandlers.delete(e)}onOpen(e){return this.openHandlers.add(e),()=>this.openHandlers.delete(e)}onClose(e){return this.closeHandlers.add(e),()=>this.closeHandlers.delete(e)}onError(e){return this.errorHandlers.add(e),()=>this.errorHandlers.delete(e)}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}setToken(e){try{sessionStorage.setItem(`auth_token`,e)}catch{}}get isAuthenticated(){return this.authenticated}setAuthenticated(e){this.authenticated=e}};export{r as i,_ as n,i as r,p as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./state-CSZ50keL.js";var t=e(e=>({isOpen:!1,entries:null,openWhatsNew:t=>e({isOpen:!0,entries:t??null}),closeWhatsNew:()=>e({isOpen:!1})}));export{t};