k2-im 0.1.58 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. package/README.md +3 -1
  2. package/dist/browser.js +1 -1
  3. package/dist/chat-kit-pinia.d.ts +225 -170
  4. package/dist/chat-kit-pinia.js +1 -1
  5. package/dist/chat-kit-vue.d.ts +64 -44
  6. package/dist/chat-kit-vue.js +1 -1
  7. package/dist/chat-kit.d.ts +226 -171
  8. package/dist/chat-kit.js +1 -1
  9. package/dist/crypto.worker.js +17 -25
  10. package/dist/i18n.d.ts +61 -41
  11. package/dist/i18n.js +1 -1
  12. package/dist/index.d.ts +241 -186
  13. package/dist/index.js +1 -1
  14. package/dist/modules/api-protocol-client/src/bi-feedback.js +1 -0
  15. package/dist/modules/api-protocol-client/src/browser.js +1 -0
  16. package/dist/modules/api-protocol-client/src/client.js +1 -0
  17. package/dist/modules/api-protocol-client/src/config.js +1 -0
  18. package/dist/modules/api-protocol-client/src/constants.js +1 -0
  19. package/dist/modules/api-protocol-client/src/json.js +1 -0
  20. package/dist/modules/api-protocol-client/src/nonce.js +1 -0
  21. package/dist/modules/api-protocol-client/src/transports/axios.js +1 -0
  22. package/dist/modules/api-protocol-client/src/utils.js +1 -0
  23. package/dist/modules/crypto/browser.js +1 -0
  24. package/dist/modules/crypto/driver.js +1 -0
  25. package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -0
  26. package/dist/modules/im-browser/src/crypto/channel-key-service.js +1 -0
  27. package/dist/modules/im-browser/src/crypto/collect-tea.js +1 -0
  28. package/dist/modules/im-browser/src/crypto/crypto-task-executor.js +1 -0
  29. package/dist/modules/im-browser/src/crypto/crypto-worker-factory.js +1 -0
  30. package/dist/modules/im-browser/src/crypto/crypto-worker-protocol.js +1 -0
  31. package/dist/modules/im-browser/src/crypto/encrypt-key-service.js +1 -0
  32. package/dist/modules/im-browser/src/crypto/group-key-service.js +1 -0
  33. package/dist/modules/im-browser/src/crypto/peer-public-key-service.js +1 -0
  34. package/dist/modules/im-browser/src/crypto/rsa-private-key.js +1 -0
  35. package/dist/modules/im-browser/src/crypto/rsa-tea-crypto-adapter.js +1 -0
  36. package/dist/modules/im-browser/src/crypto/stale-key-refresh.js +1 -0
  37. package/dist/modules/im-browser/src/crypto/tea.js +1 -0
  38. package/dist/modules/im-browser/src/crypto/wait-for-key-signal.js +1 -0
  39. package/dist/modules/im-browser/src/http/application-http-adapters.js +1 -0
  40. package/dist/modules/im-browser/src/http/channel-http-adapter.js +1 -0
  41. package/dist/modules/im-browser/src/http/channel-join-application-http-adapter.js +1 -0
  42. package/dist/modules/im-browser/src/http/channel-member-http-adapter.js +1 -0
  43. package/dist/modules/im-browser/src/http/channel-mention-member-http-adapter.js +1 -0
  44. package/dist/modules/im-browser/src/http/cm-http-adapter.js +1 -0
  45. package/dist/modules/im-browser/src/http/directory-http-adapter.js +1 -0
  46. package/dist/modules/im-browser/src/http/expression-http-adapter.js +1 -0
  47. package/dist/modules/im-browser/src/http/lazy-api-protocol-client.js +1 -0
  48. package/dist/modules/im-browser/src/http/profile-http-adapter.js +1 -0
  49. package/dist/modules/im-browser/src/http/requests/applications.js +1 -0
  50. package/dist/modules/im-browser/src/http/requests/bind-robot-conversation.js +1 -0
  51. package/dist/modules/im-browser/src/http/requests/board-pinned-message-validation.js +1 -0
  52. package/dist/modules/im-browser/src/http/requests/channel-join-applications.js +1 -0
  53. package/dist/modules/im-browser/src/http/requests/channel-management.js +1 -0
  54. package/dist/modules/im-browser/src/http/requests/channel-members.js +1 -0
  55. package/dist/modules/im-browser/src/http/requests/channel-mention-members.js +1 -0
  56. package/dist/modules/im-browser/src/http/requests/channel-message-context.js +1 -0
  57. package/dist/modules/im-browser/src/http/requests/channel-mini-program-rel.js +1 -0
  58. package/dist/modules/im-browser/src/http/requests/channel-profile.js +1 -0
  59. package/dist/modules/im-browser/src/http/requests/channel-read-index.js +1 -0
  60. package/dist/modules/im-browser/src/http/requests/contact-blocklist.js +1 -0
  61. package/dist/modules/im-browser/src/http/requests/contact-friendship.js +1 -0
  62. package/dist/modules/im-browser/src/http/requests/contact-report.js +1 -0
  63. package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -0
  64. package/dist/modules/im-browser/src/http/requests/create-channel.js +1 -0
  65. package/dist/modules/im-browser/src/http/requests/create-face-to-face-group.js +1 -0
  66. package/dist/modules/im-browser/src/http/requests/create-group.js +1 -0
  67. package/dist/modules/im-browser/src/http/requests/customer-service-profile.js +1 -0
  68. package/dist/modules/im-browser/src/http/requests/get-board-pinned-message.js +1 -0
  69. package/dist/modules/im-browser/src/http/requests/get-channel-board-pinned-message.js +1 -0
  70. package/dist/modules/im-browser/src/http/requests/get-channel-secret-key.js +1 -0
  71. package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -0
  72. package/dist/modules/im-browser/src/http/requests/get-group-encrypt-info.js +1 -0
  73. package/dist/modules/im-browser/src/http/requests/get-group-info.js +1 -0
  74. package/dist/modules/im-browser/src/http/requests/get-group-member-list.js +1 -0
  75. package/dist/modules/im-browser/src/http/requests/get-user-encrypt-info.js +1 -0
  76. package/dist/modules/im-browser/src/http/requests/get-user-info-friend.js +1 -0
  77. package/dist/modules/im-browser/src/http/requests/get-user-info-other.js +1 -0
  78. package/dist/modules/im-browser/src/http/requests/group-management.js +1 -0
  79. package/dist/modules/im-browser/src/http/requests/mark-group-read-all.js +1 -0
  80. package/dist/modules/im-browser/src/http/requests/membership-join.js +1 -0
  81. package/dist/modules/im-browser/src/http/requests/pin-board-message.js +1 -0
  82. package/dist/modules/im-browser/src/http/requests/pin-channel-board-message.js +1 -0
  83. package/dist/modules/im-browser/src/http/requests/pull-messages-by-id.js +1 -0
  84. package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -0
  85. package/dist/modules/im-browser/src/http/requests/pull-offline-chat.js +1 -0
  86. package/dist/modules/im-browser/src/http/requests/pull-offline-group.js +1 -0
  87. package/dist/modules/im-browser/src/http/requests/pull-offline-signal.js +1 -0
  88. package/dist/modules/im-browser/src/http/requests/robot-menu-reply.js +1 -0
  89. package/dist/modules/im-browser/src/http/requests/robot-profile.js +1 -0
  90. package/dist/modules/im-browser/src/http/requests/search-robots.js +1 -0
  91. package/dist/modules/im-browser/src/http/requests/set-conversation-undisturb.js +1 -0
  92. package/dist/modules/im-browser/src/http/requests/set-friend-remark.js +1 -0
  93. package/dist/modules/im-browser/src/http/requests/set-group-nickname.js +1 -0
  94. package/dist/modules/im-browser/src/http/requests/unpin-board-message.js +1 -0
  95. package/dist/modules/im-browser/src/http/requests/unpin-channel-board-message.js +1 -0
  96. package/dist/modules/im-browser/src/http/requests/update-group-info.js +1 -0
  97. package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -0
  98. package/dist/modules/im-browser/src/media/file-md5.js +1 -0
  99. package/dist/modules/im-browser/src/media/image-clipboard.js +1 -0
  100. package/dist/modules/im-browser/src/media/image-header-dimensions.js +1 -0
  101. package/dist/modules/im-browser/src/media/media-downloader.js +1 -0
  102. package/dist/modules/im-browser/src/media/media-preview-adapter.js +1 -0
  103. package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -0
  104. package/dist/modules/im-browser/src/media/media-request-limiter.js +1 -0
  105. package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -0
  106. package/dist/modules/im-browser/src/media/media-transfer-errors.js +1 -0
  107. package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -0
  108. package/dist/modules/im-browser/src/media/media-upload-credentials.js +1 -0
  109. package/dist/modules/im-browser/src/media/media-upload-recovery-codec.js +1 -0
  110. package/dist/modules/im-browser/src/media/media-upload-recovery-store.js +1 -0
  111. package/dist/modules/im-browser/src/media/media-upload-source-fingerprint.js +1 -0
  112. package/dist/modules/im-browser/src/media/s3-multipart-uploader.js +1 -0
  113. package/dist/modules/im-browser/src/media/xhr-upload-idle-timeout.js +1 -0
  114. package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -0
  115. package/dist/modules/im-browser/src/network/network-monitor.js +1 -0
  116. package/dist/modules/im-browser/src/scheduling/yield-to-browser.js +1 -0
  117. package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -0
  118. package/dist/modules/im-browser/src/transport/ws-transport.js +1 -0
  119. package/dist/modules/im-browser/src/voice/voice-amplitude.js +1 -0
  120. package/dist/modules/im-browser/src/voice/voice-capabilities.js +1 -0
  121. package/dist/modules/im-browser/src/voice/voice-codec.js +1 -0
  122. package/dist/modules/im-browser/src/voice/voice-errors.js +1 -0
  123. package/dist/modules/im-browser/src/voice/voice-playback.js +1 -0
  124. package/dist/modules/im-browser/src/voice/voice-player.js +1 -0
  125. package/dist/modules/im-browser/src/voice/voice-recorder.js +1 -0
  126. package/dist/modules/im-chat-kit/src/i18n/use-im-text.js +1 -0
  127. package/dist/modules/im-chat-kit/src/pinia/applications.store.js +1 -0
  128. package/dist/modules/im-chat-kit/src/pinia/capabilities.store.js +1 -0
  129. package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -0
  130. package/dist/modules/im-chat-kit/src/pinia/context.js +1 -0
  131. package/dist/modules/im-chat-kit/src/pinia/conversation-activation.js +1 -0
  132. package/dist/modules/im-chat-kit/src/pinia/conversation-deletion.js +1 -0
  133. package/dist/modules/im-chat-kit/src/pinia/conversation-list.store.js +1 -0
  134. package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -0
  135. package/dist/modules/im-chat-kit/src/pinia/history-return-after-send.js +1 -0
  136. package/dist/modules/im-chat-kit/src/pinia/media-transfer-estimate.js +1 -0
  137. package/dist/modules/im-chat-kit/src/pinia/media.store.js +1 -0
  138. package/dist/modules/im-chat-kit/src/pinia/message-operations.store.js +1 -0
  139. package/dist/modules/im-chat-kit/src/pinia/profile-directory.store.js +1 -0
  140. package/dist/modules/im-chat-kit/src/pinia/quoted-message.store.js +1 -0
  141. package/dist/modules/im-chat-kit/src/pinia/reaction.store.js +1 -0
  142. package/dist/modules/im-chat-kit/src/pinia/search-senders.js +1 -0
  143. package/dist/modules/im-chat-kit/src/pinia/search.store.js +1 -0
  144. package/dist/modules/im-chat-kit/src/pinia/session-favorites.store.js +1 -0
  145. package/dist/modules/im-chat-kit/src/pinia/session.store.js +1 -0
  146. package/dist/modules/im-chat-kit/src/pinia/thread-paging.store.js +1 -0
  147. package/dist/modules/im-chat-kit/src/pinia/thread-return-to-latest.js +1 -0
  148. package/dist/modules/im-chat-kit/src/pinia/thread.store.js +1 -0
  149. package/dist/modules/im-chat-kit/src/presentation/channel-mini-program-open.js +1 -0
  150. package/dist/modules/im-chat-kit/src/presentation/channel-mini-program-rels.js +1 -0
  151. package/dist/modules/im-chat-kit/src/presentation/conversation-list.js +1 -0
  152. package/dist/modules/im-chat-kit/src/presentation/conversation-unread.js +1 -0
  153. package/dist/modules/im-chat-kit/src/presentation/delayed-loading-indicator.js +1 -0
  154. package/dist/modules/im-chat-kit/src/presentation/media-source-priority.js +1 -0
  155. package/dist/modules/im-chat-kit/src/presentation/message-notification.js +1 -0
  156. package/dist/modules/im-chat-kit/src/presentation/message-search.js +1 -0
  157. package/dist/modules/im-chat-kit/src/presentation/mini-program-game-preview.js +1 -0
  158. package/dist/modules/im-chat-kit/src/presentation/mini-program-open-url.js +1 -0
  159. package/dist/modules/im-chat-kit/src/runtime/chat-runtime.js +1 -0
  160. package/dist/modules/im-chat-kit/src/runtime/conversation-prefetch-controller.js +1 -0
  161. package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -0
  162. package/dist/modules/im-chat-kit/src/runtime/runtime-operation.js +1 -0
  163. package/dist/modules/im-chat-kit/src/services/capabilities.js +1 -0
  164. package/dist/modules/im-chat-kit/src/services/channel-member-management.service.js +1 -0
  165. package/dist/modules/im-chat-kit/src/services/channel-profile-management.service.js +1 -0
  166. package/dist/modules/im-chat-kit/src/services/channel-send-restriction.js +1 -0
  167. package/dist/modules/im-chat-kit/src/services/direct-contact-management.service.js +1 -0
  168. package/dist/modules/im-chat-kit/src/services/forward.service.js +1 -0
  169. package/dist/modules/im-chat-kit/src/services/group-member-management.service.js +1 -0
  170. package/dist/modules/im-chat-kit/src/services/group-profile-management.service.js +1 -0
  171. package/dist/modules/im-chat-kit/src/services/image-copy.service.js +1 -0
  172. package/dist/modules/im-chat-kit/src/services/media-file-classification.js +1 -0
  173. package/dist/modules/im-chat-kit/src/services/media.service.js +1 -0
  174. package/dist/modules/im-chat-kit/src/services/message.service.js +1 -0
  175. package/dist/modules/im-chat-kit/src/services/pinned-message-rules.js +1 -0
  176. package/dist/modules/im-chat-kit/src/services/pinned-message.service.js +1 -0
  177. package/dist/modules/im-chat-kit/src/services/profile-access.service.js +1 -0
  178. package/dist/modules/im-chat-kit/src/services/profile-directory.service.js +1 -0
  179. package/dist/modules/im-chat-kit/src/services/profile-display.js +1 -0
  180. package/dist/modules/im-chat-kit/src/services/profile.service.js +1 -0
  181. package/dist/modules/im-chat-kit/src/services/read.service.js +1 -0
  182. package/dist/modules/im-chat-kit/src/services/robot-sender-profile.js +1 -0
  183. package/dist/modules/im-chat-kit/src/services/search.service.js +1 -0
  184. package/dist/modules/im-chat-kit/src/services/send.service.js +1 -0
  185. package/dist/modules/im-chat-kit/src/thread/active-date.js +1 -0
  186. package/dist/modules/im-chat-kit/src/thread/create-thread-items.js +1 -0
  187. package/dist/modules/im-chat-kit/src/thread/message-locate-result.js +1 -0
  188. package/dist/modules/im-chat-kit/src/thread/new-message-badge.js +1 -0
  189. package/dist/modules/im-chat-kit/src/thread/resolve-message-body-kind.js +1 -0
  190. package/dist/modules/im-chat-kit/src/thread/resolve-quoted-message-presentation.js +1 -0
  191. package/dist/modules/im-chat-kit/src/thread/viewport-rules.js +1 -0
  192. package/dist/modules/im-chat-kit/src/utils/emoji/emoji-legacy-catalog.json.js +1 -0
  193. package/dist/modules/im-chat-kit/src/utils/emoji/index.js +1 -0
  194. package/dist/modules/im-chat-kit/src/utils/emoji/recent.js +1 -0
  195. package/dist/modules/im-chat-kit/src/utils/emoji/unicode-emoji-catalog.json.js +1 -0
  196. package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -0
  197. package/dist/modules/im-chat-kit/src/utils/highlight.js +1 -0
  198. package/dist/modules/im-chat-kit/src/utils/link.js +1 -0
  199. package/dist/modules/im-chat-kit/src/utils/media-batch.js +1 -0
  200. package/dist/modules/im-chat-kit/src/utils/media-dimensions.js +1 -0
  201. package/dist/modules/im-chat-kit/src/utils/media-format.js +1 -0
  202. package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -0
  203. package/dist/modules/im-chat-kit/src/utils/time-display.js +1 -0
  204. package/dist/modules/im-chat-kit/src/utils/waveform.js +1 -0
  205. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadBodySwitch.js +1 -0
  206. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadItems.js +1 -0
  207. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadSurface.js +1 -0
  208. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadViewport.js +1 -0
  209. package/dist/modules/im-chat-kit/src/vue/thread/message-renderer-registry.js +1 -0
  210. package/dist/modules/im-chat-kit/src/vue/thread/thread-idle-task.js +1 -0
  211. package/dist/modules/im-chat-kit/src/vue/thread/thread-layout-measurements.js +1 -0
  212. package/dist/modules/im-chat-kit/src/vue/thread/thread-read-actions-context.js +1 -0
  213. package/dist/modules/im-chat-kit/src/vue/thread/thread-surface-context.js +1 -0
  214. package/dist/modules/im-chat-kit/src/vue/thread/thread-viewport-context.js +1 -0
  215. package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-target-group.js +1 -0
  216. package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-targets.js +1 -0
  217. package/dist/modules/im-chat-kit/src/vue/thread/use-im-thread-layout-measurement.js +1 -0
  218. package/dist/modules/im-core/src/abort.js +1 -0
  219. package/dist/modules/im-core/src/cache-namespace.js +1 -0
  220. package/dist/modules/im-core/src/connection/backoff.js +1 -0
  221. package/dist/modules/im-core/src/connection/connection-manager.js +1 -0
  222. package/dist/modules/im-core/src/connection/heartbeat-manager.js +1 -0
  223. package/dist/modules/im-core/src/conversation-identity.js +1 -0
  224. package/dist/modules/im-core/src/diagnostics.js +1 -0
  225. package/dist/modules/im-core/src/event-emitter.js +1 -0
  226. package/dist/modules/im-core/src/login/login-handler.js +1 -0
  227. package/dist/modules/im-core/src/mapping/bot-sender.js +1 -0
  228. package/dist/modules/im-core/src/mapping/call-record-body.js +1 -0
  229. package/dist/modules/im-core/src/mapping/channel-message-mapper.js +1 -0
  230. package/dist/modules/im-core/src/mapping/channel-notify-mapper.js +1 -0
  231. package/dist/modules/im-core/src/mapping/channel-offline-mapper.js +1 -0
  232. package/dist/modules/im-core/src/mapping/channel-pinned-message-mapper.js +1 -0
  233. package/dist/modules/im-core/src/mapping/channel-read-position.js +1 -0
  234. package/dist/modules/im-core/src/mapping/contact-body.js +1 -0
  235. package/dist/modules/im-core/src/mapping/content-body.js +1 -0
  236. package/dist/modules/im-core/src/mapping/conversation.js +1 -0
  237. package/dist/modules/im-core/src/mapping/crypto-batch-preparation.js +1 -0
  238. package/dist/modules/im-core/src/mapping/customer-service-body.js +1 -0
  239. package/dist/modules/im-core/src/mapping/customer-service-message-mapper.js +1 -0
  240. package/dist/modules/im-core/src/mapping/decrypt-recovery.js +1 -0
  241. package/dist/modules/im-core/src/mapping/file-body.js +1 -0
  242. package/dist/modules/im-core/src/mapping/files-album-body.js +1 -0
  243. package/dist/modules/im-core/src/mapping/game-body.js +1 -0
  244. package/dist/modules/im-core/src/mapping/gift-body.js +1 -0
  245. package/dist/modules/im-core/src/mapping/group-message-mapper.js +1 -0
  246. package/dist/modules/im-core/src/mapping/group-notify-mapper.js +1 -0
  247. package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -0
  248. package/dist/modules/im-core/src/mapping/image-body.js +1 -0
  249. package/dist/modules/im-core/src/mapping/live-room-body.js +1 -0
  250. package/dist/modules/im-core/src/mapping/media-album-body.js +1 -0
  251. package/dist/modules/im-core/src/mapping/merge.js +1 -0
  252. package/dist/modules/im-core/src/mapping/mes-chat-mapper.js +1 -0
  253. package/dist/modules/im-core/src/mapping/message-id.js +1 -0
  254. package/dist/modules/im-core/src/mapping/message-mapper.js +1 -0
  255. package/dist/modules/im-core/src/mapping/messages-by-id.js +1 -0
  256. package/dist/modules/im-core/src/mapping/mini-program-body.js +1 -0
  257. package/dist/modules/im-core/src/mapping/offline-mapper.js +1 -0
  258. package/dist/modules/im-core/src/mapping/pinned-message-mapper.js +1 -0
  259. package/dist/modules/im-core/src/mapping/profile-mapper.js +1 -0
  260. package/dist/modules/im-core/src/mapping/reaction-mapper.js +1 -0
  261. package/dist/modules/im-core/src/mapping/recall-mapper.js +1 -0
  262. package/dist/modules/im-core/src/mapping/red-packet-body.js +1 -0
  263. package/dist/modules/im-core/src/mapping/robot-body.js +1 -0
  264. package/dist/modules/im-core/src/mapping/robot-message-mapper.js +1 -0
  265. package/dist/modules/im-core/src/mapping/search-text.js +1 -0
  266. package/dist/modules/im-core/src/mapping/session-mapper.js +1 -0
  267. package/dist/modules/im-core/src/mapping/signal-offline-mapper.js +1 -0
  268. package/dist/modules/im-core/src/mapping/sort.js +1 -0
  269. package/dist/modules/im-core/src/mapping/sticker-body.js +1 -0
  270. package/dist/modules/im-core/src/mapping/stored-message.js +1 -0
  271. package/dist/modules/im-core/src/mapping/system-event-timeline-policy.js +1 -0
  272. package/dist/modules/im-core/src/mapping/text-segments.js +1 -0
  273. package/dist/modules/im-core/src/mapping/transfer-body.js +1 -0
  274. package/dist/modules/im-core/src/mapping/transfer-status.js +1 -0
  275. package/dist/modules/im-core/src/mapping/unread-divider.js +1 -0
  276. package/dist/modules/im-core/src/mapping/video-body.js +1 -0
  277. package/dist/modules/im-core/src/mapping/voice-body.js +1 -0
  278. package/dist/modules/im-core/src/message-flow/call/direct-call-manager.js +1 -0
  279. package/dist/modules/im-core/src/message-flow/call/direct-call-record.js +1 -0
  280. package/dist/modules/im-core/src/message-flow/call/direct-p2p-call.js +1 -0
  281. package/dist/modules/im-core/src/message-flow/call/group-call-manager.js +1 -0
  282. package/dist/modules/im-core/src/message-flow/call/group-call-record.js +1 -0
  283. package/dist/modules/im-core/src/message-flow/conversation-support.js +1 -0
  284. package/dist/modules/im-core/src/message-flow/edit/edit-frame.js +1 -0
  285. package/dist/modules/im-core/src/message-flow/edit/edit-manager.js +1 -0
  286. package/dist/modules/im-core/src/message-flow/edit/edit-receive-handlers.js +1 -0
  287. package/dist/modules/im-core/src/message-flow/edit/edit-strategy.js +1 -0
  288. package/dist/modules/im-core/src/message-flow/expression/expression-message.js +1 -0
  289. package/dist/modules/im-core/src/message-flow/forward/can-transmit.js +1 -0
  290. package/dist/modules/im-core/src/message-flow/forward/forward-content-spec.js +1 -0
  291. package/dist/modules/im-core/src/message-flow/forward/forward-messages.js +1 -0
  292. package/dist/modules/im-core/src/message-flow/game/game-message.js +1 -0
  293. package/dist/modules/im-core/src/message-flow/gift/gift-message.js +1 -0
  294. package/dist/modules/im-core/src/message-flow/live-room/live-room-message.js +1 -0
  295. package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -0
  296. package/dist/modules/im-core/src/message-flow/mini-program/mini-program-message.js +1 -0
  297. package/dist/modules/im-core/src/message-flow/reaction/can-react.js +1 -0
  298. package/dist/modules/im-core/src/message-flow/reaction/reaction-manager.js +1 -0
  299. package/dist/modules/im-core/src/message-flow/reaction/reaction-receive-handlers.js +1 -0
  300. package/dist/modules/im-core/src/message-flow/read/channel-read-receive-handlers.js +1 -0
  301. package/dist/modules/im-core/src/message-flow/read/channel-read-strategy.js +1 -0
  302. package/dist/modules/im-core/src/message-flow/read/customer-service-read-strategy.js +1 -0
  303. package/dist/modules/im-core/src/message-flow/read/direct-read-sync.js +1 -0
  304. package/dist/modules/im-core/src/message-flow/read/group-read-strategy.js +1 -0
  305. package/dist/modules/im-core/src/message-flow/read/read-strategy.js +1 -0
  306. package/dist/modules/im-core/src/message-flow/read/robot-read-strategy.js +1 -0
  307. package/dist/modules/im-core/src/message-flow/recall/channel-message-deletion-manager.js +1 -0
  308. package/dist/modules/im-core/src/message-flow/recall/recall-frame.js +1 -0
  309. package/dist/modules/im-core/src/message-flow/recall/recall-manager.js +1 -0
  310. package/dist/modules/im-core/src/message-flow/recall/recall-receive-handlers.js +1 -0
  311. package/dist/modules/im-core/src/message-flow/recall/recall-strategy.js +1 -0
  312. package/dist/modules/im-core/src/message-flow/receive/channel-application-receive-handlers.js +1 -0
  313. package/dist/modules/im-core/src/message-flow/receive/channel-notify-receive-handlers.js +1 -0
  314. package/dist/modules/im-core/src/message-flow/receive/channel-receive-handlers.js +1 -0
  315. package/dist/modules/im-core/src/message-flow/receive/command-handler-registry.js +1 -0
  316. package/dist/modules/im-core/src/message-flow/receive/contact-application-answer-receive-handlers.js +1 -0
  317. package/dist/modules/im-core/src/message-flow/receive/contact-application-receive-handlers.js +1 -0
  318. package/dist/modules/im-core/src/message-flow/receive/direct-receive-handlers.js +1 -0
  319. package/dist/modules/im-core/src/message-flow/receive/friend-action-receive-handlers.js +1 -0
  320. package/dist/modules/im-core/src/message-flow/receive/group-event-receive-handlers.js +1 -0
  321. package/dist/modules/im-core/src/message-flow/receive/group-receive-handlers.js +1 -0
  322. package/dist/modules/im-core/src/message-flow/receive/mes-chat-receive-handlers.js +1 -0
  323. package/dist/modules/im-core/src/message-flow/receive/robot-receive-handlers.js +1 -0
  324. package/dist/modules/im-core/src/message-flow/receive/session-favorite-receive-handlers.js +1 -0
  325. package/dist/modules/im-core/src/message-flow/receive/wallet-notify-receive-handlers.js +1 -0
  326. package/dist/modules/im-core/src/message-flow/send/channel-outgoing-frame.js +1 -0
  327. package/dist/modules/im-core/src/message-flow/send/channel-send-strategy.js +1 -0
  328. package/dist/modules/im-core/src/message-flow/send/direct-outgoing-frame.js +1 -0
  329. package/dist/modules/im-core/src/message-flow/send/direct-send-strategy.js +1 -0
  330. package/dist/modules/im-core/src/message-flow/send/group-outgoing-frame.js +1 -0
  331. package/dist/modules/im-core/src/message-flow/send/group-send-strategy.js +1 -0
  332. package/dist/modules/im-core/src/message-flow/send/robot-outgoing-frame.js +1 -0
  333. package/dist/modules/im-core/src/message-flow/send/robot-send-strategy.js +1 -0
  334. package/dist/modules/im-core/src/message-flow/send/send-strategy-registry.js +1 -0
  335. package/dist/modules/im-core/src/message-flow/transfer/transfer-message.js +1 -0
  336. package/dist/modules/im-core/src/outbox/outbox-manager.js +1 -0
  337. package/dist/modules/im-core/src/packet-router.js +1 -0
  338. package/dist/modules/im-core/src/ports/crypto-port.js +1 -0
  339. package/dist/modules/im-core/src/ports/crypto-task-executor.js +1 -0
  340. package/dist/modules/im-core/src/ports/http-port.js +1 -0
  341. package/dist/modules/im-core/src/ports/media-asset-cache-port.js +1 -0
  342. package/dist/modules/im-core/src/push/push-registration.js +1 -0
  343. package/dist/modules/im-core/src/read/read-reporter.js +1 -0
  344. package/dist/modules/im-core/src/request-tracker.js +1 -0
  345. package/dist/modules/im-core/src/session-favorite-album.js +1 -0
  346. package/dist/modules/im-core/src/session-favorite-files.js +1 -0
  347. package/dist/modules/im-core/src/state/channel-permissions.js +1 -0
  348. package/dist/modules/im-core/src/state/channel-restriction-coordinator.js +1 -0
  349. package/dist/modules/im-core/src/state/domain-state.js +1 -0
  350. package/dist/modules/im-core/src/state/draft-store.js +1 -0
  351. package/dist/modules/im-core/src/state/group-restriction-coordinator.js +1 -0
  352. package/dist/modules/im-core/src/state/local-message-window-read-error.js +1 -0
  353. package/dist/modules/im-core/src/state/message-reactions.js +1 -0
  354. package/dist/modules/im-core/src/state/message-store.js +1 -0
  355. package/dist/modules/im-core/src/state/message-window-store.js +1 -0
  356. package/dist/modules/im-core/src/state/pinned-message-coordinator.js +1 -0
  357. package/dist/modules/im-core/src/state/pinned-message-store.js +1 -0
  358. package/dist/modules/im-core/src/state/read-store.js +1 -0
  359. package/dist/modules/im-core/src/state/session-sort.js +1 -0
  360. package/dist/modules/im-core/src/state/session-store.js +1 -0
  361. package/dist/modules/im-core/src/sync/channel-sync-checkpoint.js +1 -0
  362. package/dist/modules/im-core/src/sync/sync-manager.js +1 -0
  363. package/dist/modules/im-i18n/src/catalog/en-US.js +1 -0
  364. package/dist/modules/im-i18n/src/catalog/index.js +1 -0
  365. package/dist/modules/im-i18n/src/catalog/th-TH.js +1 -0
  366. package/dist/modules/im-i18n/src/catalog/vi-VN.js +1 -0
  367. package/dist/modules/im-i18n/src/catalog/zh-CN.js +1 -0
  368. package/dist/modules/im-i18n/src/catalog/zh-TW.js +1 -0
  369. package/dist/modules/im-i18n/src/create-im-i18n.js +1 -0
  370. package/dist/modules/im-i18n/src/format/failure.js +1 -0
  371. package/dist/modules/im-i18n/src/format/last-message.js +1 -0
  372. package/dist/modules/im-i18n/src/format/media.js +1 -0
  373. package/dist/modules/im-i18n/src/format/mention.js +1 -0
  374. package/dist/modules/im-i18n/src/format/service-text.js +1 -0
  375. package/dist/modules/im-i18n/src/format/system-message.js +1 -0
  376. package/dist/modules/im-i18n/src/internal/duration.js +1 -0
  377. package/dist/modules/im-i18n/src/internal/interpolate.js +1 -0
  378. package/dist/modules/im-i18n/src/locale.js +1 -0
  379. package/dist/modules/im-protocol/src/board-pinned-message.js +1 -0
  380. package/dist/modules/im-protocol/src/frame-codec.js +1 -0
  381. package/dist/modules/im-protocol/src/protobuf/gen/channel_pb.js +1 -0
  382. package/dist/modules/im-protocol/src/protobuf/gen/group_pb.js +1 -0
  383. package/dist/modules/im-protocol/src/protobuf/gen/im.app.msg_pb.js +1 -0
  384. package/dist/modules/im-protocol/src/protobuf/gen/im.channel_pb.js +1 -0
  385. package/dist/modules/im-protocol/src/protobuf/gen/im.group_pb.js +1 -0
  386. package/dist/modules/im-protocol/src/protobuf/gen/im.login_pb.js +1 -0
  387. package/dist/modules/im-protocol/src/protobuf/gen/im.msg_pb.js +1 -0
  388. package/dist/modules/im-protocol/src/protobuf/gen/im.pub_pb.js +1 -0
  389. package/dist/modules/im-protocol/src/protobuf/gen/im.robot_pb.js +1 -0
  390. package/dist/modules/im-protocol/src/protobuf/gen/im.sig_pb.js +1 -0
  391. package/dist/modules/im-protocol/src/protobuf/gen/msg_pb.js +1 -0
  392. package/dist/modules/im-protocol/src/protobuf/registry.js +1 -0
  393. package/dist/modules/im-sdk/src/cache-prefix-migration.js +1 -0
  394. package/dist/modules/im-sdk/src/create-im-client.js +1 -0
  395. package/dist/modules/im-sdk/src/domains/channel.js +1 -0
  396. package/dist/modules/im-sdk/src/domains/contact.js +1 -0
  397. package/dist/modules/im-sdk/src/domains/conversation.js +1 -0
  398. package/dist/modules/im-sdk/src/domains/group.js +1 -0
  399. package/dist/modules/im-sdk/src/domains/media-byte-computation.js +1 -0
  400. package/dist/modules/im-sdk/src/domains/media.js +1 -0
  401. package/dist/modules/im-sdk/src/domains/message.js +1 -0
  402. package/dist/modules/im-sdk/src/domains/pinned-message-source.js +1 -0
  403. package/dist/modules/im-sdk/src/domains/pinned-message.js +1 -0
  404. package/dist/modules/im-sdk/src/domains/session.js +1 -0
  405. package/dist/modules/im-sdk/src/product/applications.js +1 -0
  406. package/dist/modules/im-sdk/src/product/calls.js +1 -0
  407. package/dist/modules/im-sdk/src/product/capabilities.js +1 -0
  408. package/dist/modules/im-sdk/src/product/channel-mention-candidates.js +1 -0
  409. package/dist/modules/im-sdk/src/product/conversation-background.js +1 -0
  410. package/dist/modules/im-sdk/src/product/conversation-entry-unread.js +1 -0
  411. package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -0
  412. package/dist/modules/im-sdk/src/product/conversations.js +1 -0
  413. package/dist/modules/im-sdk/src/product/customer-service.js +1 -0
  414. package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -0
  415. package/dist/modules/im-sdk/src/product/diagnostics.js +1 -0
  416. package/dist/modules/im-sdk/src/product/directory.js +1 -0
  417. package/dist/modules/im-sdk/src/product/draft.js +1 -0
  418. package/dist/modules/im-sdk/src/product/emoji-catalog.js +1 -0
  419. package/dist/modules/im-sdk/src/product/emoji-catalog.json.js +1 -0
  420. package/dist/modules/im-sdk/src/product/events.js +1 -0
  421. package/dist/modules/im-sdk/src/product/expressions.js +1 -0
  422. package/dist/modules/im-sdk/src/product/face-to-face-group.js +1 -0
  423. package/dist/modules/im-sdk/src/product/group-calls.js +1 -0
  424. package/dist/modules/im-sdk/src/product/image-format.js +1 -0
  425. package/dist/modules/im-sdk/src/product/local-data.js +1 -0
  426. package/dist/modules/im-sdk/src/product/media.js +1 -0
  427. package/dist/modules/im-sdk/src/product/mention.js +1 -0
  428. package/dist/modules/im-sdk/src/product/message.js +1 -0
  429. package/dist/modules/im-sdk/src/product/messages-by-id.js +1 -0
  430. package/dist/modules/im-sdk/src/product/outbox.js +1 -0
  431. package/dist/modules/im-sdk/src/product/profiles.js +1 -0
  432. package/dist/modules/im-sdk/src/product/resource-uploader.js +1 -0
  433. package/dist/modules/im-sdk/src/product/robots.js +1 -0
  434. package/dist/modules/im-sdk/src/product/search.js +1 -0
  435. package/dist/modules/im-sdk/src/product/session-favorites.js +1 -0
  436. package/dist/modules/im-sdk/src/product/settings.js +1 -0
  437. package/dist/modules/im-sdk/src/runtime/advanced-message-diagnostics.js +1 -0
  438. package/dist/modules/im-sdk/src/runtime/channel-read-summary-refresh.js +1 -0
  439. package/dist/modules/im-sdk/src/runtime/customer-service-legacy-recovery.js +1 -0
  440. package/dist/modules/im-sdk/src/runtime/decrypt-diagnostics.js +1 -0
  441. package/dist/modules/im-sdk/src/runtime/foreground-work-coordinator.js +1 -0
  442. package/dist/modules/im-sdk/src/runtime/group-history-page-boundary.js +1 -0
  443. package/dist/modules/im-sdk/src/runtime/key-prefetch.js +1 -0
  444. package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -0
  445. package/dist/modules/im-sdk/src/runtime/media-cache-maintenance.js +1 -0
  446. package/dist/modules/im-sdk/src/runtime/media-upload-recovery.js +1 -0
  447. package/dist/modules/im-sdk/src/runtime/protobuf-wire-shape.js +1 -0
  448. package/dist/modules/im-sdk/src/runtime/receiving-activity.js +1 -0
  449. package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -0
  450. package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -0
  451. package/dist/modules/im-sdk/src/runtime/session-http-clients.js +1 -0
  452. package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -0
  453. package/dist/modules/im-sdk/src/runtime/signal-offline-poller.js +1 -0
  454. package/dist/request-crypto.js +1 -1
  455. package/dist/sdk.d.ts +170 -111
  456. package/dist/sdk.js +1 -1
  457. package/package.json +2 -2
  458. package/dist/browser-GFKMMRZD.js +0 -1
  459. package/dist/browser-RTCHWSQ2.js +0 -2
  460. package/dist/chunk-2U2JMY5V.js +0 -1
  461. package/dist/chunk-B5V2O54N.js +0 -1
  462. package/dist/chunk-I7YY5G76.js +0 -1
  463. package/dist/chunk-IDECJJXC.js +0 -0
  464. package/dist/chunk-PHJQ6QKU.js +0 -2
  465. package/dist/chunk-Q2DEFN53.js +0 -1
  466. package/dist/chunk-SXY56EVC.js +0 -0
  467. package/dist/chunk-TIQ37Q7E.js +0 -2
  468. package/dist/chunk-VMNZGJNM.js +0 -2
  469. package/dist/chunk-WOT6VMZA.js +0 -1
  470. package/dist/chunk-X7ZBIWYF.js +0 -8
@@ -1,8 +1,8 @@
1
1
  /** 媒体业务类型:实现据此选对象存储逻辑桶;sticker 对应 app-sticker。 */
2
2
  type MediaKind = 'image' | 'video' | 'voice' | 'file' | 'sticker';
3
3
 
4
- /** 会话类型。P0 只用 direct / group;`robot` 是独立私聊 sibling,不得并入 direct。 */
5
- type ConversationType = 'direct' | 'group' | 'channel' | 'supergroup' | 'robot';
4
+ /** 会话类型;各类型分别处理权限、收发和历史。supergroup 仅预留类型,尚未提供业务实现。 */
5
+ type ConversationType = 'direct' | 'group' | 'channel' | 'supergroup' | 'robot' | 'customerService';
6
6
  /**
7
7
  * 会话复合身份;`conversationId` 只在对应 `conversationType` 的领域内唯一。
8
8
  *
@@ -39,8 +39,8 @@ interface ConversationDraft$1 {
39
39
  attachments: readonly [];
40
40
  updatedAt: number;
41
41
  }
42
- /** 消息内容类型。sticker=表情/贴图(BMessage contentType=7);call=单聊通话记录(contentType=10);transfer=转账(contentType=16);gift=礼品/刮刮卡(contentType=17);robot=机器人卡片(contentType=18);miniProgram=小程序分享卡(contentType=22);redPacket=红包卡(contentType=25);game=小游戏(contentType=27);liveRoom=直播间分享(contentType=30);未知 wire 正文统一归一为 unknown。 */
43
- type MessageContentType = 'text' | 'system' | 'image' | 'video' | 'voice' | 'file' | 'sticker' | 'contact' | 'miniProgram' | 'game' | 'transfer' | 'gift' | 'call' | 'redPacket' | 'mediaAlbum' | 'filesAlbum' | 'robot' | 'liveRoom' | 'unknown';
42
+ /** 消息内容类型。sticker=表情/贴图(BMessage contentType=7);call=单聊通话记录(contentType=10);transfer=转账(contentType=16);gift=礼品/刮刮卡(contentType=17);robot=机器人卡片(contentType=18);miniProgram=小程序分享卡(contentType=22);redPacket=红包卡(contentType=25);game=小游戏(contentType=27);liveRoom=直播间分享(contentType=30);未知 wire 正文统一转换为 unknown。 */
43
+ type MessageContentType = 'text' | 'system' | 'image' | 'video' | 'voice' | 'file' | 'sticker' | 'contact' | 'miniProgram' | 'game' | 'transfer' | 'gift' | 'call' | 'redPacket' | 'mediaAlbum' | 'filesAlbum' | 'robot' | 'liveRoom' | 'customerService' | 'unknown';
44
44
  /**
45
45
  * 发送态(客户端态):消息从本地创建到服务端确认的生命周期。
46
46
  * `uploading` 仅媒体消息使用:文件上传阶段(uploading→pending→sending→sent);
@@ -80,10 +80,10 @@ interface ImSystemMessageBody {
80
80
  pinnedMessageAction?: ImPinnedMessageAction;
81
81
  }
82
82
  /**
83
- * 会话「最后一条」的语义摘要(持久化、经字段级 lastMessageSummaryEqual 参与判等):取代中文预览串作为语义承重。
84
- * `system` 分支直接持归一后的 ImSystemMessageBody(供 formatLastMessageSummary 复用 formatSystemMessage,selfId 渲染时传入)。
85
- * EXPRESSION 协议家族按 `imageType` 投影为 `gif` 或静态 `sticker`,供会话列表保留产品差异。
86
- * 迁移期与 lastMessagePreview 双写并存(阶段 4);判等**禁比对象引用**(否则 hydrate 回读值/重算值每次新建对象即永不相等)。
83
+ * 会话最后一条消息的语义摘要,供存储和 im-i18n 展示使用。
84
+ * `system` 保存解析后的 ImSystemMessageBody,formatSystemMessage 在展示时接收 selfId。
85
+ * EXPRESSION 按 imageType 区分 gif 与静态 sticker。
86
+ * 与 lastMessagePreview 同时保存;变化检查逐字段调用 lastMessageSummaryEqual,不比较对象引用。
87
87
  */
88
88
  type LastMessageSummary = {
89
89
  kind: 'text';
@@ -279,7 +279,7 @@ interface ImVoiceBody {
279
279
  teaKey?: Uint8Array;
280
280
  /** 文件加密类型:0=跟随消息,1=不加密,3=完整 TEA(BMessage.fileEncryptType;语音与图片/视频同走完整 TEA)。 */
281
281
  fileEncryptType?: number;
282
- /** 录音振幅波形(0-255):仅发送端本地展示缓存(随消息落盘、刷新后仍可画波形),**不写入 BMessage**(协议无波形字段)。 */
282
+ /** 录音振幅波形(0-255):仅发送端本地展示缓存(随消息写入本地存储、刷新后仍可画波形),**不写入 BMessage**(协议无波形字段)。 */
283
283
  waveform?: number[];
284
284
  }
285
285
  /**
@@ -386,7 +386,7 @@ interface ImRobotImageGroupModule {
386
386
  /**
387
387
  * 机器人卡片倒计时。
388
388
  *
389
- * `endTimeMs` 已归一为 epoch 毫秒;wire 秒/毫秒混用只在 mapper 转换,宿主不要再猜单位。
389
+ * `endTimeMs` 已转换为 epoch 毫秒;wire 秒/毫秒混用只在 mapper 转换,宿主不要再猜单位。
390
390
  */
391
391
  interface ImRobotCountdownModule {
392
392
  type: 'countdown';
@@ -479,10 +479,10 @@ interface ImGiftBody {
479
479
  benCount?: string;
480
480
  fissionNumber?: string;
481
481
  }
482
- /** 领域通话媒体类型;已从各端 wire 0/1 对调口径归一,宿主禁止再读 raw callType。 */
482
+ /** 通话媒体类型;各端 wire 0/1 的不同含义已转换成统一业务值,宿主无需读取 raw callType。 */
483
483
  type ImCallKind = 'audio' | 'video';
484
484
  /**
485
- * 通话结束结果。Android 跨端同步把未接与取消都写成 callStatus=0,只能归一为 missed。
485
+ * 通话结束结果。Android 跨端同步把未接与取消都写成 callStatus=0,只能转换为 missed。
486
486
  * `unknown` 仅表示该端 status 数字无法识别,不得猜成 completed。
487
487
  */
488
488
  type ImCallOutcome = 'missed' | 'rejected' | 'cancelled' | 'completed' | 'busy' | 'no-permission' | 'interrupted' | 'unknown';
@@ -490,7 +490,7 @@ type ImCallOutcome = 'missed' | 'rejected' | 'cancelled' | 'completed' | 'busy'
490
490
  * 单聊通话记录正文(contentType==='call',协议 BMessage.contentType=10)。
491
491
  *
492
492
  * @remarks JSON 在 BMessage.content。Android 本地 / Android 跨端同步 / iOS 三套字段名与 0/1 含义不同,
493
- * 只在 mapping/call-record-body 归一。记录由各端本地插入,不能当普通聊天发出。
493
+ * 仅由 mapping/call-record-body 转换成统一业务值。记录由各端本地插入,不能当普通聊天发出。
494
494
  */
495
495
  interface ImCallRecordBody {
496
496
  callKind: ImCallKind;
@@ -517,7 +517,7 @@ type ImRedPacketType = 1 | 2 | 3 | 4;
517
517
  * @remarks 字段来自 proto 72-79 + 复用 34/35/38/49。领域名 `packetId` 对应 wire `rad_packet_id`。
518
518
  * 金额保持 proto string,单位是否微单位未证实,禁止默认套转账 ×1e6。
519
519
  * HTTP 详情状态与本地「自己已领」属于宿主投影,不进本 DTO(status 39 / state 53 未裁定)。
520
- * 本阶段不提供 `sendRedPacket`;出站字段仅用于 codec 往返闭合。
520
+ * 当前不提供 `sendRedPacket`;出站字段仅用于 codec 往返闭合。
521
521
  */
522
522
  interface ImRedPacketBody {
523
523
  packetId: string;
@@ -537,7 +537,7 @@ interface ImRedPacketBody {
537
537
  type ImContactKind = 'individual' | 'group' | 'channel' | 'robot' | 'unknown';
538
538
  /**
539
539
  * 名片消息内容体(contentType==='contact')。字段来自 BMessage contentType=8,但使用领域友好命名:
540
- * id/icon/name 分别归一为 targetId/avatar/displayName;visitCardKey 归一为 kind,未知值放 rawKind。
540
+ * id/icon/name 分别转换为 targetId/avatar/displayName;visitCardKey 转换为 kind,未知值放 rawKind。
541
541
  */
542
542
  interface ImContactBody {
543
543
  /** 被分享对象 id:个人 userId、普通群 groupId、频道 id 或机器人 id。 */
@@ -569,7 +569,7 @@ interface UnknownMessageBody {
569
569
  * 若干项共享消息级的撤回、已读、引用与转发语义。
570
570
  */
571
571
  interface ImMediaAlbumItem {
572
- /** 该项是图片还是视频;由协议 `mediaType` 归一而来,未知取值的项在解析阶段已被丢弃。 */
572
+ /** 该项是图片还是视频;由协议 mediaType 转换,无法识别的项会在解析时丢弃。 */
573
573
  kind: 'image' | 'video';
574
574
  /** 远端地址。加密项也是这个地址,解密用本项自己的 `teaKey`。 */
575
575
  url: string;
@@ -651,8 +651,28 @@ interface ImLiveRoomBody {
651
651
  /** 点赞数十进制字符串,保持协议原文,不在 Core 换算。 */
652
652
  liveRoomLikes?: string;
653
653
  }
654
+ /** 客服正文保留一条消息内的全部附件;图片和文件各自保持服务端顺序。 */
655
+ interface ImCustomerServiceBody {
656
+ /** 原始文字;空白不被当作不存在。 */
657
+ text: string;
658
+ /** 图片直达地址,不套用普通消息的加密文件结构。 */
659
+ images: readonly string[];
660
+ /** 文件与名称、大小按协议数组索引配对,不创建伪消息 ID。 */
661
+ files: readonly ImCustomerServiceFile[];
662
+ }
663
+ /** 客服文件元数据。大小是服务端展示文字,不能据此认定下载完整。 */
664
+ interface ImCustomerServiceFile {
665
+ /** 服务端给出的资源地址。 */
666
+ url: string;
667
+ /** 服务端名称;缺省时从 URL 最后一个路径片段提取。 */
668
+ name: string;
669
+ /** 可缺省的原始大小描述,例如 1.5MB,并非精确字节数。 */
670
+ sizeLabel?: string;
671
+ }
654
672
  interface ImMessageBody {
655
- /** P0 文本内容(明文,解密后的结果)。 */
673
+ /** 客服专用复合正文;不能直接作为普通消息发送。 */
674
+ customerService?: ImCustomerServiceBody;
675
+ /** 文本内容(明文,解密后的结果)。 */
656
676
  text?: string;
657
677
  /** contentType==='system' 时的结构化系统提示体(群通知;text 忽略)。 */
658
678
  system?: ImSystemMessageBody;
@@ -702,7 +722,7 @@ interface MentionRange {
702
722
  end: number;
703
723
  }
704
724
  /**
705
- * 群消息 @ 提及(Android 三写载体的归一解析):`atAll`(MESGrpChat.nNotifyCount=-1)、`atUserIds`(sNotifyUsers 被 @ 成员,
725
+ * 群消息 @ 提及(Android 三写载体的统一解析):`atAll`(MESGrpChat.nNotifyCount=-1)、`atUserIds`(sNotifyUsers 被 @ 成员,
706
726
  * 含正文 token 读边界补全)、`ranges`(extend.atRange,可选、仅诊断/兼容——展示**不依赖其坐标**)。正文 `body.text` 保留 `[userId]` token 原样(真相不变);
707
727
  * **展示权威来源 = 正文 token + atUserIds/atAll**,由纯函数 `resolveMentionSegments` 还原为高亮段(含 @昵称/@所有人/@我),UI 不自行解析。
708
728
  */
@@ -724,21 +744,21 @@ type ImMessageFailureReason = 'timeout' | 'rejected' | 'encrypt_failed' | 'netwo
724
744
  */
725
745
  type ImFailureDisplayCode = 'media.empty' | 'media.noCrypto' | 'media.previewFailed' | 'media.encryptFailed' | 'media.resumeUnavailable' | 'media.cleanupUnconfirmed' | 'media.uploadFailed' | 'media.uploadTimeout' | 'media.cancelled' | 'media.invalidDuration' | 'media.uploadInterrupted' | 'media.contentTooLarge' | 'contactRequired' | 'messageRefused' | 'forbiddenOrLeft' | 'contentRejected' | 'groupDismissed' | 'groupUnavailable' | 'channelDismissed' | 'channelMuted' | 'channelNotMember' | 'channelAdminRequired' | 'conversationUnsupported' | 'sendCanceled' | 'sessionLoggedOut' | 'timeout' | 'network' | 'unknown';
726
746
  interface ImMessageFailure {
727
- /** 归一后的错误码(来自 MESChatAck.errcode 或本地失败码,本地码用负值)。 */
747
+ /** 转换后的错误码(来自 MESChatAck.errcode 或本地失败码,本地码用负值)。 */
728
748
  code: number;
729
749
  /** 失败机器分类(重试 / fail-fast / 统计消费)。 */
730
750
  reason: ImMessageFailureReason;
731
- /** 失败展示语义码(强类型):UI 经 im-i18n 按 locale 渲染;缺省表示无专门展示码(UI 回退 message)。不参与去重判等。 */
751
+ /** 失败展示语义码:UI 经 im-i18n 按语言渲染,缺省时使用 message;不单独触发消息状态更新。 */
732
752
  displayCode?: ImFailureDisplayCode;
733
- /** 展示模板参数(如未支持会话类型的 type);不参与去重判等。 */
753
+ /** 展示模板参数(如未支持会话类型的 type);不单独触发消息状态更新。 */
734
754
  params?: Record<string, string | number>;
735
755
  /** 媒体失败的媒体类型(图片/视频/语音/文件):供 displayCode 为 media.* 时渲染 label。 */
736
756
  mediaKind?: MediaKind;
737
- /** 后端原文 / 诊断兜底文案;仅诊断/展示兜底用,不参与去重判等(见 merge.failureEqual)。 */
757
+ /** 后端原文或诊断文案;没有专门展示码时用于展示,不单独触发消息状态更新(见 merge.failureEqual)。 */
738
758
  message?: string;
739
759
  /**
740
760
  * 是否可重试(false=业务级不可重试):如 direct 非好友或 GROUP 不在群(0x8201)、内容为空/违规(0x8202)、群已解散(0x8315)→ UI 隐藏「重发」。
741
- * 缺省(undefined)视为可重试(向后兼容)。由 code 决定(classifyAckFailure),故不参与去重判等(同 code 必同 retryable)。
761
+ * 缺省(undefined)视为可重试(向后兼容)。由 code 决定(classifyAckFailure),不单独触发消息状态更新。
742
762
  */
743
763
  retryable?: boolean;
744
764
  }
@@ -781,7 +801,7 @@ interface MediaTaskUpdate {
781
801
  failure?: ImMessageFailure;
782
802
  }
783
803
  interface ImMessageEncryption {
784
- /** P0 true=消息密文链路, false=明文链路(encrypt=0)。 */
804
+ /** true=消息密文链路, false=明文链路(encrypt=0)。 */
785
805
  encrypted: boolean;
786
806
  /** 扩展:加密方案标识,默认 'rsa-tea'。 */
787
807
  scheme?: 'rsa-tea';
@@ -790,16 +810,16 @@ interface ImMessageEncryption {
790
810
  }
791
811
  /** 单条消息领域模型(§4.1)。主键为客户端生成的 id(无 serverId)。 */
792
812
  interface ImMessage {
793
- /** P0 客户端生成的稳定消息 ID(UUID),同时作幂等键;刷新后保持。 */
813
+ /** 客户端生成的稳定消息 ID(UUID),同时作幂等键;刷新后保持。 */
794
814
  id: string;
795
- /** P0 归一化会话 ID。 */
815
+ /** 消息所属会话的字符串 ID;必须结合 conversationType 使用。 */
796
816
  conversationId: string;
797
817
  conversationType: ConversationType;
798
- /** P0 归一化发送者 ID。 */
818
+ /** 发送者的字符串用户 ID。 */
799
819
  senderId: string;
800
820
  contentType: MessageContentType;
801
821
  body: ImMessageBody;
802
- /** P0 统一毫秒 number(本地创建时间,乐观渲染用)。 */
822
+ /** 统一毫秒 number(本地创建时间,乐观渲染用)。 */
803
823
  createdAt: number;
804
824
  /** SDK 内部排序键;有效服务端时间优先,ACK 后可以更新。宿主不解析它,消息身份始终使用 id。 */
805
825
  sortKey: string;
@@ -808,7 +828,7 @@ interface ImMessage {
808
828
  failure?: ImMessageFailure;
809
829
  /** 服务端回传的 epoch 毫秒时间;有效时用于正式排序与展示,createdAt 仍保留创建记录。 */
810
830
  serverTime?: number;
811
- /** P0 默认 'unread'。 */
831
+ /** 默认 'unread'。 */
812
832
  receipt: MessageReceipt;
813
833
  /** 离线单聊服务端标记当前账号已在其它端读过;仅用于本地未读投影,不改变对端回执 receipt。 */
814
834
  readBySelf?: boolean;
@@ -841,7 +861,7 @@ interface ImMessage {
841
861
  /** 扩展位:后端新增语义先落这里,避免污染核心字段。 */
842
862
  extensions?: Record<string, unknown>;
843
863
  /**
844
- * 诊断快照(§4.1 诊断口径):后端下发的原始协议字段(已归一为可 JSON 序列化形态)。
864
+ * 诊断快照(§4.1 诊断口径):后端下发的原始协议字段(已转换为可 JSON 序列化形态)。
845
865
  * 默认不填充,仅当映射开启 keepRaw 时附带,便于联调、与后端核对原始下发;不参与任何业务逻辑。
846
866
  */
847
867
  raw?: ImMessageRaw;
@@ -958,17 +978,17 @@ type ChannelSessionState = 'active' | 'guest' | 'left' | 'removed' | 'dismissed'
958
978
  interface ImSession {
959
979
  id: string;
960
980
  type: ConversationType;
961
- /** P0 由映射层从用户/群资料补齐。 */
981
+ /** 由映射层从用户/群资料补齐。 */
962
982
  title: string;
963
983
  avatar?: string;
964
984
  /**
965
- * 会话最后一条的预览串(**已收窄**,阶段 4c):仅承载 text 消息的正文(供会话列表 previewSegments 解析 @/表情,需原始正文串);
985
+ * 会话最后一条的预览串(**已收窄**):仅承载 text 消息的正文(供会话列表 previewSegments 解析 @/表情,需原始正文串);
966
986
  * 媒体 / 加密 / 系统 / 撤回一律空串——其语义改由 lastMessageSummary 承载、UI 经 im-i18n 渲染。旧盘遗留的中文占位在 hydrate / projectSession 重算时清空。
967
987
  */
968
988
  lastMessagePreview: string;
969
989
  /**
970
- * 最后一条消息的语义摘要(持久化):取代中文 lastMessagePreview 作为语义承重,UI 经 im-i18n 按 locale 渲染。
971
- * 迁移期与 lastMessagePreview 双写并存(阶段 4);判等用字段级 lastMessageSummaryEqual(禁比对象引用)。旧会话无此字段时 UI 回退 lastMessagePreview。
990
+ * 最后一条消息的语义摘要,持久保存并由 im-i18n 按语言生成文案。
991
+ * 与 lastMessagePreview 同时保存,变化检查使用逐字段比较;旧会话缺此字段时可使用 lastMessagePreview。
972
992
  */
973
993
  lastMessageSummary?: LastMessageSummary;
974
994
  /** 最后一条消息发送者 id(群会话列表预览「发送者名: 内容」前缀用;`'system'`=系统提示、==自己=我发的,前缀策略由宿主定)。 */
@@ -992,7 +1012,7 @@ interface ImSession {
992
1012
  * 会话内容仍显示最新一条消息。收到别人 @我 +1、查看/已读该会话清零。投影自 ReadState.mentionUnreadCount,与 unreadCount 同源持久化。
993
1013
  */
994
1014
  mentionUnreadCount?: number;
995
- /** P0 排序时间(毫秒 number)。 */
1015
+ /** 排序时间(毫秒 number)。 */
996
1016
  timestamp: number;
997
1017
  /**
998
1018
  * 用户手工添加的本地“稍后处理”提醒。
@@ -1008,7 +1028,7 @@ interface ImSession {
1008
1028
  topTime?: number;
1009
1029
  /**
1010
1030
  * 最新一条消息若为「己方且未完成发送」的态:'sending'(pending/uploading/sending 统一)/ 'failed'。
1011
- * 派生展示字段(随最新消息变化,会话列表据此显示发送中 loading / 失败图标);运行期真相,不持久化(persistSession 落盘时剔除)。
1031
+ * 派生展示字段(随最新消息变化,会话列表据此显示发送中 loading / 失败图标);运行期真相,不持久化(persistSession 写入本地存储时剔除)。
1012
1032
  */
1013
1033
  lastMessageSendState?: 'sending' | 'failed';
1014
1034
  /**
@@ -1016,11 +1036,11 @@ interface ImSession {
1016
1036
  *
1017
1037
  * 只在自己发出且 `status='sent'` 时投影;发送中/失败、对端消息、撤回、全员删除和系统提示都不给。
1018
1038
  * `delivered` 与尚未回执一样投影为 `unread`;当前协议没有送达通知,不能把 `sent` 当作对端已收到。
1019
- * 该字段随最新消息变化,并随会话落盘,避免冷启动后
1039
+ * 该字段随最新消息变化,并随会话写入本地存储,避免冷启动后
1020
1040
  * 因「盘中缺字段 / 内存有字段」反复广播;对端已读变化必须刷新会话行。
1021
1041
  */
1022
1042
  lastMessageReceipt?: 'unread' | 'read';
1023
- /** P0 我方已读游标(见 §4.3)。 */
1043
+ /** 我方已读游标(见 §4.3)。 */
1024
1044
  readCursor?: string;
1025
1045
  /** 群受限状态(仅 group;来自 0x2204 群通知 side-effect)。缺省视为 'active'(可正常发送)。 */
1026
1046
  groupState?: GroupSessionState;
@@ -1038,11 +1058,11 @@ interface ImSession {
1038
1058
  interface ReadState {
1039
1059
  conversationId: string;
1040
1060
  /**
1041
- * 新写入必须携带的会话类型;可选仅用于读取 Phase 2 迁移前的旧盘记录。
1042
- * 旧记录在 storage migration 中按对应 session 回填,迁移完成后收紧为必填。
1061
+ * 新写入必须携带会话类型;可选用于兼容迁移前的存储记录。
1062
+ * storage migration 会根据对应 session 补齐旧记录。
1043
1063
  */
1044
1064
  conversationType?: ConversationType;
1045
- /** P0 我方已读到的位置(消息 id 或后端游标的归一表示)。 */
1065
+ /** 当前账号已读到的位置,以消息 id 或后端游标表示。 */
1046
1066
  readCursor: string;
1047
1067
  /**
1048
1068
  * 已读游标消息的 sortKey(位置)持久化快照:重启后 readCursor 对应消息未必被 hydrate 到内存,
@@ -1076,12 +1096,12 @@ interface OutboxUpdate {
1076
1096
  }
1077
1097
  /** 发送队列项(§4.4)。id 复用对应 ImMessage.id 以保证重试幂等。 */
1078
1098
  interface OutboxMessage {
1079
- /** P0 == 对应 ImMessage.id(客户端生成,重试时复用以保证幂等)。 */
1099
+ /** == 对应 ImMessage.id(客户端生成,重试时复用以保证幂等)。 */
1080
1100
  id: string;
1081
1101
  conversationId: string;
1082
1102
  conversationType: ConversationType;
1083
1103
  contentType: MessageContentType;
1084
- /** P0 待发送内容(明文;加密在发送管线内按 encryption 处理)。 */
1104
+ /** 待发送内容(明文;加密在发送管线内按 encryption 处理)。 */
1085
1105
  body: ImMessageBody;
1086
1106
  /** 群 @ 提及(发送侧:宿主从输入框提取;正文 body.text 已含 [userId] token / @所有人 文字,本字段供群发送策略编码 sNotifyUsers/nNotifyCount/extend)。仅群 @ 消息有。 */
1087
1107
  mention?: ImMessageMention;
@@ -1095,7 +1115,7 @@ interface OutboxMessage {
1095
1115
  /**
1096
1116
  * 复发策略(生命周期 logout 语义):`automatic`(默认,缺省视同)= onAuthenticated/断线重连时自动复发;
1097
1117
  * `manual` = 仅用户显式 retry 才发(logout 时把在途消息置 manual,避免退账号后下次登录无提示自动补发)。
1098
- * 持久化随账本落盘,故 logout(preserve)→重登后仍为 manual,不被自动复发;retry 会翻回 automatic。缺省(旧账本)按 automatic 处理(向后兼容)。
1118
+ * 持久化随账本写入本地存储,故 logout(preserve)→重登后仍为 manual,不被自动复发;retry 会翻回 automatic。缺省(旧账本)按 automatic 处理(向后兼容)。
1099
1119
  */
1100
1120
  resumePolicy?: 'automatic' | 'manual';
1101
1121
  }
@@ -1115,7 +1135,7 @@ interface ContactRemarkPhone {
1115
1135
  countryCode: string;
1116
1136
  mobile: string;
1117
1137
  }
1118
- /** 用户资料领域模型(§4.5)。由 ImProfilePort 拉取、映射层归一。 */
1138
+ /** 用户资料领域模型(§4.5)。由 ImProfilePort 拉取、映射层转换字段。 */
1119
1139
  interface UserProfile {
1120
1140
  id: string;
1121
1141
  /** 用户自设昵称(后端 `nick_name`)。 */
@@ -1140,7 +1160,7 @@ interface UserProfile {
1140
1160
  remarkPhones?: ContactRemarkPhone[];
1141
1161
  /** 扩展:消息加密公钥来源(§7 复用)。 */
1142
1162
  publicKey?: string;
1143
- /** 会话免打扰态(好友关系 `is_undisturb` 归一):仅好友资料返回,供领域层回填 `ImSession.muted` 做多端/冷启动恢复;非好友无此字段(undefined,不覆盖本地)。 */
1163
+ /** 会话免打扰态(好友关系 `is_undisturb` 转换为布尔值):仅好友资料返回,供领域层回填 `ImSession.muted` 做多端/冷启动恢复;非好友无此字段(undefined,不覆盖本地)。 */
1144
1164
  muted?: boolean;
1145
1165
  extensions?: Record<string, unknown>;
1146
1166
  }
@@ -1156,11 +1176,11 @@ interface GroupProfile {
1156
1176
  verifyWay?: number;
1157
1177
  /** 普通群邀请码;仅 `verifyWay === 4` 时有业务意义。 */
1158
1178
  inviteCode?: string;
1159
- /** 群状态(后端 status,具体值语义待后端明确):保留不丢弃,供「普通成员感知群解散」兜底(解散仅通知群主,Review F6)。 */
1179
+ /** 群状态(后端 status,具体值语义待后端明确):保留不丢弃,供「普通成员感知群解散」兜底(解散仅通知群主)。 */
1160
1180
  status?: number;
1161
- /** 当前用户是否在群(后端 is_ingroup:false=已不在群,被踢/退群的兜底禁发来源,Review F6)。 */
1181
+ /** 当前用户是否在群(后端 is_ingroup:false=已不在群,被踢/退群的兜底禁发来源)。 */
1162
1182
  isInGroup?: boolean;
1163
- /** 当前用户对该群的免打扰态(`to_user.is_undisturb` 归一):供领域层回填 `ImSession.muted` 恢复;缺省(undefined)表示后端未返回,不覆盖本地。 */
1183
+ /** 当前用户对该群的免打扰态(`to_user.is_undisturb` 转换为布尔值):供领域层回填 `ImSession.muted` 恢复;缺省(undefined)表示后端未返回,不覆盖本地。 */
1164
1184
  muted?: boolean;
1165
1185
  /** 扩展位:members[] 等明细留扩展。 */
1166
1186
  extensions?: Record<string, unknown>;
@@ -1272,9 +1292,9 @@ interface ChannelProfile {
1272
1292
  /** CHANNEL 独立访问限制事实;browser 新映射必须提供,legacy storage 可能缺失。 */
1273
1293
  accessSnapshot?: ChannelAccessSnapshot;
1274
1294
  muted?: boolean;
1275
- /** 服务端频道类型的归一业务值;不得用它把频道改路由到 `supergroup`。 */
1295
+ /** 服务端频道类型转换后的业务值;不得用它把频道改路由到 `supergroup`。 */
1276
1296
  channelKind?: string;
1277
- /** 本地密钥缓存代际/服务端未来版本的非敏感标识;不承载 secret_key。 */
1297
+ /** 本地密钥缓存操作编号/服务端未来版本的非敏感标识;不承载 secret_key。 */
1278
1298
  secretKeyVersion?: string;
1279
1299
  /** `/user_radio/list` 的资料增量版本;与 secretKeyVersion 无关。 */
1280
1300
  updateVersion?: string;
@@ -1304,7 +1324,7 @@ interface ChannelMemberPage {
1304
1324
  }
1305
1325
  /** CHANNEL @ 选择器返回的用户项;专用 UserInfo 协议不提供角色,不得写入 role-rich 成员缓存。 */
1306
1326
  interface ChannelMentionMember {
1307
- /** 归一化用户 ID;来自 `/user_radio/member/*` 的 `user_id`。 */
1327
+ /** 用户 ID,以字符串表示;来自 `/user_radio/member/*` 的 `user_id`。 */
1308
1328
  userId: string;
1309
1329
  /** CHANNEL @ 面板展示名;按频道昵称、全局昵称、协议备用名、用户 ID 的顺序降级。 */
1310
1330
  displayName: string;
@@ -1337,7 +1357,7 @@ interface ImError {
1337
1357
  * 诊断日志钩子(§5.3,可选):宿主注入以观察核心诊断(如 ACK 原始 errcode)。
1338
1358
  * core 不内置 console;不注入则不产生诊断输出。
1339
1359
  */
1340
- /** 连接策略(§8.3)。P0 固定 'single','race'/'sequential' 留 P1。 */
1360
+ /** 当前连接策略固定为 single,只连接首个端点。 */
1341
1361
  type ConnectionStrategy = 'single' | 'race' | 'sequential';
1342
1362
  interface ImReconnectOptions {
1343
1363
  /** 退避基数毫秒,默认 1000。 */
@@ -1383,7 +1403,7 @@ interface ContactApplication {
1383
1403
  /** 申请人的产品展示 ID,例如服务端 `user_info.mid`。 */
1384
1404
  applicantDisplayId?: string;
1385
1405
  message: string;
1386
- /** 服务端时间戳归一后的 Unix 毫秒;源字段缺失时保持未知。 */
1406
+ /** 服务端时间戳转换后的 Unix 毫秒;源字段缺失时保持未知。 */
1387
1407
  createdAt?: number;
1388
1408
  }
1389
1409
  /** 联系人申请页;分页耗尽依据原始 type=1 页,不依据产品聚合结果。 */
@@ -1439,7 +1459,7 @@ interface ApplicationTarget {
1439
1459
  * GROUP 申请/邀请 provider 的权威记录。
1440
1460
  *
1441
1461
  * @remarks `applicationId` 是审核命令参数,`groupId` 是会话身份,两者不可互换;actor/target
1442
- * 是申请时快照,最终成员关系和群资料仍由各自领域 API 收敛。
1462
+ * 是申请时快照,最终成员关系和群资料仍由各自领域 API 统一更新。
1443
1463
  */
1444
1464
  interface GroupApplication {
1445
1465
  applicationId: string;
@@ -1450,7 +1470,7 @@ interface GroupApplication {
1450
1470
  target: ApplicationTarget;
1451
1471
  /** 申请附言或邀请说明,服务端允许为空。 */
1452
1472
  message: string;
1453
- /** 服务端时间戳归一后的 Unix 毫秒;源字段缺失时保持未知。 */
1473
+ /** 服务端时间戳转换后的 Unix 毫秒;源字段缺失时保持未知。 */
1454
1474
  createdAt?: number;
1455
1475
  }
1456
1476
  /** GROUP 申请页;分页耗尽依据原始 type=2 混合页。 */
@@ -1549,7 +1569,7 @@ interface ChannelJoinApplication {
1549
1569
  channelAvatar?: string;
1550
1570
  /** 申请人填写的入群说明,服务端允许为空。 */
1551
1571
  message: string;
1552
- /** 服务端创建时间归一为 Unix 毫秒;源字段缺失或非法时不提供。 */
1572
+ /** 服务端创建时间转换为 Unix 毫秒;源字段缺失或非法时不提供。 */
1553
1573
  createdAt?: number;
1554
1574
  }
1555
1575
  /** CHANNEL 申请列表的页号 cursor 输入;cursor 是下一原始混合页页号。 */
@@ -1618,7 +1638,7 @@ interface ImChannelProfilePort {
1618
1638
  getProfile: (channelId: string, options?: {
1619
1639
  forceRefresh?: boolean;
1620
1640
  }) => Promise<ChannelProfile | null>;
1621
- /** 清空 CHANNEL profile 内存缓存并作废旧请求写回;与 GROUP profile 保持 sibling。 */
1641
+ /** 清空 CHANNEL profile 内存缓存,并阻止旧请求写回;与 GROUP profile 保持 sibling。 */
1622
1642
  clearCache?: () => void;
1623
1643
  }
1624
1644
  /** CHANNEL 成员查询。cursor 是频道成员接口的不透明游标。 */
@@ -1631,7 +1651,7 @@ interface ChannelMemberPageQuery {
1631
1651
  }
1632
1652
  /** CHANNEL 成员读取 capability;分页列表与当前消息窗口的稀疏批量读取共用同一独立 adapter。 */
1633
1653
  interface ImChannelMemberPort {
1634
- /** hydrate 有界公共快照;快照新鲜时不回源,过期时按完整页重建约 200 人。 */
1654
+ /** hydrate 有界公共快照;快照新鲜时不重新请求服务端,过期时按完整页重建约 200 人。 */
1635
1655
  prefetchMembers?: (channelId: string) => Promise<void>;
1636
1656
  /** 只读取公共快照或其本地直接/拼音搜索结果;允许返回过期快照供 UI 先显,不发 HTTP。 */
1637
1657
  getCachedMembers?: (input: {
@@ -1655,9 +1675,9 @@ interface ImChannelMemberPort {
1655
1675
  getMembersByIds: (channelId: string, userIds: readonly string[], options?: {
1656
1676
  forceRefresh?: boolean;
1657
1677
  }) => Promise<ChannelMember[]>;
1658
- /** 作废频道成员缓存代际;旧请求可兑现原调用方,但不得写回当前缓存。 */
1678
+ /** 使频道成员缓存失效;旧请求可以返回原调用方,但不得写回当前缓存。 */
1659
1679
  invalidateChannelMembers: (channelId: string) => Promise<void>;
1660
- /** 清空全部 CHANNEL role-rich 成员内存缓存并作废旧请求写回;持久层由 storage 分类清理统一处理。 */
1680
+ /** 清空全部 CHANNEL role-rich 成员内存缓存,并阻止旧请求写回;持久层由 storage 分类清理统一处理。 */
1661
1681
  clearCache?: () => void;
1662
1682
  }
1663
1683
  /** CHANNEL @ 专用成员页查询;不得复用 role-rich 管理列表的 query/response 语义。 */
@@ -1741,10 +1761,9 @@ interface TransportEvents {
1741
1761
  interface TransportPort {
1742
1762
  readonly state: TransportState;
1743
1763
  /**
1744
- * 连接候选地址数组(P0 实现只连 endpoints[0],多 host 竞速 P1)。
1745
- * 契约:实现必须保证——调用 connect() 前若存在旧连接,先完整关闭再建立新连接(幂等再连接);
1746
- * 据此连接层在重连/网络恢复时可直接调用,不会出现新旧连接并存(满足「至多一个活跃 transport」)。
1747
- * 该清理契约由 @k2/im-browser 的 WsTransport 实现并锁测(切片 04)。
1764
+ * 候选连接地址数组;当前实现仅连接 endpoints[0]。
1765
+ * 再次 connect() 时必须先关闭旧连接,保证任一时刻至多存在一个活跃传输连接。
1766
+ * @k2/im-browser 的 WsTransport 实现该约定。
1748
1767
  */
1749
1768
  connect: (endpoints: TransportEndpoint[], options?: TransportConnectOptions) => Promise<void>;
1750
1769
  /** 发送一帧(已编码字节)。 */
@@ -1755,7 +1774,7 @@ interface TransportPort {
1755
1774
  }
1756
1775
 
1757
1776
  interface ImEndpointProvider {
1758
- /** WS 候选地址。P0 返回单元素数组;后端下发多 host 时返回多元素。 */
1777
+ /** WS 候选地址。返回单元素数组;后端下发多 host 时返回多元素。 */
1759
1778
  getEndpoints: () => Promise<TransportEndpoint[]>;
1760
1779
  /** CM Protobuf HTTP 基址。 */
1761
1780
  getCmHttpBaseUrl: () => Promise<string>;
@@ -1944,7 +1963,7 @@ interface ImProfilePort {
1944
1963
  getGroupProfile: (groupId: string, opts?: {
1945
1964
  forceRefresh?: boolean;
1946
1965
  }) => Promise<GroupProfile | null>;
1947
- /** 清空实现持有的 user/GROUP profile/member 内存缓存并作废旧请求写回;无缓存的实现可省略。 */
1966
+ /** 清空实现持有的 user/GROUP profile/member 内存缓存,并阻止旧请求写回;无缓存的实现可省略。 */
1948
1967
  clearCache?: () => void;
1949
1968
  }
1950
1969
 
@@ -2079,53 +2098,49 @@ interface ImDecryptRecoveryRecord {
2079
2098
  createdAt: number;
2080
2099
  }
2081
2100
  /**
2082
- * 持久化用户资料(O3):领域 `UserProfile` + 落盘时间戳。跨刷新持久化以消除群历史发送者「占位→回填」闪动。
2101
+ * 持久化用户资料:领域 `UserProfile` + 写入本地存储时间戳。跨刷新持久化以消除群历史发送者「占位→回填」闪动。
2083
2102
  * 分字段存(remark/nickname/avatar),展示名优先级在读取侧算,避免固化合并结果。
2084
2103
  */
2085
2104
  interface StoredUserProfile extends UserProfile {
2086
- /** 落盘/刷新时间(毫秒),供 TTL 过期判断。 */
2105
+ /** 写入本地存储/刷新时间(毫秒),供 TTL 过期判断。 */
2087
2106
  updatedAt: number;
2088
2107
  }
2089
2108
  /**
2090
- * 持久化群成员项(O3):群内昵称 + 预留角色/加入方式。
2091
- * 【前瞻·P-C】`roleId`/`joinType` 供后续「群成员列表展示」复用同一缓存,第一版可空;头像不在此存(走 userProfiles,避免重复)。
2109
+ * 持久化群成员项:群内昵称 + 预留角色/加入方式。
2110
+ * roleId/joinType 供群成员列表展示,可缺省;头像保存在 userProfiles,避免重复存储。
2092
2111
  */
2093
2112
  interface StoredGroupMember {
2094
2113
  userId: string;
2095
2114
  /** 群内昵称(展示名优先级第 2 级,仅次于好友备注)。 */
2096
2115
  groupNick: string;
2097
- /** 【前瞻·P-C】成员角色 roleId(1 普通 / 9 管理员 / 10 群主);第一版可空。 */
2116
+ /** 成员角色 roleId(1 普通 / 9 管理员 / 10 群主);响应缺少时可省略。 */
2098
2117
  roleId?: number;
2099
- /** 【前瞻·P-C】加入方式 joinType(0 退群 / 1 主动 / 2 邀请 / 3 群主);第一版可空。 */
2118
+ /** 加入方式 joinType(0 退群 / 1 主动 / 2 邀请 / 3 群主);响应缺少时可省略。 */
2100
2119
  joinType?: number;
2101
2120
  }
2102
2121
  /**
2103
- * 持久化群成员列表(O3,按 groupId 存整份):含增量版本与落盘时间。
2104
- * 【前瞻·P-A】`updateVersion` 供二期增量拉(`/user_group/user/list` update_version),第一版全量、可空。
2105
- * 【前瞻·P-B】结构对普通群/超级群通用;超级群海量成员按需 per-sender 填充由各会话类型策略决定,store 不感知类型。
2122
+ * 持久保存群成员列表,按 groupId 保存整份数据,同时记录 updateVersion 与更新时间。
2123
+ * 增量响应由资料适配层合并后写入;存储层不解释成员变更。
2106
2124
  */
2107
2125
  interface StoredGroupMemberList {
2108
2126
  groupId: string;
2109
2127
  members: StoredGroupMember[];
2110
- /** 【前瞻·P-A】增量版本(update_version);第一版全量、可空。 */
2128
+ /** 成员列表增量版本 update_version;服务端未返回时可省略。 */
2111
2129
  updateVersion?: number;
2112
- /** 落盘/刷新时间(毫秒),供 TTL 过期判断。 */
2130
+ /** 写入本地存储/刷新时间(毫秒),供 TTL 过期判断。 */
2113
2131
  updatedAt: number;
2114
2132
  }
2115
2133
  /**
2116
- * 持久化群资料(群设置面板 · 群主标识):领域 `GroupProfile`(含 `ownerId`/name/avatar/memberCount)+ 落盘时间。
2117
- * 主用途:**受限群**(被踢/退群/解散)只读本地时,从本地 `ownerId` 标出群主——受限群不调群资料接口(后端拒绝被移出用户),
2118
- * 故须在正常态把群主信息落盘。
2119
- * 【前瞻·P-B】结构对普通群/超级群通用(群主体系 `roleId=10` 两类群共用);超级群特有字段(返佣/游客/管理员)由各会话类型
2120
- * 策略在 `extensions` 扩展,store 不感知类型——新增群类型走 sibling 策略填充,不改本结构语义。
2134
+ * 持久保存普通群资料,包括群主 ownerId、名称、头像、成员数和更新时间。
2135
+ * 被踢、退群或解散后无法访问远端群资料时,产品仍可读取此前保存的群主标识。
2121
2136
  */
2122
2137
  interface StoredGroupProfile extends GroupProfile {
2123
- /** 落盘/刷新时间(毫秒),供 TTL 过期判断。 */
2138
+ /** 写入本地存储/刷新时间(毫秒),供 TTL 过期判断。 */
2124
2139
  updatedAt: number;
2125
2140
  }
2126
2141
  /** CHANNEL 资料的账号级持久化副本;不得包含 `secret_key`。 */
2127
2142
  interface StoredChannelProfile extends ChannelProfile {
2128
- /** 落盘/刷新时间(毫秒),供后续资料 TTL 与诊断使用。 */
2143
+ /** 写入本地存储/刷新时间(毫秒),供后续资料 TTL 与诊断使用。 */
2129
2144
  updatedAt: number;
2130
2145
  }
2131
2146
  /** CHANNEL 稀疏成员缓存项;按 `{channelId,userId}` 存储,不允许把整频道成员全量塞入单条记录。 */
@@ -2175,7 +2190,7 @@ type StoredConversationBackground = {
2175
2190
  * 本地存储端口(DB 无关、异步、可测试)。面向消息/会话/已读/发送账本/元数据等领域实体。
2176
2191
  *
2177
2192
  * 生命周期:宿主(SDK)在拿到登录 userId 后先 `open({ namespace: userId })`(幂等,内部跑 schema 迁移),
2178
- * 再由 domainState `hydrate()` 回读;登出/切账号时 `close()`。所有写入源自 domainState 唯一收敛入口,
2193
+ * 再由 domainState `hydrate()` 回读;登出/切账号时 `close()`。所有写入源自 domainState 统一更新入口,
2179
2194
  * 失败经 `error` 事件(scope:'storage')暴露、不静默吞、不阻塞内存主流程。
2180
2195
  */
2181
2196
  interface ImStoragePort {
@@ -2191,7 +2206,7 @@ interface ImStoragePort {
2191
2206
  /** 关闭库句柄(登出/切账号)。 */
2192
2207
  close: () => Promise<void>;
2193
2208
  /**
2194
- * 只清当前已打开账号的可重建缓存;messages/sessions/read/drafts/outbox/pinned/tombstone/sync meta 等 durable 数据必须保留。
2209
+ * 只清当前已打开账号的可重建缓存;messages/sessions/read/drafts/outbox/pinned/删除标记/sync meta 等 durable 数据必须保留。
2195
2210
  * 自定义 adapter 可省略;产品清理入口检测缺失后显式拒绝,不能伪装成功。
2196
2211
  */
2197
2212
  clearRebuildableCaches?: () => Promise<void>;
@@ -2244,7 +2259,7 @@ interface ImStoragePort {
2244
2259
  deleteConversationDecryptRecoveries?: (conversation: ConversationRef) => Promise<void>;
2245
2260
  /** 全量会话(hydrate 用)。 */
2246
2261
  getSessions: () => Promise<ImSession[]>;
2247
- /** 批量落盘会话(按 id 覆盖写)。 */
2262
+ /** 批量写入本地存储会话(按 id 覆盖写)。 */
2248
2263
  saveSessions: (sessions: readonly ImSession[]) => Promise<void>;
2249
2264
  /** 删除单会话行(删除会话用)。 */
2250
2265
  deleteSession: (conversation: ImStorageConversation) => Promise<void>;
@@ -2262,7 +2277,7 @@ interface ImStoragePort {
2262
2277
  clearConversationHistory?: (conversation: ConversationRef, nextSession?: ImSession, nextReadState?: ReadState) => Promise<void>;
2263
2278
  /** 全量已读态(hydrate 用)。 */
2264
2279
  getReadStates: () => Promise<ReadState[]>;
2265
- /** 落盘单条已读态(按 conversationId 覆盖写)。 */
2280
+ /** 写入本地存储单条已读态(按 conversationId 覆盖写)。 */
2266
2281
  saveReadState: (state: ReadState) => Promise<void>;
2267
2282
  /** 全量读取当前账号草稿,供账号 runtime hydrate。 */
2268
2283
  getDrafts: () => Promise<ConversationDraft$1[]>;
@@ -2284,7 +2299,7 @@ interface ImStoragePort {
2284
2299
  deleteDefaultConversationBackground?: () => Promise<void>;
2285
2300
  /** 全量在途发送账本(回读用)。 */
2286
2301
  getOutbox: () => Promise<OutboxMessage[]>;
2287
- /** 落盘/更新单条 Outbox(按 id 覆盖写)。 */
2302
+ /** 写入本地存储/更新单条 Outbox(按 id 覆盖写)。 */
2288
2303
  saveOutboxMessage: (message: OutboxMessage) => Promise<void>;
2289
2304
  /** 出队删除单条 Outbox(sent 后)。 */
2290
2305
  removeOutboxMessage: (id: string) => Promise<void>;
@@ -2296,15 +2311,15 @@ interface ImStoragePort {
2296
2311
  removePinnedMessage: (conversation: ImStorageConversation) => Promise<void>;
2297
2312
  /** 按 userId 取持久化用户资料(含 updatedAt 供 TTL 判断);无则 null。best-effort,失败降级不阻塞主流程。 */
2298
2313
  getUserProfile: (userId: string) => Promise<StoredUserProfile | null>;
2299
- /** 落盘用户资料(按 userId 覆盖写)。 */
2314
+ /** 写入本地存储用户资料(按 userId 覆盖写)。 */
2300
2315
  saveUserProfile: (profile: StoredUserProfile) => Promise<void>;
2301
2316
  /** 按 groupId 取持久化群成员列表(含 updateVersion/updatedAt);无则 null。 */
2302
2317
  getGroupMembers: (groupId: string) => Promise<StoredGroupMemberList | null>;
2303
- /** 落盘群成员列表(按 groupId 覆盖写;第一版全量重写,二期按 updateVersion 增量合并)。 */
2318
+ /** 按 groupId 保存完整群成员列表;增量响应应由调用方先合并。 */
2304
2319
  saveGroupMembers: (list: StoredGroupMemberList) => Promise<void>;
2305
2320
  /** 按 groupId 取持久化群资料(含 ownerId/updatedAt);无则 null。供受限群本地标群主(受限群不调群资料接口)。 */
2306
2321
  getGroupProfile: (groupId: string) => Promise<StoredGroupProfile | null>;
2307
- /** 落盘群资料(按 id 覆盖写)。 */
2322
+ /** 写入本地存储群资料(按 id 覆盖写)。 */
2308
2323
  saveGroupProfile: (profile: StoredGroupProfile) => Promise<void>;
2309
2324
  /** 按 channelId 读取资料;无则 null。 */
2310
2325
  getChannelProfile: (channelId: string) => Promise<StoredChannelProfile | null>;
@@ -2736,7 +2751,7 @@ interface ImGroupCallMeetingSnapshot {
2736
2751
  * 根据 CHANNEL 角色、生命周期和禁言事实计算稳定访问能力。
2737
2752
  *
2738
2753
  * 这是无副作用的权限投影:输入来自权威 profile/session,输出供发送和 UI 预检使用;服务端仍做最终
2739
- * 权限裁决。未知或冲突状态不会借 GROUP 权限兜底,而是收敛到受限能力与明确原因。
2754
+ * 权限裁决。未知或冲突状态不会借 GROUP 权限兜底,而是转换为受限能力与明确原因。
2740
2755
  */
2741
2756
 
2742
2757
  /** CHANNEL 有效访问解析入参;`nowMs` 显式传入,使 hydrate、发送门禁与 Web 时钟使用同一纯逻辑。 */
@@ -2966,16 +2981,16 @@ interface GroupMemberItem {
2966
2981
  interface ProfileHttpAdapterDeps {
2967
2982
  /** 宿主注入的协议客户端(如 Nuxt `$clientApi`);本适配作为调用方走 core JSON 链路拉资料。 */
2968
2983
  client: ApiProtocolClient;
2969
- /** 端类型 clientType(Web/H5=2):透传给群资料/成员接口写 `Client-type` header,对齐后端全链路一致建议(Review F5)。缺省不带。 */
2984
+ /** 端类型 clientType(Web/H5=2):透传给群资料/成员接口写 `Client-type` header,对齐后端全链路一致建议。缺省不带。 */
2970
2985
  clientType?: number;
2971
2986
  /**
2972
- * 本地持久化端口(O3):注入后 `getUserProfile`/`getGroupMemberNames` 走三级缓存(内存→持久化→HTTP),跨刷新消除群历史发送者「占位→回填」闪动。
2987
+ * 本地持久化端口:注入后 `getUserProfile`/`getGroupMemberNames` 走三级缓存(内存→持久化→HTTP),跨刷新消除群历史发送者「占位→回填」闪动。
2973
2988
  * 只用 profile/member 四方法;**缺省 = 纯内存**(向后兼容)。storage 未 open / 读写异常时自动**降级 HTTP-only**(不阻塞不报错,符合 storage=downstream 原则)。
2974
2989
  * open 时序:与 SDK 共享同一 storage 实例,SDK `connect()` 统一 `open(namespace=userId)`;本适配读写前 open 未完成即降级。
2975
2990
  */
2976
2991
  storage?: Pick<ImStoragePort, 'getUserProfile' | 'saveUserProfile' | 'getGroupMembers' | 'saveGroupMembers' | 'getGroupProfile' | 'saveGroupProfile'>;
2977
2992
  }
2978
- /** 群成员昵称提供者(createProfileHttpAdapter 在 ImProfilePort 之外附加,切片13/P1):供宿主解析群消息发送者展示名(群内昵称优先级由宿主决定;Android 为好友备注 > 群内昵称 > 全局昵称)。 */
2993
+ /** 群成员昵称接口,作为 ImProfilePort 的补充;提供群消息发送者的群内昵称,最终展示优先级由调用方决定。 */
2979
2994
  interface GroupMemberNameProvider {
2980
2995
  /** 取群内成员昵称映射(userId → 群内昵称,空昵称成员不含);空/失败 → null(调用方回退用户资料名)。缓存 + 同 id 去抖 + forceRefresh。 */
2981
2996
  getGroupMemberNames: (groupId: string, opts?: {
@@ -2985,30 +3000,38 @@ interface GroupMemberNameProvider {
2985
3000
  listGroupMembers: (groupId: string, opts?: {
2986
3001
  forceRefresh?: boolean;
2987
3002
  }) => Promise<GroupMemberItem[] | null>;
2988
- /** O3 prewarm(Review F1/三轮):仅从内存+持久化读用户资料(**不回源 HTTP**),命中返回 `{ value, stale }`、未命中 null;`stale`=持久化过期。供进会话前首屏预热+据 stale 后台刷新。 */
3003
+ /** 仅读取内存或本地用户资料,不发 HTTP 请求;命中返回 { value, stale },未命中返回 null,stale 表示本地记录已过期。 */
2989
3004
  peekUserProfile: (userId: string) => Promise<{
2990
3005
  value: UserProfile;
2991
3006
  stale: boolean;
2992
3007
  } | null>;
2993
- /** O3 prewarm(Review F1/三轮):仅从内存+持久化读群成员昵称(不回源 HTTP),命中 `{ value, stale }`、未命中 null。 */
3008
+ /** 仅读取内存或本地的群成员昵称,不发 HTTP 请求;命中返回 { value, stale },未命中返回 null。 */
2994
3009
  peekGroupMemberNames: (groupId: string) => Promise<{
2995
3010
  value: Record<string, string>;
2996
3011
  stale: boolean;
2997
3012
  } | null>;
2998
- /** O3 prewarm:仅从内存+持久化读**有序成员列表**(不回源 HTTP),命中 `{ value, stale }`、未命中 null。供群设置面板打开时先本地秒显。 */
3013
+ /** 仅读取内存或本地的有序群成员列表,不发 HTTP 请求;命中返回 { value, stale },供面板先展示已有内容。 */
2999
3014
  peekGroupMembers: (groupId: string) => Promise<{
3000
3015
  value: GroupMemberItem[];
3001
3016
  stale: boolean;
3002
3017
  } | null>;
3003
- /** O3 prewarm:仅从内存+持久化读群资料(不回源 HTTP),命中 `{ value, stale }`、未命中 null。供受限群本地标群主(ownerId)。 */
3018
+ /** 仅读取内存或本地群资料,不发 HTTP 请求;命中返回 { value, stale },供受限群展示已缓存的群主等信息。 */
3004
3019
  peekGroupProfile: (groupId: string) => Promise<{
3005
3020
  value: GroupProfile;
3006
3021
  stale: boolean;
3007
3022
  } | null>;
3008
3023
  }
3009
- /** 创建用户 / 群资料 HTTP 适配(实现 ImProfilePort + 群成员昵称):编排 requests/ 原子请求 + 回退 + 缓存 + 归一。 */
3024
+ /** 创建用户 / 群资料 HTTP 适配(实现 ImProfilePort + 群成员昵称):组合 requests/ 请求、回退、缓存和字段转换。 */
3010
3025
  declare function createProfileHttpAdapter(deps: ProfileHttpAdapterDeps): ImProfilePort & GroupMemberNameProvider;
3011
3026
 
3027
+ /** 客服号公开展示资料;不携带后台发送者身份或网络路由参数。 */
3028
+ interface CustomerServiceProfile {
3029
+ /** 当前语言的客服名称。 */
3030
+ displayName: string;
3031
+ /** 当前语言的头像地址;服务端未配置时为空。 */
3032
+ avatarUrl: string;
3033
+ }
3034
+
3012
3035
  /** 服务端对入群请求的最终裁决:已入群,或已提交并等待管理员审核。 */
3013
3036
  type MembershipJoinOutcome = 'joined' | 'waiting';
3014
3037
  /** Browser adapter 暴露给 SDK 的稳定入群结果,不携带具体 HTTP 响应结构。 */
@@ -3017,7 +3040,7 @@ interface MembershipJoinResult {
3017
3040
  outcome: MembershipJoinOutcome;
3018
3041
  }
3019
3042
 
3020
- /** 服务端按逻辑桶签发的 S3 临时上传凭证(已归一为 SDK 合同字段)。 */
3043
+ /** 服务端按逻辑桶签发的 S3 临时上传凭证(已转换为 SDK 合同字段)。 */
3021
3044
  interface MediaUploadCredentials {
3022
3045
  /** STS access key id(服务端字段 `access_key_id`)。 */
3023
3046
  accessKeyId: string;
@@ -3033,7 +3056,7 @@ interface MediaUploadCredentials {
3033
3056
  region: string;
3034
3057
  /** 对象 key 前缀;STS 策略只允许写该前缀下的对象,SDK 生成的 key 必须以它开头。 */
3035
3058
  keyPrefix?: string;
3036
- /** 公开访问域名(已归一为带 scheme、无尾斜杠);写进消息体的媒体 URL 以它为准。 */
3059
+ /** 公开访问域名(已转换为带 scheme、无尾斜杠);写进消息体的媒体 URL 以它为准。 */
3037
3060
  dnsPoint: string;
3038
3061
  /** 服务端身份标识;SDK 不使用,仅原样透出供宿主排查。 */
3039
3062
  identityId?: string;
@@ -3488,7 +3511,7 @@ interface MentionCandidatePage {
3488
3511
  /**
3489
3512
  * CHANNEL role-free @候选产品 sibling。
3490
3513
  *
3491
- * @remarks list/search 使用独立缓存与 token 上下文;token 只在创建它的账号 runtime、查询类型和频道代际内有效。
3514
+ * @remarks list/search 使用独立缓存与 token 上下文;token 只在创建它的账号 runtime、查询类型和频道缓存版本号内有效。
3492
3515
  * 本 API 不读取 role-rich 成员 provider,也不包含已退场的 @消息索引/定位能力。
3493
3516
  * @example
3494
3517
  * ```ts
@@ -3502,13 +3525,13 @@ interface ImChannelMentionApi {
3502
3525
  peekFirstPage: (channel: ConversationRef<'channel'>) => MentionCandidatePage | null;
3503
3526
  /** 从已 hydrate 的常用候选快照做同步直接文本过滤;不发远端搜索请求。 */
3504
3527
  peekSearchCandidates: (channel: ConversationRef<'channel'>, keyword: string) => readonly MentionCandidate[];
3505
- /** hydrate 持久快照并返回本地首页或直接/拼音搜索结果;cache miss 返回 null,绝不回源。 */
3528
+ /** hydrate 持久快照并返回本地首页或直接/拼音搜索结果;cache miss 返回 null,绝不请求服务端。 */
3506
3529
  getCachedPage: (channel: ConversationRef<'channel'>, keyword?: string) => Promise<MentionCandidatePage | null>;
3507
3530
  /** hydrate 持久快照,并在缺失/过期时按完整页预热约 200 人;同频道在途任务复用。 */
3508
3531
  prefetchFirstPage: (channel: ConversationRef<'channel'>) => Promise<void>;
3509
3532
  /** 强制从专用 mention provider 重建约 200 人常用候选快照。 */
3510
3533
  refreshFirstPage: (channel: ConversationRef<'channel'>) => Promise<MentionCandidatePage>;
3511
- /** 读取常用候选快照;内存 miss 时先读持久层,均未命中才回源。 */
3534
+ /** 读取常用候选;内存未命中时先读本地存储,两处都没有才查询服务端。 */
3512
3535
  listFirstPage: (channel: ConversationRef<'channel'>) => Promise<MentionCandidatePage>;
3513
3536
  /** 使用 list 页产生的 token 继续分页;search token 会被拒绝。 */
3514
3537
  listNextPage: (pageToken: ImPageToken) => Promise<MentionCandidatePage>;
@@ -3567,7 +3590,7 @@ interface ImDirectorySearchApi {
3567
3590
  search: (keyword: string) => Promise<ImDirectorySearchResult>;
3568
3591
  }
3569
3592
 
3570
- /** 回源失败的原因与能否重试。 */
3593
+ /** 服务端消息查询失败的原因,以及是否允许重试。 */
3571
3594
  interface MessagesByIdFailure {
3572
3595
  /**
3573
3596
  * 能否稍后重试。
@@ -3579,7 +3602,10 @@ interface MessagesByIdFailure {
3579
3602
  /** 原始错误,供诊断与上报。 */
3580
3603
  error: unknown;
3581
3604
  }
3582
- /** 回源的汇总结果。三组 id 互不重叠,合起来覆盖调用方传入的全部有效 id。 */
3605
+ /**
3606
+ * 服务端消息查询汇总。三组 ID 互不重叠,合起来覆盖调用方传入的全部有效 ID。
3607
+ * @template TMessage 调用方需要的消息展示类型,由 projectMessage 从领域消息转换得到。
3608
+ */
3583
3609
  interface ImMessagesByIdResult<TMessage> {
3584
3610
  /** 成功取回的消息。已经进了本地历史,后续本地查询就能命中。 */
3585
3611
  readonly messages: readonly TMessage[];
@@ -3601,7 +3627,7 @@ interface ImMessagesByIdResult<TMessage> {
3601
3627
  * SDK 内部 CHANNEL sibling:装配资料、成员、申请、置顶、历史限制与通知修复能力。
3602
3628
  *
3603
3629
  * 所有入口都要求精确 CHANNEL 身份,并把协议 I/O 结果提交到当前账号的同一 DomainState;不会复用
3604
- * GROUP 端口或为 `supergroup` fallback。运行时 dispose 后,在途 HTTP/回源结果必须失效,不能广播旧账号事件。
3630
+ * GROUP 端口或为 `supergroup` fallback。运行时 dispose 后,在途 HTTP 查询的结果必须失效,不能广播旧账号事件。
3605
3631
  */
3606
3632
 
3607
3633
  /** CHANNEL 资料、成员和申请门面;已退场的 Mention 历史定位不进入产品面。 */
@@ -3626,7 +3652,7 @@ interface ImChannelApi extends ImDirectoryApi<'channel'> {
3626
3652
  cursor?: string;
3627
3653
  limit?: number;
3628
3654
  }) => Promise<ChannelMemberPage>;
3629
- /** 进入 CHANNEL 时预热 role-rich 有界成员快照;缓存新鲜时不回源。 */
3655
+ /** 进入 CHANNEL 时预取含成员角色的有限列表;缓存未过期时不重复请求服务端。 */
3630
3656
  prefetchMembers: (channelId: string) => Promise<void>;
3631
3657
  /** 读取 role-rich 有界快照或本地搜索命中;不触发远端请求。 */
3632
3658
  getCachedMembers: (input: {
@@ -3775,7 +3801,7 @@ interface ImContactApi extends ImDirectoryApi<'individual'> {
3775
3801
  getProfile: (userId: string, opts?: {
3776
3802
  forceRefresh?: boolean;
3777
3803
  }) => Promise<UserProfile | null>;
3778
- /** 仅读内存/持久化,不回源 HTTP;命中时显式返回 stale。 */
3804
+ /** 只读内存或本地存储,不发 HTTP;命中时明确返回 stale,提醒调用方缓存可能已过期。 */
3779
3805
  peekProfile: (userId: string) => Promise<{
3780
3806
  value: UserProfile;
3781
3807
  stale: boolean;
@@ -3825,7 +3851,7 @@ interface ConversationPrefetchOptions {
3825
3851
  * skipped 表示当前类型、权限、存储或预算不允许预取;失败不改变正常打开会话的行为。
3826
3852
  */
3827
3853
  interface ConversationPrefetchResult {
3828
- ref: ConversationRef<'direct' | 'group' | 'channel' | 'robot'>;
3854
+ ref: ConversationRef<'direct' | 'group' | 'channel' | 'robot' | 'customerService'>;
3829
3855
  status: 'ready' | 'skipped' | 'failed' | 'cancelled';
3830
3856
  reason?: 'unsupported' | 'unavailable' | 'storage-unavailable' | 'budget' | 'page-too-large' | 'decrypt-failed' | 'invalidated' | 'cancelled';
3831
3857
  error?: ImSdkErrorShape;
@@ -3833,7 +3859,7 @@ interface ConversationPrefetchResult {
3833
3859
 
3834
3860
  /**
3835
3861
  * 当前账号草稿的产品 DTO、跨组件 API 与 handle 绑定门面。
3836
- * 草稿按复合会话身份串行持久化,SDK DomainState 是唯一真相;附件尚未闭合时非空输入明确拒绝。
3862
+ * 草稿按会话类型和 ID 串行保存,统一由 SDK DomainState 管理;当前不支持保存附件,非空附件输入会被明确拒绝。
3837
3863
  */
3838
3864
 
3839
3865
  /** 当前产品草稿实体;只包含可持久化的 text/mention/reply,附件集合固定为空。 */
@@ -3896,7 +3922,7 @@ interface ImDraftsApi {
3896
3922
  */
3897
3923
 
3898
3924
  /** 当前兼容门面支持的精确会话 ref。 */
3899
- type ImSupportedConversationRef = ConversationRef<'direct' | 'group' | 'channel' | 'robot'>;
3925
+ type ImSupportedConversationRef = ConversationRef<'direct' | 'group' | 'channel' | 'robot' | 'customerService'>;
3900
3926
  /**
3901
3927
  * 会话 API 的迁移期入参。优先传完整 ref;旧 string 仅在当前 session 中唯一命中时可用。
3902
3928
  *
@@ -3904,10 +3930,10 @@ type ImSupportedConversationRef = ConversationRef<'direct' | 'group' | 'channel'
3904
3930
  */
3905
3931
  type ImConversationInput = ImSupportedConversationRef | string;
3906
3932
  /**
3907
- * 会话列表兼容读模型;草稿是当前账号本机即时投影,不进入 session durable 行,也不承诺跨端同步。
3933
+ * 内部会话列表数据。草稿反映当前账号的本机输入,不写入会话持久记录,也不跨端同步。
3908
3934
  *
3909
- * @remarks Phase 7 消费方迁移前保留 ImSession 展示字段;新代码应优先读取复合身份语义与 draft,不自行拼主键。
3910
- * @example `client.conversations.list().find(item => item.draft !== null)` 可找到当前账号有未发送草稿的会话。
3935
+ * 保留 ImSession 的展示字段供内部调用方使用;跨类型识别会话时必须使用会话类型 + ID,不自行拼接主键。
3936
+ * @example client.conversations.list().find(item => item.draft !== null) 可找到当前账号有未发送草稿的会话。
3911
3937
  */
3912
3938
  interface ConversationListItem$1 extends ImSession {
3913
3939
  draft: ConversationDraft | null;
@@ -3934,7 +3960,7 @@ interface ImConversationsApi {
3934
3960
  markConversationRead: (conversation: ImConversationInput) => Promise<void>;
3935
3961
  /** 给已无真实未读的会话添加本地未读提醒;不回退消息已读状态,也不发网络请求。 */
3936
3962
  markConversationUnread: (conversation: ImConversationInput) => void;
3937
- /** 删除本机会话、消息、读态与草稿;立即发布对应本地事件,durable 删除失败经 storage error 暴露,离线历史受 tombstone 约束。 */
3963
+ /** 删除本机会话、消息、已读状态和草稿并立即发布本地事件;存储删除失败会报告 storage error,本地删除标记阻止离线消息恢复已删除内容。 */
3938
3964
  deleteConversation: (conversation: ImConversationInput) => void;
3939
3965
  }
3940
3966
 
@@ -4004,16 +4030,16 @@ interface ImCreateGroupResult {
4004
4030
  }
4005
4031
 
4006
4032
  /**
4007
- * SDK 内部普通群 sibling:装配群资料、成员名称、`@` 候选和群置顶主动操作。
4033
+ * SDK 内部普通群模块:提供群资料、成员名称、@ 候选和群置顶操作。
4008
4034
  *
4009
4035
  * 本模块只接收 GROUP `ConversationRef`,使用普通群独立 HTTP/mapper,并回写当前账号唯一 DomainState。
4010
- * CHANNEL 的角色、申请、成员治理和置顶协议不从这里兼容;dispose 会作废回源与协调器结果。
4036
+ * CHANNEL 的角色、申请、成员管理和置顶协议由独立模块处理;dispose 后旧查询和协调任务的结果不再生效。
4011
4037
  */
4012
4038
 
4013
4039
  /**
4014
4040
  * GROUP 完整 @候选集合产品面。
4015
4041
  *
4016
- * @remarks `listAll` 使用账号级产品缓存;`refreshAll` 显式绕过缓存回源。两者只消费普通群完整成员 provider,
4042
+ * @remarks `listAll` 使用账号级产品缓存;`refreshAll` 绕过缓存重新请求服务端。两者只消费普通群完整成员 provider,
4017
4043
  * 不接受 CHANNEL 分页 cursor/provider。缺少 provider、远端失败或不完整结果会拒绝,不用空数组伪装失败。
4018
4044
  * @example
4019
4045
  * ```ts
@@ -4025,7 +4051,7 @@ interface ImCreateGroupResult {
4025
4051
  interface ImGroupMentionApi {
4026
4052
  /** 读取完整候选集合;同群并发读取复用请求,成功结果按 userId 稳定去重并缓存。 */
4027
4053
  listAll: (group: ConversationRef<'group'>) => Promise<readonly MentionCandidate[]>;
4028
- /** 显式回源刷新完整候选;并发刷新复用请求,失败保留此前成功缓存。 */
4054
+ /** 显式向服务端重新查询完整候选;并发刷新复用请求,失败保留此前成功缓存。 */
4029
4055
  refreshAll: (group: ConversationRef<'group'>) => Promise<readonly MentionCandidate[]>;
4030
4056
  }
4031
4057
  /** GROUP 资料、成员缓存、@候选与单条置顶门面;不与 CHANNEL 合并。 */
@@ -4044,17 +4070,17 @@ interface ImGroupApi extends ImDirectoryApi<'group'> {
4044
4070
  getMemberNames: (groupId: string, opts?: {
4045
4071
  forceRefresh?: boolean;
4046
4072
  }) => Promise<Record<string, string> | null>;
4047
- /** 仅读普通群成员缓存,不回源。 */
4073
+ /** 仅读普通群成员缓存,不请求服务端。 */
4048
4074
  peekMembers: (groupId: string) => Promise<{
4049
4075
  value: GroupMemberItem[];
4050
4076
  stale: boolean;
4051
4077
  } | null>;
4052
- /** 仅读普通群昵称缓存,不回源。 */
4078
+ /** 仅读普通群昵称缓存,不请求服务端。 */
4053
4079
  peekMemberNames: (groupId: string) => Promise<{
4054
4080
  value: Record<string, string>;
4055
4081
  stale: boolean;
4056
4082
  } | null>;
4057
- /** 仅读普通群资料缓存,不回源。 */
4083
+ /** 仅读普通群资料缓存,不请求服务端。 */
4058
4084
  peekProfile: (groupId: string) => Promise<{
4059
4085
  value: GroupProfile;
4060
4086
  stale: boolean;
@@ -4103,7 +4129,7 @@ interface ImGroupApi extends ImDirectoryApi<'group'> {
4103
4129
  }
4104
4130
 
4105
4131
  /**
4106
- * SDK 资源轴与连接轴的稳定生命周期合同。
4132
+ * SDK 账号资源和网络连接的稳定生命周期合同。
4107
4133
  * 账号准备、联网和 logout 保持可区分;快照不包含 token、transport、storage 句柄或宿主认证状态。
4108
4134
  */
4109
4135
 
@@ -4112,9 +4138,9 @@ interface ImClientSnapshot {
4112
4138
  connectionState: ImConnectionState;
4113
4139
  pendingOutbox: OutboxMessage[];
4114
4140
  }
4115
- /** 会话资源生命周期;与连接状态轴正交。 */
4141
+ /** 账号资源的准备和释放状态;网络连接状态单独记录,二者互不替代。 */
4116
4142
  type ImSessionLifecycleState = 'empty' | 'preparing' | 'ready' | 'logging-out' | 'disposed';
4117
- /** 会话资源轴、连接轴与常用派生状态。 */
4143
+ /** 账号资源状态、网络连接状态,以及由二者计算的便捷状态。 */
4118
4144
  interface ImLifecycleSnapshot {
4119
4145
  sessionState: ImSessionLifecycleState;
4120
4146
  connectionState: ImConnectionState;
@@ -4223,7 +4249,7 @@ type ImApplicationItem = (ApplicationItemBase<'contact-request', ContactApplicat
4223
4249
  * typed application inbox 产品面。
4224
4250
  *
4225
4251
  * @remarks `listPending` 只有在 contact/GROUP/CHANNEL 三个 provider 全部成功时才返回完整快照;审核动作按 ref.domain
4226
- * 精确回到 sibling。CHANNEL invite type=5 不属于已闭合 provider,因此不会出现在结果中。
4252
+ * 精确回到 sibling。CHANNEL invite type=5 不属于已确认 provider,因此不会出现在结果中。
4227
4253
  * @example
4228
4254
  * ```ts
4229
4255
  * const pending = await client.applications.listPending()
@@ -4293,13 +4319,13 @@ interface ImDirectCallsApi {
4293
4319
  }
4294
4320
 
4295
4321
  /**
4296
- * 会话背景的产品选择、预设读取和持久化解析运行时。
4322
+ * 管理会话背景选择、预设读取和本地保存。
4297
4323
  *
4298
- * SDK 保存 builtin/preset/custom 的稳定选择及账号默认值,不保存 DOM、图片元素或 object URL;自定义图片
4299
- * Blob 只经 storage 持久化。异步读取使用运行时代际防止切会话/切账号晚返回,宿主负责最终渲染与 URL 释放。
4324
+ * SDK 保存 builtin/preset/custom 选择及账号默认值;自定义图片 Blob 经 storage 保存,不持有 DOM、图片元素或 object URL。
4325
+ * 异步读取返回时核对运行环境版本,防止切会话或切账号后应用旧结果;宿主负责最终渲染和 URL 释放。
4300
4326
  */
4301
4327
 
4302
- type ConversationBackgroundConversationType = 'direct' | 'group' | 'channel' | 'robot';
4328
+ type ConversationBackgroundConversationType = 'direct' | 'group' | 'channel' | 'robot' | 'customerService';
4303
4329
  interface ConversationBackgroundPreset {
4304
4330
  id: string;
4305
4331
  url: string;
@@ -4338,9 +4364,9 @@ interface ImConversationBackgroundApi {
4338
4364
  }
4339
4365
 
4340
4366
  /**
4341
- * 联系人、普通群和 CHANNEL 资料的稳定产品 DTO 投影。
4367
+ * 把联系人、普通群和 CHANNEL 资料转换为稳定产品数据。
4342
4368
  *
4343
- * 本文件只做复制、权限归一化与错误收敛,不缓存资料,也不发 HTTP。GROUP/CHANNEL 各自保留业务字段,
4369
+ * 本文件只复制字段、统一权限格式和转换错误,不缓存资料,也不发 HTTP。GROUP/CHANNEL 各自保留业务字段,
4344
4370
  * 公钥、访问快照、密钥版本、协议状态和 core extensions 都不会进入 default API。
4345
4371
  */
4346
4372
 
@@ -4363,14 +4389,14 @@ interface ImContactRemarkPhone {
4363
4389
  countryCode: string;
4364
4390
  mobile: string;
4365
4391
  }
4366
- /** default GROUP 资料 DTO;后端未闭合的数值 status 与缓存扩展不进入产品面。 */
4392
+ /** default GROUP 资料 DTO;后端尚未确认的数值 status 与缓存扩展不进入产品面。 */
4367
4393
  interface ImGroupProfile {
4368
4394
  ref: ConversationRef<'group'>;
4369
4395
  name: string;
4370
4396
  avatar?: string;
4371
4397
  memberCount?: number;
4372
4398
  ownerId?: string;
4373
- /** 普通群入群验证方式(1/2/4 为当前可设置值;未知值不在产品层静默归一)。 */
4399
+ /** 普通群入群验证方式(1/2/4 为当前可设置值);未知值不能在产品层被自动改写。 */
4374
4400
  verifyWay?: number;
4375
4401
  /** 普通群邀请码;仅邀请码模式有意义。 */
4376
4402
  inviteCode?: string;
@@ -4461,7 +4487,7 @@ interface ImChannelProfile {
4461
4487
  */
4462
4488
 
4463
4489
  /** default 会话列表支持的精确类型;`supergroup` 继续受产品 Gate 约束。 */
4464
- type ProductConversationListType = 'direct' | 'group' | 'channel' | 'robot';
4490
+ type ProductConversationListType = 'direct' | 'group' | 'channel' | 'robot' | 'customerService';
4465
4491
  /** GROUP 会话限制状态;与 CHANNEL 状态保持独立 sibling。 */
4466
4492
  type ImGroupConversationState = GroupSessionState;
4467
4493
  /**
@@ -4632,8 +4658,8 @@ interface ImConversationListSnapshot {
4632
4658
  * default 会话列表产品面。
4633
4659
  *
4634
4660
  * @remarks
4635
- * `list()` 保留 Phase 5 已验证的同步本地读模型;`getSnapshot/subscribe` 为普通宿主提供原子列表和总未读。
4636
- * 所有写动作只接受复合身份。`deleteLocal` 立即提交内存删除事件,但底层 durable 删除仍是异步 best-effort,
4661
+ * `list()` 同步读取本机会话;`getSnapshot/subscribe` 为普通宿主提供同一时刻的列表和总未读。
4662
+ * 所有写动作只接受复合身份。`deleteLocal` 立即提交内存删除事件,但底层存储删除仍异步执行,失败会报告错误,
4637
4663
  * 因此该方法不虚假返回代表“持久化已完成”的 Promise。
4638
4664
  *
4639
4665
  * @example
@@ -4695,6 +4721,17 @@ interface DirectConversationCapabilities {
4695
4721
  canUseMessageActions: CapabilityDecision;
4696
4722
  canManageRelationship: CapabilityDecision;
4697
4723
  }
4724
+ /** 客服只读能力;资料、发送和消息修改均不可用,历史读取仅限本机已接收消息。 */
4725
+ interface CustomerServiceConversationCapabilities {
4726
+ /** 客服号不可发送消息。 */
4727
+ canSendMessages: CapabilityDecision;
4728
+ /** 客服号没有好友或成员资料页。 */
4729
+ canOpenProfile: CapabilityDecision;
4730
+ /** 客服号不开放消息修改与转发等动作。 */
4731
+ canUseMessageActions: CapabilityDecision;
4732
+ /** 允许读取客服本机历史。 */
4733
+ canReadHistory: CapabilityDecision;
4734
+ }
4698
4735
  interface RobotConversationCapabilities {
4699
4736
  canSendMessages: CapabilityDecision;
4700
4737
  canOpenProfile: CapabilityDecision;
@@ -4769,6 +4806,8 @@ type ConversationCapabilitySnapshot = (ConversationCapabilityBase<'direct'> & {
4769
4806
  value: ChannelConversationCapabilities;
4770
4807
  }) | (ConversationCapabilityBase<'robot'> & {
4771
4808
  value: RobotConversationCapabilities;
4809
+ }) | (ConversationCapabilityBase<'customerService'> & {
4810
+ value: CustomerServiceConversationCapabilities;
4772
4811
  });
4773
4812
  interface ImConversationCapabilitiesApi {
4774
4813
  /** 只读取 SDK 当前本机真相与已刷新过的资料/关系投影,不隐式联网。 */
@@ -4920,7 +4959,7 @@ interface ImExpressionsApi {
4920
4959
  */
4921
4960
 
4922
4961
  /** 当前已接线的产品 handle 会话类型;三者只在无会话语义原子层复用。 */
4923
- type ProductHandleConversationType = 'direct' | 'group' | 'channel' | 'robot';
4962
+ type ProductHandleConversationType = 'direct' | 'group' | 'channel' | 'robot' | 'customerService';
4924
4963
  /**
4925
4964
  * 会话 handle 初始打开位置。
4926
4965
  *
@@ -4982,9 +5021,9 @@ interface ConversationHandleSnapshot<TType extends ProductHandleConversationType
4982
5021
  error?: ImSdkErrorShape;
4983
5022
  }
4984
5023
  /**
4985
- * 单条消息本机删除结果。
5024
+ * 单条消息的本机删除结果。
4986
5025
  *
4987
- * @remarks `scope` 永远是 `local-only`;该动作不发送撤回/双删命令,也不建立远端墓碑,因此重新加载远端历史可能恢复同一消息。
5026
+ * scope 固定为 local-only;该动作不发送撤回或双方删除命令,也不会让服务端标记删除,重新加载远端历史时可能再次出现同一消息。
4988
5027
  */
4989
5028
  interface LocalMessageDeletionResult {
4990
5029
  scope: 'local-only';
@@ -5257,8 +5296,8 @@ type ConversationMessageApiFor<TType extends ProductHandleConversationType> = TT
5257
5296
  /**
5258
5297
  * 绑定单个复合会话身份的产品级会话句柄。
5259
5298
  *
5260
- * @remarks 每次打开都持有独立连续窗口;`close()` 只释放瞬时窗口和订阅,不删除领域消息。direct/GROUP/CHANNEL
5261
- * 由各自 sibling 工厂接入;草稿属于 Phase 5。关闭后所有读取与动作均 fail-fast。
5299
+ * @remarks 每次打开都持有独立连续窗口;`close()` 只释放瞬时窗口和订阅,不删除领域消息。各会话类型
5300
+ * 使用各自工厂;草稿经 drafts API 维护。关闭后继续读取或执行动作都会立即报错。
5262
5301
  * @template TType 当前句柄绑定的精确会话类型。
5263
5302
  * @example
5264
5303
  * ```ts
@@ -5324,6 +5363,18 @@ interface ConversationHandle<TType extends ProductHandleConversationType = Produ
5324
5363
  close: () => void;
5325
5364
  }
5326
5365
 
5366
+ /** 只读客服号资料;账号由 SDK runtime 绑定,宿主只提供当前语言。 */
5367
+ interface ImCustomerServiceApi {
5368
+ /** 下载当前账号客服消息的指定文件;返回真实字节,不使用展示大小判断完成。 */
5369
+ downloadFile: (input: {
5370
+ messageId: string;
5371
+ itemIndex: number;
5372
+ signal?: AbortSignal;
5373
+ }) => Promise<Blob>;
5374
+ /** 获取并更新已有会话的显示资料;并发请求按语言合并,过期语言不覆盖当前页面。 */
5375
+ getProfile: (lang: number) => Promise<Readonly<CustomerServiceProfile>>;
5376
+ }
5377
+
5327
5378
  /**
5328
5379
  * SDK 对外的结构化诊断投影、过滤与 sink 装配。
5329
5380
  *
@@ -5436,7 +5487,7 @@ interface ImMediaTask {
5436
5487
  direction: 'upload' | 'download';
5437
5488
  /** 终态 completed/failed/canceled 不会被同一尝试的迟到 progress 回退。 */
5438
5489
  state: 'queued' | 'running' | 'paused' | 'completed' | 'failed' | 'canceled';
5439
- /** 0-100 的归一化整数。 */
5490
+ /** 范围为 0 到 100 的整数进度。 */
5440
5491
  percent: number;
5441
5492
  /**
5442
5493
  * upload 子阶段。
@@ -5619,7 +5670,7 @@ interface ImMediaTasksApi {
5619
5670
  * 可靠发送账本的产品查询、订阅、重试和取消门面。
5620
5671
  *
5621
5672
  * Core Outbox 是唯一发送真相;产品项只暴露消息身份、状态和安全错误,不泄漏尝试次数或恢复策略。
5622
- * 控制动作始终回到当前账号 connection,dispose 后旧订阅和晚返回结果失效,取消 queued 不等价于远端撤回。
5673
+ * 控制动作始终回到当前账号 connection,dispose 后旧订阅失效,随后返回的旧结果不再生效,取消 queued 不等价于远端撤回。
5623
5674
  */
5624
5675
 
5625
5676
  /** 产品可观察 Outbox 项;不包含正文、帧、ACK、attempts、加密信息或 resumePolicy。 */
@@ -6180,7 +6231,7 @@ interface ImMessageSearchApi {
6180
6231
  inDirect: (conversation: ConversationRef<'direct'>, keyword: string) => Promise<ProductMessageSearchPage<MessageContentType>>;
6181
6232
  /** 搜索 GROUP 本地历史;不得接受 CHANNEL ref 或回退 direct。 */
6182
6233
  inGroup: (conversation: ConversationRef<'group'>, keyword: string) => Promise<ProductMessageSearchPage<MessageContentType>>;
6183
- /** 搜索 CHANNEL 本地历史;当前不调用未闭合的远端 CHANNEL 搜索/定位协议。 */
6234
+ /** 搜索 CHANNEL 本地历史;当前不调用尚未确认的远端 CHANNEL 搜索/定位协议。 */
6184
6235
  inChannel: (conversation: ConversationRef<'channel'>, keyword: string) => Promise<ProductMessageSearchPage<MessageContentType>>;
6185
6236
  /** 搜索 robot 本地历史;无远端历史,不得回退 direct。 */
6186
6237
  inRobot: (conversation: ConversationRef<'robot'>, keyword: string) => Promise<ProductMessageSearchPage<MessageContentType>>;
@@ -6296,7 +6347,7 @@ interface ImEmojiCatalogEntry {
6296
6347
  *
6297
6348
  * 上传凭证由业务后端按登录态签发(与 iOS、prod H5 同一个接口),回包同时给出**物理桶**、区域、`key_prefix` 和
6298
6349
  * 公开访问域名;SDK 据此拼 object key 与消息体 URL,宿主 env 里配的只是申请凭证用的逻辑桶名。凭证缓存(本地
6299
- * 1 小时、按服务端过期时间提前 5 分钟失效)、同桶单飞与失败重签由 SDK 负责,宿主只需提供「打一次接口」的纯函数。
6350
+ * 1 小时、按服务端过期时间提前 5 分钟失效)、同桶并发请求复用和失败后重新签发由 SDK 负责,宿主只需提供「打一次接口」的纯函数。
6300
6351
  *
6301
6352
  * 默认单次 PUT/GET;仅 multipartTransfer=true 才允许大资源分片上传、下载。
6302
6353
  * 各 bucket 需在对象存储侧配置 CORS 允许本站 origin 的 PUT + GET;开启分片后,超过 16MiB 的上传另需放行
@@ -6375,6 +6426,7 @@ interface ImAccountAdapterContext extends ImClientAdapterContext {
6375
6426
  * @remarks create/purge 必须消费传入的 namespace factory;SDK 会先 close 返回的 storage,再调用 purge。
6376
6427
  */
6377
6428
  interface ImStorageAdapterFactory {
6429
+ /** 创建或复用当前运行环境的存储;返回 undefined 明确使用纯内存,即使浏览器支持 IndexedDB 也不启用默认库。 */
6378
6430
  create: (context: ImClientAdapterContext) => ImStoragePort | undefined;
6379
6431
  purgeCurrentAccount: (context: ImAccountAdapterContext) => Promise<void>;
6380
6432
  }
@@ -6465,7 +6517,7 @@ interface ImAdvancedClientOptions extends ImClientOptions {
6465
6517
  channelMembers?: ImChannelMemberPort;
6466
6518
  /** CHANNEL Mention 候选 provider;不复用 role-rich 成员治理列表。 */
6467
6519
  channelMentionMembers?: ImChannelMentionMemberPort;
6468
- /** CHANNEL 申请审核 provider;当前只装配已闭合的 18A 审核能力。 */
6520
+ /** CHANNEL 申请审核 provider;当前只装配已确认的 18A 审核能力。 */
6469
6521
  channelJoinApplications?: ImChannelJoinApplicationPort;
6470
6522
  /** 联系人申请 provider;与 GROUP/CHANNEL 审核 sibling 独立。 */
6471
6523
  contactApplications?: ImContactApplicationPort;
@@ -6522,7 +6574,7 @@ interface ImContactsApi extends ImDirectoryApi<'individual'> {
6522
6574
  * 发送好友申请。
6523
6575
  *
6524
6576
  * @remarks `remark` 是当前账号对目标用户设置的私有备注,按后端申请合同作为
6525
- * `remark_nick_name` 提交。SDK 不另存待处理副本;关系建立后从当前账号的权威好友资料收敛展示。
6577
+ * `remark_nick_name` 提交。SDK 不另存待处理副本;关系建立后从当前账号的权威好友资料读取并展示。
6526
6578
  */
6527
6579
  requestFriendship: (userId: string, options: {
6528
6580
  message: string;
@@ -6746,7 +6798,7 @@ interface AdvancedConversationsApi extends ImConversationsApi, ImConversationBac
6746
6798
  *
6747
6799
  * @internal
6748
6800
  */
6749
- ensureOpenableConversation: (ref: ConversationRef) => Promise<ConversationRef<'direct' | 'group' | 'channel' | 'robot'>>;
6801
+ ensureOpenableConversation: (ref: ConversationRef) => Promise<ConversationRef<'direct' | 'group' | 'channel' | 'robot' | 'customerService'>>;
6750
6802
  /**
6751
6803
  * 读取已有会话或本次账号内已校验的目标资料;返回值不代表列表成员资格。
6752
6804
  * @internal
@@ -6776,6 +6828,8 @@ interface ImProductClient {
6776
6828
  /** 当前账号完整联系人、群组和社群目录的统一搜索。 */
6777
6829
  readonly directory: ImDirectorySearchApi;
6778
6830
  /** 机器人公开目录;通讯录查找与群/社群绑定列表共用分页合同。 */
6831
+ /** 客服号只读资料能力。 */
6832
+ readonly customerService: ImCustomerServiceApi;
6779
6833
  readonly robots: ImRobotsApi;
6780
6834
  readonly contacts: ImContactsApi;
6781
6835
  readonly groups: ImGroupsApi;
@@ -6827,6 +6881,7 @@ interface ImClient extends Omit<ImProductClient, 'capabilities' | 'channels' | '
6827
6881
  (ref: ConversationRef<'group'>, options?: ConversationOpenOptions): Promise<ConversationHandle<'group'>>;
6828
6882
  (ref: ConversationRef<'channel'>, options?: ConversationOpenOptions): Promise<ConversationHandle<'channel'>>;
6829
6883
  (ref: ConversationRef<'robot'>, options?: ConversationOpenOptions): Promise<ConversationHandle<'robot'>>;
6884
+ (ref: ConversationRef<'customerService'>, options?: ConversationOpenOptions): Promise<ConversationHandle<'customerService'>>;
6830
6885
  };
6831
6886
  /** 当前账号草稿产品面;按复合身份持久化,handle.draft 委托同一状态源。 */
6832
6887
  drafts: ImDraftsApi;
@@ -6844,7 +6899,7 @@ interface ImClient extends Omit<ImProductClient, 'capabilities' | 'channels' | '
6844
6899
  contact: ImContactApi;
6845
6900
  /** 群域:群资料读取 + 修改群名/群头像/群内昵称。 */
6846
6901
  group: ImGroupApi;
6847
- /** CHANNEL 域:资料、成员治理与独立置顶能力;仍未闭合的动作不进入此门面。 */
6902
+ /** CHANNEL 域:资料、成员管理与独立置顶能力;尚未确认的动作不进入此门面。 */
6848
6903
  channel: ImChannelApi;
6849
6904
  /** 可观察媒体任务与按精确消息引用下载。 */
6850
6905
  media: ImMediaTasksApi;
@@ -6971,9 +7026,9 @@ type ImLocale = 'en-US' | 'th-TH' | 'vi-VN' | 'zh-CN' | 'zh-TW';
6971
7026
  */
6972
7027
 
6973
7028
  /**
6974
- * 命令/生命周期「操作提示」文案 key(formatServiceText 用;供 kit services / runtime 产语义码、宿主按 locale 渲染)。
6975
- * 二期收敛:kit 框架无关层不再直接产中文,改产本联合里的码 + 参数(如 {reason}/{label}/{size}),由宿主经 im-i18n 渲染。
6976
- * 动态原始报错(error.message)作为 `{reason}` 参数拼接,不入 catalog(属诊断,不翻译)。
7029
+ * 命令和生命周期操作提示的文案 key,供 formatServiceText 使用。
7030
+ * kit service/runtime 返回语义码与参数,由宿主根据语言生成文案。
7031
+ * 动态 error.message 作为 {reason} 参数,不纳入 catalog 翻译。
6977
7032
  */
6978
7033
  type ImServiceTextKey = 'common.notConnected' | 'common.selectOrOpenConversation' | 'common.conversationTypeNotReady' | 'common.conversationNotReady' | `recall.${RecallFailReason}` | `edit.${EditFailReason}` | 'localDelete.done' | 'localDelete.notFound' | 'localDelete.inFlight' | 'localDelete.failed' | 'channelDelete.notFound' | 'channelDelete.unsupported' | 'channelDelete.notSent' | 'channelDelete.unavailable' | 'channelDelete.forbidden' | 'channelDelete.timeout' | 'channelDelete.failed' | 'channelDelete.disconnected' | 'directBlock.contactRequired' | 'groupBlock.left' | 'groupBlock.removed' | 'groupBlock.dismissed' | 'groupBlock.unknownRestricted' | 'channelBlock.guest' | 'channelBlock.left' | 'channelBlock.removed' | 'channelBlock.dismissed' | 'channelBlock.muted' | 'channelBlock.allMembersMuted' | 'channelBlock.currentUserMuted' | 'channelBlock.blacklisted' | 'channelBlock.unknownRestricted' | 'channelProfile.loadFailed' | 'channelProfile.notFound' | 'channelProfile.retryAction' | 'channelMembers.title' | 'channelMembers.searchPlaceholder' | 'channelMembers.loading' | 'channelMembers.loadFailed' | 'channelMembers.retryAction' | 'channelMembers.empty' | 'channelMembers.loadingMore' | 'channelMembers.loadMoreFailed' | 'channelMembers.exhausted' | 'channelMembers.loadMoreAction' | 'label.image' | 'label.video' | 'label.file' | 'label.sticker' | 'send.failed' | 'send.retryFailed' | 'send.cancelFailed' | 'send.mediaFailed' | 'send.mediaEmpty' | 'send.mediaCancelled' | 'send.mediaCountLimit' | 'send.mediaTooLarge' | 'send.mediaFormatMismatch' | 'send.imageFormatUnsupported' | 'send.videoTooLong' | 'send.videoDurationUnavailable' | 'send.voiceEmpty' | 'send.voiceStorageNotConfigured' | 'send.voiceCancelled' | 'send.voiceFailed' | 'media.uploadWaiting' | 'media.voiceNotReady' | 'media.voiceLoadEmpty' | 'media.voiceLoadFailed' | 'media.videoOpenEmpty' | 'media.videoLoadFailed' | 'media.imageInvalid' | 'media.imageLoadFailed' | 'media.fileDownloadEmpty' | 'media.fileDownloadFailed' | 'conversation.muteEnableFailed' | 'conversation.muteDisableFailed' | 'conversation.backgroundLoadFailed' | 'read.markReadFailed' | 'storage.failed' | 'sync.failed' | 'draft.saveFailed' | 'history.returnLatestFailed' | 'pinned.forbidden' | 'pinned.network' | 'pinned.contract' | 'pinned.unsupported' | 'pinned.failed' | 'pinned.previewUnavailable' | 'pinned.locateFailed' | 'pinned.messageNotFound' | 'pinned.recalled' | 'pinned.deleted' | 'pinned.protected' | 'pinned.pinAction' | 'pinned.unpinAction' | 'pinned.unpinConfirm' | 'pinned.cancelAction' | 'lifecycle.missingLoginState' | 'lifecycle.prepareFailed' | 'lifecycle.missingConnectParams' | 'lifecycle.connectFailed' | 'lifecycle.disposed' | 'lifecycle.connectionOccupied' | 'lifecycle.connectionCoordinationUnavailable' | 'forward.emptyInput' | 'forward.allSkipped' | 'forward.partialSkipped' | 'forward.done' | 'forward.failed';
6979
7034
 
@@ -7102,7 +7157,7 @@ interface DelayedLoadingIndicatorOptions {
7102
7157
  clearTimer?: (timer: ReturnType<typeof setTimeout>) => void;
7103
7158
  }
7104
7159
  interface DelayedLoadingIndicator {
7105
- /** 同一 identity 延续当前计时;identity 变化会作废旧操作并重新开始。 */
7160
+ /** 同一 identity 继续当前计时;identity 改变后旧操作不再生效,并重新开始计时。 */
7106
7161
  update: (loading: boolean, identity: string) => void;
7107
7162
  /** 取消定时器并在必要时发出一次隐藏通知。 */
7108
7163
  dispose: () => void;
@@ -7113,7 +7168,7 @@ declare const DEFAULT_LOADING_MINIMUM_VISIBLE_MS = 220;
7113
7168
  * 将真实 loading 与可见提示分离。
7114
7169
  *
7115
7170
  * 快速完成的缓存读取不会显示提示;已经显示的提示会满足最短展示时间。identity 变化、关闭和
7116
- * dispose 都会取消旧定时器,避免上一条媒体的晚返状态影响当前预览。
7171
+ * dispose 都会取消旧定时器,避免上一条媒体随后返回的旧状态影响当前预览。
7117
7172
  */
7118
7173
  declare function createDelayedLoadingIndicator(options: DelayedLoadingIndicatorOptions): DelayedLoadingIndicator;
7119
7174
 
@@ -7838,7 +7893,7 @@ interface ConversationPrefetchController {
7838
7893
  * 页间重新等待宿主空闲调度,使置顶、未读、删除和活动会话变化及时影响下一页,
7839
7894
  * SDK 仍负责请求去重、前台优先与本次账号 Runtime 的网络总预算。
7840
7895
  * 同一 Client 下完成或失败的候选本轮不自动重试;取消项可在运行条件恢复后重新排队。
7841
- * reset/client 更换会作废旧请求,旧 Promise 完成后不能修改新账号的请求记录。
7896
+ * reset 或更换 client 后旧请求结果失效,旧 Promise 完成后不能修改新账号的请求记录。
7842
7897
  */
7843
7898
  declare function createConversationPrefetchController(options: ConversationPrefetchControllerOptions): ConversationPrefetchController;
7844
7899
 
@@ -8594,7 +8649,7 @@ declare function resolveChannelMembers(runtime: ChatRuntime, channelId: string,
8594
8649
  /**
8595
8650
  * 收到“普通群成员已改名”的系统消息后,重新读取该群成员昵称;不直接信任通知中的展示文本。
8596
8651
  *
8597
- * 本机写入的通知可能晚于写请求返回;宿主通过 `preserveUserIds` 明确保留仍存在的本地高水位。
8652
+ * 本机写入的通知可能晚于写请求返回;宿主通过 `preserveUserIds` 明确保留尚未被服务端查询确认的本机昵称。
8598
8653
  * 不能仅凭 `operatorId === self` 判断为本机写入,因为同账号其它设备改名也使用相同操作者。
8599
8654
  */
8600
8655
  declare function applyGroupMemberRename(runtime: ChatRuntime, message: AdvancedMessage, options?: {
@@ -8603,21 +8658,21 @@ declare function applyGroupMemberRename(runtime: ChatRuntime, message: AdvancedM
8603
8658
  /**
8604
8659
  * 把已经加载的普通群成员列表同步为消息气泡可查询的昵称表。
8605
8660
  *
8606
- * 输入成员可能已合并本地昵称投影,因此这里只同步展示,不把同值误判为服务端已收敛。
8661
+ * 输入成员可能已合并本地昵称投影,因此这里只同步展示,不能因值相同就认定服务端已返回最新昵称。
8607
8662
  */
8608
8663
  declare function applyMemberNames(runtime: ChatRuntime, groupId: string, members: readonly GroupMember[]): void;
8609
8664
  /**
8610
- * 写请求成功后只更新普通群昵称的共享展示投影。
8665
+ * 写请求成功后只更新普通群昵称的共享展示数据。
8611
8666
  *
8612
- * 成员列表、消息气泡和 GROUP `@` 候选都读取 Runtime 的这份映射,因此这里原子替换单个成员即可
8613
- * 让三个消费者同步收敛;后续完整成员回源会在服务端返回相同值后自动解除保护。
8667
+ * 成员列表、消息气泡和 GROUP `@` 候选都读取 Runtime 的这份映射,因此更新单个成员后即可
8668
+ * 让这些界面立即显示同一昵称;后续完整成员查询返回相同值后自动解除本机保护。
8614
8669
  */
8615
8670
  declare function applyGroupMemberNickname(runtime: ChatRuntime, groupId: string, userId: string, nickname: string): void;
8616
8671
  /**
8617
- * 清理一个群的本地昵称高水位。
8672
+ * 清理一个群的本机昵称保护记录。
8618
8673
  *
8619
- * `clearCachedNames` 只在资料权威确认账号已退出/群已不存在时使用:此时旧群昵称不能继续作为新加入
8620
- * 或同 ID 会话的当前投影。普通外部改名仍只清理高水位,随后由强刷结果更新完整成员名称缓存。
8674
+ * 只有资料接口确认账号已退出或群已不存在时,才使用 clearCachedNames 同时清空已缓存的群昵称,避免影响重新加入的会话。
8675
+ * 收到其他设备改名时只清除保护记录,完整成员名称由强制刷新后的结果更新。
8621
8676
  */
8622
8677
  declare function clearGroupMemberNicknameProjection(runtime: ChatRuntime, groupId: string, options?: {
8623
8678
  clearCachedNames?: boolean;
@@ -8809,7 +8864,7 @@ interface ImMediaBatchSendResult {
8809
8864
  selectedCount: number;
8810
8865
  /** 实际进入逐项发送流程的数量。 */
8811
8866
  processedCount: number;
8812
- /** `sendMediaFile` 返回成功、且仍属于原账号代际的数量。 */
8867
+ /** sendMediaFile 返回成功,且操作结束时仍处于同一账号版本的项目数量。 */
8813
8868
  acceptedCount: number;
8814
8869
  /** 是否因为单批数量上限忽略了部分选择。 */
8815
8870
  rejectedByLimit: boolean;
@@ -9251,10 +9306,10 @@ declare function createNewMessageBadgeController(onCountChange?: NewMessageBadge
9251
9306
  /** Surface renderer registry 可接收的稳定消息正文种类。 */
9252
9307
  type ImMessageBodyKind = MessageContentType | 'gif' | 'decrypt-failed';
9253
9308
  /**
9254
- * 把 SDK 归一化消息解析为唯一正文 renderer kind。
9309
+ * 把 SDK 统一格式的消息解析为唯一正文 renderer kind。
9255
9310
  *
9256
9311
  * 解密失败优先于正文类型;已注册类型结构不完整时返回 `unknown`,避免一条坏消息中断整个线程。
9257
- * GIF 只依据 SDK 归一化后的 sticker `imageType` 判断,不解析 URL 后缀或协议原始字段。
9312
+ * GIF 只依据 SDK 转换后的 sticker `imageType` 判断,不解析 URL 后缀或协议原始字段。
9258
9313
  */
9259
9314
  declare function resolveMessageBodyKind(message: ImMessageView): ImMessageBodyKind;
9260
9315