@vibexnpm/talkx 8.5.0 → 8.7.0

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
@@ -577,6 +577,7 @@ export const DefaultConfig: {
577
577
  readonly environment: EnvironmentValue;
578
578
  readonly reconnectDelay: number;
579
579
  readonly maxReconnectAttempts: number;
580
+ readonly reconnectRecoveryDelay: number;
580
581
  readonly heartbeatIncoming: number;
581
582
  readonly heartbeatOutgoing: number;
582
583
  readonly apiTimeout: number;
@@ -1043,14 +1044,20 @@ export interface DecisionResponse {
1043
1044
  optionId: string;
1044
1045
  }
1045
1046
 
1047
+ /**
1048
+ * 회사 역할. `GUEST` 는 회사 밖에서 초대받아 그 회사 계정을 가진 사람이다 — 초대받은 방에서 채팅만 하고 PM·AI 버튼·조직도·
1049
+ * 방 만들기·초대 등은 서버가 막는다(403 `GUEST_FORBIDDEN`). 화면 노출 판단용이며 인가 근거는 아니다.
1050
+ */
1051
+ export type CompanyRole = 'PARTNER' | 'MEMBER' | 'GUEST';
1052
+
1046
1053
  /** 로그인한 회원. `userId` 는 메시지 발신자 식별과 같은 값이다. */
1047
1054
  export interface LoginMember {
1048
1055
  userId: string;
1049
1056
  email?: string | null;
1050
1057
  nickname?: string | null;
1051
1058
  profileUrl?: string | null;
1052
- /** 회사 역할 — 클라이언트가 파트너 화면 노출을 결정한다. 인가 근거는 아니다(서버가 재확인). */
1053
- companyRole: 'PARTNER' | 'MEMBER';
1059
+ /** 회사 역할 — 클라이언트가 파트너·게스트 화면 노출을 결정한다. 인가 근거는 아니다(서버가 재확인). */
1060
+ companyRole: CompanyRole;
1054
1061
  preferredLanguage?: string | null;
1055
1062
  /**
1056
1063
  * 초기 비밀번호를 아직 안 바꿨는가 — `true` 면 **비밀번호 변경 화면으로 보내라**.
@@ -1062,11 +1069,11 @@ export interface LoginMember {
1062
1069
  }
1063
1070
 
1064
1071
  /**
1065
- * `TalkFlowClient.loginUser` 응답.
1066
- *
1067
- * 회사 선택 단계가 없다 — 로그인 키가 전역 유일이라 이메일 하나로 회원과 회사가 함께 정해진다.
1072
+ * `TalkFlowClient.loginUser` 의 로그인 성공 응답. 회사 선택이 필요하면 대신 {@link WorkspaceSelection} 이 온다 —
1073
+ * `workspaceSelectionRequired` 로 가른다.
1068
1074
  */
1069
1075
  export interface LoginResult {
1076
+ workspaceSelectionRequired?: false;
1070
1077
  /** SDK가 저장·회전하는 갱신 자격. 직접 API를 쓰는 경우에만 응답에서 사용한다. */
1071
1078
  refreshToken?: string;
1072
1079
  /** 서버 현재 시각 및 refresh 만료 시각, Unix epoch 밀리초. */
@@ -1082,6 +1089,23 @@ export interface LoginResult {
1082
1089
  user: LoginMember;
1083
1090
  }
1084
1091
 
1092
+ /** 로그인 회사 선택지 하나. */
1093
+ export interface Workspace {
1094
+ projectId: string;
1095
+ companyName: string | null;
1096
+ /** 그 회사에서의 역할 — 선택 화면에 «게스트» 표시를 붙이는 데 쓴다. */
1097
+ companyRole: CompanyRole;
1098
+ }
1099
+
1100
+ /**
1101
+ * 로그인 회사 선택 결과 — 같은 이메일의 여러 회사 계정에서 비밀번호가 둘 이상 맞았다. **토큰이 없고 저장된 세션은 그대로다.**
1102
+ * 고른 `projectId` 를 실어 같은 이메일·비밀번호로 `loginUser` 를 다시 부른다.
1103
+ */
1104
+ export interface WorkspaceSelection {
1105
+ workspaceSelectionRequired: true;
1106
+ workspaces: Workspace[];
1107
+ }
1108
+
1085
1109
  /** 회사 조직도의 회원 — 초대 UI 에 필요한 것만. */
1086
1110
  export interface DirectoryMember {
1087
1111
  userId: string;
@@ -1123,7 +1147,7 @@ export interface MyProfile {
1123
1147
  phone?: string | null;
1124
1148
  profileUrl?: string | null;
1125
1149
  /** 회사 역할 — 방 역할(ParticipantResponse.role)과 다른 축이다. */
1126
- companyRole: 'PARTNER' | 'MEMBER';
1150
+ companyRole: CompanyRole;
1127
1151
  orgNodeId?: string | null;
1128
1152
  orgName?: string | null;
1129
1153
  preferredLanguage?: string | null;
@@ -1169,6 +1193,10 @@ export interface ParticipantResponse {
1169
1193
  role: 'OWNER' | 'ADMIN' | 'MEMBER' | 'ASSISTANT';
1170
1194
  /** 참가 시각(epoch millis). */
1171
1195
  joinedAt: number;
1196
+ /**
1197
+ * 회사 역할 — 게스트 배지(`GUEST`)용. 방 역할({@link role})과 다른 축이다. PM(ASSISTANT)·정보를 못 찾은 참여자는 없다.
1198
+ */
1199
+ companyRole?: CompanyRole;
1172
1200
  }
1173
1201
 
1174
1202
  /** 채팅방 last message preview. */
@@ -1279,6 +1307,8 @@ export interface RoomListMemberInfo {
1279
1307
  userId: string;
1280
1308
  nickname?: string | null;
1281
1309
  profileUrl?: string | null;
1310
+ /** 회사 역할 — 방금 들어온 게스트에도 다시 읽지 않고 배지를 그린다. PM·역할을 모르는 경로는 없다. */
1311
+ companyRole?: CompanyRole;
1282
1312
  }
1283
1313
 
1284
1314
  export interface RoomListUpdateEvent {
@@ -1609,6 +1639,8 @@ export interface TalkFlowClientOptions {
1609
1639
  maxReconnectDelay?: number;
1610
1640
  /** 최대 재연결 시도. 기본 10. */
1611
1641
  maxReconnectAttempts?: number;
1642
+ /** 기존 연결의 재시도 소진 후 자동 복구 대기(ms, 기본 60000, ±20% 지터). 0이면 비활성화. */
1643
+ reconnectRecoveryDelay?: number;
1612
1644
  /** 수신 하트비트 간격 (ms). 기본 10000. */
1613
1645
  heartbeatIncoming?: number;
1614
1646
  /** 발신 하트비트 간격 (ms). 기본 10000. */
@@ -1931,7 +1963,7 @@ export interface ChatMessageReceivedPayload {
1931
1963
 
1932
1964
  export interface MemberChangePayload {
1933
1965
  roomId: string;
1934
- members: Array<{ userId: string; nickname?: string; profileUrl?: string | null }>;
1966
+ members: Array<{ userId: string; nickname?: string; profileUrl?: string | null; companyRole?: CompanyRole }>;
1935
1967
  participantCount: number;
1936
1968
  timestamp?: number;
1937
1969
  }
@@ -2093,6 +2125,8 @@ export interface TalkFlowClientEvents {
2093
2125
  mediaStateChanged: unknown;
2094
2126
  callStarted: unknown;
2095
2127
  callEnded: unknown;
2128
+ /** 그룹 통화 재참가가 불가능해 로컬 통화를 종료한 경우. */
2129
+ callRecoveryFailed: { roomId: string; error: unknown };
2096
2130
  callRequested: unknown;
2097
2131
  callAccepted: unknown;
2098
2132
  callRejected: unknown;
@@ -2186,6 +2220,8 @@ export interface WebRTCClientEvents {
2186
2220
  error: unknown;
2187
2221
  callStarted: unknown;
2188
2222
  callEnded: unknown;
2223
+ /** 그룹 통화 재참가가 불가능해 로컬 통화를 종료한 경우. */
2224
+ callRecoveryFailed: { roomId: string; error: unknown };
2189
2225
  callRequested: unknown;
2190
2226
  callAccepted: unknown;
2191
2227
  callRejected: unknown;
@@ -2394,6 +2430,13 @@ export class ChatClient implements SdkEventEmitter<ChatClientEvents> {
2394
2430
  resumeAssistantStreams(reason?: string): Promise<void>;
2395
2431
  }
2396
2432
 
2433
+ /** POST /api/v1/webrtc/rooms 요청. 생략한 값은 서버 기본값을 사용합니다. */
2434
+ export interface CreateCallRoomRequest {
2435
+ invitedUsers?: string[];
2436
+ title?: string;
2437
+ maxParticipants?: number;
2438
+ }
2439
+
2397
2440
  export class WebRTCClient implements SdkEventEmitter<WebRTCClientEvents> {
2398
2441
  on<K extends keyof WebRTCClientEvents>(event: K, listener: (payload: WebRTCClientEvents[K]) => void): () => void;
2399
2442
  once<K extends keyof WebRTCClientEvents>(event: K, listener: (payload: WebRTCClientEvents[K]) => void): () => void;
@@ -2405,7 +2448,7 @@ export class WebRTCClient implements SdkEventEmitter<WebRTCClientEvents> {
2405
2448
  initializeIceServers(): Promise<RTCIceServer[]>;
2406
2449
  getTurnCredentials(): Promise<{ iceServers: RTCIceServer[] }>;
2407
2450
 
2408
- createCallRoom(data: unknown): Promise<unknown>;
2451
+ createCallRoom(data: CreateCallRoomRequest): Promise<unknown>;
2409
2452
  getCallRoom(roomId: string): Promise<unknown>;
2410
2453
  joinCallRoomApi(roomId: string): Promise<unknown>;
2411
2454
  leaveCallRoomApi(roomId: string): Promise<unknown>;
@@ -2588,16 +2631,18 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
2588
2631
  /**
2589
2632
  * 회원 로그인 — 클라이언트 생성 **전에** 호출한다. Server Key 도 고객사 BFF 도 필요 없다.
2590
2633
  * 응답의 `clientKey`/`projectId`/`accessToken` 이 그대로 SDK 초기화 입력이다.
2591
- * 회사 선택 단계가 없다 — 로그인 키가 전역 유일이다.
2634
+ * 같은 이메일로 비밀번호가 맞는 회사 계정이 둘 이상이면 {@link WorkspaceSelection} 이 온다 — 고른 `projectId` 로 다시 부른다.
2592
2635
  */
2593
2636
  static loginUser(options: {
2594
2637
  serverUrl: string;
2595
2638
  email: string;
2596
2639
  password: string;
2597
- }): Promise<LoginResult>;
2640
+ /** 회사 선택 응답에서 고른 회사. */
2641
+ projectId?: string;
2642
+ }): Promise<LoginResult | WorkspaceSelection>;
2598
2643
 
2599
- /** 회원 로그인 (인스턴스) — 재로그인·계정 전환용. 성공 시 토큰을 자동 설정한다. */
2600
- loginUser(credentials: { email: string; password: string }): Promise<LoginResult>;
2644
+ /** 회원 로그인 (인스턴스) — 재로그인·계정 전환용. 성공 시 토큰을 자동 설정한다. 회사 선택 결과면 토큰을 설정하지 않는다. */
2645
+ loginUser(credentials: { email: string; password: string; projectId?: string }): Promise<LoginResult | WorkspaceSelection>;
2601
2646
 
2602
2647
  /** localStorage의 refresh로 복구. 세션이 없으면 null, 네트워크/서버 장애는 reject. */
2603
2648
  static restoreSession(options: { serverUrl: string }): Promise<LoginResult | null>;
@@ -2631,6 +2676,10 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
2631
2676
  changeMyPassword(params: { currentPassword: string; newPassword: string }): Promise<unknown>;
2632
2677
 
2633
2678
  // Connection lifecycle
2679
+ /**
2680
+ * 연결 완료까지 기다립니다. 이전 연결의 자동 복구가 이어지는 동안 재시도 한도 소진으로 reject하지 않습니다.
2681
+ * 복구 연결 시 resolve하며, 명시적 disconnect·인증 종료·최초 연결 실패 시 reject합니다.
2682
+ */
2634
2683
  connect(jwt?: string, options?: ConnectOptions): Promise<void>;
2635
2684
  disconnect(): Promise<void>;
2636
2685
  logout(): Promise<void>;
@@ -2859,7 +2908,7 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
2859
2908
  initializeIceServers(): Promise<RTCIceServer[]>;
2860
2909
  getTurnCredentials(): Promise<{ iceServers: RTCIceServer[] }>;
2861
2910
 
2862
- createCallRoom(data: unknown): Promise<unknown>;
2911
+ createCallRoom(data: CreateCallRoomRequest): Promise<unknown>;
2863
2912
  getCallRoom(roomId: string): Promise<unknown>;
2864
2913
  joinCallRoomApi(roomId: string): Promise<unknown>;
2865
2914
  leaveCallRoomApi(roomId: string): Promise<unknown>;