@csntgao/ai-employee-client 0.14.3

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.
@@ -0,0 +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","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 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 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 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, fallbackResult, processing }\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 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 trigger: 'out_of_scope'\n entry: 'help_and_support'\n}\n\nexport type AiEmployeeAssistantAction = OpenCustomerSupportAssistantAction\n\nexport interface ParsedAiEmployeeAssistantContent {\n content: string\n actions: readonly AiEmployeeAssistantAction[]\n}\n\ninterface StructuredJsonCandidate {\n content: string\n json: string\n}\n\nconst ACTION_KEYS = ['action', 'entry', 'transaction-id', 'trigger', 'type'] as const\nconst OPEN_CUSTOMER_SUPPORT_MARKER = /\"action\"\\s*:\\s*\"open_customer_support\"/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\n\n/**\n * Parses a trusted platform action from the final standalone JSON block of an\n * assistant response. Invalid or ambiguous input is returned unchanged and is\n * never made executable.\n */\nexport function parseAiEmployeeAssistantContent(content: string): ParsedAiEmployeeAssistantContent {\n const source = typeof content === 'string' ? content : ''\n const candidate = trailingStructuredJson(source)\n if (!candidate || markerCount(source) !== 1) return unchanged(source)\n\n let value: unknown\n try {\n value = JSON.parse(candidate.json)\n } catch {\n return unchanged(source)\n }\n const action = parseOpenCustomerSupportAction(value)\n if (!action) return unchanged(source)\n return Object.freeze({\n content: candidate.content,\n actions: Object.freeze([action]),\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 fenced = withoutTrailingWhitespace.match(\n /(?:^|\\r?\\n)[\\t ]*```json[\\t ]*\\r?\\n([\\s\\S]*?)\\r?\\n[\\t ]*```$/i,\n )\n if (fenced?.index !== undefined) {\n return {\n content: withoutTrailingWhitespace.slice(0, fenced.index).trimEnd(),\n json: fenced[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 parseOpenCustomerSupportAction(value: unknown): OpenCustomerSupportAssistantAction | null {\n if (!isRecord(value)) return null\n const keys = Object.keys(value).sort()\n if (keys.length !== ACTION_KEYS.length || keys.some((key, index) => key !== ACTION_KEYS[index])) {\n return null\n }\n if (\n value.type !== 'assistant_action' ||\n value.action !== 'open_customer_support' ||\n !isUuidV4(value['transaction-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 trigger: 'out_of_scope',\n entry: 'help_and_support',\n })\n}\n\nfunction markerCount(value: string): number {\n return [...value.matchAll(OPEN_CUSTOMER_SUPPORT_MARKER)].length\n}\n\nfunction unchanged(content: string): ParsedAiEmployeeAssistantContent {\n return Object.freeze({ content, actions: Object.freeze([]) })\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"]}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@csntgao/ai-employee-client",
3
+ "version": "0.14.3",
4
+ "description": "Browser client for Uniplat AI Employee sessions and realtime messages",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "main": "./dist/index.js",
11
+ "module": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "engines": {
20
+ "node": ">=20"
21
+ },
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "scripts": {
26
+ "build": "tsup",
27
+ "typecheck": "tsc --noEmit",
28
+ "test": "vitest run"
29
+ }
30
+ }