@vibexnpm/talkx 8.7.0 → 8.10.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';
@@ -532,6 +534,7 @@ export const RoomListEventType: {
532
534
  readonly ROOM_DELETED: 'ROOM_DELETED';
533
535
  readonly MESSAGE_RETENTION_CLEANUP: 'MESSAGE_RETENTION_CLEANUP';
534
536
  readonly ROOM_UNREAD_UPDATED: 'ROOM_UNREAD_UPDATED';
537
+ readonly AI_UNAVAILABLE: 'AI_UNAVAILABLE';
535
538
  };
536
539
  export type RoomListEventTypeValue = typeof RoomListEventType[keyof typeof RoomListEventType];
537
540
 
@@ -1171,6 +1174,14 @@ export interface MyProfile {
1171
1174
  mustChangePassword: boolean;
1172
1175
  accessToken?: string;
1173
1176
  expiresIn?: number;
1177
+ /**
1178
+ * 회사 AI 가 지금 막혔는가 — 채팅방 상단 띠용. 막혔으면 사유, 열려 있으면 키가 없다.
1179
+ *
1180
+ * PM 입구와 같은 판정이라 값이 있는 동안 PM 은 불러도 답하지 않는다. 최대 30초 늦게 바뀔 수 있고, 서버가 상태 변화를 따로
1181
+ * 알려 주지 않으므로 앱 시작·방 입장·탭 복귀·{@link AiUnavailableEvent} 수신 때 다시 읽는다. 게스트에게는 없다.
1182
+ * 구독 없음(`NOT_SUBSCRIBED`)은 여기 오지 않는다 — 그 회사는 구독 필요 화면이 맡는다.
1183
+ */
1184
+ aiBlocked?: Exclude<AiBlockedReason, 'NOT_SUBSCRIBED'>;
1174
1185
  }
1175
1186
 
1176
1187
  /** 채팅방 참가자. */
@@ -1354,9 +1365,36 @@ export interface RoomListUpdateEvent {
1354
1365
  * {@code ROOM_UNREAD_UPDATED} 에 실려, 순서 역전을 {@link RoomUnreadReconciler} 가 판별한다.
1355
1366
  */
1356
1367
  unreadVersion?: number;
1368
+ /** {@code AI_UNAVAILABLE} 전용 — 회사 AI 가 막힌 사유. 다른 eventType 에서는 undefined. 전용 이벤트 {@link AiUnavailableEvent} 로도 받을 수 있다. */
1369
+ aiBlocked?: AiBlockedReason;
1357
1370
  [extra: string]: unknown;
1358
1371
  }
1359
1372
 
1373
+ /**
1374
+ * 회사 AI 가 막힌 사유 — AI 버튼(요약·번역 등)이 받는 REST 402 오류 코드와 같다.
1375
+ * <ul>
1376
+ * <li>{@code CREDIT_EXHAUSTED} — 이번 결제 기간 AI 크레딧을 다 썼다(다음 갱신·충전 때 풀림).</li>
1377
+ * <li>{@code CREDIT_INSUFFICIENT} — 남은 크레딧을 진행 중인 AI 작업이 잡고 있다(작업이 끝나면 풀림, 드묾).</li>
1378
+ * <li>{@code BILLING_SUSPENDED} — 결제가 확인되지 않았다.</li>
1379
+ * <li>{@code NOT_SUBSCRIBED} — 회사 구독이 없다. {@link AiUnavailableEvent} 에만 드물게 오고 {@link MyProfile.aiBlocked} 에는 오지 않는다.</li>
1380
+ * </ul>
1381
+ */
1382
+ export type AiBlockedReason = 'CREDIT_EXHAUSTED' | 'CREDIT_INSUFFICIENT' | 'BILLING_SUSPENDED' | 'NOT_SUBSCRIBED';
1383
+
1384
+ /**
1385
+ * `aiUnavailable` 이벤트 payload — PM 을 직접(@PM) 불렀는데 회사 AI 가 막혀 답하지 않았다. <b>부른 사람에게만</b> 오고, 방에는
1386
+ * 아무것도 남지 않는다. 잠깐 알리고 사라지게(토스트) 쓴다 — 리스트·미독은 바꾸지 않는다. 막힌 상태를 계속 보여 줄 띠는
1387
+ * {@link MyProfile.aiBlocked} 로 그린다.
1388
+ */
1389
+ export interface AiUnavailableEvent {
1390
+ roomId: string;
1391
+ /** 부른 메시지. */
1392
+ messageId?: string;
1393
+ aiBlocked: AiBlockedReason;
1394
+ /** 서버 발행 시각(epoch millis). */
1395
+ timestamp?: number;
1396
+ }
1397
+
1360
1398
  /**
1361
1399
  * `roomListUnreadUpdated` 이벤트 payload — 내가 어느 기기에서 읽든 같은 사용자의 다른 세션에 전달된다.
1362
1400
  *
@@ -1507,7 +1545,7 @@ export interface AssistantProgressEvent {
1507
1545
  /** 진행 주체 페르소나 ID. */
1508
1546
  personaId: string | null;
1509
1547
  /** 진행 단계 — `active:true` 일 때. 종료 시 null. */
1510
- phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WRITING' | null;
1548
+ phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WEB_READING' | 'WRITING' | null;
1511
1549
  /** DOCUMENT_ANALYSIS의 실측 진행률. 같은 phase heartbeat 사이와 재입장 후에도 보존된다. */
1512
1550
  progress?: DocumentAnalysisProgress | null;
1513
1551
  /** phase 의 기본 표시 라벨(예: "생각 중…"). SDK 매핑 — 커스텀하려면 `phase` 사용. 종료 시 null. */
@@ -1578,7 +1616,7 @@ export interface AssistantRoomProgressEvent {
1578
1616
  /** 표시 기준이 된 stream (가장 최근 갱신). 없으면 null. */
1579
1617
  streamId: string | null;
1580
1618
  personaId: string | null;
1581
- phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WRITING' | null;
1619
+ phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WEB_READING' | 'WRITING' | null;
1582
1620
  progress?: DocumentAnalysisProgress | null;
1583
1621
  label: string | null;
1584
1622
  /** 표시 기준 stream 의 누적 본문. `textAvailable:false` 거나 진행 중이 아니면 null. */
@@ -1591,7 +1629,7 @@ export interface AssistantRoomProgressEvent {
1591
1629
  export interface AssistantProgressStreamSnapshot {
1592
1630
  streamId: string;
1593
1631
  personaId: string | null;
1594
- phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WRITING' | null;
1632
+ phase: 'THINKING' | 'SEARCHING' | 'PLANNING' | 'DOCUMENT_ANALYSIS' | 'VIDEO_ANALYSIS' | 'WEB_READING' | 'WRITING' | null;
1595
1633
  progress?: DocumentAnalysisProgress | null;
1596
1634
  label: string | null;
1597
1635
  text: string | null;
@@ -1997,8 +2035,8 @@ export interface RetentionCleanupPayload {
1997
2035
  /**
1998
2036
  * TalkFlowClient 이벤트 맵 — 런타임 {@code TalkFlowClient.js} 의 {@code this.emit(...)} 호출 기반.
1999
2037
  *
2000
- * <p><b>Connection 관련</b>: stateChange, connected, disconnected, reconnecting, reconnected, resumed, connectionError, tokenSet, loggedOut</p>
2001
- * <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>
2038
+ * <p><b>Connection 관련</b>: stateChange, connected, disconnected, reconnecting, reconnected, resumed, subscriptionRequired, connectionError, tokenSet, loggedOut</p>
2039
+ * <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, aiUnavailable, retentionCleanup</p>
2002
2040
  * <p><b>Push 관련</b>: pushEnabled, pushFailed, pushNotification</p>
2003
2041
  * <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>
2004
2042
  */
@@ -2022,6 +2060,15 @@ export interface TalkFlowClientEvents {
2022
2060
  * 발행된다(두 이벤트가 겹치지 않아 재동기화가 중복 실행되지 않는다).</p>
2023
2061
  */
2024
2062
  resumed: { reason: 'visibilitychange' | 'pageshow' | 'online' };
2063
+ /**
2064
+ * 회사 구독 없음 — 서버가 웹소켓 연결·구독·전송을 `NOT_SUBSCRIBED` 로 거부했다(결제 전·해지 회사). SDK 는 재연결하지 않고
2065
+ * 토큰도 거부된 것으로 기록하지 않는다(로그인·토큰 갱신은 그대로). 대기에 들어갈 때 한 번 발행되며 `connectionError` 는 내지 않는다.
2066
+ *
2067
+ * <p>앱: 파트너면 결제 화면, 그 밖은 «회사 구독이 필요합니다. 관리자에게 문의하세요.» 안내. 결제가 확인되면
2068
+ * (`subscription === 'ACTIVE'`) 같은 토큰으로 `connect()` 를 다시 부른다. 구독 확인 일시 실패(`SUBSCRIPTION_CHECK_UNAVAILABLE`)는
2069
+ * 이 이벤트가 아니다 — 평소처럼 재연결한다.</p>
2070
+ */
2071
+ subscriptionRequired: { code: 'NOT_SUBSCRIBED'; message: string };
2025
2072
  connectionError: unknown;
2026
2073
  tokenSet: { userId: string };
2027
2074
  loggedOut: void;
@@ -2077,6 +2124,8 @@ export interface TalkFlowClientEvents {
2077
2124
  roomListRoomUpdated: RoomListUpdateEvent;
2078
2125
  /** 내가 어느 기기에서 읽든 방별 미독 절대값(+version)을 통지 — 크로스-디바이스 badge 동기화. */
2079
2126
  roomListUnreadUpdated: RoomUnreadUpdatedEvent;
2127
+ /** @PM 을 불렀는데 회사 AI 가 막혀 PM 이 답하지 않음 (AI_UNAVAILABLE) — 부른 사람에게만 온다. 잠깐 알리고 사라지게. */
2128
+ aiUnavailable: AiUnavailableEvent;
2080
2129
  mailSubscribed: Record<string, unknown>;
2081
2130
  mailUnsubscribed: Record<string, unknown>;
2082
2131
  mailChanged: MailChangedEvent;
@@ -2193,6 +2242,8 @@ export interface ChatClientEvents {
2193
2242
  roomListRoomUpdated: RoomListUpdateEvent;
2194
2243
  /** 내가 어느 기기에서 읽든 방별 미독 절대값(+version)을 통지 — 크로스-디바이스 badge 동기화. */
2195
2244
  roomListUnreadUpdated: RoomUnreadUpdatedEvent;
2245
+ /** @PM 을 불렀는데 회사 AI 가 막혀 PM 이 답하지 않음 (AI_UNAVAILABLE) — 부른 사람에게만 온다. 잠깐 알리고 사라지게. */
2246
+ aiUnavailable: AiUnavailableEvent;
2196
2247
  mailSubscribed: Record<string, unknown>;
2197
2248
  mailUnsubscribed: Record<string, unknown>;
2198
2249
  mailChanged: MailChangedEvent;
@@ -2679,6 +2730,8 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
2679
2730
  /**
2680
2731
  * 연결 완료까지 기다립니다. 이전 연결의 자동 복구가 이어지는 동안 재시도 한도 소진으로 reject하지 않습니다.
2681
2732
  * 복구 연결 시 resolve하며, 명시적 disconnect·인증 종료·최초 연결 실패 시 reject합니다.
2733
+ * 회사 구독이 없으면(서버 `NOT_SUBSCRIBED`) `code: 'NOT_SUBSCRIBED'`·`type: 'SUBSCRIPTION_REQUIRED'` 로 reject 하고
2734
+ * 재연결하지 않습니다 — {@link TalkFlowClientEvents.subscriptionRequired} 참고.
2682
2735
  */
2683
2736
  connect(jwt?: string, options?: ConnectOptions): Promise<void>;
2684
2737
  disconnect(): Promise<void>;
@@ -2686,6 +2739,11 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
2686
2739
  setToken(token: string): Promise<void>;
2687
2740
  updateToken(newToken: string): Promise<void>;
2688
2741
  isConnected(): boolean;
2742
+ /**
2743
+ * 회사 구독 대기 중인가 — 서버가 웹소켓을 `NOT_SUBSCRIBED` 로 거부해 연결을 멈췄다(결제 전·해지 회사).
2744
+ * 결제가 확인되면(`GET /api/v1/company/billing` 의 `subscription === 'ACTIVE'`) 같은 토큰으로 `connect()` 를 다시 부른다.
2745
+ */
2746
+ isSubscriptionRequired(): boolean;
2689
2747
  getState(): ConnectionStateValue;
2690
2748
  hasToken(): boolean;
2691
2749