@vibexnpm/talkx 3.2.2 → 4.0.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.
package/dist/index.d.ts CHANGED
@@ -71,9 +71,8 @@ export const SignalTypes: {
71
71
 
72
72
  /**
73
73
  * SDK 가 런타임에 export 하는 ChatMessageType 상수.
74
- * <p><b>런타임 소스와 정확히 일치</b>: {@code src/constants.js} 에 정의된 6개 값만 포함.
75
- * {@code DOCUMENT / GALLERY} 는 SDK 상수에 없음 — 서버 응답 메시지의 {@code chatMessageType}
76
- * 필드로는 수신될 수 있으므로 {@link ChatMessageTypeValue} 는 해당 값을 포함한 union.</p>
74
+ * <p><b>{@code src/constants.js} 와 정확히 일치해야 한다</b> — 한쪽만 늘리면 소비자가 존재하는 상수를
75
+ * 못 쓰거나(누락) 없는 상수를 참조한다(초과).</p>
77
76
  */
78
77
  export const ChatMessageType: {
79
78
  readonly TEXT: 'TEXT';
@@ -81,17 +80,46 @@ export const ChatMessageType: {
81
80
  readonly FILE: 'FILE';
82
81
  readonly VIDEO: 'VIDEO';
83
82
  readonly AUDIO: 'AUDIO';
83
+ readonly DOCUMENT: 'DOCUMENT';
84
+ /** 서로 다른 카테고리의 첨부가 섞인 메시지 (예: 이미지 2 + PDF 1). */
85
+ readonly MIXED: 'MIXED';
86
+ /**
87
+ * @deprecated 복수 첨부(타입 무관)를 뜻하던 과거 값. 신규 저장에서는 생성되지 않지만 기존 데이터에 남아 있다.
88
+ * {@link ChatClient.resolveMessageCategory} 로 복원할 것.
89
+ */
90
+ readonly GALLERY: 'GALLERY';
84
91
  readonly SYSTEM: 'SYSTEM';
85
92
  };
86
93
 
87
94
  /**
88
- * 서버가 보낼 수 있는 메시지 타입 값 전체.
89
- * <p>SDK 상수 ({@link ChatMessageType}) 의 6개 값 + 서버에서만 쓰는 {@code DOCUMENT / GALLERY}.
90
- * 수신 {@link ChatMessage#chatMessageType} 비교 시 이 union 을 사용.</p>
95
+ * AI 의사결정 카드 렌더 상한 — 서버가 강제하는 값의 사본(참고용, 클라 검증 불필요).
96
+ *
97
+ * <p>🔴 카드는 <b>새 {@code chatMessageType} 이 아니다</b> — 타입은 {@code TEXT} 이고 선택 요청은
98
+ * {@link ChatMessage#decisionRequest} 필드로 온다. 모르는 렌더러는 텍스트로 그리면 되고 그게 정상이다.
99
+ * 카드를 그린다면 {@code content} 를 다시 그리지 마라(같은 내용이 두 번 보인다).</p>
100
+ */
101
+ export const DecisionCardLimits: {
102
+ readonly MIN_OPTIONS: 2;
103
+ readonly MAX_OPTIONS: 5;
104
+ readonly LABEL_MAX_LENGTH: 80;
105
+ readonly QUESTION_MAX_LENGTH: 200;
106
+ };
107
+
108
+ /**
109
+ * 서버가 보낼 수 있는 메시지 타입 값 전체 — {@link ChatMessageType} 상수와 같은 집합.
110
+ * <p>수신 {@link ChatMessage#chatMessageType} 비교 시 이 union 을 사용한다.</p>
91
111
  */
92
112
  export type ChatMessageTypeValue =
93
113
  | 'TEXT' | 'IMAGE' | 'FILE' | 'VIDEO' | 'AUDIO' | 'SYSTEM'
94
- | 'DOCUMENT' | 'GALLERY';
114
+ | 'DOCUMENT'
115
+ /** 서로 다른 카테고리의 첨부가 섞인 메시지 (예: 이미지 2 + PDF 1). 전송 1회 = 메시지 1건 계약의 신규 값. */
116
+ | 'MIXED'
117
+ /**
118
+ * @deprecated 복수 첨부(타입 무관)를 뜻하던 과거 값. 신규 저장에서는 생성되지 않지만 기존 데이터에 남아 있다.
119
+ * 동영상·문서 복수도 전부 이 값이므로 `IMAGE` 로 매핑하면 안 되고,
120
+ * {@link ChatClient.resolveMessageCategory} 로 `fileMetaDataList` 의 MIME 에서 복원해야 한다.
121
+ */
122
+ | 'GALLERY';
95
123
 
96
124
  export const ChatRoomType: {
97
125
  readonly DIRECT: 'DIRECT';
@@ -568,6 +596,17 @@ export type FileCustomMetadata = { [key: string]: JsonValue };
568
596
 
569
597
  /** 파일 메타데이터 (이미지/영상/오디오/문서). */
570
598
  export interface FileMetaData {
599
+ /**
600
+ * 첨부 식별자 — **서버 `uploadFile` 이 발급한 UUID 를 그대로 실어야 한다**.
601
+ *
602
+ * <p>서버가 이 값을 첨부 좌표(문서 추출 캐시 키)로 쓰기 때문에, 병합 저장이 켜진 서버에서는
603
+ * **UUID 형식 + 메시지 내 유일**이 필수다(위반 시 400). `uploadFile` / `sendFileMessage` 경로는
604
+ * 서버 응답을 그대로 전달하므로 신경 쓸 것이 없다.</p>
605
+ *
606
+ * <p>⚠️ **외부 스토리지에 직접 올리고 `fileInfos` 를 손으로 조립하는 연동**은 이 필드를 반드시 채워야 한다.
607
+ * 값이 없거나 UUID 가 아니면 병합 저장이 켜진 뒤 전송이 거부된다. 임의 UUID v4 를 생성해 넣으면 된다.</p>
608
+ */
609
+ fileId?: string;
571
610
  fileUrl: string;
572
611
  fileName?: string;
573
612
  fileSize?: number;
@@ -703,6 +742,42 @@ export interface ChatMessage {
703
742
  translations?: Record<string, string> | null;
704
743
  /** 번역 당시 content 해시 — stale 판별용 (내부). */
705
744
  translationsOf?: string | null;
745
+ /**
746
+ * AI 의 구조화 선택 요청(카드). 어시스턴트 메시지에만 존재하고, 일반 메시지에는 부재.
747
+ *
748
+ * <p><b>모르면 그냥 텍스트로 그려라 — 그게 정상 동작이다.</b> {@code content} 에 질문과 후보가
749
+ * 사람이 읽는 형태로 들어 있어 카드를 못 그려도 대화가 그대로 읽힌다.</p>
750
+ *
751
+ * <p>🔴 반대로 카드를 그린다면 {@code content} 를 <b>다시 그리지 마라</b> — 질문과 후보가 두 번 보인다.</p>
752
+ */
753
+ decisionRequest?: DecisionRequest | null;
754
+ /** 사용자의 선택. 어느 카드인지는 {@code replyTo} 가 특정한다. */
755
+ decisionResponse?: DecisionResponse | null;
756
+ }
757
+
758
+ /**
759
+ * AI 가 낸 선택 요청 — 질문 + 후보 2~5개.
760
+ *
761
+ * <p>후보는 <b>서버가 방의 실제 첨부에서</b> 만든다(클라가 만들거나 편집하지 않는다).</p>
762
+ */
763
+ export interface DecisionRequest {
764
+ /** 사용자에게 보일 질문 — 최대 200자. */
765
+ question: string;
766
+ /** 선택지 2~5개. 라벨은 이 카드 안에서 유일하다. */
767
+ options: DecisionOption[];
768
+ }
769
+
770
+ export interface DecisionOption {
771
+ /** 불투명 식별자 — 선택 전송 시 {@code decisionResponse.optionId} 로 <b>그대로</b> 돌려보낸다. */
772
+ id: string;
773
+ /** 버튼에 보일 이름 — 최대 80자(초과분은 서버가 말줄임). */
774
+ label: string;
775
+ /** 보조 설명(업로드 시각 등). 없을 수 있다. */
776
+ hint?: string | null;
777
+ }
778
+
779
+ export interface DecisionResponse {
780
+ optionId: string;
706
781
  }
707
782
 
708
783
  /** 채팅방 참가자. */
@@ -1095,13 +1170,36 @@ export interface UpdateGroupRoomData {
1095
1170
  engagementIntensity?: EngagementIntensityValue;
1096
1171
  }
1097
1172
 
1173
+ /**
1174
+ * **전송 요청**에 싣는 첨부 — {@code fileId} 가 <b>필수</b>다.
1175
+ *
1176
+ * <p>서버가 이 값을 첨부 좌표(문서 추출 캐시 키)로 쓰기 때문에, 병합 저장이 켜진 서버는 UUID 형식 +
1177
+ * 메시지 내 유일을 강제하고 위반 시 400 을 낸다. {@link ChatClient.uploadFile} 은 서버가 발급한 UUID 를
1178
+ * 담아 반환하므로 그대로 넘기면 된다.</p>
1179
+ *
1180
+ * <p>⚠️ 외부 스토리지에 직접 올리고 {@code fileInfos} 를 손으로 조립하는 연동은 {@code crypto.randomUUID()}
1181
+ * 등으로 직접 채워야 한다. 수신 메시지의 {@link FileMetaData} 는 legacy 데이터를 위해 {@code fileId} 가
1182
+ * optional 이므로, 그것을 그대로 재전송하려면 {@code fileId} 를 보강해야 한다.</p>
1183
+ */
1184
+ export type SendFileInfo = FileMetaData & { fileId: string };
1185
+
1098
1186
  export interface SendMessageData {
1099
1187
  /** @deprecated SDK 가 내부에서 UUID 를 자동 생성합니다. 지정해도 런타임에서 무시됩니다. */
1100
1188
  messageId?: string;
1101
1189
  message?: string;
1102
- fileInfos?: FileMetaData[];
1190
+ /** 첨부 — {@code fileId} 필수. {@link SendFileInfo} 참고. */
1191
+ fileInfos?: SendFileInfo[];
1192
+ /**
1193
+ * @deprecated 더 이상 전송되지 않습니다. 전송 1회 = 메시지 1건이 계약이며, 첨부는 한 메시지에 전량 실립니다.
1194
+ * 지정해도 SDK 가 무시합니다.
1195
+ */
1103
1196
  separateFiles?: boolean;
1104
1197
  replyToMessageId?: string;
1198
+ /**
1199
+ * 의사결정 카드의 선택 — 카드 버튼을 눌렀을 때만. {@link ChatClient#sendDecisionChoice} 가
1200
+ * {@code replyToMessageId}/{@code message}/{@code optionId} 셋을 한 번에 맞춰 준다.
1201
+ */
1202
+ decisionResponse?: DecisionResponse;
1105
1203
  }
1106
1204
 
1107
1205
  export interface SendMessageResult {
@@ -1110,13 +1208,17 @@ export interface SendMessageResult {
1110
1208
  }
1111
1209
 
1112
1210
  /**
1113
- * Optimistic prediction 검증 메타데이터 — {@link OptimisticSendMessageResult} 에 첨부.
1211
+ * Optimistic 검증 메타데이터 — {@link OptimisticSendMessageResult} 에 첨부.
1114
1212
  *
1115
- * <p>{@code predictionMatched: false} 면 서버의 파일 분류 규칙이 SDK 와 어긋난 것이며,
1116
- * 호출자는 placeholder 들을 제거하고 {@code actualMessageIds} 기준으로 재구성해야 한다.</p>
1213
+ * <p>전송 1회 = 메시지 1건이므로 `predictedMessageIds` 는 항상 `[baseMessageId]` 하나다.
1214
+ * SDK 가 서버 파일 분류 규칙을 mirror 해 여러 ID 를 예측하던 로직은 제거됐다.</p>
1215
+ *
1216
+ * <p>{@code predictionMatched: false} 면 서버가 아직 병합 저장을 켜지 않아 **한 요청이 여러 row 로
1217
+ * 저장된 것**이다(전환 기간의 정상 상태). 호출자는 placeholder 를 제거하고 `actualMessageIds` 기준으로
1218
+ * 재구성해야 한다 — 이 fallback 경로는 플래그가 켜질 때까지 실제로 발생한다.</p>
1117
1219
  */
1118
1220
  export interface OptimisticPredictionInfo {
1119
- /** SDK 가 호출 시점에 예측한 messageId 배열. */
1221
+ /** SDK 가 호출 시점에 만든 messageId 배열 — 항상 길이 1(`[baseMessageId]`). */
1120
1222
  predictedMessageIds: string[];
1121
1223
  /** 서버 응답의 실제 messageId 배열 — {@code result.messages.map(m => m.messageId)} 와 동일. */
1122
1224
  actualMessageIds: string[];
@@ -1136,29 +1238,27 @@ export interface OptimisticSendMessageResult extends SendMessageResult {
1136
1238
  * Optimistic UI 핸들 — {@code sendMessageOptimistic} / {@code sendTextMessageOptimistic} /
1137
1239
  * {@code sendReplyOptimistic} / {@code sendFileMessageOptimistic} 의 반환 타입.
1138
1240
  *
1139
- * <p>SDK 가 서버의 messageId derivation 규칙 (텍스트=base, 파일=base#N) 을 mirror 하여
1140
- * 응답 {@code messages} 배열과 1-1 매칭되는 ID 배열을 promise 시작 전 동기 반환한다.</p>
1241
+ * <p>전송 1회 = 메시지 1건이므로 {@code messageIds} 는 <b>항상 {@code [baseMessageId]} 하나</b>다.
1242
+ * 첨부 개수와 무관하며, promise 시작 전 동기 반환된다. 서버의 messageId derivation 규칙
1243
+ * (텍스트=base, 파일=base#N)을 mirror 하던 예측기는 제거됐다.</p>
1141
1244
  *
1142
- * <p><b>Drift 방어</b>: 서버 파일 분류 규칙이 변경되면 prediction 이 어긋날 수 있으며,
1143
- * 이 경우 SDK 가 warn 로그를 남기고 promise 결과의 {@code optimistic.predictionMatched: false}
1144
- * 로 알린다. 호출자는 {@code result.optimistic.actualMessageIds} 로 fallback reconcile 한다.</p>
1245
+ * <p><b>전환 기간 fallback</b>: 서버가 아직 병합 저장을 켜지 않았다면 한 요청이 여러 row 로 저장되어
1246
+ * {@code optimistic.predictionMatched} 가 {@code false} 가 된다. 오류가 아니라 정상 상태이며, SDK 가
1247
+ * warn 로그를 남긴다. 이때 호출자는 placeholder 를 제거하고
1248
+ * {@code result.optimistic.actualMessageIds} / {@code result.messages} 로 재구성해야 한다.</p>
1145
1249
  */
1146
1250
  export interface OptimisticSendMessageHandle {
1147
1251
  /** SDK 가 생성한 base messageId — 서버 멱등 키. 응답 첫 메시지가 텍스트면 이 값과 동일. */
1148
1252
  baseMessageId: string;
1149
1253
  /**
1150
- * 예측된 전체 messageId 배열 — 응답 {@code messages} 와 같은 순서/길이.
1151
- * <ul>
1152
- * <li>텍스트 단건: {@code [base]}</li>
1153
- * <li>파일 1개 (text 없음): {@code [base]}</li>
1154
- * <li>텍스트 + 파일들: {@code [base, base#0, base#1, ...]}</li>
1155
- * <li>분리 다파일 (text 없음): {@code [base#0, base#1, ...]}</li>
1156
- * </ul>
1254
+ * 전송할 messageId 배열 — 전송 1회 = 메시지 1건이므로 <b>항상 {@code [baseMessageId]} 하나</b>다.
1255
+ * <p>첨부 개수와 무관하다. 서버 저장 규칙을 mirror 해 {@code base#N} 을 계산하던 예측기는 제거됐다.</p>
1157
1256
  */
1158
1257
  messageIds: string[];
1159
1258
  /**
1160
1259
  * 실제 전송 promise — 일반 결과 + {@code optimistic} 메타데이터.
1161
- * {@code result.optimistic.predictionMatched} 가 {@code false} 면 drift fallback 필요.
1260
+ * {@code result.optimistic.predictionMatched} 가 {@code false} 면 서버가 아직 병합 저장을 켜지 않아
1261
+ * N건으로 저장한 것이다 — {@code actualMessageIds} 로 재구성한다(전환 기간의 정상 상태).
1162
1262
  */
1163
1263
  promise: Promise<OptimisticSendMessageResult>;
1164
1264
  }
@@ -1201,7 +1301,9 @@ export interface SendFileMessageProgressEvent extends UploadProgressEvent {
1201
1301
  export interface SendFileMessageOptions {
1202
1302
  /** 함께 보낼 텍스트. */
1203
1303
  message?: string;
1204
- /** 파일별 개별 메시지 분리 여부. */
1304
+ /**
1305
+ * @deprecated 더 이상 전송되지 않습니다. 전송 1회 = 메시지 1건이 계약입니다.
1306
+ */
1205
1307
  separateFiles?: boolean;
1206
1308
  /** 답글 대상 원본 메시지의 서버 messageId. */
1207
1309
  replyToMessageId?: string;
@@ -1220,8 +1322,8 @@ export interface SendFileMessageOptions {
1220
1322
  * <li>배열: index 별 파일에 매핑. 빈 슬롯 ({@code null} / {@code undefined}) 은 해당 파일에 metadata 미부여</li>
1221
1323
  * </ul>
1222
1324
  *
1223
- * <p>{@code separateFiles: false} 로 묶이는 경우에도 각 파일의 {@code metadata} 는 자신의 값을 유지하므로,
1224
- * 그룹 메시지의 {@code fileMetaDataList[i].metadata} 가 i 별로 다를 수 있다.</p>
1325
+ * <p>첨부가 한 메시지에 묶여도 각 파일의 {@code metadata} 는 자신의 값을 유지하므로,
1326
+ * {@code fileMetaDataList[i].metadata} 가 i 별로 다를 수 있다.</p>
1225
1327
  */
1226
1328
  metadata?: FileCustomMetadata | Array<FileCustomMetadata | undefined | null>;
1227
1329
  }
@@ -1590,8 +1692,13 @@ export class ChatClient implements SdkEventEmitter<ChatClientEvents> {
1590
1692
  sendTextMessageOptimistic(roomId: string, message: string): OptimisticSendMessageHandle;
1591
1693
  sendReply(roomId: string, message: string, replyToMessageId: string): Promise<SendMessageResult>;
1592
1694
  sendReplyOptimistic(roomId: string, message: string, replyToMessageId: string): OptimisticSendMessageHandle;
1695
+ /**
1696
+ * 의사결정 카드의 선택 전송 — 답글 + 라벨 본문 + optionId 를 한 번에 맞춰 보낸다.
1697
+ * 직접 조립하지 말고 이 메서드를 쓰는 편이 안전하다(셋 중 하나만 빠져도 계약이 깨진다).
1698
+ */
1699
+ sendDecisionChoice(roomId: string, card: ChatMessage, option: DecisionOption): Promise<SendMessageResult>;
1593
1700
 
1594
- uploadFile(roomId: string, file: File, options?: FileUploadOptions): Promise<FileMetaData>;
1701
+ uploadFile(roomId: string, file: File, options?: FileUploadOptions): Promise<SendFileInfo>;
1595
1702
  sendFileMessage(roomId: string, files: File | File[], options?: SendFileMessageOptions): Promise<SendMessageResult>;
1596
1703
  /**
1597
1704
  * 파일 메시지 Optimistic UI 버전 — 업로드 시작 전에 messageIds 를 동기 반환.
@@ -1599,6 +1706,22 @@ export class ChatClient implements SdkEventEmitter<ChatClientEvents> {
1599
1706
  */
1600
1707
  sendFileMessageOptimistic(roomId: string, files: File | File[], options?: SendFileMessageOptions): OptimisticSendMessageHandle;
1601
1708
 
1709
+ /**
1710
+ * MIME 타입 → 첨부 카테고리 (서버 분류 규칙 mirror).
1711
+ * <p>주로 {@link ChatClient.resolveMessageCategory} 가 쓰지만, 업로드 전 미리보기 분기 등에도 쓸 수 있다.</p>
1712
+ */
1713
+ classifyFileType(mimeType: string): 'IMAGE' | 'VIDEO' | 'AUDIO' | 'DOCUMENT' | 'FILE';
1714
+
1715
+ /**
1716
+ * 메시지의 **렌더 카테고리**를 해석한다 — legacy `GALLERY` 복원용.
1717
+ *
1718
+ * <p>서버는 이제 첨부가 동질이면 그 카테고리를, 혼재면 `MIXED` 를 보낸다. 그러나 이 변경 이전에 저장된
1719
+ * 메시지는 복수 첨부면 타입 무관 전부 `GALLERY` 다 — 동영상 2개도, PDF 2개도 `GALLERY` 다.
1720
+ * 따라서 **`GALLERY` 를 `IMAGE` 로 매핑하면 안 된다.** 이 메서드가 `fileMetaDataList` 의 MIME 으로
1721
+ * 실제 카테고리를 복원하므로, 렌더러는 `GALLERY` 분기를 따로 둘 필요가 없다.</p>
1722
+ */
1723
+ resolveMessageCategory(message: Pick<ChatMessage, 'chatMessageType' | 'fileMetaDataList'>): ChatMessageTypeValue;
1724
+
1602
1725
  editMessage(roomId: string, messageId: string, message: string): Promise<void>;
1603
1726
  deleteMessage(roomId: string, messageId: string, deleteType?: DeleteType): Promise<void>;
1604
1727
  /** 메시지 읽음 처리 — sync. 연결 상태 or send 결과에 따라 boolean 반환. */
@@ -1937,8 +2060,13 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
1937
2060
  sendTextMessageOptimistic(roomId: string, message: string): OptimisticSendMessageHandle;
1938
2061
  sendReply(roomId: string, message: string, replyToMessageId: string): Promise<SendMessageResult>;
1939
2062
  sendReplyOptimistic(roomId: string, message: string, replyToMessageId: string): OptimisticSendMessageHandle;
2063
+ /**
2064
+ * 의사결정 카드의 선택 전송 — 답글 + 라벨 본문 + optionId 를 한 번에 맞춰 보낸다.
2065
+ * 직접 조립하지 말고 이 메서드를 쓰는 편이 안전하다(셋 중 하나만 빠져도 계약이 깨진다).
2066
+ */
2067
+ sendDecisionChoice(roomId: string, card: ChatMessage, option: DecisionOption): Promise<SendMessageResult>;
1940
2068
 
1941
- uploadFile(roomId: string, file: File, options?: FileUploadOptions): Promise<FileMetaData>;
2069
+ uploadFile(roomId: string, file: File, options?: FileUploadOptions): Promise<SendFileInfo>;
1942
2070
  sendFileMessage(roomId: string, files: File | File[], options?: SendFileMessageOptions): Promise<SendMessageResult>;
1943
2071
  /**
1944
2072
  * 파일 메시지 Optimistic UI 버전 — 업로드 시작 전에 messageIds 를 동기 반환.
@@ -1946,6 +2074,22 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
1946
2074
  */
1947
2075
  sendFileMessageOptimistic(roomId: string, files: File | File[], options?: SendFileMessageOptions): OptimisticSendMessageHandle;
1948
2076
 
2077
+ /**
2078
+ * MIME 타입 → 첨부 카테고리 (서버 분류 규칙 mirror).
2079
+ * <p>주로 {@link ChatClient.resolveMessageCategory} 가 쓰지만, 업로드 전 미리보기 분기 등에도 쓸 수 있다.</p>
2080
+ */
2081
+ classifyFileType(mimeType: string): 'IMAGE' | 'VIDEO' | 'AUDIO' | 'DOCUMENT' | 'FILE';
2082
+
2083
+ /**
2084
+ * 메시지의 **렌더 카테고리**를 해석한다 — legacy `GALLERY` 복원용.
2085
+ *
2086
+ * <p>서버는 이제 첨부가 동질이면 그 카테고리를, 혼재면 `MIXED` 를 보낸다. 그러나 이 변경 이전에 저장된
2087
+ * 메시지는 복수 첨부면 타입 무관 전부 `GALLERY` 다 — 동영상 2개도, PDF 2개도 `GALLERY` 다.
2088
+ * 따라서 **`GALLERY` 를 `IMAGE` 로 매핑하면 안 된다.** 이 메서드가 `fileMetaDataList` 의 MIME 으로
2089
+ * 실제 카테고리를 복원하므로, 렌더러는 `GALLERY` 분기를 따로 둘 필요가 없다.</p>
2090
+ */
2091
+ resolveMessageCategory(message: Pick<ChatMessage, 'chatMessageType' | 'fileMetaDataList'>): ChatMessageTypeValue;
2092
+
1949
2093
  editMessage(roomId: string, messageId: string, message: string): Promise<void>;
1950
2094
  deleteMessage(roomId: string, messageId: string, deleteType?: DeleteType): Promise<void>;
1951
2095
  /** 메시지 읽음 처리 — sync. 연결 상태 or send 결과에 따라 boolean 반환. */