@csntgao/ai-employee-client 0.15.2 → 0.15.4

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
@@ -263,6 +263,19 @@ interface CustomerSupportAgent {
263
263
  avatarUrl: string;
264
264
  roleName: string;
265
265
  }
266
+ interface CustomerSupportAttachment {
267
+ fileId: string;
268
+ name: string;
269
+ sizeBytes: number;
270
+ mimeType: string;
271
+ }
272
+ interface CustomerSupportAttachmentDownloadRequest {
273
+ sessionId: string;
274
+ messageId: string;
275
+ messageSequence?: string;
276
+ fileId: string;
277
+ name?: string;
278
+ }
266
279
  interface CustomerSupportMessage {
267
280
  id: string;
268
281
  sessionId: string;
@@ -271,6 +284,7 @@ interface CustomerSupportMessage {
271
284
  senderType: CustomerSupportSenderType;
272
285
  senderName: string;
273
286
  content: string;
287
+ attachments?: readonly CustomerSupportAttachment[];
274
288
  createdAt: string;
275
289
  }
276
290
  interface CustomerSupportSession {
@@ -318,6 +332,7 @@ interface CustomerSupportTransport {
318
332
  createHandoffSession?(request: CustomerSupportHandoffRequest): Promise<CustomerSupportHandoffResult>;
319
333
  listMessages(sessionId: string): Promise<CustomerSupportMessagePage>;
320
334
  sendMessage(sessionId: string, clientMessageId: string, content: string): Promise<CustomerSupportMessage>;
335
+ downloadAttachment?(request: CustomerSupportAttachmentDownloadRequest): Promise<Blob>;
321
336
  markRead?(sessionId: string, lastReadSequence: string): Promise<void>;
322
337
  }
323
338
  interface CustomerSupportClientOptions {
@@ -329,7 +344,7 @@ interface CustomerSupportClientOptions {
329
344
  requestIdFactory?: () => string;
330
345
  minimumHeartbeatMs?: number;
331
346
  }
332
- type CustomerSupportErrorCode = 'INVALID_CONFIGURATION' | 'SESSION_UNAVAILABLE' | 'HISTORY_LOAD_FAILED' | 'TOKEN_UNAVAILABLE' | 'WEBSOCKET_UNAVAILABLE' | 'WEBSOCKET_ERROR' | 'AUTHENTICATION_FAILED' | 'ORGANIZATION_CONTEXT_REQUIRED' | 'REALTIME_UNAVAILABLE' | 'CHANNEL_UNAVAILABLE' | 'PROTOCOL_ERROR' | 'SEND_FAILED' | 'SEND_IN_PROGRESS' | 'EMPTY_MESSAGE' | 'CLIENT_DESTROYED';
347
+ type CustomerSupportErrorCode = 'INVALID_CONFIGURATION' | 'SESSION_UNAVAILABLE' | 'HISTORY_LOAD_FAILED' | 'TOKEN_UNAVAILABLE' | 'WEBSOCKET_UNAVAILABLE' | 'WEBSOCKET_ERROR' | 'AUTHENTICATION_FAILED' | 'ORGANIZATION_CONTEXT_REQUIRED' | 'REALTIME_UNAVAILABLE' | 'CHANNEL_UNAVAILABLE' | 'PROTOCOL_ERROR' | 'SEND_FAILED' | 'SEND_IN_PROGRESS' | 'EMPTY_MESSAGE' | 'ATTACHMENT_DOWNLOAD_UNAVAILABLE' | 'ATTACHMENT_DOWNLOAD_FAILED' | 'CLIENT_DESTROYED';
333
348
  interface CustomerSupportErrorDetail {
334
349
  code: CustomerSupportErrorCode;
335
350
  message: string;
@@ -390,6 +405,7 @@ declare class CustomerSupportClient {
390
405
  private shouldReconnect;
391
406
  private sending;
392
407
  private historyRefresh;
408
+ private pendingRealtimeHistoryRefreshSessionId;
393
409
  private sessionsRefresh;
394
410
  private readonly readCursorStates;
395
411
  private readLifecycleGeneration;
@@ -403,6 +419,7 @@ declare class CustomerSupportClient {
403
419
  prepareNewConversation(): void;
404
420
  bindSession(sessionId: string): Promise<void>;
405
421
  sendMessage(content: string): Promise<CustomerSupportMessage>;
422
+ downloadAttachment(messageId: string, fileId: string, name?: string, messageSequence?: string): Promise<Blob>;
406
423
  listSessions(): Promise<readonly CustomerSupportSession[]>;
407
424
  destroy(): void;
408
425
  private refreshHistory;
@@ -695,4 +712,4 @@ declare function parseJsonRecord(raw: string): JsonRecord | null;
695
712
  declare function parseAiEmployeeEvent(raw: unknown): ParsedAiEmployeeEvent;
696
713
  declare function hashText(value: string): string;
697
714
 
698
- export { type AiEmployeeAssistantAction, type AiEmployeeAttachmentReference, AiEmployeeClient, AiEmployeeClientError, type AiEmployeeClientErrorDetail, type AiEmployeeClientEventMap, type AiEmployeeClientListener, type AiEmployeeClientOptions, type AiEmployeeClientStartResult, type AiEmployeeConnectionState, type AiEmployeeErrorCode, type AiEmployeeFirstMessageOptions, type AiEmployeeFirstMessageRequest, type AiEmployeeFirstMessageRequestState, type AiEmployeeFirstMessageRequestStore, type AiEmployeeFirstMessageResult, type AiEmployeeMessage, type AiEmployeeMessageRole, type AiEmployeeReconnectOptions, type AiEmployeeSessionSummary, type AiEmployeeTransport, AiEmployeeTransportError, type AiEmployeeTransportErrorCode, type AiEmployeeWebSocketFactory, type AuthenticateFrame, type CustomerSupportAgent, CustomerSupportClient, CustomerSupportClientError, type CustomerSupportClientEventMap, type CustomerSupportClientListener, type CustomerSupportClientOptions, type CustomerSupportCreateSessionRequest, type CustomerSupportCreateSessionResult, type CustomerSupportErrorCode, type CustomerSupportErrorDetail, type CustomerSupportHandoffRequest, type CustomerSupportHandoffResult, type CustomerSupportMessage, type CustomerSupportMessagePage, type CustomerSupportSenderType, type CustomerSupportSession, type CustomerSupportSessionStatus, type CustomerSupportTransport, type NotificationAttachment, NotificationCenterClient, NotificationCenterClientError, type NotificationCenterClientEventMap, type NotificationCenterClientListener, type NotificationCenterClientOptions, type NotificationCenterErrorCode, type NotificationCenterErrorDetail, type NotificationCenterTransport, type NotificationContentType, type NotificationDto, type NotificationInboxQuery, type NotificationInboxResult, type NotificationMarkAllReadResult, type NotificationMarkReadResult, type NotificationReadStatus, type NotificationRealtimeChange, type NotificationResource, type NotificationSource, type NotificationTypeSummary, type OpenCustomerSupportAssistantAction, type OpenFileAssistantAction, type ParsedAiEmployeeAssistantContent, type ParsedAiEmployeeEvent, type ParsedSessionMessage, type PingFrame, type SessionSubscriptionFrame, createAuthenticateFrame, createPingFrame, createSubscriptionFrame, hashText, isUuidV4, parseAiEmployeeAssistantContent, parseAiEmployeeEvent, parseJsonRecord };
715
+ export { type AiEmployeeAssistantAction, type AiEmployeeAttachmentReference, AiEmployeeClient, AiEmployeeClientError, type AiEmployeeClientErrorDetail, type AiEmployeeClientEventMap, type AiEmployeeClientListener, type AiEmployeeClientOptions, type AiEmployeeClientStartResult, type AiEmployeeConnectionState, type AiEmployeeErrorCode, type AiEmployeeFirstMessageOptions, type AiEmployeeFirstMessageRequest, type AiEmployeeFirstMessageRequestState, type AiEmployeeFirstMessageRequestStore, type AiEmployeeFirstMessageResult, type AiEmployeeMessage, type AiEmployeeMessageRole, type AiEmployeeReconnectOptions, type AiEmployeeSessionSummary, type AiEmployeeTransport, AiEmployeeTransportError, type AiEmployeeTransportErrorCode, type AiEmployeeWebSocketFactory, type AuthenticateFrame, type CustomerSupportAgent, type CustomerSupportAttachment, type CustomerSupportAttachmentDownloadRequest, CustomerSupportClient, CustomerSupportClientError, type CustomerSupportClientEventMap, type CustomerSupportClientListener, type CustomerSupportClientOptions, type CustomerSupportCreateSessionRequest, type CustomerSupportCreateSessionResult, type CustomerSupportErrorCode, type CustomerSupportErrorDetail, type CustomerSupportHandoffRequest, type CustomerSupportHandoffResult, type CustomerSupportMessage, type CustomerSupportMessagePage, type CustomerSupportSenderType, type CustomerSupportSession, type CustomerSupportSessionStatus, type CustomerSupportTransport, type NotificationAttachment, NotificationCenterClient, NotificationCenterClientError, type NotificationCenterClientEventMap, type NotificationCenterClientListener, type NotificationCenterClientOptions, type NotificationCenterErrorCode, type NotificationCenterErrorDetail, type NotificationCenterTransport, type NotificationContentType, type NotificationDto, type NotificationInboxQuery, type NotificationInboxResult, type NotificationMarkAllReadResult, type NotificationMarkReadResult, type NotificationReadStatus, type NotificationRealtimeChange, type NotificationResource, type NotificationSource, type NotificationTypeSummary, type OpenCustomerSupportAssistantAction, type OpenFileAssistantAction, type ParsedAiEmployeeAssistantContent, type ParsedAiEmployeeEvent, type ParsedSessionMessage, type PingFrame, type SessionSubscriptionFrame, createAuthenticateFrame, createPingFrame, createSubscriptionFrame, hashText, isUuidV4, parseAiEmployeeAssistantContent, parseAiEmployeeEvent, parseJsonRecord };
package/dist/index.js CHANGED
@@ -671,7 +671,7 @@ var AiEmployeeClient = class {
671
671
  return;
672
672
  }
673
673
  if (event.result.processing === true) this.assistantReceivedInCurrentTurn = false;
674
- if (event.result.processing !== void 0) this.setProcessing(event.result.processing);
674
+ if (event.result.processing === true) this.setProcessing(true);
675
675
  for (const text2 of event.result.activities) {
676
676
  if (!this.assistantReceivedInCurrentTurn) {
677
677
  this.emit("work-activity", { sessionId: event.sessionId, text: text2 });
@@ -686,6 +686,7 @@ var AiEmployeeClient = class {
686
686
  if (event.result.fallbackResult && !this.assistantReceivedInCurrentTurn) {
687
687
  this.appendMessage(event.result.fallbackResult, "realtime");
688
688
  }
689
+ if (event.result.processing === false) this.setProcessing(false);
689
690
  }
690
691
  subscribeCurrentSession(replayHistory, channelReady = false) {
691
692
  const sessionId = this.currentSessionId;
@@ -1367,6 +1368,7 @@ var CustomerSupportClient = class {
1367
1368
  shouldReconnect = false;
1368
1369
  sending = false;
1369
1370
  historyRefresh = null;
1371
+ pendingRealtimeHistoryRefreshSessionId = null;
1370
1372
  sessionsRefresh = null;
1371
1373
  readCursorStates = /* @__PURE__ */ new Map();
1372
1374
  readLifecycleGeneration = 0;
@@ -1497,6 +1499,37 @@ var CustomerSupportClient = class {
1497
1499
  this.sending = false;
1498
1500
  }
1499
1501
  }
1502
+ async downloadAttachment(messageId, fileId, name, messageSequence) {
1503
+ this.assertUsable();
1504
+ const sessionId = this.currentSession?.id;
1505
+ if (!sessionId) {
1506
+ throw new CustomerSupportClientError("SESSION_UNAVAILABLE", "\u5BA2\u670D\u4F1A\u8BDD\u4E0D\u5B58\u5728\u3002");
1507
+ }
1508
+ const downloadAttachment = this.transport.downloadAttachment;
1509
+ if (!downloadAttachment) {
1510
+ throw new CustomerSupportClientError(
1511
+ "ATTACHMENT_DOWNLOAD_UNAVAILABLE",
1512
+ "\u5F53\u524D\u63A5\u5165\u672A\u63D0\u4F9B\u5BA2\u670D\u9644\u4EF6\u4E0B\u8F7D\u80FD\u529B\u3002"
1513
+ );
1514
+ }
1515
+ try {
1516
+ return await downloadAttachment.call(this.transport, {
1517
+ sessionId,
1518
+ messageId: requiredText2(messageId, "messageId"),
1519
+ messageSequence,
1520
+ fileId: requiredText2(fileId, "fileId"),
1521
+ name
1522
+ });
1523
+ } catch (error) {
1524
+ if (error instanceof CustomerSupportClientError) throw error;
1525
+ const detail = this.emitError(
1526
+ "ATTACHMENT_DOWNLOAD_FAILED",
1527
+ "\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",
1528
+ true
1529
+ );
1530
+ throw new CustomerSupportClientError(detail.code, detail.message);
1531
+ }
1532
+ }
1500
1533
  async listSessions() {
1501
1534
  this.assertUsable();
1502
1535
  return this.refreshSessions();
@@ -1514,6 +1547,7 @@ var CustomerSupportClient = class {
1514
1547
  this.currentMessages = [];
1515
1548
  this.currentSessions = [];
1516
1549
  this.historyRefresh = null;
1550
+ this.pendingRealtimeHistoryRefreshSessionId = null;
1517
1551
  this.sessionsRefresh = null;
1518
1552
  this.readLifecycleGeneration += 1;
1519
1553
  this.readCursorStates.clear();
@@ -1521,7 +1555,10 @@ var CustomerSupportClient = class {
1521
1555
  async refreshHistory(realtime = false) {
1522
1556
  const session = this.currentSession;
1523
1557
  if (!session) return;
1524
- if (this.historyRefresh?.sessionId === session.id) return this.historyRefresh.promise;
1558
+ if (this.historyRefresh?.sessionId === session.id) {
1559
+ if (realtime) this.pendingRealtimeHistoryRefreshSessionId = session.id;
1560
+ return this.historyRefresh.promise;
1561
+ }
1525
1562
  const pending = (async () => {
1526
1563
  try {
1527
1564
  const page = await this.transport.listMessages(session.id);
@@ -1549,6 +1586,11 @@ var CustomerSupportClient = class {
1549
1586
  this.historyRefresh = refresh;
1550
1587
  await pending.finally(() => {
1551
1588
  if (this.historyRefresh === refresh) this.historyRefresh = null;
1589
+ if (this.pendingRealtimeHistoryRefreshSessionId !== session.id) return;
1590
+ this.pendingRealtimeHistoryRefreshSessionId = null;
1591
+ if (!this.destroyed && this.currentSession?.id === session.id) {
1592
+ void this.refreshHistory(true);
1593
+ }
1552
1594
  });
1553
1595
  }
1554
1596
  markReadIfNeeded(sessionId, latestSequence) {
@@ -1686,6 +1728,7 @@ var CustomerSupportClient = class {
1686
1728
  this.availabilityReconnectAttempt = 0;
1687
1729
  this.startHeartbeat(numberValue2(message.heartbeat_interval_seconds), socket, generation);
1688
1730
  this.setState("connected");
1731
+ void this.refreshFromRealtime();
1689
1732
  return;
1690
1733
  }
1691
1734
  if (type === "realtime_event" && message.channel === "customer_support") {
@@ -1697,6 +1740,12 @@ var CustomerSupportClient = class {
1697
1740
  void this.refreshFromRealtime();
1698
1741
  return;
1699
1742
  }
1743
+ if (type === "channel_error" && message.channel === "customer_support") {
1744
+ this.socketAuthenticationFailure = { generation, retryMode: "availability" };
1745
+ this.emitError("REALTIME_UNAVAILABLE", "\u4EBA\u5DE5\u5BA2\u670D\u5B9E\u65F6\u901A\u9053\u6682\u4E0D\u53EF\u7528\uFF0C\u6B63\u5728\u91CD\u8BD5\u3002", true);
1746
+ socket.close();
1747
+ return;
1748
+ }
1700
1749
  if (type === "authentication_error") {
1701
1750
  const failure = authenticationFailure2(normalizedText(message.code));
1702
1751
  this.socketAuthenticationFailure = { generation, retryMode: failure.retryMode };
@@ -1717,9 +1766,11 @@ var CustomerSupportClient = class {
1717
1766
  void this.refreshSessionFromRealtime();
1718
1767
  }
1719
1768
  async refreshFromRealtime() {
1720
- await this.refreshSessions().catch(() => [...this.currentSessions]);
1721
- await this.refreshSessionFromRealtime();
1722
- await this.refreshHistory(true);
1769
+ await Promise.all([
1770
+ this.refreshSessions().catch(() => [...this.currentSessions]),
1771
+ this.refreshSessionFromRealtime(),
1772
+ this.refreshHistory(true)
1773
+ ]);
1723
1774
  }
1724
1775
  async refreshSessions() {
1725
1776
  if (this.sessionsRefresh) return this.sessionsRefresh.promise;
@@ -1843,6 +1894,7 @@ var CustomerSupportClient = class {
1843
1894
  }
1844
1895
  scheduleReconnect() {
1845
1896
  if (!this.shouldReconnect || this.destroyed || this.reconnectTimer) return;
1897
+ this.setState("reconnecting");
1846
1898
  const base = Math.min(
1847
1899
  this.reconnectOptions.maximumDelayMs,
1848
1900
  this.reconnectOptions.initialDelayMs * this.reconnectOptions.factor ** this.reconnectAttempt++
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/protocol.ts","../src/client.ts","../src/assistant-actions.ts","../src/customer-support-client.ts","../src/notification-center-client.ts"],"names":["record","detail","text","authenticationFailure","result","DEFAULT_RECONNECT","MAX_AVAILABILITY_RECONNECTS","validateRealtimeUrl","createRequestId","requiredText","requiredRequestId","message","numberValue","normalizedText"],"mappings":"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","file":"index.js","sourcesContent":["import type { AiEmployeeMessage, AiEmployeeMessageRole } from './types'\n\ntype JsonRecord = Record<string, unknown>\n\nexport interface AuthenticateFrame {\n type: 'authenticate'\n protocol_version: 1\n access_token: string\n requested_channels: ['ai_employee']\n cursors: Record<string, never>\n}\n\nexport interface SessionSubscriptionFrame {\n action: 'subscribe' | 'unsubscribe'\n channel: 'ai_employee'\n resource_type: 'session'\n resource_id: string\n replay_history?: boolean\n}\n\nexport interface PingFrame {\n action: 'ping'\n timestamp: string\n}\n\nexport interface ParsedSessionMessage {\n messages: AiEmployeeMessage[]\n activities: string[]\n fallbackResult?: AiEmployeeMessage\n processing?: boolean\n}\n\nexport type ParsedAiEmployeeEvent =\n | { kind: 'session-message'; sessionId: string; result: ParsedSessionMessage }\n | { kind: 'session-title'; sessionId: string; title: string }\n | { kind: 'ignored' }\n\nexport function createAuthenticateFrame(accessToken: string): AuthenticateFrame {\n return {\n type: 'authenticate',\n protocol_version: 1,\n access_token: accessToken,\n requested_channels: ['ai_employee'],\n cursors: {},\n }\n}\n\nexport function createSubscriptionFrame(\n sessionId: string,\n action: 'subscribe' | 'unsubscribe' = 'subscribe',\n replayHistory = false,\n): SessionSubscriptionFrame {\n const frame: SessionSubscriptionFrame = {\n action,\n channel: 'ai_employee',\n resource_type: 'session',\n resource_id: sessionId,\n }\n if (action === 'subscribe') frame.replay_history = replayHistory\n return frame\n}\n\nexport function createPingFrame(now = new Date()): PingFrame {\n return { action: 'ping', timestamp: now.toISOString() }\n}\n\nexport function parseJsonRecord(raw: string): JsonRecord | null {\n try {\n return asRecord(JSON.parse(raw))\n } catch {\n return null\n }\n}\n\nexport function parseAiEmployeeEvent(raw: unknown): ParsedAiEmployeeEvent {\n const event = asRecord(raw)\n const type = stringValue(event.type)\n const sessionId = stringValue(event.session_id).trim()\n\n if (type === 'session_title_updated') {\n const title = stringValue(asRecord(event.payload).title).trim()\n return sessionId && title ? { kind: 'session-title', sessionId, title } : { kind: 'ignored' }\n }\n\n if (type !== 'session_message' || !sessionId) return { kind: 'ignored' }\n return {\n kind: 'session-message',\n sessionId,\n result: parseSessionPayload(asRecord(event.payload), sessionId),\n }\n}\n\nfunction parseSessionPayload(payload: JsonRecord, sessionId: string): ParsedSessionMessage {\n const messages: AiEmployeeMessage[] = []\n const activities: string[] = []\n const patches = Array.isArray(payload.JsonPatch) ? payload.JsonPatch : []\n\n for (const rawPatch of patches) {\n const patch = asRecord(rawPatch)\n const value = asRecord(patch.value)\n const activity = workActivityFromEntry(value)\n if (activity) activities.push(activity)\n const parsed = messageFromEntry(value, sessionId)\n if (parsed) messages.push(parsed)\n }\n\n const result = stringValue(payload.result).trim()\n const fallbackResult = result\n ? createMessage(\n sessionId,\n 'assistant',\n result,\n `result:${sessionId}:${hashText(result)}`,\n payload,\n )\n : undefined\n\n if (payload.error) {\n messages.push(\n createMessage(\n sessionId,\n 'error',\n 'AI 回复出现异常,请稍后重试。',\n `error:${sessionId}:${hashText(stableString(payload))}`,\n payload,\n ),\n )\n }\n\n let processing: boolean | undefined\n if (payload.Ready === true) processing = true\n if (payload.finished === true || payload.stopped === true) processing = false\n return { messages, activities, fallbackResult, processing }\n}\n\nfunction workActivityFromEntry(entry: JsonRecord): string {\n const entryTypeValue = entry.entry_type\n const entryType =\n typeof entryTypeValue === 'string' ? entryTypeValue : stringValue(asRecord(entryTypeValue).type)\n const entryTypeRecord = asRecord(entryTypeValue)\n if (entryType === 'thinking' || entryType === 'status_update' || entryType === 'output') {\n return safeActivityText(extractActivityText(entry.content))\n }\n if (entryType === 'loading') {\n return safeActivityText(extractActivityText(entry.content)) || '正在加载所需信息…'\n }\n if (entryType === 'tool_result') return '工具处理完成,正在继续…'\n if (entryType !== 'tool_use') return ''\n\n const actionType = asRecord(entryTypeRecord.action_type)\n const action = stringValue(actionType.action)\n if (action === 'search') {\n const query = safeActivityText(stringValue(actionType.query), 60)\n return query ? `正在搜索:${query}` : '正在搜索相关信息…'\n }\n if (action === 'web_fetch') return '正在读取网页内容…'\n if (action === 'file_read') return '正在读取资料…'\n if (action === 'file_edit') return '正在整理文件…'\n if (action === 'command_run') return '正在执行任务…'\n const toolName = safeActivityText(stringValue(entryTypeRecord.tool_name), 40)\n return toolName ? `正在调用 ${toolName}…` : '正在调用工具…'\n}\n\nfunction extractActivityText(raw: unknown): string {\n if (typeof raw !== 'string') return ''\n const value = raw.trim()\n if (!value) return ''\n try {\n const parsed: unknown = JSON.parse(value)\n if (typeof parsed === 'string') return parsed.trim()\n const activity = asRecord(parsed)\n for (const key of ['thinking', 'status', 'text', 'message', 'content', 'result']) {\n const candidate = stringValue(activity[key]).trim()\n if (candidate) return candidate\n }\n return ''\n } catch {\n return value\n }\n}\n\nfunction safeActivityText(value: string, maximumCharacters = 120): string {\n const withoutCredentials = value\n .replace(/\\bBearer\\s+[^\\s]+/gi, 'Bearer [已隐藏]')\n .replace(/\\b[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\b/g, '[已隐藏]')\n const normalized = [...withoutCredentials]\n .map((character) => {\n const codePoint = character.codePointAt(0) ?? 0\n return codePoint > 31 && codePoint !== 127 ? character : ' '\n })\n .join('')\n .replace(/\\s+/g, ' ')\n .trim()\n const characters = [...normalized]\n return characters.length <= maximumCharacters\n ? normalized\n : `${characters.slice(0, maximumCharacters).join('')}…`\n}\n\nfunction messageFromEntry(entry: JsonRecord, sessionId: string): AiEmployeeMessage | null {\n const entryTypeValue = entry.entry_type\n const entryType =\n typeof entryTypeValue === 'string' ? entryTypeValue : stringValue(asRecord(entryTypeValue).type)\n\n let role: AiEmployeeMessageRole\n switch (entryType) {\n case 'assistant_message':\n case 'result':\n role = 'assistant'\n break\n case 'user_message':\n role = 'user'\n break\n case 'system_message':\n case 'system_push':\n role = 'system'\n break\n case 'error':\n case 'error_message':\n role = 'error'\n break\n default:\n return null\n }\n\n const content = role === 'error' ? 'AI 回复出现异常,请稍后重试。' : extractText(entry.content)\n if (!content) return null\n\n const messageId = stringValue(entry.message_id)\n const webSocketMessageId = stringValue(entry.ws_message_id)\n const explicitId =\n role === 'user'\n ? messageId || webSocketMessageId || stringValue(entry.id)\n : webSocketMessageId || messageId || stringValue(entry.id)\n // 同一条消息经 replay 与实时两条路径投递时 patch 的 path/op 不同,\n // 合成 ID 只能取消息本身,否则同一条消息会得到不同 ID 而重复显示。\n const fingerprint = stableString(entry)\n const id = explicitId || `realtime:${sessionId}:${hashText(fingerprint)}`\n return createMessage(sessionId, role, content, id, entry)\n}\n\nfunction createMessage(\n sessionId: string,\n role: AiEmployeeMessageRole,\n content: string,\n id: string,\n source: JsonRecord,\n): AiEmployeeMessage {\n const createdAt =\n stringValue(source.timestamp) ||\n stringValue(source.create_time) ||\n stringValue(source.created_at) ||\n new Date().toISOString()\n return { id, sessionId, role, content, createdAt }\n}\n\nfunction extractText(raw: unknown): string {\n if (typeof raw !== 'string') return ''\n const value = raw.trim()\n if (!value) return ''\n\n try {\n const parsed: unknown = JSON.parse(value)\n if (typeof parsed === 'string') return parsed.trim()\n const record = asRecord(parsed)\n for (const key of ['text', 'result', 'message', 'content']) {\n const candidate = stringValue(record[key]).trim()\n if (candidate) return candidate\n }\n } catch {\n // Plain text and the simple user-message XML format are handled below.\n }\n\n const messageMatch = value.match(/<message>([\\s\\S]*?)<\\/message>/i)\n return (messageMatch?.[1] ?? value).trim()\n}\n\nfunction asRecord(value: unknown): JsonRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as JsonRecord)\n : {}\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction stableString(value: unknown): string {\n try {\n return JSON.stringify(value) ?? ''\n } catch {\n return ''\n }\n}\n\nexport function hashText(value: string): string {\n let hash = 2_166_136_261\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index)\n hash = Math.imul(hash, 16_777_619)\n }\n return (hash >>> 0).toString(36)\n}\n","import {\n createAuthenticateFrame,\n createPingFrame,\n createSubscriptionFrame,\n hashText,\n parseAiEmployeeEvent,\n parseJsonRecord,\n} from './protocol'\nimport type {\n AiEmployeeClientErrorDetail,\n AiEmployeeClientEventMap,\n AiEmployeeClientListener,\n AiEmployeeClientOptions,\n AiEmployeeClientStartResult,\n AiEmployeeConnectionState,\n AiEmployeeErrorCode,\n AiEmployeeFirstMessageOptions,\n AiEmployeeFirstMessageRequest,\n AiEmployeeFirstMessageRequestState,\n AiEmployeeFirstMessageRequestStore,\n AiEmployeeFirstMessageResult,\n AiEmployeeMessage,\n AiEmployeeReconnectOptions,\n AiEmployeeTransportErrorCode,\n AiEmployeeWebSocketFactory,\n} from './types'\n\ntype UntypedListener = (detail: unknown) => void\ntype JsonRecord = Record<string, unknown>\n\nconst DEFAULT_RECONNECT: AiEmployeeReconnectOptions = {\n initialDelayMs: 1_000,\n maximumDelayMs: 30_000,\n factor: 2,\n jitter: 0.2,\n}\nconst MAX_SEEN_MESSAGE_IDS = 2_000\nconst LOCAL_MESSAGE_MATCH_WINDOW_MS = 30_000\nconst MAX_AVAILABILITY_RECONNECTS = 3\nconst FIRST_MESSAGE_STORAGE_PREFIX = 'uniplat.ai-employee.first-message'\n\ntype AuthenticationRetryMode = 'token' | 'availability' | 'never'\n\ninterface SocketAuthenticationFailure {\n generation: number\n retryMode: AuthenticationRetryMode\n}\n\ninterface PendingFirstMessage {\n fingerprint: string\n requestId: string\n}\n\nexport class AiEmployeeClientError extends Error {\n readonly code: AiEmployeeErrorCode\n\n constructor(code: AiEmployeeErrorCode, message: string) {\n super(message)\n this.name = 'AiEmployeeClientError'\n this.code = code\n }\n}\n\nexport class AiEmployeeTransportError extends Error {\n readonly code: AiEmployeeTransportErrorCode\n\n constructor(code: AiEmployeeTransportErrorCode) {\n super('AI Employee transport request failed.')\n this.name = 'AiEmployeeTransportError'\n this.code = code\n }\n}\n\nexport class AiEmployeeClient {\n readonly aeCode: string\n readonly agentCode: string\n\n private readonly realtimeUrl: string\n private readonly transport: AiEmployeeClientOptions['transport']\n private readonly webSocketFactory: AiEmployeeWebSocketFactory\n private readonly reconnectOptions: AiEmployeeReconnectOptions\n private readonly minimumHeartbeatMs: number\n private readonly requestIdFactory: () => string\n private readonly firstMessageRequestStore: AiEmployeeFirstMessageRequestStore | null\n private readonly firstMessageRequestScope: string\n private readonly listeners = new Map<keyof AiEmployeeClientEventMap, Set<UntypedListener>>()\n private readonly seenMessageIds = new Set<string>()\n private readonly pendingLocalMessages = new Map<string, number>()\n private assistantReceivedInCurrentTurn = false\n\n private socket: WebSocket | null = null\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null\n private initializePromise: Promise<AiEmployeeClientStartResult> | null = null\n private currentMessages: AiEmployeeMessage[] = []\n private currentSessionId: string | null\n private currentState: AiEmployeeConnectionState = 'idle'\n private reconnectAttempt = 0\n private socketGeneration = 0\n private lifecycleGeneration = 0\n private shouldReconnect = false\n private destroyed = false\n private sending = false\n private processing = false\n private localMessageSequence = 0\n private replayHistoryOnNextSubscription = false\n private socketAuthenticationFailure: SocketAuthenticationFailure | null = null\n private availabilityReconnectAttempt = 0\n private pendingFirstMessage: PendingFirstMessage | null = null\n\n constructor(options: AiEmployeeClientOptions) {\n this.realtimeUrl = validateRealtimeUrl(options.realtimeUrl)\n this.aeCode = requiredText(options.aeCode, 'aeCode')\n this.agentCode = requiredText(options.agentCode, 'agentCode')\n if (!options.transport) {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', '缺少 transport 配置。')\n }\n if (typeof options.transport.createSessionWithFirstMessage !== 'function') {\n throw new AiEmployeeClientError(\n 'INVALID_CONFIGURATION',\n 'transport 缺少首条消息原子创建能力。',\n )\n }\n this.transport = options.transport\n this.currentSessionId = normalizeSessionId(options.sessionId)\n this.reconnectOptions = normalizeReconnectOptions(options.reconnect)\n this.minimumHeartbeatMs = Math.max(1, options.minimumHeartbeatMs ?? 5_000)\n this.requestIdFactory = options.requestIdFactory ?? createRequestId\n this.firstMessageRequestStore =\n options.firstMessageRequestStore === undefined\n ? createSessionFirstMessageRequestStore()\n : options.firstMessageRequestStore\n this.firstMessageRequestScope = `${this.aeCode}:${this.agentCode}`\n this.webSocketFactory =\n options.webSocketFactory ??\n ((url) => {\n if (typeof WebSocket === 'undefined') {\n throw new AiEmployeeClientError('WEBSOCKET_UNAVAILABLE', '当前运行环境不支持 WebSocket。')\n }\n return new WebSocket(url)\n })\n }\n\n get connectionState(): AiEmployeeConnectionState {\n return this.currentState\n }\n\n get sessionId(): string | null {\n return this.currentSessionId\n }\n\n get messages(): readonly AiEmployeeMessage[] {\n return [...this.currentMessages]\n }\n\n get isProcessing(): boolean {\n return this.processing\n }\n\n get isDestroyed(): boolean {\n return this.destroyed\n }\n\n on<K extends keyof AiEmployeeClientEventMap>(\n type: K,\n listener: AiEmployeeClientListener<K>,\n ): () => void {\n this.assertUsable()\n const listeners = this.listeners.get(type) ?? new Set<UntypedListener>()\n const untypedListener = listener as UntypedListener\n listeners.add(untypedListener)\n this.listeners.set(type, listeners)\n return () => listeners.delete(untypedListener)\n }\n\n connect(): Promise<AiEmployeeClientStartResult> {\n return this.start()\n }\n\n start(): Promise<AiEmployeeClientStartResult> {\n this.assertUsable()\n if (this.initializePromise) return this.initializePromise\n\n const lifecycle = this.lifecycleGeneration\n const pending = this.initialize(lifecycle)\n this.initializePromise = pending\n const clearPending = () => {\n if (this.initializePromise === pending) this.initializePromise = null\n }\n void pending.then(clearPending, clearPending)\n return pending\n }\n\n async bindSession(sessionId: string): Promise<AiEmployeeClientStartResult> {\n this.assertUsable()\n const target = requiredText(sessionId, 'sessionId')\n const lifecycle = ++this.lifecycleGeneration\n this.stopConnection(false)\n this.currentSessionId = target\n this.currentMessages = []\n this.seenMessageIds.clear()\n this.pendingLocalMessages.clear()\n this.assistantReceivedInCurrentTurn = false\n this.pendingFirstMessage = null\n await this.clearStoredFirstMessageRequest()\n this.replayHistoryOnNextSubscription = false\n this.shouldReconnect = true\n await this.refreshHistory(lifecycle)\n this.assertUsable()\n if (!this.isCurrentLifecycle(lifecycle)) {\n throw new AiEmployeeClientError('SESSION_UNAVAILABLE', '会话切换已被新的操作替代。')\n }\n if (this.isCurrentLifecycle(lifecycle)) this.openSocket(false)\n return { sessionId: target, messages: this.messages }\n }\n\n async startNewConversation(): Promise<AiEmployeeClientStartResult> {\n this.assertUsable()\n this.initializePromise = null\n this.lifecycleGeneration += 1\n this.stopConnection(false)\n this.currentSessionId = null\n this.currentMessages = []\n this.seenMessageIds.clear()\n this.pendingLocalMessages.clear()\n this.assistantReceivedInCurrentTurn = false\n this.pendingFirstMessage = null\n await this.clearStoredFirstMessageRequest()\n this.replayHistoryOnNextSubscription = false\n this.shouldReconnect = true\n this.openSocket(false)\n return { sessionId: null, messages: [] }\n }\n\n async refreshMessages(): Promise<readonly AiEmployeeMessage[]> {\n this.assertUsable()\n if (!this.currentSessionId) {\n throw new AiEmployeeClientError('SESSION_UNAVAILABLE', '尚未绑定数字员工会话。')\n }\n await this.refreshHistory(this.lifecycleGeneration)\n return this.messages\n }\n\n async sendMessage(\n content: string,\n options: AiEmployeeFirstMessageOptions = {},\n ): Promise<AiEmployeeMessage> {\n this.assertUsable()\n const normalizedContent = content.trim()\n if (!normalizedContent) {\n throw new AiEmployeeClientError('EMPTY_MESSAGE', '消息内容不能为空。')\n }\n if (this.sending) {\n throw new AiEmployeeClientError('SEND_IN_PROGRESS', '上一条消息仍在发送中。')\n }\n this.sending = true\n try {\n const sessionId = this.currentSessionId\n return sessionId\n ? await this.sendFollowUp(sessionId, normalizedContent)\n : await this.sendFirstMessage(normalizedContent, options)\n } catch (error) {\n if (error instanceof AiEmployeeClientError) throw error\n if (transportErrorCode(error) === 'IDEMPOTENCY_CONFLICT') {\n const detail = this.emitError(\n 'FIRST_MESSAGE_CONFLICT',\n '首条消息内容已变化,请开启新对话后重试。',\n false,\n )\n throw new AiEmployeeClientError(detail.code, detail.message)\n }\n if (transportErrorCode(error) === 'TOO_MANY_REQUESTS') {\n const detail = this.emitError('RATE_LIMITED', '请求过于频繁,请稍后再试。', false)\n throw new AiEmployeeClientError(detail.code, detail.message)\n }\n const detail = this.emitError('SEND_FAILED', '消息发送失败,请稍后重试。', true)\n throw new AiEmployeeClientError(detail.code, detail.message)\n } finally {\n this.sending = false\n }\n }\n\n disconnect(): void {\n if (this.destroyed) return\n this.lifecycleGeneration += 1\n this.stopConnection(true)\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.lifecycleGeneration += 1\n this.stopConnection(false)\n this.destroyed = true\n this.initializePromise = null\n this.setState('destroyed')\n this.listeners.clear()\n this.currentMessages = []\n this.seenMessageIds.clear()\n this.pendingLocalMessages.clear()\n this.assistantReceivedInCurrentTurn = false\n this.pendingFirstMessage = null\n }\n\n private async sendFollowUp(sessionId: string, content: string): Promise<AiEmployeeMessage> {\n this.assistantReceivedInCurrentTurn = false\n await this.transport.sendMessage(sessionId, content)\n this.assertUsable()\n const now = new Date()\n const message: AiEmployeeMessage = {\n id: `local:${now.getTime()}:${++this.localMessageSequence}`,\n sessionId,\n role: 'user',\n content,\n createdAt: now.toISOString(),\n }\n this.rememberPendingLocalMessage(content)\n this.appendMessage(message, 'local')\n this.setProcessing(true)\n return message\n }\n\n private async sendFirstMessage(\n content: string,\n options: AiEmployeeFirstMessageOptions,\n ): Promise<AiEmployeeMessage> {\n this.assistantReceivedInCurrentTurn = false\n const createSessionWithFirstMessage = this.transport.createSessionWithFirstMessage\n const lifecycle = this.lifecycleGeneration\n const normalizedOptions = normalizeFirstMessageOptions(options)\n const fingerprint = firstMessageFingerprint(content, normalizedOptions)\n if (!this.pendingFirstMessage || this.pendingFirstMessage.fingerprint !== fingerprint) {\n const stored = await this.loadStoredFirstMessageRequest()\n this.pendingFirstMessage =\n stored?.fingerprint === fingerprint\n ? stored\n : { fingerprint, requestId: requiredRequestId(this.requestIdFactory()) }\n await this.saveStoredFirstMessageRequest(this.pendingFirstMessage)\n }\n this.assertUsable()\n if (!this.isCurrentLifecycle(lifecycle) || this.currentSessionId) {\n this.pendingFirstMessage = null\n await this.clearStoredFirstMessageRequest()\n throw new AiEmployeeClientError('SESSION_UNAVAILABLE', '首条消息受理已被新的操作替代。')\n }\n const request: AiEmployeeFirstMessageRequest = {\n requestId: this.pendingFirstMessage.requestId,\n aeCode: this.aeCode,\n agentCode: this.agentCode,\n content,\n attachments: normalizedOptions.attachments,\n trustedContext: normalizedOptions.trustedContext,\n }\n const rawResult = await createSessionWithFirstMessage.call(this.transport, request)\n const result = normalizeFirstMessageResult(rawResult, this.aeCode, this.agentCode)\n this.assertUsable()\n if (!this.isCurrentLifecycle(lifecycle) || this.currentSessionId) {\n this.pendingFirstMessage = null\n await this.clearStoredFirstMessageRequest()\n throw new AiEmployeeClientError('SESSION_UNAVAILABLE', '首条消息受理已被新的操作替代。')\n }\n\n this.currentSessionId = result.sessionId\n this.pendingFirstMessage = null\n await this.clearStoredFirstMessageRequest()\n const message: AiEmployeeMessage = {\n id: result.messageId,\n sessionId: result.sessionId,\n role: 'user',\n content,\n createdAt: result.createdAt ?? result.startedAt,\n }\n // 首条消息同样要登记本地回声窗口:服务端 replay 与实时事件可能带着与\n // createSessionWithFirstMessage 不同的消息 ID 回来。\n this.rememberPendingLocalMessage(content)\n this.appendMessage(message, 'local')\n this.setProcessing(true)\n this.replayHistoryOnNextSubscription = true\n this.subscribeCurrentSession(true)\n return message\n }\n\n private async initialize(lifecycle: number): Promise<AiEmployeeClientStartResult> {\n if (!this.currentSessionId) {\n this.shouldReconnect = true\n this.openSocket(false)\n return { sessionId: null, messages: [] }\n }\n\n await this.refreshHistory(lifecycle)\n this.assertUsable()\n if (!this.isCurrentLifecycle(lifecycle)) {\n throw new AiEmployeeClientError('SESSION_UNAVAILABLE', '会话初始化已被新的操作替代。')\n }\n this.shouldReconnect = true\n this.openSocket(false)\n return { sessionId: this.currentSessionId, messages: this.messages }\n }\n\n private async loadStoredFirstMessageRequest(): Promise<PendingFirstMessage | null> {\n if (!this.firstMessageRequestStore) return null\n try {\n const state = await this.firstMessageRequestStore.load(this.firstMessageRequestScope)\n if (!state || typeof state.fingerprint !== 'string') return null\n return {\n fingerprint: state.fingerprint,\n requestId: requiredRequestId(state.requestId),\n }\n } catch {\n return null\n }\n }\n\n private async saveStoredFirstMessageRequest(state: PendingFirstMessage): Promise<void> {\n if (!this.firstMessageRequestStore) return\n try {\n await this.firstMessageRequestStore.save(this.firstMessageRequestScope, state)\n } catch {\n // Storage is a recovery enhancement; an unavailable store must not block sending.\n }\n }\n\n private async clearStoredFirstMessageRequest(): Promise<void> {\n if (!this.firstMessageRequestStore) return\n try {\n await this.firstMessageRequestStore.clear(this.firstMessageRequestScope)\n } catch {\n // A stale recovery entry is still guarded by the request fingerprint and backend conflict.\n }\n }\n\n private async refreshHistory(lifecycle: number): Promise<boolean> {\n const sessionId = this.currentSessionId\n if (!sessionId) return false\n try {\n const history = await this.transport.listMessages(sessionId)\n if (!this.isCurrentLifecycle(lifecycle) || this.currentSessionId !== sessionId) return false\n this.replaceHistory(history, sessionId)\n return true\n } catch {\n if (this.isCurrentLifecycle(lifecycle)) {\n this.emitError('HISTORY_LOAD_FAILED', '历史消息加载失败,实时连接仍会继续。', true)\n }\n return false\n }\n }\n\n private replaceHistory(history: readonly AiEmployeeMessage[], sessionId: string): void {\n const unique = new Map<string, AiEmployeeMessage>()\n for (const candidate of history) {\n const normalized = normalizeHistoryMessage(candidate, sessionId)\n if (normalized) unique.set(normalized.id, normalized)\n }\n this.currentMessages = [...unique.values()]\n this.seenMessageIds.clear()\n for (const message of this.currentMessages) this.rememberMessageId(message.id)\n this.emit('history', { sessionId, messages: this.messages })\n }\n\n private openSocket(isReconnect: boolean): void {\n if (this.destroyed || !this.shouldReconnect) return\n this.clearReconnectTimer()\n this.closeCurrentSocket()\n this.setState(isReconnect ? 'reconnecting' : 'connecting')\n\n let socket: WebSocket\n try {\n socket = this.webSocketFactory(this.realtimeUrl)\n } catch {\n this.emitError('WEBSOCKET_UNAVAILABLE', '无法建立实时连接。', true)\n this.scheduleReconnect()\n return\n }\n\n const generation = ++this.socketGeneration\n this.socket = socket\n this.socketAuthenticationFailure = null\n socket.onopen = () => void this.authenticateSocket(socket, generation)\n socket.onmessage = (event) => void this.handleSocketData(event.data, socket, generation)\n socket.onerror = () => {\n if (!this.isCurrentSocket(socket, generation)) return\n this.emitError('WEBSOCKET_ERROR', '实时连接发生异常。', true)\n }\n socket.onclose = (event) => this.handleSocketClose(socket, generation, event.code)\n }\n\n private async authenticateSocket(socket: WebSocket, generation: number): Promise<void> {\n if (!this.isCurrentSocket(socket, generation)) return\n this.setState('authenticating')\n let accessToken = ''\n try {\n accessToken = (await this.transport.getAccessToken()).trim()\n } catch {\n // Authentication errors are deliberately not propagated because they may contain credentials.\n }\n\n if (!this.isCurrentSocket(socket, generation)) return\n if (!accessToken) {\n this.emitError('TOKEN_UNAVAILABLE', '无法获取实时连接凭证。', true)\n socket.close()\n return\n }\n socket.send(JSON.stringify(createAuthenticateFrame(accessToken)))\n accessToken = ''\n }\n\n private async handleSocketData(\n data: unknown,\n socket: WebSocket,\n generation: number,\n ): Promise<void> {\n if (!this.isCurrentSocket(socket, generation)) return\n let raw = ''\n if (typeof data === 'string') raw = data\n else if (data instanceof Blob) raw = await data.text()\n else if (data instanceof ArrayBuffer) raw = new TextDecoder().decode(data)\n else {\n this.emitError('PROTOCOL_ERROR', '收到无法识别的实时消息。', true)\n return\n }\n if (!this.isCurrentSocket(socket, generation)) return\n const message = parseJsonRecord(raw)\n if (!message) {\n this.emitError('PROTOCOL_ERROR', '收到无法解析的实时消息。', true)\n return\n }\n this.handleServerMessage(message, socket, generation)\n }\n\n private handleServerMessage(message: JsonRecord, socket: WebSocket, generation: number): void {\n const type = text(message.type)\n if (type === 'realtime_ready') {\n const channels = record(message.channels)\n const aiChannel = record(channels.ai_employee)\n if (aiChannel.available !== true) {\n this.emitError('CHANNEL_UNAVAILABLE', '数字员工实时通道不可用。', false)\n this.shouldReconnect = false\n socket.close()\n return\n }\n this.reconnectAttempt = 0\n this.availabilityReconnectAttempt = 0\n this.startHeartbeat(numberValue(message.heartbeat_interval_seconds), socket, generation)\n if (this.currentSessionId) {\n this.subscribeCurrentSession(this.replayHistoryOnNextSubscription, true)\n } else {\n this.setState('connected')\n }\n return\n }\n\n if (type === 'realtime_event' && message.channel === 'ai_employee') {\n this.handleAiEmployeeEvent(message.event)\n return\n }\n\n if (type === 'channel_error' && message.channel === 'ai_employee') {\n this.handleChannelError(text(message.code))\n return\n }\n\n if (type === 'authentication_error') {\n const failure = authenticationFailure(text(message.code))\n this.socketAuthenticationFailure = { generation, retryMode: failure.retryMode }\n this.emitError(failure.code, failure.message, failure.retryMode !== 'never')\n return\n }\n\n if (type === 'protocol_error') {\n this.emitError('PROTOCOL_ERROR', '实时连接协议异常。', false)\n }\n }\n\n private handleAiEmployeeEvent(rawEvent: unknown): void {\n const event = parseAiEmployeeEvent(rawEvent)\n if (event.kind === 'ignored' || event.sessionId !== this.currentSessionId) return\n if (event.kind === 'session-title') {\n this.emit('title', { sessionId: event.sessionId, title: event.title })\n return\n }\n\n if (event.result.processing === true) this.assistantReceivedInCurrentTurn = false\n if (event.result.processing !== undefined) this.setProcessing(event.result.processing)\n for (const text of event.result.activities) {\n if (!this.assistantReceivedInCurrentTurn) {\n this.emit('work-activity', { sessionId: event.sessionId, text })\n }\n }\n for (const message of event.result.messages) {\n if (message.role === 'user') this.assistantReceivedInCurrentTurn = false\n if (message.role === 'user' && this.matchesPendingLocalMessage(message)) continue\n this.appendMessage(message, 'realtime')\n if (message.role === 'assistant') this.assistantReceivedInCurrentTurn = true\n }\n if (event.result.fallbackResult && !this.assistantReceivedInCurrentTurn) {\n this.appendMessage(event.result.fallbackResult, 'realtime')\n }\n }\n\n private subscribeCurrentSession(replayHistory: boolean, channelReady = false): void {\n const sessionId = this.currentSessionId\n const socket = this.socket\n if (\n !sessionId ||\n !socket ||\n socket.readyState !== 1 ||\n (!channelReady && this.currentState !== 'connected')\n )\n return\n this.setState('subscribing')\n socket.send(JSON.stringify(createSubscriptionFrame(sessionId, 'subscribe', replayHistory)))\n this.replayHistoryOnNextSubscription = false\n this.setState('connected')\n this.emit('ready', { sessionId })\n }\n\n private rememberPendingLocalMessage(content: string): void {\n const now = Date.now()\n for (const [pendingContent, sentAt] of this.pendingLocalMessages) {\n if (now - sentAt > LOCAL_MESSAGE_MATCH_WINDOW_MS) {\n this.pendingLocalMessages.delete(pendingContent)\n }\n }\n this.pendingLocalMessages.set(content, now)\n }\n\n /**\n * 本地已渲染的用户消息会被服务端以 replay 和实时事件多次回送,且不保证复用\n * 同一个消息 ID。窗口期内不消费该条目,多次回声都要挡住;本地发送本身每次都\n * 会追加气泡,所以重复发送同样内容不会因此丢消息。\n */\n private matchesPendingLocalMessage(message: AiEmployeeMessage): boolean {\n const sentAt = this.pendingLocalMessages.get(message.content)\n if (sentAt === undefined) return false\n if (Date.now() - sentAt <= LOCAL_MESSAGE_MATCH_WINDOW_MS) return true\n this.pendingLocalMessages.delete(message.content)\n return false\n }\n\n private appendMessage(message: AiEmployeeMessage, source: 'local' | 'realtime'): void {\n if (this.seenMessageIds.has(message.id)) return\n this.rememberMessageId(message.id)\n this.currentMessages = [...this.currentMessages, message]\n this.emit('message', { sessionId: message.sessionId, message, source })\n }\n\n private rememberMessageId(id: string): void {\n this.seenMessageIds.add(id)\n if (this.seenMessageIds.size <= MAX_SEEN_MESSAGE_IDS) return\n const oldest = this.seenMessageIds.values().next().value\n if (typeof oldest === 'string') this.seenMessageIds.delete(oldest)\n }\n\n private handleChannelError(code: string): void {\n if (code === 'SESSION_NOT_FOUND') {\n this.emitError('SESSION_NOT_FOUND', '会话不存在或当前用户无权访问。', false)\n } else {\n this.emitError('CHANNEL_UNAVAILABLE', '数字员工实时通道暂不可用。', true)\n }\n this.setProcessing(false)\n }\n\n private startHeartbeat(intervalSeconds: number, socket: WebSocket, generation: number): void {\n this.clearHeartbeatTimer()\n const requestedMs =\n Number.isFinite(intervalSeconds) && intervalSeconds > 0 ? intervalSeconds * 1_000 : 25_000\n const intervalMs = Math.max(this.minimumHeartbeatMs, requestedMs)\n this.heartbeatTimer = setInterval(() => {\n if (!this.isCurrentSocket(socket, generation) || socket.readyState !== 1) return\n socket.send(JSON.stringify(createPingFrame()))\n }, intervalMs)\n }\n\n private handleSocketClose(socket: WebSocket, generation: number, code: number): void {\n if (!this.isCurrentSocket(socket, generation)) return\n this.socket = null\n this.clearHeartbeatTimer()\n const authenticationFailure =\n this.socketAuthenticationFailure?.generation === generation\n ? this.socketAuthenticationFailure\n : null\n this.socketAuthenticationFailure = null\n if (!this.shouldReconnect || this.destroyed) {\n if (!this.destroyed) this.setState('disconnected')\n return\n }\n\n if (authenticationFailure?.retryMode === 'never') {\n this.shouldReconnect = false\n this.setState('disconnected')\n return\n }\n\n if (code === 4400 || code === 4403) {\n this.shouldReconnect = false\n if (!authenticationFailure) {\n const errorCode = code === 4403 ? 'AUTHENTICATION_FAILED' : 'PROTOCOL_ERROR'\n const message = code === 4403 ? '当前身份无权建立实时连接。' : '实时连接协议不受支持。'\n this.emitError(errorCode, message, false)\n }\n this.setState('disconnected')\n return\n }\n\n if (authenticationFailure?.retryMode === 'availability' || code === 1013) {\n if (!authenticationFailure) {\n this.emitError('REALTIME_UNAVAILABLE', '实时鉴权服务暂不可用,正在重试。', true)\n }\n this.scheduleAvailabilityReconnect()\n return\n }\n\n if (code === 4401) {\n if (!authenticationFailure) {\n this.emitError('AUTHENTICATION_FAILED', '连接凭证已失效,正在重新连接。', true)\n }\n }\n this.scheduleReconnect()\n }\n\n private scheduleAvailabilityReconnect(): void {\n if (this.availabilityReconnectAttempt >= MAX_AVAILABILITY_RECONNECTS) {\n this.shouldReconnect = false\n this.emitError('REALTIME_UNAVAILABLE', '实时鉴权服务持续不可用,请稍后重试。', false)\n this.setState('disconnected')\n return\n }\n this.availabilityReconnectAttempt += 1\n this.scheduleReconnect()\n }\n\n private scheduleReconnect(): void {\n if (this.destroyed || !this.shouldReconnect || this.reconnectTimer) return\n this.setState('reconnecting')\n const baseDelay = Math.min(\n this.reconnectOptions.initialDelayMs * this.reconnectOptions.factor ** this.reconnectAttempt,\n this.reconnectOptions.maximumDelayMs,\n )\n const jitterRange = baseDelay * this.reconnectOptions.jitter\n const delay = Math.max(0, baseDelay - jitterRange + Math.random() * jitterRange * 2)\n this.reconnectAttempt += 1\n const lifecycle = this.lifecycleGeneration\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null\n void this.recoverAndReconnect(lifecycle)\n }, delay)\n }\n\n private async recoverAndReconnect(lifecycle: number): Promise<void> {\n if (!this.isCurrentLifecycle(lifecycle) || !this.shouldReconnect) return\n const historyRecovered = await this.refreshHistory(lifecycle)\n if (!this.isCurrentLifecycle(lifecycle) || !this.shouldReconnect) return\n this.replayHistoryOnNextSubscription = !historyRecovered\n this.openSocket(true)\n }\n\n private stopConnection(setDisconnectedState: boolean): void {\n this.shouldReconnect = false\n this.clearReconnectTimer()\n this.clearHeartbeatTimer()\n this.socketAuthenticationFailure = null\n this.closeCurrentSocket()\n this.setProcessing(false)\n if (setDisconnectedState) this.setState('disconnected')\n }\n\n private closeCurrentSocket(): void {\n const socket = this.socket\n this.socket = null\n this.socketGeneration += 1\n this.socketAuthenticationFailure = null\n if (socket && socket.readyState < 2) socket.close()\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n\n private clearHeartbeatTimer(): void {\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer)\n this.heartbeatTimer = null\n }\n\n private setState(next: AiEmployeeConnectionState): void {\n if (this.currentState === next) return\n const previous = this.currentState\n this.currentState = next\n this.emit('connection-state-change', { previous, current: next })\n }\n\n private setProcessing(processing: boolean): void {\n if (this.processing === processing) return\n this.processing = processing\n this.emit('processing-state-change', { processing })\n }\n\n private emitError(\n code: AiEmployeeErrorCode,\n message: string,\n recoverable: boolean,\n ): AiEmployeeClientErrorDetail {\n const detail = { code, message, recoverable }\n this.emit('error', detail)\n return detail\n }\n\n private emit<K extends keyof AiEmployeeClientEventMap>(\n type: K,\n detail: AiEmployeeClientEventMap[K],\n ): void {\n for (const listener of this.listeners.get(type) ?? []) listener(detail)\n }\n\n private isCurrentSocket(socket: WebSocket, generation: number): boolean {\n return !this.destroyed && this.socket === socket && this.socketGeneration === generation\n }\n\n private isCurrentLifecycle(generation: number): boolean {\n return !this.destroyed && this.lifecycleGeneration === generation\n }\n\n private assertUsable(): void {\n if (this.destroyed) {\n throw new AiEmployeeClientError('CLIENT_DESTROYED', '客户端已销毁。')\n }\n }\n}\n\nfunction validateRealtimeUrl(rawUrl: string): string {\n let url: URL\n try {\n url = new URL(rawUrl)\n } catch {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', 'realtimeUrl 不是有效地址。')\n }\n if (!['ws:', 'wss:'].includes(url.protocol)) {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', 'realtimeUrl 只允许 ws: 或 wss:。')\n }\n if (url.search || url.hash || url.username || url.password) {\n throw new AiEmployeeClientError(\n 'INVALID_CONFIGURATION',\n 'realtimeUrl 不允许包含查询参数、片段或用户凭据。',\n )\n }\n return url.toString()\n}\n\nfunction requiredText(value: string, field: string): string {\n const normalized = typeof value === 'string' ? value.trim() : ''\n if (!normalized) {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', `${field} 不能为空。`)\n }\n return normalized\n}\n\nfunction normalizeSessionId(value: string | undefined): string | null {\n return typeof value === 'string' && value.trim() ? value.trim() : null\n}\n\nfunction normalizeFirstMessageOptions(options: AiEmployeeFirstMessageOptions): {\n attachments: AiEmployeeFirstMessageRequest['attachments']\n trustedContext: AiEmployeeFirstMessageRequest['trustedContext']\n} {\n const attachments = (options.attachments ?? []).map((attachment) => {\n const transactionId =\n typeof attachment.transactionId === 'string' ? attachment.transactionId.trim() : ''\n const fspath = typeof attachment.fspath === 'string' ? attachment.fspath.trim() : ''\n if (\n !transactionId ||\n !fspath.startsWith('fs/') ||\n fspath.includes('\\\\') ||\n fspath.split('/').some((segment) => segment === '..')\n ) {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息附件引用无效。')\n }\n return { transactionId, fspath }\n })\n const trustedContext = options.trustedContext ?? null\n if (\n trustedContext !== null &&\n (typeof trustedContext !== 'object' || Array.isArray(trustedContext))\n ) {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息上下文无效。')\n }\n return { attachments, trustedContext }\n}\n\nfunction firstMessageFingerprint(\n content: string,\n options: ReturnType<typeof normalizeFirstMessageOptions>,\n): string {\n const serialized = stableFirstMessageString([\n content,\n options.attachments,\n options.trustedContext,\n ])\n return `v1:${hashText(serialized)}:${hashText(`first-message:${serialized}`)}:${serialized.length}`\n}\n\nfunction stableFirstMessageString(value: unknown): string {\n const seen = new WeakSet<object>()\n const normalize = (candidate: unknown): unknown => {\n if (candidate === null || typeof candidate !== 'object') return candidate\n if (seen.has(candidate)) {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息上下文无效。')\n }\n seen.add(candidate)\n if (Array.isArray(candidate)) {\n const result = candidate.map((item) => normalize(item))\n seen.delete(candidate)\n return result\n }\n const source = candidate as Record<string, unknown>\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(source).sort()) result[key] = normalize(source[key])\n seen.delete(candidate)\n return result\n }\n return JSON.stringify(normalize(value))\n}\n\nfunction requiredRequestId(value: string): string {\n const requestId = typeof value === 'string' ? value.trim() : ''\n if (\n !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(requestId)\n ) {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', 'requestIdFactory 必须返回 UUID。')\n }\n return requestId\n}\n\nfunction createRequestId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n if (typeof crypto === 'undefined' || typeof crypto.getRandomValues !== 'function') {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', '当前环境无法安全生成 request_id。')\n }\n const bytes = crypto.getRandomValues(new Uint8Array(16))\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80\n const value = [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('')\n return `${value.slice(0, 8)}-${value.slice(8, 12)}-${value.slice(12, 16)}-${value.slice(16, 20)}-${value.slice(20)}`\n}\n\nfunction normalizeFirstMessageResult(\n value: AiEmployeeFirstMessageResult,\n expectedAeCode: string,\n expectedAgentCode: string,\n): AiEmployeeFirstMessageResult {\n if (!value || typeof value !== 'object') {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息受理响应无效。')\n }\n const sessionId = requiredFirstMessageResultText(value.sessionId)\n const messageId = requiredFirstMessageResultText(value.messageId)\n const executionId = requiredFirstMessageResultText(value.executionId)\n const aeCode = requiredFirstMessageResultText(value.aeCode)\n const agentCode = requiredFirstMessageResultText(value.agentCode)\n const conversationType = requiredFirstMessageResultText(value.conversationType)\n if (aeCode !== expectedAeCode || agentCode !== expectedAgentCode) {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息受理响应与当前数字员工不匹配。')\n }\n if (value.status !== 'running' && value.status !== 'queued') {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息受理状态无效。')\n }\n const startedAt = requiredIsoDate(value.startedAt, 'transport startedAt')\n const result: AiEmployeeFirstMessageResult = {\n sessionId,\n messageId,\n executionId,\n status: value.status,\n startedAt,\n aeCode,\n agentCode,\n conversationType,\n }\n if (typeof value.title === 'string' && value.title.trim()) result.title = value.title.trim()\n if (value.createdAt) result.createdAt = requiredIsoDate(value.createdAt, 'transport createdAt')\n return result\n}\n\nfunction requiredIsoDate(value: string, field: string): string {\n const normalized = requiredFirstMessageResultText(value)\n if (!Number.isFinite(Date.parse(normalized))) {\n throw new AiEmployeeClientError('SEND_FAILED', `${field} 不是有效时间。`)\n }\n return normalized\n}\n\nfunction requiredFirstMessageResultText(value: unknown): string {\n if (typeof value !== 'string' || !value.trim()) {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息受理响应无效。')\n }\n return value.trim()\n}\n\nfunction authenticationFailure(code: string): {\n code: AiEmployeeErrorCode\n message: string\n retryMode: AuthenticationRetryMode\n} {\n if (code === 'UNAUTHORIZED') {\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '连接凭证已失效,正在重新连接。',\n retryMode: 'token',\n }\n }\n if (code === 'ORGANIZATION_CONTEXT_REQUIRED') {\n return {\n code: 'ORGANIZATION_CONTEXT_REQUIRED',\n message: '请选择企业/团队后再开始咨询。',\n retryMode: 'never',\n }\n }\n if (code === 'INVALID_ARGUMENT') {\n return {\n code: 'PROTOCOL_ERROR',\n message: '实时连接协议不受支持。',\n retryMode: 'never',\n }\n }\n if (isRealtimeAvailabilityFailure(code)) {\n return {\n code: 'REALTIME_UNAVAILABLE',\n message: '实时鉴权服务暂不可用,正在重试。',\n retryMode: 'availability',\n }\n }\n if (code === 'AI_EMPLOYEE_NOT_AVAILABLE' || code === 'APPLICATION_NOT_SUPPORTED') {\n return {\n code: 'CHANNEL_UNAVAILABLE',\n message: '当前数字员工暂不可用。',\n retryMode: 'never',\n }\n }\n if (code === 'ACCESS_DENIED') {\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '当前身份无权建立实时连接。',\n retryMode: 'never',\n }\n }\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '实时连接认证失败。',\n retryMode: 'never',\n }\n}\n\nfunction transportErrorCode(error: unknown): AiEmployeeTransportErrorCode | null {\n if (error instanceof AiEmployeeTransportError) return error.code\n if (!error || typeof error !== 'object' || !('code' in error)) return null\n switch (error.code) {\n case 'UNAUTHORIZED':\n case 'ACCESS_DENIED':\n case 'AI_EMPLOYEE_NOT_AVAILABLE':\n case 'APPLICATION_NOT_SUPPORTED':\n case 'ORGANIZATION_CONTEXT_REQUIRED':\n case 'INVALID_ARGUMENT':\n case 'IDEMPOTENCY_CONFLICT':\n case 'REALTIME_UNAVAILABLE':\n case 'TOO_MANY_REQUESTS':\n return error.code\n default:\n return null\n }\n}\n\nfunction createSessionFirstMessageRequestStore(): AiEmployeeFirstMessageRequestStore | null {\n try {\n if (typeof sessionStorage === 'undefined') return null\n } catch {\n return null\n }\n const key = (scope: string) => `${FIRST_MESSAGE_STORAGE_PREFIX}:${hashText(scope)}`\n return {\n load(scope) {\n const raw = sessionStorage.getItem(key(scope))\n if (!raw) return null\n const parsed: unknown = JSON.parse(raw)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return null\n const state = parsed as Partial<AiEmployeeFirstMessageRequestState>\n return typeof state.fingerprint === 'string' && typeof state.requestId === 'string'\n ? { fingerprint: state.fingerprint, requestId: state.requestId }\n : null\n },\n save(scope, state) {\n sessionStorage.setItem(\n key(scope),\n JSON.stringify({ fingerprint: state.fingerprint, requestId: state.requestId }),\n )\n },\n clear(scope) {\n sessionStorage.removeItem(key(scope))\n },\n }\n}\n\nfunction isRealtimeAvailabilityFailure(code: string): boolean {\n return (\n code === 'REALTIME_UNAVAILABLE' || code === 'KANBAN_AUTH_FAILED' || code.startsWith('SERVICE_')\n )\n}\n\nfunction normalizeReconnectOptions(\n options: AiEmployeeClientOptions['reconnect'],\n): AiEmployeeReconnectOptions {\n return {\n initialDelayMs: positiveNumber(options?.initialDelayMs, DEFAULT_RECONNECT.initialDelayMs),\n maximumDelayMs: positiveNumber(options?.maximumDelayMs, DEFAULT_RECONNECT.maximumDelayMs),\n factor: Math.max(1, positiveNumber(options?.factor, DEFAULT_RECONNECT.factor)),\n jitter: Math.min(1, Math.max(0, options?.jitter ?? DEFAULT_RECONNECT.jitter)),\n }\n}\n\nfunction positiveNumber(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback\n}\n\nfunction normalizeHistoryMessage(\n candidate: AiEmployeeMessage,\n expectedSessionId: string,\n): AiEmployeeMessage | null {\n if (!candidate || typeof candidate !== 'object') return null\n const id = text(candidate.id).trim()\n const content = text(candidate.content).trim()\n const role = candidate.role\n if (!id || !content || !['user', 'assistant', 'system', 'error'].includes(role)) return null\n return {\n id,\n sessionId: expectedSessionId,\n role,\n content: role === 'error' ? '消息处理出现异常,请稍后重试。' : content,\n createdAt: text(candidate.createdAt) || new Date().toISOString(),\n }\n}\n\nfunction text(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction record(value: unknown): JsonRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as JsonRecord)\n : {}\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' ? value : Number.NaN\n}\n","export interface OpenCustomerSupportAssistantAction {\n type: 'assistant_action'\n action: 'open_customer_support'\n transactionId: string\n sessionId: string\n trigger: 'out_of_scope'\n entry: 'help_and_support'\n}\n\nexport interface OpenFileAssistantAction {\n type: 'assistant_action'\n action: 'open_file'\n transactionId: string\n sessionId: string\n name: string\n size: string\n path: string\n}\n\nexport type AiEmployeeAssistantAction = OpenCustomerSupportAssistantAction | OpenFileAssistantAction\n\nexport interface ParsedAiEmployeeAssistantContent {\n content: string\n actions: readonly AiEmployeeAssistantAction[]\n rejectedActionTypes?: readonly AiEmployeeAssistantAction['action'][]\n}\n\ninterface StructuredJsonCandidate {\n content: string\n json: string\n}\n\nconst CUSTOMER_SUPPORT_ACTION_KEYS = [\n 'action',\n 'entry',\n 'session-id',\n 'transaction-id',\n 'trigger',\n 'type',\n] as const\nconst FILE_ACTION_KEYS = [\n 'action',\n 'name',\n 'path',\n 'session-id',\n 'size',\n 'transaction-id',\n 'type',\n] as const\nconst SUPPORTED_ACTION_MARKER = /\"action\"\\s*:\\s*\"(open_customer_support|open_file)\"/g\nconst UUID_V4_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\nconst SESSION_ID_PATTERN = /^[A-Za-z0-9._:-]{1,64}$/\nconst FILE_SIZE_PATTERN = /^\\d+(?:\\.\\d+)?(?:B|KB|MB|GB|TB)$/\n\n/**\n * Parses structurally valid platform actions from consecutive standalone JSON\n * blocks at the end of an assistant response. Invalid or ambiguous trailing\n * action blocks are removed from display content, reported only by stable action\n * type, and never made executable. Renderers must additionally compare every\n * `action.sessionId` with the session that owns the message.\n */\nexport function parseAiEmployeeAssistantContent(content: string): ParsedAiEmployeeAssistantContent {\n const source = typeof content === 'string' ? content : ''\n let remaining = source\n const actions: AiEmployeeAssistantAction[] = []\n const rejectedActionTypes: AiEmployeeAssistantAction['action'][] = []\n let strippedMarkerCount = 0\n while (true) {\n const candidate = trailingStructuredJson(remaining)\n if (!candidate) break\n const candidateActionTypes = actionMarkerTypes(candidate.json)\n if (candidateActionTypes.length === 0) break\n strippedMarkerCount += candidateActionTypes.length\n let value: unknown\n try {\n value = JSON.parse(candidate.json)\n } catch {\n rejectedActionTypes.unshift(...candidateActionTypes)\n remaining = candidate.content\n continue\n }\n const action = parseAssistantAction(value)\n if (!action || candidateActionTypes.length !== 1) {\n rejectedActionTypes.unshift(...candidateActionTypes)\n } else {\n actions.unshift(action)\n }\n remaining = candidate.content\n }\n\n const sourceActionTypes = actionMarkerTypes(source)\n if (sourceActionTypes.length === 0) return unchanged(source)\n if (strippedMarkerCount !== sourceActionTypes.length) return unchanged(source)\n const transactionIds = new Set(actions.map((action) => action.transactionId))\n if (\n rejectedActionTypes.length > 0 ||\n actions.length === 0 ||\n transactionIds.size !== actions.length ||\n actions.filter((action) => action.action === 'open_customer_support').length > 1\n ) {\n return rejected(remaining, sourceActionTypes)\n }\n return Object.freeze({\n content: remaining,\n actions: Object.freeze(actions),\n })\n}\n\nexport function isUuidV4(value: unknown): value is string {\n return typeof value === 'string' && UUID_V4_PATTERN.test(value)\n}\n\nfunction trailingStructuredJson(content: string): StructuredJsonCandidate | null {\n const withoutTrailingWhitespace = content.trimEnd()\n const fencedPattern = /(?:^|\\r?\\n)[\\t ]*```json[\\t ]*\\r?\\n([\\s\\S]*?)\\r?\\n[\\t ]*```[\\t ]*/gi\n let trailingFence: RegExpMatchArray | null = null\n for (const match of withoutTrailingWhitespace.matchAll(fencedPattern)) {\n if (match.index + match[0].length === withoutTrailingWhitespace.length) {\n trailingFence = match\n }\n }\n if (trailingFence) {\n return {\n content: withoutTrailingWhitespace.slice(0, trailingFence.index).trimEnd(),\n json: trailingFence[1]?.trim() ?? '',\n }\n }\n\n const starts = [...withoutTrailingWhitespace.matchAll(/(?:^|\\r?\\n)[\\t ]*(\\{)/g)]\n for (let index = starts.length - 1; index >= 0; index -= 1) {\n const match = starts[index]\n const objectOffset =\n match?.index === undefined ? -1 : match.index + (match[0]?.indexOf('{') ?? -1)\n if (objectOffset < 0) continue\n const json = withoutTrailingWhitespace.slice(objectOffset).trim()\n try {\n JSON.parse(json)\n return {\n content: withoutTrailingWhitespace.slice(0, match?.index ?? 0).trimEnd(),\n json,\n }\n } catch {\n // Try an earlier line-start object. Nested or malformed trailing JSON is\n // never accepted merely because it contains an action-looking fragment.\n }\n }\n return null\n}\n\nfunction parseAssistantAction(value: unknown): AiEmployeeAssistantAction | null {\n if (!isRecord(value)) return null\n if (value.action === 'open_customer_support') return parseOpenCustomerSupportAction(value)\n if (value.action === 'open_file') return parseOpenFileAction(value)\n return null\n}\n\nfunction parseOpenCustomerSupportAction(value: unknown): OpenCustomerSupportAssistantAction | null {\n if (!isRecord(value)) return null\n const keys = Object.keys(value).sort()\n if (\n keys.length !== CUSTOMER_SUPPORT_ACTION_KEYS.length ||\n keys.some((key, index) => key !== CUSTOMER_SUPPORT_ACTION_KEYS[index])\n ) {\n return null\n }\n if (\n value.type !== 'assistant_action' ||\n value.action !== 'open_customer_support' ||\n !isUuidV4(value['transaction-id']) ||\n !isAssistantActionSessionId(value['session-id']) ||\n value.trigger !== 'out_of_scope' ||\n value.entry !== 'help_and_support'\n ) {\n return null\n }\n return Object.freeze({\n type: 'assistant_action',\n action: 'open_customer_support',\n transactionId: value['transaction-id'],\n sessionId: value['session-id'],\n trigger: 'out_of_scope',\n entry: 'help_and_support',\n })\n}\n\nfunction parseOpenFileAction(value: unknown): OpenFileAssistantAction | null {\n if (!isRecord(value)) return null\n const keys = Object.keys(value).sort()\n if (\n keys.length !== FILE_ACTION_KEYS.length ||\n keys.some((key, index) => key !== FILE_ACTION_KEYS[index])\n ) {\n return null\n }\n const transactionId = value['transaction-id']\n const sessionId = value['session-id']\n const name = value.name\n const size = value.size\n const path = value.path\n if (\n value.type !== 'assistant_action' ||\n value.action !== 'open_file' ||\n !isCanonicalUuidV4(transactionId) ||\n !isAssistantActionSessionId(sessionId) ||\n !isSafeRelativeFilePath(path) ||\n typeof name !== 'string' ||\n !name ||\n name !== name.trim() ||\n name !== path.slice(path.lastIndexOf('/') + 1) ||\n typeof size !== 'string' ||\n size !== size.trim() ||\n !FILE_SIZE_PATTERN.test(size)\n ) {\n return null\n }\n return Object.freeze({\n type: 'assistant_action',\n action: 'open_file',\n transactionId,\n sessionId,\n name,\n size,\n path,\n })\n}\n\nfunction isAssistantActionSessionId(value: unknown): value is string {\n return typeof value === 'string' && SESSION_ID_PATTERN.test(value)\n}\n\nfunction actionMarkerTypes(value: string): AiEmployeeAssistantAction['action'][] {\n return [...value.matchAll(SUPPORTED_ACTION_MARKER)].flatMap((match) => {\n const action = match[1]\n return action === 'open_customer_support' || action === 'open_file' ? [action] : []\n })\n}\n\nfunction isCanonicalUuidV4(value: unknown): value is string {\n return isUuidV4(value) && value === value.toLowerCase()\n}\n\nfunction isSafeRelativeFilePath(value: unknown): value is string {\n if (\n typeof value !== 'string' ||\n !value ||\n value !== value.trim() ||\n value.startsWith('/') ||\n value.startsWith('\\\\') ||\n value.includes('\\\\') ||\n /^[A-Za-z]:/.test(value) ||\n hasControlCharacter(value)\n ) {\n return false\n }\n return value\n .split('/')\n .every((part) => part && part !== '.' && part !== '..' && !part.startsWith('.'))\n}\n\nfunction hasControlCharacter(value: string): boolean {\n return [...value].some((character) => {\n const codePoint = character.codePointAt(0) ?? 0\n return codePoint <= 31 || codePoint === 127\n })\n}\n\nfunction unchanged(content: string): ParsedAiEmployeeAssistantContent {\n return Object.freeze({ content, actions: Object.freeze([]) })\n}\n\nfunction rejected(\n content: string,\n actionTypes: readonly AiEmployeeAssistantAction['action'][],\n): ParsedAiEmployeeAssistantContent {\n return Object.freeze({\n content,\n actions: Object.freeze([]),\n rejectedActionTypes: Object.freeze([...new Set(actionTypes)]),\n })\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n","import { createPingFrame, parseJsonRecord } from './protocol'\nimport type {\n CustomerSupportClientEventMap,\n CustomerSupportClientListener,\n CustomerSupportClientOptions,\n CustomerSupportErrorCode,\n CustomerSupportErrorDetail,\n CustomerSupportMessage,\n CustomerSupportSession,\n} from './customer-support-types'\nimport type { AiEmployeeConnectionState, AiEmployeeReconnectOptions } from './types'\n\ntype UntypedListener = (detail: unknown) => void\ntype JsonRecord = Record<string, unknown>\n\nconst DEFAULT_RECONNECT: AiEmployeeReconnectOptions = {\n initialDelayMs: 1_000,\n maximumDelayMs: 30_000,\n factor: 2,\n jitter: 0.2,\n}\nconst MAX_TOKEN_RECONNECTS = 1\nconst MAX_AVAILABILITY_RECONNECTS = 3\n\ntype AuthenticationRetryMode = 'token' | 'availability' | 'never'\n\ninterface SocketAuthenticationFailure {\n generation: number\n retryMode: AuthenticationRetryMode\n}\n\ninterface CustomerSupportReadCursorState {\n acknowledged: string\n inFlight: string | null\n pending: string | null\n generation: number\n}\n\ninterface CustomerSupportHistoryRefresh {\n sessionId: string\n promise: Promise<void>\n}\n\ninterface CustomerSupportSessionsRefresh {\n promise: Promise<readonly CustomerSupportSession[]>\n}\n\nexport class CustomerSupportClientError extends Error {\n readonly code: CustomerSupportErrorCode\n\n constructor(code: CustomerSupportErrorCode, message: string) {\n super(message)\n this.name = 'CustomerSupportClientError'\n this.code = code\n }\n}\n\nexport class CustomerSupportClient {\n private readonly realtimeUrl: string\n private readonly transport: CustomerSupportClientOptions['transport']\n private readonly webSocketFactory: (url: string) => WebSocket\n private readonly requestIdFactory: () => string\n private readonly reconnectOptions: AiEmployeeReconnectOptions\n private readonly minimumHeartbeatMs: number\n private readonly listeners = new Map<keyof CustomerSupportClientEventMap, Set<UntypedListener>>()\n\n private currentSession: CustomerSupportSession | null = null\n private currentSessions: CustomerSupportSession[] = []\n private currentMessages: CustomerSupportMessage[] = []\n private currentState: AiEmployeeConnectionState = 'idle'\n private socket: WebSocket | null = null\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private reconnectAttempt = 0\n private tokenReconnectAttempt = 0\n private availabilityReconnectAttempt = 0\n private socketGeneration = 0\n private socketAuthenticationFailure: SocketAuthenticationFailure | null = null\n private destroyed = false\n private shouldReconnect = false\n private sending = false\n private historyRefresh: CustomerSupportHistoryRefresh | null = null\n private sessionsRefresh: CustomerSupportSessionsRefresh | null = null\n private readonly readCursorStates = new Map<string, CustomerSupportReadCursorState>()\n private readLifecycleGeneration = 0\n private requestedSessionId: string | null\n\n constructor(options: CustomerSupportClientOptions) {\n this.realtimeUrl = validateRealtimeUrl(options.realtimeUrl)\n if (!options.transport) {\n throw new CustomerSupportClientError('INVALID_CONFIGURATION', '缺少客服 transport 配置。')\n }\n this.transport = options.transport\n this.requestedSessionId = normalizedText(options.sessionId) || null\n this.requestIdFactory = options.requestIdFactory ?? createRequestId\n this.reconnectOptions = normalizeReconnect(options.reconnect)\n this.minimumHeartbeatMs = Math.max(1, options.minimumHeartbeatMs ?? 5_000)\n this.webSocketFactory =\n options.webSocketFactory ??\n ((url) => {\n if (typeof WebSocket === 'undefined') {\n throw new CustomerSupportClientError(\n 'WEBSOCKET_UNAVAILABLE',\n '当前运行环境不支持 WebSocket。',\n )\n }\n return new WebSocket(url)\n })\n }\n\n get session(): CustomerSupportSession | null {\n return this.currentSession\n }\n\n get messages(): readonly CustomerSupportMessage[] {\n return [...this.currentMessages]\n }\n\n get connectionState(): AiEmployeeConnectionState {\n return this.currentState\n }\n\n on<K extends keyof CustomerSupportClientEventMap>(\n type: K,\n listener: CustomerSupportClientListener<K>,\n ): () => void {\n this.assertUsable()\n const listeners = this.listeners.get(type) ?? new Set<UntypedListener>()\n const untyped = listener as UntypedListener\n listeners.add(untyped)\n this.listeners.set(type, listeners)\n return () => listeners.delete(untyped)\n }\n\n async start(): Promise<void> {\n this.assertUsable()\n try {\n const sessions = await this.transport.listSessions()\n this.assertUsable()\n this.replaceSessions(sessions)\n const requested = this.requestedSessionId\n this.currentSession = requested\n ? (sessions.find((session) => session.id === requested) ?? null)\n : (sessions.find(\n (session) => session.status !== 'closed' && hasCustomerSupportMessages(session),\n ) ??\n sessions.find(hasCustomerSupportMessages) ??\n null)\n if (this.currentSession) {\n this.emit('session', { session: this.currentSession })\n await this.refreshHistory()\n }\n } catch {\n this.emitError('HISTORY_LOAD_FAILED', '客服会话加载失败,实时连接仍会继续。', true)\n }\n this.shouldReconnect = true\n this.openSocket(false)\n this.emit('ready', { sessionId: this.currentSession?.id ?? null })\n }\n\n prepareNewConversation(): void {\n this.assertUsable()\n this.currentSession = null\n this.requestedSessionId = null\n this.currentMessages = []\n }\n\n async bindSession(sessionId: string): Promise<void> {\n this.assertUsable()\n const normalized = requiredText(sessionId, 'sessionId')\n const sessions = await this.transport.listSessions()\n this.replaceSessions(sessions)\n const session = sessions.find((candidate) => candidate.id === normalized)\n if (!session) {\n throw new CustomerSupportClientError('SESSION_UNAVAILABLE', '客服会话不存在。')\n }\n this.currentSession = session\n this.requestedSessionId = session.id\n this.emit('session', { session })\n await this.refreshHistory()\n }\n\n async sendMessage(content: string): Promise<CustomerSupportMessage> {\n this.assertUsable()\n const normalized = content.trim()\n if (!normalized) throw new CustomerSupportClientError('EMPTY_MESSAGE', '消息内容不能为空。')\n if (this.sending) {\n throw new CustomerSupportClientError('SEND_IN_PROGRESS', '上一条消息仍在发送中。')\n }\n this.sending = true\n try {\n if (!this.currentSession) {\n const result = await this.transport.createSession({\n clientRequestId: requiredRequestId(this.requestIdFactory()),\n title: normalized.slice(0, 30),\n initialMessage: normalized,\n })\n this.assertUsable()\n this.currentSession = result.session\n this.upsertSession(result.session)\n this.requestedSessionId = result.session.id\n this.emit('session', { session: result.session })\n let message = result.initialMessage\n if (!message) {\n const page = await this.transport.listMessages(result.session.id)\n message = [...page.messages]\n .reverse()\n .find(\n (candidate) =>\n candidate.senderType === 'customer' && candidate.content.trim() === normalized,\n )\n this.currentMessages = page.messages.filter((candidate) => candidate.id !== message?.id)\n }\n if (!message) throw new Error('Missing initial message')\n this.appendMessage(message, 'local')\n return message\n }\n const message = await this.transport.sendMessage(\n this.currentSession.id,\n requiredRequestId(this.requestIdFactory()),\n normalized,\n )\n this.assertUsable()\n this.appendMessage(message, 'local')\n return message\n } catch (error) {\n if (error instanceof CustomerSupportClientError) throw error\n const detail = this.emitError('SEND_FAILED', '消息发送失败,请稍后重试。', true)\n throw new CustomerSupportClientError(detail.code, detail.message)\n } finally {\n this.sending = false\n }\n }\n\n async listSessions(): Promise<readonly CustomerSupportSession[]> {\n this.assertUsable()\n return this.refreshSessions()\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.shouldReconnect = false\n this.clearTimers()\n this.socketGeneration += 1\n this.socket?.close()\n this.socket = null\n this.setState('destroyed')\n this.listeners.clear()\n this.currentMessages = []\n this.currentSessions = []\n this.historyRefresh = null\n this.sessionsRefresh = null\n this.readLifecycleGeneration += 1\n this.readCursorStates.clear()\n }\n\n private async refreshHistory(realtime = false): Promise<void> {\n const session = this.currentSession\n if (!session) return\n if (this.historyRefresh?.sessionId === session.id) return this.historyRefresh.promise\n const pending = (async () => {\n try {\n const page = await this.transport.listMessages(session.id)\n if (this.destroyed || this.currentSession?.id !== session.id) return\n const unique = new Map<string, CustomerSupportMessage>()\n for (const message of page.messages) {\n if (message.sessionId === session.id && message.id) unique.set(message.id, message)\n }\n const previousIds = new Set(this.currentMessages.map((message) => message.id))\n this.currentMessages = [...unique.values()].sort(compareMessages)\n this.emit('history', { sessionId: session.id, messages: this.messages })\n if (realtime) {\n for (const message of this.currentMessages) {\n if (!previousIds.has(message.id)) {\n this.emit('message', { sessionId: session.id, message, source: 'realtime' })\n }\n }\n }\n this.markReadIfNeeded(session.id, page.latestSequence)\n } catch {\n this.emitError('HISTORY_LOAD_FAILED', '历史消息加载失败,实时连接仍会继续。', true)\n }\n })()\n const refresh = { sessionId: session.id, promise: pending }\n this.historyRefresh = refresh\n await pending.finally(() => {\n if (this.historyRefresh === refresh) this.historyRefresh = null\n })\n }\n\n private markReadIfNeeded(sessionId: string, latestSequence: string): void {\n const markRead = this.transport.markRead\n const cursor = normalizeReadCursor(latestSequence)\n if (!markRead || !cursor || compareReadCursors(cursor, '0') <= 0 || this.destroyed) return\n const state = this.readCursorState(sessionId)\n if (compareReadCursors(cursor, state.acknowledged) <= 0) return\n if (state.inFlight) {\n if (compareReadCursors(cursor, state.inFlight) > 0) {\n state.pending = maxReadCursor(state.pending, cursor)\n }\n return\n }\n this.submitReadCursor(sessionId, cursor, state, markRead)\n }\n\n private submitReadCursor(\n sessionId: string,\n cursor: string,\n state: CustomerSupportReadCursorState,\n markRead: NonNullable<CustomerSupportClientOptions['transport']['markRead']>,\n ): void {\n const lifecycleGeneration = this.readLifecycleGeneration\n const requestGeneration = ++state.generation\n state.inFlight = cursor\n let request: Promise<void>\n try {\n request = markRead.call(this.transport, sessionId, cursor)\n } catch {\n state.inFlight = null\n state.pending = null\n return\n }\n void request\n .then(() => {\n if (!this.isCurrentReadRequest(state, lifecycleGeneration, requestGeneration, cursor))\n return\n state.acknowledged = maxReadCursor(state.acknowledged, cursor)\n const next = state.pending\n state.pending = null\n state.inFlight = null\n if (next && compareReadCursors(next, state.acknowledged) > 0) {\n this.submitReadCursor(sessionId, next, state, markRead)\n }\n })\n .catch(() => {\n if (!this.isCurrentReadRequest(state, lifecycleGeneration, requestGeneration, cursor))\n return\n state.inFlight = null\n state.pending = null\n })\n }\n\n private readCursorState(sessionId: string): CustomerSupportReadCursorState {\n const current = this.readCursorStates.get(sessionId)\n if (current) return current\n const created: CustomerSupportReadCursorState = {\n acknowledged: '0',\n inFlight: null,\n pending: null,\n generation: 0,\n }\n this.readCursorStates.set(sessionId, created)\n return created\n }\n\n private isCurrentReadRequest(\n state: CustomerSupportReadCursorState,\n lifecycleGeneration: number,\n requestGeneration: number,\n cursor: string,\n ): boolean {\n return (\n !this.destroyed &&\n this.readLifecycleGeneration === lifecycleGeneration &&\n state.generation === requestGeneration &&\n state.inFlight === cursor\n )\n }\n\n private openSocket(reconnecting: boolean): void {\n if (this.destroyed || !this.shouldReconnect) return\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer)\n this.socket?.close()\n this.setState(reconnecting ? 'reconnecting' : 'connecting')\n let socket: WebSocket\n try {\n socket = this.webSocketFactory(this.realtimeUrl)\n } catch {\n this.emitError('WEBSOCKET_UNAVAILABLE', '无法建立客服实时连接。', true)\n this.scheduleReconnect()\n return\n }\n const generation = ++this.socketGeneration\n this.socket = socket\n socket.onopen = () => void this.authenticate(socket, generation)\n socket.onmessage = (event) => void this.handleSocketData(event.data, socket, generation)\n socket.onerror = () => {\n if (this.isCurrentSocket(socket, generation)) {\n this.emitError('WEBSOCKET_ERROR', '客服实时连接发生异常。', true)\n }\n }\n socket.onclose = (event) => this.handleSocketClose(socket, generation, event.code)\n }\n\n private async authenticate(socket: WebSocket, generation: number): Promise<void> {\n if (!this.isCurrentSocket(socket, generation)) return\n this.setState('authenticating')\n let accessToken = ''\n try {\n accessToken = (await this.transport.getAccessToken()).trim()\n } catch {\n // Provider errors may contain credentials and are intentionally discarded.\n }\n if (!this.isCurrentSocket(socket, generation)) return\n if (!accessToken) {\n this.emitError('TOKEN_UNAVAILABLE', '无法获取客服实时连接凭证。', true)\n socket.close()\n return\n }\n socket.send(\n JSON.stringify({\n type: 'authenticate',\n protocol_version: 1,\n access_token: accessToken,\n requested_channels: ['customer_support'],\n cursors: {},\n }),\n )\n accessToken = ''\n }\n\n private async handleSocketData(\n data: unknown,\n socket: WebSocket,\n generation: number,\n ): Promise<void> {\n if (!this.isCurrentSocket(socket, generation)) return\n let raw = ''\n if (typeof data === 'string') raw = data\n else if (data instanceof Blob) raw = await data.text()\n else if (data instanceof ArrayBuffer) raw = new TextDecoder().decode(data)\n const message = raw ? parseJsonRecord(raw) : null\n if (!message) {\n this.emitError('PROTOCOL_ERROR', '收到无法解析的客服实时消息。', true)\n return\n }\n this.handleServerMessage(message, socket, generation)\n }\n\n private handleServerMessage(message: JsonRecord, socket: WebSocket, generation: number): void {\n const type = normalizedText(message.type)\n if (type === 'realtime_ready') {\n const channels = record(message.channels)\n if (record(channels.customer_support).available !== true) {\n this.shouldReconnect = false\n this.emitError('CHANNEL_UNAVAILABLE', '人工客服实时通道不可用。', false)\n socket.close()\n return\n }\n this.reconnectAttempt = 0\n this.tokenReconnectAttempt = 0\n this.availabilityReconnectAttempt = 0\n this.startHeartbeat(numberValue(message.heartbeat_interval_seconds), socket, generation)\n this.setState('connected')\n return\n }\n if (type === 'realtime_event' && message.channel === 'customer_support') {\n const event = record(message.event)\n this.handleCustomerSupportEvent(event)\n return\n }\n if (type === 'channel_resync_required' && message.channel === 'customer_support') {\n void this.refreshFromRealtime()\n return\n }\n if (type === 'authentication_error') {\n const failure = authenticationFailure(normalizedText(message.code))\n this.socketAuthenticationFailure = { generation, retryMode: failure.retryMode }\n this.emitError(failure.code, failure.message, failure.retryMode !== 'never')\n }\n }\n\n private handleCustomerSupportEvent(event: JsonRecord): void {\n const eventType = normalizedText(event.event_type)\n const sessionId = normalizedText(event.session_id)\n if (!eventType || !sessionId) return\n this.refreshSessionsFromRealtime()\n if (sessionId !== this.currentSession?.id) return\n if (eventType === 'support_read_state_changed') return\n if (eventType === 'support_message_created') {\n void this.refreshHistory(true)\n return\n }\n void this.refreshSessionFromRealtime()\n }\n\n private async refreshFromRealtime(): Promise<void> {\n await this.refreshSessions().catch(() => [...this.currentSessions])\n await this.refreshSessionFromRealtime()\n await this.refreshHistory(true)\n }\n\n private async refreshSessions(): Promise<readonly CustomerSupportSession[]> {\n if (this.sessionsRefresh) return this.sessionsRefresh.promise\n const pending = (async () => {\n const sessions = await this.transport.listSessions()\n if (!this.destroyed) this.replaceSessions(sessions)\n return [...this.currentSessions]\n })()\n const refresh = { promise: pending }\n this.sessionsRefresh = refresh\n return pending.finally(() => {\n if (this.sessionsRefresh === refresh) this.sessionsRefresh = null\n })\n }\n\n private refreshSessionsFromRealtime(): void {\n void this.refreshSessions().catch(() => {\n // A later realtime event, panel refresh or resync can recover the list projection.\n })\n }\n\n private replaceSessions(sessions: readonly CustomerSupportSession[]): void {\n this.currentSessions = [...sessions]\n this.emit('sessions', { sessions: [...this.currentSessions] })\n }\n\n private upsertSession(session: CustomerSupportSession): void {\n const currentIndex = this.currentSessions.findIndex((candidate) => candidate.id === session.id)\n if (currentIndex < 0) this.currentSessions = [session, ...this.currentSessions]\n else {\n this.currentSessions = this.currentSessions.map((candidate, index) =>\n index === currentIndex ? session : candidate,\n )\n }\n this.emit('sessions', { sessions: [...this.currentSessions] })\n }\n\n private async refreshSessionFromRealtime(): Promise<void> {\n const sessionId = this.currentSession?.id\n const getSession = this.transport.getSession\n if (!sessionId || !getSession) return\n try {\n const session = await getSession.call(this.transport, sessionId)\n if (!this.destroyed && this.currentSession?.id === sessionId) {\n this.currentSession = session\n this.emit('session', { session })\n }\n } catch {\n // A later realtime event or resync can recover the optional session projection.\n }\n }\n\n private appendMessage(message: CustomerSupportMessage, source: 'local' | 'realtime'): void {\n if (this.currentMessages.some((candidate) => candidate.id === message.id)) return\n this.currentMessages = [...this.currentMessages, message].sort(compareMessages)\n this.emit('message', { sessionId: message.sessionId, message, source })\n }\n\n private startHeartbeat(intervalSeconds: number, socket: WebSocket, generation: number): void {\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer)\n const requested = intervalSeconds > 0 ? intervalSeconds * 1_000 : 25_000\n this.heartbeatTimer = setInterval(\n () => {\n if (this.isCurrentSocket(socket, generation) && socket.readyState === 1) {\n socket.send(JSON.stringify(createPingFrame()))\n }\n },\n Math.max(this.minimumHeartbeatMs, requested),\n )\n }\n\n private handleSocketClose(socket: WebSocket, generation: number, code: number): void {\n if (!this.isCurrentSocket(socket, generation)) return\n this.socket = null\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer)\n this.heartbeatTimer = null\n const authenticationFailure =\n this.socketAuthenticationFailure?.generation === generation\n ? this.socketAuthenticationFailure\n : null\n this.socketAuthenticationFailure = null\n if (!this.shouldReconnect || this.destroyed) {\n if (!this.destroyed) this.setState('disconnected')\n return\n }\n if (authenticationFailure?.retryMode === 'never') {\n this.shouldReconnect = false\n this.setState('disconnected')\n return\n }\n if (code === 4400 || code === 4403) {\n this.shouldReconnect = false\n if (!authenticationFailure) {\n this.emitError(\n code === 4400 ? 'PROTOCOL_ERROR' : 'AUTHENTICATION_FAILED',\n code === 4400 ? '客服实时连接协议不受支持。' : '当前身份无权使用人工客服。',\n false,\n )\n }\n this.setState('disconnected')\n return\n }\n if (authenticationFailure?.retryMode === 'availability' || code === 1013) {\n if (!authenticationFailure) {\n this.emitError('REALTIME_UNAVAILABLE', '客服实时鉴权服务暂不可用,正在重试。', true)\n }\n this.scheduleAvailabilityReconnect()\n return\n }\n if (authenticationFailure?.retryMode === 'token' || code === 4401) {\n if (!authenticationFailure) {\n this.emitError('AUTHENTICATION_FAILED', '客服连接凭证已失效,正在重新连接。', true)\n }\n if (this.tokenReconnectAttempt >= MAX_TOKEN_RECONNECTS) {\n this.shouldReconnect = false\n this.emitError('AUTHENTICATION_FAILED', '人工客服身份验证失败,请重新登录后再试。', false)\n this.setState('disconnected')\n return\n }\n this.tokenReconnectAttempt += 1\n }\n this.scheduleReconnect()\n }\n\n private scheduleAvailabilityReconnect(): void {\n if (this.availabilityReconnectAttempt >= MAX_AVAILABILITY_RECONNECTS) {\n this.shouldReconnect = false\n this.emitError('REALTIME_UNAVAILABLE', '客服实时鉴权服务持续不可用,请稍后重试。', false)\n this.setState('disconnected')\n return\n }\n this.availabilityReconnectAttempt += 1\n this.scheduleReconnect()\n }\n\n private scheduleReconnect(): void {\n if (!this.shouldReconnect || this.destroyed || this.reconnectTimer) return\n const base = Math.min(\n this.reconnectOptions.maximumDelayMs,\n this.reconnectOptions.initialDelayMs *\n this.reconnectOptions.factor ** this.reconnectAttempt++,\n )\n const jitter = base * this.reconnectOptions.jitter * (Math.random() * 2 - 1)\n this.reconnectTimer = setTimeout(\n () => {\n this.reconnectTimer = null\n this.openSocket(true)\n },\n Math.max(0, base + jitter),\n )\n }\n\n private clearTimers(): void {\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer)\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer)\n this.heartbeatTimer = null\n this.reconnectTimer = null\n }\n\n private isCurrentSocket(socket: WebSocket, generation: number): boolean {\n return !this.destroyed && this.socket === socket && this.socketGeneration === generation\n }\n\n private setState(current: AiEmployeeConnectionState): void {\n if (this.currentState === current) return\n const previous = this.currentState\n this.currentState = current\n this.emit('connection-state-change', { previous, current })\n }\n\n private emitError(\n code: CustomerSupportErrorCode,\n message: string,\n recoverable: boolean,\n ): CustomerSupportErrorDetail {\n const detail = { code, message, recoverable }\n this.emit('error', detail)\n return detail\n }\n\n private emit<K extends keyof CustomerSupportClientEventMap>(\n type: K,\n detail: CustomerSupportClientEventMap[K],\n ): void {\n for (const listener of this.listeners.get(type) ?? []) listener(detail)\n }\n\n private assertUsable(): void {\n if (this.destroyed) {\n throw new CustomerSupportClientError('CLIENT_DESTROYED', '客服客户端已经销毁。')\n }\n }\n}\n\nfunction validateRealtimeUrl(value: string): string {\n let url: URL\n try {\n url = new URL(value)\n } catch {\n throw new CustomerSupportClientError('INVALID_CONFIGURATION', '客服实时地址无效。')\n }\n if (!['ws:', 'wss:'].includes(url.protocol) || url.search || url.hash || url.username) {\n throw new CustomerSupportClientError('INVALID_CONFIGURATION', '客服实时地址不安全。')\n }\n return url.href\n}\n\nfunction normalizeReconnect(\n value?: Partial<AiEmployeeReconnectOptions>,\n): AiEmployeeReconnectOptions {\n return {\n initialDelayMs: Math.max(0, value?.initialDelayMs ?? DEFAULT_RECONNECT.initialDelayMs),\n maximumDelayMs: Math.max(1, value?.maximumDelayMs ?? DEFAULT_RECONNECT.maximumDelayMs),\n factor: Math.max(1, value?.factor ?? DEFAULT_RECONNECT.factor),\n jitter: Math.min(1, Math.max(0, value?.jitter ?? DEFAULT_RECONNECT.jitter)),\n }\n}\n\nfunction compareMessages(left: CustomerSupportMessage, right: CustomerSupportMessage): number {\n const leftSequence = Number(left.sequence)\n const rightSequence = Number(right.sequence)\n if (Number.isFinite(leftSequence) && Number.isFinite(rightSequence)) {\n return leftSequence - rightSequence\n }\n return left.createdAt.localeCompare(right.createdAt)\n}\n\nfunction normalizeReadCursor(value: unknown): string | null {\n const cursor = normalizedText(value)\n if (!/^\\d+$/.test(cursor)) return null\n return cursor.replace(/^0+(?=\\d)/, '')\n}\n\nfunction compareReadCursors(left: string, right: string): number {\n if (left.length !== right.length) return left.length < right.length ? -1 : 1\n if (left === right) return 0\n return left < right ? -1 : 1\n}\n\nfunction maxReadCursor(left: string | null, right: string): string {\n return left && compareReadCursors(left, right) >= 0 ? left : right\n}\n\nfunction hasCustomerSupportMessages(session: CustomerSupportSession): boolean {\n return session.lastMessage.trim().length > 0\n}\n\nfunction requiredText(value: unknown, field: string): string {\n const normalized = normalizedText(value)\n if (!normalized) {\n throw new CustomerSupportClientError('INVALID_CONFIGURATION', `${field} 不能为空。`)\n }\n return normalized\n}\n\nfunction requiredRequestId(value: string): string {\n return requiredText(value, 'requestId')\n}\n\nfunction normalizedText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction record(value: unknown): JsonRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as JsonRecord)\n : {}\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0\n}\n\nfunction createRequestId(): string {\n return typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `request-${Date.now()}-${Math.random().toString(16).slice(2)}`\n}\n\nfunction authenticationFailure(code: string): {\n code: CustomerSupportErrorCode\n message: string\n retryMode: AuthenticationRetryMode\n} {\n if (code === 'UNAUTHORIZED') {\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '客服连接凭证已失效,正在重新连接。',\n retryMode: 'token',\n }\n }\n if (code === 'ORGANIZATION_CONTEXT_REQUIRED') {\n return {\n code: 'ORGANIZATION_CONTEXT_REQUIRED',\n message: '请选择企业/团队后再联系人工客服。',\n retryMode: 'never',\n }\n }\n if (code === 'INVALID_ARGUMENT') {\n return {\n code: 'PROTOCOL_ERROR',\n message: '客服实时连接协议不受支持。',\n retryMode: 'never',\n }\n }\n if (\n code === 'REALTIME_UNAVAILABLE' ||\n code === 'KANBAN_AUTH_FAILED' ||\n code.startsWith('SERVICE_')\n ) {\n return {\n code: 'REALTIME_UNAVAILABLE',\n message: '客服实时鉴权服务暂不可用,正在重试。',\n retryMode: 'availability',\n }\n }\n if (\n code === 'ACCESS_DENIED' ||\n code === 'ORIGIN_NOT_ALLOWED' ||\n code === 'CHANNEL_ACCESS_DENIED'\n ) {\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '当前身份无权使用人工客服。',\n retryMode: 'never',\n }\n }\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '人工客服实时连接认证失败。',\n retryMode: 'never',\n }\n}\n","import type {\n NotificationCenterClientEventMap,\n NotificationCenterClientListener,\n NotificationCenterClientOptions,\n NotificationCenterErrorCode,\n NotificationCenterErrorDetail,\n NotificationCenterTransport,\n NotificationDto,\n NotificationRealtimeChange,\n NotificationTypeSummary,\n} from './notification-center-types'\n\ntype UntypedListener = (detail: unknown) => void\n\nconst DEFAULT_PAGE_SIZE = 20\n\nexport class NotificationCenterClientError extends Error {\n readonly code: NotificationCenterErrorCode\n\n constructor(code: NotificationCenterErrorCode, message: string) {\n super(message)\n this.name = 'NotificationCenterClientError'\n this.code = code\n }\n}\n\n/**\n * Inbox store and HTTP orchestration for the notification center.\n *\n * The client owns no realtime connection. The host keeps the single\n * `/api/user-realtime/ws` socket it already maintains for its other channels and\n * hands notification events in through {@link applyRealtimeEvent}; cursors,\n * heartbeats, authentication and reconnect stay on the host side.\n */\nexport class NotificationCenterClient {\n private readonly transport: NotificationCenterTransport\n private readonly applicationName: string\n private readonly pageSize: number\n private readonly readStatus: 'all' | 'unread' | 'read'\n private readonly preferredTypeOrder: readonly string[]\n private readonly listeners = new Map<\n keyof NotificationCenterClientEventMap,\n Set<UntypedListener>\n >()\n\n private items: NotificationDto[] = []\n private hasMore = false\n private nextId: string | null = null\n private unreadCount = 0\n private notificationTypes: string[] = []\n private availableTypes: NotificationTypeSummary[] = []\n private typeCatalogFromBackend = false\n private inboxGeneration = 0\n private destroyed = false\n private loadingInbox = false\n private pendingResync = false\n\n constructor(options: NotificationCenterClientOptions) {\n if (!options?.transport) {\n throw new NotificationCenterClientError(\n 'INVALID_CONFIGURATION',\n '缺少通知中心 transport 配置。',\n )\n }\n this.transport = options.transport\n this.applicationName = normalizedText(options.applicationName)\n this.pageSize = Math.max(1, Math.floor(options.pageSize ?? DEFAULT_PAGE_SIZE))\n this.readStatus = ['all', 'unread', 'read'].includes(options.readStatus ?? '')\n ? (options.readStatus as 'all' | 'unread' | 'read')\n : 'all'\n this.preferredTypeOrder = (options.preferredTypeOrder ?? [])\n .map((value) => normalizedText(value))\n .filter(Boolean)\n }\n\n get notifications(): readonly NotificationDto[] {\n return [...this.items]\n }\n\n get unread(): number {\n return this.unreadCount\n }\n\n /** 数据中实际存在的通知分类,供 UI 渲染页签;不是写死的枚举。 */\n get types(): readonly NotificationTypeSummary[] {\n return this.availableTypes.map((entry) => ({ ...entry }))\n }\n\n on<K extends keyof NotificationCenterClientEventMap>(\n type: K,\n listener: NotificationCenterClientListener<K>,\n ): () => void {\n this.assertUsable()\n const listeners = this.listeners.get(type) ?? new Set<UntypedListener>()\n const untyped = listener as UntypedListener\n listeners.add(untyped)\n this.listeners.set(type, listeners)\n return () => listeners.delete(untyped)\n }\n\n async start(): Promise<void> {\n this.assertUsable()\n await Promise.all([this.reloadInbox(), this.refreshUnreadCount()])\n this.emit('ready', {})\n }\n\n async setTypeFilter(types: readonly string[]): Promise<void> {\n this.assertUsable()\n this.notificationTypes = [...types].map((value) => normalizedText(value)).filter(Boolean)\n await this.reloadInbox()\n }\n\n getTypeFilter(): readonly string[] {\n return [...this.notificationTypes]\n }\n\n async loadMore(): Promise<void> {\n this.assertUsable()\n if (!this.hasMore || this.loadingInbox || !this.nextId) return\n const generation = this.inboxGeneration\n this.loadingInbox = true\n try {\n const result = await this.transport.listInbox({\n pageSize: this.pageSize,\n beforeId: this.nextId,\n notificationTypes: this.notificationTypes,\n readStatus: this.readStatus,\n applicationName: this.applicationName,\n })\n if (this.destroyed || generation !== this.inboxGeneration) return\n const existing = new Set(this.items.map((item) => item.id))\n const merged = [...this.items]\n for (const item of result.items) {\n if (!existing.has(item.id)) {\n existing.add(item.id)\n merged.push(item)\n }\n }\n this.items = merged\n this.hasMore = result.hasMore\n this.nextId = result.nextId\n this.rememberTypes(result.items)\n this.emitInbox()\n } catch {\n this.emitError('INBOX_LOAD_FAILED', '通知加载失败,请稍后重试。', true)\n } finally {\n if (generation === this.inboxGeneration) this.finishInboxLoad()\n }\n }\n\n async refresh(): Promise<void> {\n this.assertUsable()\n await Promise.all([this.reloadInbox(), this.refreshUnreadCount()])\n }\n\n /**\n * Consume a notification realtime event captured by the host socket.\n *\n * The raw event is mapped through the transport so the DTO contract stays in\n * this SDK; anything that cannot be mapped degrades to a full refresh. Events\n * that arrive while an inbox request is in flight are replaced by a resync so a\n * late server page cannot drop them.\n */\n applyRealtimeEvent(event: unknown): void {\n if (this.destroyed) return\n if (this.loadingInbox) {\n this.pendingResync = true\n return\n }\n const parse = this.transport.parseRealtimeEvent\n let change: NotificationRealtimeChange | null = null\n if (parse) {\n try {\n change = parse.call(this.transport, event)\n } catch {\n change = null\n }\n }\n if (!change) {\n void this.refreshFromRealtime()\n return\n }\n this.applyRealtimeChange(change)\n }\n\n async markRead(notificationId: string): Promise<void> {\n this.assertUsable()\n const id = requiredText(notificationId, 'notificationId')\n const target = this.items.find((item) => item.id === id)\n if (target && target.readStatus === 'read') return\n try {\n const result = await this.transport.markRead({\n notificationId: id,\n applicationName: this.applicationName,\n })\n if (this.destroyed) return\n this.applyRead([id], result.readAt)\n this.setUnreadCount(result.unreadCount)\n this.emit('notification-read', { notificationId: id })\n } catch {\n this.emitError('MARK_READ_FAILED', '通知标记已读失败,请稍后重试。', true)\n }\n }\n\n async markAllRead(): Promise<void> {\n this.assertUsable()\n try {\n const result = await this.transport.markAllRead({\n applicationName: this.applicationName,\n })\n if (this.destroyed) return\n const readAt = new Date().toISOString()\n this.items = this.items.map((item) =>\n item.readStatus === 'read' ? item : { ...item, readStatus: 'read', readAt },\n )\n this.emitInbox()\n this.setUnreadCount(result.unreadCount)\n } catch {\n this.emitError('MARK_READ_FAILED', '通知标记已读失败,请稍后重试。', true)\n }\n }\n\n async downloadAttachment(fileId: string, name?: string): Promise<Blob> {\n this.assertUsable()\n const id = requiredText(fileId, 'fileId')\n try {\n return await this.transport.downloadAttachment({ fileId: id, name })\n } catch {\n const detail = this.emitError('DOWNLOAD_FAILED', '附件下载失败,请稍后重试。', true)\n throw new NotificationCenterClientError(detail.code, detail.message)\n }\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.pendingResync = false\n this.inboxGeneration += 1\n this.listeners.clear()\n this.items = []\n }\n\n private async reloadInbox(): Promise<void> {\n const generation = ++this.inboxGeneration\n this.loadingInbox = true\n try {\n const result = await this.transport.listInbox({\n pageSize: this.pageSize,\n beforeId: null,\n // 分类目录随首屏/刷新/切换页签的请求一并取回,不额外发请求。\n includeTypeFacets: true,\n notificationTypes: this.notificationTypes,\n readStatus: this.readStatus,\n applicationName: this.applicationName,\n })\n if (this.destroyed || generation !== this.inboxGeneration) return\n const unique = new Map<string, NotificationDto>()\n for (const item of result.items) {\n if (item.id) unique.set(item.id, item)\n }\n this.items = [...unique.values()]\n this.hasMore = result.hasMore\n this.nextId = result.nextId\n this.applyTypeCatalog(result.types)\n this.rememberTypes(result.items)\n this.emitInbox()\n } catch {\n if (generation === this.inboxGeneration) {\n this.emitError('INBOX_LOAD_FAILED', '通知加载失败,请稍后重试。', true)\n }\n } finally {\n if (generation === this.inboxGeneration) this.finishInboxLoad()\n }\n }\n\n private finishInboxLoad(): void {\n this.loadingInbox = false\n if (!this.pendingResync || this.destroyed) return\n this.pendingResync = false\n void this.refreshFromRealtime()\n }\n\n /**\n * 分类页签的数据来源。\n *\n * `notification_type` 是后端自由文本列,展示名来自后端字典(`notification_type_name`),\n * 前端不维护 code 到中文名的映射。权威目录是 `inbox` 在 `includeTypeFacets` 下返回的\n * `types`(后端按收件人可见范围统计,忽略类型筛选与分页);后端未提供时退回累积已加载\n * 页面里出现过的分类——这在分页深处才出现的分类上会暂时缺页签,属已知取舍。\n */\n private applyTypeCatalog(types: readonly NotificationTypeSummary[] | undefined): void {\n if (!Array.isArray(types)) return\n const normalized = types\n .map((entry) => ({\n type: normalizedText(entry?.type),\n name: normalizedText(entry?.name),\n }))\n .filter((entry) => entry.type)\n this.typeCatalogFromBackend = true\n this.setAvailableTypes(normalized, true)\n }\n\n private rememberTypes(items: readonly NotificationDto[]): void {\n const discovered = items\n .map((item) => ({ type: normalizedText(item.type), name: normalizedText(item.typeName) }))\n .filter((entry) => entry.type)\n if (!discovered.length) return\n // 后端目录已给出分类集合时只补展示名,不新增或重排分类。\n this.setAvailableTypes(discovered, false, this.typeCatalogFromBackend)\n }\n\n private setAvailableTypes(\n candidates: readonly NotificationTypeSummary[],\n replace: boolean,\n namesOnly = false,\n ): void {\n const merged = new Map<string, string>()\n if (!replace) {\n for (const entry of this.availableTypes) merged.set(entry.type, entry.name)\n }\n for (const entry of candidates) {\n if (namesOnly && !merged.has(entry.type)) continue\n // 已有展示名优先保留:后端字典是权威,条目里的名字只用于填空。\n const existing = merged.get(entry.type)\n merged.set(entry.type, existing || entry.name)\n }\n const codes = [...merged.keys()]\n const preferred = this.preferredTypeOrder.filter((value) => merged.has(value))\n const ordered = [...preferred, ...codes.filter((value) => !preferred.includes(value))].map(\n (type) => ({ type, name: merged.get(type) ?? '' }),\n )\n if (\n ordered.length === this.availableTypes.length &&\n ordered.every(\n (entry, index) =>\n entry.type === this.availableTypes[index]?.type &&\n entry.name === this.availableTypes[index]?.name,\n )\n ) {\n return\n }\n this.availableTypes = ordered\n this.emit('types-change', { types: this.types })\n }\n\n private async refreshUnreadCount(): Promise<void> {\n try {\n const result = await this.transport.getUnreadCount({ applicationName: this.applicationName })\n if (this.destroyed) return\n this.setUnreadCount(result.unreadCount)\n } catch {\n // A later inbox reload or realtime event can recover the unread projection.\n }\n }\n\n private applyRealtimeChange(change: NotificationRealtimeChange): void {\n if (change.kind === 'created') {\n const incoming = change.notification\n if (!incoming.id) return\n if (!this.items.some((item) => item.id === incoming.id)) {\n this.items = [incoming, ...this.items]\n this.rememberTypes([incoming])\n this.emitInbox()\n }\n this.syncRealtimeUnreadCount(change.unreadCount)\n return\n }\n if (change.kind === 'read') {\n this.applyRead(change.notificationIds, change.readAt ?? null)\n this.syncRealtimeUnreadCount(change.unreadCount)\n return\n }\n const removed = new Set(change.notificationIds)\n if (removed.size) {\n const next = this.items.filter((item) => !removed.has(item.id))\n if (next.length !== this.items.length) {\n this.items = next\n this.emitInbox()\n }\n }\n this.syncRealtimeUnreadCount(change.unreadCount)\n }\n\n private syncRealtimeUnreadCount(value: number | undefined): void {\n // Existing realtime events carry an application-scoped unread count. In the\n // all-applications projection only the aggregate HTTP count is authoritative.\n if (this.applicationName && typeof value === 'number') this.setUnreadCount(value)\n else void this.refreshUnreadCount()\n }\n\n private applyRead(ids: readonly string[], readAt: string | null): void {\n const target = new Set(ids)\n if (!target.size) return\n let changed = false\n const next = this.items.map((item) => {\n if (target.has(item.id) && item.readStatus !== 'read') {\n changed = true\n return { ...item, readStatus: 'read' as const, readAt: readAt ?? item.readAt }\n }\n return item\n })\n if (changed) {\n this.items = next\n this.emitInbox()\n }\n }\n\n private async refreshFromRealtime(): Promise<void> {\n await this.reloadInbox()\n await this.refreshUnreadCount()\n }\n\n private emitInbox(): void {\n this.emit('inbox', {\n items: [...this.items],\n hasMore: this.hasMore,\n nextId: this.nextId,\n })\n }\n\n private setUnreadCount(value: number): void {\n const normalized = Number.isFinite(value) && value > 0 ? Math.floor(value) : 0\n if (normalized === this.unreadCount) return\n this.unreadCount = normalized\n this.emit('unread-count-change', { unreadCount: normalized })\n }\n\n private emitError(\n code: NotificationCenterErrorCode,\n message: string,\n recoverable: boolean,\n ): NotificationCenterErrorDetail {\n const detail = { code, message, recoverable }\n this.emit('error', detail)\n return detail\n }\n\n private emit<K extends keyof NotificationCenterClientEventMap>(\n type: K,\n detail: NotificationCenterClientEventMap[K],\n ): void {\n for (const listener of this.listeners.get(type) ?? []) listener(detail)\n }\n\n private assertUsable(): void {\n if (this.destroyed) {\n throw new NotificationCenterClientError('CLIENT_DESTROYED', '通知中心客户端已经销毁。')\n }\n }\n}\n\nfunction requiredText(value: unknown, field: string): string {\n const normalized = normalizedText(value)\n if (!normalized) {\n throw new NotificationCenterClientError('INVALID_CONFIGURATION', `${field} 不能为空。`)\n }\n return normalized\n}\n\nfunction normalizedText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n"]}
1
+ {"version":3,"sources":["../src/protocol.ts","../src/client.ts","../src/assistant-actions.ts","../src/customer-support-client.ts","../src/notification-center-client.ts"],"names":["record","detail","text","authenticationFailure","result","DEFAULT_RECONNECT","MAX_AVAILABILITY_RECONNECTS","validateRealtimeUrl","createRequestId","requiredText","requiredRequestId","message","numberValue","normalizedText"],"mappings":"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","file":"index.js","sourcesContent":["import type { AiEmployeeMessage, AiEmployeeMessageRole } from './types'\n\ntype JsonRecord = Record<string, unknown>\n\nexport interface AuthenticateFrame {\n type: 'authenticate'\n protocol_version: 1\n access_token: string\n requested_channels: ['ai_employee']\n cursors: Record<string, never>\n}\n\nexport interface SessionSubscriptionFrame {\n action: 'subscribe' | 'unsubscribe'\n channel: 'ai_employee'\n resource_type: 'session'\n resource_id: string\n replay_history?: boolean\n}\n\nexport interface PingFrame {\n action: 'ping'\n timestamp: string\n}\n\nexport interface ParsedSessionMessage {\n messages: AiEmployeeMessage[]\n activities: string[]\n fallbackResult?: AiEmployeeMessage\n processing?: boolean\n}\n\nexport type ParsedAiEmployeeEvent =\n | { kind: 'session-message'; sessionId: string; result: ParsedSessionMessage }\n | { kind: 'session-title'; sessionId: string; title: string }\n | { kind: 'ignored' }\n\nexport function createAuthenticateFrame(accessToken: string): AuthenticateFrame {\n return {\n type: 'authenticate',\n protocol_version: 1,\n access_token: accessToken,\n requested_channels: ['ai_employee'],\n cursors: {},\n }\n}\n\nexport function createSubscriptionFrame(\n sessionId: string,\n action: 'subscribe' | 'unsubscribe' = 'subscribe',\n replayHistory = false,\n): SessionSubscriptionFrame {\n const frame: SessionSubscriptionFrame = {\n action,\n channel: 'ai_employee',\n resource_type: 'session',\n resource_id: sessionId,\n }\n if (action === 'subscribe') frame.replay_history = replayHistory\n return frame\n}\n\nexport function createPingFrame(now = new Date()): PingFrame {\n return { action: 'ping', timestamp: now.toISOString() }\n}\n\nexport function parseJsonRecord(raw: string): JsonRecord | null {\n try {\n return asRecord(JSON.parse(raw))\n } catch {\n return null\n }\n}\n\nexport function parseAiEmployeeEvent(raw: unknown): ParsedAiEmployeeEvent {\n const event = asRecord(raw)\n const type = stringValue(event.type)\n const sessionId = stringValue(event.session_id).trim()\n\n if (type === 'session_title_updated') {\n const title = stringValue(asRecord(event.payload).title).trim()\n return sessionId && title ? { kind: 'session-title', sessionId, title } : { kind: 'ignored' }\n }\n\n if (type !== 'session_message' || !sessionId) return { kind: 'ignored' }\n return {\n kind: 'session-message',\n sessionId,\n result: parseSessionPayload(asRecord(event.payload), sessionId),\n }\n}\n\nfunction parseSessionPayload(payload: JsonRecord, sessionId: string): ParsedSessionMessage {\n const messages: AiEmployeeMessage[] = []\n const activities: string[] = []\n const patches = Array.isArray(payload.JsonPatch) ? payload.JsonPatch : []\n\n for (const rawPatch of patches) {\n const patch = asRecord(rawPatch)\n const value = asRecord(patch.value)\n const activity = workActivityFromEntry(value)\n if (activity) activities.push(activity)\n const parsed = messageFromEntry(value, sessionId)\n if (parsed) messages.push(parsed)\n }\n\n const result = stringValue(payload.result).trim()\n const fallbackResult = result\n ? createMessage(\n sessionId,\n 'assistant',\n result,\n `result:${sessionId}:${hashText(result)}`,\n payload,\n )\n : undefined\n\n if (payload.error) {\n messages.push(\n createMessage(\n sessionId,\n 'error',\n 'AI 回复出现异常,请稍后重试。',\n `error:${sessionId}:${hashText(stableString(payload))}`,\n payload,\n ),\n )\n }\n\n let processing: boolean | undefined\n if (payload.Ready === true) processing = true\n if (payload.finished === true || payload.stopped === true) processing = false\n return { messages, activities, fallbackResult, processing }\n}\n\nfunction workActivityFromEntry(entry: JsonRecord): string {\n const entryTypeValue = entry.entry_type\n const entryType =\n typeof entryTypeValue === 'string' ? entryTypeValue : stringValue(asRecord(entryTypeValue).type)\n const entryTypeRecord = asRecord(entryTypeValue)\n if (entryType === 'thinking' || entryType === 'status_update' || entryType === 'output') {\n return safeActivityText(extractActivityText(entry.content))\n }\n if (entryType === 'loading') {\n return safeActivityText(extractActivityText(entry.content)) || '正在加载所需信息…'\n }\n if (entryType === 'tool_result') return '工具处理完成,正在继续…'\n if (entryType !== 'tool_use') return ''\n\n const actionType = asRecord(entryTypeRecord.action_type)\n const action = stringValue(actionType.action)\n if (action === 'search') {\n const query = safeActivityText(stringValue(actionType.query), 60)\n return query ? `正在搜索:${query}` : '正在搜索相关信息…'\n }\n if (action === 'web_fetch') return '正在读取网页内容…'\n if (action === 'file_read') return '正在读取资料…'\n if (action === 'file_edit') return '正在整理文件…'\n if (action === 'command_run') return '正在执行任务…'\n const toolName = safeActivityText(stringValue(entryTypeRecord.tool_name), 40)\n return toolName ? `正在调用 ${toolName}…` : '正在调用工具…'\n}\n\nfunction extractActivityText(raw: unknown): string {\n if (typeof raw !== 'string') return ''\n const value = raw.trim()\n if (!value) return ''\n try {\n const parsed: unknown = JSON.parse(value)\n if (typeof parsed === 'string') return parsed.trim()\n const activity = asRecord(parsed)\n for (const key of ['thinking', 'status', 'text', 'message', 'content', 'result']) {\n const candidate = stringValue(activity[key]).trim()\n if (candidate) return candidate\n }\n return ''\n } catch {\n return value\n }\n}\n\nfunction safeActivityText(value: string, maximumCharacters = 120): string {\n const withoutCredentials = value\n .replace(/\\bBearer\\s+[^\\s]+/gi, 'Bearer [已隐藏]')\n .replace(/\\b[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\b/g, '[已隐藏]')\n const normalized = [...withoutCredentials]\n .map((character) => {\n const codePoint = character.codePointAt(0) ?? 0\n return codePoint > 31 && codePoint !== 127 ? character : ' '\n })\n .join('')\n .replace(/\\s+/g, ' ')\n .trim()\n const characters = [...normalized]\n return characters.length <= maximumCharacters\n ? normalized\n : `${characters.slice(0, maximumCharacters).join('')}…`\n}\n\nfunction messageFromEntry(entry: JsonRecord, sessionId: string): AiEmployeeMessage | null {\n const entryTypeValue = entry.entry_type\n const entryType =\n typeof entryTypeValue === 'string' ? entryTypeValue : stringValue(asRecord(entryTypeValue).type)\n\n let role: AiEmployeeMessageRole\n switch (entryType) {\n case 'assistant_message':\n case 'result':\n role = 'assistant'\n break\n case 'user_message':\n role = 'user'\n break\n case 'system_message':\n case 'system_push':\n role = 'system'\n break\n case 'error':\n case 'error_message':\n role = 'error'\n break\n default:\n return null\n }\n\n const content = role === 'error' ? 'AI 回复出现异常,请稍后重试。' : extractText(entry.content)\n if (!content) return null\n\n const messageId = stringValue(entry.message_id)\n const webSocketMessageId = stringValue(entry.ws_message_id)\n const explicitId =\n role === 'user'\n ? messageId || webSocketMessageId || stringValue(entry.id)\n : webSocketMessageId || messageId || stringValue(entry.id)\n // 同一条消息经 replay 与实时两条路径投递时 patch 的 path/op 不同,\n // 合成 ID 只能取消息本身,否则同一条消息会得到不同 ID 而重复显示。\n const fingerprint = stableString(entry)\n const id = explicitId || `realtime:${sessionId}:${hashText(fingerprint)}`\n return createMessage(sessionId, role, content, id, entry)\n}\n\nfunction createMessage(\n sessionId: string,\n role: AiEmployeeMessageRole,\n content: string,\n id: string,\n source: JsonRecord,\n): AiEmployeeMessage {\n const createdAt =\n stringValue(source.timestamp) ||\n stringValue(source.create_time) ||\n stringValue(source.created_at) ||\n new Date().toISOString()\n return { id, sessionId, role, content, createdAt }\n}\n\nfunction extractText(raw: unknown): string {\n if (typeof raw !== 'string') return ''\n const value = raw.trim()\n if (!value) return ''\n\n try {\n const parsed: unknown = JSON.parse(value)\n if (typeof parsed === 'string') return parsed.trim()\n const record = asRecord(parsed)\n for (const key of ['text', 'result', 'message', 'content']) {\n const candidate = stringValue(record[key]).trim()\n if (candidate) return candidate\n }\n } catch {\n // Plain text and the simple user-message XML format are handled below.\n }\n\n const messageMatch = value.match(/<message>([\\s\\S]*?)<\\/message>/i)\n return (messageMatch?.[1] ?? value).trim()\n}\n\nfunction asRecord(value: unknown): JsonRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as JsonRecord)\n : {}\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction stableString(value: unknown): string {\n try {\n return JSON.stringify(value) ?? ''\n } catch {\n return ''\n }\n}\n\nexport function hashText(value: string): string {\n let hash = 2_166_136_261\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index)\n hash = Math.imul(hash, 16_777_619)\n }\n return (hash >>> 0).toString(36)\n}\n","import {\n createAuthenticateFrame,\n createPingFrame,\n createSubscriptionFrame,\n hashText,\n parseAiEmployeeEvent,\n parseJsonRecord,\n} from './protocol'\nimport type {\n AiEmployeeClientErrorDetail,\n AiEmployeeClientEventMap,\n AiEmployeeClientListener,\n AiEmployeeClientOptions,\n AiEmployeeClientStartResult,\n AiEmployeeConnectionState,\n AiEmployeeErrorCode,\n AiEmployeeFirstMessageOptions,\n AiEmployeeFirstMessageRequest,\n AiEmployeeFirstMessageRequestState,\n AiEmployeeFirstMessageRequestStore,\n AiEmployeeFirstMessageResult,\n AiEmployeeMessage,\n AiEmployeeReconnectOptions,\n AiEmployeeTransportErrorCode,\n AiEmployeeWebSocketFactory,\n} from './types'\n\ntype UntypedListener = (detail: unknown) => void\ntype JsonRecord = Record<string, unknown>\n\nconst DEFAULT_RECONNECT: AiEmployeeReconnectOptions = {\n initialDelayMs: 1_000,\n maximumDelayMs: 30_000,\n factor: 2,\n jitter: 0.2,\n}\nconst MAX_SEEN_MESSAGE_IDS = 2_000\nconst LOCAL_MESSAGE_MATCH_WINDOW_MS = 30_000\nconst MAX_AVAILABILITY_RECONNECTS = 3\nconst FIRST_MESSAGE_STORAGE_PREFIX = 'uniplat.ai-employee.first-message'\n\ntype AuthenticationRetryMode = 'token' | 'availability' | 'never'\n\ninterface SocketAuthenticationFailure {\n generation: number\n retryMode: AuthenticationRetryMode\n}\n\ninterface PendingFirstMessage {\n fingerprint: string\n requestId: string\n}\n\nexport class AiEmployeeClientError extends Error {\n readonly code: AiEmployeeErrorCode\n\n constructor(code: AiEmployeeErrorCode, message: string) {\n super(message)\n this.name = 'AiEmployeeClientError'\n this.code = code\n }\n}\n\nexport class AiEmployeeTransportError extends Error {\n readonly code: AiEmployeeTransportErrorCode\n\n constructor(code: AiEmployeeTransportErrorCode) {\n super('AI Employee transport request failed.')\n this.name = 'AiEmployeeTransportError'\n this.code = code\n }\n}\n\nexport class AiEmployeeClient {\n readonly aeCode: string\n readonly agentCode: string\n\n private readonly realtimeUrl: string\n private readonly transport: AiEmployeeClientOptions['transport']\n private readonly webSocketFactory: AiEmployeeWebSocketFactory\n private readonly reconnectOptions: AiEmployeeReconnectOptions\n private readonly minimumHeartbeatMs: number\n private readonly requestIdFactory: () => string\n private readonly firstMessageRequestStore: AiEmployeeFirstMessageRequestStore | null\n private readonly firstMessageRequestScope: string\n private readonly listeners = new Map<keyof AiEmployeeClientEventMap, Set<UntypedListener>>()\n private readonly seenMessageIds = new Set<string>()\n private readonly pendingLocalMessages = new Map<string, number>()\n private assistantReceivedInCurrentTurn = false\n\n private socket: WebSocket | null = null\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null\n private initializePromise: Promise<AiEmployeeClientStartResult> | null = null\n private currentMessages: AiEmployeeMessage[] = []\n private currentSessionId: string | null\n private currentState: AiEmployeeConnectionState = 'idle'\n private reconnectAttempt = 0\n private socketGeneration = 0\n private lifecycleGeneration = 0\n private shouldReconnect = false\n private destroyed = false\n private sending = false\n private processing = false\n private localMessageSequence = 0\n private replayHistoryOnNextSubscription = false\n private socketAuthenticationFailure: SocketAuthenticationFailure | null = null\n private availabilityReconnectAttempt = 0\n private pendingFirstMessage: PendingFirstMessage | null = null\n\n constructor(options: AiEmployeeClientOptions) {\n this.realtimeUrl = validateRealtimeUrl(options.realtimeUrl)\n this.aeCode = requiredText(options.aeCode, 'aeCode')\n this.agentCode = requiredText(options.agentCode, 'agentCode')\n if (!options.transport) {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', '缺少 transport 配置。')\n }\n if (typeof options.transport.createSessionWithFirstMessage !== 'function') {\n throw new AiEmployeeClientError(\n 'INVALID_CONFIGURATION',\n 'transport 缺少首条消息原子创建能力。',\n )\n }\n this.transport = options.transport\n this.currentSessionId = normalizeSessionId(options.sessionId)\n this.reconnectOptions = normalizeReconnectOptions(options.reconnect)\n this.minimumHeartbeatMs = Math.max(1, options.minimumHeartbeatMs ?? 5_000)\n this.requestIdFactory = options.requestIdFactory ?? createRequestId\n this.firstMessageRequestStore =\n options.firstMessageRequestStore === undefined\n ? createSessionFirstMessageRequestStore()\n : options.firstMessageRequestStore\n this.firstMessageRequestScope = `${this.aeCode}:${this.agentCode}`\n this.webSocketFactory =\n options.webSocketFactory ??\n ((url) => {\n if (typeof WebSocket === 'undefined') {\n throw new AiEmployeeClientError('WEBSOCKET_UNAVAILABLE', '当前运行环境不支持 WebSocket。')\n }\n return new WebSocket(url)\n })\n }\n\n get connectionState(): AiEmployeeConnectionState {\n return this.currentState\n }\n\n get sessionId(): string | null {\n return this.currentSessionId\n }\n\n get messages(): readonly AiEmployeeMessage[] {\n return [...this.currentMessages]\n }\n\n get isProcessing(): boolean {\n return this.processing\n }\n\n get isDestroyed(): boolean {\n return this.destroyed\n }\n\n on<K extends keyof AiEmployeeClientEventMap>(\n type: K,\n listener: AiEmployeeClientListener<K>,\n ): () => void {\n this.assertUsable()\n const listeners = this.listeners.get(type) ?? new Set<UntypedListener>()\n const untypedListener = listener as UntypedListener\n listeners.add(untypedListener)\n this.listeners.set(type, listeners)\n return () => listeners.delete(untypedListener)\n }\n\n connect(): Promise<AiEmployeeClientStartResult> {\n return this.start()\n }\n\n start(): Promise<AiEmployeeClientStartResult> {\n this.assertUsable()\n if (this.initializePromise) return this.initializePromise\n\n const lifecycle = this.lifecycleGeneration\n const pending = this.initialize(lifecycle)\n this.initializePromise = pending\n const clearPending = () => {\n if (this.initializePromise === pending) this.initializePromise = null\n }\n void pending.then(clearPending, clearPending)\n return pending\n }\n\n async bindSession(sessionId: string): Promise<AiEmployeeClientStartResult> {\n this.assertUsable()\n const target = requiredText(sessionId, 'sessionId')\n const lifecycle = ++this.lifecycleGeneration\n this.stopConnection(false)\n this.currentSessionId = target\n this.currentMessages = []\n this.seenMessageIds.clear()\n this.pendingLocalMessages.clear()\n this.assistantReceivedInCurrentTurn = false\n this.pendingFirstMessage = null\n await this.clearStoredFirstMessageRequest()\n this.replayHistoryOnNextSubscription = false\n this.shouldReconnect = true\n await this.refreshHistory(lifecycle)\n this.assertUsable()\n if (!this.isCurrentLifecycle(lifecycle)) {\n throw new AiEmployeeClientError('SESSION_UNAVAILABLE', '会话切换已被新的操作替代。')\n }\n if (this.isCurrentLifecycle(lifecycle)) this.openSocket(false)\n return { sessionId: target, messages: this.messages }\n }\n\n async startNewConversation(): Promise<AiEmployeeClientStartResult> {\n this.assertUsable()\n this.initializePromise = null\n this.lifecycleGeneration += 1\n this.stopConnection(false)\n this.currentSessionId = null\n this.currentMessages = []\n this.seenMessageIds.clear()\n this.pendingLocalMessages.clear()\n this.assistantReceivedInCurrentTurn = false\n this.pendingFirstMessage = null\n await this.clearStoredFirstMessageRequest()\n this.replayHistoryOnNextSubscription = false\n this.shouldReconnect = true\n this.openSocket(false)\n return { sessionId: null, messages: [] }\n }\n\n async refreshMessages(): Promise<readonly AiEmployeeMessage[]> {\n this.assertUsable()\n if (!this.currentSessionId) {\n throw new AiEmployeeClientError('SESSION_UNAVAILABLE', '尚未绑定数字员工会话。')\n }\n await this.refreshHistory(this.lifecycleGeneration)\n return this.messages\n }\n\n async sendMessage(\n content: string,\n options: AiEmployeeFirstMessageOptions = {},\n ): Promise<AiEmployeeMessage> {\n this.assertUsable()\n const normalizedContent = content.trim()\n if (!normalizedContent) {\n throw new AiEmployeeClientError('EMPTY_MESSAGE', '消息内容不能为空。')\n }\n if (this.sending) {\n throw new AiEmployeeClientError('SEND_IN_PROGRESS', '上一条消息仍在发送中。')\n }\n this.sending = true\n try {\n const sessionId = this.currentSessionId\n return sessionId\n ? await this.sendFollowUp(sessionId, normalizedContent)\n : await this.sendFirstMessage(normalizedContent, options)\n } catch (error) {\n if (error instanceof AiEmployeeClientError) throw error\n if (transportErrorCode(error) === 'IDEMPOTENCY_CONFLICT') {\n const detail = this.emitError(\n 'FIRST_MESSAGE_CONFLICT',\n '首条消息内容已变化,请开启新对话后重试。',\n false,\n )\n throw new AiEmployeeClientError(detail.code, detail.message)\n }\n if (transportErrorCode(error) === 'TOO_MANY_REQUESTS') {\n const detail = this.emitError('RATE_LIMITED', '请求过于频繁,请稍后再试。', false)\n throw new AiEmployeeClientError(detail.code, detail.message)\n }\n const detail = this.emitError('SEND_FAILED', '消息发送失败,请稍后重试。', true)\n throw new AiEmployeeClientError(detail.code, detail.message)\n } finally {\n this.sending = false\n }\n }\n\n disconnect(): void {\n if (this.destroyed) return\n this.lifecycleGeneration += 1\n this.stopConnection(true)\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.lifecycleGeneration += 1\n this.stopConnection(false)\n this.destroyed = true\n this.initializePromise = null\n this.setState('destroyed')\n this.listeners.clear()\n this.currentMessages = []\n this.seenMessageIds.clear()\n this.pendingLocalMessages.clear()\n this.assistantReceivedInCurrentTurn = false\n this.pendingFirstMessage = null\n }\n\n private async sendFollowUp(sessionId: string, content: string): Promise<AiEmployeeMessage> {\n this.assistantReceivedInCurrentTurn = false\n await this.transport.sendMessage(sessionId, content)\n this.assertUsable()\n const now = new Date()\n const message: AiEmployeeMessage = {\n id: `local:${now.getTime()}:${++this.localMessageSequence}`,\n sessionId,\n role: 'user',\n content,\n createdAt: now.toISOString(),\n }\n this.rememberPendingLocalMessage(content)\n this.appendMessage(message, 'local')\n this.setProcessing(true)\n return message\n }\n\n private async sendFirstMessage(\n content: string,\n options: AiEmployeeFirstMessageOptions,\n ): Promise<AiEmployeeMessage> {\n this.assistantReceivedInCurrentTurn = false\n const createSessionWithFirstMessage = this.transport.createSessionWithFirstMessage\n const lifecycle = this.lifecycleGeneration\n const normalizedOptions = normalizeFirstMessageOptions(options)\n const fingerprint = firstMessageFingerprint(content, normalizedOptions)\n if (!this.pendingFirstMessage || this.pendingFirstMessage.fingerprint !== fingerprint) {\n const stored = await this.loadStoredFirstMessageRequest()\n this.pendingFirstMessage =\n stored?.fingerprint === fingerprint\n ? stored\n : { fingerprint, requestId: requiredRequestId(this.requestIdFactory()) }\n await this.saveStoredFirstMessageRequest(this.pendingFirstMessage)\n }\n this.assertUsable()\n if (!this.isCurrentLifecycle(lifecycle) || this.currentSessionId) {\n this.pendingFirstMessage = null\n await this.clearStoredFirstMessageRequest()\n throw new AiEmployeeClientError('SESSION_UNAVAILABLE', '首条消息受理已被新的操作替代。')\n }\n const request: AiEmployeeFirstMessageRequest = {\n requestId: this.pendingFirstMessage.requestId,\n aeCode: this.aeCode,\n agentCode: this.agentCode,\n content,\n attachments: normalizedOptions.attachments,\n trustedContext: normalizedOptions.trustedContext,\n }\n const rawResult = await createSessionWithFirstMessage.call(this.transport, request)\n const result = normalizeFirstMessageResult(rawResult, this.aeCode, this.agentCode)\n this.assertUsable()\n if (!this.isCurrentLifecycle(lifecycle) || this.currentSessionId) {\n this.pendingFirstMessage = null\n await this.clearStoredFirstMessageRequest()\n throw new AiEmployeeClientError('SESSION_UNAVAILABLE', '首条消息受理已被新的操作替代。')\n }\n\n this.currentSessionId = result.sessionId\n this.pendingFirstMessage = null\n await this.clearStoredFirstMessageRequest()\n const message: AiEmployeeMessage = {\n id: result.messageId,\n sessionId: result.sessionId,\n role: 'user',\n content,\n createdAt: result.createdAt ?? result.startedAt,\n }\n // 首条消息同样要登记本地回声窗口:服务端 replay 与实时事件可能带着与\n // createSessionWithFirstMessage 不同的消息 ID 回来。\n this.rememberPendingLocalMessage(content)\n this.appendMessage(message, 'local')\n this.setProcessing(true)\n this.replayHistoryOnNextSubscription = true\n this.subscribeCurrentSession(true)\n return message\n }\n\n private async initialize(lifecycle: number): Promise<AiEmployeeClientStartResult> {\n if (!this.currentSessionId) {\n this.shouldReconnect = true\n this.openSocket(false)\n return { sessionId: null, messages: [] }\n }\n\n await this.refreshHistory(lifecycle)\n this.assertUsable()\n if (!this.isCurrentLifecycle(lifecycle)) {\n throw new AiEmployeeClientError('SESSION_UNAVAILABLE', '会话初始化已被新的操作替代。')\n }\n this.shouldReconnect = true\n this.openSocket(false)\n return { sessionId: this.currentSessionId, messages: this.messages }\n }\n\n private async loadStoredFirstMessageRequest(): Promise<PendingFirstMessage | null> {\n if (!this.firstMessageRequestStore) return null\n try {\n const state = await this.firstMessageRequestStore.load(this.firstMessageRequestScope)\n if (!state || typeof state.fingerprint !== 'string') return null\n return {\n fingerprint: state.fingerprint,\n requestId: requiredRequestId(state.requestId),\n }\n } catch {\n return null\n }\n }\n\n private async saveStoredFirstMessageRequest(state: PendingFirstMessage): Promise<void> {\n if (!this.firstMessageRequestStore) return\n try {\n await this.firstMessageRequestStore.save(this.firstMessageRequestScope, state)\n } catch {\n // Storage is a recovery enhancement; an unavailable store must not block sending.\n }\n }\n\n private async clearStoredFirstMessageRequest(): Promise<void> {\n if (!this.firstMessageRequestStore) return\n try {\n await this.firstMessageRequestStore.clear(this.firstMessageRequestScope)\n } catch {\n // A stale recovery entry is still guarded by the request fingerprint and backend conflict.\n }\n }\n\n private async refreshHistory(lifecycle: number): Promise<boolean> {\n const sessionId = this.currentSessionId\n if (!sessionId) return false\n try {\n const history = await this.transport.listMessages(sessionId)\n if (!this.isCurrentLifecycle(lifecycle) || this.currentSessionId !== sessionId) return false\n this.replaceHistory(history, sessionId)\n return true\n } catch {\n if (this.isCurrentLifecycle(lifecycle)) {\n this.emitError('HISTORY_LOAD_FAILED', '历史消息加载失败,实时连接仍会继续。', true)\n }\n return false\n }\n }\n\n private replaceHistory(history: readonly AiEmployeeMessage[], sessionId: string): void {\n const unique = new Map<string, AiEmployeeMessage>()\n for (const candidate of history) {\n const normalized = normalizeHistoryMessage(candidate, sessionId)\n if (normalized) unique.set(normalized.id, normalized)\n }\n this.currentMessages = [...unique.values()]\n this.seenMessageIds.clear()\n for (const message of this.currentMessages) this.rememberMessageId(message.id)\n this.emit('history', { sessionId, messages: this.messages })\n }\n\n private openSocket(isReconnect: boolean): void {\n if (this.destroyed || !this.shouldReconnect) return\n this.clearReconnectTimer()\n this.closeCurrentSocket()\n this.setState(isReconnect ? 'reconnecting' : 'connecting')\n\n let socket: WebSocket\n try {\n socket = this.webSocketFactory(this.realtimeUrl)\n } catch {\n this.emitError('WEBSOCKET_UNAVAILABLE', '无法建立实时连接。', true)\n this.scheduleReconnect()\n return\n }\n\n const generation = ++this.socketGeneration\n this.socket = socket\n this.socketAuthenticationFailure = null\n socket.onopen = () => void this.authenticateSocket(socket, generation)\n socket.onmessage = (event) => void this.handleSocketData(event.data, socket, generation)\n socket.onerror = () => {\n if (!this.isCurrentSocket(socket, generation)) return\n this.emitError('WEBSOCKET_ERROR', '实时连接发生异常。', true)\n }\n socket.onclose = (event) => this.handleSocketClose(socket, generation, event.code)\n }\n\n private async authenticateSocket(socket: WebSocket, generation: number): Promise<void> {\n if (!this.isCurrentSocket(socket, generation)) return\n this.setState('authenticating')\n let accessToken = ''\n try {\n accessToken = (await this.transport.getAccessToken()).trim()\n } catch {\n // Authentication errors are deliberately not propagated because they may contain credentials.\n }\n\n if (!this.isCurrentSocket(socket, generation)) return\n if (!accessToken) {\n this.emitError('TOKEN_UNAVAILABLE', '无法获取实时连接凭证。', true)\n socket.close()\n return\n }\n socket.send(JSON.stringify(createAuthenticateFrame(accessToken)))\n accessToken = ''\n }\n\n private async handleSocketData(\n data: unknown,\n socket: WebSocket,\n generation: number,\n ): Promise<void> {\n if (!this.isCurrentSocket(socket, generation)) return\n let raw = ''\n if (typeof data === 'string') raw = data\n else if (data instanceof Blob) raw = await data.text()\n else if (data instanceof ArrayBuffer) raw = new TextDecoder().decode(data)\n else {\n this.emitError('PROTOCOL_ERROR', '收到无法识别的实时消息。', true)\n return\n }\n if (!this.isCurrentSocket(socket, generation)) return\n const message = parseJsonRecord(raw)\n if (!message) {\n this.emitError('PROTOCOL_ERROR', '收到无法解析的实时消息。', true)\n return\n }\n this.handleServerMessage(message, socket, generation)\n }\n\n private handleServerMessage(message: JsonRecord, socket: WebSocket, generation: number): void {\n const type = text(message.type)\n if (type === 'realtime_ready') {\n const channels = record(message.channels)\n const aiChannel = record(channels.ai_employee)\n if (aiChannel.available !== true) {\n this.emitError('CHANNEL_UNAVAILABLE', '数字员工实时通道不可用。', false)\n this.shouldReconnect = false\n socket.close()\n return\n }\n this.reconnectAttempt = 0\n this.availabilityReconnectAttempt = 0\n this.startHeartbeat(numberValue(message.heartbeat_interval_seconds), socket, generation)\n if (this.currentSessionId) {\n this.subscribeCurrentSession(this.replayHistoryOnNextSubscription, true)\n } else {\n this.setState('connected')\n }\n return\n }\n\n if (type === 'realtime_event' && message.channel === 'ai_employee') {\n this.handleAiEmployeeEvent(message.event)\n return\n }\n\n if (type === 'channel_error' && message.channel === 'ai_employee') {\n this.handleChannelError(text(message.code))\n return\n }\n\n if (type === 'authentication_error') {\n const failure = authenticationFailure(text(message.code))\n this.socketAuthenticationFailure = { generation, retryMode: failure.retryMode }\n this.emitError(failure.code, failure.message, failure.retryMode !== 'never')\n return\n }\n\n if (type === 'protocol_error') {\n this.emitError('PROTOCOL_ERROR', '实时连接协议异常。', false)\n }\n }\n\n private handleAiEmployeeEvent(rawEvent: unknown): void {\n const event = parseAiEmployeeEvent(rawEvent)\n if (event.kind === 'ignored' || event.sessionId !== this.currentSessionId) return\n if (event.kind === 'session-title') {\n this.emit('title', { sessionId: event.sessionId, title: event.title })\n return\n }\n\n if (event.result.processing === true) this.assistantReceivedInCurrentTurn = false\n if (event.result.processing === true) this.setProcessing(true)\n for (const text of event.result.activities) {\n if (!this.assistantReceivedInCurrentTurn) {\n this.emit('work-activity', { sessionId: event.sessionId, text })\n }\n }\n for (const message of event.result.messages) {\n if (message.role === 'user') this.assistantReceivedInCurrentTurn = false\n if (message.role === 'user' && this.matchesPendingLocalMessage(message)) continue\n this.appendMessage(message, 'realtime')\n if (message.role === 'assistant') this.assistantReceivedInCurrentTurn = true\n }\n if (event.result.fallbackResult && !this.assistantReceivedInCurrentTurn) {\n this.appendMessage(event.result.fallbackResult, 'realtime')\n }\n if (event.result.processing === false) this.setProcessing(false)\n }\n\n private subscribeCurrentSession(replayHistory: boolean, channelReady = false): void {\n const sessionId = this.currentSessionId\n const socket = this.socket\n if (\n !sessionId ||\n !socket ||\n socket.readyState !== 1 ||\n (!channelReady && this.currentState !== 'connected')\n )\n return\n this.setState('subscribing')\n socket.send(JSON.stringify(createSubscriptionFrame(sessionId, 'subscribe', replayHistory)))\n this.replayHistoryOnNextSubscription = false\n this.setState('connected')\n this.emit('ready', { sessionId })\n }\n\n private rememberPendingLocalMessage(content: string): void {\n const now = Date.now()\n for (const [pendingContent, sentAt] of this.pendingLocalMessages) {\n if (now - sentAt > LOCAL_MESSAGE_MATCH_WINDOW_MS) {\n this.pendingLocalMessages.delete(pendingContent)\n }\n }\n this.pendingLocalMessages.set(content, now)\n }\n\n /**\n * 本地已渲染的用户消息会被服务端以 replay 和实时事件多次回送,且不保证复用\n * 同一个消息 ID。窗口期内不消费该条目,多次回声都要挡住;本地发送本身每次都\n * 会追加气泡,所以重复发送同样内容不会因此丢消息。\n */\n private matchesPendingLocalMessage(message: AiEmployeeMessage): boolean {\n const sentAt = this.pendingLocalMessages.get(message.content)\n if (sentAt === undefined) return false\n if (Date.now() - sentAt <= LOCAL_MESSAGE_MATCH_WINDOW_MS) return true\n this.pendingLocalMessages.delete(message.content)\n return false\n }\n\n private appendMessage(message: AiEmployeeMessage, source: 'local' | 'realtime'): void {\n if (this.seenMessageIds.has(message.id)) return\n this.rememberMessageId(message.id)\n this.currentMessages = [...this.currentMessages, message]\n this.emit('message', { sessionId: message.sessionId, message, source })\n }\n\n private rememberMessageId(id: string): void {\n this.seenMessageIds.add(id)\n if (this.seenMessageIds.size <= MAX_SEEN_MESSAGE_IDS) return\n const oldest = this.seenMessageIds.values().next().value\n if (typeof oldest === 'string') this.seenMessageIds.delete(oldest)\n }\n\n private handleChannelError(code: string): void {\n if (code === 'SESSION_NOT_FOUND') {\n this.emitError('SESSION_NOT_FOUND', '会话不存在或当前用户无权访问。', false)\n } else {\n this.emitError('CHANNEL_UNAVAILABLE', '数字员工实时通道暂不可用。', true)\n }\n this.setProcessing(false)\n }\n\n private startHeartbeat(intervalSeconds: number, socket: WebSocket, generation: number): void {\n this.clearHeartbeatTimer()\n const requestedMs =\n Number.isFinite(intervalSeconds) && intervalSeconds > 0 ? intervalSeconds * 1_000 : 25_000\n const intervalMs = Math.max(this.minimumHeartbeatMs, requestedMs)\n this.heartbeatTimer = setInterval(() => {\n if (!this.isCurrentSocket(socket, generation) || socket.readyState !== 1) return\n socket.send(JSON.stringify(createPingFrame()))\n }, intervalMs)\n }\n\n private handleSocketClose(socket: WebSocket, generation: number, code: number): void {\n if (!this.isCurrentSocket(socket, generation)) return\n this.socket = null\n this.clearHeartbeatTimer()\n const authenticationFailure =\n this.socketAuthenticationFailure?.generation === generation\n ? this.socketAuthenticationFailure\n : null\n this.socketAuthenticationFailure = null\n if (!this.shouldReconnect || this.destroyed) {\n if (!this.destroyed) this.setState('disconnected')\n return\n }\n\n if (authenticationFailure?.retryMode === 'never') {\n this.shouldReconnect = false\n this.setState('disconnected')\n return\n }\n\n if (code === 4400 || code === 4403) {\n this.shouldReconnect = false\n if (!authenticationFailure) {\n const errorCode = code === 4403 ? 'AUTHENTICATION_FAILED' : 'PROTOCOL_ERROR'\n const message = code === 4403 ? '当前身份无权建立实时连接。' : '实时连接协议不受支持。'\n this.emitError(errorCode, message, false)\n }\n this.setState('disconnected')\n return\n }\n\n if (authenticationFailure?.retryMode === 'availability' || code === 1013) {\n if (!authenticationFailure) {\n this.emitError('REALTIME_UNAVAILABLE', '实时鉴权服务暂不可用,正在重试。', true)\n }\n this.scheduleAvailabilityReconnect()\n return\n }\n\n if (code === 4401) {\n if (!authenticationFailure) {\n this.emitError('AUTHENTICATION_FAILED', '连接凭证已失效,正在重新连接。', true)\n }\n }\n this.scheduleReconnect()\n }\n\n private scheduleAvailabilityReconnect(): void {\n if (this.availabilityReconnectAttempt >= MAX_AVAILABILITY_RECONNECTS) {\n this.shouldReconnect = false\n this.emitError('REALTIME_UNAVAILABLE', '实时鉴权服务持续不可用,请稍后重试。', false)\n this.setState('disconnected')\n return\n }\n this.availabilityReconnectAttempt += 1\n this.scheduleReconnect()\n }\n\n private scheduleReconnect(): void {\n if (this.destroyed || !this.shouldReconnect || this.reconnectTimer) return\n this.setState('reconnecting')\n const baseDelay = Math.min(\n this.reconnectOptions.initialDelayMs * this.reconnectOptions.factor ** this.reconnectAttempt,\n this.reconnectOptions.maximumDelayMs,\n )\n const jitterRange = baseDelay * this.reconnectOptions.jitter\n const delay = Math.max(0, baseDelay - jitterRange + Math.random() * jitterRange * 2)\n this.reconnectAttempt += 1\n const lifecycle = this.lifecycleGeneration\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null\n void this.recoverAndReconnect(lifecycle)\n }, delay)\n }\n\n private async recoverAndReconnect(lifecycle: number): Promise<void> {\n if (!this.isCurrentLifecycle(lifecycle) || !this.shouldReconnect) return\n const historyRecovered = await this.refreshHistory(lifecycle)\n if (!this.isCurrentLifecycle(lifecycle) || !this.shouldReconnect) return\n this.replayHistoryOnNextSubscription = !historyRecovered\n this.openSocket(true)\n }\n\n private stopConnection(setDisconnectedState: boolean): void {\n this.shouldReconnect = false\n this.clearReconnectTimer()\n this.clearHeartbeatTimer()\n this.socketAuthenticationFailure = null\n this.closeCurrentSocket()\n this.setProcessing(false)\n if (setDisconnectedState) this.setState('disconnected')\n }\n\n private closeCurrentSocket(): void {\n const socket = this.socket\n this.socket = null\n this.socketGeneration += 1\n this.socketAuthenticationFailure = null\n if (socket && socket.readyState < 2) socket.close()\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n\n private clearHeartbeatTimer(): void {\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer)\n this.heartbeatTimer = null\n }\n\n private setState(next: AiEmployeeConnectionState): void {\n if (this.currentState === next) return\n const previous = this.currentState\n this.currentState = next\n this.emit('connection-state-change', { previous, current: next })\n }\n\n private setProcessing(processing: boolean): void {\n if (this.processing === processing) return\n this.processing = processing\n this.emit('processing-state-change', { processing })\n }\n\n private emitError(\n code: AiEmployeeErrorCode,\n message: string,\n recoverable: boolean,\n ): AiEmployeeClientErrorDetail {\n const detail = { code, message, recoverable }\n this.emit('error', detail)\n return detail\n }\n\n private emit<K extends keyof AiEmployeeClientEventMap>(\n type: K,\n detail: AiEmployeeClientEventMap[K],\n ): void {\n for (const listener of this.listeners.get(type) ?? []) listener(detail)\n }\n\n private isCurrentSocket(socket: WebSocket, generation: number): boolean {\n return !this.destroyed && this.socket === socket && this.socketGeneration === generation\n }\n\n private isCurrentLifecycle(generation: number): boolean {\n return !this.destroyed && this.lifecycleGeneration === generation\n }\n\n private assertUsable(): void {\n if (this.destroyed) {\n throw new AiEmployeeClientError('CLIENT_DESTROYED', '客户端已销毁。')\n }\n }\n}\n\nfunction validateRealtimeUrl(rawUrl: string): string {\n let url: URL\n try {\n url = new URL(rawUrl)\n } catch {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', 'realtimeUrl 不是有效地址。')\n }\n if (!['ws:', 'wss:'].includes(url.protocol)) {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', 'realtimeUrl 只允许 ws: 或 wss:。')\n }\n if (url.search || url.hash || url.username || url.password) {\n throw new AiEmployeeClientError(\n 'INVALID_CONFIGURATION',\n 'realtimeUrl 不允许包含查询参数、片段或用户凭据。',\n )\n }\n return url.toString()\n}\n\nfunction requiredText(value: string, field: string): string {\n const normalized = typeof value === 'string' ? value.trim() : ''\n if (!normalized) {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', `${field} 不能为空。`)\n }\n return normalized\n}\n\nfunction normalizeSessionId(value: string | undefined): string | null {\n return typeof value === 'string' && value.trim() ? value.trim() : null\n}\n\nfunction normalizeFirstMessageOptions(options: AiEmployeeFirstMessageOptions): {\n attachments: AiEmployeeFirstMessageRequest['attachments']\n trustedContext: AiEmployeeFirstMessageRequest['trustedContext']\n} {\n const attachments = (options.attachments ?? []).map((attachment) => {\n const transactionId =\n typeof attachment.transactionId === 'string' ? attachment.transactionId.trim() : ''\n const fspath = typeof attachment.fspath === 'string' ? attachment.fspath.trim() : ''\n if (\n !transactionId ||\n !fspath.startsWith('fs/') ||\n fspath.includes('\\\\') ||\n fspath.split('/').some((segment) => segment === '..')\n ) {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息附件引用无效。')\n }\n return { transactionId, fspath }\n })\n const trustedContext = options.trustedContext ?? null\n if (\n trustedContext !== null &&\n (typeof trustedContext !== 'object' || Array.isArray(trustedContext))\n ) {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息上下文无效。')\n }\n return { attachments, trustedContext }\n}\n\nfunction firstMessageFingerprint(\n content: string,\n options: ReturnType<typeof normalizeFirstMessageOptions>,\n): string {\n const serialized = stableFirstMessageString([\n content,\n options.attachments,\n options.trustedContext,\n ])\n return `v1:${hashText(serialized)}:${hashText(`first-message:${serialized}`)}:${serialized.length}`\n}\n\nfunction stableFirstMessageString(value: unknown): string {\n const seen = new WeakSet<object>()\n const normalize = (candidate: unknown): unknown => {\n if (candidate === null || typeof candidate !== 'object') return candidate\n if (seen.has(candidate)) {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息上下文无效。')\n }\n seen.add(candidate)\n if (Array.isArray(candidate)) {\n const result = candidate.map((item) => normalize(item))\n seen.delete(candidate)\n return result\n }\n const source = candidate as Record<string, unknown>\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(source).sort()) result[key] = normalize(source[key])\n seen.delete(candidate)\n return result\n }\n return JSON.stringify(normalize(value))\n}\n\nfunction requiredRequestId(value: string): string {\n const requestId = typeof value === 'string' ? value.trim() : ''\n if (\n !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(requestId)\n ) {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', 'requestIdFactory 必须返回 UUID。')\n }\n return requestId\n}\n\nfunction createRequestId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n if (typeof crypto === 'undefined' || typeof crypto.getRandomValues !== 'function') {\n throw new AiEmployeeClientError('INVALID_CONFIGURATION', '当前环境无法安全生成 request_id。')\n }\n const bytes = crypto.getRandomValues(new Uint8Array(16))\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80\n const value = [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('')\n return `${value.slice(0, 8)}-${value.slice(8, 12)}-${value.slice(12, 16)}-${value.slice(16, 20)}-${value.slice(20)}`\n}\n\nfunction normalizeFirstMessageResult(\n value: AiEmployeeFirstMessageResult,\n expectedAeCode: string,\n expectedAgentCode: string,\n): AiEmployeeFirstMessageResult {\n if (!value || typeof value !== 'object') {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息受理响应无效。')\n }\n const sessionId = requiredFirstMessageResultText(value.sessionId)\n const messageId = requiredFirstMessageResultText(value.messageId)\n const executionId = requiredFirstMessageResultText(value.executionId)\n const aeCode = requiredFirstMessageResultText(value.aeCode)\n const agentCode = requiredFirstMessageResultText(value.agentCode)\n const conversationType = requiredFirstMessageResultText(value.conversationType)\n if (aeCode !== expectedAeCode || agentCode !== expectedAgentCode) {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息受理响应与当前数字员工不匹配。')\n }\n if (value.status !== 'running' && value.status !== 'queued') {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息受理状态无效。')\n }\n const startedAt = requiredIsoDate(value.startedAt, 'transport startedAt')\n const result: AiEmployeeFirstMessageResult = {\n sessionId,\n messageId,\n executionId,\n status: value.status,\n startedAt,\n aeCode,\n agentCode,\n conversationType,\n }\n if (typeof value.title === 'string' && value.title.trim()) result.title = value.title.trim()\n if (value.createdAt) result.createdAt = requiredIsoDate(value.createdAt, 'transport createdAt')\n return result\n}\n\nfunction requiredIsoDate(value: string, field: string): string {\n const normalized = requiredFirstMessageResultText(value)\n if (!Number.isFinite(Date.parse(normalized))) {\n throw new AiEmployeeClientError('SEND_FAILED', `${field} 不是有效时间。`)\n }\n return normalized\n}\n\nfunction requiredFirstMessageResultText(value: unknown): string {\n if (typeof value !== 'string' || !value.trim()) {\n throw new AiEmployeeClientError('SEND_FAILED', '首条消息受理响应无效。')\n }\n return value.trim()\n}\n\nfunction authenticationFailure(code: string): {\n code: AiEmployeeErrorCode\n message: string\n retryMode: AuthenticationRetryMode\n} {\n if (code === 'UNAUTHORIZED') {\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '连接凭证已失效,正在重新连接。',\n retryMode: 'token',\n }\n }\n if (code === 'ORGANIZATION_CONTEXT_REQUIRED') {\n return {\n code: 'ORGANIZATION_CONTEXT_REQUIRED',\n message: '请选择企业/团队后再开始咨询。',\n retryMode: 'never',\n }\n }\n if (code === 'INVALID_ARGUMENT') {\n return {\n code: 'PROTOCOL_ERROR',\n message: '实时连接协议不受支持。',\n retryMode: 'never',\n }\n }\n if (isRealtimeAvailabilityFailure(code)) {\n return {\n code: 'REALTIME_UNAVAILABLE',\n message: '实时鉴权服务暂不可用,正在重试。',\n retryMode: 'availability',\n }\n }\n if (code === 'AI_EMPLOYEE_NOT_AVAILABLE' || code === 'APPLICATION_NOT_SUPPORTED') {\n return {\n code: 'CHANNEL_UNAVAILABLE',\n message: '当前数字员工暂不可用。',\n retryMode: 'never',\n }\n }\n if (code === 'ACCESS_DENIED') {\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '当前身份无权建立实时连接。',\n retryMode: 'never',\n }\n }\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '实时连接认证失败。',\n retryMode: 'never',\n }\n}\n\nfunction transportErrorCode(error: unknown): AiEmployeeTransportErrorCode | null {\n if (error instanceof AiEmployeeTransportError) return error.code\n if (!error || typeof error !== 'object' || !('code' in error)) return null\n switch (error.code) {\n case 'UNAUTHORIZED':\n case 'ACCESS_DENIED':\n case 'AI_EMPLOYEE_NOT_AVAILABLE':\n case 'APPLICATION_NOT_SUPPORTED':\n case 'ORGANIZATION_CONTEXT_REQUIRED':\n case 'INVALID_ARGUMENT':\n case 'IDEMPOTENCY_CONFLICT':\n case 'REALTIME_UNAVAILABLE':\n case 'TOO_MANY_REQUESTS':\n return error.code\n default:\n return null\n }\n}\n\nfunction createSessionFirstMessageRequestStore(): AiEmployeeFirstMessageRequestStore | null {\n try {\n if (typeof sessionStorage === 'undefined') return null\n } catch {\n return null\n }\n const key = (scope: string) => `${FIRST_MESSAGE_STORAGE_PREFIX}:${hashText(scope)}`\n return {\n load(scope) {\n const raw = sessionStorage.getItem(key(scope))\n if (!raw) return null\n const parsed: unknown = JSON.parse(raw)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return null\n const state = parsed as Partial<AiEmployeeFirstMessageRequestState>\n return typeof state.fingerprint === 'string' && typeof state.requestId === 'string'\n ? { fingerprint: state.fingerprint, requestId: state.requestId }\n : null\n },\n save(scope, state) {\n sessionStorage.setItem(\n key(scope),\n JSON.stringify({ fingerprint: state.fingerprint, requestId: state.requestId }),\n )\n },\n clear(scope) {\n sessionStorage.removeItem(key(scope))\n },\n }\n}\n\nfunction isRealtimeAvailabilityFailure(code: string): boolean {\n return (\n code === 'REALTIME_UNAVAILABLE' || code === 'KANBAN_AUTH_FAILED' || code.startsWith('SERVICE_')\n )\n}\n\nfunction normalizeReconnectOptions(\n options: AiEmployeeClientOptions['reconnect'],\n): AiEmployeeReconnectOptions {\n return {\n initialDelayMs: positiveNumber(options?.initialDelayMs, DEFAULT_RECONNECT.initialDelayMs),\n maximumDelayMs: positiveNumber(options?.maximumDelayMs, DEFAULT_RECONNECT.maximumDelayMs),\n factor: Math.max(1, positiveNumber(options?.factor, DEFAULT_RECONNECT.factor)),\n jitter: Math.min(1, Math.max(0, options?.jitter ?? DEFAULT_RECONNECT.jitter)),\n }\n}\n\nfunction positiveNumber(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback\n}\n\nfunction normalizeHistoryMessage(\n candidate: AiEmployeeMessage,\n expectedSessionId: string,\n): AiEmployeeMessage | null {\n if (!candidate || typeof candidate !== 'object') return null\n const id = text(candidate.id).trim()\n const content = text(candidate.content).trim()\n const role = candidate.role\n if (!id || !content || !['user', 'assistant', 'system', 'error'].includes(role)) return null\n return {\n id,\n sessionId: expectedSessionId,\n role,\n content: role === 'error' ? '消息处理出现异常,请稍后重试。' : content,\n createdAt: text(candidate.createdAt) || new Date().toISOString(),\n }\n}\n\nfunction text(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction record(value: unknown): JsonRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as JsonRecord)\n : {}\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' ? value : Number.NaN\n}\n","export interface OpenCustomerSupportAssistantAction {\n type: 'assistant_action'\n action: 'open_customer_support'\n transactionId: string\n sessionId: string\n trigger: 'out_of_scope'\n entry: 'help_and_support'\n}\n\nexport interface OpenFileAssistantAction {\n type: 'assistant_action'\n action: 'open_file'\n transactionId: string\n sessionId: string\n name: string\n size: string\n path: string\n}\n\nexport type AiEmployeeAssistantAction = OpenCustomerSupportAssistantAction | OpenFileAssistantAction\n\nexport interface ParsedAiEmployeeAssistantContent {\n content: string\n actions: readonly AiEmployeeAssistantAction[]\n rejectedActionTypes?: readonly AiEmployeeAssistantAction['action'][]\n}\n\ninterface StructuredJsonCandidate {\n content: string\n json: string\n}\n\nconst CUSTOMER_SUPPORT_ACTION_KEYS = [\n 'action',\n 'entry',\n 'session-id',\n 'transaction-id',\n 'trigger',\n 'type',\n] as const\nconst FILE_ACTION_KEYS = [\n 'action',\n 'name',\n 'path',\n 'session-id',\n 'size',\n 'transaction-id',\n 'type',\n] as const\nconst SUPPORTED_ACTION_MARKER = /\"action\"\\s*:\\s*\"(open_customer_support|open_file)\"/g\nconst UUID_V4_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\nconst SESSION_ID_PATTERN = /^[A-Za-z0-9._:-]{1,64}$/\nconst FILE_SIZE_PATTERN = /^\\d+(?:\\.\\d+)?(?:B|KB|MB|GB|TB)$/\n\n/**\n * Parses structurally valid platform actions from consecutive standalone JSON\n * blocks at the end of an assistant response. Invalid or ambiguous trailing\n * action blocks are removed from display content, reported only by stable action\n * type, and never made executable. Renderers must additionally compare every\n * `action.sessionId` with the session that owns the message.\n */\nexport function parseAiEmployeeAssistantContent(content: string): ParsedAiEmployeeAssistantContent {\n const source = typeof content === 'string' ? content : ''\n let remaining = source\n const actions: AiEmployeeAssistantAction[] = []\n const rejectedActionTypes: AiEmployeeAssistantAction['action'][] = []\n let strippedMarkerCount = 0\n while (true) {\n const candidate = trailingStructuredJson(remaining)\n if (!candidate) break\n const candidateActionTypes = actionMarkerTypes(candidate.json)\n if (candidateActionTypes.length === 0) break\n strippedMarkerCount += candidateActionTypes.length\n let value: unknown\n try {\n value = JSON.parse(candidate.json)\n } catch {\n rejectedActionTypes.unshift(...candidateActionTypes)\n remaining = candidate.content\n continue\n }\n const action = parseAssistantAction(value)\n if (!action || candidateActionTypes.length !== 1) {\n rejectedActionTypes.unshift(...candidateActionTypes)\n } else {\n actions.unshift(action)\n }\n remaining = candidate.content\n }\n\n const sourceActionTypes = actionMarkerTypes(source)\n if (sourceActionTypes.length === 0) return unchanged(source)\n if (strippedMarkerCount !== sourceActionTypes.length) return unchanged(source)\n const transactionIds = new Set(actions.map((action) => action.transactionId))\n if (\n rejectedActionTypes.length > 0 ||\n actions.length === 0 ||\n transactionIds.size !== actions.length ||\n actions.filter((action) => action.action === 'open_customer_support').length > 1\n ) {\n return rejected(remaining, sourceActionTypes)\n }\n return Object.freeze({\n content: remaining,\n actions: Object.freeze(actions),\n })\n}\n\nexport function isUuidV4(value: unknown): value is string {\n return typeof value === 'string' && UUID_V4_PATTERN.test(value)\n}\n\nfunction trailingStructuredJson(content: string): StructuredJsonCandidate | null {\n const withoutTrailingWhitespace = content.trimEnd()\n const fencedPattern = /(?:^|\\r?\\n)[\\t ]*```json[\\t ]*\\r?\\n([\\s\\S]*?)\\r?\\n[\\t ]*```[\\t ]*/gi\n let trailingFence: RegExpMatchArray | null = null\n for (const match of withoutTrailingWhitespace.matchAll(fencedPattern)) {\n if (match.index + match[0].length === withoutTrailingWhitespace.length) {\n trailingFence = match\n }\n }\n if (trailingFence) {\n return {\n content: withoutTrailingWhitespace.slice(0, trailingFence.index).trimEnd(),\n json: trailingFence[1]?.trim() ?? '',\n }\n }\n\n const starts = [...withoutTrailingWhitespace.matchAll(/(?:^|\\r?\\n)[\\t ]*(\\{)/g)]\n for (let index = starts.length - 1; index >= 0; index -= 1) {\n const match = starts[index]\n const objectOffset =\n match?.index === undefined ? -1 : match.index + (match[0]?.indexOf('{') ?? -1)\n if (objectOffset < 0) continue\n const json = withoutTrailingWhitespace.slice(objectOffset).trim()\n try {\n JSON.parse(json)\n return {\n content: withoutTrailingWhitespace.slice(0, match?.index ?? 0).trimEnd(),\n json,\n }\n } catch {\n // Try an earlier line-start object. Nested or malformed trailing JSON is\n // never accepted merely because it contains an action-looking fragment.\n }\n }\n return null\n}\n\nfunction parseAssistantAction(value: unknown): AiEmployeeAssistantAction | null {\n if (!isRecord(value)) return null\n if (value.action === 'open_customer_support') return parseOpenCustomerSupportAction(value)\n if (value.action === 'open_file') return parseOpenFileAction(value)\n return null\n}\n\nfunction parseOpenCustomerSupportAction(value: unknown): OpenCustomerSupportAssistantAction | null {\n if (!isRecord(value)) return null\n const keys = Object.keys(value).sort()\n if (\n keys.length !== CUSTOMER_SUPPORT_ACTION_KEYS.length ||\n keys.some((key, index) => key !== CUSTOMER_SUPPORT_ACTION_KEYS[index])\n ) {\n return null\n }\n if (\n value.type !== 'assistant_action' ||\n value.action !== 'open_customer_support' ||\n !isUuidV4(value['transaction-id']) ||\n !isAssistantActionSessionId(value['session-id']) ||\n value.trigger !== 'out_of_scope' ||\n value.entry !== 'help_and_support'\n ) {\n return null\n }\n return Object.freeze({\n type: 'assistant_action',\n action: 'open_customer_support',\n transactionId: value['transaction-id'],\n sessionId: value['session-id'],\n trigger: 'out_of_scope',\n entry: 'help_and_support',\n })\n}\n\nfunction parseOpenFileAction(value: unknown): OpenFileAssistantAction | null {\n if (!isRecord(value)) return null\n const keys = Object.keys(value).sort()\n if (\n keys.length !== FILE_ACTION_KEYS.length ||\n keys.some((key, index) => key !== FILE_ACTION_KEYS[index])\n ) {\n return null\n }\n const transactionId = value['transaction-id']\n const sessionId = value['session-id']\n const name = value.name\n const size = value.size\n const path = value.path\n if (\n value.type !== 'assistant_action' ||\n value.action !== 'open_file' ||\n !isCanonicalUuidV4(transactionId) ||\n !isAssistantActionSessionId(sessionId) ||\n !isSafeRelativeFilePath(path) ||\n typeof name !== 'string' ||\n !name ||\n name !== name.trim() ||\n name !== path.slice(path.lastIndexOf('/') + 1) ||\n typeof size !== 'string' ||\n size !== size.trim() ||\n !FILE_SIZE_PATTERN.test(size)\n ) {\n return null\n }\n return Object.freeze({\n type: 'assistant_action',\n action: 'open_file',\n transactionId,\n sessionId,\n name,\n size,\n path,\n })\n}\n\nfunction isAssistantActionSessionId(value: unknown): value is string {\n return typeof value === 'string' && SESSION_ID_PATTERN.test(value)\n}\n\nfunction actionMarkerTypes(value: string): AiEmployeeAssistantAction['action'][] {\n return [...value.matchAll(SUPPORTED_ACTION_MARKER)].flatMap((match) => {\n const action = match[1]\n return action === 'open_customer_support' || action === 'open_file' ? [action] : []\n })\n}\n\nfunction isCanonicalUuidV4(value: unknown): value is string {\n return isUuidV4(value) && value === value.toLowerCase()\n}\n\nfunction isSafeRelativeFilePath(value: unknown): value is string {\n if (\n typeof value !== 'string' ||\n !value ||\n value !== value.trim() ||\n value.startsWith('/') ||\n value.startsWith('\\\\') ||\n value.includes('\\\\') ||\n /^[A-Za-z]:/.test(value) ||\n hasControlCharacter(value)\n ) {\n return false\n }\n return value\n .split('/')\n .every((part) => part && part !== '.' && part !== '..' && !part.startsWith('.'))\n}\n\nfunction hasControlCharacter(value: string): boolean {\n return [...value].some((character) => {\n const codePoint = character.codePointAt(0) ?? 0\n return codePoint <= 31 || codePoint === 127\n })\n}\n\nfunction unchanged(content: string): ParsedAiEmployeeAssistantContent {\n return Object.freeze({ content, actions: Object.freeze([]) })\n}\n\nfunction rejected(\n content: string,\n actionTypes: readonly AiEmployeeAssistantAction['action'][],\n): ParsedAiEmployeeAssistantContent {\n return Object.freeze({\n content,\n actions: Object.freeze([]),\n rejectedActionTypes: Object.freeze([...new Set(actionTypes)]),\n })\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n","import { createPingFrame, parseJsonRecord } from './protocol'\nimport type {\n CustomerSupportClientEventMap,\n CustomerSupportClientListener,\n CustomerSupportClientOptions,\n CustomerSupportErrorCode,\n CustomerSupportErrorDetail,\n CustomerSupportMessage,\n CustomerSupportSession,\n} from './customer-support-types'\nimport type { AiEmployeeConnectionState, AiEmployeeReconnectOptions } from './types'\n\ntype UntypedListener = (detail: unknown) => void\ntype JsonRecord = Record<string, unknown>\n\nconst DEFAULT_RECONNECT: AiEmployeeReconnectOptions = {\n initialDelayMs: 1_000,\n maximumDelayMs: 30_000,\n factor: 2,\n jitter: 0.2,\n}\nconst MAX_TOKEN_RECONNECTS = 1\nconst MAX_AVAILABILITY_RECONNECTS = 3\n\ntype AuthenticationRetryMode = 'token' | 'availability' | 'never'\n\ninterface SocketAuthenticationFailure {\n generation: number\n retryMode: AuthenticationRetryMode\n}\n\ninterface CustomerSupportReadCursorState {\n acknowledged: string\n inFlight: string | null\n pending: string | null\n generation: number\n}\n\ninterface CustomerSupportHistoryRefresh {\n sessionId: string\n promise: Promise<void>\n}\n\ninterface CustomerSupportSessionsRefresh {\n promise: Promise<readonly CustomerSupportSession[]>\n}\n\nexport class CustomerSupportClientError extends Error {\n readonly code: CustomerSupportErrorCode\n\n constructor(code: CustomerSupportErrorCode, message: string) {\n super(message)\n this.name = 'CustomerSupportClientError'\n this.code = code\n }\n}\n\nexport class CustomerSupportClient {\n private readonly realtimeUrl: string\n private readonly transport: CustomerSupportClientOptions['transport']\n private readonly webSocketFactory: (url: string) => WebSocket\n private readonly requestIdFactory: () => string\n private readonly reconnectOptions: AiEmployeeReconnectOptions\n private readonly minimumHeartbeatMs: number\n private readonly listeners = new Map<keyof CustomerSupportClientEventMap, Set<UntypedListener>>()\n\n private currentSession: CustomerSupportSession | null = null\n private currentSessions: CustomerSupportSession[] = []\n private currentMessages: CustomerSupportMessage[] = []\n private currentState: AiEmployeeConnectionState = 'idle'\n private socket: WebSocket | null = null\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private reconnectAttempt = 0\n private tokenReconnectAttempt = 0\n private availabilityReconnectAttempt = 0\n private socketGeneration = 0\n private socketAuthenticationFailure: SocketAuthenticationFailure | null = null\n private destroyed = false\n private shouldReconnect = false\n private sending = false\n private historyRefresh: CustomerSupportHistoryRefresh | null = null\n private pendingRealtimeHistoryRefreshSessionId: string | null = null\n private sessionsRefresh: CustomerSupportSessionsRefresh | null = null\n private readonly readCursorStates = new Map<string, CustomerSupportReadCursorState>()\n private readLifecycleGeneration = 0\n private requestedSessionId: string | null\n\n constructor(options: CustomerSupportClientOptions) {\n this.realtimeUrl = validateRealtimeUrl(options.realtimeUrl)\n if (!options.transport) {\n throw new CustomerSupportClientError('INVALID_CONFIGURATION', '缺少客服 transport 配置。')\n }\n this.transport = options.transport\n this.requestedSessionId = normalizedText(options.sessionId) || null\n this.requestIdFactory = options.requestIdFactory ?? createRequestId\n this.reconnectOptions = normalizeReconnect(options.reconnect)\n this.minimumHeartbeatMs = Math.max(1, options.minimumHeartbeatMs ?? 5_000)\n this.webSocketFactory =\n options.webSocketFactory ??\n ((url) => {\n if (typeof WebSocket === 'undefined') {\n throw new CustomerSupportClientError(\n 'WEBSOCKET_UNAVAILABLE',\n '当前运行环境不支持 WebSocket。',\n )\n }\n return new WebSocket(url)\n })\n }\n\n get session(): CustomerSupportSession | null {\n return this.currentSession\n }\n\n get messages(): readonly CustomerSupportMessage[] {\n return [...this.currentMessages]\n }\n\n get connectionState(): AiEmployeeConnectionState {\n return this.currentState\n }\n\n on<K extends keyof CustomerSupportClientEventMap>(\n type: K,\n listener: CustomerSupportClientListener<K>,\n ): () => void {\n this.assertUsable()\n const listeners = this.listeners.get(type) ?? new Set<UntypedListener>()\n const untyped = listener as UntypedListener\n listeners.add(untyped)\n this.listeners.set(type, listeners)\n return () => listeners.delete(untyped)\n }\n\n async start(): Promise<void> {\n this.assertUsable()\n try {\n const sessions = await this.transport.listSessions()\n this.assertUsable()\n this.replaceSessions(sessions)\n const requested = this.requestedSessionId\n this.currentSession = requested\n ? (sessions.find((session) => session.id === requested) ?? null)\n : (sessions.find(\n (session) => session.status !== 'closed' && hasCustomerSupportMessages(session),\n ) ??\n sessions.find(hasCustomerSupportMessages) ??\n null)\n if (this.currentSession) {\n this.emit('session', { session: this.currentSession })\n await this.refreshHistory()\n }\n } catch {\n this.emitError('HISTORY_LOAD_FAILED', '客服会话加载失败,实时连接仍会继续。', true)\n }\n this.shouldReconnect = true\n this.openSocket(false)\n this.emit('ready', { sessionId: this.currentSession?.id ?? null })\n }\n\n prepareNewConversation(): void {\n this.assertUsable()\n this.currentSession = null\n this.requestedSessionId = null\n this.currentMessages = []\n }\n\n async bindSession(sessionId: string): Promise<void> {\n this.assertUsable()\n const normalized = requiredText(sessionId, 'sessionId')\n const sessions = await this.transport.listSessions()\n this.replaceSessions(sessions)\n const session = sessions.find((candidate) => candidate.id === normalized)\n if (!session) {\n throw new CustomerSupportClientError('SESSION_UNAVAILABLE', '客服会话不存在。')\n }\n this.currentSession = session\n this.requestedSessionId = session.id\n this.emit('session', { session })\n await this.refreshHistory()\n }\n\n async sendMessage(content: string): Promise<CustomerSupportMessage> {\n this.assertUsable()\n const normalized = content.trim()\n if (!normalized) throw new CustomerSupportClientError('EMPTY_MESSAGE', '消息内容不能为空。')\n if (this.sending) {\n throw new CustomerSupportClientError('SEND_IN_PROGRESS', '上一条消息仍在发送中。')\n }\n this.sending = true\n try {\n if (!this.currentSession) {\n const result = await this.transport.createSession({\n clientRequestId: requiredRequestId(this.requestIdFactory()),\n title: normalized.slice(0, 30),\n initialMessage: normalized,\n })\n this.assertUsable()\n this.currentSession = result.session\n this.upsertSession(result.session)\n this.requestedSessionId = result.session.id\n this.emit('session', { session: result.session })\n let message = result.initialMessage\n if (!message) {\n const page = await this.transport.listMessages(result.session.id)\n message = [...page.messages]\n .reverse()\n .find(\n (candidate) =>\n candidate.senderType === 'customer' && candidate.content.trim() === normalized,\n )\n this.currentMessages = page.messages.filter((candidate) => candidate.id !== message?.id)\n }\n if (!message) throw new Error('Missing initial message')\n this.appendMessage(message, 'local')\n return message\n }\n const message = await this.transport.sendMessage(\n this.currentSession.id,\n requiredRequestId(this.requestIdFactory()),\n normalized,\n )\n this.assertUsable()\n this.appendMessage(message, 'local')\n return message\n } catch (error) {\n if (error instanceof CustomerSupportClientError) throw error\n const detail = this.emitError('SEND_FAILED', '消息发送失败,请稍后重试。', true)\n throw new CustomerSupportClientError(detail.code, detail.message)\n } finally {\n this.sending = false\n }\n }\n\n async downloadAttachment(\n messageId: string,\n fileId: string,\n name?: string,\n messageSequence?: string,\n ): Promise<Blob> {\n this.assertUsable()\n const sessionId = this.currentSession?.id\n if (!sessionId) {\n throw new CustomerSupportClientError('SESSION_UNAVAILABLE', '客服会话不存在。')\n }\n const downloadAttachment = this.transport.downloadAttachment\n if (!downloadAttachment) {\n throw new CustomerSupportClientError(\n 'ATTACHMENT_DOWNLOAD_UNAVAILABLE',\n '当前接入未提供客服附件下载能力。',\n )\n }\n try {\n return await downloadAttachment.call(this.transport, {\n sessionId,\n messageId: requiredText(messageId, 'messageId'),\n messageSequence,\n fileId: requiredText(fileId, 'fileId'),\n name,\n })\n } catch (error) {\n if (error instanceof CustomerSupportClientError) throw error\n const detail = this.emitError(\n 'ATTACHMENT_DOWNLOAD_FAILED',\n '附件下载失败,请稍后重试。',\n true,\n )\n throw new CustomerSupportClientError(detail.code, detail.message)\n }\n }\n\n async listSessions(): Promise<readonly CustomerSupportSession[]> {\n this.assertUsable()\n return this.refreshSessions()\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.shouldReconnect = false\n this.clearTimers()\n this.socketGeneration += 1\n this.socket?.close()\n this.socket = null\n this.setState('destroyed')\n this.listeners.clear()\n this.currentMessages = []\n this.currentSessions = []\n this.historyRefresh = null\n this.pendingRealtimeHistoryRefreshSessionId = null\n this.sessionsRefresh = null\n this.readLifecycleGeneration += 1\n this.readCursorStates.clear()\n }\n\n private async refreshHistory(realtime = false): Promise<void> {\n const session = this.currentSession\n if (!session) return\n if (this.historyRefresh?.sessionId === session.id) {\n if (realtime) this.pendingRealtimeHistoryRefreshSessionId = session.id\n return this.historyRefresh.promise\n }\n const pending = (async () => {\n try {\n const page = await this.transport.listMessages(session.id)\n if (this.destroyed || this.currentSession?.id !== session.id) return\n const unique = new Map<string, CustomerSupportMessage>()\n for (const message of page.messages) {\n if (message.sessionId === session.id && message.id) unique.set(message.id, message)\n }\n const previousIds = new Set(this.currentMessages.map((message) => message.id))\n this.currentMessages = [...unique.values()].sort(compareMessages)\n this.emit('history', { sessionId: session.id, messages: this.messages })\n if (realtime) {\n for (const message of this.currentMessages) {\n if (!previousIds.has(message.id)) {\n this.emit('message', { sessionId: session.id, message, source: 'realtime' })\n }\n }\n }\n this.markReadIfNeeded(session.id, page.latestSequence)\n } catch {\n this.emitError('HISTORY_LOAD_FAILED', '历史消息加载失败,实时连接仍会继续。', true)\n }\n })()\n const refresh = { sessionId: session.id, promise: pending }\n this.historyRefresh = refresh\n await pending.finally(() => {\n if (this.historyRefresh === refresh) this.historyRefresh = null\n if (this.pendingRealtimeHistoryRefreshSessionId !== session.id) return\n this.pendingRealtimeHistoryRefreshSessionId = null\n if (!this.destroyed && this.currentSession?.id === session.id) {\n void this.refreshHistory(true)\n }\n })\n }\n\n private markReadIfNeeded(sessionId: string, latestSequence: string): void {\n const markRead = this.transport.markRead\n const cursor = normalizeReadCursor(latestSequence)\n if (!markRead || !cursor || compareReadCursors(cursor, '0') <= 0 || this.destroyed) return\n const state = this.readCursorState(sessionId)\n if (compareReadCursors(cursor, state.acknowledged) <= 0) return\n if (state.inFlight) {\n if (compareReadCursors(cursor, state.inFlight) > 0) {\n state.pending = maxReadCursor(state.pending, cursor)\n }\n return\n }\n this.submitReadCursor(sessionId, cursor, state, markRead)\n }\n\n private submitReadCursor(\n sessionId: string,\n cursor: string,\n state: CustomerSupportReadCursorState,\n markRead: NonNullable<CustomerSupportClientOptions['transport']['markRead']>,\n ): void {\n const lifecycleGeneration = this.readLifecycleGeneration\n const requestGeneration = ++state.generation\n state.inFlight = cursor\n let request: Promise<void>\n try {\n request = markRead.call(this.transport, sessionId, cursor)\n } catch {\n state.inFlight = null\n state.pending = null\n return\n }\n void request\n .then(() => {\n if (!this.isCurrentReadRequest(state, lifecycleGeneration, requestGeneration, cursor))\n return\n state.acknowledged = maxReadCursor(state.acknowledged, cursor)\n const next = state.pending\n state.pending = null\n state.inFlight = null\n if (next && compareReadCursors(next, state.acknowledged) > 0) {\n this.submitReadCursor(sessionId, next, state, markRead)\n }\n })\n .catch(() => {\n if (!this.isCurrentReadRequest(state, lifecycleGeneration, requestGeneration, cursor))\n return\n state.inFlight = null\n state.pending = null\n })\n }\n\n private readCursorState(sessionId: string): CustomerSupportReadCursorState {\n const current = this.readCursorStates.get(sessionId)\n if (current) return current\n const created: CustomerSupportReadCursorState = {\n acknowledged: '0',\n inFlight: null,\n pending: null,\n generation: 0,\n }\n this.readCursorStates.set(sessionId, created)\n return created\n }\n\n private isCurrentReadRequest(\n state: CustomerSupportReadCursorState,\n lifecycleGeneration: number,\n requestGeneration: number,\n cursor: string,\n ): boolean {\n return (\n !this.destroyed &&\n this.readLifecycleGeneration === lifecycleGeneration &&\n state.generation === requestGeneration &&\n state.inFlight === cursor\n )\n }\n\n private openSocket(reconnecting: boolean): void {\n if (this.destroyed || !this.shouldReconnect) return\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer)\n this.socket?.close()\n this.setState(reconnecting ? 'reconnecting' : 'connecting')\n let socket: WebSocket\n try {\n socket = this.webSocketFactory(this.realtimeUrl)\n } catch {\n this.emitError('WEBSOCKET_UNAVAILABLE', '无法建立客服实时连接。', true)\n this.scheduleReconnect()\n return\n }\n const generation = ++this.socketGeneration\n this.socket = socket\n socket.onopen = () => void this.authenticate(socket, generation)\n socket.onmessage = (event) => void this.handleSocketData(event.data, socket, generation)\n socket.onerror = () => {\n if (this.isCurrentSocket(socket, generation)) {\n this.emitError('WEBSOCKET_ERROR', '客服实时连接发生异常。', true)\n }\n }\n socket.onclose = (event) => this.handleSocketClose(socket, generation, event.code)\n }\n\n private async authenticate(socket: WebSocket, generation: number): Promise<void> {\n if (!this.isCurrentSocket(socket, generation)) return\n this.setState('authenticating')\n let accessToken = ''\n try {\n accessToken = (await this.transport.getAccessToken()).trim()\n } catch {\n // Provider errors may contain credentials and are intentionally discarded.\n }\n if (!this.isCurrentSocket(socket, generation)) return\n if (!accessToken) {\n this.emitError('TOKEN_UNAVAILABLE', '无法获取客服实时连接凭证。', true)\n socket.close()\n return\n }\n socket.send(\n JSON.stringify({\n type: 'authenticate',\n protocol_version: 1,\n access_token: accessToken,\n requested_channels: ['customer_support'],\n cursors: {},\n }),\n )\n accessToken = ''\n }\n\n private async handleSocketData(\n data: unknown,\n socket: WebSocket,\n generation: number,\n ): Promise<void> {\n if (!this.isCurrentSocket(socket, generation)) return\n let raw = ''\n if (typeof data === 'string') raw = data\n else if (data instanceof Blob) raw = await data.text()\n else if (data instanceof ArrayBuffer) raw = new TextDecoder().decode(data)\n const message = raw ? parseJsonRecord(raw) : null\n if (!message) {\n this.emitError('PROTOCOL_ERROR', '收到无法解析的客服实时消息。', true)\n return\n }\n this.handleServerMessage(message, socket, generation)\n }\n\n private handleServerMessage(message: JsonRecord, socket: WebSocket, generation: number): void {\n const type = normalizedText(message.type)\n if (type === 'realtime_ready') {\n const channels = record(message.channels)\n if (record(channels.customer_support).available !== true) {\n this.shouldReconnect = false\n this.emitError('CHANNEL_UNAVAILABLE', '人工客服实时通道不可用。', false)\n socket.close()\n return\n }\n this.reconnectAttempt = 0\n this.tokenReconnectAttempt = 0\n this.availabilityReconnectAttempt = 0\n this.startHeartbeat(numberValue(message.heartbeat_interval_seconds), socket, generation)\n this.setState('connected')\n // Kanban starts a cursor-less customer-support stream at the latest event. Reconcile\n // after every successful authentication so replies committed while connecting or\n // reconnecting cannot fall into the gap between the previous HTTP snapshot and WS ready.\n void this.refreshFromRealtime()\n return\n }\n if (type === 'realtime_event' && message.channel === 'customer_support') {\n const event = record(message.event)\n this.handleCustomerSupportEvent(event)\n return\n }\n if (type === 'channel_resync_required' && message.channel === 'customer_support') {\n void this.refreshFromRealtime()\n return\n }\n if (type === 'channel_error' && message.channel === 'customer_support') {\n // The server-side channel task has stopped while the multiplexed socket may remain open.\n // Reconnect the socket so the channel task is recreated instead of leaving a false-online\n // connection that can no longer receive messages.\n this.socketAuthenticationFailure = { generation, retryMode: 'availability' }\n this.emitError('REALTIME_UNAVAILABLE', '人工客服实时通道暂不可用,正在重试。', true)\n socket.close()\n return\n }\n if (type === 'authentication_error') {\n const failure = authenticationFailure(normalizedText(message.code))\n this.socketAuthenticationFailure = { generation, retryMode: failure.retryMode }\n this.emitError(failure.code, failure.message, failure.retryMode !== 'never')\n }\n }\n\n private handleCustomerSupportEvent(event: JsonRecord): void {\n const eventType = normalizedText(event.event_type)\n const sessionId = normalizedText(event.session_id)\n if (!eventType || !sessionId) return\n this.refreshSessionsFromRealtime()\n if (sessionId !== this.currentSession?.id) return\n if (eventType === 'support_read_state_changed') return\n if (eventType === 'support_message_created') {\n void this.refreshHistory(true)\n return\n }\n void this.refreshSessionFromRealtime()\n }\n\n private async refreshFromRealtime(): Promise<void> {\n await Promise.all([\n this.refreshSessions().catch(() => [...this.currentSessions]),\n this.refreshSessionFromRealtime(),\n this.refreshHistory(true),\n ])\n }\n\n private async refreshSessions(): Promise<readonly CustomerSupportSession[]> {\n if (this.sessionsRefresh) return this.sessionsRefresh.promise\n const pending = (async () => {\n const sessions = await this.transport.listSessions()\n if (!this.destroyed) this.replaceSessions(sessions)\n return [...this.currentSessions]\n })()\n const refresh = { promise: pending }\n this.sessionsRefresh = refresh\n return pending.finally(() => {\n if (this.sessionsRefresh === refresh) this.sessionsRefresh = null\n })\n }\n\n private refreshSessionsFromRealtime(): void {\n void this.refreshSessions().catch(() => {\n // A later realtime event, panel refresh or resync can recover the list projection.\n })\n }\n\n private replaceSessions(sessions: readonly CustomerSupportSession[]): void {\n this.currentSessions = [...sessions]\n this.emit('sessions', { sessions: [...this.currentSessions] })\n }\n\n private upsertSession(session: CustomerSupportSession): void {\n const currentIndex = this.currentSessions.findIndex((candidate) => candidate.id === session.id)\n if (currentIndex < 0) this.currentSessions = [session, ...this.currentSessions]\n else {\n this.currentSessions = this.currentSessions.map((candidate, index) =>\n index === currentIndex ? session : candidate,\n )\n }\n this.emit('sessions', { sessions: [...this.currentSessions] })\n }\n\n private async refreshSessionFromRealtime(): Promise<void> {\n const sessionId = this.currentSession?.id\n const getSession = this.transport.getSession\n if (!sessionId || !getSession) return\n try {\n const session = await getSession.call(this.transport, sessionId)\n if (!this.destroyed && this.currentSession?.id === sessionId) {\n this.currentSession = session\n this.emit('session', { session })\n }\n } catch {\n // A later realtime event or resync can recover the optional session projection.\n }\n }\n\n private appendMessage(message: CustomerSupportMessage, source: 'local' | 'realtime'): void {\n if (this.currentMessages.some((candidate) => candidate.id === message.id)) return\n this.currentMessages = [...this.currentMessages, message].sort(compareMessages)\n this.emit('message', { sessionId: message.sessionId, message, source })\n }\n\n private startHeartbeat(intervalSeconds: number, socket: WebSocket, generation: number): void {\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer)\n const requested = intervalSeconds > 0 ? intervalSeconds * 1_000 : 25_000\n this.heartbeatTimer = setInterval(\n () => {\n if (this.isCurrentSocket(socket, generation) && socket.readyState === 1) {\n socket.send(JSON.stringify(createPingFrame()))\n }\n },\n Math.max(this.minimumHeartbeatMs, requested),\n )\n }\n\n private handleSocketClose(socket: WebSocket, generation: number, code: number): void {\n if (!this.isCurrentSocket(socket, generation)) return\n this.socket = null\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer)\n this.heartbeatTimer = null\n const authenticationFailure =\n this.socketAuthenticationFailure?.generation === generation\n ? this.socketAuthenticationFailure\n : null\n this.socketAuthenticationFailure = null\n if (!this.shouldReconnect || this.destroyed) {\n if (!this.destroyed) this.setState('disconnected')\n return\n }\n if (authenticationFailure?.retryMode === 'never') {\n this.shouldReconnect = false\n this.setState('disconnected')\n return\n }\n if (code === 4400 || code === 4403) {\n this.shouldReconnect = false\n if (!authenticationFailure) {\n this.emitError(\n code === 4400 ? 'PROTOCOL_ERROR' : 'AUTHENTICATION_FAILED',\n code === 4400 ? '客服实时连接协议不受支持。' : '当前身份无权使用人工客服。',\n false,\n )\n }\n this.setState('disconnected')\n return\n }\n if (authenticationFailure?.retryMode === 'availability' || code === 1013) {\n if (!authenticationFailure) {\n this.emitError('REALTIME_UNAVAILABLE', '客服实时鉴权服务暂不可用,正在重试。', true)\n }\n this.scheduleAvailabilityReconnect()\n return\n }\n if (authenticationFailure?.retryMode === 'token' || code === 4401) {\n if (!authenticationFailure) {\n this.emitError('AUTHENTICATION_FAILED', '客服连接凭证已失效,正在重新连接。', true)\n }\n if (this.tokenReconnectAttempt >= MAX_TOKEN_RECONNECTS) {\n this.shouldReconnect = false\n this.emitError('AUTHENTICATION_FAILED', '人工客服身份验证失败,请重新登录后再试。', false)\n this.setState('disconnected')\n return\n }\n this.tokenReconnectAttempt += 1\n }\n this.scheduleReconnect()\n }\n\n private scheduleAvailabilityReconnect(): void {\n if (this.availabilityReconnectAttempt >= MAX_AVAILABILITY_RECONNECTS) {\n this.shouldReconnect = false\n this.emitError('REALTIME_UNAVAILABLE', '客服实时鉴权服务持续不可用,请稍后重试。', false)\n this.setState('disconnected')\n return\n }\n this.availabilityReconnectAttempt += 1\n this.scheduleReconnect()\n }\n\n private scheduleReconnect(): void {\n if (!this.shouldReconnect || this.destroyed || this.reconnectTimer) return\n this.setState('reconnecting')\n const base = Math.min(\n this.reconnectOptions.maximumDelayMs,\n this.reconnectOptions.initialDelayMs *\n this.reconnectOptions.factor ** this.reconnectAttempt++,\n )\n const jitter = base * this.reconnectOptions.jitter * (Math.random() * 2 - 1)\n this.reconnectTimer = setTimeout(\n () => {\n this.reconnectTimer = null\n this.openSocket(true)\n },\n Math.max(0, base + jitter),\n )\n }\n\n private clearTimers(): void {\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer)\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer)\n this.heartbeatTimer = null\n this.reconnectTimer = null\n }\n\n private isCurrentSocket(socket: WebSocket, generation: number): boolean {\n return !this.destroyed && this.socket === socket && this.socketGeneration === generation\n }\n\n private setState(current: AiEmployeeConnectionState): void {\n if (this.currentState === current) return\n const previous = this.currentState\n this.currentState = current\n this.emit('connection-state-change', { previous, current })\n }\n\n private emitError(\n code: CustomerSupportErrorCode,\n message: string,\n recoverable: boolean,\n ): CustomerSupportErrorDetail {\n const detail = { code, message, recoverable }\n this.emit('error', detail)\n return detail\n }\n\n private emit<K extends keyof CustomerSupportClientEventMap>(\n type: K,\n detail: CustomerSupportClientEventMap[K],\n ): void {\n for (const listener of this.listeners.get(type) ?? []) listener(detail)\n }\n\n private assertUsable(): void {\n if (this.destroyed) {\n throw new CustomerSupportClientError('CLIENT_DESTROYED', '客服客户端已经销毁。')\n }\n }\n}\n\nfunction validateRealtimeUrl(value: string): string {\n let url: URL\n try {\n url = new URL(value)\n } catch {\n throw new CustomerSupportClientError('INVALID_CONFIGURATION', '客服实时地址无效。')\n }\n if (!['ws:', 'wss:'].includes(url.protocol) || url.search || url.hash || url.username) {\n throw new CustomerSupportClientError('INVALID_CONFIGURATION', '客服实时地址不安全。')\n }\n return url.href\n}\n\nfunction normalizeReconnect(\n value?: Partial<AiEmployeeReconnectOptions>,\n): AiEmployeeReconnectOptions {\n return {\n initialDelayMs: Math.max(0, value?.initialDelayMs ?? DEFAULT_RECONNECT.initialDelayMs),\n maximumDelayMs: Math.max(1, value?.maximumDelayMs ?? DEFAULT_RECONNECT.maximumDelayMs),\n factor: Math.max(1, value?.factor ?? DEFAULT_RECONNECT.factor),\n jitter: Math.min(1, Math.max(0, value?.jitter ?? DEFAULT_RECONNECT.jitter)),\n }\n}\n\nfunction compareMessages(left: CustomerSupportMessage, right: CustomerSupportMessage): number {\n const leftSequence = Number(left.sequence)\n const rightSequence = Number(right.sequence)\n if (Number.isFinite(leftSequence) && Number.isFinite(rightSequence)) {\n return leftSequence - rightSequence\n }\n return left.createdAt.localeCompare(right.createdAt)\n}\n\nfunction normalizeReadCursor(value: unknown): string | null {\n const cursor = normalizedText(value)\n if (!/^\\d+$/.test(cursor)) return null\n return cursor.replace(/^0+(?=\\d)/, '')\n}\n\nfunction compareReadCursors(left: string, right: string): number {\n if (left.length !== right.length) return left.length < right.length ? -1 : 1\n if (left === right) return 0\n return left < right ? -1 : 1\n}\n\nfunction maxReadCursor(left: string | null, right: string): string {\n return left && compareReadCursors(left, right) >= 0 ? left : right\n}\n\nfunction hasCustomerSupportMessages(session: CustomerSupportSession): boolean {\n return session.lastMessage.trim().length > 0\n}\n\nfunction requiredText(value: unknown, field: string): string {\n const normalized = normalizedText(value)\n if (!normalized) {\n throw new CustomerSupportClientError('INVALID_CONFIGURATION', `${field} 不能为空。`)\n }\n return normalized\n}\n\nfunction requiredRequestId(value: string): string {\n return requiredText(value, 'requestId')\n}\n\nfunction normalizedText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction record(value: unknown): JsonRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as JsonRecord)\n : {}\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0\n}\n\nfunction createRequestId(): string {\n return typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `request-${Date.now()}-${Math.random().toString(16).slice(2)}`\n}\n\nfunction authenticationFailure(code: string): {\n code: CustomerSupportErrorCode\n message: string\n retryMode: AuthenticationRetryMode\n} {\n if (code === 'UNAUTHORIZED') {\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '客服连接凭证已失效,正在重新连接。',\n retryMode: 'token',\n }\n }\n if (code === 'ORGANIZATION_CONTEXT_REQUIRED') {\n return {\n code: 'ORGANIZATION_CONTEXT_REQUIRED',\n message: '请选择企业/团队后再联系人工客服。',\n retryMode: 'never',\n }\n }\n if (code === 'INVALID_ARGUMENT') {\n return {\n code: 'PROTOCOL_ERROR',\n message: '客服实时连接协议不受支持。',\n retryMode: 'never',\n }\n }\n if (\n code === 'REALTIME_UNAVAILABLE' ||\n code === 'KANBAN_AUTH_FAILED' ||\n code.startsWith('SERVICE_')\n ) {\n return {\n code: 'REALTIME_UNAVAILABLE',\n message: '客服实时鉴权服务暂不可用,正在重试。',\n retryMode: 'availability',\n }\n }\n if (\n code === 'ACCESS_DENIED' ||\n code === 'ORIGIN_NOT_ALLOWED' ||\n code === 'CHANNEL_ACCESS_DENIED'\n ) {\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '当前身份无权使用人工客服。',\n retryMode: 'never',\n }\n }\n return {\n code: 'AUTHENTICATION_FAILED',\n message: '人工客服实时连接认证失败。',\n retryMode: 'never',\n }\n}\n","import type {\n NotificationCenterClientEventMap,\n NotificationCenterClientListener,\n NotificationCenterClientOptions,\n NotificationCenterErrorCode,\n NotificationCenterErrorDetail,\n NotificationCenterTransport,\n NotificationDto,\n NotificationRealtimeChange,\n NotificationTypeSummary,\n} from './notification-center-types'\n\ntype UntypedListener = (detail: unknown) => void\n\nconst DEFAULT_PAGE_SIZE = 20\n\nexport class NotificationCenterClientError extends Error {\n readonly code: NotificationCenterErrorCode\n\n constructor(code: NotificationCenterErrorCode, message: string) {\n super(message)\n this.name = 'NotificationCenterClientError'\n this.code = code\n }\n}\n\n/**\n * Inbox store and HTTP orchestration for the notification center.\n *\n * The client owns no realtime connection. The host keeps the single\n * `/api/user-realtime/ws` socket it already maintains for its other channels and\n * hands notification events in through {@link applyRealtimeEvent}; cursors,\n * heartbeats, authentication and reconnect stay on the host side.\n */\nexport class NotificationCenterClient {\n private readonly transport: NotificationCenterTransport\n private readonly applicationName: string\n private readonly pageSize: number\n private readonly readStatus: 'all' | 'unread' | 'read'\n private readonly preferredTypeOrder: readonly string[]\n private readonly listeners = new Map<\n keyof NotificationCenterClientEventMap,\n Set<UntypedListener>\n >()\n\n private items: NotificationDto[] = []\n private hasMore = false\n private nextId: string | null = null\n private unreadCount = 0\n private notificationTypes: string[] = []\n private availableTypes: NotificationTypeSummary[] = []\n private typeCatalogFromBackend = false\n private inboxGeneration = 0\n private destroyed = false\n private loadingInbox = false\n private pendingResync = false\n\n constructor(options: NotificationCenterClientOptions) {\n if (!options?.transport) {\n throw new NotificationCenterClientError(\n 'INVALID_CONFIGURATION',\n '缺少通知中心 transport 配置。',\n )\n }\n this.transport = options.transport\n this.applicationName = normalizedText(options.applicationName)\n this.pageSize = Math.max(1, Math.floor(options.pageSize ?? DEFAULT_PAGE_SIZE))\n this.readStatus = ['all', 'unread', 'read'].includes(options.readStatus ?? '')\n ? (options.readStatus as 'all' | 'unread' | 'read')\n : 'all'\n this.preferredTypeOrder = (options.preferredTypeOrder ?? [])\n .map((value) => normalizedText(value))\n .filter(Boolean)\n }\n\n get notifications(): readonly NotificationDto[] {\n return [...this.items]\n }\n\n get unread(): number {\n return this.unreadCount\n }\n\n /** 数据中实际存在的通知分类,供 UI 渲染页签;不是写死的枚举。 */\n get types(): readonly NotificationTypeSummary[] {\n return this.availableTypes.map((entry) => ({ ...entry }))\n }\n\n on<K extends keyof NotificationCenterClientEventMap>(\n type: K,\n listener: NotificationCenterClientListener<K>,\n ): () => void {\n this.assertUsable()\n const listeners = this.listeners.get(type) ?? new Set<UntypedListener>()\n const untyped = listener as UntypedListener\n listeners.add(untyped)\n this.listeners.set(type, listeners)\n return () => listeners.delete(untyped)\n }\n\n async start(): Promise<void> {\n this.assertUsable()\n await Promise.all([this.reloadInbox(), this.refreshUnreadCount()])\n this.emit('ready', {})\n }\n\n async setTypeFilter(types: readonly string[]): Promise<void> {\n this.assertUsable()\n this.notificationTypes = [...types].map((value) => normalizedText(value)).filter(Boolean)\n await this.reloadInbox()\n }\n\n getTypeFilter(): readonly string[] {\n return [...this.notificationTypes]\n }\n\n async loadMore(): Promise<void> {\n this.assertUsable()\n if (!this.hasMore || this.loadingInbox || !this.nextId) return\n const generation = this.inboxGeneration\n this.loadingInbox = true\n try {\n const result = await this.transport.listInbox({\n pageSize: this.pageSize,\n beforeId: this.nextId,\n notificationTypes: this.notificationTypes,\n readStatus: this.readStatus,\n applicationName: this.applicationName,\n })\n if (this.destroyed || generation !== this.inboxGeneration) return\n const existing = new Set(this.items.map((item) => item.id))\n const merged = [...this.items]\n for (const item of result.items) {\n if (!existing.has(item.id)) {\n existing.add(item.id)\n merged.push(item)\n }\n }\n this.items = merged\n this.hasMore = result.hasMore\n this.nextId = result.nextId\n this.rememberTypes(result.items)\n this.emitInbox()\n } catch {\n this.emitError('INBOX_LOAD_FAILED', '通知加载失败,请稍后重试。', true)\n } finally {\n if (generation === this.inboxGeneration) this.finishInboxLoad()\n }\n }\n\n async refresh(): Promise<void> {\n this.assertUsable()\n await Promise.all([this.reloadInbox(), this.refreshUnreadCount()])\n }\n\n /**\n * Consume a notification realtime event captured by the host socket.\n *\n * The raw event is mapped through the transport so the DTO contract stays in\n * this SDK; anything that cannot be mapped degrades to a full refresh. Events\n * that arrive while an inbox request is in flight are replaced by a resync so a\n * late server page cannot drop them.\n */\n applyRealtimeEvent(event: unknown): void {\n if (this.destroyed) return\n if (this.loadingInbox) {\n this.pendingResync = true\n return\n }\n const parse = this.transport.parseRealtimeEvent\n let change: NotificationRealtimeChange | null = null\n if (parse) {\n try {\n change = parse.call(this.transport, event)\n } catch {\n change = null\n }\n }\n if (!change) {\n void this.refreshFromRealtime()\n return\n }\n this.applyRealtimeChange(change)\n }\n\n async markRead(notificationId: string): Promise<void> {\n this.assertUsable()\n const id = requiredText(notificationId, 'notificationId')\n const target = this.items.find((item) => item.id === id)\n if (target && target.readStatus === 'read') return\n try {\n const result = await this.transport.markRead({\n notificationId: id,\n applicationName: this.applicationName,\n })\n if (this.destroyed) return\n this.applyRead([id], result.readAt)\n this.setUnreadCount(result.unreadCount)\n this.emit('notification-read', { notificationId: id })\n } catch {\n this.emitError('MARK_READ_FAILED', '通知标记已读失败,请稍后重试。', true)\n }\n }\n\n async markAllRead(): Promise<void> {\n this.assertUsable()\n try {\n const result = await this.transport.markAllRead({\n applicationName: this.applicationName,\n })\n if (this.destroyed) return\n const readAt = new Date().toISOString()\n this.items = this.items.map((item) =>\n item.readStatus === 'read' ? item : { ...item, readStatus: 'read', readAt },\n )\n this.emitInbox()\n this.setUnreadCount(result.unreadCount)\n } catch {\n this.emitError('MARK_READ_FAILED', '通知标记已读失败,请稍后重试。', true)\n }\n }\n\n async downloadAttachment(fileId: string, name?: string): Promise<Blob> {\n this.assertUsable()\n const id = requiredText(fileId, 'fileId')\n try {\n return await this.transport.downloadAttachment({ fileId: id, name })\n } catch {\n const detail = this.emitError('DOWNLOAD_FAILED', '附件下载失败,请稍后重试。', true)\n throw new NotificationCenterClientError(detail.code, detail.message)\n }\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.pendingResync = false\n this.inboxGeneration += 1\n this.listeners.clear()\n this.items = []\n }\n\n private async reloadInbox(): Promise<void> {\n const generation = ++this.inboxGeneration\n this.loadingInbox = true\n try {\n const result = await this.transport.listInbox({\n pageSize: this.pageSize,\n beforeId: null,\n // 分类目录随首屏/刷新/切换页签的请求一并取回,不额外发请求。\n includeTypeFacets: true,\n notificationTypes: this.notificationTypes,\n readStatus: this.readStatus,\n applicationName: this.applicationName,\n })\n if (this.destroyed || generation !== this.inboxGeneration) return\n const unique = new Map<string, NotificationDto>()\n for (const item of result.items) {\n if (item.id) unique.set(item.id, item)\n }\n this.items = [...unique.values()]\n this.hasMore = result.hasMore\n this.nextId = result.nextId\n this.applyTypeCatalog(result.types)\n this.rememberTypes(result.items)\n this.emitInbox()\n } catch {\n if (generation === this.inboxGeneration) {\n this.emitError('INBOX_LOAD_FAILED', '通知加载失败,请稍后重试。', true)\n }\n } finally {\n if (generation === this.inboxGeneration) this.finishInboxLoad()\n }\n }\n\n private finishInboxLoad(): void {\n this.loadingInbox = false\n if (!this.pendingResync || this.destroyed) return\n this.pendingResync = false\n void this.refreshFromRealtime()\n }\n\n /**\n * 分类页签的数据来源。\n *\n * `notification_type` 是后端自由文本列,展示名来自后端字典(`notification_type_name`),\n * 前端不维护 code 到中文名的映射。权威目录是 `inbox` 在 `includeTypeFacets` 下返回的\n * `types`(后端按收件人可见范围统计,忽略类型筛选与分页);后端未提供时退回累积已加载\n * 页面里出现过的分类——这在分页深处才出现的分类上会暂时缺页签,属已知取舍。\n */\n private applyTypeCatalog(types: readonly NotificationTypeSummary[] | undefined): void {\n if (!Array.isArray(types)) return\n const normalized = types\n .map((entry) => ({\n type: normalizedText(entry?.type),\n name: normalizedText(entry?.name),\n }))\n .filter((entry) => entry.type)\n this.typeCatalogFromBackend = true\n this.setAvailableTypes(normalized, true)\n }\n\n private rememberTypes(items: readonly NotificationDto[]): void {\n const discovered = items\n .map((item) => ({ type: normalizedText(item.type), name: normalizedText(item.typeName) }))\n .filter((entry) => entry.type)\n if (!discovered.length) return\n // 后端目录已给出分类集合时只补展示名,不新增或重排分类。\n this.setAvailableTypes(discovered, false, this.typeCatalogFromBackend)\n }\n\n private setAvailableTypes(\n candidates: readonly NotificationTypeSummary[],\n replace: boolean,\n namesOnly = false,\n ): void {\n const merged = new Map<string, string>()\n if (!replace) {\n for (const entry of this.availableTypes) merged.set(entry.type, entry.name)\n }\n for (const entry of candidates) {\n if (namesOnly && !merged.has(entry.type)) continue\n // 已有展示名优先保留:后端字典是权威,条目里的名字只用于填空。\n const existing = merged.get(entry.type)\n merged.set(entry.type, existing || entry.name)\n }\n const codes = [...merged.keys()]\n const preferred = this.preferredTypeOrder.filter((value) => merged.has(value))\n const ordered = [...preferred, ...codes.filter((value) => !preferred.includes(value))].map(\n (type) => ({ type, name: merged.get(type) ?? '' }),\n )\n if (\n ordered.length === this.availableTypes.length &&\n ordered.every(\n (entry, index) =>\n entry.type === this.availableTypes[index]?.type &&\n entry.name === this.availableTypes[index]?.name,\n )\n ) {\n return\n }\n this.availableTypes = ordered\n this.emit('types-change', { types: this.types })\n }\n\n private async refreshUnreadCount(): Promise<void> {\n try {\n const result = await this.transport.getUnreadCount({ applicationName: this.applicationName })\n if (this.destroyed) return\n this.setUnreadCount(result.unreadCount)\n } catch {\n // A later inbox reload or realtime event can recover the unread projection.\n }\n }\n\n private applyRealtimeChange(change: NotificationRealtimeChange): void {\n if (change.kind === 'created') {\n const incoming = change.notification\n if (!incoming.id) return\n if (!this.items.some((item) => item.id === incoming.id)) {\n this.items = [incoming, ...this.items]\n this.rememberTypes([incoming])\n this.emitInbox()\n }\n this.syncRealtimeUnreadCount(change.unreadCount)\n return\n }\n if (change.kind === 'read') {\n this.applyRead(change.notificationIds, change.readAt ?? null)\n this.syncRealtimeUnreadCount(change.unreadCount)\n return\n }\n const removed = new Set(change.notificationIds)\n if (removed.size) {\n const next = this.items.filter((item) => !removed.has(item.id))\n if (next.length !== this.items.length) {\n this.items = next\n this.emitInbox()\n }\n }\n this.syncRealtimeUnreadCount(change.unreadCount)\n }\n\n private syncRealtimeUnreadCount(value: number | undefined): void {\n // Existing realtime events carry an application-scoped unread count. In the\n // all-applications projection only the aggregate HTTP count is authoritative.\n if (this.applicationName && typeof value === 'number') this.setUnreadCount(value)\n else void this.refreshUnreadCount()\n }\n\n private applyRead(ids: readonly string[], readAt: string | null): void {\n const target = new Set(ids)\n if (!target.size) return\n let changed = false\n const next = this.items.map((item) => {\n if (target.has(item.id) && item.readStatus !== 'read') {\n changed = true\n return { ...item, readStatus: 'read' as const, readAt: readAt ?? item.readAt }\n }\n return item\n })\n if (changed) {\n this.items = next\n this.emitInbox()\n }\n }\n\n private async refreshFromRealtime(): Promise<void> {\n await this.reloadInbox()\n await this.refreshUnreadCount()\n }\n\n private emitInbox(): void {\n this.emit('inbox', {\n items: [...this.items],\n hasMore: this.hasMore,\n nextId: this.nextId,\n })\n }\n\n private setUnreadCount(value: number): void {\n const normalized = Number.isFinite(value) && value > 0 ? Math.floor(value) : 0\n if (normalized === this.unreadCount) return\n this.unreadCount = normalized\n this.emit('unread-count-change', { unreadCount: normalized })\n }\n\n private emitError(\n code: NotificationCenterErrorCode,\n message: string,\n recoverable: boolean,\n ): NotificationCenterErrorDetail {\n const detail = { code, message, recoverable }\n this.emit('error', detail)\n return detail\n }\n\n private emit<K extends keyof NotificationCenterClientEventMap>(\n type: K,\n detail: NotificationCenterClientEventMap[K],\n ): void {\n for (const listener of this.listeners.get(type) ?? []) listener(detail)\n }\n\n private assertUsable(): void {\n if (this.destroyed) {\n throw new NotificationCenterClientError('CLIENT_DESTROYED', '通知中心客户端已经销毁。')\n }\n }\n}\n\nfunction requiredText(value: unknown, field: string): string {\n const normalized = normalizedText(value)\n if (!normalized) {\n throw new NotificationCenterClientError('INVALID_CONFIGURATION', `${field} 不能为空。`)\n }\n return normalized\n}\n\nfunction normalizedText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@csntgao/ai-employee-client",
3
- "version": "0.15.2",
3
+ "version": "0.15.4",
4
4
  "description": "Browser client for Uniplat AI Employee sessions and realtime messages",
5
5
  "type": "module",
6
6
  "sideEffects": false,