k2-im 0.2.8 → 0.2.10

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.
@@ -1 +1 @@
1
- import{createChannelPinnedRuntime as e,createChannelApi as t,createChannelLegacyMessageRepair as r,isChannelHistoryBlocked as o,createChannelOperationsRuntime as n}from"../domains/channel.js";import{createContactApi as s}from"../domains/contact.js";import{createConversationsApi as a,createConversationInputResolver as i}from"../domains/conversation.js";import{createGroupPinnedRuntime as c,createGroupApi as d}from"../domains/group.js";import{createMediaUploadComputation as p}from"../domains/media-byte-computation.js";import{createMessageOperationsRuntime as l}from"../domains/message.js";import{createConnectionApi as u}from"../domains/session.js";import{createApplicationsRuntime as m}from"../product/applications.js";import{createDirectCallsApi as v}from"../product/calls.js";import{createChannelMentionCandidatesRuntime as y}from"../product/channel-mention-candidates.js";import{createConversationBackgroundRuntime as g}from"../product/conversation-background.js";import{createRobotConversationHandle as f,createCustomerServiceConversationHandle as h,createChannelConversationHandle as I,createGroupConversationHandle as w,createDirectConversationHandle as C,linkConversationHandleDomainAccess as b}from"../product/conversation-handle.js";import{createCustomerServiceApi as S,createCustomerServiceError as T}from"../product/customer-service.js";import{createSdkDiagnosticWriter as E,toImDiagnosticMessage as M}from"../product/diagnostics.js";import{createDirectoryRuntime as R}from"../product/directory.js";import{createDraftsRuntime as k}from"../product/draft.js";import{isImReactionEmojiToken as x}from"../product/emoji-catalog.js";import{createExpressionsRuntime as D}from"../product/expressions.js";import{createGroupCallsApi as P}from"../product/group-calls.js";import{createLocalDataRuntime as A}from"../product/local-data.js";import{createDefaultMediaAssetCacheStrategyRegistry as j,createMediaTasksRuntime as O}from"../product/media.js";import{createImSdkError as _}from"../product/message.js";import{fetchMessagesByIdWithCaseVariants as N}from"../product/messages-by-id.js";import{createOutboxRuntime as L}from"../product/outbox.js";import{createRobotDirectoryRuntime as K}from"../product/robots.js";import{createSearchRuntime as F}from"../product/search.js";import{createSessionFavoritesRuntime as U}from"../product/session-favorites.js";import{createImSettingsRuntime as B}from"../product/settings.js";import{createChannelReadSummaryRefresh as G}from"./channel-read-summary-refresh.js";import{createCustomerServiceLegacyRecovery as H}from"./customer-service-legacy-recovery.js";import{recordDecryptFailedDiagnostic as V}from"./decrypt-diagnostics.js";import{createForegroundWorkCoordinator as $}from"./foreground-work-coordinator.js";import{resolveGroupHistoryPageBoundary as q}from"./group-history-page-boundary.js";import{createKeyPrefetchQueue as W}from"./key-prefetch.js";import{createLocalMediaPreviewPreparation as z}from"./local-media-preview.js";import{createMediaCacheMaintenance as J}from"./media-cache-maintenance.js";import{createAccountMediaUploadRecovery as Q,createMediaOnlineWaiter as Y}from"./media-upload-recovery.js";import{inspectProtobufWireShape as X}from"./protobuf-wire-shape.js";import{createReceivingActivity as Z}from"./receiving-activity.js";import{createRecentHistoryFetcher as ee}from"./recent-history-fetcher.js";import{createRecentHistoryPrefetch as te}from"./recent-history-prefetch.js";import{createSessionHttpClients as re}from"./session-http-clients.js";import{createSignalOfflinePoller as oe}from"./signal-offline-poller.js";import{createWsTransport as ne}from"../../../im-browser/src/transport/ws-transport.js";import{createIndexedDbStorageAdapter as se,deleteIndexedDbNamespace as ae}from"../../../im-browser/src/storage/indexed-db-storage-adapter.js";import{createProfileHttpAdapter as ie}from"../../../im-browser/src/http/profile-http-adapter.js";import{createChannelHttpAdapter as ce,ChannelHttpError as de,ChannelProfileMappingError as pe}from"../../../im-browser/src/http/channel-http-adapter.js";import{createChannelMemberHttpAdapter as le}from"../../../im-browser/src/http/channel-member-http-adapter.js";import{createChannelMentionMemberHttpAdapter as ue}from"../../../im-browser/src/http/channel-mention-member-http-adapter.js";import{createDirectoryHttpAdapter as me}from"../../../im-browser/src/http/directory-http-adapter.js";import{createExpressionHttpAdapter as ve}from"../../../im-browser/src/http/expression-http-adapter.js";import{createSessionFavoriteHttpAdapter as ye}from"../../../im-browser/src/http/session-favorite-http-adapter.js";import{createChannelJoinApplicationHttpAdapter as ge}from"../../../im-browser/src/http/channel-join-application-http-adapter.js";import{createContactApplicationHttpAdapter as fe,createGroupApplicationHttpAdapter as he}from"../../../im-browser/src/http/application-http-adapters.js";import{createDomainState as Ie}from"../../../im-core/src/state/domain-state.js";import{encodeConversationKey as we}from"../../../im-core/src/conversation-identity.js";import{createNetworkMonitor as Ce}from"../../../im-browser/src/network/network-monitor.js";import{createCryptoTaskExecutor as be}from"../../../im-browser/src/crypto/crypto-task-executor.js";import{createMediaTransferAdapter as Se}from"../../../im-browser/src/media/media-transfer-adapter.js";import{createMediaPreviewPreparationExecutor as Te}from"../../../im-browser/src/media/media-preview-preparation-executor.js";import{createChannelKeyService as Ee}from"../../../im-browser/src/crypto/channel-key-service.js";import{createSendStrategyRegistry as Me}from"../../../im-core/src/message-flow/send/send-strategy-registry.js";import{createDirectSendStrategy as Re}from"../../../im-core/src/message-flow/send/direct-send-strategy.js";import{createGroupSendStrategy as ke}from"../../../im-core/src/message-flow/send/group-send-strategy.js";import{createChannelSendStrategy as xe}from"../../../im-core/src/message-flow/send/channel-send-strategy.js";import{createRobotSendStrategy as De}from"../../../im-core/src/message-flow/send/robot-send-strategy.js";import{createRecallStrategyRegistry as Pe,createDirectRecallStrategy as Ae,createGroupRecallStrategy as je,createChannelRecallStrategy as Oe}from"../../../im-core/src/message-flow/recall/recall-strategy.js";import{createEditStrategyRegistry as _e,createDirectEditStrategy as Ne,createGroupEditStrategy as Le,createChannelEditStrategy as Ke}from"../../../im-core/src/message-flow/edit/edit-strategy.js";import{createReactionReceiveHandlers as Fe}from"../../../im-core/src/message-flow/reaction/reaction-receive-handlers.js";import{createGroupReceiveHandlers as Ue}from"../../../im-core/src/message-flow/receive/group-receive-handlers.js";import{createChannelReceiveHandlers as Be}from"../../../im-core/src/message-flow/receive/channel-receive-handlers.js";import{createRobotReceiveHandlers as Ge}from"../../../im-core/src/message-flow/receive/robot-receive-handlers.js";import{createChannelNotifyReceiveHandlers as He}from"../../../im-core/src/message-flow/receive/channel-notify-receive-handlers.js";import{createChannelApplicationReceiveHandlers as Ve}from"../../../im-core/src/message-flow/receive/channel-application-receive-handlers.js";import{createSessionFavoriteReceiveHandlers as $e}from"../../../im-core/src/message-flow/receive/session-favorite-receive-handlers.js";import{createFriendActionReceiveHandlers as qe}from"../../../im-core/src/message-flow/receive/friend-action-receive-handlers.js";import{createWalletNotifyReceiveHandlers as We}from"../../../im-core/src/message-flow/receive/wallet-notify-receive-handlers.js";import{createContactApplicationReceiveHandlers as ze}from"../../../im-core/src/message-flow/receive/contact-application-receive-handlers.js";import{createContactApplicationAnswerReceiveHandlers as Je}from"../../../im-core/src/message-flow/receive/contact-application-answer-receive-handlers.js";import{createDirectCallManager as Qe}from"../../../im-core/src/message-flow/call/direct-call-manager.js";import{createGroupCallManager as Ye}from"../../../im-core/src/message-flow/call/group-call-manager.js";import{createGroupEventReceiveHandlers as Xe}from"../../../im-core/src/message-flow/receive/group-event-receive-handlers.js";import{createChannelReadReceiveHandlers as Ze}from"../../../im-core/src/message-flow/read/channel-read-receive-handlers.js";import{createReadStrategyRegistry as et}from"../../../im-core/src/message-flow/read/read-strategy.js";import{createPushRegistration as tt}from"../../../im-core/src/push/push-registration.js";import{createClientActivity as rt}from"../../../im-core/src/connection/client-activity.js";import{createImConnection as ot}from"../../../im-core/src/connection/connection-manager.js";import{createBrowserConnectionOwnership as nt}from"../../../im-browser/src/network/browser-connection-ownership.js";import{CmdId as st}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{createGroupRestrictionCoordinator as at}from"../../../im-core/src/state/group-restriction-coordinator.js";import{createChannelRestrictionCoordinator as it}from"../../../im-core/src/state/channel-restriction-coordinator.js";import{resolveMediaUploadPlan as ct}from"../../../im-browser/src/media/media-transfer-policy.js";import{resolveChannelAccess as dt}from"../../../im-core/src/state/channel-permissions.js";import{createGroupReadStrategy as pt}from"../../../im-core/src/message-flow/read/group-read-strategy.js";import{createRobotReadStrategy as lt}from"../../../im-core/src/message-flow/read/robot-read-strategy.js";import{createCustomerServiceReadStrategy as ut}from"../../../im-core/src/message-flow/read/customer-service-read-strategy.js";import{createMediaPreviewAdapter as mt}from"../../../im-browser/src/media/media-preview-adapter.js";import{isCryptoExecutionError as vt,CryptoExecutionError as yt}from"../../../im-core/src/ports/crypto-task-executor.js";import{createRsaTeaCryptoAdapter as gt}from"../../../im-browser/src/crypto/rsa-tea-crypto-adapter.js";import{createImDiagnosticLogger as ft}from"../../../im-core/src/diagnostics.js";import{createPeerPublicKeyService as ht}from"../../../im-browser/src/crypto/peer-public-key-service.js";import{getChannelSecretKey as It}from"../../../im-browser/src/http/requests/get-channel-secret-key.js";import{createEncryptKeyService as wt}from"../../../im-browser/src/crypto/encrypt-key-service.js";import{pullOfflineInboundChat as Ct,pullOfflineOwnerChat as bt,pullOfflineInboundChatBatch as St,pullOfflineOwnerChatBatch as Tt}from"../../../im-browser/src/http/requests/pull-offline-chat.js";import{createReactionManager as Et}from"../../../im-core/src/message-flow/reaction/reaction-manager.js";import{throwIfAborted as Mt}from"../../../im-core/src/abort.js";import{pullChannelMessageContext as Rt}from"../../../im-browser/src/http/requests/channel-message-context.js";import{pullGroupMessagesById as kt,pullDirectMessagesById as xt,pullChannelMessagesById as Dt}from"../../../im-browser/src/http/requests/pull-messages-by-id.js";import{createChannelReadStrategy as Pt}from"../../../im-core/src/message-flow/read/channel-read-strategy.js";import{createGroupKeyService as At}from"../../../im-browser/src/crypto/group-key-service.js";import{pullOfflineGroupSession as jt,pullGroupHistory as Ot,pullOfflineGroupBatch as _t}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{assertOfflineChatBatchComplete as Nt}from"../../../im-core/src/mapping/offline-mapper.js";import{createSyncManager as Lt}from"../../../im-core/src/sync/sync-manager.js";import{yieldToBrowser as Kt}from"../../../im-browser/src/scheduling/yield-to-browser.js";import{resolveGroupRestriction as Ft}from"../../../im-core/src/mapping/group-notify-mapper.js";import{bContentCodec as Ut,bMessageCodec as Bt}from"../../../im-protocol/src/protobuf/registry.js";import{mapIncomingChannelNotify as Gt}from"../../../im-core/src/mapping/channel-notify-mapper.js";import{recoverDecryptedMessage as Ht}from"../../../im-core/src/mapping/decrypt-recovery.js";import{isMessageEqual as Vt}from"../../../im-core/src/mapping/merge.js";import{pullChannelSessions as $t,pullChannelOfflineMessages as qt,pullChannelLatestPage as Wt,pullChannelHistory as zt}from"../../../im-browser/src/http/requests/pull-offline-channel.js";import{parseChannelSyncCheckpoint as Jt,channelSyncCheckpointKey as Qt}from"../../../im-core/src/sync/channel-sync-checkpoint.js";import{requestRobotMenuReply as Yt}from"../../../im-browser/src/http/requests/robot-menu-reply.js";import{mapIncomingRobotFixedChat as Xt}from"../../../im-core/src/mapping/robot-message-mapper.js";import{getRobotChatMenus as Zt,confirmRobotChat as er,getRobotProfile as tr}from"../../../im-browser/src/http/requests/robot-profile.js";import{unbindRobotFromConversation as rr,bindRobotToConversation as or}from"../../../im-browser/src/http/requests/bind-robot-conversation.js";import{searchRobots as nr}from"../../../im-browser/src/http/requests/search-robots.js";import{getCustomerServiceProfile as sr,downloadCustomerServiceFile as ar}from"../../../im-browser/src/http/requests/customer-service-profile.js";import{pullOfflineSignal as ir}from"../../../im-browser/src/http/requests/pull-offline-signal.js";import{updateChannelReadIndexes as cr}from"../../../im-browser/src/http/requests/channel-read-index.js";import{markGroupReadAll as dr}from"../../../im-browser/src/http/requests/mark-group-read-all.js";const pr=30;function lr(e,t){const r=Number(e);if(!Number.isSafeInteger(r)||r<0)throw new Error(`GROUP history cursor 非法(groupId=${t})`);return r}function ur(ur,mr,vr,yr=0){const gr=ur.clientType??2,fr={...ur.authProvider,getLoginContext:async()=>{const e=await ur.authProvider.getLoginContext();return null===e?null:{...e,clientType:gr}}};let hr="";const Ir=E(ur.debug,()=>({generation:yr,...""===hr?{}:{accountId:hr}}));let wr=!0;const Cr=ur.uploadRecovery?.enabled?Q(vr):void 0,br=Y(!1!==globalThis.navigator?.onLine),{coreClient:Sr,http:Tr}=re({coreClient:ur.coreClient,http:ur.http,authProvider:fr,endpointProvider:ur.endpointProvider,clientType:gr,isActive:()=>wr,onRequestError:ur.onRequestError,onHandlerError:e=>Ir.record("error","sdk","session","request-error-handler-failed",()=>({error:{message:"宿主请求错误处理器失败",data:e}}))}),Er=ur.transport??ne(),Mr=ur.adapters?.storage,Rr=void 0!==Mr?Mr.create({namespaceFactory:vr}):"undefined"==typeof indexedDB?void 0:se({namespaceFactory:vr,mediaAssetCache:{strategies:j()}}),kr=/* @__PURE__ */new Map,xr=/* @__PURE__ */new Map,Dr=/* @__PURE__ */new Map,Pr=/* @__PURE__ */new Map,Ar=/* @__PURE__ */new Map,jr=/* @__PURE__ */new Map,Or=e=>`${we(e.conversation)}\0${e.messageId}`;function _r(e,t){const r=we(e),o=(jr.get(r)??Promise.resolve()).then(t),n=o.then(()=>{},()=>{});return jr.set(r,n),n.then(()=>{jr.get(r)===n&&jr.delete(r)}),o}function Nr(e,t){return _r(e.conversation,async()=>{t()&&(await(Rr?.deleteDecryptRecovery?.(e.conversation,e.messageId)),t()&&(Ar.delete(Or(e)),Pr.delete(Or(e)),kr.delete(Or(e))))})}const Lr=e=>{const t=Rr?.saveDecryptRecovery;if(void 0===t)return;const r=Or(e),o=(Dr.get(r)??0)+1;Dr.set(r,o),Ar.delete(r),Pr.set(r,e);const n=we(e.conversation),s=xr.get(n)??0,a=()=>wr&&s===(xr.get(n)??0)&&o===Dr.get(r),i=_r(e.conversation,async()=>{a()&&await t(e)});kr.set(r,i),i.then(()=>{if(kr.get(r)===i&&kr.delete(r),a())return ns(e)}).catch(t=>mr.emit({type:"error",error:{scope:"storage",message:`保存解密恢复记录失败(conversationType=${e.conversation.conversationType}, messageId=${e.messageId})`,cause:t}}))};let Kr=!1;const Fr="object"==typeof(Ur=Rr)&&null!==Ur&&"get"in Ur&&"function"==typeof Ur.get&&"put"in Ur&&"function"==typeof Ur.put&&"clear"in Ur&&"function"==typeof Ur.clear?Rr:void 0;var Ur;const Br=g({...void 0===Rr?{}:{storage:Rr},...void 0===Sr?{}:{coreClient:Sr}});let Gr,Hr;const Vr=B({...void 0===Rr?{}:{storage:Rr},conversationBackgrounds:Br.api,onDirectReadReceiptDisabled:e=>Gr?.(e)});let $r=0;function qr(e){return $r+=1,`channel-${e}-${yr}-${$r}`}const Wr=ft(Ir),zr=(e,t,r=hr)=>{const o=t.fromId===r?t.toId:t.fromId;V(Ir,{conversation:{conversationType:"direct",conversationId:o},source:e,messageId:t.msgId,senderId:t.fromId,receiverId:t.toId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"direct-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Jr=(e,t)=>{V(Ir,{conversation:{conversationType:"group",conversationId:t.groupId},source:e,messageId:t.msgId,senderId:t.fromId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"group-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Qr=(e,t)=>{V(Ir,{conversation:{conversationType:"channel",conversationId:t.channelId},source:e,messageId:t.messageId,encrypt:t.encrypt,reason:t.reason,resolverSource:"channel-symmetric-key",endpoint:t.endpoint,surface:t.surface,decryptStage:t.decryptStage,keySource:t.keySource,keyByteLength:t.keyByteLength,payloadByteLength:t.payloadByteLength,...void 0===t.cipherDataByteLength?{}:{cipherDataByteLength:t.cipherDataByteLength},...void 0===t.decryptedByteLength?{}:{decryptedByteLength:t.decryptedByteLength},...void 0===t.forceRefreshAttempted?{}:{forceRefreshAttempted:t.forceRefreshAttempted},...void 0===t.clientTypeHeader?{}:{clientTypeHeader:t.clientTypeHeader},...void 0===t.clientTypeBody?{}:{clientTypeBody:t.clientTypeBody},...void 0===t.operationId?{}:{operationId:t.operationId},...void 0===t.cause?{}:{cause:t.cause}})},Yr=e=>{Ir.record("warn","sdk","protocol","channel-content-decode",()=>({conversation:{conversationType:"channel",conversationId:e.channelId},...void 0===e.operationId?{}:{operationId:e.operationId},data:{messageId:e.messageId,encrypt:e.encrypt,contentLength:e.contentLength,...void 0===e.endpoint?{}:{endpoint:e.endpoint},...void 0===e.surface?{}:{surface:e.surface},...void 0===e.clientTypeHeader?{}:{clientTypeHeader:e.clientTypeHeader},...void 0===e.clientTypeBody?{}:{clientTypeBody:e.clientTypeBody}},error:{message:"CHANNEL 消息正文解码失败",data:e.cause}}))};function Xr(e){return"left"===e||"removed"===e||"dismissed"===e}Ir.record("debug","sdk","session","runtime-created");let Zr="empty";const eo=mr.subscribe(e=>{if(wr)if("connection:changed"!==e.type)if("message:received"!==e.type&&"message:updated"!==e.type)if("auth:invalid"!==e.type){if("error"===e.type){const t="storage"===e.error.scope?"storage":"crypto"===e.error.scope?"crypto":"session";Ir.record("error","sdk",t,"runtime-error",()=>({error:{message:e.error.message,data:e.error.cause}}))}}else Ir.record("warn","sdk","session","auth-invalid",()=>({data:e.issue}));else Ir.record("trace","sdk","message",e.type,()=>({conversation:e.conversation,message:M(e.message),data:{source:e.source,channelLifecycleEffects:e.channelLifecycleEffects}}));else Ir.record("info","sdk","connection","connection-state-changed",()=>({data:{state:e.state}}))});function to(e){return e.cmdId===st.MES_CHAT_EDIT_MSG_C2C||e.cmdId===st.MES_GRPCHAT_EDIT_MSG_C2C||e.cmdId===st.MES_RADIO_EDIT_MSG_C2C}function ro(e,t){return Vt(e,{...e,body:t.body,contentType:t.contentType,encryption:t.encryption,edited:t.edited,recalled:t.recalled})}const oo=/* @__PURE__ */new Set;let no,so,ao,io,co,po,lo="auto",uo=!1,mo=!1,vo=0,yo=!1,go=()=>{},fo=null,ho=null;const Io=$(),wo=new AbortController,Co=/* @__PURE__ */new Set;let bo=0,So=!1;const To=Z(e=>mr.emit({type:"receiving:changed",receiving:e})),Eo=Z(e=>mr.emit({type:"syncing:changed",syncing:e}));let Mo,Ro,ko=!1;const xo=/* @__PURE__ */new Map,Do=/* @__PURE__ */new Map,Po=/* @__PURE__ */new Map,Ao=e=>Po.get(we(e))?.version??0;function jo(e,t){Po.set(we(e),{version:Ao(e)+1,...void 0===t?{}:{reason:t}})}let Oo=0;const _o=e=>xo.get(e)??0,No=e=>{xo.set(e,_o(e)+1)};function Lo(e,t){jo(e,t),po?.invalidate(e,{reason:t}),"channel"===e.conversationType&&No(e.conversationId),"group"===e.conversationType&&Do.set(e.conversationId,(Do.get(e.conversationId)??0)+1)}const Ko=ur.profile??(void 0===Sr?void 0:ie({client:Sr,clientType:gr,...void 0===Rr?{}:{storage:Rr}})),Fo=ur.channelProfile??(void 0===Sr?void 0:ce({client:Sr,clientType:gr,getUserId:async()=>{if(""!==hr)return hr;const e=await fr.getLoginContext();return e?.userId??""},...void 0===Rr?{}:{storage:Rr}})),Uo=ur.channelMembers??(void 0===Sr?void 0:le({client:Sr,clientType:gr,isActive:()=>wr,...void 0===Rr?{}:{storage:Rr}})),Bo=ur.channelMentionMembers??(void 0===Sr?void 0:ue({client:Sr,clientType:gr})),Go=y({...void 0===Bo?{}:{provider:Bo},...void 0===Rr?{}:{storage:Rr}}),Ho=ur.directory??(void 0===Sr?void 0:me({client:Sr,clientType:gr,getUserId:async()=>""!==hr?hr:(await fr.getLoginContext())?.userId??""})),Vo=R({...void 0===Ho?{}:{provider:Ho}});let $o;const qo=K({onProfileUpdated:function(e){Zo.updateConversationProfile({conversationType:"robot",conversationId:e.id},{title:e.displayName,avatar:e.avatarUrl??""})},...void 0===Sr?{}:{search:e=>nr(Sr,{...e,...void 0===gr?{}:{clientType:gr}}),bind:e=>or(Sr,{...e,...void 0===gr?{}:{clientType:gr}}),unbind:e=>rr(Sr,{...e,...void 0===gr?{}:{clientType:gr}}),getProfile:e=>tr(Sr,{...e,...void 0===gr?{}:{clientType:gr}}),confirmChat:e=>er(Sr,{robotId:e,...void 0===gr?{}:{clientType:gr}}),listChatMenus:e=>Zt(Sr,{robotId:e,...void 0===gr?{}:{clientType:gr}}),requestMenuReply:async e=>{const t=""!==hr?hr:(await fr.getLoginContext())?.userId??"";if(""===t)throw new Error("机器人指令回复缺少当前用户");const r=await Yt(Tr,{...e,userId:t});if(!wr)return;const o=Xt({robotId:e.robotId,userId:t,msgId:r.msgId,msgTime:r.msgTime,content:r.content},{selfId:t,keepRaw:!0});if(void 0!==o){if(void 0===$o)throw new Error("机器人指令回复尚未接入消息存储");await $o(o)}}}}),Wo=ur.expressionProvider??ve({...void 0===Sr?{}:{coreClient:Sr},...void 0===ur.expressions?.giphy?.apiKey?{}:{giphyApiKey:ur.expressions.giphy.apiKey}}),zo=D({provider:Wo,isActive:()=>wr}),Jo=ur.sessionFavoriteProvider??ye({...void 0===Sr?{}:{coreClient:Sr},getUserId:()=>hr}),Qo=ur.channelJoinApplications??(void 0===Sr?void 0:ge({client:Sr,clientType:gr})),Yo=ur.contactApplications??(void 0===Sr?void 0:fe({client:Sr,clientType:gr})),Xo=ur.groupApplications??(void 0===Sr?void 0:he({client:Sr,clientType:gr})),Zo=Ie({emitter:mr,diagnostics:Ir,profile:Ko,channelProfile:Fo,storage:Rr,getSelfId:()=>hr,loadOlderFromRemote:async e=>{const t=po?.enterForeground(e.conversation),r=Io.enterForeground(),o=To.begin();try{return void 0===co?{messages:[],exhausted:!0}:await co(e)}finally{o(),t?.(),r()}},loadNewerFromRemote:async e=>{const t=po?.enterForeground(e.conversation),r=Io.enterForeground(),o=To.begin();try{return void 0===Ro?{messages:[],exhausted:!0}:await Ro(e)}finally{o(),t?.(),r()}}}),en=S({download:async({messageId:e,itemIndex:t,signal:r})=>{const o=Zo.getConversationMessage({conversationType:"customerService",conversationId:"__customer_service__"},e),n=o?.body.customerService?.files[t];if(void 0===n)throw T({code:"IM_SDK_CUSTOMER_SERVICE_FILE_UNAVAILABLE",category:"state",operation:"customerService.downloadFile",retryable:!1});return await ar(n.url,r)},isActive:()=>wr,load:e=>void 0===Sr?Promise.reject(T({code:"IM_SDK_CORE_API_UNAVAILABLE",category:"contract",operation:"customerService.getProfile",retryable:!1})):sr(Sr,e),update:e=>Zo.updateConversationProfile({conversationType:"customerService",conversationId:"__customer_service__"},{title:e.displayName,avatar:e.avatarUrl})}),tn=en.api;let rn=()=>{};const on=A({namespaceFactory:vr,...void 0===Rr?{}:{storage:Rr},emitter:mr,getAccountId:()=>hr,isActive:()=>wr,clearMemoryCaches:()=>{en.clearCache(),Ko?.clearCache?.(),Fo?.clearCache?.(),Uo?.clearCache?.(),Go.clear(),rn(),po?.clear().catch(e=>mr.emit({type:"error",error:{scope:"storage",message:"清理最近历史缓存失败",cause:e}}))}});$o=e=>Zo.commitReceivedMessages([e],"live");const nn=U({provider:Jo,isActive:()=>wr,resolveMessage:async(e,t)=>Zo.getConversationMessage(e,t)??await(Rr?.getMessage(e,t))??void 0}),sn=mr.subscribe(e=>{if("message:removed"===e.type||"conversation-history:cleared"===e.type||"session:removed"===e.type){const t=we(e.conversation);if(xr.set(t,(xr.get(t)??0)+1),"message:removed"===e.type)Ar.delete(Or({conversation:e.conversation,messageId:e.messageId}));else for(const e of Ar.keys())e.startsWith(`${t}\0`)&&Ar.delete(e)}if(void 0!==Rr?.deleteDecryptRecovery)if("message:received"!==e.type&&"message:updated"!==e.type||!0===e.message.encryption.decryptFailed){if("message:removed"===e.type)Pr.delete(Or({conversation:e.conversation,messageId:e.messageId})),_r(e.conversation,()=>Rr.deleteDecryptRecovery(e.conversation,e.messageId)).catch(t=>mr.emit({type:"error",error:{scope:"storage",message:`删除消息密文记录失败(messageId=${e.messageId})`,cause:t}}));else if("conversation-history:cleared"===e.type){for(const[t,r]of Pr)we(r.conversation)===we(e.conversation)&&Pr.delete(t);_r(e.conversation,async()=>Rr.deleteConversationDecryptRecoveries?.(e.conversation)).catch(t=>mr.emit({type:"error",error:{scope:"storage",message:`清理会话密文记录失败(conversationId=${e.conversation.conversationId})`,cause:t}}))}}else{const t=we(e.conversation),r=xr.get(t)??0,o=Or({conversation:e.conversation,messageId:e.message.id}),n=Dr.get(o)??0,s=()=>wr&&r===(xr.get(t)??0)&&n===(Dr.get(o)??0);(async()=>{const t=(await(Rr.getDecryptRecoveries?.(e.conversation))??[]).find(t=>t.messageId===e.message.id);void 0!==t&&!to(t)&&s()&&(await Zo.commitReceivedMessages([e.message],"offline",{backfillOnly:!0}),await Nr(t,s))})().catch(t=>mr.emit({type:"error",error:{scope:"storage",message:`删除已恢复密文记录失败(messageId=${e.message.id})`,cause:t}}))}});const an=s({directory:Vo.contacts,getSelfId:()=>hr,...void 0===Ko?{}:{profile:{getUserProfile:Zo.readDirectProfile,...void 0===Ko.peekUserProfile?{}:{peekUserProfile:Ko.peekUserProfile.bind(Ko)}}},...void 0===Sr?{}:{coreClient:Sr},domainState:Zo,emitter:mr,terminateConversationSending:(e,t)=>go(e,t),resetDirectReadReceiptPreference:e=>Vr.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:(e,t)=>{"friend"===t?Hr?.(e):"unknown"!==t&&Gr?.(e)}}),cn=m({...void 0===Yo?{}:{contact:Yo},...void 0===Xo?{}:{group:Xo},...void 0===Qo?{}:{channel:Qo},onContactAccepted:async(e,t)=>{an.updateRelationshipFromEvent(e,"friend"),await Zo.reconcileDirectContactEstablishedNotice(e,`contact-application:${t}`),Zo.refreshConversationProfile(e,"direct")},emitter:mr,isActive:()=>wr&&"ready"===Zr}),dn=k({domainState:Zo,emitter:mr,isActive:()=>wr}),pn=F({domainState:Zo,isAvailable:()=>wr&&"ready"===Zr}),ln=i(()=>Zo.getSessions()),un=Ce({onHidden:()=>gn(!0),onVisible:()=>gn(!1),onPageHide:()=>gn(!0),onPageShow:()=>gn(!1)},ur.network),mn=ur.cryptoExecutorFactory?.(yr)??be({generation:yr,diagnostics:Ir,lifecycleAware:un.supportsLifecycle}),vn=p({executor:mn,generation:yr,isActive:()=>wr}),yn=ur.crypto??{...gt(),async encryptSymmetricChunked(e){try{return await vn(e)}catch(e){throw vt(e)&&wr&&mr.emit({type:"error",error:{scope:"crypto",message:"媒体加密计算失败",cause:e}}),e}}};function gn(e){mn.setSuspended(e)}function fn(e){!wr||e instanceof Error&&"AbortError"===e.name||mr.emit({type:"error",error:{scope:"crypto",message:"密钥计算失败",cause:e}})}const hn=void 0!==ur.media?Se(ur.media,Ir):void 0,In=Te(),wn=mt(In),{prepareLocalMediaPreview:Cn,prepareLocalVideoPoster:bn,prepareLocalImageThumbnail:Sn}=z(In,()=>yr),Tn=void 0===Sr?void 0:wt({client:Sr,crypto:yn,cryptoExecutor:mn,generation:yr,clientType:gr,onError:(e,t)=>Wr?.("crypto",{message:e,cause:t})}),En=void 0===Sr?void 0:ht({client:Sr,clientType:gr,onError:(e,t)=>Wr?.("crypto",{scope:"send-key",message:e,cause:t})}),Mn=void 0===Sr?void 0:At({client:Sr,crypto:yn,cryptoExecutor:mn,generation:yr,clientType:gr,onError:(e,t)=>Wr?.("crypto",{scope:"group-key",message:e,cause:t})}),Rn=ur.channelKeyService??(void 0===Sr?void 0:Ee({loadSecretKey:e=>It(Sr,{channelId:e,clientType:gr}),onError:(e,t)=>Wr?.("crypto",{scope:"channel-key",message:e,cause:t})})),kn=async(e,t={})=>{if(void 0===Rn)return;const r=null===Rn.getCachedChannelKey(e);try{await Rn.getChannelKey(e)}catch{return}if(!1!==t.recoverExistingMessages&&r&&wr)try{await as({conversationType:"channel",conversationId:e},{recoverLegacyWithoutSidecar:!1})}catch(t){mr.emit({type:"error",error:{scope:"storage",message:`CHANNEL key 就绪后读取解密恢复记录失败(channelId=${e})`,cause:t}})}},xn=async e=>void 0===Rn?null:Rn.getChannelKey(e),Dn=e=>{if(void 0===Rn)return null;const t=Rn.getCachedChannelKey(e);return null===t&&kn(e),t},Pn=()=>Tn?.getCachedPrivateKey(hr)?.privateKey??null,An=async(e,t={})=>{const r=[];void 0!==Rn&&r.push(...[...new Set(e)].map(e=>kn(e,t))),void 0!==Tn&&""!==hr&&r.push(Tn.getUserPrivateKey(hr,{priority:t.priority??"background",signal:t.signal??wo.signal})),await Promise.all(r)},jn=e=>({crypto:yn,resolveChannelKey:e=>Rn?.getCachedChannelKey(e)??null,resolveUserPrivateKey:Pn,onDecryptError:t=>Qr(e,t),onDecryptRecovery:Lr}),On=W({fetch:async e=>{await(Mn?.getGroupKeys(e,{priority:"background"}))},onError:fn});function _n(e){wr&&void 0!==Mn&&""!==e&&On.enqueue(e)}function Nn(){On.dispose(),un.stop(),Tn?.dispose(),Mn?.dispose(),mn.dispose()}const Ln=async e=>{if(void 0===Mn)return null;const t=await Mn.getGroupKeys(e);return null===t?null:{publicKey:t.publicKey,version:t.version}},Kn=e=>{if(void 0===Mn)return null;const t=Mn.getCachedGroupKeys(e);return null!==t?t.privateKey:(_n(e),null)},Fn=async(e,t={})=>{const r=t.signal??wo.signal;if(Mt(r),void 0===Mn)return;const o=[...new Set(e)];let n,s=0;const a=async()=>{for(;void 0===n&&s<o.length;){if(!wr)return;const e=o[s++];try{await Mn.getGroupKeys(e,{priority:t.priority??"background",signal:r})}catch(e){throw n=e,e}}};await Promise.all([a(),a()]),Mt(r)},Un=e=>({crypto:yn,resolvePrivateKey:({groupId:e})=>Kn(e),onDecryptError:t=>Jr(e,t),onDecryptRecovery:Lr}),Bn=/* @__PURE__ */new Map,Gn=/* @__PURE__ */new Map,Hn=/* @__PURE__ */new Map,Vn=/* @__PURE__ */new Set,$n=/* @__PURE__ */new Set;function qn(e){return!0!==e.encryption.decryptFailed&&"unknown"!==e.contentType}function Wn(e){Hn.delete(we(e))}function zn(e,t){return e.length===t.length&&e.every((e,r)=>e===t[r])}function Jn(e){if("group"===e.conversation.conversationType)return Mn?.getCachedGroupKeyVersion(e.conversation.conversationId)??void 0}function Qn(e){return 2===e.wireEncrypt?"channel-base64-pad-tea":"group"===e.conversation.conversationType?"group-rsa-tea":"channel"===e.conversation.conversationType?"channel-web-rsa-tea":"direct-rsa-tea"}function Yn(e){return 101===e.contentType?Number.isInteger(e.type)&&e.type>0:27===e.contentType?0n===e.gameType?e.gameValue>=1n&&e.gameValue<=3n:1n===e.gameType&&e.gameValue>=1n&&e.gameValue<=6n:[1,2,3,4,5,7,8,11].includes(e.contentType)}function Xn(e,t){const r=new Map(Zo.getMessagesByConversation(e).filter(e=>void 0===t||e.id===t).map(e=>[e.id,e])),o=/* @__PURE__ */new Map;return{stop:mr.subscribe(n=>{if(!wr||"message:received"!==n.type&&"message:updated"!==n.type||"live"!==n.source||n.conversation.conversationType!==e.conversationType||n.conversation.conversationId!==e.conversationId||void 0!==t&&n.message.id!==t||!0===n.message.encryption.decryptFailed)return;const s=r.get(n.message.id);if(void 0===s||!ro(s,n.message)){const t=Or({conversation:e,messageId:n.message.id});o.set(t,Dr.get(t)??0)}}),hasChanged:e=>{const t=Or(e);return o.has(t)&&o.get(t)===(Dr.get(t)??0)}}}let Zn=0;const es=[],ts=/* @__PURE__ */new Map;let rs=0;function os(){for(;rs<2&&es.length>0;){const e=es.shift();rs+=1,Promise.resolve().then(async()=>{if(Mt(wo.signal),!e.isCurrent())throw new DOMException("端到端排队恢复所属账号、会话或消息已失效","AbortError");await ss(e.record,e.hasBodyChanged)}).then(e.resolve,e.reject).finally(()=>{rs-=1,os()})}}function ns(e,t){if("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType)return ss(e);const r=Or(e),o=Dr.get(r)??0,n=ts.get(r);if(n?.version===o&&n.isCurrent())return n.promise;const s=hr,a=we(e.conversation),i=xr.get(a)??0,c=Ao(e.conversation),d=()=>wr&&hr===s&&i===(xr.get(a)??0)&&c===Ao(e.conversation)&&o===(Dr.get(r)??0),p=void 0===t?Xn(e.conversation,e.messageId):void 0,l=t??(()=>p.hasChanged(e)),u=new Promise((t,r)=>{es.push({record:e,isCurrent:d,hasBodyChanged:l,resolve:t,reject:r})}).finally(()=>{p?.stop(),ts.get(r)?.promise===u&&ts.delete(r)});return ts.set(r,{version:o,isCurrent:d,promise:u}),os(),u}async function ss(e,t){const r=Or(e);e=Pr.get(r)??e;const o=Dr.get(r)??0,n=we(e.conversation),s=xr.get(n)??0,a=Ao(e.conversation),i=()=>wr&&a===Ao(e.conversation)&&s===(xr.get(n)??0)&&o===(Dr.get(r)??0),c=Bn.get(r);if(void 0!==c)return Gn.get(r)===o?c:(await c.catch(()=>{}),void(i()&&Pr.get(r)===e&&await ss(e,t)));const d=async()=>Zo.getConversationMessage(e.conversation,e.messageId)??await(Rr?.getMessage(e.conversation,e.messageId))??void 0,p=(async()=>{const n=await d();if(!i()||void 0===n)return;const s=to(e),a=()=>!("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType||!s)&&(t?.()&&Ar.set(r,o),Ar.get(r)===o);if(a())return await Zo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Nr(e,i);if(!0!==n.encryption.decryptFailed&&!s)return await Zo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Nr(e,i);let c,p;Ir.record("debug","sdk","crypto","decrypt-recovery-context",()=>({conversation:e.conversation,data:{messageId:e.messageId,messageSenderId:n.senderId,messageCreatedAt:n.createdAt,selfMessage:n.senderId===hr,source:e.source,wireEncrypt:e.wireEncrypt,sContentBytes:e.sContent.length,...void 0===e.cmdId?{}:{cmdId:e.cmdId},...void 0===e.encryptVersion?{}:{encryptVersion:e.encryptVersion}}}));let l="key-resolve",u=Qn(e);for(const t of[!1,!0]){const r=t?"force":"current";let o;try{l="bcontent";const n=Ut.decode(e.sContent);if(1===e.wireEncrypt){if(0===n.secretKey.length||0===n.cipherData.length)throw new Error("BContent.secretKey/cipherData 缺失");l="key-resolve";const s={priority:"background",signal:wo.signal,...t?{staleKey:"string"==typeof p?p:void 0}:{}},a="group"===e.conversation.conversationType?(await(Mn?.getGroupKeys(e.conversation.conversationId,s)))?.privateKey??null:(await(Tn?.getUserPrivateKey(hr,s)))?.privateKey??null;if(!i())return;t&&void 0!==p&&(o="string"==typeof p&&null!==a&&p!==a),!0===o&&Wn(e.conversation),t||(p=a);const d=Jn(e);if(null===a){Ir.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"no-key",...void 0===d?{}:{resolvedKeyVersion:d},...void 0===o?{}:{keyChanged:o}}}));continue}const u=await mn.decryptBatch({operationId:"end-to-end-recovery:"+ ++Zn,generation:yr,items:[{itemIndex:0,input:{secretKey:n.secretKey,cipherData:n.cipherData,privateKey:a}}],priority:"background",signal:wo.signal});if(!i())return;if(1!==u.length||0!==u[0]?.itemIndex)throw new yt("protocol-mismatch");const m=u[0].result;if(!m.ok)throw l=m.stage,new Error(`End-to-end recovery ${m.stage} failed`);const v=m.plain;Ir.record("debug","sdk","crypto","decrypt-recovery-byte-shape",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:Qn(e),rsaCipherBytes:n.secretKey.length,cipherDataBytes:n.cipherData.length,cipherDataBlockRemainder:n.cipherData.length%8,plainBytes:v.length,plainBlockRemainder:v.length%8,startsWithContentTypeField:8===v[0],startsWithMobileCardType:8===v[0]&&8===v[1],...X(v)}})),l="bmessage",c=Bt.decode(v)}else if("channel"===e.conversation.conversationType){if(0===n.cipherData.length)throw new Error("BContent.cipherData 缺失");l="key-resolve";const s=t?{...p instanceof Uint8Array?{staleKey:p}:{}}:void 0,a=void 0===Rn?.getChannelKeyCandidates?await(Rn?.getChannelKey(e.conversation.conversationId,s).then(e=>[{strategy:"canonical-base64-pad",key:e}]))??[]:await Rn.getChannelKeyCandidates(e.conversation.conversationId,s),i=Rn?.getCachedChannelKeyMetadata?.(e.conversation.conversationId);null!=i&&Ir.record("info","sdk","crypto","decrypt-recovery-key-material",()=>({conversation:e.conversation,data:{messageId:e.messageId,attempt:r,...i}}));const d=a.find(e=>"canonical-base64-pad"===e.strategy)?.key??null;if(t&&p instanceof Uint8Array&&null!==d&&(o=!zn(p,d)),!0===o&&Wn(e.conversation),t||(p=d?.slice()??null),0===a.length){Ir.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"no-key",...void 0===o?{}:{keyChanged:o}}}));continue}for(const t of a)try{l="tea";const s=yn.decryptSymmetric({teaKey:t.key,cipherData:n.cipherData});l="bmessage";const a=Bt.decode(s);if("legacy-ascii16"===t.strategy&&!Yn(a))throw new Error("legacy ASCII candidate 未通过已知 BMessage 语义校验");c=a,u=t.strategy,Ir.record("info","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}catch(n){Ir.record("warn","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:l,reason:"decrypt-failed",...void 0===o?{}:{keyChanged:o}},error:{message:"CHANNEL decrypt recovery candidate failed",data:n}}))}}if(void 0!==c){Ir.record("info","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:u,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}}catch(t){if(vt(t)||t instanceof Error&&"AbortError"===t.name)throw t;const n=Jn(e);Ir.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"decrypt-failed",...void 0===n?{}:{resolvedKeyVersion:n},...void 0===o?{}:{keyChanged:o}},error:{message:"IM message decryption recovery failed",data:t}}))}}if(!i()||void 0===c)return void(void 0===c&&(!function(e,t){const r=we(e),o=Hn.get(r)??/* @__PURE__ */new Set;o.add(t),Hn.set(r,o)}(e.conversation,e.messageId),Ir.record("warn","sdk","crypto","decrypt-recovery-exhausted",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,strategy:Qn(e),attempts:2,finalStage:l}}))));const m=await d();if(!i()||void 0===m||!0!==m.encryption.decryptFailed&&!s)return;if(("direct"===e.conversation.conversationType||"group"===e.conversation.conversationType)&&s&&(a()||!ro(n,m)))return Ar.set(r,o),await Zo.commitReceivedMessages([m],"offline",{backfillOnly:!0}),void await Nr(e,i);const v="channel"!==e.conversation.conversationType||e.cmdId!==st.RADIO_NOTIFY_DELIVER&&101!==c.contentType?{...Ht(m,c,hr),...s?{edited:!0}:{}}:Gt({channelId:BigInt(e.conversation.conversationId),messageId:e.messageId,occurredAt:BigInt(m.serverTime??m.createdAt),notifyType:c.type,operatorId:c.oprUserId,targetUserIds:c.mnpledUserId,content:c.content,..."string"==typeof m.extensions?.historyCursor?{historyCursor:m.extensions.historyCursor}:{},..."string"==typeof m.extensions?.channelSequence?{sequence:BigInt(m.extensions.channelSequence)}:{},encrypted:!0},{cmdId:e.cmdId,keepRaw:void 0!==m.raw});await Zo.commitReceivedMessages([v],"offline",{backfillOnly:!0,refreshSessionSummary:!0}),await Nr(e,i)})().finally(()=>{Bn.get(r)===p&&(Bn.delete(r),Gn.delete(r))});return Bn.set(r,p),Gn.set(r,o),p}async function as(e,t={}){const r="direct"===e.conversationType||"group"===e.conversationType?Xn(e):void 0;try{const o=we(e),n=hr,s=xr.get(o)??0,a=Ao(e),i=()=>wr&&n===hr&&s===(xr.get(o)??0)&&a===Ao(e),c=await(Rr?.getDecryptRecoveries?.(e))??[];if(!i())return;const d=Hn.get(o),p=void 0===d?c:c.filter(e=>!d.has(e.messageId));if("direct"===e.conversationType||"group"===e.conversationType){let e=0;const t=async()=>{for(;e<p.length;){if(!i())return;const t=p[e++];await ns(t,()=>r.hasChanged(t))}},o=(await Promise.allSettled([t(),t()])).find(e=>"rejected"===e.status);if("rejected"===o?.status)throw o.reason}else await Promise.all(p.map(e=>ns(e)));if(!wr||!1===t.recoverLegacyWithoutSidecar)return;const l=Hn.get(o),u=new Set(c.filter(e=>void 0===l||!l.has(e.messageId)).map(e=>e.messageId)),m=Zo.getMessagesByConversation(e).filter(e=>!0===e.encryption.decryptFailed&&!u.has(e.id));if(0===m.length||Vn.has(o))return;if(Vn.add(o),Ir.record("info","sdk","crypto","decrypt-repair-start",()=>({conversation:e,data:{stuckCount:m.length,withoutSidecar:m.filter(e=>!c.some(t=>t.messageId===e.id)).length}})),"channel"===e.conversationType){const t=await fr.getLoginContext();if(null===t||void 0===Mo)return;for(const r of m.slice(0,20)){const o=r.extensions?.historyCursor;if("string"!=typeof o||""===o.trim())continue;const n=await Mo(e.conversationId,o,t.userId);if(!wr)return;n.length>0&&Zo.upsertMessages(n,"offline")}}else"group"===e.conversationType?await async function(e,t){if(void 0===co)return;const r=[...t].sort((e,t)=>e.sortKey.localeCompare(t.sortKey)),o=r[0],n=r.at(-1);if(void 0===o||void 0===n)return;const s=o.serverTime??o.createdAt;let a;for(let t=0;t<5;t++){const t=await co({conversation:e,oldestLoaded:n,...void 0===a?{}:{cursor:a},intent:"older",limit:50});if(!wr||t.exhausted||void 0===t.nextCursor)return;const r=Number(t.nextCursor);if(Number.isFinite(r)&&r<=s)return;a=t.nextCursor}}({conversationType:"group",conversationId:e.conversationId},m):"direct"===e.conversationType&&await Na()}catch(t){if(!wr||t instanceof Error&&"AbortError"===t.name)return;mr.emit({type:"error",error:{scope:"crypto",message:`解密失败消息恢复失败(conversationType=${e.conversationType}, conversationId=${e.conversationId})`,cause:t}})}finally{r?.stop()}}let is=()=>{throw new Error("离线 Reaction 写入失败:Reaction manager 尚未就绪")};function cs(e,t=!0){const r=e.channelPermissions,o=e.channelAccessSnapshot;return JSON.stringify(["group"===e.type?e.groupState??"active":void 0,e.channelState,void 0===r?void 0:[r.sendMessages,r.mentionAll,r.editProfile,r.manageMembers,r.manageAdmins,r.moderateMessages,r.manageMute,r.dismissChannel,r.transferOwnership],t&&void 0!==o?[o.role,o.baseState,o.resolvedState,o.allMembersMuted,o.currentUserMuted,o.mutePeriod]:void 0])}const ds=/* @__PURE__ */new Map;function ps(e){const t=Zo.getConversationContext(e);if(!wr||void 0===t||"group"===e.conversationType&&void 0!==t.groupState&&"active"!==t.groupState||"channel"===e.conversationType&&void 0!==t.channelState&&o(t.channelState))return;const r=Zo.getMessagesByConversation(e).at(-1);return JSON.stringify([hr,void 0===r?t.timestamp:void 0,cs(t),r?.id,r?.sortKey])}const ls=/* @__PURE__ */new Map;po=te({...void 0===Rr?.recentHistoryCache?{}:{cache:Rr.recentHistoryCache},fingerprint:ps,canRunBackground:function(){return wr&&"ready"===Zr&&So&&0===bo&&"authenticated"===la.state},onForeground:e=>{if("group"===e.conversationType){Mn?.promote(e.conversationId);for(const[t,r]of ls)r.some(t=>t.conversationId===e.conversationId)&&mn.promote(t)}else"channel"!==e.conversationType&&"direct"!==e.conversationType||Tn?.promote(hr)},fetchPage:async(e,t)=>{const r="group"===e.conversationType?Ia("group",{conversationType:"group",conversationId:e.conversationId}):void 0;try{const o=await ee({http:Tr,authProvider:fr,clientType:gr,groupDecrypt:()=>Un("history"),groupAsyncDecrypt:(e,t)=>{const r=Ca(!0===po?.hasForeground(e)?"foreground":"background",t);return r.assertCurrent?.(e),r},assertLoginContext:e=>{if(!wr||""!==hr&&e!==hr)throw new DOMException("最近历史请求的登录账号已改变","AbortError")},channelDecrypt:()=>jn("history"),prepareGroupKeys:Fn,prepareChannelKeys:(e,t)=>An(e,{...t,recoverExistingMessages:!1}),keyPriority:e=>!0===po?.hasForeground(e)?"foreground":"background"})(e,t);return void 0===r?o:{...o,messages:r.messages(o.messages),recoveries:o.recoveries?.filter(r.acceptsRecovery)}}finally{r?.stop()}},yieldToEventLoop:Kt,report:(e,t,r)=>Ir.record(e.endsWith("failed")?"warn":"debug","sdk","history",e,()=>({conversation:t,data:r}))});const us=mr.subscribe(e=>{if("connection:changed"===e.type)return"authenticated"!==e.state&&(So=!1),void po?.notifySchedulingChanged();if("session:updated"===e.type){if("group"!==e.conversation.conversationType&&"channel"!==e.conversation.conversationType)return;const t=we(e.conversation),r=ds.get(t),o={timestamp:e.session.timestamp,access:cs(e.session),capabilities:cs(e.session,!1),state:"group"===e.session.type?e.session.groupState??"active":e.session.channelState,hasPermissions:void 0!==e.session.channelPermissions,hasSnapshot:void 0!==e.session.channelAccessSnapshot};if(ds.set(t,o),"group"===e.conversation.conversationType&&"active"!==o.state&&r?.state!==o.state&&jo(e.conversation),"ready"===Zr&&void 0!==r&&(r.access!==o.access||!ko&&r.timestamp!==o.timestamp)){const t=!r.hasSnapshot&&o.hasSnapshot&&(r.capabilities===o.capabilities||!r.hasPermissions&&r.state===o.state);po?.invalidate(e.conversation,{preserveForeground:r.access===o.access||t})}return}return"session:removed"===e.type?(jo(e.conversation),ds.delete(we(e.conversation)),void("ready"===Zr&&po?.invalidate(e.conversation))):"conversation-history:cleared"===e.type?(jo(e.conversation),void("ready"===Zr&&po?.invalidate(e.conversation))):void("ready"===Zr&&!ko&&"conversation"in e&&void 0!==e.conversation&&("message:received"!==e.type&&"message:updated"!==e.type&&"message:removed"!==e.type||po?.invalidate(e.conversation,{preserveForeground:"message:received"===e.type})))});function ms(e,t=!0){const r="group"===e.conversation.conversationType?Ca("foreground"):void 0;r?.assertCurrent?.({conversationType:"group",conversationId:e.conversation.conversationId}),ko=!0;try{if(void 0===r){e.messages.length>0&&Zo.upsertMessages(e.messages,"offline",{backfillOnly:!0,refreshSessionSummary:t});for(const t of e.reactions)is(t);for(const t of po.takeRecoveries(e))Lr(t)}else{const o=po.takeRecoveries(e);for(const o of e.messages)r.publish([o],()=>Zo.upsertMessages([o],"offline",{backfillOnly:!0,refreshSessionSummary:t}));for(const t of e.reactions)r.publish([],()=>is(t));for(const e of o)r.publish([],()=>Lr(e))}}finally{ko=!1}}co=async({conversation:e,oldestLoaded:t,cursor:r,intent:n,limit:s,signal:a})=>{Mt(a);const{conversationId:i}=e,c=Zo.getConversationContext(e);if(void 0===c)throw new Error(`加载远端历史失败:会话不存在(conversationId=${i})`);if("direct"===c.type||"robot"===c.type||"customerService"===c.type)return{messages:[],exhausted:!0};if("establish-latest"===n&&30===s&&("group"===c.type||"channel"===c.type)){const e={conversationType:c.type,conversationId:i};if(void 0===ps(e))return{messages:[],exhausted:!0};const t=await po.readCached(e,!0).catch(t=>(Ir.record("warn","sdk","history","recent-history-cache-read-failed",()=>({conversation:e,error:{message:"读取最近历史缓存失败",data:t}})),null));null!==t&&po.isPageCurrent(t)&&Date.now()-t.fetchedAt>3e5&&ms(t,!1),Mt(a);const r=await po.latest(e,a).catch(t=>{if(!vt(t)&&wr&&void 0===ps(e))return null;throw t});if(null===r)return{messages:[],exhausted:!0};if(Mt(a),!wr||!po.isPageCurrent(r)||void 0===ps(e))throw new Error("最近历史请求已失效");if(ms(r),await po.confirmConsumed(r),Mt(a),!po.isPageCurrent(r))throw new Error("最近历史页在窗口提交前已失效");return{messages:r.messages,exhausted:r.exhausted,...void 0===r.nextCursor?{}:{nextCursor:r.nextCursor},replaceWindow:!0}}if("group"===c.type){if(void 0!==c.groupState&&"active"!==c.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:i},d=hr,p=Ca(!0===po?.hasForeground(e)?"foreground":"background",a);p.assertCurrent?.(o);const l=Ia("group",o);try{const o=await fr.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(p.assertCurrent?.(),o.userId!==d)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const c="establish-latest"===n?Date.now():void 0===r?t?.serverTime??t?.createdAt??Date.now():lr(r,i),u=[],m=[],v=await Ot({asyncDecrypt:p,signal:a,http:Tr,userId:o.userId,clientType:gr,groupId:i,baseTime:c,direct:1,limit:s,decryptDeps:{...Un("history"),onDecryptRecovery:e=>m.push(e)},prepareKeys:t=>Fn(t,{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onReaction:e=>u.push(e)});p.assertCurrent?.();const y=l.messages(v.messages);for(const e of y)p.publish([e],()=>Zo.upsertMessages([e],"offline",{backfillOnly:!0,refreshSessionSummary:"establish-latest"===n}));for(const e of u)p.publish([],()=>is(e));for(const e of m)p.publish([],()=>{l.acceptsRecovery(e)&&Lr(e)});p.assertCurrent?.();return{messages:y,...q({conversationId:i,direction:"older",baseTime:c,batchSize:v.batchSize,boundaryTime:v.oldestEntryTime,limit:s}),..."establish-latest"===n?{replaceWindow:!0}:{}}}finally{l.stop()}}if("channel"===c.type){const s=qr("history");if(void 0!==c.channelState&&o(c.channelState))return Ir.record("info","sdk","history","channel-history-blocked",()=>({conversation:e,operationId:s,data:{state:c.channelState}})),{messages:[],exhausted:!0};const l=Oo,u=_o(i),m=await fr.getLoginContext();if(null===m)return{messages:[],exhausted:!0};if("establish-latest"===n){const t=await Wt({signal:a,http:Tr,userId:m.userId,clientType:gr,channelId:i,count:pr,operationId:s,decryptDeps:jn("history"),prepareKey:void 0===Rn&&void 0===Tn?void 0:t=>An([t],{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Yr,onReaction:is});Mt(a);const r=Zo.getConversationContext(e);return!wr||l!==Oo||u!==_o(i)||"channel"!==r?.type||void 0!==r.channelState&&o(r.channelState)?{messages:[],exhausted:!0}:(Mt(a),t.messages.length>0&&Zo.upsertMessages(t.messages,"offline",{backfillOnly:!0,refreshSessionSummary:!0}),{messages:t.messages,exhausted:!t.hasOlder,...void 0===t.nextCursor?{}:{nextCursor:t.nextCursor},replaceWindow:!0})}let v,y=r??"";if(void 0===r&&void 0!==t){const e=t.extensions?.historyCursor;if("string"==typeof e&&""!==e.trim())y=e;else if(d=t,p=m.userId,void 0===d||d.senderId!==p||"pending"!==d.status&&"uploading"!==d.status&&"sending"!==d.status||"string"==typeof d.extensions?.historyCursor&&""!==d.extensions.historyCursor.trim())throw new Error(`CHANNEL historyCursor 缺失(channelId=${i}, messageId=${t.id})`)}Ir.record("debug","sdk","history","channel-history-page-start",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:pr,historyGeneration:l,historyEpoch:u,clientTypeHeader:gr,clientTypeBody:gr}}));try{v=await zt({signal:a,http:Tr,userId:m.userId,clientType:gr,channelId:i,baseIndex:y,count:pr,contain:0,operationId:s,decryptDeps:jn("history"),prepareKey:void 0===Rn&&void 0===Tn?void 0:t=>An([t],{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Yr,onReaction:is})}catch(t){throw Ir.record("error","sdk","history","channel-history-page-failed",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:pr},error:{message:"CHANNEL 历史页加载失败",data:t}})),t}Mt(a);const g=Zo.getConversationContext(e);return!wr||l!==Oo||u!==_o(i)||"channel"!==g?.type||void 0!==g.channelState&&o(g.channelState)?{messages:[],exhausted:!0}:(Mt(a),v.messages.length>0&&Zo.upsertMessages(v.messages,"offline",{backfillOnly:!0}),Ir.record("debug","sdk","history","channel-history-page-complete",()=>({conversation:e,operationId:s,data:{responseBatchSize:v.batchSize,messageCount:v.messages.length,exhausted:v.exhausted,nextBaseIndexPresent:void 0!==v.nextBaseIndex}})),{messages:v.messages,exhausted:v.exhausted,...void 0===v.nextBaseIndex?{}:{nextCursor:v.nextBaseIndex}})}var d,p;throw new Error(`远端历史未实现:${c.type}`)};const vs=e=>{e.length>0&&Zo.upsertMessages(e,"offline",{backfillOnly:!0})},ys=async()=>{const e=await fr.getLoginContext();if(null===e)throw new Error("按消息 ID 回源失败:当前没有登录态");return{userId:e.userId}},gs=async(e,t)=>{const r={conversationType:"group",conversationId:e},o=Ia("group",r,t);try{const n=hr,s=Ao(r),a=()=>{if(!wr||hr!==n||s!==Ao(r))throw new DOMException("GROUP 消息查询所属账号或历史已失效","AbortError")},i=Ca("foreground",void 0,a);i.assertCurrent?.(r);const{userId:c}=await ys();if(a(),c!==n)throw new DOMException("GROUP 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=Un("history"),u=await N(t,async t=>{a();const r=await kt({asyncDecrypt:i,http:Tr,userId:c,clientType:gr,groupId:e,messageIds:t,decryptDeps:{...l,onDecryptRecovery:e=>p.push(e)},prepareKeys:e=>Fn(e,{priority:"foreground"}),onReaction:e=>d.push(e)});if(a(),200!==r.code)throw Object.assign(new Error("GROUP 按 ID 查询业务失败"),{code:r.code});return r});a(),i.assertCurrent?.();const m=o.messages(u.messages).filter(e=>e.conversationType===r.conversationType&&e.conversationId===r.conversationId);for(const e of m)i.assertCurrent?.(),vs([e]),i.assertCurrent?.();for(const e of d)i.assertCurrent?.(),e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&is(e),i.assertCurrent?.();for(const e of p)i.assertCurrent?.(),o.acceptsRecovery(e)&&e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&Lr(e),i.assertCurrent?.();return{messages:m.map(e=>{const t=Zo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("GROUP 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:u.missingMessageIds}}finally{o.stop()}},fs=async(e,t)=>{const r={conversationType:"channel",conversationId:e},n=hr,s=Oo,a=_o(e),i=()=>{const t=Zo.getConversationContext(r);if(!wr||hr!==n||s!==Oo||a!==_o(e)||"channel"!==t?.type||void 0!==t.channelState&&o(t.channelState))throw new DOMException("CHANNEL 消息查询所属账号或历史已失效","AbortError")};i();const{userId:c}=await ys();if(i(),c!==n)throw new DOMException("CHANNEL 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=await N(t,async t=>{i();const r=await Dt({http:Tr,userId:c,clientType:gr,channelId:e,messageIds:t,operationId:qr("history"),decryptDeps:{...jn("history"),onDecryptRecovery:e=>p.push({...e,source:"history"})},prepareKey:void 0===Rn&&void 0===Tn?void 0:async e=>{await An([e],{recoverExistingMessages:!1,priority:"foreground"}),i()},onContentDecodeError:Yr,onReaction:e=>d.push(e)});if(i(),0!==r.code)throw Object.assign(new Error("CHANNEL 按 ID 查询业务失败"),{code:r.code});return r});i();for(const e of l.messages)i(),vs([e]);for(const e of d)i(),is(e);for(const e of p)i(),Lr(e);i();return{messages:l.messages.map(e=>{const t=Zo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("CHANNEL 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:l.missingMessageIds}},hs=Me([Re({includeOppositeEnd:!0,resolveOwnKey:async e=>{const t=await(Tn?.getUserPrivateKey(e));return t?.publicKey?{publicKey:t.publicKey,version:t.version}:null}}),ke({resolveGroupKey:Ln}),xe({resolveChannelKey:xn}),De()]),Is=Pe([Ae(),je(),Oe()]),ws=_e([Ne(),Le(),Ke({resolveChannelKey:xn,resolveProfile:e=>Fo?.getProfile(e)??Promise.resolve(null)})]);let Cs=()=>{throw new Error("群收包回 ACK 失败:connection.sendFrame 尚未就绪")},bs=()=>!1,Ss=()=>{throw new Error("群发送 ACK 回填失败:connection.onChatAck 尚未就绪")},Ts=()=>{},Es=()=>{};const Ms={...Zo,removeConversationForMembershipTermination:(e,t)=>{Ts(e,t),"group"===e.conversationType?(On.remove(e.conversationId),jo(e),Mn?.clearGroupKeys(e.conversationId)):Rn?.clearChannelKey(e.conversationId),Zo.removeConversationForMembershipTermination(e,t),Br.api.resetBackground(e).catch(e=>mr.emit({type:"error",error:{scope:"storage",message:"终态删除后清理会话背景失败",cause:e}}))}},Rs=Et({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>hr,isAuthenticated:()=>bs(),reportReaction:e=>Wo.reportReaction(e),isEmojiSupported:x,logger:Wr});is=e=>{Rs.ingest(e,"offline")};const ks=Fe({manager:Rs,getSelfId:()=>hr,logger:Wr}),xs=Ue({domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>hr,emitter:mr,logger:Wr,keepRaw:!0,decrypt:{crypto:yn,resolvePrivateKey:({groupId:e})=>Kn(e),preparePrivateKey:async({groupId:e})=>{if(void 0===Mn)return null;const t=await Mn.getGroupKeys(e);return t?.privateKey??null},onDecryptError:e=>Jr("live",e),onDecryptRecovery:Lr},isActive:()=>wr});let Ds=0;const Ps=mr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&Ds++}),As=Be({domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>hr,emitter:mr,logger:Wr,keepRaw:!0,decrypt:{crypto:yn,resolveChannelKey:Dn,resolveUserPrivateKey:Pn,onDecryptRecovery:Lr,onDecryptError:e=>{const t=void 0!==Rn&&void 0===Rr?.saveDecryptRecovery&&2===e.encrypt&&"decrypt-failed"===e.reason;if(Qr("live",{...e,forceRefreshAttempted:t}),!t)return;const r=Rn.getCachedChannelKey(e.channelId)??void 0;Rn.getChannelKey(e.channelId,{staleKey:r}).catch(()=>{})}},isActive:()=>wr&&bs(),getConnectionEpoch:()=>Ds}),js=Ge({isActive:()=>wr,domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>hr,emitter:mr,logger:Wr,keepRaw:!0}),Os=He({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>hr,emitter:mr,logger:Wr,keepRaw:!0,decrypt:{crypto:yn,resolveChannelKey:Dn,resolveUserPrivateKey:Pn,onDecryptRecovery:Lr}}),_s=Ve({getSelfId:()=>hr,sendFrame:e=>Cs(e),emitter:mr}),Ns=$e({emitter:mr,getSelfId:()=>hr}),Ls=qe({sendFrame:e=>Cs(e),emitter:mr,getSelfId:()=>hr,domainState:{reconcileDirectContactEstablishedNotice:Zo.reconcileDirectContactEstablishedNotice,removeConversation:e=>{"string"!=typeof e?("direct"===e.conversationType&&go(e,"friend_relation_removed"),Zo.removeConversation(e)):Zo.removeConversation(e)}},resetDirectReadReceiptPreference:e=>Vr.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:an.updateRelationshipFromEvent}),Ks=We({sendFrame:e=>Cs(e),emitter:mr,domainState:{applyTransferStatusBySerialNumber:Zo.applyTransferStatusBySerialNumber}}),Fs=ze({getSelfId:()=>hr,sendFrame:e=>Cs(e),emitter:mr}),Us=Je({getSelfId:()=>hr,domainState:Zo,sendFrame:e=>Cs(e),emitter:mr,onRelationshipChanged:an.updateRelationshipFromEvent}),Bs=Qe({sendFrame:e=>Cs(e),emitter:mr,getSelfId:()=>hr,isAuthenticated:()=>bs(),domainState:Zo}),Gs=Ye({sendFrame:e=>Cs(e),emitter:mr,getSelfId:()=>hr,isAuthenticated:()=>bs(),domainState:Zo}),Hs=[...Bs.handlers,...Gs.commandHandlers],Vs=oe({isActive:()=>wr&&bs(),getUserId:async()=>(await fr.getLoginContext())?.userId??null,pull:(e,t,r)=>ir({http:Tr,userId:e,clientType:gr,deliveredMsgIds:t,signal:r}),onBatch:e=>{Ir.record("info","sdk","call","signal-offline-pull",()=>({data:{count:e.items.length,cmdIds:e.items.map(e=>`0x${e.cmdId.toString(16)}`)}})),0===e.items.length&&mr.emit({type:"notification",cmdId:0,name:"OFFLINE_SIGNAL"})},onItem:e=>{if(mr.emit({type:"notification",cmdId:e.cmdId,name:"OFFLINE_SIGNAL"}),!wr||!bs())return;const t=Hs.find(t=>t.command===e.cmdId);t?.handler(e.cmdId,e.body)},onError:e=>mr.emit({type:"error",error:{scope:"sync",message:"音视频离线信令拉取失败",cause:e}})}),$s=mr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&Vs.stop()}),qs=Xe({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>hr,emitter:mr,logger:Wr,keepRaw:!0}),Ws=at({domainState:Ms,getSelfId:()=>hr,prefetchGroupKey:_n,clearGroupKeys:e=>{On.remove(e),jo({conversationType:"group",conversationId:e}),Mn?.clearGroupKeys(e)},clearConversationTermination:e=>Es(e)}),zs=mr.subscribe(e=>{"message:received"!==e.type&&"message:updated"!==e.type||Ws.handleMessage(e.message)}),Js=it({domainState:Ms,getSelfId:()=>hr,prepareChannelKey:e=>{Ir.record("debug","sdk","crypto","channel-key-prepare-requested",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:void 0!==Rn&&null!==Rn.getCachedChannelKey(e)}})),void 0!==Rn&&Rn.getChannelKey(e).catch(()=>{})},clearChannelKey:e=>{const t=void 0!==Rn&&null!==Rn.getCachedChannelKey(e);Rn?.clearChannelKey(e),Ir.record("info","sdk","crypto","channel-key-cleared",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:t}}))},clearConversationTermination:e=>Es(e),stopChannelHistory:e=>{const t=_o(e);No(e),Zo.messageWindow.info().conversationId===e&&Zo.messageWindow.reset(),Ir.record("info","sdk","history","channel-history-invalidated",()=>({conversation:{conversationType:"channel",conversationId:e},data:{previousEpoch:t,nextEpoch:_o(e)}}))}}),Qs=mr.subscribe(e=>{if("message:received"===e.type||"message:updated"===e.type){const t=e.message;"channel"===t.conversationType&&void 0!==t.body.system?.eventType&&Ir.record("info","sdk","conversation","channel-membership-event-observed",()=>({conversation:{conversationType:"channel",conversationId:t.conversationId},messageId:t.id,data:{eventType:t.body.system?.eventType,source:e.source??"live",targetSelf:t.body.system?.targetUserIds?.includes(hr)??!1,lifecycleEffects:!0===e.channelLifecycleEffects,stateBefore:Zo.getSession({conversationType:"channel",conversationId:t.conversationId})?.channelState??"missing"}})),Js.handleMessage(e.message,{source:e.source??"live",applyLifecycleEffects:e.channelLifecycleEffects})}}),Ys=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_owner_transferred","channel_admin_added","channel_admin_removed","channel_member_renamed"]),Xs=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_member_renamed"]),Zs=mr.subscribe(e=>{if("message:received"!==e.type&&"message:updated"!==e.type)return;if("live"!==(e.source??"live")&&!0!==e.channelLifecycleEffects)return;const t=e.message,r=t.body.system?.eventType;"channel"===t.conversationType&&void 0!==r&&(Ys.has(r)&&Uo?.invalidateChannelMembers(t.conversationId).catch(e=>{mr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 成员缓存失效失败",cause:e}})}),Xs.has(r)&&Go.invalidate(t.conversationId).catch(e=>{mr.emit({type:"error",error:{scope:"storage",message:"CHANNEL @候选缓存失效失败",cause:e}})}))}),ea=c({fetchMessagesById:gs,onSourceUnavailable:e=>Ir.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"group",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Sr?{}:{coreClient:Sr},domainState:Zo,emitter:mr}),ta=e({fetchMessagesById:fs,onSourceUnavailable:e=>Ir.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"channel",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Sr?{}:{coreClient:Sr},domainState:Zo,emitter:mr}),ra=n({...void 0===Qo?{}:{joinApplications:Qo},http:Tr,clientType:gr,buildOfflineDecrypt:()=>jn("history"),onContentDecodeError:Yr,onReaction:is,...void 0===Rn&&void 0===Tn?{}:{prepareKey:(e,t)=>An([e],{signal:t,priority:!0===po?.hasForeground({conversationType:"channel",conversationId:e})?"foreground":"background"})}});Mo=async(e,t,r)=>{const{context:o}=await ra.loadMessageContext(e,t,r);return o.messages};const oa=r({authProvider:fr,emitter:mr,domainState:Zo,loadMessageContext:ra.loadMessageContext,isActive:()=>wr,getHistoryGeneration:()=>Oo,getHistoryEpoch:_o}),na=G({domainState:Zo,isActive:()=>wr,loadSummary:async({channelId:e,readCursor:t})=>{const r=await fr.getLoginContext();if(null===r||!wr||r.userId!==hr)throw new Error("CHANNEL 已读摘要:无有效登录上下文");return(await $t({http:Tr,userId:r.userId,clientType:gr,channels:[{channelId:e,readCursor:t}],keepRaw:!1})).find(t=>t.channelId===e)},report:(e,t,r)=>Ir.record("channel-read-summary-failed"===e?"warn":"debug","sdk","sync",e,()=>({conversation:t,data:r}))}),sa=Pt({domainState:Zo,updateReadIndex:async({channelId:e,readCursor:t})=>{const r=await fr.getLoginContext();if(null===r||!wr||r.userId!==hr)throw new Error("CHANNEL 已读 readIndexes/edit:无登录上下文");await cr({http:Tr,userId:r.userId,indexes:[{channelId:e,readCursor:t}]})},emitter:mr,logger:Wr,onReadCommitted:na.request,onReadSettled:na.settled,syncRead:{getSelfId:()=>hr,sendFrame:e=>Cs(e)}}),aa=Ze({getSelfId:()=>hr,applyRemoteRead:e=>sa.applyRemoteRead(e),emitter:mr,logger:Wr}),ia=et([pt({domainState:Zo,markGroupReadAll:async e=>{const t=await fr.getLoginContext();if(null===t)throw new Error("群已读 read_all:无登录上下文");await dr({http:Tr,userId:t.userId,groupId:e})},emitter:mr,logger:Wr,isAuthenticated:()=>bs(),syncRead:{getSelfId:()=>hr,sendFrame:e=>Cs(e)}}),sa,lt({domainState:Zo}),ut({domainState:Zo})]),ca=tt({getSelfId:()=>hr,sendFrame:e=>Cs(e),onListenerError:()=>mr.emit({type:"error",error:{scope:"unknown",message:"推送状态订阅者回调异常"}})}),da=rt({getSelfId:()=>hr,sendFrame:e=>Cs(e),onListenerError:()=>mr.emit({type:"error",error:{scope:"unknown",message:"页面状态订阅者回调异常"}})}),pa=mr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&(ca.setAuthenticated(!1),da.setAuthenticated(!1))}),la=ot({transport:Er,authProvider:fr,endpointProvider:ur.endpointProvider,emitter:mr,domainState:Zo,logger:Wr,decrypt:{crypto:yn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?Tn?.getCachedPrivateKey(hr)?.privateKey??null:null,onDecryptError:e=>zr("live",e),onDecryptRecovery:Lr},encryptSend:void 0===En&&void 0===Rn?void 0:{crypto:yn,resolvePublicKey:e=>En?.getPeerPublicKey(e)??Promise.resolve(null),resolveGroupKey:Ln},media:void 0!==hn?{transfer:hn,recoveryPort:Cr?.port,retainFailedUploads:ur.uploadRecovery?.retainFailedUploads,shouldPersistUpload:(e,t)=>void 0!==Cr&&ct(t,!0===ur.media?.multipartTransfer&&!1!==ur.media.multipartUpload).multipart,waitUntilOnline:e=>br.wait(e),preview:wn,onTransferError:e=>{Ir.record("error","core","media","media-transfer-failed",()=>({conversation:e.conversation,data:{stage:e.stage,kind:e.kind,messageId:e.messageId},error:{message:"媒体上传失败",data:e.cause}}))},onAlbumContentSize:e=>{Ir.record("rejected"===e.outcome?"error":"warn","core","media","rejected"===e.outcome?"media-album-content-rejected":"media-album-content-large",()=>({conversation:e.conversation,data:{messageId:e.messageId,itemCount:e.itemCount,...void 0===e.contentBytes?{}:{contentBytes:e.contentBytes}},...void 0===e.cause?{}:{error:{message:"媒体合集正文未通过发送前体积闸门",data:e.cause}}}))},...void 0===Fr?{}:{assetCache:Fr,onAssetCacheError:e=>{Ir.record("warn","core","media","media-asset-cache-put-failed",()=>({data:{operation:e.operation,kind:e.kind,messageId:e.messageId,byteLength:e.byteLength},error:{message:"发送媒体写入本机缓存失败",data:e.cause}}))}},...void 0===ur.media?.maxConcurrentUploads?{}:{maxConcurrentUploads:ur.media.maxConcurrentUploads}}:void 0,sendStrategies:hs,commandHandlers:[...da.commandHandlers,...ca.commandHandlers,...Ls,...Ns,...Ks,...Fs,...Us,...Hs,...ks,...xs,...qs,...As,...Os,..._s,...aa,...js],readStrategies:ia,canSendDirectReadReceipt:e=>{if(!Vr.isDirectReadReceiptEnabled(e))return!1;const t=an.peekRelationship(e);return void 0!==t&&"unknown"!==t?"friend"===t:void 0},recallStrategies:Is,channelMessageDeletion:{resolveProfile:e=>Fo?.getProfile(e)??Promise.resolve(null),onPermissionDenied:e=>Zo.refreshConversationProfile(e,"channel")},editStrategies:ws,storage:Rr,onHeartbeat:()=>da.onHeartbeat(),onAuthenticated:()=>{da.setAuthenticated(!0),ca.setAuthenticated(!0);for(const e of oo)e.resumeMedia();const e=uo;uo=!0,(e||"auto"===lo)&&Da().catch(()=>{}),Vs.start()},isOnline:()=>"undefined"==typeof navigator?void 0:navigator.onLine},ur.connection);Gr=e=>la.suppressDirectReadReceipts(e),Hr=e=>la.resumeDirectReadReceipts(e),Cs=la.sendFrame,bs=()=>"authenticated"===la.state,Ss=la.onChatAck,go=la.terminateConversationSending,Ts=la.markOutboxConversationTerminated,Es=la.clearOutboxConversationTerminated;const ua=L({operations:{getPending:la.getPendingOutbox,retry:la.retryOutboxMessage,cancel:la.cancelOutboxMessage},emitter:mr,isActive:()=>wr}),ma=l({mediaCrypto:{executor:mn,generation:yr,isActive:()=>wr},connection:la,domainState:Zo,crypto:yn,settleEmptyGroupRead:async e=>{const t=Do.get(e.conversationId)??0,r=Zo.getSession(e);let o=void 0===r,n=r?.unreadCount??0,s=r?.mentionUnreadCount??0,a=n,i=s;const c=()=>{const r=Zo.getSession(e);if(!wr||o||void 0===r||t!==(Do.get(e.conversationId)??0)||void 0!==r.groupState&&"active"!==r.groupState)throw new DOMException("群已读请求已失效","AbortError");return r},d=mr.subscribe(t=>{if("conversation"in t&&"group"===t.conversation?.conversationType&&t.conversation.conversationId===e.conversationId&&(("session:removed"===t.type||"conversation-history:cleared"===t.type||"session:updated"===t.type&&void 0!==t.session.groupState&&"active"!==t.session.groupState)&&(o=!0),"read:updated"===t.type||"session:updated"===t.type)){const t=Zo.getReadState(e);if(void 0===t)return;const r=t.mentionUnreadCount??0;a=Math.max(0,a-Math.max(0,n-t.unreadCount)),i=Math.max(0,i-Math.max(0,s-r)),n=t.unreadCount,s=r}});try{c();const t=await fr.getLoginContext();if(c(),null===t||t.userId!==hr)throw new Error("群已读 read_all:登录上下文已失效");await dr({http:Tr,userId:t.userId,groupId:e.conversationId});const r=c(),o=Zo.getReadState(e),n=Math.max(0,(o?.unreadCount??r.unreadCount)-a),s=Math.max(0,(o?.mentionUnreadCount??r.mentionUnreadCount??0)-i);Zo.setReadState({...o??{...e,readCursor:r.readCursor??"",unreadCount:r.unreadCount},mentionUnreadCount:s}),Zo.applyServerUnread(e,n)}finally{d()}},...void 0===hn?{}:{mediaTransfer:hn},prepareDirectReadReceipt:async e=>{try{await an.ensureRelationship(e)}catch(t){mr.emit({type:"error",error:{scope:"http",message:"Direct 已读已在本地提交,但联系人关系查询失败,未发送对端可见回执",cause:{peerId:e,error:t}}})}}}),va=O({recoveryPort:Cr?.port,connection:la,domainState:Zo,emitter:mr,isActive:()=>wr,preparePreview:Cn,prepareVideoPoster:bn,prepareImageThumbnail:Sn,onLocalPreviewError:({kind:e,byteLength:t,cause:r})=>{Ir.record("warn","sdk","media","local-preview-failed",()=>({generation:yr,data:{kind:e,byteLength:t},error:{message:r instanceof Error?r.message:String(r)}}))},...void 0===Fr?{}:{assetCache:Fr,onAssetCacheEvent:e=>{Ir.record("failed"===e.outcome?"warn":"debug","sdk","media",`media-asset-cache-${e.operation}-${e.outcome}`,()=>({data:{operation:e.operation,outcome:e.outcome,kind:e.kind,messageId:e.messageId,...void 0===e.byteLength?{}:{byteLength:e.byteLength}},...void 0===e.cause?{}:{error:{message:"媒体资产缓存操作失败",data:e.cause}}}))}},...void 0===hn?{}:{loaders:{loadImage:ma.operations.loadImage,loadVideo:ma.operations.loadVideo,loadVoice:ma.operations.loadVoice,loadFile:ma.operations.loadFile}}}),ya=J({isActive:()=>wr&&"ready"===Zr&&""!==hr,maintain:async()=>{va.prune(),la.expireRetainedUploads();const e=(await Promise.allSettled([Kr?Fr?.prune?.():void 0,Cr?.prune()])).find(e=>"rejected"===e.status);if("rejected"===e?.status)throw e.reason},onError:e=>Ir.record("warn","sdk","media","media-cache-maintenance-failed",()=>({error:{message:"媒体过期缓存清理失败",data:e}}))});rn=()=>{la.invalidateMediaAssetCacheWrites(),va.clearCache()},void 0===ur.transport&&"undefined"!=typeof window&&(la.setConnectionAllowed(!1),no=nt({onChange:(e,t)=>{if(!e){if(yo=!0,la.setConnectionAllowed(!1),!wr)return io?.then(()=>{});wr=!1,Vs.stop(),Ar.clear(),Nn(),wo.abort(),Io.dispose(),Eo.dispose(),To.dispose(),po?.dispose(),mo=!1,vo+=1,ga.stop();return Oa({localData:"preserve"},{requireStorageClose:!0,preserveUploadRecovery:!0,notifyReplacement:"replaced"===t}).then(()=>{})}},onError:e=>{ao=e,mr.emit({type:"error",error:{scope:"transport",message:"IM 页面连接协调不可用,请使用支持 Web Locks 的安全浏览器环境",cause:e}})}}));const ga=Ce({onOnline:()=>{br.setOnline(!0),la.notifyOnline()},onOffline:()=>{br.setOnline(!1),la.notifyOffline()},onVisible:()=>{ya.run(),la.notifyVisible();for(const e of oo)e.resumeMedia()},onPageHide:()=>{mo&&la.suspendForPageLifecycle()},onPageShow:()=>{if(ya.run(),mo){la.resumeFromPageLifecycle(),la.notifyVisible();for(const e of oo)e.resumeMedia()}}},ur.network);const fa=mr.subscribe(e=>{wr&&"auth:invalid"===e.type&&(Vs.stop(),mo=!1,vo+=1,yo=void 0!==no,no?.terminate(),ga.stop())});async function ha(e,t={}){const r=await(Tn?.getUserPrivateKey(e,{priority:t.priority??"background",signal:t.signal??wo.signal}))??null;return{crypto:yn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?r?.privateKey??null:null,onDecryptError:t=>zr("offline",t,e),onDecryptRecovery:Lr}}function Ia(e,t,r){const o=void 0===t?Zo.getMessages().filter(t=>t.conversationType===e):Zo.getMessagesByConversation(t).filter(e=>void 0===r||r.includes(e.id)),n=new Map(o.map(e=>[Or({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}),e])),s=/* @__PURE__ */new Set,a=mr.subscribe(o=>{if(("message:received"===o.type||"message:updated"===o.type)&&"live"===o.source&&o.conversation.conversationType===e&&(void 0===t||o.conversation.conversationId===t.conversationId&&(void 0===r||r.includes(o.message.id)))){const e=Or({conversation:o.conversation,messageId:o.message.id}),t=n.get(e);void 0!==t&&ro(t,o.message)||s.add(e)}});return{stop:()=>{a(),n.clear(),s.clear()},acceptsRecovery:e=>!s.has(Or(e)),messages:e=>e.map(e=>{const t={conversationType:e.conversationType,conversationId:e.conversationId};return s.has(Or({conversation:t,messageId:e.id}))?Zo.getConversationMessage(t,e.id)??e:e})}}function wa(e,t){const r=hr,o=new Map(Po),n=/* @__PURE__ */new Map,s=e=>{if(Mt(wo.signal),!wr||r!==hr)throw new DOMException("DIRECT 计算所属账号已失效","AbortError");void 0!==e&&n.set(we(e),e);for(const[e,t]of n)if((o.get(e)?.version??0)!==Ao(t))throw void 0!==Po.get(e)?.reason?Po.get(e).reason:new DOMException("DIRECT 计算所属会话已清理","AbortError");t?.()};return{publish(e,t){s();const r=t();return s(),r},executor:mn,generation:yr,operationId:"direct-batch:"+ ++Zn,priority:e,signal:wo.signal,assertCurrent:s,yieldToEventLoop:Kt}}function Ca(e,t,r){const o=hr,n=new Map(Po),s=/* @__PURE__ */new Map,a=e=>{if(Mt(wo.signal),Mt(t),!wr||hr!==o)throw new DOMException("GROUP 计算所属账号已失效","AbortError");void 0!==e&&s.set(we(e),e);for(const[e,t]of s)if((n.get(e)?.version??0)!==Ao(t))throw void 0!==Po.get(e)?.reason?Po.get(e).reason:new DOMException("GROUP 计算所属群密钥、权限或历史已失效","AbortError");r?.()};return{publish(e,t){a();const r=e.filter(e=>{if("group"!==e.conversationType||void 0===e.body.system)return!1;const t=Ft(e.body.system,hr);return null!==t&&"active"!==t.state}).map(e=>({conversationType:"group",conversationId:e.conversationId})),o=t();for(const e of r){const t=we(e);void 0===Po.get(t)?.reason&&n.set(t,{version:Ao(e)})}return a(),o},executor:{async decryptBatch(t){const r=[...s.values()];ls.set(t.operationId,r);try{const o="foreground"===e||r.some(e=>!0===po?.hasForeground(e))?"foreground":"background";return await mn.decryptBatch({...t,priority:o})}finally{ls.delete(t.operationId)}}},generation:yr,operationId:"group-batch:"+ ++Zn,priority:e,signal:t??wo.signal,assertCurrent:a,yieldToEventLoop:Kt}}async function ba(e,t,r,o,n){const s=[];let a;try{for(const e of t)n([],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([],"offline",void 0,{events:[e],apply:e=>Rs.ingest(e,"offline")})))});for(const t of e)n([t],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([t],"offline")))});for(const e of r)n([],()=>{Lr(e);const t=kr.get(Or(e));void 0!==t&&s.push(t)})}catch(e){a={cause:e}}const i=await Promise.allSettled(s);if(void 0!==a)throw a.cause;const c=i.find(e=>"rejected"===e.status);if("rejected"===c?.status)throw c.reason;o()}function Sa(e,t){return{endpoint:e,pullBatch:async({deliveredMsgInfos:r,limit:o})=>{const n=Ia("direct");try{const s=[],a=hr,i=wa("background");i.assertCurrent?.();const c=await fr.getLoginContext();if(null===c)throw new Error(`sync(${e}): 无登录上下文(authProvider.getLoginContext 返回 null)`);if(i.assertCurrent?.(),""!==a&&c.userId!==a)throw new DOMException("DIRECT 离线同步的登录账号已改变","AbortError");const d=await ha(c.userId);i.assertCurrent?.();const p=[],l=await t({http:Tr,userId:c.userId,clientType:gr,decryptDeps:{...d,onDecryptRecovery:e=>s.push(e)},asyncDecrypt:i,deliveredMsgInfos:r,...void 0===o?{}:{limit:o},onReaction:e=>p.push(e)});return i.assertCurrent?.(),{...l,reactions:p,commit:async()=>{try{await ba(n.messages(l.messages),p,s.filter(n.acceptsRecovery),()=>i.assertCurrent?.(),i.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}}async function Ta(e){const t=[...new Map(e.map(e=>[we(e),e])).values()];let r=0;await(async()=>{for(;r<t.length;){if(!wr)return;const e=t[r++];if(void 0!==Zo.getSession(e)&&void 0!==ps(e))try{if(await Io.waitForBackground(wo.signal),!wr||void 0===Zo.getSession(e)||void 0===ps(e))continue;po.invalidate(e,{preserveForeground:!0}),await co({conversation:e,oldestLoaded:void 0,intent:"establish-latest",limit:30})}catch(t){if(!wr||void 0===Zo.getSession(e)||void 0===ps(e))continue;mr.emit({type:"error",error:{scope:"sync",message:"会话最新消息同步失败",cause:t}}),Ir.record("warn","sdk","sync","session-latest-summary-failed",()=>({conversation:e,error:{message:"会话最新消息同步失败",data:t}}))}}})()}async function Ea(){const e=qr("sync");Ir.record("info","sdk","sync","channel-sync-start",()=>({operationId:e,data:{clientTypeHeader:gr,sessionsClientTypeBody:"absent",offlineClientTypeBody:gr}}));try{await async function(e){if(void 0===Fo)return void Ir.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"profile-unavailable"}}));const t=await fr.getLoginContext();if(null===t)return void Ir.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"auth-unavailable"}}));const r=await Fo.listProfiles({forceRefresh:!0});if(!wr)return;if(0===r.length)return void Ir.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:0,sessionCount:0,offlineMessageCount:0}}));const n=new Map(r.map(e=>[e.id,e]));for(const e of r){if(Xr(e.channelState)){Rn?.clearChannelKey(e.id),Ms.removeConversationForMembershipTermination({conversationType:"channel",conversationId:e.id},`channel_${e.channelState}`);continue}const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;Zo.setChannelRestriction(e.id,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),Zo.updateConversationProfile({conversationType:"channel",conversationId:e.id},{title:e.name,avatar:e.avatar}),void 0!==e.muted&&Zo.setMuted({conversationType:"channel",conversationId:e.id},e.muted)}const s=new Map(r.map(e=>{const t={conversationType:"channel",conversationId:e.id},r=Zo.getReadState(t),o=Zo.getSession(t);return[e.id,{revision:Zo.getChannelReadRevision(t),pending:Zo.hasPendingChannelRead(t),readCursor:r?.readCursor??o?.readCursor??"",unreadCount:o?.unreadCount??r?.unreadCount??0,mentionUnreadCount:o?.mentionUnreadCount??r?.mentionUnreadCount??0}]})),a=r.map(e=>({channelId:e.id,readCursor:s.get(e.id).readCursor}));Ir.record("debug","sdk","sync","channel-sessions-request",()=>({operationId:e,data:{channelCount:a.length,channelsWithReadCursor:a.filter(e=>""!==e.readCursor).length,clientTypeHeader:gr,clientTypeBody:gr}}));const i=await $t({http:Tr,userId:t.userId,clientType:gr,channels:a,operationId:e,decryptDeps:jn("offline"),prepareKeys:e=>An(e.filter(e=>{const t=n.get(e)?.channelState;return void 0===t||!o(t)})),onContentDecodeError:Yr,onReaction:is});if(!wr)return;Ir.record("debug","sdk","sync","channel-sessions-response",()=>({operationId:e,data:{sessionCount:i.length,lastMessageCount:i.filter(e=>void 0!==e.last).length,decryptFailedLastCount:i.filter(e=>!0===e.last?.encryption.decryptFailed).length,unknownContentLastCount:i.filter(e=>"unknown"===e.last?.contentType&&!0!==e.last.encryption.decryptFailed).length}}));const c=new Set(i.filter(e=>{const t=s.get(e.channelId),r={conversationType:"channel",conversationId:e.channelId},o=Zo.getReadState(r),n=Zo.getSession(r);return void 0===t||t.pending||Zo.hasPendingChannelRead(r)||Zo.getChannelReadRevision(r)!==t.revision||(o?.readCursor??n?.readCursor??"")!==t.readCursor||(n?.unreadCount??o?.unreadCount??0)!==t.unreadCount||(n?.mentionUnreadCount??o?.mentionUnreadCount??0)!==t.mentionUnreadCount}).map(e=>e.channelId)),d=i.filter(e=>void 0!==Zo.getConversationContext({conversationType:"channel",conversationId:e.channelId})).map(e=>{const t=n.get(e.channelId),r=t?.channelState,s=void 0!==r&&o(r)?r:o(e.channelState)?e.channelState:r??e.channelState,a="active"===s?void 0:s===e.channelState?e.sendDisabledReason:`channel_${s}`;return{...e,channelState:s,sendDisabledReason:a}});for(const e of d){const t=n.get(e.channelId);Zo.setChannelRestriction(e.channelId,e.channelState,e.sendDisabledReason,void 0===t?void 0:{permissions:t.permissions,...void 0===t.accessSnapshot?{}:{snapshot:t.accessSnapshot}}),void 0!==t&&(Zo.updateConversationProfile({conversationType:"channel",conversationId:e.channelId},{title:t.name,avatar:t.avatar}),void 0!==t.muted&&Zo.setMuted({conversationType:"channel",conversationId:e.channelId},t.muted)),c.has(e.channelId)||Zo.applyChannelReadSummary({conversationType:"channel",conversationId:e.channelId},e),o(e.channelState)&&Rn?.clearChannelKey(e.channelId)}const p=Oo,l=new Map(d.map(e=>[e.channelId,_o(e.channelId)])),u=e=>{const t=Zo.getConversationContext({conversationType:"channel",conversationId:e});return wr&&p===Oo&&l.get(e)===_o(e)&&void 0!==t&&(void 0===t.channelState||!o(t.channelState))},m=e=>{if(!wr||p!==Oo)return[];const t=e.filter(e=>u(e.conversationId));return t.length>0&&Zo.upsertMessages(t,"offline",{applyChannelLifecycleEffects:!0}),t};m(d.flatMap(e=>void 0===e.last?[]:[e.last])),await Ta(d.filter(e=>void 0===e.last&&!o(e.channelState)).map(e=>({conversationType:"channel",conversationId:e.channelId})));const v=d.filter(e=>!c.has(e.channelId)&&!o(e.channelState)&&e.unreadCount>0&&""!==e.readCursor);Ir.record("debug","sdk","sync","channel-offline-plan",()=>{const t={staleRead:0,historyBlocked:0,zeroUnread:0,emptyReadCursor:0};for(const e of d)c.has(e.channelId)?t.staleRead+=1:o(e.channelState)?t.historyBlocked+=1:e.unreadCount<=0?t.zeroUnread+=1:""===e.readCursor&&(t.emptyReadCursor+=1);return{operationId:e,data:{acceptedSessionCount:d.length,eligibleChannelCount:v.length,staleReadSkippedCount:t.staleRead,historyBlockedSkippedCount:t.historyBlocked,zeroUnreadSkippedCount:t.zeroUnread,emptyReadCursorSkippedCount:t.emptyReadCursor,direction:0,contain:0,count:pr}}});const y=[],g=new Map(v.map(e=>[e.channelId,e.readCursor])),f=[];for(const t of v){const r={conversationType:"channel",conversationId:t.channelId},o=!0!==Rr?.supportsChannelSyncCheckpoint?void 0:Jt(await Rr.getMeta(Qt(r)),r);if(!u(t.channelId))continue;const n=o?.startIndex===t.readCursor;f.push({channelId:t.channelId,baseIndex:n?o.baseIndex:t.readCursor}),Ir.record("debug","sdk","sync","channel-offline-resume",()=>({operationId:e,conversation:r,data:{resumed:n}}))}const h=[],I=[];let w;if(await qt({http:Tr,userId:t.userId,clientType:gr,operationId:e,pulls:f,messageCount:pr,signal:wo.signal,beforePage:()=>Io.waitForBackground(wo.signal),isChannelCurrent:u,yieldToEventLoop:Kt,decryptDeps:{...jn("offline"),onDecryptRecovery:e=>I.push(e)},prepareKeys:e=>An(e,{recoverExistingMessages:!1}),onContentDecodeError:Yr,onReaction:e=>h.push(e),onPage:async(e,t)=>{const r=h.splice(0),o=I.splice(0),n=(async()=>{for(const n of t.pulls){const s={conversationType:"channel",conversationId:n.channelId},a=()=>u(n.channelId);if(!a())continue;const i=o.filter(e=>e.conversation.conversationId===n.channelId),c=()=>{y.push(...m(e.filter(e=>e.conversationId===n.channelId)));for(const e of r)a()&&e.conversation.conversationId===n.channelId&&is(e)};if(!0!==Rr?.supportsChannelSyncCheckpoint){c();for(const e of i)a()&&Lr(e);continue}if(!await Zo.commitChannelSyncPage([s],c,a,async()=>{if(i.length>0&&void 0===Rr.saveDecryptRecovery)throw new Error("CHANNEL 同步不能保存解密恢复记录");for(const e of i)await Rr.saveDecryptRecovery(e)})||!a())continue;const d=t.nextBaseIndexes[n.channelId];void 0!==d&&await Zo.saveChannelSyncCheckpoint({version:1,conversation:s,startIndex:g.get(n.channelId),baseIndex:d},a);for(const e of i)a()&&ns(e).catch(e=>mr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 解密恢复失败",cause:e}}))}})();Co.add(n);try{await n}finally{Co.delete(n)}}}).catch(e=>{w={cause:e}}),!wr)return;const C=d.flatMap(e=>{const t=e.last;if(void 0===t||qn(t))return[];const r=t.extensions?.historyCursor;return[{summary:e,last:t,historyCursor:"string"==typeof r?r.trim():""}]}),b=(e,t)=>`${e}:${t}`,S=/* @__PURE__ */new Map,T=/* @__PURE__ */new Set;for(const{summary:e,last:t}of C){const r=Zo.getConversationMessage({conversationType:"channel",conversationId:e.channelId},t.id);if(void 0===r||!qn(r))continue;const o=b(e.channelId,t.id);S.set(o,r),T.add(o)}for(const e of y)qn(e)&&S.set(b(e.conversationId,e.id),e);const E=C.filter(({summary:e,last:t,historyCursor:r})=>!(""===r||c.has(e.channelId)||o(e.channelState)||S.has(b(t.conversationId,t.id))||$n.has(b(t.conversationId,t.id)))),M=C.filter(({summary:e,last:t})=>!c.has(e.channelId)&&!o(e.channelState)&&!T.has(b(t.conversationId,t.id))&&S.has(b(t.conversationId,t.id))).length;Ir.record("debug","sdk","sync","channel-session-last-recovery-plan",()=>({operationId:e,data:{unusableLastCount:C.length,decryptFailedLastCount:C.filter(({last:e})=>!0===e.encryption.decryptFailed).length,unknownContentLastCount:C.filter(({last:e})=>"unknown"===e.contentType&&!0!==e.encryption.decryptFailed).length,localRecoveredCount:T.size,offlineRecoveredCount:M,contextRecoveryCount:E.length,staleReadSkippedCount:C.filter(e=>c.has(e.summary.channelId)).length,historyBlockedSkippedCount:C.filter(e=>o(e.summary.channelState)).length,missingHistoryCursorCount:C.filter(e=>""===e.historyCursor).length}}));const R=async({summary:r,last:n,historyCursor:s})=>{try{if(await Io.waitForBackground(wo.signal),!u(r.channelId))return;const{message:a}=await ra.loadMessageContext(r.channelId,s,t.userId,wo.signal),i=Zo.getConversationContext({conversationType:"channel",conversationId:r.channelId});if(!wr||"channel"!==i?.type||void 0!==i.channelState&&o(i.channelState))return;if("channel"!==a.conversationType||a.conversationId!==r.channelId||a.id!==n.id)throw new Error(`CHANNEL sessions.last 精确恢复结果不匹配(channelId=${r.channelId}, messageId=${n.id})`);if(!qn(a)){if("unknown"===a.contentType&&!0!==a.encryption.decryptFailed)return $n.add(b(a.conversationId,a.id)),void Ir.record("info","sdk","sync","channel-session-last-unknown-confirmed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:r.channelId},data:{messageId:n.id,reason:a.body.unknown?.reason}}));throw new Error(`CHANNEL sessions.last 精确恢复未取得可用正文(channelId=${r.channelId}, messageId=${n.id})`)}return a}catch(t){return void Ir.record("warn","sdk","sync","channel-session-last-recovery-failed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:r.channelId},error:{message:"CHANNEL sessions.last 精确恢复失败",data:t},data:{messageId:n.id}}))}},k=[];for(const e of E){if(!wr)break;k.push(await R(e))}for(const e of k)void 0!==e&&S.set(b(e.conversationId,e.id),e);const x=k.filter(e=>{if(void 0===e)return!1;const t=Zo.getConversationMessage({conversationType:"channel",conversationId:e.conversationId},e.id);return void 0===t||!qn(t)});if(m(x),void 0!==w)throw w.cause;Ir.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:r.length,terminalProfileCount:r.filter(e=>Xr(e.channelState)).length,sessionCount:i.length,acceptedSessionCount:d.length,sessionLastCount:d.filter(e=>void 0!==e.last).length,recoveredSessionLastCount:C.filter(({last:e})=>S.has(b(e.conversationId,e.id))).length,offlineMessageCount:y.length}}))}(e)}catch(t){throw Ir.record("error","sdk","sync","channel-sync-failed",()=>({operationId:e,error:{message:"CHANNEL 同步失败",data:t}})),t}}let Ma=null,Ra=!1;const ka=Lt({commitBatch:async function(e,t=[]){if(!wr)throw new Error("离线消息提交已取消");await Zo.commitReceivedMessages(e,"offline",void 0,{events:t??[],apply:e=>Rs.ingest(e,"offline")});const r=e.flatMap(e=>{const t=kr.get(Or({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}));return void 0===t?[]:[t]});if(await Promise.all(r),!wr)throw new Error("离线消息提交已取消")},pullers:[Sa("chat",St),Sa("owner_chat",Tt),{endpoint:"group",pullBatch:async({deliveredMsgInfos:e,limit:t})=>{const r=hr,o=Ca("background"),n=Ia("group");try{o.assertCurrent?.();const s=await fr.getLoginContext();if(null===s)throw new Error("sync(group): 无登录上下文(authProvider.getLoginContext 返回 null)");if(o.assertCurrent?.(),""!==r&&s.userId!==r)throw new DOMException("GROUP 离线同步的登录账号已改变","AbortError");const a=[],i=[],c=await _t({http:Tr,userId:s.userId,clientType:gr,decryptDeps:{...Un("offline"),onDecryptRecovery:e=>i.push(e)},asyncDecrypt:o,prepareKeys:Fn,deliveredMsgInfos:e,...void 0===t?{}:{limit:t},onReaction:e=>a.push(e)});return o.assertCurrent?.(),{...c,reactions:a,commit:async()=>{try{await ba(n.messages(c.messages),a,i.filter(n.acceptsRecovery),()=>o.assertCurrent?.(),o.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}],domainState:Zo,emitter:mr,logger:Wr,yieldToEventLoop:Kt});const xa=H({domainState:Zo,storage:Rr,getSelfId:()=>hr,assertCurrent:()=>{if(!wr||wo.signal.aborted)throw new DOMException("客服历史恢复所属账号已失效","AbortError")},hasPendingSend:e=>la.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId),fetch:async e=>{const t=hr,r=()=>{if(!wr||wo.signal.aborted||hr!==t)throw new DOMException("客服历史查询所属账号已失效","AbortError")},o=await ha(t);r();const n=await xt({http:Tr,userId:t,clientType:gr,messageIds:e,decryptDeps:o,asyncDecrypt:wa("background",r)});if(r(),200!==n.code)throw new Error(`客服历史原文查询失败:${n.code}`);return n.messages}});async function Da(){if(void 0!==no&&(!no.owned||yo))throw new Error("当前页面未持有 IM 连接,不能同步消息");const e=To.begin(),t=Eo.begin(),r=async function(){const e=hr,t=Ca("background"),r=Ia("group");try{t.assertCurrent?.();const o=await fr.getLoginContext();if(null===o)return;if(t.assertCurrent?.(),""!==e&&o.userId!==e)throw new DOMException("GROUP 会话同步的登录账号已改变","AbortError");const n=[],s=[],a=await jt({http:Tr,userId:o.userId,clientType:gr,decryptDeps:{...Un("offline"),onDecryptRecovery:e=>s.push(e)},asyncDecrypt:t,prepareKeys:Fn,onReaction:e=>n.push(e)});t.assertCurrent?.();for(const e of a.unreads)t.assertCurrent?.(),Zo.applyServerUnread({conversationType:"group",conversationId:e.groupId},e.unreadCount),_n(e.groupId);await ba(r.messages(a.messages),n,s.filter(r.acceptsRecovery),()=>t.assertCurrent?.(),t.publish),t.assertCurrent?.(),await Ta(a.unreads.map(e=>({conversationType:"group",conversationId:e.groupId}))),Nt(a)}finally{r.stop()}}().catch(e=>{throw mr.emit({type:"error",error:{scope:"sync",message:"群会话摘要同步失败",cause:e}}),e}),o=(null!==Ma?(Ra=!0,Ma):(Ma=(async()=>{let e;do{Ra=!1,e=void 0;try{await Ea()}catch(t){e=t}}while(Ra);if(void 0!==e)throw e})().finally(()=>{Ma=null}),Ma)).catch(e=>{throw mr.emit({type:"error",error:{scope:"sync",message:"CHANNEL 会话与离线消息同步失败",cause:e}}),e});bo+=1;try{const e=xa.run().catch(e=>{throw mr.emit({type:"error",error:{scope:"sync",message:"旧客服消息恢复失败,已保留未恢复的本机记录,可刷新重试",cause:e}}),e}),t=(await Promise.allSettled([ka.sync({rejectOnFailure:!0}),r,o,e])).find(e=>"rejected"===e.status);if("rejected"===t?.status)throw t.reason}finally{t(),e(),bo-=1,So="authenticated"===la.state,po?.notifySchedulingChanged()}}async function Pa(){if("ready"===Zr)return;Zr="preparing";const e=await fr.getLoginContext();if(wr){if(null!==e){if(await async function(e){if(void 0!==no&&wr){if(!yo){so??(so=no.start(vr.forAccount(e).name("ephemeral","connection",`client-${gr}`)));const t=await so;if(!wr)return;if(wr&&!yo&&t&&no.owned)return void la.setConnectionAllowed(!0)}if(la.setConnectionAllowed(!1),await la.connect(),void 0!==ao)throw Object.assign(new Error("Browser IM coordination is unavailable"),{code:"IM_CONNECTION_OWNERSHIP_UNAVAILABLE",cause:ao});throw Object.assign(new Error("Chat is active in another page; reload this page to continue here"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"})}}(e.userId),!wr)return;hr=e.userId;try{await(Cr?.prepare(e.userId))}catch{mr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录不可用,本次上传仅支持当前页面内恢复"}})}if(!wr)return;if(un.start(),void 0!==Tn&&Tn.getUserPrivateKey(e.userId,{priority:"foreground"}).catch(fn),void 0!==Rr)try{if(await Rr.open({namespace:e.userId}),Kr=!0,!wr)return;try{await Vr.hydrate()}catch(e){mr.emit({type:"error",error:{scope:"storage",message:"IM 设置初始化失败,已暂停发送 direct 已读回执",cause:e}})}if(!wr)return;if(await Zo.hydrate(()=>wr),!wr)return;for(const e of Zo.getSessions())""===e.title&&"supergroup"!==e.type&&Zo.refreshConversationProfile(e.id,e.type);if(await la.hydrateOutbox(()=>wr),!wr)return}catch(e){mr.emit({type:"error",error:{scope:"storage",message:"本地存储初始化失败",cause:e}})}if(!wr)return;if(void 0!==Mn)for(const e of Zo.getSessions())"group"===e.type&&_n(e.id)}wr&&(Zr="ready",""!==hr&&ya.start())}}function Aa(){if(yo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if("ready"===Zr)return Promise.resolve();if(null!==fo)return fo;const e=Date.now();return Ir.record("info","sdk","session","prepare-start"),fo=Pa().then(()=>Ir.record("info","sdk","session","prepare-complete",()=>({durationMs:Date.now()-e}))).catch(t=>{throw Ir.record("error","sdk","session","prepare-failed",()=>({durationMs:Date.now()-e,error:{message:"IM prepare 失败",data:t}})),t}).finally(()=>{fo=null}),fo}function ja(e){Ir.record("info","sdk","connection","disconnect",()=>({data:{reason:e}})),mo=!1,vo+=1,Vs.stop(),la.disconnect(e),ga.stop()}function Oa(e,t={}){if(void 0!==io)return io;let r,o;return io=new Promise((e,t)=>{r=e,o=t}),async function(e,t){const r=Date.now();let o;Ir.record("info","sdk","session","teardown-start",()=>({data:{localData:e?.localData??"preserve",pendingMessages:e?.pendingMessages??"fail"}})),wr=!1,Ar.clear(),Nn(),wo.abort(),Io.dispose(),Eo.dispose(),To.dispose(),na.dispose(),t.notifyReplacement&&mr.emit({type:"session:replaced"});const n=ya.dispose(),s=po?.dispose();us(),pa(),ca.dispose(),da.dispose(),Vs.stop(),Bs.dispose(),Gs.dispose(),Rs.dispose(),ua.dispose(),va.dispose(),In.dispose(),cn.dispose(),an.dispose();const a=la.disposeMediaTasks({preserveRecovery:!0===t.preserveUploadRecovery});for(const e of oo)e.close();oo.clear(),Oo+=1,la.markOutboxForLogout(e?.pendingMessages??"fail"),ea.dispose(),ta.dispose(),ra.dispose(),Go.dispose(),Vo.dispose(),qo.dispose(),Br.dispose();const i=Vr.dispose();dn.dispose();const c=Zo.invalidateAndDrainDraftOperations();pn.dispose(),zs(),Qs(),Zs(),Ps(),Js.dispose(),sa.reset(),Rn?.clearAll(),Hn.clear(),Vn.clear(),$n.clear(),ja("im-logout"),(t.requireStorageClose||!0===no?.owned)&&await(fo?.catch(()=>{}));try{await a}catch{mr.emit({type:"error",error:{scope:"storage",message:"上传任务清理未完成,请检查本地数据与网络状态"}})}await n;try{await(Cr?.dispose(!0===t.preserveUploadRecovery))}catch(e){o=e,mr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录清理失败,请清除此站点的本地数据"}})}await c,await i,await s,await Promise.allSettled([...Co]),await Zo.waitForChannelSyncPersistence(),await Promise.allSettled([...kr.values(),...Bn.values()]),await Promise.all([...jr.values()]),Zo.clearSession();const d="purge"===e?.localData?hr:"";let p,l=""===d?void 0:o,u=!0;if(void 0!==Rr)try{await Rr.close()}catch(e){u=!1,""!==d&&(l=e),!1!==t.reportStorageErrors&&mr.emit({type:"error",error:{scope:"storage",message:""===d?"关闭本地存储失败":"关闭本地存储失败,已跳过删除本账号本地库",cause:e}})}if(""!==d&&u)try{void 0!==Mr?await Mr.purgeCurrentAccount({namespaceFactory:vr,accountId:d}):await ae(d,{namespaceFactory:vr}),void 0===l&&(p=d)}catch(e){l=e,!1!==t.reportStorageErrors&&mr.emit({type:"error",error:{scope:"storage",message:"删除本账号本地库失败",cause:e}})}if(Zr="empty",Ir.record("info","sdk","session","teardown-complete",()=>({durationMs:Date.now()-r,data:{purgedAccountId:p,purgeFailed:void 0!==l}})),sn(),eo(),$s(),fa(),yo=!0,(t.requireStorageClose||void 0!==no)&&!u)throw new Error("Previous chat page could not close its account storage");return no?.stop(),{...void 0===p?{}:{purgedAccountId:p},...void 0===l?{}:{purgeError:l}}}(e,t).then(r,o),io}function _a(e){const t=e.conversationId,r=hr,n=Oo,s=_o(t);let a,i;return async({readCursor:c,cursor:d,signal:p,isCurrent:l})=>{const u=Io.enterForeground();try{const u=()=>{const a=Zo.getConversationContext(e);return wr&&hr===r&&l()&&n===Oo&&s===_o(t)&&"channel"===a?.type&&(void 0===a.channelState||!o(a.channelState))};if(Mt(p),!u())return;if(void 0!==d&&(a!==c||void 0===i))return;const m=await fr.getLoginContext();if(Mt(p),null===m||m.userId!==r||!u())return;const v=[],y=[],g=await Rt({http:Tr,userId:m.userId,clientType:gr,channelId:t,index:d??c,containAnchor:void 0===d,signal:p,decryptDeps:{...jn("history"),onDecryptRecovery:e=>y.push({...e,source:"history"})},prepareKey:e=>An([e],{recoverExistingMessages:!1,priority:"foreground",signal:p}),onContentDecodeError:Yr,onReaction:e=>v.push(e)});if(Mt(p),!u())return;if(void 0===d){const e=g.messages.find(e=>e.extensions?.historyCursor===c);if(void 0===e)return;a=c,i=e.sortKey}if(void 0===i)return;if(g.messages.length>0&&Zo.upsertMessages(g.messages,"offline",{backfillOnly:!0}),!u())return;for(const e of v){if(!u())return;is(e)}for(const e of y){if(!u())return;Lr(e)}if(!u())return;return{messages:g.messages.map(t=>{const r=Zo.getConversationMessage(e,t.id);if(void 0===r)throw new Error("首未读历史邻页在领域合并后缺少消息");return r}),readCursorSortKey:i,exhausted:!g.hasNewer,...void 0===g.nextCursor?{}:{nextCursor:g.nextCursor}}}finally{u()}}}async function Na(){const e=Ia("direct");try{const t=[],r=[],o=hr,n=wa("background");n.assertCurrent?.();const s=await fr.getLoginContext();if(null===s)throw new Error("pullOfflineChat: 无登录上下文(authProvider.getLoginContext 返回 null)");if(n.assertCurrent?.(),""!==o&&s.userId!==o)throw new DOMException("DIRECT 离线拉取的登录账号已改变","AbortError");const a={...await ha(s.userId),onDecryptRecovery:e=>t.push(e)},i=await Ct({http:Tr,userId:s.userId,clientType:gr,decryptDeps:a,asyncDecrypt:n,onReaction:e=>r.push(e)}),c=await bt({http:Tr,userId:s.userId,clientType:gr,decryptDeps:a,asyncDecrypt:wa("background",n.assertCurrent),onReaction:e=>r.push(e)});n.assertCurrent?.();const d=e.messages([...i,...c]);return await ba(d,r,t.filter(e.acceptsRecovery),()=>n.assertCurrent?.(),n.publish),d}finally{e.stop()}}Ro=async({conversation:e,newestLoaded:t,cursor:r,limit:n,signal:s})=>{Mt(s);const{conversationId:a}=e,i=Zo.getConversationContext(e);if(void 0===i)throw new Error(`加载更新消息失败:会话不存在(conversationId=${a})`);if("direct"===i.type||"robot"===i.type||"customerService"===i.type)return{messages:[],exhausted:!0};if("group"===i.type){if(void 0!==i.groupState&&"active"!==i.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:a},c=hr,d=Ca(!0===po?.hasForeground(e)?"foreground":"background",s);d.assertCurrent?.(o);const p=Ia("group",o);try{const o=await fr.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(d.assertCurrent?.(),o.userId!==c)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const i=void 0===r?t?.serverTime??t?.createdAt:lr(r,a);if(void 0===i)throw new Error(`GROUP 向新分页缺少可信 baseTime(groupId=${a}, messageId=${t?.id??""})`);const l=[],u=[],m=await Ot({asyncDecrypt:d,signal:s,http:Tr,userId:o.userId,clientType:gr,groupId:a,baseTime:i,direct:2,limit:n,decryptDeps:{...Un("history"),onDecryptRecovery:e=>u.push(e)},prepareKeys:t=>Fn(t,{signal:s,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onReaction:e=>l.push(e)});d.assertCurrent?.();const v=p.messages(m.messages);for(const e of v)d.publish([e],()=>Zo.upsertMessages([e],"offline",{backfillOnly:!0}));for(const e of l)d.publish([],()=>is(e));for(const e of u)d.publish([],()=>{p.acceptsRecovery(e)&&Lr(e)});d.assertCurrent?.();return{messages:v,...q({conversationId:a,direction:"newer",baseTime:i,batchSize:m.batchSize,boundaryTime:m.newestEntryTime,limit:n})}}finally{p.stop()}}if("channel"===i.type){if(void 0!==i.channelState&&o(i.channelState))return{messages:[],exhausted:!0};const n=r??t?.extensions?.historyCursor;if("string"!=typeof n||""===n.trim())throw new Error(`CHANNEL 向新分页缺少可信 historyCursor(channelId=${a}, messageId=${t?.id??""})`);const c=Oo,d=_o(a),p=await fr.getLoginContext();if(null===p)return{messages:[],exhausted:!0};const l=void 0===r?(await ra.loadMessageContext(a,n,p.userId,s)).context:await ra.loadNewerPage(a,n,p.userId,s);Mt(s);const u=Zo.getConversationContext(e);return!wr||c!==Oo||d!==_o(a)||"channel"!==u?.type||void 0!==u.channelState&&o(u.channelState)?{messages:[],exhausted:!0}:(l.messages.length>0&&Zo.upsertMessages(l.messages,"offline",{backfillOnly:!0}),{messages:l.messages,exhausted:!l.hasNewer,...l.hasNewer&&void 0!==l.nextCursor?{nextCursor:l.nextCursor}:{}})}throw new Error(`向新分页未实现:${i.type}`)};function La(e){const t=_({...e,operation:"openConversation"});return Object.assign(new Error(t.code),t,{name:"ImConversationOpenError"})}function Ka(e){if(!wr)throw La({code:"IM_SDK_CONVERSATION_RUNTIME_RELEASED",category:"state",retryable:!1,conversation:e})}function Fa(e,t){return{id:e.conversationId,type:e.conversationType,title:t.title.trim()||e.conversationId,...void 0===t.avatar?{}:{avatar:t.avatar},lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:t.muted??!1,...void 0===t.groupState?{}:{groupState:t.groupState},...void 0===t.channelState?{}:{channelState:t.channelState},...void 0===t.channelPermissions?{}:{channelPermissions:t.channelPermissions},...void 0===t.channelAccessSnapshot?{}:{channelAccessSnapshot:t.channelAccessSnapshot},...void 0===t.sendDisabledReason?{}:{sendDisabledReason:t.sendDisabledReason}}}const Ua={...a({...void 0===Sr?{}:{coreClient:Sr},authProvider:fr,http:Tr,resolveInput:ln,domainState:Zo,operations:{list:function(){return Zo.getConversationList()},pullOffline:Na,sync:async function(){await Da()},prefetchRecent:(e,t)=>po.prefetchRecent(e,t)},beforeDeleteConversation:Lo,terminateConversationSending:(e,t)=>la.terminateConversationSending(e,t),resetConversationBackground:e=>Br.api.resetBackground(e),reportStorageError:(e,t)=>mr.emit({type:"error",error:{scope:"storage",message:e,cause:t}}),markChannelRead:(e,t)=>la.markRead(e,t,"channel"),settleConversationRead:async e=>{const t=await Ga(e,{initialPosition:"latest"},"read");try{await t.markConversationRead()}finally{t.close()}}}),...Br.api,ensureOpenableConversation:async function(e){const t=function(e){const t=e?.conversationType,r=e?.conversationId;if("supergroup"===t)throw La({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",retryable:!1,conversation:e});if("direct"!==t&&"group"!==t&&"channel"!==t&&"robot"!==t&&"customerService"!==t||"string"!=typeof r||""===r.trim())throw La({code:"IM_SDK_CONVERSATION_INVALID",category:"validation",retryable:!1,...void 0===e?{}:{conversation:e}});return Object.freeze({conversationType:t,conversationId:r.trim()})}(e);if(Ka(t),void 0!==Zo.getSession(t))return t;const r=To.begin();let o=!1;const n=mr.subscribe(e=>{"session:removed"===e.type&&e.conversation.conversationType===t.conversationType&&e.conversation.conversationId===t.conversationId&&(o=!0)}),s=()=>{if(Ka(t),o)throw La({code:"IM_SDK_CONVERSATION_OPEN_INVALIDATED",category:"state",retryable:!0,conversation:t})};try{if("direct"===t.conversationType){const e=Vo.peekItem("individual",t.conversationId);if(void 0!==e)return Zo.prepareConversation(Fa(t,{title:e.displayName||e.cardDisplayName,...void 0===e.avatarUrl?{}:{avatar:e.avatarUrl}})),t;const r=await an.getRelationship(t.conversationId);if(s(),"friend"!==r)throw La({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",retryable:!1,conversation:t,details:Object.freeze({relationship:r})});const o=await an.getProfile(t.conversationId);if(s(),null===o||o.id!==t.conversationId)throw La({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});return Zo.prepareConversation(Fa(t,{title:o.remark??o.nickname,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted}})),t}if("group"===t.conversationType){const e=Zo.isMembershipTerminated(t),r=Vo.peekItem("group",t.conversationId);if(void 0!==r&&!e)return Zo.prepareConversation(Fa(t,{title:r.displayName||r.cardDisplayName,...void 0===r.avatarUrl?{}:{avatar:r.avatarUrl},groupState:"active"})),t;if(void 0===Ko)throw La({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const o=await Ko.getGroupProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===o||o.id!==t.conversationId)throw La({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});if(!1===o.isInGroup||e&&!0!==o.isInGroup||void 0!==o.status&&2!==o.status)throw La({code:"IM_SDK_GROUP_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({...void 0===o.status?{}:{status:o.status},...void 0===o.isInGroup?{}:{isInGroup:o.isInGroup}})});return Zo.prepareConversation(Fa(t,{title:o.name,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted},groupState:"active"}),{membershipConfirmed:e}),e&&(s(),Es({conversationType:"group",conversationId:t.conversationId})),t}if("customerService"===t.conversationType){if("__customer_service__"!==t.conversationId||void 0===Zo.getConversationContext(t))throw new Error("客服会话只能由已接收消息创建");return t}if("robot"===t.conversationType){const e=qo.peek(t.conversationId);return Zo.prepareConversation(Fa(t,{title:e?.displayName??t.conversationId,...void 0===e?.avatarUrl?{}:{avatar:e.avatarUrl}})),t}if(void 0===Fo)throw La({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const e=Zo.isMembershipTerminated(t),r=await Fo.getProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===r||r.id!==t.conversationId)throw La({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});const o="active"===r.channelState||"muted"===r.channelState,n="muted"===r.channelState&&!0===r.accessSnapshot?.allMembersMuted&&"owner"!==r.role&&"admin"!==r.role;if(!o||n)throw La({code:"IM_SDK_CHANNEL_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({channelState:r.channelState,role:r.role,hiddenByAllMemberMute:n})});return Zo.prepareConversation(Fa(t,{title:r.name,...void 0===r.avatar?{}:{avatar:r.avatar},...void 0===r.muted?{}:{muted:r.muted},channelState:r.channelState,channelPermissions:r.permissions,...void 0===r.accessSnapshot?{}:{channelAccessSnapshot:r.accessSnapshot},...r.permissions.sendMessages?{}:{sendDisabledReason:`channel_${r.channelState}`}}),{membershipConfirmed:e}),e&&(s(),Es({conversationType:"channel",conversationId:t.conversationId})),t}catch(e){if(function(e){return e instanceof Error&&"ImConversationOpenError"===e.name&&"string"==typeof e.code}(e))throw e;const r=function(e){if("object"==typeof e&&null!==e&&"string"==typeof e.code&&"string"==typeof e.category&&"boolean"==typeof e.retryable){const t=e;return{code:t.code,category:t.category,retryable:t.retryable}}return e instanceof de?{code:"IM_SDK_CONVERSATION_PROFILE_READ_FAILED",category:"network",retryable:!0}:e instanceof pe||e instanceof Error&&"DirectoryMappingError"===e.name?{code:"IM_SDK_CONVERSATION_PROFILE_INVALID",category:"contract",retryable:!1}:{code:"IM_SDK_CONVERSATION_OPEN_PREREQUISITE_FAILED",category:"state",retryable:!1}}(e);throw La({...r,conversation:t,cause:e})}finally{n(),r()}},getContext:e=>Zo.getConversationContext(e)};function Ba(e,t,r=!0){if(!wr)throw e.close(),new Error("IM SDK 账号运行时已释放,不能打开会话");return t?.aborted&&(e.close(),Mt(t)),function(e,t=!0){const r=new AbortController,o={...e,resumeMedia(){t&&wr&&!r.signal.aborted&&"authenticated"===la.state&&"robot"!==e.ref.conversationType&&la.resumePausedMediaUploads(e.ref,r.signal).catch(()=>{wr&&!r.signal.aborted&&mr.emit({type:"error",error:{scope:"unknown",message:"当前会话上传恢复失败,请重新选择文件"}})})},close(){r.abort(),e.close(),oo.delete(o)}};return b(o,e),oo.add(o),t&&o.resumeMedia(),o}(e,r)}async function Ga(e,t={},r){if(!wr)throw new Error("IM SDK 账号运行时已释放,不能打开会话");const o=po?.enterForeground(e),n=Io.enterForeground(),s=To.begin();try{const o={beginReceiving:To.begin,domainState:Zo,invalidateHistory:Lo,emitter:mr,drafts:dn.api,sendText:ma.operations.sendText,sendContact:ma.operations.sendContact,sendImage:ma.operations.sendImage,sendVideo:ma.operations.sendVideo,sendVoice:ma.operations.sendVoice,sendFile:ma.operations.sendFile,sendGif:ma.operations.sendGif,sendMediaAlbum:ma.operations.sendMediaAlbum,sendExpression:ma.operations.sendExpression,sendGame:ma.operations.sendGame,sendMiniProgram:ma.operations.sendMiniProgram,sendTransfer:ma.operations.sendTransfer,sendGift:ma.operations.sendGift,sendLiveRoom:ma.operations.sendLiveRoom,replaceVideo:ma.operations.replaceInterruptedVideo,replaceFile:ma.operations.replaceInterruptedFile,forwardMessages:ma.operations.forwardMessages,recallMessage:ma.operations.recallMessage,editMessage:ma.operations.editMessage,setReaction:({conversation:e,parentMessageId:t,emoji:r,action:o})=>{if("robot"===e.conversationType||"customerService"===e.conversationType)return Promise.resolve({ok:!1,reason:"restricted"});const n={conversationType:e.conversationType,conversationId:e.conversationId};return"toggle"===o?Rs.toggle({conversation:n,parentMessageId:t,emoji:r}):Rs.set({conversation:n,parentMessageId:t,emoji:r,action:"add"===o?0:1})},markRead:ma.operations.markRead,markConversationRead:ma.operations.markConversationRead,markVisibleMessages:ma.operations.markVisibleMessages,markDirectMediaConsumed:ma.operations.markDirectMediaConsumed,prepareMediaPreview:Cn,getSelfId:()=>hr,isOutboxOwned:e=>la.getPendingOutbox().some(t=>t.id===e),hasOutboxForConversation:e=>la.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId)};switch(e.conversationType){case"direct":{const n={conversationType:"direct",conversationId:e.conversationId},s=await C(n,{...o,getRelationship:an.getRelationship,shouldCheckRelationship:()=>"authenticated"===la.state,appendContactRequiredTextFailure:e=>Zo.appendDirectContactRequiredTextFailure({conversationId:e.conversationId,senderId:hr,text:e.text,...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}}),setMuted:(e,t)=>Ua.setMuted(e,t),fetchMessagesByIdBatch:e=>(async(e,t)=>{const r=Ia("direct",e,t);try{const o=hr,n=Ao(e),s=()=>{if(!wr||hr!==o||n!==Ao(e))throw new DOMException("DIRECT 消息查询所属账号或历史已失效","AbortError")};s();const{userId:a}=await ys();if(s(),a!==o)throw new DOMException("DIRECT 消息查询的登录账号已改变","AbortError");const i=await ha(a,{priority:"foreground"});s();const c=[],d=[],p=await N(t,async t=>{s();const r=await xt({http:Tr,userId:a,clientType:gr,messageIds:t,asyncDecrypt:wa("foreground",s),decryptDeps:{...i,onDecryptRecovery:e=>d.push(e)},onPlaintextFallback:t=>Ir.record("warn","sdk","crypto","direct-quoted-plaintext-fallback",()=>({conversation:e,data:{...t,endpoint:"/offline/v1/chat/msg/by_id",wireEncrypt:1,reason:"mislabeled-plaintext"}})),onReaction:e=>c.push(e)});if(s(),200!==r.code)throw Object.assign(new Error("DIRECT 按 ID 查询业务失败"),{code:r.code});return r});s();const l=r.messages(p.messages).filter(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId);for(const e of l)s(),vs([e]),s();for(const t of c)s(),t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&is(t),s();for(const t of d)s(),r.acceptsRecovery(t)&&t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&Lr(t),s();const u=l.map(t=>{const r=Zo.getConversationMessage(e,t.id);if(void 0===r)throw new Error("DIRECT 按 ID 查询在领域合并后缺少消息");return r}),m=new Set(u.map(e=>e.id)),v=new Set(p.missingMessageIds);for(const e of p.messages)m.has(e.id)||v.add(e.id);return{messages:u,missingMessageIds:[...v]}}finally{r.stop()}})(n,e)},t),a=Ba(s,t.signal,"read"!==r);return as(n),a}case"group":{const n={conversationType:"group",conversationId:e.conversationId},s=Ba(await w(n,{...o,getSendPermissionError:e=>{const t=Zo.getConversationContext(n),r="group"===t?.type?t.groupState:"unknown";if(void 0!==r&&"active"!==r)return _({code:"IM_SDK_GROUP_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({groupState:r})})},setMuted:(e,t)=>Ua.setMuted(e,t),fetchMessagesByIdBatch:e=>gs(n.conversationId,e)},t),t.signal,"read"!==r);return as(n),s}case"channel":{const n={conversationType:"channel",conversationId:e.conversationId},s=Ba(await I(n,{...o,loadEntryUnreadPage:_a(n),getSelfId:()=>hr,deleteMessageForEveryone:la.deleteChannelMessageForEveryone,reconcilePage:oa.reconcilePage,getSendPermissionError:e=>{const t=Zo.getConversationContext(n),r="channel"===t?.type&&void 0!==t.channelState?t.channelState:"unknown_restricted",o=dt({channelState:r,nowMs:Date.now(),..."channel"!==t?.type||void 0===t.channelAccessSnapshot?{}:{snapshot:t.channelAccessSnapshot},..."channel"!==t?.type||void 0===t.channelPermissions?{}:{permissions:t.channelPermissions}});if("active"!==o.channelState||!o.permissions.sendMessages)return _({code:"IM_SDK_CHANNEL_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({channelState:o.channelState,...void 0===o.muteReason?{}:{muteReason:o.muteReason}})})},setMuted:(e,t)=>Ua.setMuted(e,t),fetchMessagesByIdBatch:e=>fs(n.conversationId,e)},t),t.signal,"read"!==r);return as(n),s}case"customerService":{const n={conversationType:"customerService",conversationId:e.conversationId};return Ba(await h(n,{...o,setMuted:async()=>{throw new Error("客服会话不支持免打扰设置")}},t),t.signal,"read"!==r)}case"robot":{const n={conversationType:"robot",conversationId:e.conversationId};return Ba(await f(n,{...o,setMuted:(e,t)=>Ua.setMuted(e,t)},t),t.signal,"read"!==r)}default:throw new Error(`openConversation:${e.conversationType} 产品 handler 未注册`)}}finally{s(),o?.(),n()}}return{advancedMessageDiagnostics:{sendDirectText:async e=>{await ma.operations.sendText({conversationId:e.peerId,conversationType:"direct",text:e.text,encrypted:e.encrypted})}},openConversation:Ga,localData:on,directory:Vo.search,customerService:tn,robots:qo.api,search:pn.api,applications:cn.api,expressions:zo.api,sessionFavorites:nn.api,outbox:ua.api,drafts:dn.api,connection:u({operations:{prepare:Aa,connect:function(e){if(yo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if(!wr||yo)return Promise.reject(new Error("IM 连接已停止,请刷新页面后重试"));if(mo=!0,"authenticated"===la.state)return Promise.resolve();if(null!==ho)return ho;lo=e?.initialSync??"auto",uo=!1;const t=Date.now();Ir.record("info","sdk","connection","connect-start",()=>({data:{initialSync:lo}}));const r=vo;return ho=(async()=>{await Aa(),wr&&mo&&r===vo&&(ga.start(),await la.connect())})().then(()=>Ir.record("info","sdk","connection","connect-complete",()=>({durationMs:Date.now()-t}))).catch(e=>{throw Ir.record("error","sdk","connection","connect-failed",()=>({durationMs:Date.now()-t,error:{message:"IM connect 失败",data:e}})),e}).finally(()=>{ho=null}),ho},disconnect:ja,subscribe:function(e){return mr.subscribe(e)},getSnapshot:function(){return{connectionState:la.state,pendingOutbox:la.getPendingOutbox()}},getLifecycle:function(){return{sessionState:Zr,connectionState:la.state,...""!==hr?{userId:hr}:{},prepared:"ready"===Zr,connectionDesired:mo,authenticated:"authenticated"===la.state,receiving:To.receiving,syncing:Eo.receiving}}},getState:()=>la.state}),conversations:Ua,settings:Vr.api,push:ca.api,activity:da.api,contact:an,group:d({directory:Vo.groups,...void 0===Ko?{}:{profile:{getGroupProfile:async(e,t)=>{const r=Zo.beginConversationProfileRead({conversationType:"group",conversationId:e},t);try{const o=await Ko.getGroupProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}},...void 0===Ko.getGroupMemberNames?{}:{getGroupMemberNames:Ko.getGroupMemberNames.bind(Ko)},...void 0===Ko.listGroupMembers?{}:{listGroupMembers:Ko.listGroupMembers.bind(Ko)},...void 0===Ko.peekGroupMembers?{}:{peekGroupMembers:Ko.peekGroupMembers.bind(Ko)},...void 0===Ko.peekGroupProfile?{}:{peekGroupProfile:Ko.peekGroupProfile.bind(Ko)},...void 0===Ko.peekGroupMemberNames?{}:{peekGroupMemberNames:Ko.peekGroupMemberNames.bind(Ko)}}},...void 0===Sr?{}:{coreClient:Sr},...void 0===hn?{}:{avatarTransfer:hn},domainState:{...Ms,prepareConversation:e=>Zo.prepareConversation(e)},emitter:mr,pinned:ea.operations}),channel:t({directory:Vo.channels,...void 0===Fo?{}:{channelProfile:{listProfiles:Fo.listProfiles.bind(Fo),getProfile:async(e,t)=>{const r=Zo.beginConversationProfileRead({conversationType:"channel",conversationId:e},t);try{const o=await Fo.getProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}}}},...void 0===Uo?{}:{channelMembers:Uo},...void 0===Bo?{}:{channelMentionMembers:Bo},mentionCandidates:Go.api,applications:ra.applications,pinned:ta.operations,...void 0===Sr?{}:{coreClient:Sr},...void 0===hn?{}:{avatarTransfer:hn},crypto:yn,domainState:{prepareConversation:e=>Zo.prepareConversation(e),setChannelRestriction:Zo.setChannelRestriction,removeConversationForMembershipTermination:Ms.removeConversationForMembershipTermination,updateConversationProfile:Zo.updateConversationProfile,refreshConversationProfile:Zo.refreshConversationProfile},emitter:mr,...void 0===Rn?{}:{cacheCreatedSecretKey:(e,t)=>Rn.primeChannelKey(e,t)},getSelfUserId:async()=>""!==hr?hr:(await fr.getLoginContext())?.userId??""}),media:va.api,calls:v(Bs),groupCalls:P(Gs),teardown:Oa}}export{ur as createSessionRuntime};
1
+ import{createChannelPinnedRuntime as e,createChannelApi as t,createChannelLegacyMessageRepair as r,isChannelHistoryBlocked as o,createChannelOperationsRuntime as n}from"../domains/channel.js";import{createContactApi as s}from"../domains/contact.js";import{createConversationsApi as a,createConversationInputResolver as i}from"../domains/conversation.js";import{createGroupPinnedRuntime as c,createGroupApi as d}from"../domains/group.js";import{createMediaUploadComputation as p}from"../domains/media-byte-computation.js";import{createMessageOperationsRuntime as l}from"../domains/message.js";import{createConnectionApi as u}from"../domains/session.js";import{createApplicationsRuntime as m}from"../product/applications.js";import{createDirectCallsApi as v}from"../product/calls.js";import{createChannelMentionCandidatesRuntime as y}from"../product/channel-mention-candidates.js";import{createConversationBackgroundRuntime as g}from"../product/conversation-background.js";import{createRobotConversationHandle as h,createCustomerServiceConversationHandle as f,createChannelConversationHandle as I,createGroupConversationHandle as w,createDirectConversationHandle as C,linkConversationHandleDomainAccess as b}from"../product/conversation-handle.js";import{createCustomerServiceApi as S,createCustomerServiceError as T}from"../product/customer-service.js";import{createSdkDiagnosticWriter as E,toImDiagnosticMessage as R}from"../product/diagnostics.js";import{createDirectoryRuntime as M}from"../product/directory.js";import{createDraftsRuntime as k}from"../product/draft.js";import{isImReactionEmojiToken as D}from"../product/emoji-catalog.js";import{createExpressionsRuntime as x}from"../product/expressions.js";import{createGroupCallsApi as P}from"../product/group-calls.js";import{createLocalDataRuntime as A}from"../product/local-data.js";import{createDefaultMediaAssetCacheStrategyRegistry as j,createMediaTasksRuntime as O}from"../product/media.js";import{createImSdkError as _}from"../product/message.js";import{fetchMessagesByIdWithCaseVariants as N}from"../product/messages-by-id.js";import{createOutboxRuntime as L}from"../product/outbox.js";import{createRobotDirectoryRuntime as K}from"../product/robots.js";import{createSearchRuntime as F}from"../product/search.js";import{createSessionFavoritesRuntime as U}from"../product/session-favorites.js";import{createImSettingsRuntime as B}from"../product/settings.js";import{createChannelReadSummaryRefresh as G}from"./channel-read-summary-refresh.js";import{createCustomerServiceLegacyRecovery as H}from"./customer-service-legacy-recovery.js";import{recordDecryptFailedDiagnostic as V}from"./decrypt-diagnostics.js";import{createForegroundWorkCoordinator as $}from"./foreground-work-coordinator.js";import{resolveGroupHistoryPageBoundary as q}from"./group-history-page-boundary.js";import{createKeyPrefetchQueue as W}from"./key-prefetch.js";import{createLocalMediaPreviewPreparation as z}from"./local-media-preview.js";import{createMediaCacheMaintenance as J}from"./media-cache-maintenance.js";import{createAccountMediaUploadRecovery as Q,createMediaOnlineWaiter as Y}from"./media-upload-recovery.js";import{inspectProtobufWireShape as X}from"./protobuf-wire-shape.js";import{createReceivingActivity as Z}from"./receiving-activity.js";import{createRecentHistoryFetcher as ee}from"./recent-history-fetcher.js";import{createRecentHistoryPrefetch as te}from"./recent-history-prefetch.js";import{createSessionHttpClients as re}from"./session-http-clients.js";import{createSignalOfflinePoller as oe}from"./signal-offline-poller.js";import{createWsTransport as ne}from"../../../im-browser/src/transport/ws-transport.js";import{createIndexedDbStorageAdapter as se,deleteIndexedDbNamespace as ae}from"../../../im-browser/src/storage/indexed-db-storage-adapter.js";import{createProfileHttpAdapter as ie}from"../../../im-browser/src/http/profile-http-adapter.js";import{createChannelHttpAdapter as ce,ChannelHttpError as de,ChannelProfileMappingError as pe}from"../../../im-browser/src/http/channel-http-adapter.js";import{createChannelMemberHttpAdapter as le}from"../../../im-browser/src/http/channel-member-http-adapter.js";import{createChannelMentionMemberHttpAdapter as ue}from"../../../im-browser/src/http/channel-mention-member-http-adapter.js";import{createDirectoryHttpAdapter as me}from"../../../im-browser/src/http/directory-http-adapter.js";import{createExpressionHttpAdapter as ve}from"../../../im-browser/src/http/expression-http-adapter.js";import{createSessionFavoriteHttpAdapter as ye}from"../../../im-browser/src/http/session-favorite-http-adapter.js";import{createChannelJoinApplicationHttpAdapter as ge}from"../../../im-browser/src/http/channel-join-application-http-adapter.js";import{createContactApplicationHttpAdapter as he,createGroupApplicationHttpAdapter as fe}from"../../../im-browser/src/http/application-http-adapters.js";import{createDomainState as Ie}from"../../../im-core/src/state/domain-state.js";import{encodeConversationKey as we}from"../../../im-core/src/conversation-identity.js";import{createNetworkMonitor as Ce}from"../../../im-browser/src/network/network-monitor.js";import{createCryptoTaskExecutor as be}from"../../../im-browser/src/crypto/crypto-task-executor.js";import{createMediaTransferAdapter as Se}from"../../../im-browser/src/media/media-transfer-adapter.js";import{createMediaPreviewPreparationExecutor as Te}from"../../../im-browser/src/media/media-preview-preparation-executor.js";import{createChannelKeyService as Ee}from"../../../im-browser/src/crypto/channel-key-service.js";import{createSendStrategyRegistry as Re}from"../../../im-core/src/message-flow/send/send-strategy-registry.js";import{createDirectSendStrategy as Me}from"../../../im-core/src/message-flow/send/direct-send-strategy.js";import{createGroupSendStrategy as ke}from"../../../im-core/src/message-flow/send/group-send-strategy.js";import{createChannelSendStrategy as De}from"../../../im-core/src/message-flow/send/channel-send-strategy.js";import{createRobotSendStrategy as xe}from"../../../im-core/src/message-flow/send/robot-send-strategy.js";import{createRecallStrategyRegistry as Pe,createDirectRecallStrategy as Ae,createGroupRecallStrategy as je,createChannelRecallStrategy as Oe}from"../../../im-core/src/message-flow/recall/recall-strategy.js";import{createEditStrategyRegistry as _e,createDirectEditStrategy as Ne,createGroupEditStrategy as Le,createChannelEditStrategy as Ke}from"../../../im-core/src/message-flow/edit/edit-strategy.js";import{createReactionReceiveHandlers as Fe}from"../../../im-core/src/message-flow/reaction/reaction-receive-handlers.js";import{createGroupReceiveHandlers as Ue}from"../../../im-core/src/message-flow/receive/group-receive-handlers.js";import{createChannelReceiveHandlers as Be}from"../../../im-core/src/message-flow/receive/channel-receive-handlers.js";import{createRobotReceiveHandlers as Ge}from"../../../im-core/src/message-flow/receive/robot-receive-handlers.js";import{createChannelNotifyReceiveHandlers as He}from"../../../im-core/src/message-flow/receive/channel-notify-receive-handlers.js";import{createChannelApplicationReceiveHandlers as Ve}from"../../../im-core/src/message-flow/receive/channel-application-receive-handlers.js";import{createSessionFavoriteReceiveHandlers as $e}from"../../../im-core/src/message-flow/receive/session-favorite-receive-handlers.js";import{createFriendActionReceiveHandlers as qe}from"../../../im-core/src/message-flow/receive/friend-action-receive-handlers.js";import{createWalletNotifyReceiveHandlers as We}from"../../../im-core/src/message-flow/receive/wallet-notify-receive-handlers.js";import{createContactApplicationReceiveHandlers as ze}from"../../../im-core/src/message-flow/receive/contact-application-receive-handlers.js";import{createContactApplicationAnswerReceiveHandlers as Je}from"../../../im-core/src/message-flow/receive/contact-application-answer-receive-handlers.js";import{createDirectCallManager as Qe}from"../../../im-core/src/message-flow/call/direct-call-manager.js";import{createGroupCallManager as Ye}from"../../../im-core/src/message-flow/call/group-call-manager.js";import{createGroupEventReceiveHandlers as Xe}from"../../../im-core/src/message-flow/receive/group-event-receive-handlers.js";import{createChannelReadReceiveHandlers as Ze}from"../../../im-core/src/message-flow/read/channel-read-receive-handlers.js";import{createReadStrategyRegistry as et}from"../../../im-core/src/message-flow/read/read-strategy.js";import{createPushRegistration as tt}from"../../../im-core/src/push/push-registration.js";import{createClientActivity as rt}from"../../../im-core/src/connection/client-activity.js";import{createImConnection as ot}from"../../../im-core/src/connection/connection-manager.js";import{createBrowserConnectionOwnership as nt}from"../../../im-browser/src/network/browser-connection-ownership.js";import{CmdId as st}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{createGroupRestrictionCoordinator as at}from"../../../im-core/src/state/group-restriction-coordinator.js";import{createChannelRestrictionCoordinator as it}from"../../../im-core/src/state/channel-restriction-coordinator.js";import{resolveMediaUploadPlan as ct}from"../../../im-browser/src/media/media-transfer-policy.js";import{resolveChannelAccess as dt}from"../../../im-core/src/state/channel-permissions.js";import{createGroupReadStrategy as pt}from"../../../im-core/src/message-flow/read/group-read-strategy.js";import{createRobotReadStrategy as lt}from"../../../im-core/src/message-flow/read/robot-read-strategy.js";import{createCustomerServiceReadStrategy as ut}from"../../../im-core/src/message-flow/read/customer-service-read-strategy.js";import{createMediaPreviewAdapter as mt}from"../../../im-browser/src/media/media-preview-adapter.js";import{isCryptoExecutionError as vt,CryptoExecutionError as yt}from"../../../im-core/src/ports/crypto-task-executor.js";import{createRsaTeaCryptoAdapter as gt}from"../../../im-browser/src/crypto/rsa-tea-crypto-adapter.js";import{createImDiagnosticLogger as ht}from"../../../im-core/src/diagnostics.js";import{createPeerPublicKeyService as ft}from"../../../im-browser/src/crypto/peer-public-key-service.js";import{getChannelSecretKey as It}from"../../../im-browser/src/http/requests/get-channel-secret-key.js";import{createEncryptKeyService as wt}from"../../../im-browser/src/crypto/encrypt-key-service.js";import{pullOfflineInboundChat as Ct,pullOfflineOwnerChat as bt,pullOfflineInboundChatBatch as St,pullOfflineOwnerChatBatch as Tt}from"../../../im-browser/src/http/requests/pull-offline-chat.js";import{createReactionManager as Et}from"../../../im-core/src/message-flow/reaction/reaction-manager.js";import{throwIfAborted as Rt}from"../../../im-core/src/abort.js";import{pullChannelMessageContext as Mt}from"../../../im-browser/src/http/requests/channel-message-context.js";import{pullGroupMessagesById as kt,pullDirectMessagesById as Dt,pullChannelMessagesById as xt}from"../../../im-browser/src/http/requests/pull-messages-by-id.js";import{createChannelReadStrategy as Pt}from"../../../im-core/src/message-flow/read/channel-read-strategy.js";import{createGroupKeyService as At}from"../../../im-browser/src/crypto/group-key-service.js";import{pullOfflineGroupSession as jt,pullGroupHistory as Ot,pullOfflineGroupBatch as _t}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{compareBySortKey as Nt}from"../../../im-core/src/mapping/sort.js";import{assertOfflineChatBatchComplete as Lt}from"../../../im-core/src/mapping/offline-mapper.js";import{createSyncManager as Kt}from"../../../im-core/src/sync/sync-manager.js";import{isMessageRecoveryBodyEqual as Ft}from"../../../im-core/src/mapping/merge.js";import{yieldToBrowser as Ut}from"../../../im-browser/src/scheduling/yield-to-browser.js";import{resolveGroupRestriction as Bt}from"../../../im-core/src/mapping/group-notify-mapper.js";import{bContentCodec as Gt,bMessageCodec as Ht}from"../../../im-protocol/src/protobuf/registry.js";import{mapIncomingChannelNotify as Vt}from"../../../im-core/src/mapping/channel-notify-mapper.js";import{recoverDecryptedMessage as $t}from"../../../im-core/src/mapping/decrypt-recovery.js";import{pullChannelSessions as qt,pullChannelLatestPage as Wt,pullChannelOfflineMessages as zt,pullChannelHistory as Jt}from"../../../im-browser/src/http/requests/pull-offline-channel.js";import{parseChannelSyncCheckpoint as Qt,channelSyncCheckpointKey as Yt}from"../../../im-core/src/sync/channel-sync-checkpoint.js";import{requestRobotMenuReply as Xt}from"../../../im-browser/src/http/requests/robot-menu-reply.js";import{mapIncomingRobotFixedChat as Zt}from"../../../im-core/src/mapping/robot-message-mapper.js";import{getRobotChatMenus as er,confirmRobotChat as tr,getRobotProfile as rr}from"../../../im-browser/src/http/requests/robot-profile.js";import{unbindRobotFromConversation as or,bindRobotToConversation as nr}from"../../../im-browser/src/http/requests/bind-robot-conversation.js";import{searchRobots as sr}from"../../../im-browser/src/http/requests/search-robots.js";import{getCustomerServiceProfile as ar,downloadCustomerServiceFile as ir}from"../../../im-browser/src/http/requests/customer-service-profile.js";import{pullOfflineSignal as cr}from"../../../im-browser/src/http/requests/pull-offline-signal.js";import{updateChannelReadIndexes as dr}from"../../../im-browser/src/http/requests/channel-read-index.js";import{markGroupReadAll as pr}from"../../../im-browser/src/http/requests/mark-group-read-all.js";const lr=30;function ur(e,t){const r=Number(e);if(!Number.isSafeInteger(r)||r<0)throw new Error(`GROUP history cursor 非法(groupId=${t})`);return r}function mr(mr,vr,yr,gr=0){const hr=mr.clientType??2,fr={...mr.authProvider,getLoginContext:async()=>{const e=await mr.authProvider.getLoginContext();return null===e?null:{...e,clientType:hr}}};let Ir="";const wr=E(mr.debug,()=>({generation:gr,...""===Ir?{}:{accountId:Ir}}));let Cr=!0;const br=mr.uploadRecovery?.enabled?Q(yr):void 0,Sr=Y(!1!==globalThis.navigator?.onLine),{coreClient:Tr,http:Er}=re({coreClient:mr.coreClient,http:mr.http,authProvider:fr,endpointProvider:mr.endpointProvider,clientType:hr,isActive:()=>Cr,onRequestError:mr.onRequestError,onHandlerError:e=>wr.record("error","sdk","session","request-error-handler-failed",()=>({error:{message:"宿主请求错误处理器失败",data:e}}))}),Rr=mr.transport??ne(),Mr=mr.adapters?.storage,kr=void 0!==Mr?Mr.create({namespaceFactory:yr}):"undefined"==typeof indexedDB?void 0:se({namespaceFactory:yr,mediaAssetCache:{strategies:j()}}),Dr=/* @__PURE__ */new Map,xr=/* @__PURE__ */new Map,Pr=/* @__PURE__ */new Map,Ar=/* @__PURE__ */new Map,jr=/* @__PURE__ */new Map,Or=/* @__PURE__ */new Map,_r=e=>`${we(e.conversation)}\0${e.messageId}`;function Nr(e,t){const r=we(e),o=(Or.get(r)??Promise.resolve()).then(t),n=o.then(()=>{},()=>{});return Or.set(r,n),n.then(()=>{Or.get(r)===n&&Or.delete(r)}),o}function Lr(e,t){return Nr(e.conversation,async()=>{t()&&(await(kr?.deleteDecryptRecovery?.(e.conversation,e.messageId)),t()&&(jr.delete(_r(e)),Ar.delete(_r(e)),Dr.delete(_r(e))))})}const Kr=e=>{const t=kr?.saveDecryptRecovery;if(void 0===t)return;const r=_r(e),o=(Pr.get(r)??0)+1;Pr.set(r,o),jr.delete(r),Ar.set(r,e);const n=we(e.conversation),s=xr.get(n)??0,a=()=>Cr&&s===(xr.get(n)??0)&&o===Pr.get(r),i=Nr(e.conversation,async()=>{a()&&await t(e)});Dr.set(r,i),i.then(()=>{if(Dr.get(r)===i&&Dr.delete(r),a())return ns(e)}).catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`保存解密恢复记录失败(conversationType=${e.conversation.conversationType}, messageId=${e.messageId})`,cause:t}}))};let Fr=!1;const Ur="object"==typeof(Br=kr)&&null!==Br&&"get"in Br&&"function"==typeof Br.get&&"put"in Br&&"function"==typeof Br.put&&"clear"in Br&&"function"==typeof Br.clear?kr:void 0;var Br;const Gr=g({...void 0===kr?{}:{storage:kr},...void 0===Tr?{}:{coreClient:Tr}});let Hr,Vr;const $r=B({...void 0===kr?{}:{storage:kr},conversationBackgrounds:Gr.api,onDirectReadReceiptDisabled:e=>Hr?.(e)});let qr=0;function Wr(e){return qr+=1,`channel-${e}-${gr}-${qr}`}const zr=ht(wr),Jr=(e,t,r=Ir)=>{const o=t.fromId===r?t.toId:t.fromId;V(wr,{conversation:{conversationType:"direct",conversationId:o},source:e,messageId:t.msgId,senderId:t.fromId,receiverId:t.toId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"direct-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Qr=(e,t)=>{V(wr,{conversation:{conversationType:"group",conversationId:t.groupId},source:e,messageId:t.msgId,senderId:t.fromId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"group-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Yr=(e,t)=>{V(wr,{conversation:{conversationType:"channel",conversationId:t.channelId},source:e,messageId:t.messageId,encrypt:t.encrypt,reason:t.reason,resolverSource:"channel-symmetric-key",endpoint:t.endpoint,surface:t.surface,decryptStage:t.decryptStage,keySource:t.keySource,keyByteLength:t.keyByteLength,payloadByteLength:t.payloadByteLength,...void 0===t.cipherDataByteLength?{}:{cipherDataByteLength:t.cipherDataByteLength},...void 0===t.decryptedByteLength?{}:{decryptedByteLength:t.decryptedByteLength},...void 0===t.forceRefreshAttempted?{}:{forceRefreshAttempted:t.forceRefreshAttempted},...void 0===t.clientTypeHeader?{}:{clientTypeHeader:t.clientTypeHeader},...void 0===t.clientTypeBody?{}:{clientTypeBody:t.clientTypeBody},...void 0===t.operationId?{}:{operationId:t.operationId},...void 0===t.cause?{}:{cause:t.cause}})},Xr=e=>{wr.record("warn","sdk","protocol","channel-content-decode",()=>({conversation:{conversationType:"channel",conversationId:e.channelId},...void 0===e.operationId?{}:{operationId:e.operationId},data:{messageId:e.messageId,encrypt:e.encrypt,contentLength:e.contentLength,...void 0===e.endpoint?{}:{endpoint:e.endpoint},...void 0===e.surface?{}:{surface:e.surface},...void 0===e.clientTypeHeader?{}:{clientTypeHeader:e.clientTypeHeader},...void 0===e.clientTypeBody?{}:{clientTypeBody:e.clientTypeBody}},error:{message:"CHANNEL 消息正文解码失败",data:e.cause}}))};function Zr(e){return"left"===e||"removed"===e||"dismissed"===e}wr.record("debug","sdk","session","runtime-created");let eo="empty";const to=vr.subscribe(e=>{if(Cr)if("connection:changed"!==e.type)if("message:received"!==e.type&&"message:updated"!==e.type)if("auth:invalid"!==e.type){if("error"===e.type){const t="storage"===e.error.scope?"storage":"crypto"===e.error.scope?"crypto":"session";wr.record("error","sdk",t,"runtime-error",()=>({error:{message:e.error.message,data:e.error.cause}}))}}else wr.record("warn","sdk","session","auth-invalid",()=>({data:e.issue}));else wr.record("trace","sdk","message",e.type,()=>({conversation:e.conversation,message:R(e.message),data:{source:e.source,channelLifecycleEffects:e.channelLifecycleEffects}}));else wr.record("info","sdk","connection","connection-state-changed",()=>({data:{state:e.state}}))});function ro(e){return e.cmdId===st.MES_CHAT_EDIT_MSG_C2C||e.cmdId===st.MES_GRPCHAT_EDIT_MSG_C2C||e.cmdId===st.MES_RADIO_EDIT_MSG_C2C}const oo=/* @__PURE__ */new Set;let no,so,ao,io,co,po,lo="auto",uo=!1,mo=!1,vo=0,yo=!1,go=()=>{},ho=null,fo=null;const Io=$(),wo=new AbortController,Co=/* @__PURE__ */new Set;let bo=0,So=!1;const To=Z(e=>vr.emit({type:"receiving:changed",receiving:e})),Eo=Z(e=>vr.emit({type:"syncing:changed",syncing:e}));let Ro,Mo,ko=!1;const Do=/* @__PURE__ */new Map,xo=/* @__PURE__ */new Map,Po=/* @__PURE__ */new Map,Ao=e=>Po.get(we(e))?.version??0;function jo(e,t){Po.set(we(e),{version:Ao(e)+1,...void 0===t?{}:{reason:t}})}let Oo=0;const _o=e=>Do.get(e)??0,No=e=>{Do.set(e,_o(e)+1)};function Lo(e,t){jo(e,t),po?.invalidate(e,{reason:t}),"channel"===e.conversationType&&No(e.conversationId),"group"===e.conversationType&&xo.set(e.conversationId,(xo.get(e.conversationId)??0)+1)}const Ko=mr.profile??(void 0===Tr?void 0:ie({client:Tr,clientType:hr,...void 0===kr?{}:{storage:kr}})),Fo=mr.channelProfile??(void 0===Tr?void 0:ce({client:Tr,clientType:hr,getUserId:async()=>{if(""!==Ir)return Ir;const e=await fr.getLoginContext();return e?.userId??""},...void 0===kr?{}:{storage:kr}})),Uo=mr.channelMembers??(void 0===Tr?void 0:le({client:Tr,clientType:hr,isActive:()=>Cr,...void 0===kr?{}:{storage:kr}})),Bo=mr.channelMentionMembers??(void 0===Tr?void 0:ue({client:Tr,clientType:hr})),Go=y({...void 0===Bo?{}:{provider:Bo},...void 0===kr?{}:{storage:kr}}),Ho=mr.directory??(void 0===Tr?void 0:me({client:Tr,clientType:hr,getUserId:async()=>""!==Ir?Ir:(await fr.getLoginContext())?.userId??""})),Vo=M({...void 0===Ho?{}:{provider:Ho}});let $o;const qo=K({onProfileUpdated:function(e){Zo.updateConversationProfile({conversationType:"robot",conversationId:e.id},{title:e.displayName,avatar:e.avatarUrl??""})},...void 0===Tr?{}:{search:e=>sr(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),bind:e=>nr(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),unbind:e=>or(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),getProfile:e=>rr(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),confirmChat:e=>tr(Tr,{robotId:e,...void 0===hr?{}:{clientType:hr}}),listChatMenus:e=>er(Tr,{robotId:e,...void 0===hr?{}:{clientType:hr}}),requestMenuReply:async e=>{const t=""!==Ir?Ir:(await fr.getLoginContext())?.userId??"";if(""===t)throw new Error("机器人指令回复缺少当前用户");const r=await Xt(Er,{...e,userId:t});if(!Cr)return;const o=Zt({robotId:e.robotId,userId:t,msgId:r.msgId,msgTime:r.msgTime,content:r.content},{selfId:t,keepRaw:!0});if(void 0!==o){if(void 0===$o)throw new Error("机器人指令回复尚未接入消息存储");await $o(o)}}}}),Wo=mr.expressionProvider??ve({...void 0===Tr?{}:{coreClient:Tr},...void 0===mr.expressions?.giphy?.apiKey?{}:{giphyApiKey:mr.expressions.giphy.apiKey}}),zo=x({provider:Wo,isActive:()=>Cr}),Jo=mr.sessionFavoriteProvider??ye({...void 0===Tr?{}:{coreClient:Tr},getUserId:()=>Ir}),Qo=mr.channelJoinApplications??(void 0===Tr?void 0:ge({client:Tr,clientType:hr})),Yo=mr.contactApplications??(void 0===Tr?void 0:he({client:Tr,clientType:hr})),Xo=mr.groupApplications??(void 0===Tr?void 0:fe({client:Tr,clientType:hr})),Zo=Ie({emitter:vr,diagnostics:wr,profile:Ko,channelProfile:Fo,storage:kr,getSelfId:()=>Ir,loadOlderFromRemote:async e=>{const t=po?.enterForeground(e.conversation),r=Io.enterForeground(),o=To.begin();try{return void 0===co?{messages:[],exhausted:!0}:await co(e)}finally{o(),t?.(),r()}},loadNewerFromRemote:async e=>{const t=po?.enterForeground(e.conversation),r=Io.enterForeground(),o=To.begin();try{return void 0===Mo?{messages:[],exhausted:!0}:await Mo(e)}finally{o(),t?.(),r()}}}),en=S({download:async({messageId:e,itemIndex:t,signal:r})=>{const o=Zo.getConversationMessage({conversationType:"customerService",conversationId:"__customer_service__"},e),n=o?.body.customerService?.files[t];if(void 0===n)throw T({code:"IM_SDK_CUSTOMER_SERVICE_FILE_UNAVAILABLE",category:"state",operation:"customerService.downloadFile",retryable:!1});return await ir(n.url,r)},isActive:()=>Cr,load:e=>void 0===Tr?Promise.reject(T({code:"IM_SDK_CORE_API_UNAVAILABLE",category:"contract",operation:"customerService.getProfile",retryable:!1})):ar(Tr,e),update:e=>Zo.updateConversationProfile({conversationType:"customerService",conversationId:"__customer_service__"},{title:e.displayName,avatar:e.avatarUrl})}),tn=en.api;let rn=()=>{};const on=A({namespaceFactory:yr,...void 0===kr?{}:{storage:kr},emitter:vr,getAccountId:()=>Ir,isActive:()=>Cr,clearMemoryCaches:()=>{en.clearCache(),Ko?.clearCache?.(),Fo?.clearCache?.(),Uo?.clearCache?.(),Go.clear(),rn(),po?.clear().catch(e=>vr.emit({type:"error",error:{scope:"storage",message:"清理最近历史缓存失败",cause:e}}))}});$o=e=>Zo.commitReceivedMessages([e],"live");const nn=U({provider:Jo,isActive:()=>Cr,resolveMessage:async(e,t)=>Zo.getConversationMessage(e,t)??await(kr?.getMessage(e,t))??void 0}),sn=vr.subscribe(e=>{if("message:removed"===e.type||"conversation-history:cleared"===e.type||"session:removed"===e.type){const t=we(e.conversation);if(xr.set(t,(xr.get(t)??0)+1),"message:removed"===e.type)jr.delete(_r({conversation:e.conversation,messageId:e.messageId}));else for(const e of jr.keys())e.startsWith(`${t}\0`)&&jr.delete(e)}if(void 0!==kr?.deleteDecryptRecovery)if("message:received"!==e.type&&"message:updated"!==e.type||!0===e.message.encryption.decryptFailed){if("message:removed"===e.type)Ar.delete(_r({conversation:e.conversation,messageId:e.messageId})),Nr(e.conversation,()=>kr.deleteDecryptRecovery(e.conversation,e.messageId)).catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`删除消息密文记录失败(messageId=${e.messageId})`,cause:t}}));else if("conversation-history:cleared"===e.type){for(const[t,r]of Ar)we(r.conversation)===we(e.conversation)&&Ar.delete(t);Nr(e.conversation,async()=>kr.deleteConversationDecryptRecoveries?.(e.conversation)).catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`清理会话密文记录失败(conversationId=${e.conversation.conversationId})`,cause:t}}))}}else{const t=we(e.conversation),r=xr.get(t)??0,o=_r({conversation:e.conversation,messageId:e.message.id}),n=Pr.get(o)??0,s=()=>Cr&&r===(xr.get(t)??0)&&n===(Pr.get(o)??0);(async()=>{const t=(await(kr.getDecryptRecoveries?.(e.conversation))??[]).find(t=>t.messageId===e.message.id);void 0!==t&&!ro(t)&&s()&&(await Zo.commitReceivedMessages([e.message],"offline",{backfillOnly:!0}),await Lr(t,s))})().catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`删除已恢复密文记录失败(messageId=${e.message.id})`,cause:t}}))}});const an=s({directory:Vo.contacts,getSelfId:()=>Ir,...void 0===Ko?{}:{profile:{getUserProfile:Zo.readDirectProfile,...void 0===Ko.peekUserProfile?{}:{peekUserProfile:Ko.peekUserProfile.bind(Ko)}}},...void 0===Tr?{}:{coreClient:Tr},domainState:Zo,emitter:vr,terminateConversationSending:(e,t)=>go(e,t),resetDirectReadReceiptPreference:e=>$r.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:(e,t)=>{"friend"===t?Vr?.(e):"unknown"!==t&&Hr?.(e)}}),cn=m({...void 0===Yo?{}:{contact:Yo},...void 0===Xo?{}:{group:Xo},...void 0===Qo?{}:{channel:Qo},onContactAccepted:async(e,t)=>{an.updateRelationshipFromEvent(e,"friend"),await Zo.reconcileDirectContactEstablishedNotice(e,`contact-application:${t}`),Zo.refreshConversationProfile(e,"direct")},emitter:vr,isActive:()=>Cr&&"ready"===eo}),dn=k({domainState:Zo,emitter:vr,isActive:()=>Cr}),pn=F({domainState:Zo,isAvailable:()=>Cr&&"ready"===eo}),ln=i(()=>Zo.getSessions()),un=Ce({onHidden:()=>gn(!0),onVisible:()=>gn(!1),onPageHide:()=>gn(!0),onPageShow:()=>gn(!1)},mr.network),mn=mr.cryptoExecutorFactory?.(gr)??be({generation:gr,diagnostics:wr,lifecycleAware:un.supportsLifecycle}),vn=p({executor:mn,generation:gr,isActive:()=>Cr}),yn=mr.crypto??{...gt(),async encryptSymmetricChunked(e){try{return await vn(e)}catch(e){throw vt(e)&&Cr&&vr.emit({type:"error",error:{scope:"crypto",message:"媒体加密计算失败",cause:e}}),e}}};function gn(e){mn.setSuspended(e)}function hn(e){!Cr||e instanceof Error&&"AbortError"===e.name||vr.emit({type:"error",error:{scope:"crypto",message:"密钥计算失败",cause:e}})}const fn=void 0!==mr.media?Se(mr.media,wr):void 0,In=Te(),wn=mt(In),{prepareLocalMediaPreview:Cn,prepareLocalVideoPoster:bn,prepareLocalImageThumbnail:Sn}=z(In,()=>gr),Tn=void 0===Tr?void 0:wt({client:Tr,crypto:yn,cryptoExecutor:mn,generation:gr,clientType:hr,onError:(e,t)=>zr?.("crypto",{message:e,cause:t})}),En=void 0===Tr?void 0:ft({client:Tr,clientType:hr,onError:(e,t)=>zr?.("crypto",{scope:"send-key",message:e,cause:t})}),Rn=void 0===Tr?void 0:At({client:Tr,crypto:yn,cryptoExecutor:mn,generation:gr,clientType:hr,onError:(e,t)=>zr?.("crypto",{scope:"group-key",message:e,cause:t})}),Mn=mr.channelKeyService??(void 0===Tr?void 0:Ee({loadSecretKey:e=>It(Tr,{channelId:e,clientType:hr}),onError:(e,t)=>zr?.("crypto",{scope:"channel-key",message:e,cause:t})})),kn=async(e,t={})=>{if(void 0===Mn)return;const r=null===Mn.getCachedChannelKey(e);try{await Mn.getChannelKey(e)}catch{return}if(!1!==t.recoverExistingMessages&&r&&Cr)try{await as({conversationType:"channel",conversationId:e},{recoverLegacyWithoutSidecar:!1})}catch(t){vr.emit({type:"error",error:{scope:"storage",message:`CHANNEL key 就绪后读取解密恢复记录失败(channelId=${e})`,cause:t}})}},Dn=async e=>void 0===Mn?null:Mn.getChannelKey(e),xn=e=>{if(void 0===Mn)return null;const t=Mn.getCachedChannelKey(e);return null===t&&kn(e),t},Pn=()=>Tn?.getCachedPrivateKey(Ir)?.privateKey??null,An=async(e,t={})=>{const r=[];void 0!==Mn&&r.push(...[...new Set(e)].map(e=>kn(e,t))),void 0!==Tn&&""!==Ir&&r.push(Tn.getUserPrivateKey(Ir,{priority:t.priority??"background",signal:t.signal??wo.signal})),await Promise.all(r)},jn=e=>({crypto:yn,resolveChannelKey:e=>Mn?.getCachedChannelKey(e)??null,resolveUserPrivateKey:Pn,onDecryptError:t=>Yr(e,t),onDecryptRecovery:Kr}),On=W({fetch:async e=>{await(Rn?.getGroupKeys(e,{priority:"background"}))},onError:hn});function _n(e){Cr&&void 0!==Rn&&""!==e&&On.enqueue(e)}function Nn(){On.dispose(),un.stop(),Tn?.dispose(),Rn?.dispose(),mn.dispose()}const Ln=async e=>{if(void 0===Rn)return null;const t=await Rn.getGroupKeys(e);return null===t?null:{publicKey:t.publicKey,version:t.version}},Kn=e=>{if(void 0===Rn)return null;const t=Rn.getCachedGroupKeys(e);return null!==t?t.privateKey:(_n(e),null)},Fn=async(e,t={})=>{const r=t.signal??wo.signal;if(Rt(r),void 0===Rn)return;const o=[...new Set(e)];let n,s=0;const a=async()=>{for(;void 0===n&&s<o.length;){if(!Cr)return;const e=o[s++];try{await Rn.getGroupKeys(e,{priority:t.priority??"background",signal:r})}catch(e){throw n=e,e}}};await Promise.all([a(),a()]),Rt(r)},Un=e=>({crypto:yn,resolvePrivateKey:({groupId:e})=>Kn(e),onDecryptError:t=>Qr(e,t),onDecryptRecovery:Kr}),Bn=/* @__PURE__ */new Map,Gn=/* @__PURE__ */new Map,Hn=/* @__PURE__ */new Map,Vn=/* @__PURE__ */new Set,$n=/* @__PURE__ */new Set;function qn(e){return!0!==e.encryption.decryptFailed&&"unknown"!==e.contentType}function Wn(e){Hn.delete(we(e))}function zn(e,t){return e.length===t.length&&e.every((e,r)=>e===t[r])}function Jn(e){if("group"===e.conversation.conversationType)return Rn?.getCachedGroupKeyVersion(e.conversation.conversationId)??void 0}function Qn(e){return 2===e.wireEncrypt?"channel-base64-pad-tea":"group"===e.conversation.conversationType?"group-rsa-tea":"channel"===e.conversation.conversationType?"channel-web-rsa-tea":"direct-rsa-tea"}function Yn(e){return 101===e.contentType?Number.isInteger(e.type)&&e.type>0:27===e.contentType?0n===e.gameType?e.gameValue>=1n&&e.gameValue<=3n:1n===e.gameType&&e.gameValue>=1n&&e.gameValue<=6n:[1,2,3,4,5,7,8,11].includes(e.contentType)}function Xn(e,t){const r=new Map(Zo.getMessagesByConversation(e).filter(e=>void 0===t||e.id===t).map(e=>[e.id,e])),o=/* @__PURE__ */new Map;return{stop:vr.subscribe(n=>{if(!Cr||"message:received"!==n.type&&"message:updated"!==n.type||"live"!==n.source||n.conversation.conversationType!==e.conversationType||n.conversation.conversationId!==e.conversationId||void 0!==t&&n.message.id!==t||!0===n.message.encryption.decryptFailed)return;const s=r.get(n.message.id);if(void 0===s||!Ft(s,n.message)){const t=_r({conversation:e,messageId:n.message.id});o.set(t,Pr.get(t)??0)}}),hasChanged:e=>{const t=_r(e);return o.has(t)&&o.get(t)===(Pr.get(t)??0)}}}let Zn=0;const es=[],ts=/* @__PURE__ */new Map;let rs=0;function os(){for(;rs<2&&es.length>0;){const e=es.shift();rs+=1,Promise.resolve().then(async()=>{if(Rt(wo.signal),!e.isCurrent())throw new DOMException("端到端排队恢复所属账号、会话或消息已失效","AbortError");await ss(e.record,e.hasBodyChanged)}).then(e.resolve,e.reject).finally(()=>{rs-=1,os()})}}function ns(e,t){if("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType)return ss(e);const r=_r(e),o=Pr.get(r)??0,n=ts.get(r);if(n?.version===o&&n.isCurrent())return n.promise;const s=Ir,a=we(e.conversation),i=xr.get(a)??0,c=Ao(e.conversation),d=()=>Cr&&Ir===s&&i===(xr.get(a)??0)&&c===Ao(e.conversation)&&o===(Pr.get(r)??0),p=void 0===t?Xn(e.conversation,e.messageId):void 0,l=t??(()=>p.hasChanged(e)),u=new Promise((t,r)=>{es.push({record:e,isCurrent:d,hasBodyChanged:l,resolve:t,reject:r})}).finally(()=>{p?.stop(),ts.get(r)?.promise===u&&ts.delete(r)});return ts.set(r,{version:o,isCurrent:d,promise:u}),os(),u}async function ss(e,t){const r=_r(e);e=Ar.get(r)??e;const o=Pr.get(r)??0,n=we(e.conversation),s=xr.get(n)??0,a=Ao(e.conversation),i=()=>Cr&&a===Ao(e.conversation)&&s===(xr.get(n)??0)&&o===(Pr.get(r)??0),c=Bn.get(r);if(void 0!==c)return Gn.get(r)===o?c:(await c.catch(()=>{}),void(i()&&Ar.get(r)===e&&await ss(e,t)));const d=async()=>Zo.getConversationMessage(e.conversation,e.messageId)??await(kr?.getMessage(e.conversation,e.messageId))??void 0,p=(async()=>{const n=await d();if(!i()||void 0===n)return;const s=ro(e),a=()=>!("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType||!s)&&(t?.()&&jr.set(r,o),jr.get(r)===o);if(a())return await Zo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Lr(e,i);if(!0!==n.encryption.decryptFailed&&!s)return await Zo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Lr(e,i);let c,p;wr.record("debug","sdk","crypto","decrypt-recovery-context",()=>({conversation:e.conversation,data:{messageId:e.messageId,messageSenderId:n.senderId,messageCreatedAt:n.createdAt,selfMessage:n.senderId===Ir,source:e.source,wireEncrypt:e.wireEncrypt,sContentBytes:e.sContent.length,...void 0===e.cmdId?{}:{cmdId:e.cmdId},...void 0===e.encryptVersion?{}:{encryptVersion:e.encryptVersion}}}));let l="key-resolve",u=Qn(e);for(const t of[!1,!0]){const r=t?"force":"current";let o;try{l="bcontent";const n=Gt.decode(e.sContent);if(1===e.wireEncrypt){if(0===n.secretKey.length||0===n.cipherData.length)throw new Error("BContent.secretKey/cipherData 缺失");l="key-resolve";const s={priority:"background",signal:wo.signal,...t?{staleKey:"string"==typeof p?p:void 0}:{}},a="group"===e.conversation.conversationType?(await(Rn?.getGroupKeys(e.conversation.conversationId,s)))?.privateKey??null:(await(Tn?.getUserPrivateKey(Ir,s)))?.privateKey??null;if(!i())return;t&&void 0!==p&&(o="string"==typeof p&&null!==a&&p!==a),!0===o&&Wn(e.conversation),t||(p=a);const d=Jn(e);if(null===a){wr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"no-key",...void 0===d?{}:{resolvedKeyVersion:d},...void 0===o?{}:{keyChanged:o}}}));continue}const u=await mn.decryptBatch({operationId:"end-to-end-recovery:"+ ++Zn,generation:gr,items:[{itemIndex:0,input:{secretKey:n.secretKey,cipherData:n.cipherData,privateKey:a}}],priority:"background",signal:wo.signal});if(!i())return;if(1!==u.length||0!==u[0]?.itemIndex)throw new yt("protocol-mismatch");const m=u[0].result;if(!m.ok)throw l=m.stage,new Error(`End-to-end recovery ${m.stage} failed`);const v=m.plain;wr.record("debug","sdk","crypto","decrypt-recovery-byte-shape",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:Qn(e),rsaCipherBytes:n.secretKey.length,cipherDataBytes:n.cipherData.length,cipherDataBlockRemainder:n.cipherData.length%8,plainBytes:v.length,plainBlockRemainder:v.length%8,startsWithContentTypeField:8===v[0],startsWithMobileCardType:8===v[0]&&8===v[1],...X(v)}})),l="bmessage",c=Ht.decode(v)}else if("channel"===e.conversation.conversationType){if(0===n.cipherData.length)throw new Error("BContent.cipherData 缺失");l="key-resolve";const s=t?{...p instanceof Uint8Array?{staleKey:p}:{}}:void 0,a=void 0===Mn?.getChannelKeyCandidates?await(Mn?.getChannelKey(e.conversation.conversationId,s).then(e=>[{strategy:"canonical-base64-pad",key:e}]))??[]:await Mn.getChannelKeyCandidates(e.conversation.conversationId,s),i=Mn?.getCachedChannelKeyMetadata?.(e.conversation.conversationId);null!=i&&wr.record("info","sdk","crypto","decrypt-recovery-key-material",()=>({conversation:e.conversation,data:{messageId:e.messageId,attempt:r,...i}}));const d=a.find(e=>"canonical-base64-pad"===e.strategy)?.key??null;if(t&&p instanceof Uint8Array&&null!==d&&(o=!zn(p,d)),!0===o&&Wn(e.conversation),t||(p=d?.slice()??null),0===a.length){wr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"no-key",...void 0===o?{}:{keyChanged:o}}}));continue}for(const t of a)try{l="tea";const s=yn.decryptSymmetric({teaKey:t.key,cipherData:n.cipherData});l="bmessage";const a=Ht.decode(s);if("legacy-ascii16"===t.strategy&&!Yn(a))throw new Error("legacy ASCII candidate 未通过已知 BMessage 语义校验");c=a,u=t.strategy,wr.record("info","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}catch(n){wr.record("warn","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:l,reason:"decrypt-failed",...void 0===o?{}:{keyChanged:o}},error:{message:"CHANNEL decrypt recovery candidate failed",data:n}}))}}if(void 0!==c){wr.record("info","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:u,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}}catch(t){if(vt(t)||t instanceof Error&&"AbortError"===t.name)throw t;const n=Jn(e);wr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"decrypt-failed",...void 0===n?{}:{resolvedKeyVersion:n},...void 0===o?{}:{keyChanged:o}},error:{message:"IM message decryption recovery failed",data:t}}))}}if(!i()||void 0===c)return void(void 0===c&&(!function(e,t){const r=we(e),o=Hn.get(r)??/* @__PURE__ */new Set;o.add(t),Hn.set(r,o)}(e.conversation,e.messageId),wr.record("warn","sdk","crypto","decrypt-recovery-exhausted",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,strategy:Qn(e),attempts:2,finalStage:l}}))));const m=await d();if(!i()||void 0===m||!0!==m.encryption.decryptFailed&&!s)return;if(("direct"===e.conversation.conversationType||"group"===e.conversation.conversationType)&&s&&(a()||!Ft(n,m)))return jr.set(r,o),await Zo.commitReceivedMessages([m],"offline",{backfillOnly:!0}),void await Lr(e,i);const v="channel"!==e.conversation.conversationType||e.cmdId!==st.RADIO_NOTIFY_DELIVER&&101!==c.contentType?{...$t(m,c,Ir),...s?{edited:!0}:{}}:Vt({channelId:BigInt(e.conversation.conversationId),messageId:e.messageId,occurredAt:BigInt(m.serverTime??m.createdAt),notifyType:c.type,operatorId:c.oprUserId,targetUserIds:c.mnpledUserId,content:c.content,..."string"==typeof m.extensions?.historyCursor?{historyCursor:m.extensions.historyCursor}:{},..."string"==typeof m.extensions?.channelSequence?{sequence:BigInt(m.extensions.channelSequence)}:{},encrypted:!0},{cmdId:e.cmdId,keepRaw:void 0!==m.raw});await Zo.commitReceivedMessages([v],"offline",{backfillOnly:!0,refreshSessionSummary:!0}),await Lr(e,i)})().finally(()=>{Bn.get(r)===p&&(Bn.delete(r),Gn.delete(r))});return Bn.set(r,p),Gn.set(r,o),p}async function as(e,t={}){const r="direct"===e.conversationType||"group"===e.conversationType?Xn(e):void 0;try{const o=we(e),n=Ir,s=xr.get(o)??0,a=Ao(e),i=()=>Cr&&n===Ir&&s===(xr.get(o)??0)&&a===Ao(e),c=await(kr?.getDecryptRecoveries?.(e))??[];if(!i())return;const d=Hn.get(o),p=void 0===d?c:c.filter(e=>!d.has(e.messageId));if("direct"===e.conversationType||"group"===e.conversationType){let e=0;const t=async()=>{for(;e<p.length;){if(!i())return;const t=p[e++];await ns(t,()=>r.hasChanged(t))}},o=(await Promise.allSettled([t(),t()])).find(e=>"rejected"===e.status);if("rejected"===o?.status)throw o.reason}else await Promise.all(p.map(e=>ns(e)));if(!Cr||!1===t.recoverLegacyWithoutSidecar)return;const l=Hn.get(o),u=new Set(c.filter(e=>void 0===l||!l.has(e.messageId)).map(e=>e.messageId)),m=Zo.getMessagesByConversation(e).filter(e=>!0===e.encryption.decryptFailed&&!u.has(e.id));if(0===m.length||Vn.has(o))return;if(Vn.add(o),wr.record("info","sdk","crypto","decrypt-repair-start",()=>({conversation:e,data:{stuckCount:m.length,withoutSidecar:m.filter(e=>!c.some(t=>t.messageId===e.id)).length}})),"channel"===e.conversationType){const t=await fr.getLoginContext();if(null===t||void 0===Ro)return;for(const r of m.slice(0,20)){const o=r.extensions?.historyCursor;if("string"!=typeof o||""===o.trim())continue;const n=await Ro(e.conversationId,o,t.userId);if(!Cr)return;n.length>0&&Zo.upsertMessages(n,"offline")}}else"group"===e.conversationType?await async function(e,t){if(void 0===co)return;const r=[...t].sort((e,t)=>e.sortKey.localeCompare(t.sortKey)),o=r[0],n=r.at(-1);if(void 0===o||void 0===n)return;const s=o.serverTime??o.createdAt;let a;for(let t=0;t<5;t++){const t=await co({conversation:e,oldestLoaded:n,...void 0===a?{}:{cursor:a},intent:"older",limit:50});if(!Cr||t.exhausted||void 0===t.nextCursor)return;const r=Number(t.nextCursor);if(Number.isFinite(r)&&r<=s)return;a=t.nextCursor}}({conversationType:"group",conversationId:e.conversationId},m):"direct"===e.conversationType&&await La()}catch(t){if(!Cr||t instanceof Error&&"AbortError"===t.name)return;vr.emit({type:"error",error:{scope:"crypto",message:`解密失败消息恢复失败(conversationType=${e.conversationType}, conversationId=${e.conversationId})`,cause:t}})}finally{r?.stop()}}let is=()=>{throw new Error("离线 Reaction 写入失败:Reaction manager 尚未就绪")};function cs(e,t=!0){const r=e.channelPermissions,o=e.channelAccessSnapshot;return JSON.stringify(["group"===e.type?e.groupState??"active":void 0,e.channelState,void 0===r?void 0:[r.sendMessages,r.mentionAll,r.editProfile,r.manageMembers,r.manageAdmins,r.moderateMessages,r.manageMute,r.dismissChannel,r.transferOwnership],t&&void 0!==o?[o.role,o.baseState,o.resolvedState,o.allMembersMuted,o.currentUserMuted,o.mutePeriod]:void 0])}const ds=/* @__PURE__ */new Map;function ps(e){const t=Zo.getConversationContext(e);if(!Cr||void 0===t||"group"===e.conversationType&&void 0!==t.groupState&&"active"!==t.groupState||"channel"===e.conversationType&&void 0!==t.channelState&&o(t.channelState))return;const r=Zo.getMessagesByConversation(e).at(-1);return JSON.stringify([Ir,void 0===r?t.timestamp:void 0,cs(t),r?.id,r?.sortKey])}const ls=/* @__PURE__ */new Map;po=te({...void 0===kr?.recentHistoryCache?{}:{cache:kr.recentHistoryCache},fingerprint:ps,canRunBackground:function(){return Cr&&"ready"===eo&&So&&0===bo&&"authenticated"===la.state},onForeground:e=>{if("group"===e.conversationType){Rn?.promote(e.conversationId);for(const[t,r]of ls)r.some(t=>t.conversationId===e.conversationId)&&mn.promote(t)}else"channel"!==e.conversationType&&"direct"!==e.conversationType||Tn?.promote(Ir)},fetchPage:async(e,t)=>{const r="group"===e.conversationType?Ia("group",{conversationType:"group",conversationId:e.conversationId}):void 0;try{const o=await ee({http:Er,authProvider:fr,clientType:hr,groupDecrypt:()=>Un("history"),groupAsyncDecrypt:(e,t)=>{const r=Ca(!0===po?.hasForeground(e)?"foreground":"background",t);return r.assertCurrent?.(e),r},assertLoginContext:e=>{if(!Cr||""!==Ir&&e!==Ir)throw new DOMException("最近历史请求的登录账号已改变","AbortError")},channelDecrypt:()=>jn("history"),prepareGroupKeys:Fn,prepareChannelKeys:(e,t)=>An(e,{...t,recoverExistingMessages:!1}),keyPriority:e=>!0===po?.hasForeground(e)?"foreground":"background"})(e,t);return void 0===r?o:{...o,messages:r.messages(o.messages),recoveries:o.recoveries?.filter(r.acceptsRecovery)}}finally{r?.stop()}},yieldToEventLoop:Ut,report:(e,t,r)=>wr.record(e.endsWith("failed")?"warn":"debug","sdk","history",e,()=>({conversation:t,data:r}))});const us=vr.subscribe(e=>{if("connection:changed"===e.type)return"authenticated"!==e.state&&(So=!1),void po?.notifySchedulingChanged();if("session:updated"===e.type){if("group"!==e.conversation.conversationType&&"channel"!==e.conversation.conversationType)return;const t=we(e.conversation),r=ds.get(t),o={timestamp:e.session.timestamp,access:cs(e.session),capabilities:cs(e.session,!1),state:"group"===e.session.type?e.session.groupState??"active":e.session.channelState,hasPermissions:void 0!==e.session.channelPermissions,hasSnapshot:void 0!==e.session.channelAccessSnapshot};if(ds.set(t,o),"group"===e.conversation.conversationType&&"active"!==o.state&&r?.state!==o.state&&jo(e.conversation),"ready"===eo&&void 0!==r&&(r.access!==o.access||!ko&&r.timestamp!==o.timestamp)){const t=!r.hasSnapshot&&o.hasSnapshot&&(r.capabilities===o.capabilities||!r.hasPermissions&&r.state===o.state);po?.invalidate(e.conversation,{preserveForeground:r.access===o.access||t})}return}return"session:removed"===e.type?(jo(e.conversation),ds.delete(we(e.conversation)),void("ready"===eo&&po?.invalidate(e.conversation))):"conversation-history:cleared"===e.type?(jo(e.conversation),void("ready"===eo&&po?.invalidate(e.conversation))):void("ready"===eo&&!ko&&"conversation"in e&&void 0!==e.conversation&&("message:received"!==e.type&&"message:updated"!==e.type&&"message:removed"!==e.type||po?.invalidate(e.conversation,{preserveForeground:"message:received"===e.type})))});function ms(e,t=!0){const r="group"===e.conversation.conversationType?Ca("foreground"):void 0;r?.assertCurrent?.({conversationType:"group",conversationId:e.conversation.conversationId}),ko=!0;try{if(void 0===r){e.messages.length>0&&Zo.upsertMessages(e.messages,"offline",{backfillOnly:!0,refreshSessionSummary:t});for(const t of e.reactions)is(t);for(const t of po.takeRecoveries(e))Kr(t)}else{const o=po.takeRecoveries(e);for(const o of e.messages)r.publish([o],()=>Zo.upsertMessages([o],"offline",{backfillOnly:!0,refreshSessionSummary:t}));for(const t of e.reactions)r.publish([],()=>is(t));for(const e of o)r.publish([],()=>Kr(e))}}finally{ko=!1}}co=async({conversation:e,oldestLoaded:t,cursor:r,intent:n,limit:s,signal:a})=>{Rt(a);const{conversationId:i}=e,c=Zo.getConversationContext(e);if(void 0===c)throw new Error(`加载远端历史失败:会话不存在(conversationId=${i})`);if("direct"===c.type||"robot"===c.type||"customerService"===c.type)return{messages:[],exhausted:!0};if("establish-latest"===n&&30===s&&("group"===c.type||"channel"===c.type)){const e={conversationType:c.type,conversationId:i};if(void 0===ps(e))return{messages:[],exhausted:!0};const t=await po.readCached(e,!0).catch(t=>(wr.record("warn","sdk","history","recent-history-cache-read-failed",()=>({conversation:e,error:{message:"读取最近历史缓存失败",data:t}})),null));null!==t&&po.isPageCurrent(t)&&Date.now()-t.fetchedAt>3e5&&ms(t,!1),Rt(a);const r=await po.latest(e,a).catch(t=>{if(!vt(t)&&Cr&&void 0===ps(e))return null;throw t});if(null===r)return{messages:[],exhausted:!0};if(Rt(a),!Cr||!po.isPageCurrent(r)||void 0===ps(e))throw new Error("最近历史请求已失效");if(ms(r),await po.confirmConsumed(r),Rt(a),!po.isPageCurrent(r))throw new Error("最近历史页在窗口提交前已失效");return{messages:r.messages,exhausted:r.exhausted,...void 0===r.nextCursor?{}:{nextCursor:r.nextCursor},replaceWindow:!0}}if("group"===c.type){if(void 0!==c.groupState&&"active"!==c.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:i},d=Ir,p=Ca(!0===po?.hasForeground(e)?"foreground":"background",a);p.assertCurrent?.(o);const l=Ia("group",o);try{const o=await fr.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(p.assertCurrent?.(),o.userId!==d)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const c="establish-latest"===n?Date.now():void 0===r?t?.serverTime??t?.createdAt??Date.now():ur(r,i),u=[],m=[],v=await Ot({asyncDecrypt:p,signal:a,http:Er,userId:o.userId,clientType:hr,groupId:i,baseTime:c,direct:1,limit:s,decryptDeps:{...Un("history"),onDecryptRecovery:e=>m.push(e)},prepareKeys:t=>Fn(t,{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onReaction:e=>u.push(e)});p.assertCurrent?.();const y=l.messages(v.messages);for(const e of y)p.publish([e],()=>Zo.upsertMessages([e],"offline",{backfillOnly:!0,refreshSessionSummary:"establish-latest"===n}));for(const e of u)p.publish([],()=>is(e));for(const e of m)p.publish([],()=>{l.acceptsRecovery(e)&&Kr(e)});p.assertCurrent?.();return{messages:y,...q({conversationId:i,direction:"older",baseTime:c,batchSize:v.batchSize,boundaryTime:v.oldestEntryTime,limit:s}),..."establish-latest"===n?{replaceWindow:!0}:{}}}finally{l.stop()}}if("channel"===c.type){const s=Wr("history");if(void 0!==c.channelState&&o(c.channelState))return wr.record("info","sdk","history","channel-history-blocked",()=>({conversation:e,operationId:s,data:{state:c.channelState}})),{messages:[],exhausted:!0};const l=Oo,u=_o(i),m=await fr.getLoginContext();if(null===m)return{messages:[],exhausted:!0};if("establish-latest"===n){const t=await Wt({signal:a,http:Er,userId:m.userId,clientType:hr,channelId:i,count:lr,operationId:s,decryptDeps:jn("history"),prepareKey:void 0===Mn&&void 0===Tn?void 0:t=>An([t],{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Xr,onReaction:is});Rt(a);const r=Zo.getConversationContext(e);return!Cr||l!==Oo||u!==_o(i)||"channel"!==r?.type||void 0!==r.channelState&&o(r.channelState)?{messages:[],exhausted:!0}:(Rt(a),t.messages.length>0&&Zo.upsertMessages(t.messages,"offline",{backfillOnly:!0,refreshSessionSummary:!0}),{messages:t.messages,exhausted:!t.hasOlder,...void 0===t.nextCursor?{}:{nextCursor:t.nextCursor},replaceWindow:!0})}let v,y=r??"";if(void 0===r&&void 0!==t){const e=t.extensions?.historyCursor;if("string"==typeof e&&""!==e.trim())y=e;else if(d=t,p=m.userId,void 0===d||d.senderId!==p||"pending"!==d.status&&"uploading"!==d.status&&"sending"!==d.status||"string"==typeof d.extensions?.historyCursor&&""!==d.extensions.historyCursor.trim())throw new Error(`CHANNEL historyCursor 缺失(channelId=${i}, messageId=${t.id})`)}wr.record("debug","sdk","history","channel-history-page-start",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:lr,historyGeneration:l,historyEpoch:u,clientTypeHeader:hr,clientTypeBody:hr}}));try{v=await Jt({signal:a,http:Er,userId:m.userId,clientType:hr,channelId:i,baseIndex:y,count:lr,contain:0,operationId:s,decryptDeps:jn("history"),prepareKey:void 0===Mn&&void 0===Tn?void 0:t=>An([t],{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Xr,onReaction:is})}catch(t){throw wr.record("error","sdk","history","channel-history-page-failed",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:lr},error:{message:"CHANNEL 历史页加载失败",data:t}})),t}Rt(a);const g=Zo.getConversationContext(e);return!Cr||l!==Oo||u!==_o(i)||"channel"!==g?.type||void 0!==g.channelState&&o(g.channelState)?{messages:[],exhausted:!0}:(Rt(a),v.messages.length>0&&Zo.upsertMessages(v.messages,"offline",{backfillOnly:!0}),wr.record("debug","sdk","history","channel-history-page-complete",()=>({conversation:e,operationId:s,data:{responseBatchSize:v.batchSize,messageCount:v.messages.length,exhausted:v.exhausted,nextBaseIndexPresent:void 0!==v.nextBaseIndex}})),{messages:v.messages,exhausted:v.exhausted,...void 0===v.nextBaseIndex?{}:{nextCursor:v.nextBaseIndex}})}var d,p;throw new Error(`远端历史未实现:${c.type}`)};const vs=e=>{e.length>0&&Zo.upsertMessages(e,"offline",{backfillOnly:!0})},ys=async()=>{const e=await fr.getLoginContext();if(null===e)throw new Error("按消息 ID 回源失败:当前没有登录态");return{userId:e.userId}},gs=async(e,t)=>{const r={conversationType:"group",conversationId:e},o=Ia("group",r,t);try{const n=Ir,s=Ao(r),a=()=>{if(!Cr||Ir!==n||s!==Ao(r))throw new DOMException("GROUP 消息查询所属账号或历史已失效","AbortError")},i=Ca("foreground",void 0,a);i.assertCurrent?.(r);const{userId:c}=await ys();if(a(),c!==n)throw new DOMException("GROUP 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=Un("history"),u=await N(t,async t=>{a();const r=await kt({asyncDecrypt:i,http:Er,userId:c,clientType:hr,groupId:e,messageIds:t,decryptDeps:{...l,onDecryptRecovery:e=>p.push(e)},prepareKeys:e=>Fn(e,{priority:"foreground"}),onReaction:e=>d.push(e)});if(a(),200!==r.code)throw Object.assign(new Error("GROUP 按 ID 查询业务失败"),{code:r.code});return r});a(),i.assertCurrent?.();const m=o.messages(u.messages).filter(e=>e.conversationType===r.conversationType&&e.conversationId===r.conversationId);for(const e of m)i.assertCurrent?.(),vs([e]),i.assertCurrent?.();for(const e of d)i.assertCurrent?.(),e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&is(e),i.assertCurrent?.();for(const e of p)i.assertCurrent?.(),o.acceptsRecovery(e)&&e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&Kr(e),i.assertCurrent?.();return{messages:m.map(e=>{const t=Zo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("GROUP 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:u.missingMessageIds}}finally{o.stop()}},hs=async(e,t)=>{const r={conversationType:"channel",conversationId:e},n=Ir,s=Oo,a=_o(e),i=()=>{const t=Zo.getConversationContext(r);if(!Cr||Ir!==n||s!==Oo||a!==_o(e)||"channel"!==t?.type||void 0!==t.channelState&&o(t.channelState))throw new DOMException("CHANNEL 消息查询所属账号或历史已失效","AbortError")};i();const{userId:c}=await ys();if(i(),c!==n)throw new DOMException("CHANNEL 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=await N(t,async t=>{i();const r=await xt({http:Er,userId:c,clientType:hr,channelId:e,messageIds:t,operationId:Wr("history"),decryptDeps:{...jn("history"),onDecryptRecovery:e=>p.push({...e,source:"history"})},prepareKey:void 0===Mn&&void 0===Tn?void 0:async e=>{await An([e],{recoverExistingMessages:!1,priority:"foreground"}),i()},onContentDecodeError:Xr,onReaction:e=>d.push(e)});if(i(),0!==r.code)throw Object.assign(new Error("CHANNEL 按 ID 查询业务失败"),{code:r.code});return r});i();for(const e of l.messages)i(),vs([e]);for(const e of d)i(),is(e);for(const e of p)i(),Kr(e);i();return{messages:l.messages.map(e=>{const t=Zo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("CHANNEL 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:l.missingMessageIds}},fs=Re([Me({includeOppositeEnd:!0,resolveOwnKey:async e=>{const t=await(Tn?.getUserPrivateKey(e));return t?.publicKey?{publicKey:t.publicKey,version:t.version}:null}}),ke({resolveGroupKey:Ln}),De({resolveChannelKey:Dn}),xe()]),Is=Pe([Ae(),je(),Oe()]),ws=_e([Ne(),Le(),Ke({resolveChannelKey:Dn,resolveProfile:e=>Fo?.getProfile(e)??Promise.resolve(null)})]);let Cs=()=>{throw new Error("群收包回 ACK 失败:connection.sendFrame 尚未就绪")},bs=()=>!1,Ss=()=>{throw new Error("群发送 ACK 回填失败:connection.onChatAck 尚未就绪")},Ts=()=>{},Es=()=>{};const Rs={...Zo,removeConversationForMembershipTermination:(e,t)=>{Ts(e,t),"group"===e.conversationType?(On.remove(e.conversationId),jo(e),Rn?.clearGroupKeys(e.conversationId)):Mn?.clearChannelKey(e.conversationId),Zo.removeConversationForMembershipTermination(e,t),Gr.api.resetBackground(e).catch(e=>vr.emit({type:"error",error:{scope:"storage",message:"终态删除后清理会话背景失败",cause:e}}))}},Ms=Et({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>Ir,isAuthenticated:()=>bs(),reportReaction:e=>Wo.reportReaction(e),isEmojiSupported:D,logger:zr});is=e=>{Ms.ingest(e,"offline")};const ks=Fe({manager:Ms,getSelfId:()=>Ir,logger:zr}),Ds=Ue({domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0,decrypt:{crypto:yn,resolvePrivateKey:({groupId:e})=>Kn(e),preparePrivateKey:async({groupId:e})=>{if(void 0===Rn)return null;const t=await Rn.getGroupKeys(e);return t?.privateKey??null},onDecryptError:e=>Qr("live",e),onDecryptRecovery:Kr},isActive:()=>Cr});let xs=0;const Ps=vr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&xs++}),As=Be({domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0,decrypt:{crypto:yn,resolveChannelKey:xn,resolveUserPrivateKey:Pn,onDecryptRecovery:Kr,onDecryptError:e=>{const t=void 0!==Mn&&void 0===kr?.saveDecryptRecovery&&2===e.encrypt&&"decrypt-failed"===e.reason;if(Yr("live",{...e,forceRefreshAttempted:t}),!t)return;const r=Mn.getCachedChannelKey(e.channelId)??void 0;Mn.getChannelKey(e.channelId,{staleKey:r}).catch(()=>{})}},isActive:()=>Cr&&bs(),getConnectionEpoch:()=>xs}),js=Ge({isActive:()=>Cr,domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0}),Os=He({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0,decrypt:{crypto:yn,resolveChannelKey:xn,resolveUserPrivateKey:Pn,onDecryptRecovery:Kr}}),_s=Ve({getSelfId:()=>Ir,sendFrame:e=>Cs(e),emitter:vr}),Ns=$e({emitter:vr,getSelfId:()=>Ir}),Ls=qe({sendFrame:e=>Cs(e),emitter:vr,getSelfId:()=>Ir,domainState:{reconcileDirectContactEstablishedNotice:Zo.reconcileDirectContactEstablishedNotice,removeConversation:e=>{"string"!=typeof e?("direct"===e.conversationType&&go(e,"friend_relation_removed"),Zo.removeConversation(e)):Zo.removeConversation(e)}},resetDirectReadReceiptPreference:e=>$r.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:an.updateRelationshipFromEvent}),Ks=We({sendFrame:e=>Cs(e),emitter:vr,domainState:{applyTransferStatusBySerialNumber:Zo.applyTransferStatusBySerialNumber}}),Fs=ze({getSelfId:()=>Ir,sendFrame:e=>Cs(e),emitter:vr}),Us=Je({getSelfId:()=>Ir,domainState:Zo,sendFrame:e=>Cs(e),emitter:vr,onRelationshipChanged:an.updateRelationshipFromEvent}),Bs=Qe({sendFrame:e=>Cs(e),emitter:vr,getSelfId:()=>Ir,isAuthenticated:()=>bs(),domainState:Zo}),Gs=Ye({sendFrame:e=>Cs(e),emitter:vr,getSelfId:()=>Ir,isAuthenticated:()=>bs(),domainState:Zo}),Hs=[...Bs.handlers,...Gs.commandHandlers],Vs=oe({isActive:()=>Cr&&bs(),getUserId:async()=>(await fr.getLoginContext())?.userId??null,pull:(e,t,r)=>cr({http:Er,userId:e,clientType:hr,deliveredMsgIds:t,signal:r}),onBatch:e=>{wr.record("info","sdk","call","signal-offline-pull",()=>({data:{count:e.items.length,cmdIds:e.items.map(e=>`0x${e.cmdId.toString(16)}`)}})),0===e.items.length&&vr.emit({type:"notification",cmdId:0,name:"OFFLINE_SIGNAL"})},onItem:e=>{if(vr.emit({type:"notification",cmdId:e.cmdId,name:"OFFLINE_SIGNAL"}),!Cr||!bs())return;const t=Hs.find(t=>t.command===e.cmdId);t?.handler(e.cmdId,e.body)},onError:e=>vr.emit({type:"error",error:{scope:"sync",message:"音视频离线信令拉取失败",cause:e}})}),$s=vr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&Vs.stop()}),qs=Xe({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0}),Ws=at({domainState:Rs,getSelfId:()=>Ir,prefetchGroupKey:_n,clearGroupKeys:e=>{On.remove(e),jo({conversationType:"group",conversationId:e}),Rn?.clearGroupKeys(e)},clearConversationTermination:e=>Es(e)}),zs=vr.subscribe(e=>{"message:received"!==e.type&&"message:updated"!==e.type||Ws.handleMessage(e.message)}),Js=it({domainState:Rs,getSelfId:()=>Ir,prepareChannelKey:e=>{wr.record("debug","sdk","crypto","channel-key-prepare-requested",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:void 0!==Mn&&null!==Mn.getCachedChannelKey(e)}})),void 0!==Mn&&Mn.getChannelKey(e).catch(()=>{})},clearChannelKey:e=>{const t=void 0!==Mn&&null!==Mn.getCachedChannelKey(e);Mn?.clearChannelKey(e),wr.record("info","sdk","crypto","channel-key-cleared",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:t}}))},clearConversationTermination:e=>Es(e),stopChannelHistory:e=>{const t=_o(e);No(e),Zo.messageWindow.info().conversationId===e&&Zo.messageWindow.reset(),wr.record("info","sdk","history","channel-history-invalidated",()=>({conversation:{conversationType:"channel",conversationId:e},data:{previousEpoch:t,nextEpoch:_o(e)}}))}}),Qs=vr.subscribe(e=>{if("message:received"===e.type||"message:updated"===e.type){const t=e.message;"channel"===t.conversationType&&void 0!==t.body.system?.eventType&&wr.record("info","sdk","conversation","channel-membership-event-observed",()=>({conversation:{conversationType:"channel",conversationId:t.conversationId},messageId:t.id,data:{eventType:t.body.system?.eventType,source:e.source??"live",targetSelf:t.body.system?.targetUserIds?.includes(Ir)??!1,lifecycleEffects:!0===e.channelLifecycleEffects,stateBefore:Zo.getSession({conversationType:"channel",conversationId:t.conversationId})?.channelState??"missing"}})),Js.handleMessage(e.message,{source:e.source??"live",applyLifecycleEffects:e.channelLifecycleEffects})}}),Ys=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_owner_transferred","channel_admin_added","channel_admin_removed","channel_member_renamed"]),Xs=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_member_renamed"]),Zs=vr.subscribe(e=>{if("message:received"!==e.type&&"message:updated"!==e.type)return;if("live"!==(e.source??"live")&&!0!==e.channelLifecycleEffects)return;const t=e.message,r=t.body.system?.eventType;"channel"===t.conversationType&&void 0!==r&&(Ys.has(r)&&Uo?.invalidateChannelMembers(t.conversationId).catch(e=>{vr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 成员缓存失效失败",cause:e}})}),Xs.has(r)&&Go.invalidate(t.conversationId).catch(e=>{vr.emit({type:"error",error:{scope:"storage",message:"CHANNEL @候选缓存失效失败",cause:e}})}))}),ea=c({fetchMessagesById:gs,onSourceUnavailable:e=>wr.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"group",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Tr?{}:{coreClient:Tr},domainState:Zo,emitter:vr}),ta=e({fetchMessagesById:hs,onSourceUnavailable:e=>wr.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"channel",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Tr?{}:{coreClient:Tr},domainState:Zo,emitter:vr}),ra=n({...void 0===Qo?{}:{joinApplications:Qo},http:Er,clientType:hr,buildOfflineDecrypt:()=>jn("history"),onContentDecodeError:Xr,onReaction:is,...void 0===Mn&&void 0===Tn?{}:{prepareKey:(e,t)=>An([e],{signal:t,priority:!0===po?.hasForeground({conversationType:"channel",conversationId:e})?"foreground":"background"})}});Ro=async(e,t,r)=>{const{context:o}=await ra.loadMessageContext(e,t,r);return o.messages};const oa=r({authProvider:fr,emitter:vr,domainState:Zo,loadMessageContext:ra.loadMessageContext,isActive:()=>Cr,getHistoryGeneration:()=>Oo,getHistoryEpoch:_o}),na=G({domainState:Zo,isActive:()=>Cr,loadSummary:async({channelId:e,readCursor:t})=>{const r=await fr.getLoginContext();if(null===r||!Cr||r.userId!==Ir)throw new Error("CHANNEL 已读摘要:无有效登录上下文");return(await qt({http:Er,userId:r.userId,clientType:hr,channels:[{channelId:e,readCursor:t}],keepRaw:!1})).find(t=>t.channelId===e)},report:(e,t,r)=>wr.record("channel-read-summary-failed"===e?"warn":"debug","sdk","sync",e,()=>({conversation:t,data:r}))}),sa=Pt({domainState:Zo,updateReadIndex:async({channelId:e,readCursor:t})=>{const r=await fr.getLoginContext();if(null===r||!Cr||r.userId!==Ir)throw new Error("CHANNEL 已读 readIndexes/edit:无登录上下文");await dr({http:Er,userId:r.userId,indexes:[{channelId:e,readCursor:t}]})},emitter:vr,logger:zr,onReadCommitted:na.request,onReadSettled:na.settled,syncRead:{getSelfId:()=>Ir,sendFrame:e=>Cs(e)}}),aa=Ze({getSelfId:()=>Ir,applyRemoteRead:e=>sa.applyRemoteRead(e),emitter:vr,logger:zr}),ia=et([pt({domainState:Zo,markGroupReadAll:async e=>{const t=await fr.getLoginContext();if(null===t)throw new Error("群已读 read_all:无登录上下文");await pr({http:Er,userId:t.userId,groupId:e})},emitter:vr,logger:zr,isAuthenticated:()=>bs(),syncRead:{getSelfId:()=>Ir,sendFrame:e=>Cs(e)}}),sa,lt({domainState:Zo}),ut({domainState:Zo})]),ca=tt({getSelfId:()=>Ir,sendFrame:e=>Cs(e),onListenerError:()=>vr.emit({type:"error",error:{scope:"unknown",message:"推送状态订阅者回调异常"}})}),da=rt({getSelfId:()=>Ir,sendFrame:e=>Cs(e),onListenerError:()=>vr.emit({type:"error",error:{scope:"unknown",message:"页面状态订阅者回调异常"}})}),pa=vr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&(ca.setAuthenticated(!1),da.setAuthenticated(!1))}),la=ot({transport:Rr,authProvider:fr,endpointProvider:mr.endpointProvider,emitter:vr,domainState:Zo,logger:zr,decrypt:{crypto:yn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?Tn?.getCachedPrivateKey(Ir)?.privateKey??null:null,onDecryptError:e=>Jr("live",e),onDecryptRecovery:Kr},encryptSend:void 0===En&&void 0===Mn?void 0:{crypto:yn,resolvePublicKey:e=>En?.getPeerPublicKey(e)??Promise.resolve(null),resolveGroupKey:Ln},media:void 0!==fn?{transfer:fn,recoveryPort:br?.port,retainFailedUploads:mr.uploadRecovery?.retainFailedUploads,shouldPersistUpload:(e,t)=>void 0!==br&&ct(t,!0===mr.media?.multipartTransfer&&!1!==mr.media.multipartUpload).multipart,waitUntilOnline:e=>Sr.wait(e),preview:wn,onTransferError:e=>{wr.record("error","core","media","media-transfer-failed",()=>({conversation:e.conversation,data:{stage:e.stage,kind:e.kind,messageId:e.messageId},error:{message:"媒体上传失败",data:e.cause}}))},onAlbumContentSize:e=>{wr.record("rejected"===e.outcome?"error":"warn","core","media","rejected"===e.outcome?"media-album-content-rejected":"media-album-content-large",()=>({conversation:e.conversation,data:{messageId:e.messageId,itemCount:e.itemCount,...void 0===e.contentBytes?{}:{contentBytes:e.contentBytes}},...void 0===e.cause?{}:{error:{message:"媒体合集正文未通过发送前体积闸门",data:e.cause}}}))},...void 0===Ur?{}:{assetCache:Ur,onAssetCacheError:e=>{wr.record("warn","core","media","media-asset-cache-put-failed",()=>({data:{operation:e.operation,kind:e.kind,messageId:e.messageId,byteLength:e.byteLength},error:{message:"发送媒体写入本机缓存失败",data:e.cause}}))}},...void 0===mr.media?.maxConcurrentUploads?{}:{maxConcurrentUploads:mr.media.maxConcurrentUploads}}:void 0,sendStrategies:fs,commandHandlers:[...da.commandHandlers,...ca.commandHandlers,...Ls,...Ns,...Ks,...Fs,...Us,...Hs,...ks,...Ds,...qs,...As,...Os,..._s,...aa,...js],readStrategies:ia,canSendDirectReadReceipt:e=>{if(!$r.isDirectReadReceiptEnabled(e))return!1;const t=an.peekRelationship(e);return void 0!==t&&"unknown"!==t?"friend"===t:void 0},recallStrategies:Is,channelMessageDeletion:{resolveProfile:e=>Fo?.getProfile(e)??Promise.resolve(null),onPermissionDenied:e=>Zo.refreshConversationProfile(e,"channel")},editStrategies:ws,storage:kr,onHeartbeat:()=>da.onHeartbeat(),onAuthenticated:()=>{da.setAuthenticated(!0),ca.setAuthenticated(!0);for(const e of oo)e.resumeMedia();const e=uo;uo=!0,(e||"auto"===lo)&&Pa().catch(()=>{}),Vs.start()},isOnline:()=>"undefined"==typeof navigator?void 0:navigator.onLine},mr.connection);Hr=e=>la.suppressDirectReadReceipts(e),Vr=e=>la.resumeDirectReadReceipts(e),Cs=la.sendFrame,bs=()=>"authenticated"===la.state,Ss=la.onChatAck,go=la.terminateConversationSending,Ts=la.markOutboxConversationTerminated,Es=la.clearOutboxConversationTerminated;const ua=L({operations:{getPending:la.getPendingOutbox,retry:la.retryOutboxMessage,cancel:la.cancelOutboxMessage},emitter:vr,isActive:()=>Cr}),ma=l({mediaCrypto:{executor:mn,generation:gr,isActive:()=>Cr},connection:la,domainState:Zo,crypto:yn,settleEmptyGroupRead:async e=>{const t=xo.get(e.conversationId)??0,r=Zo.getSession(e);let o=void 0===r,n=r?.unreadCount??0,s=r?.mentionUnreadCount??0,a=n,i=s;const c=()=>{const r=Zo.getSession(e);if(!Cr||o||void 0===r||t!==(xo.get(e.conversationId)??0)||void 0!==r.groupState&&"active"!==r.groupState)throw new DOMException("群已读请求已失效","AbortError");return r},d=vr.subscribe(t=>{if("conversation"in t&&"group"===t.conversation?.conversationType&&t.conversation.conversationId===e.conversationId&&(("session:removed"===t.type||"conversation-history:cleared"===t.type||"session:updated"===t.type&&void 0!==t.session.groupState&&"active"!==t.session.groupState)&&(o=!0),"read:updated"===t.type||"session:updated"===t.type)){const t=Zo.getReadState(e);if(void 0===t)return;const r=t.mentionUnreadCount??0;a=Math.max(0,a-Math.max(0,n-t.unreadCount)),i=Math.max(0,i-Math.max(0,s-r)),n=t.unreadCount,s=r}});try{c();const t=await fr.getLoginContext();if(c(),null===t||t.userId!==Ir)throw new Error("群已读 read_all:登录上下文已失效");await pr({http:Er,userId:t.userId,groupId:e.conversationId});const r=c(),o=Zo.getReadState(e),n=Math.max(0,(o?.unreadCount??r.unreadCount)-a),s=Math.max(0,(o?.mentionUnreadCount??r.mentionUnreadCount??0)-i);Zo.setReadState({...o??{...e,readCursor:r.readCursor??"",unreadCount:r.unreadCount},mentionUnreadCount:s}),Zo.applyServerUnread(e,n)}finally{d()}},...void 0===fn?{}:{mediaTransfer:fn},prepareDirectReadReceipt:async e=>{try{await an.ensureRelationship(e)}catch(t){vr.emit({type:"error",error:{scope:"http",message:"Direct 已读已在本地提交,但联系人关系查询失败,未发送对端可见回执",cause:{peerId:e,error:t}}})}}}),va=O({recoveryPort:br?.port,connection:la,domainState:Zo,emitter:vr,isActive:()=>Cr,preparePreview:Cn,prepareVideoPoster:bn,prepareImageThumbnail:Sn,onLocalPreviewError:({kind:e,byteLength:t,cause:r})=>{wr.record("warn","sdk","media","local-preview-failed",()=>({generation:gr,data:{kind:e,byteLength:t},error:{message:r instanceof Error?r.message:String(r)}}))},...void 0===Ur?{}:{assetCache:Ur,onAssetCacheEvent:e=>{wr.record("failed"===e.outcome?"warn":"debug","sdk","media",`media-asset-cache-${e.operation}-${e.outcome}`,()=>({data:{operation:e.operation,outcome:e.outcome,kind:e.kind,messageId:e.messageId,...void 0===e.byteLength?{}:{byteLength:e.byteLength}},...void 0===e.cause?{}:{error:{message:"媒体资产缓存操作失败",data:e.cause}}}))}},...void 0===fn?{}:{loaders:{loadImage:ma.operations.loadImage,loadVideo:ma.operations.loadVideo,loadVoice:ma.operations.loadVoice,loadFile:ma.operations.loadFile}}}),ya=J({isActive:()=>Cr&&"ready"===eo&&""!==Ir,maintain:async()=>{va.prune(),la.expireRetainedUploads();const e=(await Promise.allSettled([Fr?Ur?.prune?.():void 0,br?.prune()])).find(e=>"rejected"===e.status);if("rejected"===e?.status)throw e.reason},onError:e=>wr.record("warn","sdk","media","media-cache-maintenance-failed",()=>({error:{message:"媒体过期缓存清理失败",data:e}}))});rn=()=>{la.invalidateMediaAssetCacheWrites(),va.clearCache()},void 0===mr.transport&&"undefined"!=typeof window&&(la.setConnectionAllowed(!1),no=nt({onChange:(e,t)=>{if(!e){if(yo=!0,la.setConnectionAllowed(!1),!Cr)return io?.then(()=>{});Cr=!1,Vs.stop(),jr.clear(),Nn(),wo.abort(),Io.dispose(),Eo.dispose(),To.dispose(),po?.dispose(),mo=!1,vo+=1,ga.stop();return _a({localData:"preserve"},{requireStorageClose:!0,preserveUploadRecovery:!0,notifyReplacement:"replaced"===t}).then(()=>{})}},onError:e=>{ao=e,vr.emit({type:"error",error:{scope:"transport",message:"IM 页面连接协调不可用,请使用支持 Web Locks 的安全浏览器环境",cause:e}})}}));const ga=Ce({onOnline:()=>{Sr.setOnline(!0),la.notifyOnline()},onOffline:()=>{Sr.setOnline(!1),la.notifyOffline()},onVisible:()=>{ya.run(),la.notifyVisible();for(const e of oo)e.resumeMedia()},onPageHide:()=>{mo&&la.suspendForPageLifecycle()},onPageShow:()=>{if(ya.run(),mo){la.resumeFromPageLifecycle(),la.notifyVisible();for(const e of oo)e.resumeMedia()}}},mr.network);const ha=vr.subscribe(e=>{Cr&&"auth:invalid"===e.type&&(Vs.stop(),mo=!1,vo+=1,yo=void 0!==no,no?.terminate(),ga.stop())});async function fa(e,t={}){const r=await(Tn?.getUserPrivateKey(e,{priority:t.priority??"background",signal:t.signal??wo.signal}))??null;return{crypto:yn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?r?.privateKey??null:null,onDecryptError:t=>Jr("offline",t,e),onDecryptRecovery:Kr}}function Ia(e,t,r){const o=void 0===t?Zo.getMessages().filter(t=>t.conversationType===e):Zo.getMessagesByConversation(t).filter(e=>void 0===r||r.includes(e.id)),n=new Map(o.map(e=>[_r({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}),e])),s=/* @__PURE__ */new Set,a=vr.subscribe(o=>{if(("message:received"===o.type||"message:updated"===o.type)&&o.conversation.conversationType===e&&(void 0===t||o.conversation.conversationId===t.conversationId&&(void 0===r||r.includes(o.message.id)))){const e=_r({conversation:o.conversation,messageId:o.message.id}),t=n.get(e);"live"!==o.source||void 0!==t&&Ft(t,o.message)||s.add(e),n.set(e,o.message)}});return{stop:()=>{a(),n.clear(),s.clear()},acceptsRecovery:e=>!s.has(_r(e)),messages:e=>e.map(e=>{const t={conversationType:e.conversationType,conversationId:e.conversationId};return s.has(_r({conversation:t,messageId:e.id}))?Zo.getConversationMessage(t,e.id)??e:e})}}function wa(e,t){const r=Ir,o=new Map(Po),n=/* @__PURE__ */new Map,s=e=>{if(Rt(wo.signal),!Cr||r!==Ir)throw new DOMException("DIRECT 计算所属账号已失效","AbortError");void 0!==e&&n.set(we(e),e);for(const[e,t]of n)if((o.get(e)?.version??0)!==Ao(t))throw void 0!==Po.get(e)?.reason?Po.get(e).reason:new DOMException("DIRECT 计算所属会话已清理","AbortError");t?.()};return{publish(e,t){s();const r=t();return s(),r},executor:mn,generation:gr,operationId:"direct-batch:"+ ++Zn,priority:e,signal:wo.signal,assertCurrent:s,yieldToEventLoop:Ut}}function Ca(e,t,r){const o=Ir,n=new Map(Po),s=/* @__PURE__ */new Map,a=e=>{if(Rt(wo.signal),Rt(t),!Cr||Ir!==o)throw new DOMException("GROUP 计算所属账号已失效","AbortError");void 0!==e&&s.set(we(e),e);for(const[e,t]of s)if((n.get(e)?.version??0)!==Ao(t))throw void 0!==Po.get(e)?.reason?Po.get(e).reason:new DOMException("GROUP 计算所属群密钥、权限或历史已失效","AbortError");r?.()};return{publish(e,t){a();const r=e.filter(e=>{if("group"!==e.conversationType||void 0===e.body.system)return!1;const t=Bt(e.body.system,Ir);return null!==t&&"active"!==t.state}).map(e=>({conversationType:"group",conversationId:e.conversationId})),o=t();for(const e of r){const t=we(e);void 0===Po.get(t)?.reason&&n.set(t,{version:Ao(e)})}return a(),o},executor:{async decryptBatch(t){const r=[...s.values()];ls.set(t.operationId,r);try{const o="foreground"===e||r.some(e=>!0===po?.hasForeground(e))?"foreground":"background";return await mn.decryptBatch({...t,priority:o})}finally{ls.delete(t.operationId)}}},generation:gr,operationId:"group-batch:"+ ++Zn,priority:e,signal:t??wo.signal,assertCurrent:a,yieldToEventLoop:Ut}}async function ba(e,t,r,o,n){const s=[];let a;try{0===e.length&&0===t.length&&n([],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([],"offline")))});for(const e of t)n([],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([],"offline",void 0,{events:[e],apply:e=>Ms.ingest(e,"offline")})))});for(const t of e){const e=Zo.prepareOfflineMessageUpdate(t,o);("boolean"==typeof e?e:await e)&&n([t],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([t],"offline")))})}for(const e of r)n([],()=>{Kr(e);const t=Dr.get(_r(e));void 0!==t&&s.push(t)})}catch(e){a={cause:e}}const i=await Promise.allSettled(s);if(void 0!==a)throw a.cause;const c=i.find(e=>"rejected"===e.status);if("rejected"===c?.status)throw c.reason;o()}function Sa(e,t){return{endpoint:e,pullBatch:async({deliveredMsgInfos:r,limit:o})=>{const n=Ia("direct");try{const s=[],a=Ir,i=wa("background");i.assertCurrent?.();const c=await fr.getLoginContext();if(null===c)throw new Error(`sync(${e}): 无登录上下文(authProvider.getLoginContext 返回 null)`);if(i.assertCurrent?.(),""!==a&&c.userId!==a)throw new DOMException("DIRECT 离线同步的登录账号已改变","AbortError");const d=await fa(c.userId);i.assertCurrent?.();const p=[],l=await t({http:Er,userId:c.userId,clientType:hr,decryptDeps:{...d,onDecryptRecovery:e=>s.push(e)},asyncDecrypt:i,deliveredMsgInfos:r,...void 0===o?{}:{limit:o},onReaction:e=>p.push(e)});return i.assertCurrent?.(),{...l,reactions:p,commit:async()=>{try{await ba(n.messages(l.messages).sort(Nt),p,s.filter(n.acceptsRecovery),()=>i.assertCurrent?.(),i.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}}async function Ta(e,t){const r=[...new Map(e.map(e=>[we(e),e])).values()],o=[];let n=0;if(await(async()=>{for(;n<r.length;){if(!Cr)return;const e=r[n++],s="group"===e.conversationType?{conversationType:"group",conversationId:e.conversationId}:void 0,a=void 0!==s&&void 0!==t&&t.groupIds.has(e.conversationId)&&Zo.hasRecoverableConversationDeletion(s)?{ref:s,userId:t.userId}:void 0;if(a||void 0!==Zo.getSession(e)&&void 0!==ps(e))try{if(await Io.waitForBackground(wo.signal),!Cr)return;if(a&&await Ea(a.ref,a.userId))continue;if(!Cr||void 0===Zo.getSession(e)||void 0===ps(e))continue;po.invalidate(e,{preserveForeground:!0}),await co({conversation:e,oldestLoaded:void 0,intent:"establish-latest",limit:30})}catch(t){if(a){o.push(t);continue}if(!Cr||void 0===Zo.getSession(e)||void 0===ps(e))continue;vr.emit({type:"error",error:{scope:"sync",message:"会话最新消息同步失败",cause:t}}),wr.record("warn","sdk","sync","session-latest-summary-failed",()=>({conversation:e,error:{message:"会话最新消息同步失败",data:t}}))}}})(),o.length>0)throw new AggregateError(o,"已删除群会话恢复失败")}async function Ea(e,t){if(!Zo.hasRecoverableConversationDeletion(e))return!1;const r=Ca("background");r.assertCurrent?.(e);const o=Ia("group",e);try{const n=[],s=[],a=await Ot({http:Er,userId:t,clientType:hr,groupId:e.conversationId,baseTime:Date.now(),direct:1,limit:30,signal:wo.signal,asyncDecrypt:r,decryptDeps:{...Un("history"),onDecryptRecovery:e=>n.push(e)},prepareKeys:e=>Fn(e,{priority:"background",signal:wo.signal}),onReaction:e=>s.push(e)});r.assertCurrent?.(e);const i=o.messages(a.messages).sort(Nt);return await ba(i,s,n.filter(o.acceptsRecovery),()=>r.assertCurrent?.(e),r.publish),void 0!==Zo.getSession(e)}finally{o.stop()}}async function Ra(){const e=Wr("sync");wr.record("info","sdk","sync","channel-sync-start",()=>({operationId:e,data:{clientTypeHeader:hr,sessionsClientTypeBody:"absent",offlineClientTypeBody:hr}}));try{await async function(e){const t=Oo,r=new Map(Do),n=e=>Cr&&t===Oo&&(r.get(e)??0)===_o(e);if(void 0===Fo)return void wr.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"profile-unavailable"}}));const s=await fr.getLoginContext();if(null===s)return void wr.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"auth-unavailable"}}));const a=(await Fo.listProfiles({forceRefresh:!0})).filter(e=>n(e.id));if(!Cr)return;if(0===a.length)return void wr.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:0,sessionCount:0,offlineMessageCount:0}}));const i=new Map(a.map(e=>[e.id,e]));for(const e of a){if(Zr(e.channelState)){Mn?.clearChannelKey(e.id),Rs.removeConversationForMembershipTermination({conversationType:"channel",conversationId:e.id},`channel_${e.channelState}`);continue}const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;Zo.setChannelRestriction(e.id,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),Zo.updateConversationProfile({conversationType:"channel",conversationId:e.id},{title:e.name,avatar:e.avatar}),void 0!==e.muted&&Zo.setMuted({conversationType:"channel",conversationId:e.id},e.muted)}const c=new Map(a.map(e=>{const t={conversationType:"channel",conversationId:e.id},r=Zo.getReadState(t),o=Zo.getSession(t);return[e.id,{revision:Zo.getChannelReadRevision(t),pending:Zo.hasPendingChannelRead(t),readCursor:r?.readCursor??o?.readCursor??"",unreadCount:o?.unreadCount??r?.unreadCount??0,mentionUnreadCount:o?.mentionUnreadCount??r?.mentionUnreadCount??0}]})),d=a.map(e=>({channelId:e.id,readCursor:c.get(e.id).readCursor}));wr.record("debug","sdk","sync","channel-sessions-request",()=>({operationId:e,data:{channelCount:d.length,channelsWithReadCursor:d.filter(e=>""!==e.readCursor).length,clientTypeHeader:hr,clientTypeBody:hr}}));const p=await qt({http:Er,userId:s.userId,clientType:hr,channels:d,operationId:e,decryptDeps:jn("offline"),prepareKeys:e=>An(e.filter(e=>{const t=i.get(e)?.channelState;return void 0===t||!o(t)})),onContentDecodeError:Xr,onReaction:is});if(!Cr)return;wr.record("debug","sdk","sync","channel-sessions-response",()=>({operationId:e,data:{sessionCount:p.length,lastMessageCount:p.filter(e=>void 0!==e.last).length,decryptFailedLastCount:p.filter(e=>!0===e.last?.encryption.decryptFailed).length,unknownContentLastCount:p.filter(e=>"unknown"===e.last?.contentType&&!0!==e.last.encryption.decryptFailed).length}}));const l=new Set(p.filter(e=>{const t=c.get(e.channelId),r={conversationType:"channel",conversationId:e.channelId},o=Zo.getReadState(r),n=Zo.getSession(r);return void 0===t||t.pending||Zo.hasPendingChannelRead(r)||Zo.getChannelReadRevision(r)!==t.revision||(o?.readCursor??n?.readCursor??"")!==t.readCursor||(n?.unreadCount??o?.unreadCount??0)!==t.unreadCount||(n?.mentionUnreadCount??o?.mentionUnreadCount??0)!==t.mentionUnreadCount}).map(e=>e.channelId)),u=p.filter(e=>n(e.channelId)&&void 0!==Zo.getConversationContext({conversationType:"channel",conversationId:e.channelId})).map(e=>{const t=i.get(e.channelId),r=t?.channelState,n=void 0!==r&&o(r)?r:o(e.channelState)?e.channelState:r??e.channelState,s="active"===n?void 0:n===e.channelState?e.sendDisabledReason:`channel_${n}`;return{...e,channelState:n,sendDisabledReason:s}});for(const e of u){const t=i.get(e.channelId);Zo.setChannelRestriction(e.channelId,e.channelState,e.sendDisabledReason,void 0===t?void 0:{permissions:t.permissions,...void 0===t.accessSnapshot?{}:{snapshot:t.accessSnapshot}}),void 0!==t&&(Zo.updateConversationProfile({conversationType:"channel",conversationId:e.channelId},{title:t.name,avatar:t.avatar}),void 0!==t.muted&&Zo.setMuted({conversationType:"channel",conversationId:e.channelId},t.muted)),l.has(e.channelId)||Zo.applyChannelReadSummary({conversationType:"channel",conversationId:e.channelId},e),o(e.channelState)&&Mn?.clearChannelKey(e.channelId)}const m=e=>{const t=Zo.getConversationContext({conversationType:"channel",conversationId:e});return n(e)&&void 0!==t&&(void 0===t.channelState||!o(t.channelState))},v=(e,r=!0)=>{if(!Cr||t!==Oo)return[];const o=e.filter(e=>m(e.conversationId));return o.length>0&&Zo.upsertMessages(o,"offline",{applyChannelLifecycleEffects:r}),o},y=async(e,t,r=[],o=[],n=!0)=>{const s=()=>m(e.conversationId),a=()=>{if(!s())throw new DOMException("社群离线提交所属会话已失效","AbortError")};if(!s())return!1;const i=Ia("channel",e);try{const c=[];for(const e of[...t].sort(Nt)){const t=Zo.prepareOfflineMessageUpdate(e,a);("boolean"==typeof t?t:await t)&&c.push(e)}a();const d=async()=>{const e=o.filter(i.acceptsRecovery);if(e.length>0&&void 0===kr?.saveDecryptRecovery)throw new Error("CHANNEL 同步不能保存解密恢复记录");for(const t of e)await kr.saveDecryptRecovery(t)};if(!0===kr?.supportsChannelSyncCheckpoint)return await Zo.commitChannelSyncPage([e],()=>{v(i.messages(c),n);for(const e of r)s()&&is(e)},s,d);await Zo.commitReceivedMessages(i.messages(c),"offline",{applyChannelLifecycleEffects:n},{events:r,apply:e=>Ms.ingest(e,"offline")});for(const e of o.filter(i.acceptsRecovery))a(),Kr(e),await Dr.get(_r(e));return s()}finally{i.stop()}},g=[],h=/* @__PURE__ */new Set;for(const e of u)if(void 0!==e.last)try{await y({conversationType:"channel",conversationId:e.channelId},[e.last])}catch(t){g.push(t),h.add(e.channelId)}const f=/* @__PURE__ */new Set;for(const t of u){const r={conversationType:"channel",conversationId:t.channelId};if(void 0!==t.last||t.unreadCount<=0||""!==t.readCursor||o(t.channelState)||!Zo.hasRecoverableConversationDeletion(r,{includeRestored:!0}))continue;const n=Ia("channel",r);try{if(await Io.waitForBackground(wo.signal),!m(t.channelId))continue;const o=[],a=[],i=await Wt({http:Er,userId:s.userId,clientType:hr,channelId:t.channelId,count:lr,operationId:e,signal:wo.signal,decryptDeps:{...jn("history"),onDecryptRecovery:e=>a.push(e)},prepareKey:e=>An([e],{signal:wo.signal,priority:"background"}),onContentDecodeError:Xr,onReaction:e=>o.push(e)});await y(r,n.messages(i.messages),o,a.filter(n.acceptsRecovery),!1)&&f.add(t.channelId)}catch(e){g.push(e),h.add(t.channelId)}finally{n.stop()}}await Ta(u.filter(e=>void 0===e.last&&!o(e.channelState)&&!f.has(e.channelId)&&!h.has(e.channelId)).map(e=>({conversationType:"channel",conversationId:e.channelId})));const I=u.filter(e=>!h.has(e.channelId)&&!l.has(e.channelId)&&!o(e.channelState)&&e.unreadCount>0&&""!==e.readCursor);wr.record("debug","sdk","sync","channel-offline-plan",()=>{const t={staleRead:0,historyBlocked:0,zeroUnread:0,emptyReadCursor:0};for(const e of u)l.has(e.channelId)?t.staleRead+=1:o(e.channelState)?t.historyBlocked+=1:e.unreadCount<=0?t.zeroUnread+=1:""===e.readCursor&&(t.emptyReadCursor+=1);return{operationId:e,data:{acceptedSessionCount:u.length,eligibleChannelCount:I.length,staleReadSkippedCount:t.staleRead,historyBlockedSkippedCount:t.historyBlocked,zeroUnreadSkippedCount:t.zeroUnread,emptyReadCursorSkippedCount:t.emptyReadCursor,direction:0,contain:0,count:lr}}});const w=[],C=new Map(I.map(e=>[e.channelId,e.readCursor])),b=[];for(const t of I){const r={conversationType:"channel",conversationId:t.channelId},o=!0!==kr?.supportsChannelSyncCheckpoint?void 0:Qt(await kr.getMeta(Yt(r)),r);if(!m(t.channelId))continue;const n=o?.startIndex===t.readCursor;b.push({channelId:t.channelId,baseIndex:n?o.baseIndex:t.readCursor}),wr.record("debug","sdk","sync","channel-offline-resume",()=>({operationId:e,conversation:r,data:{resumed:n}}))}const S=[],T=[];let E;if(await zt({http:Er,userId:s.userId,clientType:hr,operationId:e,pulls:b,messageCount:lr,signal:wo.signal,beforePage:()=>Io.waitForBackground(wo.signal),isChannelCurrent:m,yieldToEventLoop:Ut,decryptDeps:{...jn("offline"),onDecryptRecovery:e=>T.push(e)},prepareKeys:e=>An(e,{recoverExistingMessages:!1}),onContentDecodeError:Xr,onReaction:e=>S.push(e),onPage:async(e,t)=>{const r=S.splice(0),o=T.splice(0),n=(async()=>{for(const n of t.pulls){const s={conversationType:"channel",conversationId:n.channelId},a=()=>m(n.channelId);if(!a())continue;const i=o.filter(e=>e.conversation.conversationId===n.channelId),c=e.filter(e=>e.conversationId===n.channelId),d=await y(s,c,r.filter(e=>e.conversation.conversationId===n.channelId),i);if(d&&w.push(...c),!0!==kr?.supportsChannelSyncCheckpoint)continue;if(!d||!a())continue;const p=t.nextBaseIndexes[n.channelId];void 0!==p&&await Zo.saveChannelSyncCheckpoint({version:1,conversation:s,startIndex:C.get(n.channelId),baseIndex:p},a);for(const e of i)a()&&ns(e).catch(e=>vr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 解密恢复失败",cause:e}}))}})();Co.add(n);try{await n}finally{Co.delete(n)}}}).catch(e=>{E={cause:e}}),!Cr)return;const R=u.flatMap(e=>{const t=e.last;if(void 0===t||qn(t))return[];const r=t.extensions?.historyCursor;return[{summary:e,last:t,historyCursor:"string"==typeof r?r.trim():""}]}),M=(e,t)=>`${e}:${t}`,k=/* @__PURE__ */new Map,D=/* @__PURE__ */new Set;for(const{summary:e,last:t}of R){const r=Zo.getConversationMessage({conversationType:"channel",conversationId:e.channelId},t.id);if(void 0===r||!qn(r))continue;const o=M(e.channelId,t.id);k.set(o,r),D.add(o)}for(const e of w)qn(e)&&k.set(M(e.conversationId,e.id),e);const x=R.filter(({summary:e,last:t,historyCursor:r})=>!(""===r||l.has(e.channelId)||o(e.channelState)||k.has(M(t.conversationId,t.id))||$n.has(M(t.conversationId,t.id)))),P=R.filter(({summary:e,last:t})=>!l.has(e.channelId)&&!o(e.channelState)&&!D.has(M(t.conversationId,t.id))&&k.has(M(t.conversationId,t.id))).length;wr.record("debug","sdk","sync","channel-session-last-recovery-plan",()=>({operationId:e,data:{unusableLastCount:R.length,decryptFailedLastCount:R.filter(({last:e})=>!0===e.encryption.decryptFailed).length,unknownContentLastCount:R.filter(({last:e})=>"unknown"===e.contentType&&!0!==e.encryption.decryptFailed).length,localRecoveredCount:D.size,offlineRecoveredCount:P,contextRecoveryCount:x.length,staleReadSkippedCount:R.filter(e=>l.has(e.summary.channelId)).length,historyBlockedSkippedCount:R.filter(e=>o(e.summary.channelState)).length,missingHistoryCursorCount:R.filter(e=>""===e.historyCursor).length}}));const A=async({summary:t,last:r,historyCursor:n})=>{try{if(await Io.waitForBackground(wo.signal),!m(t.channelId))return;const{message:a}=await ra.loadMessageContext(t.channelId,n,s.userId,wo.signal),i=Zo.getConversationContext({conversationType:"channel",conversationId:t.channelId});if(!Cr||"channel"!==i?.type||void 0!==i.channelState&&o(i.channelState))return;if("channel"!==a.conversationType||a.conversationId!==t.channelId||a.id!==r.id)throw new Error(`CHANNEL sessions.last 精确恢复结果不匹配(channelId=${t.channelId}, messageId=${r.id})`);if(!qn(a)){if("unknown"===a.contentType&&!0!==a.encryption.decryptFailed)return $n.add(M(a.conversationId,a.id)),void wr.record("info","sdk","sync","channel-session-last-unknown-confirmed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:t.channelId},data:{messageId:r.id,reason:a.body.unknown?.reason}}));throw new Error(`CHANNEL sessions.last 精确恢复未取得可用正文(channelId=${t.channelId}, messageId=${r.id})`)}return a}catch(o){return void wr.record("warn","sdk","sync","channel-session-last-recovery-failed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:t.channelId},error:{message:"CHANNEL sessions.last 精确恢复失败",data:o},data:{messageId:r.id}}))}},j=[];for(const e of x){if(!Cr)break;j.push(await A(e))}for(const e of j)void 0!==e&&k.set(M(e.conversationId,e.id),e);const O=j.filter(e=>{if(void 0===e)return!1;const t=Zo.getConversationMessage({conversationType:"channel",conversationId:e.conversationId},e.id);return void 0===t||!qn(t)});if(v(O),1===g.length&&void 0===E)throw g[0];if(g.length>0)throw new AggregateError([...g,...void 0===E?[]:[E.cause]],"社群摘要或离线恢复保存失败");if(void 0!==E)throw E.cause;wr.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:a.length,terminalProfileCount:a.filter(e=>Zr(e.channelState)).length,sessionCount:p.length,acceptedSessionCount:u.length,sessionLastCount:u.filter(e=>void 0!==e.last).length,recoveredSessionLastCount:R.filter(({last:e})=>k.has(M(e.conversationId,e.id))).length,offlineMessageCount:w.length}}))}(e)}catch(t){throw wr.record("error","sdk","sync","channel-sync-failed",()=>({operationId:e,error:{message:"CHANNEL 同步失败",data:t}})),t}}let Ma=null,ka=!1;const Da=Kt({commitBatch:async function(e,t=[]){if(!Cr)throw new Error("离线消息提交已取消");await Zo.commitReceivedMessages(e,"offline",void 0,{events:t??[],apply:e=>Ms.ingest(e,"offline")});const r=e.flatMap(e=>{const t=Dr.get(_r({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}));return void 0===t?[]:[t]});if(await Promise.all(r),!Cr)throw new Error("离线消息提交已取消")},pullers:[Sa("chat",St),Sa("owner_chat",Tt),{endpoint:"group",pullBatch:async({deliveredMsgInfos:e,limit:t})=>{const r=Ir,o=Ca("background"),n=Ia("group");try{o.assertCurrent?.();const s=await fr.getLoginContext();if(null===s)throw new Error("sync(group): 无登录上下文(authProvider.getLoginContext 返回 null)");if(o.assertCurrent?.(),""!==r&&s.userId!==r)throw new DOMException("GROUP 离线同步的登录账号已改变","AbortError");const a=[],i=[],c=await _t({http:Er,userId:s.userId,clientType:hr,decryptDeps:{...Un("offline"),onDecryptRecovery:e=>i.push(e)},asyncDecrypt:o,prepareKeys:Fn,deliveredMsgInfos:e,...void 0===t?{}:{limit:t},onReaction:e=>a.push(e)});return o.assertCurrent?.(),{...c,reactions:a,commit:async()=>{try{await ba(n.messages(c.messages).sort(Nt),a,i.filter(n.acceptsRecovery),()=>o.assertCurrent?.(),o.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}],domainState:Zo,emitter:vr,logger:zr,yieldToEventLoop:Ut});const xa=H({domainState:Zo,storage:kr,getSelfId:()=>Ir,assertCurrent:()=>{if(!Cr||wo.signal.aborted)throw new DOMException("客服历史恢复所属账号已失效","AbortError")},hasPendingSend:e=>la.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId),fetch:async e=>{const t=Ir,r=()=>{if(!Cr||wo.signal.aborted||Ir!==t)throw new DOMException("客服历史查询所属账号已失效","AbortError")},o=await fa(t);r();const n=await Dt({http:Er,userId:t,clientType:hr,messageIds:e,decryptDeps:o,asyncDecrypt:wa("background",r)});if(r(),200!==n.code)throw new Error(`客服历史原文查询失败:${n.code}`);return n.messages}});async function Pa(){if(void 0!==no&&(!no.owned||yo))throw new Error("当前页面未持有 IM 连接,不能同步消息");const e=To.begin(),t=Eo.begin(),r=async function(){const e=Ir,t=Ca("background"),r=Ia("group");try{t.assertCurrent?.();const o=await fr.getLoginContext();if(null===o)return;if(t.assertCurrent?.(),""!==e&&o.userId!==e)throw new DOMException("GROUP 会话同步的登录账号已改变","AbortError");const n=[],s=[],a=await jt({http:Er,userId:o.userId,clientType:hr,decryptDeps:{...Un("offline"),onDecryptRecovery:e=>s.push(e)},asyncDecrypt:t,prepareKeys:Fn,onReaction:e=>n.push(e)});t.assertCurrent?.();for(const e of a.unreads)t.assertCurrent?.(),Zo.applyServerUnread({conversationType:"group",conversationId:e.groupId},e.unreadCount),_n(e.groupId);await ba(r.messages(a.messages).sort(Nt),n,s.filter(r.acceptsRecovery),()=>t.assertCurrent?.(),t.publish),t.assertCurrent?.(),await Ta(a.unreads.map(e=>({conversationType:"group",conversationId:e.groupId})),{userId:o.userId,groupIds:new Set(a.unreads.filter(e=>e.unreadCount>0).map(e=>e.groupId))}),t.assertCurrent?.(),Lt(a)}finally{r.stop()}}().catch(e=>{throw vr.emit({type:"error",error:{scope:"sync",message:"群会话摘要同步失败",cause:e}}),e}),o=(null!==Ma?(ka=!0,Ma):(Ma=(async()=>{let e;do{ka=!1,e=void 0;try{await Ra()}catch(t){e=t}}while(ka);if(void 0!==e)throw e})().finally(()=>{Ma=null}),Ma)).catch(e=>{throw vr.emit({type:"error",error:{scope:"sync",message:"CHANNEL 会话与离线消息同步失败",cause:e}}),e});bo+=1;try{const e=xa.run().catch(e=>{throw vr.emit({type:"error",error:{scope:"sync",message:"旧客服消息恢复失败,已保留未恢复的本机记录,可刷新重试",cause:e}}),e}),t=(await Promise.allSettled([Da.sync({rejectOnFailure:!0}),r,o,e])).find(e=>"rejected"===e.status);if("rejected"===t?.status)throw t.reason}finally{t(),e(),bo-=1,So="authenticated"===la.state,po?.notifySchedulingChanged()}}async function Aa(){if("ready"===eo)return;eo="preparing";const e=await fr.getLoginContext();if(Cr){if(null!==e){if(await async function(e){if(void 0!==no&&Cr){if(!yo){so??(so=no.start(yr.forAccount(e).name("ephemeral","connection",`client-${hr}`)));const t=await so;if(!Cr)return;if(Cr&&!yo&&t&&no.owned)return void la.setConnectionAllowed(!0)}if(la.setConnectionAllowed(!1),await la.connect(),void 0!==ao)throw Object.assign(new Error("Browser IM coordination is unavailable"),{code:"IM_CONNECTION_OWNERSHIP_UNAVAILABLE",cause:ao});throw Object.assign(new Error("Chat is active in another page; reload this page to continue here"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"})}}(e.userId),!Cr)return;Ir=e.userId;try{await(br?.prepare(e.userId))}catch{vr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录不可用,本次上传仅支持当前页面内恢复"}})}if(!Cr)return;if(un.start(),void 0!==Tn&&Tn.getUserPrivateKey(e.userId,{priority:"foreground"}).catch(hn),void 0!==kr)try{if(await kr.open({namespace:e.userId}),Fr=!0,!Cr)return;try{await $r.hydrate()}catch(e){vr.emit({type:"error",error:{scope:"storage",message:"IM 设置初始化失败,已暂停发送 direct 已读回执",cause:e}})}if(!Cr)return;if(await Zo.hydrate(()=>Cr),!Cr)return;for(const e of Zo.getSessions())""===e.title&&"supergroup"!==e.type&&Zo.refreshConversationProfile(e.id,e.type);if(await la.hydrateOutbox(()=>Cr),!Cr)return}catch(e){vr.emit({type:"error",error:{scope:"storage",message:"本地存储初始化失败",cause:e}})}if(!Cr)return;if(void 0!==Rn)for(const e of Zo.getSessions())"group"===e.type&&_n(e.id)}Cr&&(eo="ready",""!==Ir&&ya.start())}}function ja(){if(yo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if("ready"===eo)return Promise.resolve();if(null!==ho)return ho;const e=Date.now();return wr.record("info","sdk","session","prepare-start"),ho=Aa().then(()=>wr.record("info","sdk","session","prepare-complete",()=>({durationMs:Date.now()-e}))).catch(t=>{throw wr.record("error","sdk","session","prepare-failed",()=>({durationMs:Date.now()-e,error:{message:"IM prepare 失败",data:t}})),t}).finally(()=>{ho=null}),ho}function Oa(e){wr.record("info","sdk","connection","disconnect",()=>({data:{reason:e}})),mo=!1,vo+=1,Vs.stop(),la.disconnect(e),ga.stop()}function _a(e,t={}){if(void 0!==io)return io;let r,o;return io=new Promise((e,t)=>{r=e,o=t}),async function(e,t){const r=Date.now();let o;wr.record("info","sdk","session","teardown-start",()=>({data:{localData:e?.localData??"preserve",pendingMessages:e?.pendingMessages??"fail"}})),Cr=!1,jr.clear(),Nn(),wo.abort(),Io.dispose(),Eo.dispose(),To.dispose(),na.dispose(),t.notifyReplacement&&vr.emit({type:"session:replaced"});const n=ya.dispose(),s=po?.dispose();us(),pa(),ca.dispose(),da.dispose(),Vs.stop(),Bs.dispose(),Gs.dispose(),Ms.dispose(),ua.dispose(),va.dispose(),In.dispose(),cn.dispose(),an.dispose();const a=la.disposeMediaTasks({preserveRecovery:!0===t.preserveUploadRecovery});for(const e of oo)e.close();oo.clear(),Oo+=1,la.markOutboxForLogout(e?.pendingMessages??"fail"),ea.dispose(),ta.dispose(),ra.dispose(),Go.dispose(),Vo.dispose(),qo.dispose(),Gr.dispose();const i=$r.dispose();dn.dispose();const c=Zo.invalidateAndDrainDraftOperations();pn.dispose(),zs(),Qs(),Zs(),Ps(),Js.dispose(),sa.reset(),Mn?.clearAll(),Hn.clear(),Vn.clear(),$n.clear(),Oa("im-logout"),(t.requireStorageClose||!0===no?.owned)&&await(ho?.catch(()=>{}));try{await a}catch{vr.emit({type:"error",error:{scope:"storage",message:"上传任务清理未完成,请检查本地数据与网络状态"}})}await n;try{await(br?.dispose(!0===t.preserveUploadRecovery))}catch(e){o=e,vr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录清理失败,请清除此站点的本地数据"}})}await c,await i,await s,await Promise.allSettled([...Co]),await Zo.waitForChannelSyncPersistence(),await Promise.allSettled([...Dr.values(),...Bn.values()]),await Promise.all([...Or.values()]),Zo.clearSession();const d="purge"===e?.localData?Ir:"";let p,l=""===d?void 0:o,u=!0;if(void 0!==kr)try{await kr.close()}catch(e){u=!1,""!==d&&(l=e),!1!==t.reportStorageErrors&&vr.emit({type:"error",error:{scope:"storage",message:""===d?"关闭本地存储失败":"关闭本地存储失败,已跳过删除本账号本地库",cause:e}})}if(""!==d&&u)try{void 0!==Mr?await Mr.purgeCurrentAccount({namespaceFactory:yr,accountId:d}):await ae(d,{namespaceFactory:yr}),void 0===l&&(p=d)}catch(e){l=e,!1!==t.reportStorageErrors&&vr.emit({type:"error",error:{scope:"storage",message:"删除本账号本地库失败",cause:e}})}if(eo="empty",wr.record("info","sdk","session","teardown-complete",()=>({durationMs:Date.now()-r,data:{purgedAccountId:p,purgeFailed:void 0!==l}})),sn(),to(),$s(),ha(),yo=!0,(t.requireStorageClose||void 0!==no)&&!u)throw new Error("Previous chat page could not close its account storage");return no?.stop(),{...void 0===p?{}:{purgedAccountId:p},...void 0===l?{}:{purgeError:l}}}(e,t).then(r,o),io}function Na(e){const t=e.conversationId,r=Ir,n=Oo,s=_o(t);let a,i;return async({readCursor:c,cursor:d,signal:p,isCurrent:l})=>{const u=Io.enterForeground();try{const u=()=>{const a=Zo.getConversationContext(e);return Cr&&Ir===r&&l()&&n===Oo&&s===_o(t)&&"channel"===a?.type&&(void 0===a.channelState||!o(a.channelState))};if(Rt(p),!u())return;if(void 0!==d&&(a!==c||void 0===i))return;const m=await fr.getLoginContext();if(Rt(p),null===m||m.userId!==r||!u())return;const v=[],y=[],g=await Mt({http:Er,userId:m.userId,clientType:hr,channelId:t,index:d??c,containAnchor:void 0===d,signal:p,decryptDeps:{...jn("history"),onDecryptRecovery:e=>y.push({...e,source:"history"})},prepareKey:e=>An([e],{recoverExistingMessages:!1,priority:"foreground",signal:p}),onContentDecodeError:Xr,onReaction:e=>v.push(e)});if(Rt(p),!u())return;if(void 0===d){const e=g.messages.find(e=>e.extensions?.historyCursor===c);if(void 0===e)return;a=c,i=e.sortKey}if(void 0===i)return;if(g.messages.length>0&&Zo.upsertMessages(g.messages,"offline",{backfillOnly:!0}),!u())return;for(const e of v){if(!u())return;is(e)}for(const e of y){if(!u())return;Kr(e)}if(!u())return;return{messages:g.messages.map(t=>{const r=Zo.getConversationMessage(e,t.id);if(void 0===r)throw new Error("首未读历史邻页在领域合并后缺少消息");return r}),readCursorSortKey:i,exhausted:!g.hasNewer,...void 0===g.nextCursor?{}:{nextCursor:g.nextCursor}}}finally{u()}}}async function La(){const e=Ia("direct");try{const t=[],r=[],o=Ir,n=wa("background");n.assertCurrent?.();const s=await fr.getLoginContext();if(null===s)throw new Error("pullOfflineChat: 无登录上下文(authProvider.getLoginContext 返回 null)");if(n.assertCurrent?.(),""!==o&&s.userId!==o)throw new DOMException("DIRECT 离线拉取的登录账号已改变","AbortError");const a={...await fa(s.userId),onDecryptRecovery:e=>t.push(e)},i=await Ct({http:Er,userId:s.userId,clientType:hr,decryptDeps:a,asyncDecrypt:n,onReaction:e=>r.push(e)}),c=await bt({http:Er,userId:s.userId,clientType:hr,decryptDeps:a,asyncDecrypt:wa("background",n.assertCurrent),onReaction:e=>r.push(e)});n.assertCurrent?.();const d=e.messages([...i,...c]);return await ba(d,r,t.filter(e.acceptsRecovery),()=>n.assertCurrent?.(),n.publish),d}finally{e.stop()}}Mo=async({conversation:e,newestLoaded:t,cursor:r,limit:n,signal:s})=>{Rt(s);const{conversationId:a}=e,i=Zo.getConversationContext(e);if(void 0===i)throw new Error(`加载更新消息失败:会话不存在(conversationId=${a})`);if("direct"===i.type||"robot"===i.type||"customerService"===i.type)return{messages:[],exhausted:!0};if("group"===i.type){if(void 0!==i.groupState&&"active"!==i.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:a},c=Ir,d=Ca(!0===po?.hasForeground(e)?"foreground":"background",s);d.assertCurrent?.(o);const p=Ia("group",o);try{const o=await fr.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(d.assertCurrent?.(),o.userId!==c)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const i=void 0===r?t?.serverTime??t?.createdAt:ur(r,a);if(void 0===i)throw new Error(`GROUP 向新分页缺少可信 baseTime(groupId=${a}, messageId=${t?.id??""})`);const l=[],u=[],m=await Ot({asyncDecrypt:d,signal:s,http:Er,userId:o.userId,clientType:hr,groupId:a,baseTime:i,direct:2,limit:n,decryptDeps:{...Un("history"),onDecryptRecovery:e=>u.push(e)},prepareKeys:t=>Fn(t,{signal:s,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onReaction:e=>l.push(e)});d.assertCurrent?.();const v=p.messages(m.messages);for(const e of v)d.publish([e],()=>Zo.upsertMessages([e],"offline",{backfillOnly:!0}));for(const e of l)d.publish([],()=>is(e));for(const e of u)d.publish([],()=>{p.acceptsRecovery(e)&&Kr(e)});d.assertCurrent?.();return{messages:v,...q({conversationId:a,direction:"newer",baseTime:i,batchSize:m.batchSize,boundaryTime:m.newestEntryTime,limit:n})}}finally{p.stop()}}if("channel"===i.type){if(void 0!==i.channelState&&o(i.channelState))return{messages:[],exhausted:!0};const n=r??t?.extensions?.historyCursor;if("string"!=typeof n||""===n.trim())throw new Error(`CHANNEL 向新分页缺少可信 historyCursor(channelId=${a}, messageId=${t?.id??""})`);const c=Oo,d=_o(a),p=await fr.getLoginContext();if(null===p)return{messages:[],exhausted:!0};const l=void 0===r?(await ra.loadMessageContext(a,n,p.userId,s)).context:await ra.loadNewerPage(a,n,p.userId,s);Rt(s);const u=Zo.getConversationContext(e);return!Cr||c!==Oo||d!==_o(a)||"channel"!==u?.type||void 0!==u.channelState&&o(u.channelState)?{messages:[],exhausted:!0}:(l.messages.length>0&&Zo.upsertMessages(l.messages,"offline",{backfillOnly:!0}),{messages:l.messages,exhausted:!l.hasNewer,...l.hasNewer&&void 0!==l.nextCursor?{nextCursor:l.nextCursor}:{}})}throw new Error(`向新分页未实现:${i.type}`)};function Ka(e){const t=_({...e,operation:"openConversation"});return Object.assign(new Error(t.code),t,{name:"ImConversationOpenError"})}function Fa(e){if(!Cr)throw Ka({code:"IM_SDK_CONVERSATION_RUNTIME_RELEASED",category:"state",retryable:!1,conversation:e})}function Ua(e,t){return{id:e.conversationId,type:e.conversationType,title:t.title.trim()||e.conversationId,...void 0===t.avatar?{}:{avatar:t.avatar},lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:t.muted??!1,...void 0===t.groupState?{}:{groupState:t.groupState},...void 0===t.channelState?{}:{channelState:t.channelState},...void 0===t.channelPermissions?{}:{channelPermissions:t.channelPermissions},...void 0===t.channelAccessSnapshot?{}:{channelAccessSnapshot:t.channelAccessSnapshot},...void 0===t.sendDisabledReason?{}:{sendDisabledReason:t.sendDisabledReason}}}const Ba={...a({...void 0===Tr?{}:{coreClient:Tr},authProvider:fr,http:Er,resolveInput:ln,domainState:Zo,operations:{list:function(){return Zo.getConversationList()},pullOffline:La,sync:async function(){await Pa()},prefetchRecent:(e,t)=>po.prefetchRecent(e,t)},beforeDeleteConversation:Lo,terminateConversationSending:(e,t)=>la.terminateConversationSending(e,t),resetConversationBackground:e=>Gr.api.resetBackground(e),reportStorageError:(e,t)=>vr.emit({type:"error",error:{scope:"storage",message:e,cause:t}}),markChannelRead:(e,t)=>la.markRead(e,t,"channel"),settleConversationRead:async e=>{const t=await Ha(e,{initialPosition:"latest"},"read");try{await t.markConversationRead()}finally{t.close()}}}),...Gr.api,ensureOpenableConversation:async function(e){const t=function(e){const t=e?.conversationType,r=e?.conversationId;if("supergroup"===t)throw Ka({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",retryable:!1,conversation:e});if("direct"!==t&&"group"!==t&&"channel"!==t&&"robot"!==t&&"customerService"!==t||"string"!=typeof r||""===r.trim())throw Ka({code:"IM_SDK_CONVERSATION_INVALID",category:"validation",retryable:!1,...void 0===e?{}:{conversation:e}});return Object.freeze({conversationType:t,conversationId:r.trim()})}(e);if(Fa(t),void 0!==Zo.getSession(t))return t;const r=To.begin();let o=!1;const n=vr.subscribe(e=>{"session:removed"===e.type&&e.conversation.conversationType===t.conversationType&&e.conversation.conversationId===t.conversationId&&(o=!0)}),s=()=>{if(Fa(t),o)throw Ka({code:"IM_SDK_CONVERSATION_OPEN_INVALIDATED",category:"state",retryable:!0,conversation:t})};try{if("direct"===t.conversationType){const e=Vo.peekItem("individual",t.conversationId);if(void 0!==e)return Zo.prepareConversation(Ua(t,{title:e.displayName||e.cardDisplayName,...void 0===e.avatarUrl?{}:{avatar:e.avatarUrl}})),t;const r=await an.getRelationship(t.conversationId);if(s(),"friend"!==r)throw Ka({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",retryable:!1,conversation:t,details:Object.freeze({relationship:r})});const o=await an.getProfile(t.conversationId);if(s(),null===o||o.id!==t.conversationId)throw Ka({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});return Zo.prepareConversation(Ua(t,{title:o.remark??o.nickname,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted}})),t}if("group"===t.conversationType){const e=Zo.isMembershipTerminated(t),r=Vo.peekItem("group",t.conversationId);if(void 0!==r&&!e)return Zo.prepareConversation(Ua(t,{title:r.displayName||r.cardDisplayName,...void 0===r.avatarUrl?{}:{avatar:r.avatarUrl},groupState:"active"})),t;if(void 0===Ko)throw Ka({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const o=await Ko.getGroupProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===o||o.id!==t.conversationId)throw Ka({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});if(!1===o.isInGroup||e&&!0!==o.isInGroup||void 0!==o.status&&2!==o.status)throw Ka({code:"IM_SDK_GROUP_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({...void 0===o.status?{}:{status:o.status},...void 0===o.isInGroup?{}:{isInGroup:o.isInGroup}})});return Zo.prepareConversation(Ua(t,{title:o.name,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted},groupState:"active"}),{membershipConfirmed:e}),e&&(s(),Es({conversationType:"group",conversationId:t.conversationId})),t}if("customerService"===t.conversationType){if("__customer_service__"!==t.conversationId||void 0===Zo.getConversationContext(t))throw new Error("客服会话只能由已接收消息创建");return t}if("robot"===t.conversationType){const e=qo.peek(t.conversationId);return Zo.prepareConversation(Ua(t,{title:e?.displayName??t.conversationId,...void 0===e?.avatarUrl?{}:{avatar:e.avatarUrl}})),t}if(void 0===Fo)throw Ka({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const e=Zo.isMembershipTerminated(t),r=await Fo.getProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===r||r.id!==t.conversationId)throw Ka({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});const o="active"===r.channelState||"muted"===r.channelState,n="muted"===r.channelState&&!0===r.accessSnapshot?.allMembersMuted&&"owner"!==r.role&&"admin"!==r.role;if(!o||n)throw Ka({code:"IM_SDK_CHANNEL_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({channelState:r.channelState,role:r.role,hiddenByAllMemberMute:n})});return Zo.prepareConversation(Ua(t,{title:r.name,...void 0===r.avatar?{}:{avatar:r.avatar},...void 0===r.muted?{}:{muted:r.muted},channelState:r.channelState,channelPermissions:r.permissions,...void 0===r.accessSnapshot?{}:{channelAccessSnapshot:r.accessSnapshot},...r.permissions.sendMessages?{}:{sendDisabledReason:`channel_${r.channelState}`}}),{membershipConfirmed:e}),e&&(s(),Es({conversationType:"channel",conversationId:t.conversationId})),t}catch(e){if(function(e){return e instanceof Error&&"ImConversationOpenError"===e.name&&"string"==typeof e.code}(e))throw e;const r=function(e){if("object"==typeof e&&null!==e&&"string"==typeof e.code&&"string"==typeof e.category&&"boolean"==typeof e.retryable){const t=e;return{code:t.code,category:t.category,retryable:t.retryable}}return e instanceof de?{code:"IM_SDK_CONVERSATION_PROFILE_READ_FAILED",category:"network",retryable:!0}:e instanceof pe||e instanceof Error&&"DirectoryMappingError"===e.name?{code:"IM_SDK_CONVERSATION_PROFILE_INVALID",category:"contract",retryable:!1}:{code:"IM_SDK_CONVERSATION_OPEN_PREREQUISITE_FAILED",category:"state",retryable:!1}}(e);throw Ka({...r,conversation:t,cause:e})}finally{n(),r()}},getContext:e=>Zo.getConversationContext(e)};function Ga(e,t,r=!0){if(!Cr)throw e.close(),new Error("IM SDK 账号运行时已释放,不能打开会话");return t?.aborted&&(e.close(),Rt(t)),function(e,t=!0){const r=new AbortController,o={...e,resumeMedia(){t&&Cr&&!r.signal.aborted&&"authenticated"===la.state&&"robot"!==e.ref.conversationType&&la.resumePausedMediaUploads(e.ref,r.signal).catch(()=>{Cr&&!r.signal.aborted&&vr.emit({type:"error",error:{scope:"unknown",message:"当前会话上传恢复失败,请重新选择文件"}})})},close(){r.abort(),e.close(),oo.delete(o)}};return b(o,e),oo.add(o),t&&o.resumeMedia(),o}(e,r)}async function Ha(e,t={},r){if(!Cr)throw new Error("IM SDK 账号运行时已释放,不能打开会话");const o=po?.enterForeground(e),n=Io.enterForeground(),s=To.begin();try{const o={beginReceiving:To.begin,domainState:Zo,invalidateHistory:Lo,emitter:vr,drafts:dn.api,sendText:ma.operations.sendText,sendContact:ma.operations.sendContact,sendImage:ma.operations.sendImage,sendVideo:ma.operations.sendVideo,sendVoice:ma.operations.sendVoice,sendFile:ma.operations.sendFile,sendGif:ma.operations.sendGif,sendMediaAlbum:ma.operations.sendMediaAlbum,sendExpression:ma.operations.sendExpression,sendGame:ma.operations.sendGame,sendMiniProgram:ma.operations.sendMiniProgram,sendTransfer:ma.operations.sendTransfer,sendGift:ma.operations.sendGift,sendLiveRoom:ma.operations.sendLiveRoom,replaceVideo:ma.operations.replaceInterruptedVideo,replaceFile:ma.operations.replaceInterruptedFile,forwardMessages:ma.operations.forwardMessages,recallMessage:ma.operations.recallMessage,editMessage:ma.operations.editMessage,setReaction:({conversation:e,parentMessageId:t,emoji:r,action:o})=>{if("robot"===e.conversationType||"customerService"===e.conversationType)return Promise.resolve({ok:!1,reason:"restricted"});const n={conversationType:e.conversationType,conversationId:e.conversationId};return"toggle"===o?Ms.toggle({conversation:n,parentMessageId:t,emoji:r}):Ms.set({conversation:n,parentMessageId:t,emoji:r,action:"add"===o?0:1})},markRead:ma.operations.markRead,markConversationRead:ma.operations.markConversationRead,markVisibleMessages:ma.operations.markVisibleMessages,markDirectMediaConsumed:ma.operations.markDirectMediaConsumed,prepareMediaPreview:Cn,getSelfId:()=>Ir,isOutboxOwned:e=>la.getPendingOutbox().some(t=>t.id===e),hasOutboxForConversation:e=>la.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId)};switch(e.conversationType){case"direct":{const n={conversationType:"direct",conversationId:e.conversationId},s=await C(n,{...o,getRelationship:an.getRelationship,shouldCheckRelationship:()=>"authenticated"===la.state,appendContactRequiredTextFailure:e=>Zo.appendDirectContactRequiredTextFailure({conversationId:e.conversationId,senderId:Ir,text:e.text,...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}}),setMuted:(e,t)=>Ba.setMuted(e,t),fetchMessagesByIdBatch:e=>(async(e,t)=>{const r=Ia("direct",e,t);try{const o=Ir,n=Ao(e),s=()=>{if(!Cr||Ir!==o||n!==Ao(e))throw new DOMException("DIRECT 消息查询所属账号或历史已失效","AbortError")};s();const{userId:a}=await ys();if(s(),a!==o)throw new DOMException("DIRECT 消息查询的登录账号已改变","AbortError");const i=await fa(a,{priority:"foreground"});s();const c=[],d=[],p=await N(t,async t=>{s();const r=await Dt({http:Er,userId:a,clientType:hr,messageIds:t,asyncDecrypt:wa("foreground",s),decryptDeps:{...i,onDecryptRecovery:e=>d.push(e)},onPlaintextFallback:t=>wr.record("warn","sdk","crypto","direct-quoted-plaintext-fallback",()=>({conversation:e,data:{...t,endpoint:"/offline/v1/chat/msg/by_id",wireEncrypt:1,reason:"mislabeled-plaintext"}})),onReaction:e=>c.push(e)});if(s(),200!==r.code)throw Object.assign(new Error("DIRECT 按 ID 查询业务失败"),{code:r.code});return r});s();const l=r.messages(p.messages).filter(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId);for(const e of l)s(),vs([e]),s();for(const t of c)s(),t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&is(t),s();for(const t of d)s(),r.acceptsRecovery(t)&&t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&Kr(t),s();const u=l.map(t=>{const r=Zo.getConversationMessage(e,t.id);if(void 0===r)throw new Error("DIRECT 按 ID 查询在领域合并后缺少消息");return r}),m=new Set(u.map(e=>e.id)),v=new Set(p.missingMessageIds);for(const e of p.messages)m.has(e.id)||v.add(e.id);return{messages:u,missingMessageIds:[...v]}}finally{r.stop()}})(n,e)},t),a=Ga(s,t.signal,"read"!==r);return as(n),a}case"group":{const n={conversationType:"group",conversationId:e.conversationId},s=Ga(await w(n,{...o,getSendPermissionError:e=>{const t=Zo.getConversationContext(n),r="group"===t?.type?t.groupState:"unknown";if(void 0!==r&&"active"!==r)return _({code:"IM_SDK_GROUP_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({groupState:r})})},setMuted:(e,t)=>Ba.setMuted(e,t),fetchMessagesByIdBatch:e=>gs(n.conversationId,e)},t),t.signal,"read"!==r);return as(n),s}case"channel":{const n={conversationType:"channel",conversationId:e.conversationId},s=Ga(await I(n,{...o,loadEntryUnreadPage:Na(n),getSelfId:()=>Ir,deleteMessageForEveryone:la.deleteChannelMessageForEveryone,reconcilePage:oa.reconcilePage,getSendPermissionError:e=>{const t=Zo.getConversationContext(n),r="channel"===t?.type&&void 0!==t.channelState?t.channelState:"unknown_restricted",o=dt({channelState:r,nowMs:Date.now(),..."channel"!==t?.type||void 0===t.channelAccessSnapshot?{}:{snapshot:t.channelAccessSnapshot},..."channel"!==t?.type||void 0===t.channelPermissions?{}:{permissions:t.channelPermissions}});if("active"!==o.channelState||!o.permissions.sendMessages)return _({code:"IM_SDK_CHANNEL_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({channelState:o.channelState,...void 0===o.muteReason?{}:{muteReason:o.muteReason}})})},setMuted:(e,t)=>Ba.setMuted(e,t),fetchMessagesByIdBatch:e=>hs(n.conversationId,e)},t),t.signal,"read"!==r);return as(n),s}case"customerService":{const n={conversationType:"customerService",conversationId:e.conversationId};return Ga(await f(n,{...o,setMuted:async()=>{throw new Error("客服会话不支持免打扰设置")}},t),t.signal,"read"!==r)}case"robot":{const n={conversationType:"robot",conversationId:e.conversationId};return Ga(await h(n,{...o,setMuted:(e,t)=>Ba.setMuted(e,t)},t),t.signal,"read"!==r)}default:throw new Error(`openConversation:${e.conversationType} 产品 handler 未注册`)}}finally{s(),o?.(),n()}}return{advancedMessageDiagnostics:{sendDirectText:async e=>{await ma.operations.sendText({conversationId:e.peerId,conversationType:"direct",text:e.text,encrypted:e.encrypted})}},openConversation:Ha,localData:on,directory:Vo.search,customerService:tn,robots:qo.api,search:pn.api,applications:cn.api,expressions:zo.api,sessionFavorites:nn.api,outbox:ua.api,drafts:dn.api,connection:u({operations:{prepare:ja,connect:function(e){if(yo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if(!Cr||yo)return Promise.reject(new Error("IM 连接已停止,请刷新页面后重试"));if(mo=!0,"authenticated"===la.state)return Promise.resolve();if(null!==fo)return fo;lo=e?.initialSync??"auto",uo=!1;const t=Date.now();wr.record("info","sdk","connection","connect-start",()=>({data:{initialSync:lo}}));const r=vo;return fo=(async()=>{await ja(),Cr&&mo&&r===vo&&(ga.start(),await la.connect())})().then(()=>wr.record("info","sdk","connection","connect-complete",()=>({durationMs:Date.now()-t}))).catch(e=>{throw wr.record("error","sdk","connection","connect-failed",()=>({durationMs:Date.now()-t,error:{message:"IM connect 失败",data:e}})),e}).finally(()=>{fo=null}),fo},disconnect:Oa,subscribe:function(e){return vr.subscribe(e)},getSnapshot:function(){return{connectionState:la.state,pendingOutbox:la.getPendingOutbox()}},getLifecycle:function(){return{sessionState:eo,connectionState:la.state,...""!==Ir?{userId:Ir}:{},prepared:"ready"===eo,connectionDesired:mo,authenticated:"authenticated"===la.state,receiving:To.receiving,syncing:Eo.receiving}}},getState:()=>la.state}),conversations:Ba,settings:$r.api,push:ca.api,activity:da.api,contact:an,group:d({directory:Vo.groups,...void 0===Ko?{}:{profile:{getGroupProfile:async(e,t)=>{const r=Zo.beginConversationProfileRead({conversationType:"group",conversationId:e},t);try{const o=await Ko.getGroupProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}},...void 0===Ko.getGroupMemberNames?{}:{getGroupMemberNames:Ko.getGroupMemberNames.bind(Ko)},...void 0===Ko.listGroupMembers?{}:{listGroupMembers:Ko.listGroupMembers.bind(Ko)},...void 0===Ko.peekGroupMembers?{}:{peekGroupMembers:Ko.peekGroupMembers.bind(Ko)},...void 0===Ko.peekGroupProfile?{}:{peekGroupProfile:Ko.peekGroupProfile.bind(Ko)},...void 0===Ko.peekGroupMemberNames?{}:{peekGroupMemberNames:Ko.peekGroupMemberNames.bind(Ko)}}},...void 0===Tr?{}:{coreClient:Tr},...void 0===fn?{}:{avatarTransfer:fn},domainState:{...Rs,prepareConversation:e=>Zo.prepareConversation(e)},emitter:vr,pinned:ea.operations}),channel:t({directory:Vo.channels,...void 0===Fo?{}:{channelProfile:{listProfiles:Fo.listProfiles.bind(Fo),getProfile:async(e,t)=>{const r=Zo.beginConversationProfileRead({conversationType:"channel",conversationId:e},t);try{const o=await Fo.getProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}}}},...void 0===Uo?{}:{channelMembers:Uo},...void 0===Bo?{}:{channelMentionMembers:Bo},mentionCandidates:Go.api,applications:ra.applications,pinned:ta.operations,...void 0===Tr?{}:{coreClient:Tr},...void 0===fn?{}:{avatarTransfer:fn},crypto:yn,domainState:{prepareConversation:e=>Zo.prepareConversation(e),setChannelRestriction:Zo.setChannelRestriction,removeConversationForMembershipTermination:Rs.removeConversationForMembershipTermination,updateConversationProfile:Zo.updateConversationProfile,refreshConversationProfile:Zo.refreshConversationProfile},emitter:vr,...void 0===Mn?{}:{cacheCreatedSecretKey:(e,t)=>Mn.primeChannelKey(e,t)},getSelfUserId:async()=>""!==Ir?Ir:(await fr.getLoginContext())?.userId??""}),media:va.api,calls:v(Bs),groupCalls:P(Gs),teardown:_a}}export{mr as createSessionRuntime};