From b64a0deae5b5d33f9e20671a68936b27f0b9b00b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 21 七月 2026 18:03:03 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro2.0' into dev_pro2.0

---
 src/views/im/utils/constants.ts |  296 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 296 insertions(+), 0 deletions(-)

diff --git a/src/views/im/utils/constants.ts b/src/views/im/utils/constants.ts
new file mode 100644
index 0000000..895571e
--- /dev/null
+++ b/src/views/im/utils/constants.ts
@@ -0,0 +1,296 @@
+/** IM 鍐呭绫诲瀷鏋氫妇锛堝榻愬悗绔� ImContentTypeEnum锛� */
+export const ImContentType = {
+  // ========== 鐢ㄦ埛鑱婂ぉ娑堟伅锛�101-105 鐩存帴澶嶇敤 OpenIM 娈典綅缂栧彿锛� ==========
+  TEXT: 101, // 鏂囨湰锛堝搴� OpenIM Text=101锛�
+  IMAGE: 102, // 鍥剧墖锛堝搴� OpenIM Picture=102锛�
+  VOICE: 103, // 璇煶锛堝搴� OpenIM Sound=103锛�
+  VIDEO: 104, // 瑙嗛锛堝搴� OpenIM Video=104锛�
+  FILE: 105, // 鏂囦欢锛堝搴� OpenIM File=105锛�
+  MERGE: 107, // 鍚堝苟杞彂锛堝搴� OpenIM Merger=107锛沺ayload 鍐呭祵瀹屾暣蹇収锛�
+  CARD: 108, // 鍚嶇墖锛堝搴� OpenIM Card=108锛�
+  FACE: 115, // 琛ㄦ儏璐村浘锛堝搴� OpenIM Face=115锛沀nicode emoji 浠嶈蛋 TEXT锛�
+  // ========== 棰戦亾娑堟伅鎵╁睍娈碉紙125+锛汷penIM 122 涔嬪悗鏈崰鐢紝浣滀负棰戦亾 / 鍏紬鍙风被娑堟伅鎵╁睍锛� ==========
+  MATERIAL: 125, // 棰戦亾绱犳潗锛堝浘鏂囧崱鐗囷細title + coverUrl + summary + url锛涜鎯呮媺 get-content锛�
+  // ========== 淇″彿绫伙紙2101 / 2200 鐩存帴澶嶇敤 OpenIM 娈典綅缂栧彿锛�2201 鑷湁鎵╁睍锛� ==========
+  RECALL: 2101, // 鎾ゅ洖锛堝搴� OpenIM RevokeNotification=2101锛�
+  RECEIPT: 2200, // 鍥炴墽锛堝搴� OpenIM HasReadReceipt=2200锛�
+  READ: 2201, // 宸茶锛堝绔悓姝ワ紝OpenIM 鏃犲搴旓紱鑷湁鎵╁睍锛�
+  // ========== 瀹炴椂閫氳瘽淇′护锛�1601-1605 娈典綅涓� OpenIM 瀵归綈锛�1610+ 鑷湁鎵╁睍锛� ==========
+  RTC_CALL: 1601, // 閫氳瘽淇′护缁熶竴鍏ュ彛锛堝搴� OpenIM SignalingNotification=1601锛�
+  RTC_PARTICIPANT_CONNECTED: 1602, // 閫氳瘽鍙備笌鑰呭姞鍏ワ紙瀵瑰簲 OpenIM RoomParticipantsConnectedNotification=1602锛�
+  RTC_PARTICIPANT_DISCONNECTED: 1603, // 閫氳瘽鍙備笌鑰呯寮�锛堝搴� OpenIM RoomParticipantsDisconnectedNotification=1603锛�
+  // 1604-1609 OpenIM 宸茬敤 / 鐣欎綔鎵╁睍锛屾湰绯荤粺鏆備笉浣跨敤
+  RTC_CALL_START: 1610, // 閫氳瘽寮�濮嬶紙鑷湁鎵╁睍锛孫penIM 鏃狅紱浠呯兢鑱婏紱涓� END 涓ゆ寮忛厤瀵癸級
+  RTC_CALL_END: 1611, // 閫氳瘽缁撴潫锛堣嚜鏈夋墿灞曪紝OpenIM 鏃狅紱绉佽亰 / 缇よ亰锛�
+  // ========== 濂藉弸閫氱煡锛�1201-1210 鐩存帴澶嶇敤 OpenIM 娈典綅缂栧彿锛� ==========
+  FRIEND_REQUEST_APPROVED: 1201, // 濂藉弸鐢宠琚悓鎰�
+  FRIEND_REQUEST_REJECTED: 1202, // 濂藉弸鐢宠琚嫆缁�
+  FRIEND_REQUEST_RECEIVED: 1203, // 鏀跺埌鏂扮殑濂藉弸鐢宠
+  FRIEND_ADD: 1204, // 鏂板濂藉弸锛堝弻鏂瑰缓绔嬪叧绯伙級
+  FRIEND_DELETE: 1205, // 濂藉弸琚垹闄�
+  // 1206 瀵瑰簲 OpenIM FriendRemarkSetNotification锛涙湰绯荤粺骞跺叆 FRIEND_UPDATE(1210) 缁熶竴鎺ㄩ�侊紝鍗曚竴瀛楁鍙樻洿涓嶅啀鐙珛閫氶亾
+  FRIEND_BLOCK: 1207, // 鍔犲叆榛戝悕鍗�
+  FRIEND_UNBLOCK: 1208, // 绉诲嚭榛戝悕鍗�
+  FRIEND_INFO_UPDATED: 1209, // 濂藉弸璧勬枡鍙樻洿锛堟樀绉� / 澶村儚锛�
+  FRIEND_UPDATE: 1210, // 濂藉弸淇℃伅鎵归噺鏇存柊锛坰ilent / pinned锛�
+  // ========== 缇や簨浠讹紙1501-1520 鐩存帴澶嶇敤 OpenIM 娈典綅缂栧彿锛�1530+ 鑷湁鎵╁睍娈碉級 ==========
+  GROUP_CREATE: 1501, // 缇ゅ垱寤�
+  GROUP_INFO_UPDATE: 1502, // 缇や俊鎭彉鏇达紙NAME / NOTICE 涔嬪瀛楁鍏滃簳锛�
+  GROUP_REQUEST_RECEIVED: 1503, // 鏀跺埌鏂扮殑鍏ョ兢鐢宠锛堢鑱婂畾鍚戞帹閫佺粰缇や富 + 鍏ㄩ儴绠$悊鍛橈級
+  GROUP_MEMBER_QUIT: 1504, // 鎴愬憳閫�缇�
+  GROUP_REQUEST_APPROVED: 1505, // 鍏ョ兢鐢宠琚悓鎰忥紙绉佽亰鎺ㄧ粰鐢宠浜� + 缇や富 + 鍏ㄩ儴绠$悊鍛橈級
+  GROUP_REQUEST_REJECTED: 1506, // 鍏ョ兢鐢宠琚嫆缁濓紙鍚屼笂锛�
+  GROUP_OWNER_TRANSFER: 1507, // 缇や富杞
+  GROUP_MEMBER_KICK: 1508, // 鎴愬憳琚Щ鍑�
+  GROUP_MEMBER_INVITE: 1509, // 鎴愬憳鍔犲叆
+  GROUP_MEMBER_ENTER: 1510, // 鑷敱杩涚兢锛團REE 妯″紡鎴栫敵璇烽�氳繃鍚庯紱鍏ㄥ憳骞挎挱锛�
+  GROUP_DISSOLVE: 1511, // 缇よВ鏁�
+  GROUP_MEMBER_MUTED: 1512, // 鍗曟垚鍛樼瑷�
+  GROUP_MEMBER_CANCEL_MUTED: 1513, // 鍗曟垚鍛樺彇娑堢瑷�
+  GROUP_MUTED: 1514, // 鍏ㄧ兢绂佽█
+  GROUP_CANCEL_MUTED: 1515, // 鍏ㄧ兢鍙栨秷绂佽█
+  GROUP_MEMBER_NICKNAME_UPDATE: 1516, // 鎴愬憳鏄电О鍙樻洿锛堢獎鍖栧埌 displayUserName锛�
+  GROUP_ADMIN_ADD: 1517, // 娣诲姞绠$悊鍛�
+  GROUP_ADMIN_REMOVE: 1518, // 鎾ら攢绠$悊鍛�
+  GROUP_NOTICE_UPDATE: 1519, // 缇ゅ叕鍛婂彉鏇�
+  GROUP_NAME_UPDATE: 1520, // 缇ゅ悕鍙樻洿
+  // ========== 鑷湁鎵╁睍娈碉紙1530+锛孫penIM 1500-1520 娈典綅鏃犲搴旂墿锛� ==========
+  GROUP_MEMBER_SETTING_UPDATE: 1530, // 缇ゆ垚鍛樹釜浜鸿缃彉鏇达細silent / groupRemark 涓汉澶氱鍚屾
+  GROUP_MESSAGE_PIN: 1531, // 缇ゆ秷鎭疆椤讹紙鑷湁鎵╁睍锛孫penIM 鏃狅級
+  GROUP_MESSAGE_UNPIN: 1532, // 缇ゆ秷鎭彇娑堢疆椤讹紙鑷湁鎵╁睍锛孫penIM 鏃狅級
+  GROUP_BANNED: 1533 // 缇ゅ皝绂佸彉鏇达紙鑷湁鎵╁睍锛孫penIM 鏃狅級
+} as const
+
+/** 鍒ゆ柇鏄惁銆岀兢骞挎挱浜嬩欢銆嶏細[GROUP_CREATE, GROUP_BANNED] 娈典綅閮界畻锛屼粎 GROUP_MEMBER_SETTING_UPDATE 鏄釜浜轰俊鍙锋帓闄� */
+export function isGroupNotification(type: number): boolean {
+  return (
+    type >= ImContentType.GROUP_CREATE &&
+    type <= ImContentType.GROUP_BANNED &&
+    type !== ImContentType.GROUP_MEMBER_SETTING_UPDATE
+  )
+}
+
+/** 鍒ゆ柇鏄惁銆屽ソ鍙嬮�氱煡浜嬩欢銆嶏細1201-1210 娈典綅 */
+export function isFriendNotification(type: number): boolean {
+  return type >= ImContentType.FRIEND_REQUEST_APPROVED && type <= ImContentType.FRIEND_UPDATE
+}
+
+/** 鍒ゆ柇鏄惁銆屽姞缇ょ敵璇烽�氱煡浜嬩欢銆嶏細1503/1505/1506 */
+export function isGroupRequestNotification(type: number): boolean {
+  return (
+    type === ImContentType.GROUP_REQUEST_RECEIVED ||
+    type === ImContentType.GROUP_REQUEST_APPROVED ||
+    type === ImContentType.GROUP_REQUEST_REJECTED
+  )
+}
+
+/** 鍒ゆ柇鏄惁銆屼細璇濆唴鐨勫ソ鍙嬩簨浠舵皵娉°�嶏細FRIEND_ADD / FRIEND_DELETE 鐩存帴娓叉煋鎴愮伆鑹叉彁绀猴紝涓庣兢浜嬩欢鍚屽鐞� */
+export function isFriendChatTip(type: number): boolean {
+  return type === ImContentType.FRIEND_ADD || type === ImContentType.FRIEND_DELETE
+}
+
+/** 鍒ゆ柇鏄惁銆屼細璇濆唴鐨勯�氳瘽浜嬩欢姘旀场銆嶏細RTC_CALL_START / RTC_CALL_END 娓叉煋鎴愮伆鑹叉彁绀� */
+export function isRtcCallTip(type: number): boolean {
+  return type === ImContentType.RTC_CALL_START || type === ImContentType.RTC_CALL_END
+}
+
+/**
+ * IM 鏅�氬唴瀹圭被鍨嬮泦鍚堬紙normal vs event 浜屽垎锛涗笌鍚庣 ImContentTypeEnum.normal 瀛楁璇箟涓�鑷达級
+ *
+ * 杩欎釜闆嗗悎鍦ㄥ澶勮澶嶇敤锛屾柊澧炵被鍨嬪墠鍏堢‘璁ゆ墍鏈夊壇浣滅敤閮界鍚堥鏈燂細
+ * 1. 鍚庣鍙戦�佸叆鍙f牎楠岋紙Im{Private,Group}MessageSendReqVO.isNormalType锛夆�斺�� 鐢ㄦ埛鍙戦�佺殑鍐呭绫诲瀷蹇呴』 normal=true
+ * 2. 鍓嶇鎺ユ敹渚ф湭璇� / 鎻愮ず闊筹紙websocketStore锛夆�斺�� normal 娑堟伅璁″叆浼氳瘽鏈鏁� + 瑙﹀彂澹伴煶
+ * 3. 鍓嶇浼氳瘽鍒楄〃 lastType / @ 鏍囩锛圕onversationItem锛夆�斺�� 鍙湁 normal 鎵嶇畻銆屾渶鍚庝竴鏉¤亰澶╂秷鎭��
+ * 4. 鍓嶇缇ゆ秷鎭疆椤惰彍鍗曪紙message-item.vue 鐨� canPin锛夆�斺�� normal 鎵嶅厑璁哥兢涓� / 绠$悊鍛樼疆椤�
+ *
+ * 鍚嶇墖锛圕ARD锛�/ 琛ㄦ儏锛團ACE锛夐兘鏄�岀敤鎴蜂富鍔ㄥ彂鐨勮亰澶╂秷鎭�嶏紝1/2/3 閮界鍚堥鏈燂紱4 鍚屾椂鏀惧紑 = 缇や富鍙疆椤讹紝璇箟鍚堢悊
+ */
+const ImContentTypeNormals = new Set<number>([
+  ImContentType.CARD,
+  ImContentType.FACE,
+  ImContentType.FILE,
+  ImContentType.IMAGE,
+  ImContentType.MATERIAL, // 棰戦亾绱犳潗璁″叆鏈鏁� + 杩涗細璇濆垪琛�
+  ImContentType.MERGE,
+  ImContentType.TEXT,
+  ImContentType.VIDEO,
+  ImContentType.VOICE
+])
+
+/** 鍒ゆ柇鏄惁"鏅�氭秷鎭�" */
+export function isNormalMessage(type: number): boolean {
+  return ImContentTypeNormals.has(type)
+}
+
+/** IM 濯掍綋鍐呭绫诲瀷闆嗗悎锛氬彂閫佷緷璧栨湰鍦� File 涓婁紶锛屽埛鏂板悗 _localFile 涓㈠け鍗充笉鍙仮澶� */
+const ImContentTypeMedia = new Set<number>([
+  ImContentType.FILE,
+  ImContentType.IMAGE,
+  ImContentType.VIDEO,
+  ImContentType.VOICE
+])
+
+/** 鍒ゆ柇鏄惁銆屽獟浣撴秷鎭�嶏細鍥剧墖 / 鏂囦欢 / 璇煶 / 瑙嗛 */
+export function isMediaMessageType(type: number): boolean {
+  return ImContentTypeMedia.has(type)
+}
+
+/**
+ * IM 娑堟伅鐘舵�佹灇涓撅紙瀵归綈鍚庣 ImMessageStatusEnum锛屽墠绔墿灞� SENDING + FAILED锛�
+ *
+ * 鐢熷懡鍛ㄦ湡锛欶AILED(-2) 鈫� SENDING(-1) 鈫� NORMAL(0) 鈫� RECALL(2)
+ */
+export const ImMessageStatus = {
+  FAILED: -2, // 鍙戦�佸け璐ワ紙鍓嶇鐙湁锛�
+  SENDING: -1, // 鍙戦�佷腑锛堝墠绔嫭鏈夛級
+  NORMAL: 0, // 姝e父
+  RECALL: 2 // 宸叉挙鍥�
+} as const
+
+/** IM 浼氳瘽绫诲瀷鏋氫妇 */
+export const ImConversationType = {
+  NONE: 0, // 鏃犱細璇�
+  PRIVATE: 1, // 绉佽亰
+  GROUP: 2, // 缇よ亰
+  CHANNEL: 3 // 棰戦亾 / 鍏紬鍙�
+} as const
+
+/** ImConversationType 鍙栧�硷紙鐢ㄤ簬娑堟伅 payload 瀛楁绫诲瀷鏀剁獎锛� */
+export type ImConversationTypeValue = (typeof ImConversationType)[keyof typeof ImConversationType]
+
+/** 鏄惁绉佽亰浼氳瘽锛涘悓鏃舵敹绐勭被鍨� */
+export function isPrivateConversation(type: number | undefined): boolean {
+  return type === ImConversationType.PRIVATE
+}
+
+/** 鏄惁缇よ亰浼氳瘽锛涘悓鏃舵敹绐勭被鍨� */
+export function isGroupConversation(type: number | undefined): boolean {
+  return type === ImConversationType.GROUP
+}
+
+/** 鏄惁棰戦亾浼氳瘽锛涘悓鏃舵敹绐勭被鍨� */
+export function isChannelConversation(type: number | undefined): boolean {
+  return type === ImConversationType.CHANNEL
+}
+
+/** IM 閫氳瘽濯掍綋绫诲瀷锛堝榻愬悗绔� ImRtcCallMediaTypeEnum锛� */
+export const ImRtcCallMediaType = {
+  VOICE: 1,
+  VIDEO: 2
+} as const
+
+/** IM 閫氳瘽鐘舵�侊紙瀵归綈鍚庣 ImRtcCallStatusEnum锛� */
+export const ImRtcCallStatus = {
+  CREATED: 10, // 鍒涘缓锛氱鑱婄瓑琚彨鎺ュ惉锛涚兢鑱婂彂璧蜂汉宸茶繘鎴跨瓑鍏朵粬浜哄姞鍏�
+  RUNNING: 20, // 杩涜涓細绗竴涓潪鍙戣捣浜烘帴閫氬悗杩涘叆
+  ENDED: 30 // 宸茬粨鏉�
+} as const
+
+/** IM 閫氳瘽缁撴潫鍘熷洜锛堝榻愬悗绔� ImRtcCallEndReasonEnum锛� */
+export const ImRtcCallEndReason = {
+  HANGUP: 1, // 鎺ラ�氬悗浠讳竴鏂逛富鍔ㄦ寕鏂�
+  REJECT: 2, // 琚彨鎺ラ�氬墠鐐规嫆鎺�
+  CANCEL: 3, // 涓诲彨鎺ラ�氬墠涓诲姩鍙栨秷
+  NO_ANSWER: 4, // 鎸搩瓒呮椂鏈帴閫�
+  BUSY: 5, // 绉佽亰鍛煎彨鏃跺鏂规蹇�
+  ERROR: 9 // 缃戠粶涓柇 / 璁惧澶辫触
+} as const
+
+/** ImRtcCallEndReason 鍙栧�肩被鍨� */
+export type ImRtcCallEndReasonValue = (typeof ImRtcCallEndReason)[keyof typeof ImRtcCallEndReason]
+
+/** IM 閫氳瘽鍙備笌鑰呯姸鎬侊紙瀵归綈鍚庣 ImRtcParticipantStatusEnum锛夛紱鍚屾椂浣滀负 RTC_CALL 淇′护 status 瀛楁鍙栧�� */
+export const ImRtcParticipantStatus = {
+  INVITING: 10, // 鏉ョ數閭�璇�
+  JOINED: 20, // 鎺ュ惉 / 宸插姞鍏�
+  REJECTED: 30, // 鎷掓帴
+  NO_ANSWER: 40, // 涓诲彨鍙栨秷锛岃閭�璇锋柟鏈簲绛�
+  LEFT: 50 // 鎸傛柇绂诲紑
+} as const
+
+/** ImRtcParticipantStatus 鍙栧�肩被鍨� */
+export type ImRtcParticipantStatusValue =
+  (typeof ImRtcParticipantStatus)[keyof typeof ImRtcParticipantStatus]
+
+/**
+ * IM 閫氳瘽 UI 闃舵锛涘墠绔嫭鏈夛紝鐢ㄤ簬椹卞姩 inviting / incoming / running 涓夌寮圭獥鍒囨崲锛�
+ * 璺熷悗绔� ImRtcCallStatus 涓嶆槸 1:1 鏄犲皠锛宻tage 澶氫簡銆岃嚜宸辨槸涓诲彨杩樻槸琚彨銆嶇殑瑙掕壊缁村害
+ */
+export const ImRtcCallStage = {
+  IDLE: 'idle', // 绌洪棽锛涘悗绔棤瀵瑰簲锛堟湰绔棤娲昏穬閫氳瘽锛�
+  INVITING: 'inviting', // 涓诲彨绛夊緟瀵规柟鎺ュ彈锛涘搴斿悗绔� ImRtcCallStatus.CREATED锛堣嚜宸辨槸涓诲彨锛�
+  INCOMING: 'incoming', // 琚彨鏉ョ數鍝嶉搩锛涘搴斿悗绔� ImRtcCallStatus.CREATED锛堣嚜宸辨槸琚彨锛�
+  RUNNING: 'running' // 閫氳瘽涓紱瀵瑰簲鍚庣 ImRtcCallStatus.RUNNING
+} as const
+
+/** ImRtcCallStage 鍙栧�肩被鍨� */
+export type ImRtcCallStageValue = (typeof ImRtcCallStage)[keyof typeof ImRtcCallStage]
+
+/** IM WebSocket 澶栧眰甯х被鍨� */
+export const ImWebSocketMessageType = {
+  NOTIFICATION: 'im-notification' // IM 閫氱煡
+} as const
+
+/** IM 娑堟伅鍥炴墽鐘舵�佹灇涓撅紙瀵归綈鍚庣 ImMessageReceiptStatusEnum锛� */
+export const ImMessageReceiptStatus = {
+  NO_RECEIPT: 0, // 涓嶉渶瑕佸洖鎵�
+  PENDING: 1, // 寰呭畬鎴�
+  DONE: 2 // 宸插畬鎴�
+} as const
+
+/** 缇ゆ垚鍛樿鑹诧紙瀵归綈鍚庣 ImGroupMemberRoleEnum锛� */
+export const ImGroupMemberRole = {
+  OWNER: 1, // 缇や富
+  ADMIN: 2, // 绠$悊鍛�
+  NORMAL: 3 // 鏅�氭垚鍛�
+} as const
+
+/** 鍔犵兢鏉ユ簮锛堝榻愬悗绔� ImGroupAddSourceEnum锛� */
+export const ImGroupAddSource = {
+  SEARCH: 1, // 鎼滅储
+  INVITE: 2, // 閭�璇�
+  QR_CODE: 3, // 鎵爜
+  SHARE_LINK: 4 // 鍒嗕韩閾炬帴
+} as const
+
+/** 鍔犵兢鐢宠澶勭悊缁撴灉锛堝榻愬悗绔� ImGroupRequestHandleResultEnum锛� */
+export const ImGroupRequestHandleResult = {
+  UNHANDLED: 0, // 鏈鐞�
+  AGREED: 1, // 鍚屾剰
+  REFUSED: 2 // 鎷掔粷
+} as const
+
+/** 濂藉弸娣诲姞鏉ユ簮锛堝榻愬悗绔� ImFriendAddSourceEnum锛� */
+export const ImFriendAddSource = {
+  SEARCH: 1, // 鎼滅储
+  GROUP: 2, // 缇よ亰
+  QR_CODE: 3, // 鎵爜
+  CARD: 4 // 鍚嶇墖
+} as const
+
+/** 濂藉弸鐢宠澶勭悊缁撴灉锛堝榻愬悗绔� ImFriendRequestHandleResultEnum锛� */
+export const ImFriendRequestHandleResult = {
+  UNHANDLED: 0, // 鏈鐞�
+  AGREED: 1, // 鍚屾剰
+  REFUSED: 2 // 鎷掔粷
+} as const
+
+/**
+ * @鍏ㄤ綋鎴愬憳 鐨勭壒娈� userId 鏍囪瘑锛歛tUserIds 涓寘鍚� -1 琛ㄧず @ 鍏ㄤ綋鎴愬憳
+ *
+ * 涓庡悗绔害瀹氾細缇ゆ秷鎭� atUserIds 鏁扮粍閲屽嚭鐜� -1 鏃讹紝鎵�鏈夋垚鍛橀兘鏀跺埌鎻愰啋
+ * MentionPicker 娓叉煋铏氭嫙椤� + conversationStore.applyAt 鍒ゅ畾 atAll 閮介潬杩欎釜鍊�
+ */
+export const IM_AT_ALL_USER_ID = -1
+
+/** @鍏ㄤ綋鎴愬憳 鐨勫睍绀哄悕锛堝榻愬井淇� PC锛� */
+export const IM_AT_ALL_NICKNAME = '鎵�鏈変汉'
+
+/** 杞彂妯″紡锛歋INGLE 閫愭潯鍘熸牱杞� / MERGE 鎵撳寘鎴� MergeMessage */
+export const ImForwardMode = {
+  SINGLE: 'single',
+  MERGE: 'merge'
+} as const
+
+/** ImForwardMode 鍙栧�肩被鍨� */
+export type ImForwardModeValue = (typeof ImForwardMode)[keyof typeof ImForwardMode]

--
Gitblit v1.9.3