@vibexnpm/talkx 8.6.0 → 8.9.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
@@ -26,6 +26,8 @@ export const ErrorTypes: {
26
26
  readonly CONNECTION_FAILED: 'CONNECTION_FAILED';
27
27
  readonly CONNECTION_LOST: 'CONNECTION_LOST';
28
28
  readonly CONNECTION_TIMEOUT: 'CONNECTION_TIMEOUT';
29
+ /** 회사 구독 없음(결제 전·해지) — 웹소켓이 멈췄다. 결제 확인 뒤 `connect()` 를 다시 부른다. */
30
+ readonly SUBSCRIPTION_REQUIRED: 'SUBSCRIPTION_REQUIRED';
29
31
  readonly JWT_INVALID: 'JWT_INVALID';
30
32
  readonly JWT_EXPIRED: 'JWT_EXPIRED';
31
33
  readonly JWT_PARSE_FAILED: 'JWT_PARSE_FAILED';
@@ -1044,14 +1046,20 @@ export interface DecisionResponse {
1044
1046
  optionId: string;
1045
1047
  }
1046
1048
 
1049
+ /**
1050
+ * 회사 역할. `GUEST` 는 회사 밖에서 초대받아 그 회사 계정을 가진 사람이다 — 초대받은 방에서 채팅만 하고 PM·AI 버튼·조직도·
1051
+ * 방 만들기·초대 등은 서버가 막는다(403 `GUEST_FORBIDDEN`). 화면 노출 판단용이며 인가 근거는 아니다.
1052
+ */
1053
+ export type CompanyRole = 'PARTNER' | 'MEMBER' | 'GUEST';
1054
+
1047
1055
  /** 로그인한 회원. `userId` 는 메시지 발신자 식별과 같은 값이다. */
1048
1056
  export interface LoginMember {
1049
1057
  userId: string;
1050
1058
  email?: string | null;
1051
1059
  nickname?: string | null;
1052
1060
  profileUrl?: string | null;
1053
- /** 회사 역할 — 클라이언트가 파트너 화면 노출을 결정한다. 인가 근거는 아니다(서버가 재확인). */
1054
- companyRole: 'PARTNER' | 'MEMBER';
1061
+ /** 회사 역할 — 클라이언트가 파트너·게스트 화면 노출을 결정한다. 인가 근거는 아니다(서버가 재확인). */
1062
+ companyRole: CompanyRole;
1055
1063
  preferredLanguage?: string | null;
1056
1064
  /**
1057
1065
  * 초기 비밀번호를 아직 안 바꿨는가 — `true` 면 **비밀번호 변경 화면으로 보내라**.
@@ -1063,11 +1071,11 @@ export interface LoginMember {
1063
1071
  }
1064
1072
 
1065
1073
  /**
1066
- * `TalkFlowClient.loginUser` 응답.
1067
- *
1068
- * 회사 선택 단계가 없다 — 로그인 키가 전역 유일이라 이메일 하나로 회원과 회사가 함께 정해진다.
1074
+ * `TalkFlowClient.loginUser` 의 로그인 성공 응답. 회사 선택이 필요하면 대신 {@link WorkspaceSelection} 이 온다 —
1075
+ * `workspaceSelectionRequired` 로 가른다.
1069
1076
  */
1070
1077
  export interface LoginResult {
1078
+ workspaceSelectionRequired?: false;
1071
1079
  /** SDK가 저장·회전하는 갱신 자격. 직접 API를 쓰는 경우에만 응답에서 사용한다. */
1072
1080
  refreshToken?: string;
1073
1081
  /** 서버 현재 시각 및 refresh 만료 시각, Unix epoch 밀리초. */
@@ -1083,6 +1091,23 @@ export interface LoginResult {
1083
1091
  user: LoginMember;
1084
1092
  }
1085
1093
 
1094
+ /** 로그인 회사 선택지 하나. */
1095
+ export interface Workspace {
1096
+ projectId: string;
1097
+ companyName: string | null;
1098
+ /** 그 회사에서의 역할 — 선택 화면에 «게스트» 표시를 붙이는 데 쓴다. */
1099
+ companyRole: CompanyRole;
1100
+ }
1101
+
1102
+ /**
1103
+ * 로그인 회사 선택 결과 — 같은 이메일의 여러 회사 계정에서 비밀번호가 둘 이상 맞았다. **토큰이 없고 저장된 세션은 그대로다.**
1104
+ * 고른 `projectId` 를 실어 같은 이메일·비밀번호로 `loginUser` 를 다시 부른다.
1105
+ */
1106
+ export interface WorkspaceSelection {
1107
+ workspaceSelectionRequired: true;
1108
+ workspaces: Workspace[];
1109
+ }
1110
+
1086
1111
  /** 회사 조직도의 회원 — 초대 UI 에 필요한 것만. */
1087
1112
  export interface DirectoryMember {
1088
1113
  userId: string;
@@ -1124,7 +1149,7 @@ export interface MyProfile {
1124
1149
  phone?: string | null;
1125
1150
  profileUrl?: string | null;
1126
1151
  /** 회사 역할 — 방 역할(ParticipantResponse.role)과 다른 축이다. */
1127
- companyRole: 'PARTNER' | 'MEMBER';
1152
+ companyRole: CompanyRole;
1128
1153
  orgNodeId?: string | null;
1129
1154
  orgName?: string | null;
1130
1155
  preferredLanguage?: string | null;
@@ -1170,6 +1195,10 @@ export interface ParticipantResponse {
1170
1195
  role: 'OWNER' | 'ADMIN' | 'MEMBER' | 'ASSISTANT';
1171
1196
  /** 참가 시각(epoch millis). */
1172
1197
  joinedAt: number;
1198
+ /**
1199
+ * 회사 역할 — 게스트 배지(`GUEST`)용. 방 역할({@link role})과 다른 축이다. PM(ASSISTANT)·정보를 못 찾은 참여자는 없다.
1200
+ */
1201
+ companyRole?: CompanyRole;
1173
1202
  }
1174
1203
 
1175
1204
  /** 채팅방 last message preview. */
@@ -1280,6 +1309,8 @@ export interface RoomListMemberInfo {
1280
1309
  userId: string;
1281
1310
  nickname?: string | null;
1282
1311
  profileUrl?: string | null;
1312
+ /** 회사 역할 — 방금 들어온 게스트에도 다시 읽지 않고 배지를 그린다. PM·역할을 모르는 경로는 없다. */
1313
+ companyRole?: CompanyRole;
1283
1314
  }
1284
1315
 
1285
1316
  export interface RoomListUpdateEvent {
@@ -1478,7 +1509,7 @@ export interface AssistantProgressEvent {
1478
1509
  /** 진행 주체 페르소나 ID. */
1479
1510
  personaId: string | null;
1480
1511
  /** 진행 단계 — `active:true` 일 때. 종료 시 null. */
1481
- phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WRITING' | null;
1512
+ phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WEB_READING' | 'WRITING' | null;
1482
1513
  /** DOCUMENT_ANALYSIS의 실측 진행률. 같은 phase heartbeat 사이와 재입장 후에도 보존된다. */
1483
1514
  progress?: DocumentAnalysisProgress | null;
1484
1515
  /** phase 의 기본 표시 라벨(예: "생각 중…"). SDK 매핑 — 커스텀하려면 `phase` 사용. 종료 시 null. */
@@ -1549,7 +1580,7 @@ export interface AssistantRoomProgressEvent {
1549
1580
  /** 표시 기준이 된 stream (가장 최근 갱신). 없으면 null. */
1550
1581
  streamId: string | null;
1551
1582
  personaId: string | null;
1552
- phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WRITING' | null;
1583
+ phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WEB_READING' | 'WRITING' | null;
1553
1584
  progress?: DocumentAnalysisProgress | null;
1554
1585
  label: string | null;
1555
1586
  /** 표시 기준 stream 의 누적 본문. `textAvailable:false` 거나 진행 중이 아니면 null. */
@@ -1562,7 +1593,7 @@ export interface AssistantRoomProgressEvent {
1562
1593
  export interface AssistantProgressStreamSnapshot {
1563
1594
  streamId: string;
1564
1595
  personaId: string | null;
1565
- phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WRITING' | null;
1596
+ phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WEB_READING' | 'WRITING' | null;
1566
1597
  progress?: DocumentAnalysisProgress | null;
1567
1598
  label: string | null;
1568
1599
  text: string | null;
@@ -1934,7 +1965,7 @@ export interface ChatMessageReceivedPayload {
1934
1965
 
1935
1966
  export interface MemberChangePayload {
1936
1967
  roomId: string;
1937
- members: Array<{ userId: string; nickname?: string; profileUrl?: string | null }>;
1968
+ members: Array<{ userId: string; nickname?: string; profileUrl?: string | null; companyRole?: CompanyRole }>;
1938
1969
  participantCount: number;
1939
1970
  timestamp?: number;
1940
1971
  }
@@ -1968,7 +1999,7 @@ export interface RetentionCleanupPayload {
1968
1999
  /**
1969
2000
  * TalkFlowClient 이벤트 맵 — 런타임 {@code TalkFlowClient.js} 의 {@code this.emit(...)} 호출 기반.
1970
2001
  *
1971
- * <p><b>Connection 관련</b>: stateChange, connected, disconnected, reconnecting, reconnected, resumed, connectionError, tokenSet, loggedOut</p>
2002
+ * <p><b>Connection 관련</b>: stateChange, connected, disconnected, reconnecting, reconnected, resumed, subscriptionRequired, connectionError, tokenSet, loggedOut</p>
1972
2003
  * <p><b>Chat 관련 (ChatClient 이벤트를 이 이름으로 re-emit)</b>: chatMessage, newChatMessage, messageUpdated, messageDeleted, reactionChanged, linkPreviewAttached, messageRead, typing, assistantProgress, memberJoined, memberLeft, roomSubscribed, roomUnsubscribed, roomListSubscribed, roomListUnsubscribed, roomListUpdate, roomListMessage, roomListCreated, roomListJoined, roomListLeft, roomListSelfLeft, roomListRoomUpdated, retentionCleanup</p>
1973
2004
  * <p><b>Push 관련</b>: pushEnabled, pushFailed, pushNotification</p>
1974
2005
  * <p><b>WebRTC 관련</b>: localStreamStarted, localStreamStopped, remoteTrack, screenShareStarted, screenShareEnded, deviceChange, mediaStateChanged, callStarted, callEnded, callRequested, callAccepted, callRejected, callCancelled, callInvitation, callBusy, incomingCall, incomingCallWhileBusy, userJoined, userLeft, participantLeft, participantMediaState, peerConnected, peerDisconnected, peerClosed, webrtcError</p>
@@ -1993,6 +2024,15 @@ export interface TalkFlowClientEvents {
1993
2024
  * 발행된다(두 이벤트가 겹치지 않아 재동기화가 중복 실행되지 않는다).</p>
1994
2025
  */
1995
2026
  resumed: { reason: 'visibilitychange' | 'pageshow' | 'online' };
2027
+ /**
2028
+ * 회사 구독 없음 — 서버가 웹소켓 연결·구독·전송을 `NOT_SUBSCRIBED` 로 거부했다(결제 전·해지 회사). SDK 는 재연결하지 않고
2029
+ * 토큰도 거부된 것으로 기록하지 않는다(로그인·토큰 갱신은 그대로). 대기에 들어갈 때 한 번 발행되며 `connectionError` 는 내지 않는다.
2030
+ *
2031
+ * <p>앱: 파트너면 결제 화면, 그 밖은 «회사 구독이 필요합니다. 관리자에게 문의하세요.» 안내. 결제가 확인되면
2032
+ * (`subscription === 'ACTIVE'`) 같은 토큰으로 `connect()` 를 다시 부른다. 구독 확인 일시 실패(`SUBSCRIPTION_CHECK_UNAVAILABLE`)는
2033
+ * 이 이벤트가 아니다 — 평소처럼 재연결한다.</p>
2034
+ */
2035
+ subscriptionRequired: { code: 'NOT_SUBSCRIBED'; message: string };
1996
2036
  connectionError: unknown;
1997
2037
  tokenSet: { userId: string };
1998
2038
  loggedOut: void;
@@ -2602,16 +2642,18 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
2602
2642
  /**
2603
2643
  * 회원 로그인 — 클라이언트 생성 **전에** 호출한다. Server Key 도 고객사 BFF 도 필요 없다.
2604
2644
  * 응답의 `clientKey`/`projectId`/`accessToken` 이 그대로 SDK 초기화 입력이다.
2605
- * 회사 선택 단계가 없다 — 로그인 키가 전역 유일이다.
2645
+ * 같은 이메일로 비밀번호가 맞는 회사 계정이 둘 이상이면 {@link WorkspaceSelection} 이 온다 — 고른 `projectId` 로 다시 부른다.
2606
2646
  */
2607
2647
  static loginUser(options: {
2608
2648
  serverUrl: string;
2609
2649
  email: string;
2610
2650
  password: string;
2611
- }): Promise<LoginResult>;
2651
+ /** 회사 선택 응답에서 고른 회사. */
2652
+ projectId?: string;
2653
+ }): Promise<LoginResult | WorkspaceSelection>;
2612
2654
 
2613
- /** 회원 로그인 (인스턴스) — 재로그인·계정 전환용. 성공 시 토큰을 자동 설정한다. */
2614
- loginUser(credentials: { email: string; password: string }): Promise<LoginResult>;
2655
+ /** 회원 로그인 (인스턴스) — 재로그인·계정 전환용. 성공 시 토큰을 자동 설정한다. 회사 선택 결과면 토큰을 설정하지 않는다. */
2656
+ loginUser(credentials: { email: string; password: string; projectId?: string }): Promise<LoginResult | WorkspaceSelection>;
2615
2657
 
2616
2658
  /** localStorage의 refresh로 복구. 세션이 없으면 null, 네트워크/서버 장애는 reject. */
2617
2659
  static restoreSession(options: { serverUrl: string }): Promise<LoginResult | null>;
@@ -2648,6 +2690,8 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
2648
2690
  /**
2649
2691
  * 연결 완료까지 기다립니다. 이전 연결의 자동 복구가 이어지는 동안 재시도 한도 소진으로 reject하지 않습니다.
2650
2692
  * 복구 연결 시 resolve하며, 명시적 disconnect·인증 종료·최초 연결 실패 시 reject합니다.
2693
+ * 회사 구독이 없으면(서버 `NOT_SUBSCRIBED`) `code: 'NOT_SUBSCRIBED'`·`type: 'SUBSCRIPTION_REQUIRED'` 로 reject 하고
2694
+ * 재연결하지 않습니다 — {@link TalkFlowClientEvents.subscriptionRequired} 참고.
2651
2695
  */
2652
2696
  connect(jwt?: string, options?: ConnectOptions): Promise<void>;
2653
2697
  disconnect(): Promise<void>;
@@ -2655,6 +2699,11 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
2655
2699
  setToken(token: string): Promise<void>;
2656
2700
  updateToken(newToken: string): Promise<void>;
2657
2701
  isConnected(): boolean;
2702
+ /**
2703
+ * 회사 구독 대기 중인가 — 서버가 웹소켓을 `NOT_SUBSCRIBED` 로 거부해 연결을 멈췄다(결제 전·해지 회사).
2704
+ * 결제가 확인되면(`GET /api/v1/company/billing` 의 `subscription === 'ACTIVE'`) 같은 토큰으로 `connect()` 를 다시 부른다.
2705
+ */
2706
+ isSubscriptionRequired(): boolean;
2658
2707
  getState(): ConnectionStateValue;
2659
2708
  hasToken(): boolean;
2660
2709