@csntgao/ai-employee-client 0.15.0 → 0.15.1

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
@@ -61,7 +61,7 @@ interface AiEmployeeTransport {
61
61
  }
62
62
  type AiEmployeeTransportErrorCode = 'UNAUTHORIZED' | 'ACCESS_DENIED' | 'AI_EMPLOYEE_NOT_AVAILABLE' | 'APPLICATION_NOT_SUPPORTED' | 'ORGANIZATION_CONTEXT_REQUIRED' | 'INVALID_ARGUMENT' | 'IDEMPOTENCY_CONFLICT' | 'REALTIME_UNAVAILABLE' | 'TOO_MANY_REQUESTS';
63
63
  type AiEmployeeConnectionState = 'idle' | 'connecting' | 'authenticating' | 'subscribing' | 'connected' | 'reconnecting' | 'disconnected' | 'destroyed';
64
- type AiEmployeeErrorCode = 'INVALID_CONFIGURATION' | 'SESSION_UNAVAILABLE' | 'HISTORY_LOAD_FAILED' | 'TOKEN_UNAVAILABLE' | 'WEBSOCKET_UNAVAILABLE' | 'WEBSOCKET_ERROR' | 'AUTHENTICATION_FAILED' | 'ORGANIZATION_CONTEXT_REQUIRED' | 'REALTIME_UNAVAILABLE' | 'CHANNEL_UNAVAILABLE' | 'SESSION_NOT_FOUND' | 'PROTOCOL_ERROR' | 'SEND_FAILED' | 'FIRST_MESSAGE_CONFLICT' | 'RATE_LIMITED' | 'SEND_IN_PROGRESS' | 'EMPTY_MESSAGE' | 'SOURCE_SESSION_NOT_FOUND' | 'SOURCE_SESSION_ACCESS_DENIED' | 'HANDOFF_ACTION_NOT_FOUND' | 'HANDOFF_ACTION_MISMATCH' | 'CUSTOMER_SUPPORT_UNAVAILABLE' | 'CUSTOMER_SUPPORT_HANDOFF_FAILED' | 'CLIENT_DESTROYED';
64
+ type AiEmployeeErrorCode = 'INVALID_CONFIGURATION' | 'SESSION_UNAVAILABLE' | 'HISTORY_LOAD_FAILED' | 'TOKEN_UNAVAILABLE' | 'WEBSOCKET_UNAVAILABLE' | 'WEBSOCKET_ERROR' | 'AUTHENTICATION_FAILED' | 'ORGANIZATION_CONTEXT_REQUIRED' | 'REALTIME_UNAVAILABLE' | 'CHANNEL_UNAVAILABLE' | 'SESSION_NOT_FOUND' | 'PROTOCOL_ERROR' | 'SEND_FAILED' | 'FIRST_MESSAGE_CONFLICT' | 'RATE_LIMITED' | 'SEND_IN_PROGRESS' | 'EMPTY_MESSAGE' | 'SOURCE_SESSION_NOT_FOUND' | 'SOURCE_SESSION_ACCESS_DENIED' | 'HANDOFF_ACTION_NOT_FOUND' | 'HANDOFF_ACTION_MISMATCH' | 'CUSTOMER_SUPPORT_UNAVAILABLE' | 'CUSTOMER_SUPPORT_HANDOFF_FAILED' | 'FILE_ACCESS_DENIED' | 'FILE_NOT_FOUND' | 'FILE_PATH_AMBIGUOUS' | 'FILE_DOWNLOAD_FAILED' | 'CLIENT_DESTROYED';
65
65
  interface AiEmployeeClientErrorDetail {
66
66
  code: AiEmployeeErrorCode;
67
67
  message: string;
@@ -226,16 +226,27 @@ interface OpenCustomerSupportAssistantAction {
226
226
  trigger: 'out_of_scope';
227
227
  entry: 'help_and_support';
228
228
  }
229
- type AiEmployeeAssistantAction = OpenCustomerSupportAssistantAction;
229
+ interface OpenFileAssistantAction {
230
+ type: 'assistant_action';
231
+ action: 'open_file';
232
+ transactionId: string;
233
+ sessionId: string;
234
+ name: string;
235
+ size: string;
236
+ path: string;
237
+ }
238
+ type AiEmployeeAssistantAction = OpenCustomerSupportAssistantAction | OpenFileAssistantAction;
230
239
  interface ParsedAiEmployeeAssistantContent {
231
240
  content: string;
232
241
  actions: readonly AiEmployeeAssistantAction[];
242
+ rejectedActionTypes?: readonly AiEmployeeAssistantAction['action'][];
233
243
  }
234
244
  /**
235
- * Parses a structurally valid platform action from the final standalone JSON
236
- * block of an assistant response. Invalid or ambiguous input is returned
237
- * unchanged and is never made executable. Renderers must additionally compare
238
- * `action.sessionId` with the session that owns the assistant message.
245
+ * Parses structurally valid platform actions from consecutive standalone JSON
246
+ * blocks at the end of an assistant response. Invalid or ambiguous trailing
247
+ * action blocks are removed from display content, reported only by stable action
248
+ * type, and never made executable. Renderers must additionally compare every
249
+ * `action.sessionId` with the session that owns the message.
239
250
  */
240
251
  declare function parseAiEmployeeAssistantContent(content: string): ParsedAiEmployeeAssistantContent;
241
252
  declare function isUuidV4(value: unknown): value is string;
@@ -679,4 +690,4 @@ declare function parseJsonRecord(raw: string): JsonRecord | null;
679
690
  declare function parseAiEmployeeEvent(raw: unknown): ParsedAiEmployeeEvent;
680
691
  declare function hashText(value: string): string;
681
692
 
682
- 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 ParsedAiEmployeeAssistantContent, type ParsedAiEmployeeEvent, type ParsedSessionMessage, type PingFrame, type SessionSubscriptionFrame, createAuthenticateFrame, createPingFrame, createSubscriptionFrame, hashText, isUuidV4, parseAiEmployeeAssistantContent, parseAiEmployeeEvent, parseJsonRecord };
693
+ 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 };
package/dist/index.js CHANGED
@@ -1085,25 +1085,65 @@ function numberValue(value) {
1085
1085
  }
1086
1086
 
1087
1087
  // src/assistant-actions.ts
1088
- var ACTION_KEYS = ["action", "entry", "session-id", "transaction-id", "trigger", "type"];
1089
- var OPEN_CUSTOMER_SUPPORT_MARKER = /"action"\s*:\s*"open_customer_support"/g;
1088
+ var CUSTOMER_SUPPORT_ACTION_KEYS = [
1089
+ "action",
1090
+ "entry",
1091
+ "session-id",
1092
+ "transaction-id",
1093
+ "trigger",
1094
+ "type"
1095
+ ];
1096
+ var FILE_ACTION_KEYS = [
1097
+ "action",
1098
+ "name",
1099
+ "path",
1100
+ "session-id",
1101
+ "size",
1102
+ "transaction-id",
1103
+ "type"
1104
+ ];
1105
+ var SUPPORTED_ACTION_MARKER = /"action"\s*:\s*"(open_customer_support|open_file)"/g;
1090
1106
  var 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;
1091
1107
  var SESSION_ID_PATTERN = /^[A-Za-z0-9._:-]{1,64}$/;
1108
+ var FILE_SIZE_PATTERN = /^\d+(?:\.\d+)?(?:B|KB|MB|GB|TB)$/;
1092
1109
  function parseAiEmployeeAssistantContent(content) {
1093
1110
  const source = typeof content === "string" ? content : "";
1094
- const candidate = trailingStructuredJson(source);
1095
- if (!candidate || markerCount(source) !== 1) return unchanged(source);
1096
- let value;
1097
- try {
1098
- value = JSON.parse(candidate.json);
1099
- } catch {
1100
- return unchanged(source);
1111
+ let remaining = source;
1112
+ const actions = [];
1113
+ const rejectedActionTypes = [];
1114
+ let strippedMarkerCount = 0;
1115
+ while (true) {
1116
+ const candidate = trailingStructuredJson(remaining);
1117
+ if (!candidate) break;
1118
+ const candidateActionTypes = actionMarkerTypes(candidate.json);
1119
+ if (candidateActionTypes.length === 0) break;
1120
+ strippedMarkerCount += candidateActionTypes.length;
1121
+ let value;
1122
+ try {
1123
+ value = JSON.parse(candidate.json);
1124
+ } catch {
1125
+ rejectedActionTypes.unshift(...candidateActionTypes);
1126
+ remaining = candidate.content;
1127
+ continue;
1128
+ }
1129
+ const action = parseAssistantAction(value);
1130
+ if (!action || candidateActionTypes.length !== 1) {
1131
+ rejectedActionTypes.unshift(...candidateActionTypes);
1132
+ } else {
1133
+ actions.unshift(action);
1134
+ }
1135
+ remaining = candidate.content;
1136
+ }
1137
+ const sourceActionTypes = actionMarkerTypes(source);
1138
+ if (sourceActionTypes.length === 0) return unchanged(source);
1139
+ if (strippedMarkerCount !== sourceActionTypes.length) return unchanged(source);
1140
+ const transactionIds = new Set(actions.map((action) => action.transactionId));
1141
+ if (rejectedActionTypes.length > 0 || actions.length === 0 || transactionIds.size !== actions.length || actions.filter((action) => action.action === "open_customer_support").length > 1) {
1142
+ return rejected(remaining, sourceActionTypes);
1101
1143
  }
1102
- const action = parseOpenCustomerSupportAction(value);
1103
- if (!action) return unchanged(source);
1104
1144
  return Object.freeze({
1105
- content: candidate.content,
1106
- actions: Object.freeze([action])
1145
+ content: remaining,
1146
+ actions: Object.freeze(actions)
1107
1147
  });
1108
1148
  }
1109
1149
  function isUuidV4(value) {
@@ -1111,13 +1151,17 @@ function isUuidV4(value) {
1111
1151
  }
1112
1152
  function trailingStructuredJson(content) {
1113
1153
  const withoutTrailingWhitespace = content.trimEnd();
1114
- const fenced = withoutTrailingWhitespace.match(
1115
- /(?:^|\r?\n)[\t ]*```json[\t ]*\r?\n([\s\S]*?)\r?\n[\t ]*```$/i
1116
- );
1117
- if (fenced?.index !== void 0) {
1154
+ const fencedPattern = /(?:^|\r?\n)[\t ]*```json[\t ]*\r?\n([\s\S]*?)\r?\n[\t ]*```[\t ]*/gi;
1155
+ let trailingFence = null;
1156
+ for (const match of withoutTrailingWhitespace.matchAll(fencedPattern)) {
1157
+ if (match.index + match[0].length === withoutTrailingWhitespace.length) {
1158
+ trailingFence = match;
1159
+ }
1160
+ }
1161
+ if (trailingFence) {
1118
1162
  return {
1119
- content: withoutTrailingWhitespace.slice(0, fenced.index).trimEnd(),
1120
- json: fenced[1]?.trim() ?? ""
1163
+ content: withoutTrailingWhitespace.slice(0, trailingFence.index).trimEnd(),
1164
+ json: trailingFence[1]?.trim() ?? ""
1121
1165
  };
1122
1166
  }
1123
1167
  const starts = [...withoutTrailingWhitespace.matchAll(/(?:^|\r?\n)[\t ]*(\{)/g)];
@@ -1137,10 +1181,16 @@ function trailingStructuredJson(content) {
1137
1181
  }
1138
1182
  return null;
1139
1183
  }
1184
+ function parseAssistantAction(value) {
1185
+ if (!isRecord(value)) return null;
1186
+ if (value.action === "open_customer_support") return parseOpenCustomerSupportAction(value);
1187
+ if (value.action === "open_file") return parseOpenFileAction(value);
1188
+ return null;
1189
+ }
1140
1190
  function parseOpenCustomerSupportAction(value) {
1141
1191
  if (!isRecord(value)) return null;
1142
1192
  const keys = Object.keys(value).sort();
1143
- if (keys.length !== ACTION_KEYS.length || keys.some((key, index) => key !== ACTION_KEYS[index])) {
1193
+ if (keys.length !== CUSTOMER_SUPPORT_ACTION_KEYS.length || keys.some((key, index) => key !== CUSTOMER_SUPPORT_ACTION_KEYS[index])) {
1144
1194
  return null;
1145
1195
  }
1146
1196
  if (value.type !== "assistant_action" || value.action !== "open_customer_support" || !isUuidV4(value["transaction-id"]) || !isAssistantActionSessionId(value["session-id"]) || value.trigger !== "out_of_scope" || value.entry !== "help_and_support") {
@@ -1155,15 +1205,64 @@ function parseOpenCustomerSupportAction(value) {
1155
1205
  entry: "help_and_support"
1156
1206
  });
1157
1207
  }
1208
+ function parseOpenFileAction(value) {
1209
+ if (!isRecord(value)) return null;
1210
+ const keys = Object.keys(value).sort();
1211
+ if (keys.length !== FILE_ACTION_KEYS.length || keys.some((key, index) => key !== FILE_ACTION_KEYS[index])) {
1212
+ return null;
1213
+ }
1214
+ const transactionId = value["transaction-id"];
1215
+ const sessionId = value["session-id"];
1216
+ const name = value.name;
1217
+ const size = value.size;
1218
+ const path = value.path;
1219
+ if (value.type !== "assistant_action" || value.action !== "open_file" || !isCanonicalUuidV4(transactionId) || !isAssistantActionSessionId(sessionId) || !isSafeRelativeFilePath(path) || typeof name !== "string" || !name || name !== name.trim() || name !== path.slice(path.lastIndexOf("/") + 1) || typeof size !== "string" || size !== size.trim() || !FILE_SIZE_PATTERN.test(size)) {
1220
+ return null;
1221
+ }
1222
+ return Object.freeze({
1223
+ type: "assistant_action",
1224
+ action: "open_file",
1225
+ transactionId,
1226
+ sessionId,
1227
+ name,
1228
+ size,
1229
+ path
1230
+ });
1231
+ }
1158
1232
  function isAssistantActionSessionId(value) {
1159
1233
  return typeof value === "string" && SESSION_ID_PATTERN.test(value);
1160
1234
  }
1161
- function markerCount(value) {
1162
- return [...value.matchAll(OPEN_CUSTOMER_SUPPORT_MARKER)].length;
1235
+ function actionMarkerTypes(value) {
1236
+ return [...value.matchAll(SUPPORTED_ACTION_MARKER)].flatMap((match) => {
1237
+ const action = match[1];
1238
+ return action === "open_customer_support" || action === "open_file" ? [action] : [];
1239
+ });
1240
+ }
1241
+ function isCanonicalUuidV4(value) {
1242
+ return isUuidV4(value) && value === value.toLowerCase();
1243
+ }
1244
+ function isSafeRelativeFilePath(value) {
1245
+ if (typeof value !== "string" || !value || value !== value.trim() || value.startsWith("/") || value.startsWith("\\") || value.includes("\\") || /^[A-Za-z]:/.test(value) || hasControlCharacter(value)) {
1246
+ return false;
1247
+ }
1248
+ return value.split("/").every((part) => part && part !== "." && part !== ".." && !part.startsWith("."));
1249
+ }
1250
+ function hasControlCharacter(value) {
1251
+ return [...value].some((character) => {
1252
+ const codePoint = character.codePointAt(0) ?? 0;
1253
+ return codePoint <= 31 || codePoint === 127;
1254
+ });
1163
1255
  }
1164
1256
  function unchanged(content) {
1165
1257
  return Object.freeze({ content, actions: Object.freeze([]) });
1166
1258
  }
1259
+ function rejected(content, actionTypes) {
1260
+ return Object.freeze({
1261
+ content,
1262
+ actions: Object.freeze([]),
1263
+ rejectedActionTypes: Object.freeze([...new Set(actionTypes)])
1264
+ });
1265
+ }
1167
1266
  function isRecord(value) {
1168
1267
  return value !== null && typeof value === "object" && !Array.isArray(value);
1169
1268
  }
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","authenticationFailure","result","DEFAULT_RECONNECT","MAX_AVAILABILITY_RECONNECTS","validateRealtimeUrl","createRequestId","requiredText","requiredRequestId","message","numberValue","normalizedText"],"mappings":";AAoCO,SAAS,wBAAwB,WAAA,EAAwC;AAC9E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,gBAAA,EAAkB,CAAA;AAAA,IAClB,YAAA,EAAc,WAAA;AAAA,IACd,kBAAA,EAAoB,CAAC,aAAa,CAAA;AAAA,IAClC,SAAS;AAAC,GACZ;AACF;AAEO,SAAS,uBAAA,CACd,SAAA,EACA,MAAA,GAAsC,WAAA,EACtC,gBAAgB,KAAA,EACU;AAC1B,EAAA,MAAM,KAAA,GAAkC;AAAA,IACtC,MAAA;AAAA,IACA,OAAA,EAAS,aAAA;AAAA,IACT,aAAA,EAAe,SAAA;AAAA,IACf,WAAA,EAAa;AAAA,GACf;AACA,EAAA,IAAI,MAAA,KAAW,WAAA,EAAa,KAAA,CAAM,cAAA,GAAiB,aAAA;AACnD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,eAAA,CAAgB,GAAA,mBAAM,IAAI,IAAA,EAAK,EAAc;AAC3D,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,GAAA,CAAI,aAAY,EAAE;AACxD;AAEO,SAAS,gBAAgB,GAAA,EAAgC;AAC9D,EAAA,IAAI;AACF,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB,GAAA,EAAqC;AACxE,EAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,CAAM,UAAU,EAAE,IAAA,EAAK;AAErD,EAAA,IAAI,SAAS,uBAAA,EAAyB;AACpC,IAAA,MAAM,KAAA,GAAQ,YAAY,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,EAAE,IAAA,EAAK;AAC9D,IAAA,OAAO,SAAA,IAAa,KAAA,GAAQ,EAAE,IAAA,EAAM,eAAA,EAAiB,WAAW,KAAA,EAAM,GAAI,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9F;AAEA,EAAA,IAAI,SAAS,iBAAA,IAAqB,CAAC,WAAW,OAAO,EAAE,MAAM,SAAA,EAAU;AACvE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,SAAA;AAAA,IACA,QAAQ,mBAAA,CAAoB,QAAA,CAAS,KAAA,CAAM,OAAO,GAAG,SAAS;AAAA,GAChE;AACF;AAEA,SAAS,mBAAA,CAAoB,SAAqB,SAAA,EAAyC;AACzF,EAAA,MAAM,WAAgC,EAAC;AACvC,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,GAAI,OAAA,CAAQ,YAAY,EAAC;AAExE,EAAA,KAAA,MAAW,YAAY,OAAA,EAAS;AAC9B,IAAA,MAAM,KAAA,GAAQ,SAAS,QAAQ,CAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,KAAA,EAAO,SAAS,CAAA;AAChD,IAAA,IAAI,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,OAAA,CAAQ,MAAM,EAAE,IAAA,EAAK;AAChD,EAAA,MAAM,iBAAiB,MAAA,GACnB,aAAA;AAAA,IACE,SAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA;AAAA,IACvC;AAAA,GACF,GACA,MAAA;AAEJ,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,aAAA;AAAA,QACE,SAAA;AAAA,QACA,OAAA;AAAA,QACA,mFAAA;AAAA,QACA,SAAS,SAAS,CAAA,CAAA,EAAI,SAAS,YAAA,CAAa,OAAO,CAAC,CAAC,CAAA,CAAA;AAAA,QACrD;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,IAAA,EAAM,UAAA,GAAa,IAAA;AACzC,EAAA,IAAI,QAAQ,QAAA,KAAa,IAAA,IAAQ,OAAA,CAAQ,OAAA,KAAY,MAAM,UAAA,GAAa,KAAA;AACxE,EAAA,OAAO,EAAE,QAAA,EAAU,cAAA,EAAgB,UAAA,EAAW;AAChD;AAEA,SAAS,gBAAA,CAAiB,OAAmB,SAAA,EAA6C;AACxF,EAAA,MAAM,iBAAiB,KAAA,CAAM,UAAA;AAC7B,EAAA,MAAM,SAAA,GACJ,OAAO,cAAA,KAAmB,QAAA,GAAW,iBAAiB,WAAA,CAAY,QAAA,CAAS,cAAc,CAAA,CAAE,IAAI,CAAA;AAEjG,EAAA,IAAI,IAAA;AACJ,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,mBAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,IAAA,GAAO,WAAA;AACP,MAAA;AAAA,IACF,KAAK,cAAA;AACH,MAAA,IAAA,GAAO,MAAA;AACP,MAAA;AAAA,IACF,KAAK,gBAAA;AAAA,IACL,KAAK,aAAA;AACH,MAAA,IAAA,GAAO,QAAA;AACP,MAAA;AAAA,IACF,KAAK,OAAA;AAAA,IACL,KAAK,eAAA;AACH,MAAA,IAAA,GAAO,OAAA;AACP,MAAA;AAAA,IACF;AACE,MAAA,OAAO,IAAA;AAAA;AAGX,EAAA,MAAM,UAAU,IAAA,KAAS,OAAA,GAAU,mFAAA,GAAqB,WAAA,CAAY,MAAM,OAAO,CAAA;AACjF,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,CAAM,UAAU,CAAA;AAC9C,EAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,KAAA,CAAM,aAAa,CAAA;AAC1D,EAAA,MAAM,UAAA,GACJ,IAAA,KAAS,MAAA,GACL,SAAA,IAAa,kBAAA,IAAsB,WAAA,CAAY,KAAA,CAAM,EAAE,CAAA,GACvD,kBAAA,IAAsB,SAAA,IAAa,WAAA,CAAY,MAAM,EAAE,CAAA;AAG7D,EAAA,MAAM,WAAA,GAAc,aAAa,KAAK,CAAA;AACtC,EAAA,MAAM,KAAK,UAAA,IAAc,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,EAAI,QAAA,CAAS,WAAW,CAAC,CAAA,CAAA;AACvE,EAAA,OAAO,aAAA,CAAc,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,IAAI,KAAK,CAAA;AAC1D;AAEA,SAAS,aAAA,CACP,SAAA,EACA,IAAA,EACA,OAAA,EACA,IACA,MAAA,EACmB;AACnB,EAAA,MAAM,YACJ,WAAA,CAAY,MAAA,CAAO,SAAS,CAAA,IAC5B,YAAY,MAAA,CAAO,WAAW,CAAA,IAC9B,WAAA,CAAY,OAAO,UAAU,CAAA,IAAA,iBAC7B,IAAI,IAAA,IAAO,WAAA,EAAY;AACzB,EAAA,OAAO,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAS,SAAA,EAAU;AACnD;AAEA,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,EAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,EAAK;AACvB,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACxC,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,OAAO,IAAA,EAAK;AACnD,IAAA,MAAMA,OAAAA,GAAS,SAAS,MAAM,CAAA;AAC9B,IAAA,KAAA,MAAW,OAAO,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,SAAS,CAAA,EAAG;AAC1D,MAAA,MAAM,YAAY,WAAA,CAAYA,OAAAA,CAAO,GAAG,CAAC,EAAE,IAAA,EAAK;AAChD,MAAA,IAAI,WAAW,OAAO,SAAA;AAAA,IACxB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,CAAM,iCAAiC,CAAA;AAClE,EAAA,OAAA,CAAQ,YAAA,GAAe,CAAC,CAAA,IAAK,KAAA,EAAO,IAAA,EAAK;AAC3C;AAEA,SAAS,SAAS,KAAA,EAA4B;AAC5C,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACrE,KAAA,GACD,EAAC;AACP;AAEA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAC7C;AAEA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,IAAK,EAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEO,SAAS,SAAS,KAAA,EAAuB;AAC9C,EAAA,IAAI,IAAA,GAAO,UAAA;AACX,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAA,EAAG;AACpD,IAAA,IAAA,IAAQ,KAAA,CAAM,WAAW,KAAK,CAAA;AAC9B,IAAA,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAU,CAAA;AAAA,EACnC;AACA,EAAA,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA;AACjC;;;AC5MA,IAAM,iBAAA,GAAgD;AAAA,EACpD,cAAA,EAAgB,GAAA;AAAA,EAChB,cAAA,EAAgB,GAAA;AAAA,EAChB,MAAA,EAAQ,CAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AACA,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,6BAAA,GAAgC,GAAA;AACtC,IAAM,2BAAA,GAA8B,CAAA;AACpC,IAAM,4BAAA,GAA+B,mCAAA;AAc9B,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EACtC,IAAA;AAAA,EAET,WAAA,CAAY,MAA2B,OAAA,EAAiB;AACtD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAEO,IAAM,wBAAA,GAAN,cAAuC,KAAA,CAAM;AAAA,EACzC,IAAA;AAAA,EAET,YAAY,IAAA,EAAoC;AAC9C,IAAA,KAAA,CAAM,uCAAuC,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACnB,MAAA;AAAA,EACA,SAAA;AAAA,EAEQ,WAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,wBAAA;AAAA,EACA,wBAAA;AAAA,EACA,SAAA,uBAAgB,GAAA,EAA0D;AAAA,EAC1E,cAAA,uBAAqB,GAAA,EAAY;AAAA,EACjC,oBAAA,uBAA2B,GAAA,EAAoB;AAAA,EACxD,8BAAA,GAAiC,KAAA;AAAA,EAEjC,MAAA,GAA2B,IAAA;AAAA,EAC3B,cAAA,GAAuD,IAAA;AAAA,EACvD,cAAA,GAAwD,IAAA;AAAA,EACxD,iBAAA,GAAiE,IAAA;AAAA,EACjE,kBAAuC,EAAC;AAAA,EACxC,gBAAA;AAAA,EACA,YAAA,GAA0C,MAAA;AAAA,EAC1C,gBAAA,GAAmB,CAAA;AAAA,EACnB,gBAAA,GAAmB,CAAA;AAAA,EACnB,mBAAA,GAAsB,CAAA;AAAA,EACtB,eAAA,GAAkB,KAAA;AAAA,EAClB,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA,GAAU,KAAA;AAAA,EACV,UAAA,GAAa,KAAA;AAAA,EACb,oBAAA,GAAuB,CAAA;AAAA,EACvB,+BAAA,GAAkC,KAAA;AAAA,EAClC,2BAAA,GAAkE,IAAA;AAAA,EAClE,4BAAA,GAA+B,CAAA;AAAA,EAC/B,mBAAA,GAAkD,IAAA;AAAA,EAE1D,YAAY,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,WAAA,GAAc,mBAAA,CAAoB,OAAA,CAAQ,WAAW,CAAA;AAC1D,IAAA,IAAA,CAAK,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA;AACnD,IAAA,IAAA,CAAK,SAAA,GAAY,YAAA,CAAa,OAAA,CAAQ,SAAA,EAAW,WAAW,CAAA;AAC5D,IAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,MAAA,MAAM,IAAI,qBAAA,CAAsB,uBAAA,EAAyB,2CAAkB,CAAA;AAAA,IAC7E;AACA,IAAA,IAAI,OAAO,OAAA,CAAQ,SAAA,CAAU,6BAAA,KAAkC,UAAA,EAAY;AACzE,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,uBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,gBAAA,GAAmB,kBAAA,CAAmB,OAAA,CAAQ,SAAS,CAAA;AAC5D,IAAA,IAAA,CAAK,gBAAA,GAAmB,yBAAA,CAA0B,OAAA,CAAQ,SAAS,CAAA;AACnE,IAAA,IAAA,CAAK,qBAAqB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,sBAAsB,GAAK,CAAA;AACzE,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAQ,gBAAA,IAAoB,eAAA;AACpD,IAAA,IAAA,CAAK,2BACH,OAAA,CAAQ,wBAAA,KAA6B,MAAA,GACjC,qCAAA,KACA,OAAA,CAAQ,wBAAA;AACd,IAAA,IAAA,CAAK,2BAA2B,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,KAAK,SAAS,CAAA,CAAA;AAChE,IAAA,IAAA,CAAK,gBAAA,GACH,OAAA,CAAQ,gBAAA,KACP,CAAC,GAAA,KAAQ;AACR,MAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,QAAA,MAAM,IAAI,qBAAA,CAAsB,uBAAA,EAAyB,wEAAsB,CAAA;AAAA,MACjF;AACA,MAAA,OAAO,IAAI,UAAU,GAAG,CAAA;AAAA,IAC1B,CAAA,CAAA;AAAA,EACJ;AAAA,EAEA,IAAI,eAAA,GAA6C;AAC/C,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,IAAI,SAAA,GAA2B;AAC7B,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEA,IAAI,QAAA,GAAyC;AAC3C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA;AAAA,EACjC;AAAA,EAEA,IAAI,YAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,EAAA,CACE,MACA,QAAA,EACY;AACZ,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,IAAI,IAAI,CAAA,wBAAS,GAAA,EAAqB;AACvE,IAAA,MAAM,eAAA,GAAkB,QAAA;AACxB,IAAA,SAAA,CAAU,IAAI,eAAe,CAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,SAAS,CAAA;AAClC,IAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,eAAe,CAAA;AAAA,EAC/C;AAAA,EAEA,OAAA,GAAgD;AAC9C,IAAA,OAAO,KAAK,KAAA,EAAM;AAAA,EACpB;AAAA,EAEA,KAAA,GAA8C;AAC5C,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAI,IAAA,CAAK,iBAAA,EAAmB,OAAO,IAAA,CAAK,iBAAA;AAExC,IAAA,MAAM,YAAY,IAAA,CAAK,mBAAA;AACvB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AACzC,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAA;AACzB,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,IAAI,IAAA,CAAK,iBAAA,KAAsB,OAAA,EAAS,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IACnE,CAAA;AACA,IAAA,KAAK,OAAA,CAAQ,IAAA,CAAK,YAAA,EAAc,YAAY,CAAA;AAC5C,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,SAAA,EAAyD;AACzE,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,SAAA,EAAW,WAAW,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,EAAE,IAAA,CAAK,mBAAA;AACzB,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,qBAAqB,KAAA,EAAM;AAChC,IAAA,IAAA,CAAK,8BAAA,GAAiC,KAAA;AACtC,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,IAAA,MAAM,KAAK,8BAAA,EAA+B;AAC1C,IAAA,IAAA,CAAK,+BAAA,GAAkC,KAAA;AACvC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,MAAM,IAAA,CAAK,eAAe,SAAS,CAAA;AACnC,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACvC,MAAA,MAAM,IAAI,qBAAA,CAAsB,qBAAA,EAAuB,gFAAe,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,KAAK,kBAAA,CAAmB,SAAS,CAAA,EAAG,IAAA,CAAK,WAAW,KAAK,CAAA;AAC7D,IAAA,OAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,KAAK,QAAA,EAAS;AAAA,EACtD;AAAA,EAEA,MAAM,oBAAA,GAA6D;AACjE,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,mBAAA,IAAuB,CAAA;AAC5B,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,qBAAqB,KAAA,EAAM;AAChC,IAAA,IAAA,CAAK,8BAAA,GAAiC,KAAA;AACtC,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,IAAA,MAAM,KAAK,8BAAA,EAA+B;AAC1C,IAAA,IAAA,CAAK,+BAAA,GAAkC,KAAA;AACvC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,IAAA,OAAO,EAAE,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,EAAC,EAAE;AAAA,EACzC;AAAA,EAEA,MAAM,eAAA,GAAyD;AAC7D,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,MAAM,IAAI,qBAAA,CAAsB,qBAAA,EAAuB,oEAAa,CAAA;AAAA,IACtE;AACA,IAAA,MAAM,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,mBAAmB,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,MAAM,WAAA,CACJ,OAAA,EACA,OAAA,GAAyC,EAAC,EACd;AAC5B,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,iBAAA,GAAoB,QAAQ,IAAA,EAAK;AACvC,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,MAAM,IAAI,qBAAA,CAAsB,eAAA,EAAiB,wDAAW,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAI,qBAAA,CAAsB,kBAAA,EAAoB,oEAAa,CAAA;AAAA,IACnE;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,YAAY,IAAA,CAAK,gBAAA;AACvB,MAAA,OAAO,SAAA,GACH,MAAM,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,iBAAiB,CAAA,GACpD,MAAM,IAAA,CAAK,gBAAA,CAAiB,iBAAA,EAAmB,OAAO,CAAA;AAAA,IAC5D,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,uBAAuB,MAAM,KAAA;AAClD,MAAA,IAAI,kBAAA,CAAmB,KAAK,CAAA,KAAM,sBAAA,EAAwB;AACxD,QAAA,MAAMC,UAAS,IAAA,CAAK,SAAA;AAAA,UAClB,wBAAA;AAAA,UACA,0HAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,IAAI,qBAAA,CAAsBA,OAAAA,CAAO,IAAA,EAAMA,QAAO,OAAO,CAAA;AAAA,MAC7D;AACA,MAAA,IAAI,kBAAA,CAAmB,KAAK,CAAA,KAAM,mBAAA,EAAqB;AACrD,QAAA,MAAMA,OAAAA,GAAS,IAAA,CAAK,SAAA,CAAU,cAAA,EAAgB,kFAAiB,KAAK,CAAA;AACpE,QAAA,MAAM,IAAI,qBAAA,CAAsBA,OAAAA,CAAO,IAAA,EAAMA,QAAO,OAAO,CAAA;AAAA,MAC7D;AACA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,aAAA,EAAe,kFAAiB,IAAI,CAAA;AAClE,MAAA,MAAM,IAAI,qBAAA,CAAsB,MAAA,CAAO,IAAA,EAAM,OAAO,OAAO,CAAA;AAAA,IAC7D,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAA,CAAK,mBAAA,IAAuB,CAAA;AAC5B,IAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,EAC1B;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAA,CAAK,mBAAA,IAAuB,CAAA;AAC5B,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,qBAAqB,KAAA,EAAM;AAChC,IAAA,IAAA,CAAK,8BAAA,GAAiC,KAAA;AACtC,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAAA,EAC7B;AAAA,EAEA,MAAc,YAAA,CAAa,SAAA,EAAmB,OAAA,EAA6C;AACzF,IAAA,IAAA,CAAK,8BAAA,GAAiC,KAAA;AACtC,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,SAAA,EAAW,OAAO,CAAA;AACnD,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,OAAA,GAA6B;AAAA,MACjC,EAAA,EAAI,SAAS,GAAA,CAAI,OAAA,EAAS,CAAA,CAAA,EAAI,EAAE,KAAK,oBAAoB,CAAA,CAAA;AAAA,MACzD,SAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,OAAA;AAAA,MACA,SAAA,EAAW,IAAI,WAAA;AAAY,KAC7B;AACA,IAAA,IAAA,CAAK,4BAA4B,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,aAAA,CAAc,SAAS,OAAO,CAAA;AACnC,IAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AACvB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,gBAAA,CACZ,OAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,IAAA,CAAK,8BAAA,GAAiC,KAAA;AACtC,IAAA,MAAM,6BAAA,GAAgC,KAAK,SAAA,CAAU,6BAAA;AACrD,IAAA,MAAM,YAAY,IAAA,CAAK,mBAAA;AACvB,IAAA,MAAM,iBAAA,GAAoB,6BAA6B,OAAO,CAAA;AAC9D,IAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,OAAA,EAAS,iBAAiB,CAAA;AACtE,IAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,IAAuB,IAAA,CAAK,mBAAA,CAAoB,gBAAgB,WAAA,EAAa;AACrF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,6BAAA,EAA8B;AACxD,MAAA,IAAA,CAAK,mBAAA,GACH,MAAA,EAAQ,WAAA,KAAgB,WAAA,GACpB,MAAA,GACA,EAAE,WAAA,EAAa,SAAA,EAAW,iBAAA,CAAkB,IAAA,CAAK,gBAAA,EAAkB,CAAA,EAAE;AAC3E,MAAA,MAAM,IAAA,CAAK,6BAAA,CAA8B,IAAA,CAAK,mBAAmB,CAAA;AAAA,IACnE;AACA,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA,IAAK,KAAK,gBAAA,EAAkB;AAChE,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,MAAA,MAAM,KAAK,8BAAA,EAA+B;AAC1C,MAAA,MAAM,IAAI,qBAAA,CAAsB,qBAAA,EAAuB,4FAAiB,CAAA;AAAA,IAC1E;AACA,IAAA,MAAM,OAAA,GAAyC;AAAA,MAC7C,SAAA,EAAW,KAAK,mBAAA,CAAoB,SAAA;AAAA,MACpC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,OAAA;AAAA,MACA,aAAa,iBAAA,CAAkB,WAAA;AAAA,MAC/B,gBAAgB,iBAAA,CAAkB;AAAA,KACpC;AACA,IAAA,MAAM,YAAY,MAAM,6BAAA,CAA8B,IAAA,CAAK,IAAA,CAAK,WAAW,OAAO,CAAA;AAClF,IAAA,MAAM,SAAS,2BAAA,CAA4B,SAAA,EAAW,IAAA,CAAK,MAAA,EAAQ,KAAK,SAAS,CAAA;AACjF,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA,IAAK,KAAK,gBAAA,EAAkB;AAChE,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,MAAA,MAAM,KAAK,8BAAA,EAA+B;AAC1C,MAAA,MAAM,IAAI,qBAAA,CAAsB,qBAAA,EAAuB,4FAAiB,CAAA;AAAA,IAC1E;AAEA,IAAA,IAAA,CAAK,mBAAmB,MAAA,CAAO,SAAA;AAC/B,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,IAAA,MAAM,KAAK,8BAAA,EAA+B;AAC1C,IAAA,MAAM,OAAA,GAA6B;AAAA,MACjC,IAAI,MAAA,CAAO,SAAA;AAAA,MACX,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,IAAA,EAAM,MAAA;AAAA,MACN,OAAA;AAAA,MACA,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO;AAAA,KACxC;AAGA,IAAA,IAAA,CAAK,4BAA4B,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,aAAA,CAAc,SAAS,OAAO,CAAA;AACnC,IAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AACvB,IAAA,IAAA,CAAK,+BAAA,GAAkC,IAAA;AACvC,IAAA,IAAA,CAAK,wBAAwB,IAAI,CAAA;AACjC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,WAAW,SAAA,EAAyD;AAChF,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,MAAA,OAAO,EAAE,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,EAAC,EAAE;AAAA,IACzC;AAEA,IAAA,MAAM,IAAA,CAAK,eAAe,SAAS,CAAA;AACnC,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACvC,MAAA,MAAM,IAAI,qBAAA,CAAsB,qBAAA,EAAuB,sFAAgB,CAAA;AAAA,IACzE;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,IAAA,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,gBAAA,EAAkB,QAAA,EAAU,KAAK,QAAA,EAAS;AAAA,EACrE;AAAA,EAEA,MAAc,6BAAA,GAAqE;AACjF,IAAA,IAAI,CAAC,IAAA,CAAK,wBAAA,EAA0B,OAAO,IAAA;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,KAAK,wBAAwB,CAAA;AACpF,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,CAAM,WAAA,KAAgB,UAAU,OAAO,IAAA;AAC5D,MAAA,OAAO;AAAA,QACL,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,SAAA,EAAW,iBAAA,CAAkB,KAAA,CAAM,SAAS;AAAA,OAC9C;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,8BAA8B,KAAA,EAA2C;AACrF,IAAA,IAAI,CAAC,KAAK,wBAAA,EAA0B;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,IAAA,CAAK,0BAA0B,KAAK,CAAA;AAAA,IAC/E,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAc,8BAAA,GAAgD;AAC5D,IAAA,IAAI,CAAC,KAAK,wBAAA,EAA0B;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,wBAAA,CAAyB,KAAA,CAAM,IAAA,CAAK,wBAAwB,CAAA;AAAA,IACzE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,SAAA,EAAqC;AAChE,IAAA,MAAM,YAAY,IAAA,CAAK,gBAAA;AACvB,IAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,aAAa,SAAS,CAAA;AAC3D,MAAA,IAAI,CAAC,KAAK,kBAAA,CAAmB,SAAS,KAAK,IAAA,CAAK,gBAAA,KAAqB,WAAW,OAAO,KAAA;AACvF,MAAA,IAAA,CAAK,cAAA,CAAe,SAAS,SAAS,CAAA;AACtC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACtC,QAAA,IAAA,CAAK,SAAA,CAAU,qBAAA,EAAuB,8GAAA,EAAsB,IAAI,CAAA;AAAA,MAClE;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,cAAA,CAAe,SAAuC,SAAA,EAAyB;AACrF,IAAA,MAAM,MAAA,uBAAa,GAAA,EAA+B;AAClD,IAAA,KAAA,MAAW,aAAa,OAAA,EAAS;AAC/B,MAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,SAAA,EAAW,SAAS,CAAA;AAC/D,MAAA,IAAI,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,IAAI,UAAU,CAAA;AAAA,IACtD;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA;AAC1C,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,eAAA,EAAiB,IAAA,CAAK,iBAAA,CAAkB,QAAQ,EAAE,CAAA;AAC7E,IAAA,IAAA,CAAK,KAAK,SAAA,EAAW,EAAE,WAAW,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAAA,EAC7D;AAAA,EAEQ,WAAW,WAAA,EAA4B;AAC7C,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,eAAA,EAAiB;AAC7C,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA,GAAc,cAAA,GAAiB,YAAY,CAAA;AAEzD,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,WAAW,CAAA;AAAA,IACjD,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,SAAA,CAAU,uBAAA,EAAyB,wDAAA,EAAa,IAAI,CAAA;AACzD,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,EAAE,IAAA,CAAK,gBAAA;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,2BAAA,GAA8B,IAAA;AACnC,IAAA,MAAA,CAAO,SAAS,MAAM,KAAK,IAAA,CAAK,kBAAA,CAAmB,QAAQ,UAAU,CAAA;AACrE,IAAA,MAAA,CAAO,SAAA,GAAY,CAAC,KAAA,KAAU,KAAK,KAAK,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,MAAA,EAAQ,UAAU,CAAA;AACvF,IAAA,MAAA,CAAO,UAAU,MAAM;AACrB,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC/C,MAAA,IAAA,CAAK,SAAA,CAAU,iBAAA,EAAmB,wDAAA,EAAa,IAAI,CAAA;AAAA,IACrD,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,CAAC,KAAA,KAAU,IAAA,CAAK,kBAAkB,MAAA,EAAQ,UAAA,EAAY,MAAM,IAAI,CAAA;AAAA,EACnF;AAAA,EAEA,MAAc,kBAAA,CAAmB,MAAA,EAAmB,UAAA,EAAmC;AACrF,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC/C,IAAA,IAAA,CAAK,SAAS,gBAAgB,CAAA;AAC9B,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,IAAI;AACF,MAAA,WAAA,GAAA,CAAe,MAAM,IAAA,CAAK,SAAA,CAAU,cAAA,IAAkB,IAAA,EAAK;AAAA,IAC7D,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,EAAqB,oEAAA,EAAe,IAAI,CAAA;AACvD,MAAA,MAAA,CAAO,KAAA,EAAM;AACb,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAU,uBAAA,CAAwB,WAAW,CAAC,CAAC,CAAA;AAChE,IAAA,WAAA,GAAc,EAAA;AAAA,EAChB;AAAA,EAEA,MAAc,gBAAA,CACZ,IAAA,EACA,MAAA,EACA,UAAA,EACe;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC/C,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,GAAA,GAAM,IAAA;AAAA,SAAA,IAC3B,IAAA,YAAgB,IAAA,EAAM,GAAA,GAAM,MAAM,KAAK,IAAA,EAAK;AAAA,SAAA,IAC5C,gBAAgB,WAAA,EAAa,GAAA,GAAM,IAAI,WAAA,EAAY,CAAE,OAAO,IAAI,CAAA;AAAA,SACpE;AACH,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,EAAkB,0EAAA,EAAgB,IAAI,CAAA;AACrD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC/C,IAAA,MAAM,OAAA,GAAU,gBAAgB,GAAG,CAAA;AACnC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,EAAkB,0EAAA,EAAgB,IAAI,CAAA;AACrD,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,EACtD;AAAA,EAEQ,mBAAA,CAAoB,OAAA,EAAqB,MAAA,EAAmB,UAAA,EAA0B;AAC5F,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAC9B,IAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AACxC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA;AAC7C,MAAA,IAAI,SAAA,CAAU,cAAc,IAAA,EAAM;AAChC,QAAA,IAAA,CAAK,SAAA,CAAU,qBAAA,EAAuB,0EAAA,EAAgB,KAAK,CAAA;AAC3D,QAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,QAAA,MAAA,CAAO,KAAA,EAAM;AACb,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,MAAA,IAAA,CAAK,4BAAA,GAA+B,CAAA;AACpC,MAAA,IAAA,CAAK,eAAe,WAAA,CAAY,OAAA,CAAQ,0BAA0B,CAAA,EAAG,QAAQ,UAAU,CAAA;AACvF,MAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,QAAA,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,+BAAA,EAAiC,IAAI,CAAA;AAAA,MACzE,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AAAA,MAC3B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,gBAAA,IAAoB,OAAA,CAAQ,OAAA,KAAY,aAAA,EAAe;AAClE,MAAA,IAAA,CAAK,qBAAA,CAAsB,QAAQ,KAAK,CAAA;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,eAAA,IAAmB,OAAA,CAAQ,OAAA,KAAY,aAAA,EAAe;AACjE,MAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,sBAAA,EAAwB;AACnC,MAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA;AACxD,MAAA,IAAA,CAAK,2BAAA,GAA8B,EAAE,UAAA,EAAY,SAAA,EAAW,QAAQ,SAAA,EAAU;AAC9E,MAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,IAAA,EAAM,QAAQ,OAAA,EAAS,OAAA,CAAQ,cAAc,OAAO,CAAA;AAC3E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,EAAkB,wDAAA,EAAa,KAAK,CAAA;AAAA,IACrD;AAAA,EACF;AAAA,EAEQ,sBAAsB,QAAA,EAAyB;AACrD,IAAA,MAAM,KAAA,GAAQ,qBAAqB,QAAQ,CAAA;AAC3C,IAAA,IAAI,MAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,SAAA,KAAc,KAAK,gBAAA,EAAkB;AAC3E,IAAA,IAAI,KAAA,CAAM,SAAS,eAAA,EAAiB;AAClC,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,SAAA,EAAW,MAAM,SAAA,EAAW,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA;AACrE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,UAAA,KAAe,IAAA,OAAW,8BAAA,GAAiC,KAAA;AAC5E,IAAA,IAAI,KAAA,CAAM,OAAO,UAAA,KAAe,MAAA,OAAgB,aAAA,CAAc,KAAA,CAAM,OAAO,UAAU,CAAA;AACrF,IAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC3C,MAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAQ,IAAA,CAAK,8BAAA,GAAiC,KAAA;AACnE,MAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,0BAAA,CAA2B,OAAO,CAAA,EAAG;AACzE,MAAA,IAAA,CAAK,aAAA,CAAc,SAAS,UAAU,CAAA;AACtC,MAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,WAAA,EAAa,IAAA,CAAK,8BAAA,GAAiC,IAAA;AAAA,IAC1E;AACA,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,cAAA,IAAkB,CAAC,KAAK,8BAAA,EAAgC;AACvE,MAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,MAAA,CAAO,cAAA,EAAgB,UAAU,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEQ,uBAAA,CAAwB,aAAA,EAAwB,YAAA,GAAe,KAAA,EAAa;AAClF,IAAA,MAAM,YAAY,IAAA,CAAK,gBAAA;AACvB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IACE,CAAC,SAAA,IACD,CAAC,MAAA,IACD,MAAA,CAAO,eAAe,CAAA,IACrB,CAAC,YAAA,IAAgB,IAAA,CAAK,YAAA,KAAiB,WAAA;AAExC,MAAA;AACF,IAAA,IAAA,CAAK,SAAS,aAAa,CAAA;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAK,KAAK,SAAA,CAAU,uBAAA,CAAwB,WAAW,WAAA,EAAa,aAAa,CAAC,CAAC,CAAA;AAC1F,IAAA,IAAA,CAAK,+BAAA,GAAkC,KAAA;AACvC,IAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,EAAE,SAAA,EAAW,CAAA;AAAA,EAClC;AAAA,EAEQ,4BAA4B,OAAA,EAAuB;AACzD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,KAAA,MAAW,CAAC,cAAA,EAAgB,MAAM,CAAA,IAAK,KAAK,oBAAA,EAAsB;AAChE,MAAA,IAAI,GAAA,GAAM,SAAS,6BAAA,EAA+B;AAChD,QAAA,IAAA,CAAK,oBAAA,CAAqB,OAAO,cAAc,CAAA;AAAA,MACjD;AAAA,IACF;AACA,IAAA,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,2BAA2B,OAAA,EAAqC;AACtE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,QAAQ,OAAO,CAAA;AAC5D,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,KAAA;AACjC,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,IAAU,+BAA+B,OAAO,IAAA;AACjE,IAAA,IAAA,CAAK,oBAAA,CAAqB,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAChD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,aAAA,CAAc,SAA4B,MAAA,EAAoC;AACpF,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA,EAAG;AACzC,IAAA,IAAA,CAAK,iBAAA,CAAkB,QAAQ,EAAE,CAAA;AACjC,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAG,IAAA,CAAK,iBAAiB,OAAO,CAAA;AACxD,IAAA,IAAA,CAAK,IAAA,CAAK,WAAW,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAW,OAAA,EAAS,QAAQ,CAAA;AAAA,EACxE;AAAA,EAEQ,kBAAkB,EAAA,EAAkB;AAC1C,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,EAAE,CAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,IAAA,IAAQ,oBAAA,EAAsB;AACtD,IAAA,MAAM,SAAS,IAAA,CAAK,cAAA,CAAe,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AACnD,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,OAAO,MAAM,CAAA;AAAA,EACnE;AAAA,EAEQ,mBAAmB,IAAA,EAAoB;AAC7C,IAAA,IAAI,SAAS,mBAAA,EAAqB;AAChC,MAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,EAAqB,4FAAA,EAAmB,KAAK,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,CAAU,qBAAA,EAAuB,gFAAA,EAAiB,IAAI,CAAA;AAAA,IAC7D;AACA,IAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,EAC1B;AAAA,EAEQ,cAAA,CAAe,eAAA,EAAyB,MAAA,EAAmB,UAAA,EAA0B;AAC3F,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,MAAM,WAAA,GACJ,OAAO,QAAA,CAAS,eAAe,KAAK,eAAA,GAAkB,CAAA,GAAI,kBAAkB,GAAA,GAAQ,IAAA;AACtF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,oBAAoB,WAAW,CAAA;AAChE,IAAA,IAAA,CAAK,cAAA,GAAiB,YAAY,MAAM;AACtC,MAAA,IAAI,CAAC,KAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,IAAK,MAAA,CAAO,eAAe,CAAA,EAAG;AAC1E,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,eAAA,EAAiB,CAAC,CAAA;AAAA,IAC/C,GAAG,UAAU,CAAA;AAAA,EACf;AAAA,EAEQ,iBAAA,CAAkB,MAAA,EAAmB,UAAA,EAAoB,IAAA,EAAoB;AACnF,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC/C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,MAAMC,yBACJ,IAAA,CAAK,2BAAA,EAA6B,UAAA,KAAe,UAAA,GAC7C,KAAK,2BAAA,GACL,IAAA;AACN,IAAA,IAAA,CAAK,2BAAA,GAA8B,IAAA;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,SAAA,EAAW;AAC3C,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAS,cAAc,CAAA;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,IAAIA,sBAAAA,EAAuB,cAAc,OAAA,EAAS;AAChD,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,IAAA,EAAM;AAClC,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAI,CAACA,sBAAAA,EAAuB;AAC1B,QAAA,MAAM,SAAA,GAAY,IAAA,KAAS,IAAA,GAAO,uBAAA,GAA0B,gBAAA;AAC5D,QAAA,MAAM,OAAA,GAAU,IAAA,KAAS,IAAA,GAAO,gFAAA,GAAkB,oEAAA;AAClD,QAAA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,OAAA,EAAS,KAAK,CAAA;AAAA,MAC1C;AACA,MAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,IAAIA,sBAAAA,EAAuB,SAAA,KAAc,cAAA,IAAkB,IAAA,KAAS,IAAA,EAAM;AACxE,MAAA,IAAI,CAACA,sBAAAA,EAAuB;AAC1B,QAAA,IAAA,CAAK,SAAA,CAAU,sBAAA,EAAwB,kGAAA,EAAoB,IAAI,CAAA;AAAA,MACjE;AACA,MAAA,IAAA,CAAK,6BAAA,EAA8B;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAI,CAACA,sBAAAA,EAAuB;AAC1B,QAAA,IAAA,CAAK,SAAA,CAAU,uBAAA,EAAyB,4FAAA,EAAmB,IAAI,CAAA;AAAA,MACjE;AAAA,IACF;AACA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEQ,6BAAA,GAAsC;AAC5C,IAAA,IAAI,IAAA,CAAK,gCAAgC,2BAAA,EAA6B;AACpE,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAA,CAAK,SAAA,CAAU,sBAAA,EAAwB,8GAAA,EAAsB,KAAK,CAAA;AAClE,MAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,4BAAA,IAAgC,CAAA;AACrC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,KAAK,SAAA,IAAa,CAAC,IAAA,CAAK,eAAA,IAAmB,KAAK,cAAA,EAAgB;AACpE,IAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,MACrB,KAAK,gBAAA,CAAiB,cAAA,GAAiB,IAAA,CAAK,gBAAA,CAAiB,UAAU,IAAA,CAAK,gBAAA;AAAA,MAC5E,KAAK,gBAAA,CAAiB;AAAA,KACxB;AACA,IAAA,MAAM,WAAA,GAAc,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,MAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,cAAc,IAAA,CAAK,MAAA,EAAO,GAAI,WAAA,GAAc,CAAC,CAAA;AACnF,IAAA,IAAA,CAAK,gBAAA,IAAoB,CAAA;AACzB,IAAA,MAAM,YAAY,IAAA,CAAK,mBAAA;AACvB,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,KAAK,IAAA,CAAK,oBAAoB,SAAS,CAAA;AAAA,IACzC,GAAG,KAAK,CAAA;AAAA,EACV;AAAA,EAEA,MAAc,oBAAoB,SAAA,EAAkC;AAClE,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA,IAAK,CAAC,KAAK,eAAA,EAAiB;AAClE,IAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA,IAAK,CAAC,KAAK,eAAA,EAAiB;AAClE,IAAA,IAAA,CAAK,kCAAkC,CAAC,gBAAA;AACxC,IAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EACtB;AAAA,EAEQ,eAAe,oBAAA,EAAqC;AAC1D,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,2BAAA,GAA8B,IAAA;AACnC,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AACxB,IAAA,IAAI,oBAAA,EAAsB,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA;AAAA,EACxD;AAAA,EAEQ,kBAAA,GAA2B;AACjC,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,gBAAA,IAAoB,CAAA;AACzB,IAAA,IAAA,CAAK,2BAAA,GAA8B,IAAA;AACnC,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,UAAA,GAAa,CAAA,SAAU,KAAA,EAAM;AAAA,EACpD;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,YAAA,CAAa,IAAA,CAAK,cAAc,CAAA;AACzD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,aAAA,CAAc,IAAA,CAAK,cAAc,CAAA;AAC1D,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AAAA,EAEQ,SAAS,IAAA,EAAuC;AACtD,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,EAAM;AAChC,IAAA,MAAM,WAAW,IAAA,CAAK,YAAA;AACtB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,KAAK,yBAAA,EAA2B,EAAE,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAA,EAClE;AAAA,EAEQ,cAAc,UAAA,EAA2B;AAC/C,IAAA,IAAI,IAAA,CAAK,eAAe,UAAA,EAAY;AACpC,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,IAAA,CAAK,yBAAA,EAA2B,EAAE,UAAA,EAAY,CAAA;AAAA,EACrD;AAAA,EAEQ,SAAA,CACN,IAAA,EACA,OAAA,EACA,WAAA,EAC6B;AAC7B,IAAA,MAAM,MAAA,GAAS,EAAE,IAAA,EAAM,OAAA,EAAS,WAAA,EAAY;AAC5C,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,MAAM,CAAA;AACzB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,IAAA,CACN,MACA,MAAA,EACM;AACN,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,IAAK,EAAC,EAAG,QAAA,CAAS,MAAM,CAAA;AAAA,EACxE;AAAA,EAEQ,eAAA,CAAgB,QAAmB,UAAA,EAA6B;AACtE,IAAA,OAAO,CAAC,IAAA,CAAK,SAAA,IAAa,KAAK,MAAA,KAAW,MAAA,IAAU,KAAK,gBAAA,KAAqB,UAAA;AAAA,EAChF;AAAA,EAEQ,mBAAmB,UAAA,EAA6B;AACtD,IAAA,OAAO,CAAC,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,mBAAA,KAAwB,UAAA;AAAA,EACzD;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAI,qBAAA,CAAsB,kBAAA,EAAoB,4CAAS,CAAA;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,MAAA,EAAwB;AACnD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAI,IAAI,MAAM,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,qBAAA,CAAsB,uBAAA,EAAyB,wDAAqB,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,CAAC,CAAC,KAAA,EAAO,MAAM,EAAE,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3C,IAAA,MAAM,IAAI,qBAAA,CAAsB,uBAAA,EAAyB,sDAA6B,CAAA;AAAA,EACxF;AACA,EAAA,IAAI,IAAI,MAAA,IAAU,GAAA,CAAI,QAAQ,GAAA,CAAI,QAAA,IAAY,IAAI,QAAA,EAAU;AAC1D,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,uBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,IAAI,QAAA,EAAS;AACtB;AAEA,SAAS,YAAA,CAAa,OAAe,KAAA,EAAuB;AAC1D,EAAA,MAAM,aAAa,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AAC9D,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,qBAAA,CAAsB,uBAAA,EAAyB,CAAA,EAAG,KAAK,CAAA,+BAAA,CAAQ,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,mBAAmB,KAAA,EAA0C;AACpE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,GAAI,KAAA,CAAM,MAAK,GAAI,IAAA;AACpE;AAEA,SAAS,6BAA6B,OAAA,EAGpC;AACA,EAAA,MAAM,eAAe,OAAA,CAAQ,WAAA,IAAe,EAAC,EAAG,GAAA,CAAI,CAAC,UAAA,KAAe;AAClE,IAAA,MAAM,aAAA,GACJ,OAAO,UAAA,CAAW,aAAA,KAAkB,WAAW,UAAA,CAAW,aAAA,CAAc,MAAK,GAAI,EAAA;AACnF,IAAA,MAAM,MAAA,GAAS,OAAO,UAAA,CAAW,MAAA,KAAW,WAAW,UAAA,CAAW,MAAA,CAAO,MAAK,GAAI,EAAA;AAClF,IAAA,IACE,CAAC,iBACD,CAAC,MAAA,CAAO,WAAW,KAAK,CAAA,IACxB,OAAO,QAAA,CAAS,IAAI,KACpB,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,KAAY,IAAI,CAAA,EACpD;AACA,MAAA,MAAM,IAAI,qBAAA,CAAsB,aAAA,EAAe,oEAAa,CAAA;AAAA,IAC9D;AACA,IAAA,OAAO,EAAE,eAAe,MAAA,EAAO;AAAA,EACjC,CAAC,CAAA;AACD,EAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,IAAA;AACjD,EAAA,IACE,cAAA,KAAmB,SAClB,OAAO,cAAA,KAAmB,YAAY,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,CAAA,EACnE;AACA,IAAA,MAAM,IAAI,qBAAA,CAAsB,aAAA,EAAe,8DAAY,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,EAAE,aAAa,cAAA,EAAe;AACvC;AAEA,SAAS,uBAAA,CACP,SACA,OAAA,EACQ;AACR,EAAA,MAAM,aAAa,wBAAA,CAAyB;AAAA,IAC1C,OAAA;AAAA,IACA,OAAA,CAAQ,WAAA;AAAA,IACR,OAAA,CAAQ;AAAA,GACT,CAAA;AACD,EAAA,OAAO,CAAA,GAAA,EAAM,QAAA,CAAS,UAAU,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,CAAA,cAAA,EAAiB,UAAU,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,MAAM,CAAA,CAAA;AACnG;AAEA,SAAS,yBAAyB,KAAA,EAAwB;AACxD,EAAA,MAAM,IAAA,uBAAW,OAAA,EAAgB;AACjC,EAAA,MAAM,SAAA,GAAY,CAAC,SAAA,KAAgC;AACjD,IAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,OAAO,SAAA,KAAc,UAAU,OAAO,SAAA;AAChE,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,qBAAA,CAAsB,aAAA,EAAe,8DAAY,CAAA;AAAA,IAC7D;AACA,IAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAClB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAMC,UAAS,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS,SAAA,CAAU,IAAI,CAAC,CAAA;AACtD,MAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AACrB,MAAA,OAAOA,OAAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAS,SAAA;AACf,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,EAAK,EAAG,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA,CAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AACjF,IAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AACrB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,KAAK,CAAC,CAAA;AACxC;AAEA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,MAAM,YAAY,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AAC7D,EAAA,IACE,CAAC,4EAAA,CAA6E,IAAA,CAAK,SAAS,CAAA,EAC5F;AACA,IAAA,MAAM,IAAI,qBAAA,CAAsB,uBAAA,EAAyB,sDAA6B,CAAA;AAAA,EACxF;AACA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,eAAA,GAA0B;AACjC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,eAAe,UAAA,EAAY;AAC5E,IAAA,OAAO,OAAO,UAAA,EAAW;AAAA,EAC3B;AACA,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,oBAAoB,UAAA,EAAY;AACjF,IAAA,MAAM,IAAI,qBAAA,CAAsB,uBAAA,EAAyB,+EAAwB,CAAA;AAAA,EACnF;AACA,EAAA,MAAM,QAAQ,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AACvD,EAAA,KAAA,CAAM,CAAC,CAAA,GAAA,CAAM,KAAA,CAAM,CAAC,CAAA,IAAK,KAAK,EAAA,GAAQ,EAAA;AACtC,EAAA,KAAA,CAAM,CAAC,CAAA,GAAA,CAAM,KAAA,CAAM,CAAC,CAAA,IAAK,KAAK,EAAA,GAAQ,GAAA;AACtC,EAAA,MAAM,QAAQ,CAAC,GAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAClF,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AACpH;AAEA,SAAS,2BAAA,CACP,KAAA,EACA,cAAA,EACA,iBAAA,EAC8B;AAC9B,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,MAAM,IAAI,qBAAA,CAAsB,aAAA,EAAe,oEAAa,CAAA;AAAA,EAC9D;AACA,EAAA,MAAM,SAAA,GAAY,8BAAA,CAA+B,KAAA,CAAM,SAAS,CAAA;AAChE,EAAA,MAAM,SAAA,GAAY,8BAAA,CAA+B,KAAA,CAAM,SAAS,CAAA;AAChE,EAAA,MAAM,WAAA,GAAc,8BAAA,CAA+B,KAAA,CAAM,WAAW,CAAA;AACpE,EAAA,MAAM,MAAA,GAAS,8BAAA,CAA+B,KAAA,CAAM,MAAM,CAAA;AAC1D,EAAA,MAAM,SAAA,GAAY,8BAAA,CAA+B,KAAA,CAAM,SAAS,CAAA;AAChE,EAAA,MAAM,gBAAA,GAAmB,8BAAA,CAA+B,KAAA,CAAM,gBAAgB,CAAA;AAC9E,EAAA,IAAI,MAAA,KAAW,cAAA,IAAkB,SAAA,KAAc,iBAAA,EAAmB;AAChE,IAAA,MAAM,IAAI,qBAAA,CAAsB,aAAA,EAAe,oHAAqB,CAAA;AAAA,EACtE;AACA,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,SAAA,IAAa,KAAA,CAAM,WAAW,QAAA,EAAU;AAC3D,IAAA,MAAM,IAAI,qBAAA,CAAsB,aAAA,EAAe,oEAAa,CAAA;AAAA,EAC9D;AACA,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,KAAA,CAAM,SAAA,EAAW,qBAAqB,CAAA;AACxE,EAAA,MAAM,MAAA,GAAuC;AAAA,IAC3C,SAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,SAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK,EAAG,MAAA,CAAO,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK;AAC3F,EAAA,IAAI,MAAM,SAAA,EAAW,MAAA,CAAO,YAAY,eAAA,CAAgB,KAAA,CAAM,WAAW,qBAAqB,CAAA;AAC9F,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CAAgB,OAAe,KAAA,EAAuB;AAC7D,EAAA,MAAM,UAAA,GAAa,+BAA+B,KAAK,CAAA;AACvD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,KAAA,CAAM,UAAU,CAAC,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,qBAAA,CAAsB,aAAA,EAAe,CAAA,EAAG,KAAK,CAAA,2CAAA,CAAU,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,+BAA+B,KAAA,EAAwB;AAC9D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,MAAK,EAAG;AAC9C,IAAA,MAAM,IAAI,qBAAA,CAAsB,aAAA,EAAe,oEAAa,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,MAAM,IAAA,EAAK;AACpB;AAEA,SAAS,sBAAsB,IAAA,EAI7B;AACA,EAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,uBAAA;AAAA,MACN,OAAA,EAAS,4FAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,IAAI,SAAS,+BAAA,EAAiC;AAC5C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,+BAAA;AAAA,MACN,OAAA,EAAS,uFAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,oEAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,IAAI,6BAAA,CAA8B,IAAI,CAAA,EAAG;AACvC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,sBAAA;AAAA,MACN,OAAA,EAAS,kGAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,IAAI,IAAA,KAAS,2BAAA,IAA+B,IAAA,KAAS,2BAAA,EAA6B;AAChF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,qBAAA;AAAA,MACN,OAAA,EAAS,oEAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,uBAAA;AAAA,MACN,OAAA,EAAS,gFAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,uBAAA;AAAA,IACN,OAAA,EAAS,wDAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AACF;AAEA,SAAS,mBAAmB,KAAA,EAAqD;AAC/E,EAAA,IAAI,KAAA,YAAiB,wBAAA,EAA0B,OAAO,KAAA,CAAM,IAAA;AAC5D,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,EAAE,MAAA,IAAU,QAAQ,OAAO,IAAA;AACtE,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,cAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,2BAAA;AAAA,IACL,KAAK,2BAAA;AAAA,IACL,KAAK,+BAAA;AAAA,IACL,KAAK,kBAAA;AAAA,IACL,KAAK,sBAAA;AAAA,IACL,KAAK,sBAAA;AAAA,IACL,KAAK,mBAAA;AACH,MAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACf;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,qCAAA,GAAmF;AAC1F,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,EAAa,OAAO,IAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,CAAC,KAAA,KAAkB,CAAA,EAAG,4BAA4B,CAAA,CAAA,EAAI,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AACjF,EAAA,OAAO;AAAA,IACL,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAC,CAAA;AAC7C,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,MAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACtC,MAAA,IAAI,CAAC,UAAU,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,IAAA;AAC3E,MAAA,MAAM,KAAA,GAAQ,MAAA;AACd,MAAA,OAAO,OAAO,KAAA,CAAM,WAAA,KAAgB,QAAA,IAAY,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,GACvE,EAAE,aAAa,KAAA,CAAM,WAAA,EAAa,SAAA,EAAW,KAAA,CAAM,WAAU,GAC7D,IAAA;AAAA,IACN,CAAA;AAAA,IACA,IAAA,CAAK,OAAO,KAAA,EAAO;AACjB,MAAA,cAAA,CAAe,OAAA;AAAA,QACb,IAAI,KAAK,CAAA;AAAA,QACT,IAAA,CAAK,UAAU,EAAE,WAAA,EAAa,MAAM,WAAA,EAAa,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW;AAAA,OAC/E;AAAA,IACF,CAAA;AAAA,IACA,MAAM,KAAA,EAAO;AACX,MAAA,cAAA,CAAe,UAAA,CAAW,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACtC;AAAA,GACF;AACF;AAEA,SAAS,8BAA8B,IAAA,EAAuB;AAC5D,EAAA,OACE,SAAS,sBAAA,IAA0B,IAAA,KAAS,oBAAA,IAAwB,IAAA,CAAK,WAAW,UAAU,CAAA;AAElG;AAEA,SAAS,0BACP,OAAA,EAC4B;AAC5B,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,cAAA,CAAe,OAAA,EAAS,cAAA,EAAgB,kBAAkB,cAAc,CAAA;AAAA,IACxF,cAAA,EAAgB,cAAA,CAAe,OAAA,EAAS,cAAA,EAAgB,kBAAkB,cAAc,CAAA;AAAA,IACxF,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,eAAe,OAAA,EAAS,MAAA,EAAQ,iBAAA,CAAkB,MAAM,CAAC,CAAA;AAAA,IAC7E,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,EAAS,MAAA,IAAU,iBAAA,CAAkB,MAAM,CAAC;AAAA,GAC9E;AACF;AAEA,SAAS,cAAA,CAAe,OAA2B,QAAA,EAA0B;AAC3E,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA,IAAK,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,QAAA;AACpF;AAEA,SAAS,uBAAA,CACP,WACA,iBAAA,EAC0B;AAC1B,EAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,UAAU,OAAO,IAAA;AACxD,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,SAAA,CAAU,EAAE,EAAE,IAAA,EAAK;AACnC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,OAAO,EAAE,IAAA,EAAK;AAC7C,EAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AACvB,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,OAAA,IAAW,CAAC,CAAC,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,OAAO,CAAA,CAAE,QAAA,CAAS,IAAI,GAAG,OAAO,IAAA;AACxF,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,IAAA;AAAA,IACA,OAAA,EAAS,IAAA,KAAS,OAAA,GAAU,4FAAA,GAAoB,OAAA;AAAA,IAChD,SAAA,EAAW,KAAK,SAAA,CAAU,SAAS,sBAAK,IAAI,IAAA,IAAO,WAAA;AAAY,GACjE;AACF;AAEA,SAAS,KAAK,KAAA,EAAwB;AACpC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAC7C;AAEA,SAAS,OAAO,KAAA,EAA4B;AAC1C,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACrE,KAAA,GACD,EAAC;AACP;AAEA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA,CAAO,GAAA;AACpD;;;ACpmCA,IAAM,cAAc,CAAC,QAAA,EAAU,SAAS,YAAA,EAAc,gBAAA,EAAkB,WAAW,MAAM,CAAA;AACzF,IAAM,4BAAA,GAA+B,yCAAA;AACrC,IAAM,eAAA,GAAkB,wEAAA;AACxB,IAAM,kBAAA,GAAqB,yBAAA;AAQpB,SAAS,gCAAgC,OAAA,EAAmD;AACjG,EAAA,MAAM,MAAA,GAAS,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,EAAA;AACvD,EAAA,MAAM,SAAA,GAAY,uBAAuB,MAAM,CAAA;AAC/C,EAAA,IAAI,CAAC,aAAa,WAAA,CAAY,MAAM,MAAM,CAAA,EAAG,OAAO,UAAU,MAAM,CAAA;AAEpE,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,UAAU,MAAM,CAAA;AAAA,EACzB;AACA,EAAA,MAAM,MAAA,GAAS,+BAA+B,KAAK,CAAA;AACnD,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,SAAA,CAAU,MAAM,CAAA;AACpC,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,SAAS,SAAA,CAAU,OAAA;AAAA,IACnB,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,CAAC;AAAA,GAChC,CAAA;AACH;AAEO,SAAS,SAAS,KAAA,EAAiC;AACxD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,eAAA,CAAgB,KAAK,KAAK,CAAA;AAChE;AAEA,SAAS,uBAAuB,OAAA,EAAiD;AAC/E,EAAA,MAAM,yBAAA,GAA4B,QAAQ,OAAA,EAAQ;AAClD,EAAA,MAAM,SAAS,yBAAA,CAA0B,KAAA;AAAA,IACvC;AAAA,GACF;AACA,EAAA,IAAI,MAAA,EAAQ,UAAU,MAAA,EAAW;AAC/B,IAAA,OAAO;AAAA,MACL,SAAS,yBAAA,CAA0B,KAAA,CAAM,GAAG,MAAA,CAAO,KAAK,EAAE,OAAA,EAAQ;AAAA,MAClE,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,EAAG,MAAK,IAAK;AAAA,KAC7B;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,CAAC,GAAG,yBAAA,CAA0B,QAAA,CAAS,wBAAwB,CAAC,CAAA;AAC/E,EAAA,KAAA,IAAS,QAAQ,MAAA,CAAO,MAAA,GAAS,GAAG,KAAA,IAAS,CAAA,EAAG,SAAS,CAAA,EAAG;AAC1D,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,IAAA,MAAM,YAAA,GACJ,KAAA,EAAO,KAAA,KAAU,MAAA,GAAY,EAAA,GAAK,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,CAAC,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA,IAAK,EAAA,CAAA;AAC7E,IAAA,IAAI,eAAe,CAAA,EAAG;AACtB,IAAA,MAAM,IAAA,GAAO,yBAAA,CAA0B,KAAA,CAAM,YAAY,EAAE,IAAA,EAAK;AAChE,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AACf,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,0BAA0B,KAAA,CAAM,CAAA,EAAG,OAAO,KAAA,IAAS,CAAC,EAAE,OAAA,EAAQ;AAAA,QACvE;AAAA,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAGR;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,+BAA+B,KAAA,EAA2D;AACjG,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,IAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAK,EAAE,IAAA,EAAK;AACrC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,WAAA,CAAY,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,KAAQ,WAAA,CAAY,KAAK,CAAC,CAAA,EAAG;AAC/F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IACE,KAAA,CAAM,SAAS,kBAAA,IACf,KAAA,CAAM,WAAW,uBAAA,IACjB,CAAC,QAAA,CAAS,KAAA,CAAM,gBAAgB,CAAC,KACjC,CAAC,0BAAA,CAA2B,KAAA,CAAM,YAAY,CAAC,CAAA,IAC/C,MAAM,OAAA,KAAY,cAAA,IAClB,KAAA,CAAM,KAAA,KAAU,kBAAA,EAChB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,IAAA,EAAM,kBAAA;AAAA,IACN,MAAA,EAAQ,uBAAA;AAAA,IACR,aAAA,EAAe,MAAM,gBAAgB,CAAA;AAAA,IACrC,SAAA,EAAW,MAAM,YAAY,CAAA;AAAA,IAC7B,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAEA,SAAS,2BAA2B,KAAA,EAAiC;AACnE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,kBAAA,CAAmB,KAAK,KAAK,CAAA;AACnE;AAEA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,4BAA4B,CAAC,CAAA,CAAE,MAAA;AAC3D;AAEA,SAAS,UAAU,OAAA,EAAmD;AACpE,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,OAAA,EAAS,OAAA,EAAS,OAAO,MAAA,CAAO,EAAE,CAAA,EAAG,CAAA;AAC9D;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;;;ACjHA,IAAMC,kBAAAA,GAAgD;AAAA,EACpD,cAAA,EAAgB,GAAA;AAAA,EAChB,cAAA,EAAgB,GAAA;AAAA,EAChB,MAAA,EAAQ,CAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AACA,IAAM,oBAAA,GAAuB,CAAA;AAC7B,IAAMC,4BAAAA,GAA8B,CAAA;AAyB7B,IAAM,0BAAA,GAAN,cAAyC,KAAA,CAAM;AAAA,EAC3C,IAAA;AAAA,EAET,WAAA,CAAY,MAAgC,OAAA,EAAiB;AAC3D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,4BAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAEO,IAAM,wBAAN,MAA4B;AAAA,EAChB,WAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA,uBAAgB,GAAA,EAA+D;AAAA,EAExF,cAAA,GAAgD,IAAA;AAAA,EAChD,kBAA4C,EAAC;AAAA,EAC7C,kBAA4C,EAAC;AAAA,EAC7C,YAAA,GAA0C,MAAA;AAAA,EAC1C,MAAA,GAA2B,IAAA;AAAA,EAC3B,cAAA,GAAwD,IAAA;AAAA,EACxD,cAAA,GAAuD,IAAA;AAAA,EACvD,gBAAA,GAAmB,CAAA;AAAA,EACnB,qBAAA,GAAwB,CAAA;AAAA,EACxB,4BAAA,GAA+B,CAAA;AAAA,EAC/B,gBAAA,GAAmB,CAAA;AAAA,EACnB,2BAAA,GAAkE,IAAA;AAAA,EAClE,SAAA,GAAY,KAAA;AAAA,EACZ,eAAA,GAAkB,KAAA;AAAA,EAClB,OAAA,GAAU,KAAA;AAAA,EACV,cAAA,GAAuD,IAAA;AAAA,EACvD,eAAA,GAAyD,IAAA;AAAA,EAChD,gBAAA,uBAAuB,GAAA,EAA4C;AAAA,EAC5E,uBAAA,GAA0B,CAAA;AAAA,EAC1B,kBAAA;AAAA,EAER,YAAY,OAAA,EAAuC;AACjD,IAAA,IAAA,CAAK,WAAA,GAAcC,oBAAAA,CAAoB,OAAA,CAAQ,WAAW,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,MAAA,MAAM,IAAI,0BAAA,CAA2B,uBAAA,EAAyB,uDAAoB,CAAA;AAAA,IACpF;AACA,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,kBAAA,GAAqB,cAAA,CAAe,OAAA,CAAQ,SAAS,CAAA,IAAK,IAAA;AAC/D,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAQ,gBAAA,IAAoBC,gBAAAA;AACpD,IAAA,IAAA,CAAK,gBAAA,GAAmB,kBAAA,CAAmB,OAAA,CAAQ,SAAS,CAAA;AAC5D,IAAA,IAAA,CAAK,qBAAqB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,sBAAsB,GAAK,CAAA;AACzE,IAAA,IAAA,CAAK,gBAAA,GACH,OAAA,CAAQ,gBAAA,KACP,CAAC,GAAA,KAAQ;AACR,MAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,QAAA,MAAM,IAAI,0BAAA;AAAA,UACR,uBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,IAAI,UAAU,GAAG,CAAA;AAAA,IAC1B,CAAA,CAAA;AAAA,EACJ;AAAA,EAEA,IAAI,OAAA,GAAyC;AAC3C,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,IAAI,QAAA,GAA8C;AAChD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA;AAAA,EACjC;AAAA,EAEA,IAAI,eAAA,GAA6C;AAC/C,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,EAAA,CACE,MACA,QAAA,EACY;AACZ,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,IAAI,IAAI,CAAA,wBAAS,GAAA,EAAqB;AACvE,IAAA,MAAM,OAAA,GAAU,QAAA;AAChB,IAAA,SAAA,CAAU,IAAI,OAAO,CAAA;AACrB,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,SAAS,CAAA;AAClC,IAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,YAAA,EAAa;AACnD,MAAA,IAAA,CAAK,YAAA,EAAa;AAClB,MAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAC7B,MAAA,MAAM,YAAY,IAAA,CAAK,kBAAA;AACvB,MAAA,IAAA,CAAK,cAAA,GAAiB,SAAA,GACjB,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,EAAA,KAAO,SAAS,CAAA,IAAK,IAAA,GACxD,QAAA,CAAS,IAAA;AAAA,QACR,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,KAAW,QAAA,IAAY,2BAA2B,OAAO;AAAA,OAChF,IACA,QAAA,CAAS,IAAA,CAAK,0BAA0B,CAAA,IACxC,IAAA;AACJ,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,IAAA,CAAK,KAAK,SAAA,EAAW,EAAE,OAAA,EAAS,IAAA,CAAK,gBAAgB,CAAA;AACrD,QAAA,MAAM,KAAK,cAAA,EAAe;AAAA,MAC5B;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,SAAA,CAAU,qBAAA,EAAuB,8GAAA,EAAsB,IAAI,CAAA;AAAA,IAClE;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,SAAA,EAAW,KAAK,cAAA,EAAgB,EAAA,IAAM,MAAM,CAAA;AAAA,EACnE;AAAA,EAEA,sBAAA,GAA+B;AAC7B,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,kBAAkB,EAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,YAAY,SAAA,EAAkC;AAClD,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,UAAA,GAAaC,aAAAA,CAAa,SAAA,EAAW,WAAW,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,YAAA,EAAa;AACnD,IAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAC7B,IAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAK,CAAC,SAAA,KAAc,SAAA,CAAU,OAAO,UAAU,CAAA;AACxE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,0BAAA,CAA2B,qBAAA,EAAuB,kDAAU,CAAA;AAAA,IACxE;AACA,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,IAAA,IAAA,CAAK,qBAAqB,OAAA,CAAQ,EAAA;AAClC,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,EAAE,OAAA,EAAS,CAAA;AAChC,IAAA,MAAM,KAAK,cAAA,EAAe;AAAA,EAC5B;AAAA,EAEA,MAAM,YAAY,OAAA,EAAkD;AAClE,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,UAAA,GAAa,QAAQ,IAAA,EAAK;AAChC,IAAA,IAAI,CAAC,UAAA,EAAY,MAAM,IAAI,0BAAA,CAA2B,iBAAiB,wDAAW,CAAA;AAClF,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAI,0BAAA,CAA2B,kBAAA,EAAoB,oEAAa,CAAA;AAAA,IACxE;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc;AAAA,UAChD,eAAA,EAAiBC,kBAAAA,CAAkB,IAAA,CAAK,gBAAA,EAAkB,CAAA;AAAA,UAC1D,KAAA,EAAO,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,UAC7B,cAAA,EAAgB;AAAA,SACjB,CAAA;AACD,QAAA,IAAA,CAAK,YAAA,EAAa;AAClB,QAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,OAAA;AAC7B,QAAA,IAAA,CAAK,aAAA,CAAc,OAAO,OAAO,CAAA;AACjC,QAAA,IAAA,CAAK,kBAAA,GAAqB,OAAO,OAAA,CAAQ,EAAA;AACzC,QAAA,IAAA,CAAK,KAAK,SAAA,EAAW,EAAE,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AAChD,QAAA,IAAIC,WAAU,MAAA,CAAO,cAAA;AACrB,QAAA,IAAI,CAACA,QAAAA,EAAS;AACZ,UAAA,MAAM,OAAO,MAAM,IAAA,CAAK,UAAU,YAAA,CAAa,MAAA,CAAO,QAAQ,EAAE,CAAA;AAChE,UAAAA,WAAU,CAAC,GAAG,KAAK,QAAQ,CAAA,CACxB,SAAQ,CACR,IAAA;AAAA,YACC,CAAC,cACC,SAAA,CAAU,UAAA,KAAe,cAAc,SAAA,CAAU,OAAA,CAAQ,MAAK,KAAM;AAAA,WACxE;AACF,UAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,QAAA,CAAS,MAAA,CAAO,CAAC,SAAA,KAAc,SAAA,CAAU,EAAA,KAAOA,QAAAA,EAAS,EAAE,CAAA;AAAA,QACzF;AACA,QAAA,IAAI,CAACA,QAAAA,EAAS,MAAM,IAAI,MAAM,yBAAyB,CAAA;AACvD,QAAA,IAAA,CAAK,aAAA,CAAcA,UAAS,OAAO,CAAA;AACnC,QAAA,OAAOA,QAAAA;AAAA,MACT;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA;AAAA,QACnC,KAAK,cAAA,CAAe,EAAA;AAAA,QACpBD,kBAAAA,CAAkB,IAAA,CAAK,gBAAA,EAAkB,CAAA;AAAA,QACzC;AAAA,OACF;AACA,MAAA,IAAA,CAAK,YAAA,EAAa;AAClB,MAAA,IAAA,CAAK,aAAA,CAAc,SAAS,OAAO,CAAA;AACnC,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,4BAA4B,MAAM,KAAA;AACvD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,aAAA,EAAe,kFAAiB,IAAI,CAAA;AAClE,MAAA,MAAM,IAAI,0BAAA,CAA2B,MAAA,CAAO,IAAA,EAAM,OAAO,OAAO,CAAA;AAAA,IAClE,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,GAA2D;AAC/D,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,EAC9B;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,gBAAA,IAAoB,CAAA;AACzB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,uBAAA,IAA2B,CAAA;AAChC,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAAA,EAC9B;AAAA,EAEA,MAAc,cAAA,CAAe,QAAA,GAAW,KAAA,EAAsB;AAC5D,IAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,KAAK,cAAA,EAAgB,SAAA,KAAc,QAAQ,EAAA,EAAI,OAAO,KAAK,cAAA,CAAe,OAAA;AAC9E,IAAA,MAAM,WAAW,YAAY;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,QAAQ,EAAE,CAAA;AACzD,QAAA,IAAI,KAAK,SAAA,IAAa,IAAA,CAAK,cAAA,EAAgB,EAAA,KAAO,QAAQ,EAAA,EAAI;AAC9D,QAAA,MAAM,MAAA,uBAAa,GAAA,EAAoC;AACvD,QAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,UAAA,IAAI,OAAA,CAAQ,SAAA,KAAc,OAAA,CAAQ,EAAA,IAAM,OAAA,CAAQ,IAAI,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAAA,QACpF;AACA,QAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,EAAE,CAAC,CAAA;AAC7E,QAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA,CAAE,KAAK,eAAe,CAAA;AAChE,QAAA,IAAA,CAAK,IAAA,CAAK,WAAW,EAAE,SAAA,EAAW,QAAQ,EAAA,EAAI,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,CAAA;AACvE,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,KAAA,MAAW,OAAA,IAAW,KAAK,eAAA,EAAiB;AAC1C,YAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA,EAAG;AAChC,cAAA,IAAA,CAAK,IAAA,CAAK,WAAW,EAAE,SAAA,EAAW,QAAQ,EAAA,EAAI,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,YAC7E;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,EAAA,EAAI,IAAA,CAAK,cAAc,CAAA;AAAA,MACvD,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,CAAK,SAAA,CAAU,qBAAA,EAAuB,8GAAA,EAAsB,IAAI,CAAA;AAAA,MAClE;AAAA,IACF,CAAA,GAAG;AACH,IAAA,MAAM,UAAU,EAAE,SAAA,EAAW,OAAA,CAAQ,EAAA,EAAI,SAAS,OAAA,EAAQ;AAC1D,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,IAAA,MAAM,OAAA,CAAQ,QAAQ,MAAM;AAC1B,MAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,OAAA,EAAS,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IAC7D,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAA,CAAiB,WAAmB,cAAA,EAA8B;AACxE,IAAA,MAAM,QAAA,GAAW,KAAK,SAAA,CAAU,QAAA;AAChC,IAAA,MAAM,MAAA,GAAS,oBAAoB,cAAc,CAAA;AACjD,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,IAAU,kBAAA,CAAmB,QAAQ,GAAG,CAAA,IAAK,CAAA,IAAK,IAAA,CAAK,SAAA,EAAW;AACpF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AAC5C,IAAA,IAAI,kBAAA,CAAmB,MAAA,EAAQ,KAAA,CAAM,YAAY,KAAK,CAAA,EAAG;AACzD,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,IAAI,kBAAA,CAAmB,MAAA,EAAQ,KAAA,CAAM,QAAQ,IAAI,CAAA,EAAG;AAClD,QAAA,KAAA,CAAM,OAAA,GAAU,aAAA,CAAc,KAAA,CAAM,OAAA,EAAS,MAAM,CAAA;AAAA,MACrD;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC1D;AAAA,EAEQ,gBAAA,CACN,SAAA,EACA,MAAA,EACA,KAAA,EACA,QAAA,EACM;AACN,IAAA,MAAM,sBAAsB,IAAA,CAAK,uBAAA;AACjC,IAAA,MAAM,iBAAA,GAAoB,EAAE,KAAA,CAAM,UAAA;AAClC,IAAA,KAAA,CAAM,QAAA,GAAW,MAAA;AACjB,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,WAAW,MAAM,CAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AACN,MAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,KAAK,OAAA,CACF,KAAK,MAAM;AACV,MAAA,IAAI,CAAC,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,mBAAA,EAAqB,mBAAmB,MAAM,CAAA;AAClF,QAAA;AACF,MAAA,KAAA,CAAM,YAAA,GAAe,aAAA,CAAc,KAAA,CAAM,YAAA,EAAc,MAAM,CAAA;AAC7D,MAAA,MAAM,OAAO,KAAA,CAAM,OAAA;AACnB,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,MAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,MAAA,IAAI,QAAQ,kBAAA,CAAmB,IAAA,EAAM,KAAA,CAAM,YAAY,IAAI,CAAA,EAAG;AAC5D,QAAA,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAA;AAAA,MACxD;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,MAAA,IAAI,CAAC,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,mBAAA,EAAqB,mBAAmB,MAAM,CAAA;AAClF,QAAA;AACF,MAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,gBAAgB,SAAA,EAAmD;AACzE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA;AACnD,IAAA,IAAI,SAAS,OAAO,OAAA;AACpB,IAAA,MAAM,OAAA,GAA0C;AAAA,MAC9C,YAAA,EAAc,GAAA;AAAA,MACd,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACd;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAC5C,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,oBAAA,CACN,KAAA,EACA,mBAAA,EACA,iBAAA,EACA,MAAA,EACS;AACT,IAAA,OACE,CAAC,IAAA,CAAK,SAAA,IACN,IAAA,CAAK,uBAAA,KAA4B,uBACjC,KAAA,CAAM,UAAA,KAAe,iBAAA,IACrB,KAAA,CAAM,QAAA,KAAa,MAAA;AAAA,EAEvB;AAAA,EAEQ,WAAW,YAAA,EAA6B;AAC9C,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,eAAA,EAAiB;AAC7C,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,YAAA,CAAa,IAAA,CAAK,cAAc,CAAA;AACzD,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,QAAA,CAAS,YAAA,GAAe,cAAA,GAAiB,YAAY,CAAA;AAC1D,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,WAAW,CAAA;AAAA,IACjD,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,SAAA,CAAU,uBAAA,EAAyB,oEAAA,EAAe,IAAI,CAAA;AAC3D,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,EAAE,IAAA,CAAK,gBAAA;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,MAAA,CAAO,SAAS,MAAM,KAAK,IAAA,CAAK,YAAA,CAAa,QAAQ,UAAU,CAAA;AAC/D,IAAA,MAAA,CAAO,SAAA,GAAY,CAAC,KAAA,KAAU,KAAK,KAAK,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,MAAA,EAAQ,UAAU,CAAA;AACvF,IAAA,MAAA,CAAO,UAAU,MAAM;AACrB,MAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC5C,QAAA,IAAA,CAAK,SAAA,CAAU,iBAAA,EAAmB,oEAAA,EAAe,IAAI,CAAA;AAAA,MACvD;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,CAAC,KAAA,KAAU,IAAA,CAAK,kBAAkB,MAAA,EAAQ,UAAA,EAAY,MAAM,IAAI,CAAA;AAAA,EACnF;AAAA,EAEA,MAAc,YAAA,CAAa,MAAA,EAAmB,UAAA,EAAmC;AAC/E,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC/C,IAAA,IAAA,CAAK,SAAS,gBAAgB,CAAA;AAC9B,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,IAAI;AACF,MAAA,WAAA,GAAA,CAAe,MAAM,IAAA,CAAK,SAAA,CAAU,cAAA,IAAkB,IAAA,EAAK;AAAA,IAC7D,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,EAAqB,gFAAA,EAAiB,IAAI,CAAA;AACzD,MAAA,MAAA,CAAO,KAAA,EAAM;AACb,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,KAAK,SAAA,CAAU;AAAA,QACb,IAAA,EAAM,cAAA;AAAA,QACN,gBAAA,EAAkB,CAAA;AAAA,QAClB,YAAA,EAAc,WAAA;AAAA,QACd,kBAAA,EAAoB,CAAC,kBAAkB,CAAA;AAAA,QACvC,SAAS;AAAC,OACX;AAAA,KACH;AACA,IAAA,WAAA,GAAc,EAAA;AAAA,EAChB;AAAA,EAEA,MAAc,gBAAA,CACZ,IAAA,EACA,MAAA,EACA,UAAA,EACe;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC/C,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,GAAA,GAAM,IAAA;AAAA,SAAA,IAC3B,IAAA,YAAgB,IAAA,EAAM,GAAA,GAAM,MAAM,KAAK,IAAA,EAAK;AAAA,SAAA,IAC5C,gBAAgB,WAAA,EAAa,GAAA,GAAM,IAAI,WAAA,EAAY,CAAE,OAAO,IAAI,CAAA;AACzE,IAAA,MAAM,OAAA,GAAU,GAAA,GAAM,eAAA,CAAgB,GAAG,CAAA,GAAI,IAAA;AAC7C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,EAAkB,sFAAA,EAAkB,IAAI,CAAA;AACvD,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,EACtD;AAAA,EAEQ,mBAAA,CAAoB,OAAA,EAAqB,MAAA,EAAmB,UAAA,EAA0B;AAC5F,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,OAAA,CAAQ,IAAI,CAAA;AACxC,IAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,MAAA,MAAM,QAAA,GAAWT,OAAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AACxC,MAAA,IAAIA,OAAAA,CAAO,QAAA,CAAS,gBAAgB,CAAA,CAAE,cAAc,IAAA,EAAM;AACxD,QAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,QAAA,IAAA,CAAK,SAAA,CAAU,qBAAA,EAAuB,0EAAA,EAAgB,KAAK,CAAA;AAC3D,QAAA,MAAA,CAAO,KAAA,EAAM;AACb,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,MAAA,IAAA,CAAK,qBAAA,GAAwB,CAAA;AAC7B,MAAA,IAAA,CAAK,4BAAA,GAA+B,CAAA;AACpC,MAAA,IAAA,CAAK,eAAeW,YAAAA,CAAY,OAAA,CAAQ,0BAA0B,CAAA,EAAG,QAAQ,UAAU,CAAA;AACvF,MAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,gBAAA,IAAoB,OAAA,CAAQ,OAAA,KAAY,kBAAA,EAAoB;AACvE,MAAA,MAAM,KAAA,GAAQX,OAAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAClC,MAAA,IAAA,CAAK,2BAA2B,KAAK,CAAA;AACrC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,yBAAA,IAA6B,OAAA,CAAQ,OAAA,KAAY,kBAAA,EAAoB;AAChF,MAAA,KAAK,KAAK,mBAAA,EAAoB;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,sBAAA,EAAwB;AACnC,MAAA,MAAM,OAAA,GAAUE,sBAAAA,CAAsB,cAAA,CAAe,OAAA,CAAQ,IAAI,CAAC,CAAA;AAClE,MAAA,IAAA,CAAK,2BAAA,GAA8B,EAAE,UAAA,EAAY,SAAA,EAAW,QAAQ,SAAA,EAAU;AAC9E,MAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,IAAA,EAAM,QAAQ,OAAA,EAAS,OAAA,CAAQ,cAAc,OAAO,CAAA;AAAA,IAC7E;AAAA,EACF;AAAA,EAEQ,2BAA2B,KAAA,EAAyB;AAC1D,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,CAAM,UAAU,CAAA;AACjD,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,CAAM,UAAU,CAAA;AACjD,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,EAAW;AAC9B,IAAA,IAAA,CAAK,2BAAA,EAA4B;AACjC,IAAA,IAAI,SAAA,KAAc,IAAA,CAAK,cAAA,EAAgB,EAAA,EAAI;AAC3C,IAAA,IAAI,cAAc,4BAAA,EAA8B;AAChD,IAAA,IAAI,cAAc,yBAAA,EAA2B;AAC3C,MAAA,KAAK,IAAA,CAAK,eAAe,IAAI,CAAA;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,KAAK,KAAK,0BAAA,EAA2B;AAAA,EACvC;AAAA,EAEA,MAAc,mBAAA,GAAqC;AACjD,IAAA,MAAM,IAAA,CAAK,iBAAgB,CAAE,KAAA,CAAM,MAAM,CAAC,GAAG,IAAA,CAAK,eAAe,CAAC,CAAA;AAClE,IAAA,MAAM,KAAK,0BAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,MAAc,eAAA,GAA8D;AAC1E,IAAA,IAAI,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA,CAAK,eAAA,CAAgB,OAAA;AACtD,IAAA,MAAM,WAAW,YAAY;AAC3B,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,YAAA,EAAa;AACnD,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAClD,MAAA,OAAO,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA;AAAA,IACjC,CAAA,GAAG;AACH,IAAA,MAAM,OAAA,GAAU,EAAE,OAAA,EAAS,OAAA,EAAQ;AACnC,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA;AACvB,IAAA,OAAO,OAAA,CAAQ,QAAQ,MAAM;AAC3B,MAAA,IAAI,IAAA,CAAK,eAAA,KAAoB,OAAA,EAAS,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IAC/D,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,2BAAA,GAAoC;AAC1C,IAAA,KAAK,IAAA,CAAK,eAAA,EAAgB,CAAE,KAAA,CAAM,MAAM;AAAA,IAExC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAgB,QAAA,EAAmD;AACzE,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAG,QAAQ,CAAA;AACnC,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,EAAE,QAAA,EAAU,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA,EAAG,CAAA;AAAA,EAC/D;AAAA,EAEQ,cAAc,OAAA,EAAuC;AAC3D,IAAA,MAAM,YAAA,GAAe,KAAK,eAAA,CAAgB,SAAA,CAAU,CAAC,SAAA,KAAc,SAAA,CAAU,EAAA,KAAO,OAAA,CAAQ,EAAE,CAAA;AAC9F,IAAA,IAAI,YAAA,GAAe,GAAG,IAAA,CAAK,eAAA,GAAkB,CAAC,OAAA,EAAS,GAAG,KAAK,eAAe,CAAA;AAAA,SACzE;AACH,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,eAAA,CAAgB,GAAA;AAAA,QAAI,CAAC,SAAA,EAAW,KAAA,KAC1D,KAAA,KAAU,eAAe,OAAA,GAAU;AAAA,OACrC;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,EAAE,QAAA,EAAU,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA,EAAG,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAc,0BAAA,GAA4C;AACxD,IAAA,MAAM,SAAA,GAAY,KAAK,cAAA,EAAgB,EAAA;AACvC,IAAA,MAAM,UAAA,GAAa,KAAK,SAAA,CAAU,UAAA;AAClC,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,UAAA,EAAY;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,MAAM,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,WAAW,SAAS,CAAA;AAC/D,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,cAAA,EAAgB,OAAO,SAAA,EAAW;AAC5D,QAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,QAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,EAAE,OAAA,EAAS,CAAA;AAAA,MAClC;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,aAAA,CAAc,SAAiC,MAAA,EAAoC;AACzF,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,CAAK,CAAC,cAAc,SAAA,CAAU,EAAA,KAAO,OAAA,CAAQ,EAAE,CAAA,EAAG;AAC3E,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAG,IAAA,CAAK,iBAAiB,OAAO,CAAA,CAAE,KAAK,eAAe,CAAA;AAC9E,IAAA,IAAA,CAAK,IAAA,CAAK,WAAW,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAW,OAAA,EAAS,QAAQ,CAAA;AAAA,EACxE;AAAA,EAEQ,cAAA,CAAe,eAAA,EAAyB,MAAA,EAAmB,UAAA,EAA0B;AAC3F,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,aAAA,CAAc,IAAA,CAAK,cAAc,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,eAAA,GAAkB,CAAA,GAAI,eAAA,GAAkB,GAAA,GAAQ,IAAA;AAClE,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAA;AAAA,MACpB,MAAM;AACJ,QAAA,IAAI,KAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,IAAK,MAAA,CAAO,eAAe,CAAA,EAAG;AACvE,UAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,eAAA,EAAiB,CAAC,CAAA;AAAA,QAC/C;AAAA,MACF,CAAA;AAAA,MACA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,kBAAA,EAAoB,SAAS;AAAA,KAC7C;AAAA,EACF;AAAA,EAEQ,iBAAA,CAAkB,MAAA,EAAmB,UAAA,EAAoB,IAAA,EAAoB;AACnF,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC/C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,aAAA,CAAc,IAAA,CAAK,cAAc,CAAA;AAC1D,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,MAAMA,yBACJ,IAAA,CAAK,2BAAA,EAA6B,UAAA,KAAe,UAAA,GAC7C,KAAK,2BAAA,GACL,IAAA;AACN,IAAA,IAAA,CAAK,2BAAA,GAA8B,IAAA;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,SAAA,EAAW;AAC3C,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAS,cAAc,CAAA;AACjD,MAAA;AAAA,IACF;AACA,IAAA,IAAIA,sBAAAA,EAAuB,cAAc,OAAA,EAAS;AAChD,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,IAAA,EAAM;AAClC,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAI,CAACA,sBAAAA,EAAuB;AAC1B,QAAA,IAAA,CAAK,SAAA;AAAA,UACH,IAAA,KAAS,OAAO,gBAAA,GAAmB,uBAAA;AAAA,UACnC,IAAA,KAAS,OAAO,gFAAA,GAAkB,gFAAA;AAAA,UAClC;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,IAAIA,sBAAAA,EAAuB,SAAA,KAAc,cAAA,IAAkB,IAAA,KAAS,IAAA,EAAM;AACxE,MAAA,IAAI,CAACA,sBAAAA,EAAuB;AAC1B,QAAA,IAAA,CAAK,SAAA,CAAU,sBAAA,EAAwB,8GAAA,EAAsB,IAAI,CAAA;AAAA,MACnE;AACA,MAAA,IAAA,CAAK,6BAAA,EAA8B;AACnC,MAAA;AAAA,IACF;AACA,IAAA,IAAIA,sBAAAA,EAAuB,SAAA,KAAc,OAAA,IAAW,IAAA,KAAS,IAAA,EAAM;AACjE,MAAA,IAAI,CAACA,sBAAAA,EAAuB;AAC1B,QAAA,IAAA,CAAK,SAAA,CAAU,uBAAA,EAAyB,wGAAA,EAAqB,IAAI,CAAA;AAAA,MACnE;AACA,MAAA,IAAI,IAAA,CAAK,yBAAyB,oBAAA,EAAsB;AACtD,QAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,QAAA,IAAA,CAAK,SAAA,CAAU,uBAAA,EAAyB,0HAAA,EAAwB,KAAK,CAAA;AACrE,QAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,qBAAA,IAAyB,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEQ,6BAAA,GAAsC;AAC5C,IAAA,IAAI,IAAA,CAAK,gCAAgCG,4BAAAA,EAA6B;AACpE,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAA,CAAK,SAAA,CAAU,sBAAA,EAAwB,0HAAA,EAAwB,KAAK,CAAA;AACpE,MAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,4BAAA,IAAgC,CAAA;AACrC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,SAAA,IAAa,KAAK,cAAA,EAAgB;AACpE,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,MAChB,KAAK,gBAAA,CAAiB,cAAA;AAAA,MACtB,KAAK,gBAAA,CAAiB,cAAA,GACpB,IAAA,CAAK,gBAAA,CAAiB,UAAU,IAAA,CAAK,gBAAA;AAAA,KACzC;AACA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,CAAK,gBAAA,CAAiB,UAAU,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,CAAA;AAC1E,IAAA,IAAA,CAAK,cAAA,GAAiB,UAAA;AAAA,MACpB,MAAM;AACJ,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,MACtB,CAAA;AAAA,MACA,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,MAAM;AAAA,KAC3B;AAAA,EACF;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,aAAA,CAAc,IAAA,CAAK,cAAc,CAAA;AAC1D,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,YAAA,CAAa,IAAA,CAAK,cAAc,CAAA;AACzD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AAAA,EAEQ,eAAA,CAAgB,QAAmB,UAAA,EAA6B;AACtE,IAAA,OAAO,CAAC,IAAA,CAAK,SAAA,IAAa,KAAK,MAAA,KAAW,MAAA,IAAU,KAAK,gBAAA,KAAqB,UAAA;AAAA,EAChF;AAAA,EAEQ,SAAS,OAAA,EAA0C;AACzD,IAAA,IAAI,IAAA,CAAK,iBAAiB,OAAA,EAAS;AACnC,IAAA,MAAM,WAAW,IAAA,CAAK,YAAA;AACtB,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,IAAA,IAAA,CAAK,IAAA,CAAK,yBAAA,EAA2B,EAAE,QAAA,EAAU,SAAS,CAAA;AAAA,EAC5D;AAAA,EAEQ,SAAA,CACN,IAAA,EACA,OAAA,EACA,WAAA,EAC4B;AAC5B,IAAA,MAAM,MAAA,GAAS,EAAE,IAAA,EAAM,OAAA,EAAS,WAAA,EAAY;AAC5C,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,MAAM,CAAA;AACzB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,IAAA,CACN,MACA,MAAA,EACM;AACN,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,IAAK,EAAC,EAAG,QAAA,CAAS,MAAM,CAAA;AAAA,EACxE;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAI,0BAAA,CAA2B,kBAAA,EAAoB,8DAAY,CAAA;AAAA,IACvE;AAAA,EACF;AACF;AAEA,SAASC,qBAAoB,KAAA,EAAuB;AAClD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAI,IAAI,KAAK,CAAA;AAAA,EACrB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,0BAAA,CAA2B,uBAAA,EAAyB,wDAAW,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,CAAC,CAAC,KAAA,EAAO,MAAM,EAAE,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,IAAK,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,IAAA,IAAQ,IAAI,QAAA,EAAU;AACrF,IAAA,MAAM,IAAI,0BAAA,CAA2B,uBAAA,EAAyB,8DAAY,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,GAAA,CAAI,IAAA;AACb;AAEA,SAAS,mBACP,KAAA,EAC4B;AAC5B,EAAA,OAAO;AAAA,IACL,gBAAgB,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,EAAO,cAAA,IAAkBF,mBAAkB,cAAc,CAAA;AAAA,IACrF,gBAAgB,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,EAAO,cAAA,IAAkBA,mBAAkB,cAAc,CAAA;AAAA,IACrF,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,EAAO,MAAA,IAAUA,mBAAkB,MAAM,CAAA;AAAA,IAC7D,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,EAAO,MAAA,IAAUA,kBAAAA,CAAkB,MAAM,CAAC;AAAA,GAC5E;AACF;AAEA,SAAS,eAAA,CAAgB,MAA8B,KAAA,EAAuC;AAC5F,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACzC,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAC3C,EAAA,IAAI,OAAO,QAAA,CAAS,YAAY,KAAK,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG;AACnE,IAAA,OAAO,YAAA,GAAe,aAAA;AAAA,EACxB;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,KAAA,CAAM,SAAS,CAAA;AACrD;AAEA,SAAS,oBAAoB,KAAA,EAA+B;AAC1D,EAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,MAAM,GAAG,OAAO,IAAA;AAClC,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA;AACvC;AAEA,SAAS,kBAAA,CAAmB,MAAc,KAAA,EAAuB;AAC/D,EAAA,IAAI,IAAA,CAAK,WAAW,KAAA,CAAM,MAAA,SAAe,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,CAAA;AAC3E,EAAA,IAAI,IAAA,KAAS,OAAO,OAAO,CAAA;AAC3B,EAAA,OAAO,IAAA,GAAO,QAAQ,EAAA,GAAK,CAAA;AAC7B;AAEA,SAAS,aAAA,CAAc,MAAqB,KAAA,EAAuB;AACjE,EAAA,OAAO,QAAQ,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA,IAAK,IAAI,IAAA,GAAO,KAAA;AAC/D;AAEA,SAAS,2BAA2B,OAAA,EAA0C;AAC5E,EAAA,OAAO,OAAA,CAAQ,WAAA,CAAY,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AAC7C;AAEA,SAASI,aAAAA,CAAa,OAAgB,KAAA,EAAuB;AAC3D,EAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,0BAAA,CAA2B,uBAAA,EAAyB,CAAA,EAAG,KAAK,CAAA,+BAAA,CAAQ,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAASC,mBAAkB,KAAA,EAAuB;AAChD,EAAA,OAAOD,aAAAA,CAAa,OAAO,WAAW,CAAA;AACxC;AAEA,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AACpD;AAEA,SAASR,QAAO,KAAA,EAA4B;AAC1C,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACrE,KAAA,GACD,EAAC;AACP;AAEA,SAASW,aAAY,KAAA,EAAwB;AAC3C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,CAAA;AACvE;AAEA,SAASJ,gBAAAA,GAA0B;AACjC,EAAA,OAAO,OAAO,WAAW,WAAA,IAAe,OAAO,OAAO,UAAA,KAAe,UAAA,GACjE,MAAA,CAAO,UAAA,EAAW,GAClB,CAAA,QAAA,EAAW,KAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE;AAEA,SAASL,uBAAsB,IAAA,EAI7B;AACA,EAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,uBAAA;AAAA,MACN,OAAA,EAAS,wGAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,IAAI,SAAS,+BAAA,EAAiC;AAC5C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,+BAAA;AAAA,MACN,OAAA,EAAS,mGAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,gFAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,IACE,SAAS,sBAAA,IACT,IAAA,KAAS,wBACT,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAC1B;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,sBAAA;AAAA,MACN,OAAA,EAAS,8GAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,IACE,IAAA,KAAS,eAAA,IACT,IAAA,KAAS,oBAAA,IACT,SAAS,uBAAA,EACT;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,uBAAA;AAAA,MACN,OAAA,EAAS,gFAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,uBAAA;AAAA,IACN,OAAA,EAAS,gFAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AACF;;;AC1yBA,IAAM,iBAAA,GAAoB,EAAA;AAEnB,IAAM,6BAAA,GAAN,cAA4C,KAAA,CAAM;AAAA,EAC9C,IAAA;AAAA,EAET,WAAA,CAAY,MAAmC,OAAA,EAAiB;AAC9D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,+BAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAUO,IAAM,2BAAN,MAA+B;AAAA,EACnB,SAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA,uBAAgB,GAAA,EAG/B;AAAA,EAEM,QAA2B,EAAC;AAAA,EAC5B,OAAA,GAAU,KAAA;AAAA,EACV,MAAA,GAAwB,IAAA;AAAA,EACxB,WAAA,GAAc,CAAA;AAAA,EACd,oBAA8B,EAAC;AAAA,EAC/B,iBAA4C,EAAC;AAAA,EAC7C,sBAAA,GAAyB,KAAA;AAAA,EACzB,eAAA,GAAkB,CAAA;AAAA,EAClB,SAAA,GAAY,KAAA;AAAA,EACZ,YAAA,GAAe,KAAA;AAAA,EACf,aAAA,GAAgB,KAAA;AAAA,EAExB,YAAY,OAAA,EAA0C;AACpD,IAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,MAAA,MAAM,IAAI,6BAAA;AAAA,QACR,uBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,eAAA,GAAkBU,eAAAA,CAAe,OAAA,CAAQ,eAAe,CAAA;AAC7D,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,OAAA,CAAQ,QAAA,IAAY,iBAAiB,CAAC,CAAA;AAC7E,IAAA,IAAA,CAAK,UAAA,GAAa,CAAC,KAAA,EAAO,QAAA,EAAU,MAAM,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,UAAA,IAAc,EAAE,CAAA,GACxE,OAAA,CAAQ,UAAA,GACT,KAAA;AACJ,IAAA,IAAA,CAAK,kBAAA,GAAA,CAAsB,OAAA,CAAQ,kBAAA,IAAsB,EAAC,EACvD,GAAA,CAAI,CAAC,KAAA,KAAUA,eAAAA,CAAe,KAAK,CAAC,CAAA,CACpC,OAAO,OAAO,CAAA;AAAA,EACnB;AAAA,EAEA,IAAI,aAAA,GAA4C;AAC9C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EACvB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,KAAA,GAA4C;AAC9C,IAAA,OAAO,IAAA,CAAK,eAAe,GAAA,CAAI,CAAC,WAAW,EAAE,GAAG,OAAM,CAAE,CAAA;AAAA,EAC1D;AAAA,EAEA,EAAA,CACE,MACA,QAAA,EACY;AACZ,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,IAAI,IAAI,CAAA,wBAAS,GAAA,EAAqB;AACvE,IAAA,MAAM,OAAA,GAAU,QAAA;AAChB,IAAA,SAAA,CAAU,IAAI,OAAO,CAAA;AACrB,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,SAAS,CAAA;AAClC,IAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,OAAA,CAAQ,IAAI,CAAC,IAAA,CAAK,aAAY,EAAG,IAAA,CAAK,kBAAA,EAAoB,CAAC,CAAA;AACjE,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,EAAE,CAAA;AAAA,EACvB;AAAA,EAEA,MAAM,cAAc,KAAA,EAAyC;AAC3D,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAC,GAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAUA,eAAAA,CAAe,KAAK,CAAC,CAAA,CAAE,OAAO,OAAO,CAAA;AACxF,IAAA,MAAM,KAAK,WAAA,EAAY;AAAA,EACzB;AAAA,EAEA,aAAA,GAAmC;AACjC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,KAAK,YAAA,IAAgB,CAAC,KAAK,MAAA,EAAQ;AACxD,IAAA,MAAM,aAAa,IAAA,CAAK,eAAA;AACxB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU;AAAA,QAC5C,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,UAAU,IAAA,CAAK,MAAA;AAAA,QACf,mBAAmB,IAAA,CAAK,iBAAA;AAAA,QACxB,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,iBAAiB,IAAA,CAAK;AAAA,OACvB,CAAA;AACD,MAAA,IAAI,IAAA,CAAK,SAAA,IAAa,UAAA,KAAe,IAAA,CAAK,eAAA,EAAiB;AAC3D,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAC7B,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,QAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC1B,UAAA,QAAA,CAAS,GAAA,CAAI,KAAK,EAAE,CAAA;AACpB,UAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,QAClB;AAAA,MACF;AACA,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,MAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,MAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,MAAA,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA;AAC/B,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,EAAqB,gFAAA,EAAiB,IAAI,CAAA;AAAA,IAC3D,CAAA,SAAE;AACA,MAAA,IAAI,UAAA,KAAe,IAAA,CAAK,eAAA,EAAiB,IAAA,CAAK,eAAA,EAAgB;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,OAAA,CAAQ,IAAI,CAAC,IAAA,CAAK,aAAY,EAAG,IAAA,CAAK,kBAAA,EAAoB,CAAC,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,mBAAmB,KAAA,EAAsB;AACvC,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,CAAU,kBAAA;AAC7B,IAAA,IAAI,MAAA,GAA4C,IAAA;AAChD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAAA,MAC3C,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,GAAS,IAAA;AAAA,MACX;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,KAAK,KAAK,mBAAA,EAAoB;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,SAAS,cAAA,EAAuC;AACpD,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,EAAA,GAAKJ,aAAAA,CAAa,cAAA,EAAgB,gBAAgB,CAAA;AACxD,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,EAAE,CAAA;AACvD,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,UAAA,KAAe,MAAA,EAAQ;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS;AAAA,QAC3C,cAAA,EAAgB,EAAA;AAAA,QAChB,iBAAiB,IAAA,CAAK;AAAA,OACvB,CAAA;AACD,MAAA,IAAI,KAAK,SAAA,EAAW;AACpB,MAAA,IAAA,CAAK,SAAA,CAAU,CAAC,EAAE,CAAA,EAAG,OAAO,MAAM,CAAA;AAClC,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,WAAW,CAAA;AACtC,MAAA,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,EAAE,cAAA,EAAgB,IAAI,CAAA;AAAA,IACvD,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,SAAA,CAAU,kBAAA,EAAoB,4FAAA,EAAmB,IAAI,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,GAA6B;AACjC,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY;AAAA,QAC9C,iBAAiB,IAAA,CAAK;AAAA,OACvB,CAAA;AACD,MAAA,IAAI,KAAK,SAAA,EAAW;AACpB,MAAA,MAAM,MAAA,GAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACtC,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,IAAA,KAC3B,IAAA,CAAK,UAAA,KAAe,MAAA,GAAS,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,MAAA;AAAO,OAC5E;AACA,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,WAAW,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,SAAA,CAAU,kBAAA,EAAoB,4FAAA,EAAmB,IAAI,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,kBAAA,CAAmB,MAAA,EAAgB,IAAA,EAA8B;AACrE,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,EAAA,GAAKA,aAAAA,CAAa,MAAA,EAAQ,QAAQ,CAAA;AACxC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,KAAK,SAAA,CAAU,kBAAA,CAAmB,EAAE,MAAA,EAAQ,EAAA,EAAI,MAAM,CAAA;AAAA,IACrE,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,iBAAA,EAAmB,kFAAiB,IAAI,CAAA;AACtE,MAAA,MAAM,IAAI,6BAAA,CAA8B,MAAA,CAAO,IAAA,EAAM,OAAO,OAAO,CAAA;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,eAAA,IAAmB,CAAA;AACxB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,EAChB;AAAA,EAEA,MAAc,WAAA,GAA6B;AACzC,IAAA,MAAM,UAAA,GAAa,EAAE,IAAA,CAAK,eAAA;AAC1B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU;AAAA,QAC5C,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,QAAA,EAAU,IAAA;AAAA;AAAA,QAEV,iBAAA,EAAmB,IAAA;AAAA,QACnB,mBAAmB,IAAA,CAAK,iBAAA;AAAA,QACxB,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,iBAAiB,IAAA,CAAK;AAAA,OACvB,CAAA;AACD,MAAA,IAAI,IAAA,CAAK,SAAA,IAAa,UAAA,KAAe,IAAA,CAAK,eAAA,EAAiB;AAC3D,MAAA,MAAM,MAAA,uBAAa,GAAA,EAA6B;AAChD,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,QAAA,IAAI,KAAK,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,MACvC;AACA,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA;AAChC,MAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,MAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,KAAK,CAAA;AAClC,MAAA,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA;AAC/B,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAI,UAAA,KAAe,KAAK,eAAA,EAAiB;AACvC,QAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,EAAqB,gFAAA,EAAiB,IAAI,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,UAAA,KAAe,IAAA,CAAK,eAAA,EAAiB,IAAA,CAAK,eAAA,EAAgB;AAAA,IAChE;AAAA,EACF;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,SAAA,EAAW;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,KAAK,KAAK,mBAAA,EAAoB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,iBAAiB,KAAA,EAA6D;AACpF,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,UAAA,GAAa,KAAA,CAChB,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACf,IAAA,EAAMI,eAAAA,CAAe,KAAA,EAAO,IAAI,CAAA;AAAA,MAChC,IAAA,EAAMA,eAAAA,CAAe,KAAA,EAAO,IAAI;AAAA,MAChC,CAAA,CACD,MAAA,CAAO,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAC9B,IAAA,IAAA,CAAK,iBAAA,CAAkB,YAAY,IAAI,CAAA;AAAA,EACzC;AAAA,EAEQ,cAAc,KAAA,EAAyC;AAC7D,IAAA,MAAM,UAAA,GAAa,MAChB,GAAA,CAAI,CAAC,UAAU,EAAE,IAAA,EAAMA,eAAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG,MAAMA,eAAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,EAAE,CAAE,EACxF,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AAExB,IAAA,IAAA,CAAK,iBAAA,CAAkB,UAAA,EAAY,KAAA,EAAO,IAAA,CAAK,sBAAsB,CAAA;AAAA,EACvE;AAAA,EAEQ,iBAAA,CACN,UAAA,EACA,OAAA,EACA,SAAA,GAAY,KAAA,EACN;AACN,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,cAAA,EAAgB,MAAA,CAAO,IAAI,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,IAC5E;AACA,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,IAAI,aAAa,CAAC,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAE1C,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AACtC,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,MAAM,IAAI,CAAA;AAAA,IAC/C;AACA,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,MAAA,CAAO,MAAM,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,KAAK,kBAAA,CAAmB,MAAA,CAAO,CAAC,KAAA,KAAU,MAAA,CAAO,GAAA,CAAI,KAAK,CAAC,CAAA;AAC7E,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,SAAA,EAAW,GAAG,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAC,CAAA,CAAE,GAAA;AAAA,MACrF,CAAC,UAAU,EAAE,IAAA,EAAM,MAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,IAAK,EAAA,EAAG;AAAA,KAClD;AACA,IAAA,IACE,OAAA,CAAQ,MAAA,KAAW,IAAA,CAAK,cAAA,CAAe,UACvC,OAAA,CAAQ,KAAA;AAAA,MACN,CAAC,KAAA,EAAO,KAAA,KACN,KAAA,CAAM,SAAS,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA,EAAG,QAC3C,KAAA,CAAM,IAAA,KAAS,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA,EAAG;AAAA,KAC/C,EACA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,IAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,EACjD;AAAA,EAEA,MAAc,kBAAA,GAAoC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,eAAe,EAAE,eAAA,EAAiB,IAAA,CAAK,eAAA,EAAiB,CAAA;AAC5F,MAAA,IAAI,KAAK,SAAA,EAAW;AACpB,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,WAAW,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,oBAAoB,MAAA,EAA0C;AACpE,IAAA,IAAI,MAAA,CAAO,SAAS,SAAA,EAAW;AAC7B,MAAA,MAAM,WAAW,MAAA,CAAO,YAAA;AACxB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAClB,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,EAAA,KAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AACvD,QAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,QAAA,EAAU,GAAG,KAAK,KAAK,CAAA;AACrC,QAAA,IAAA,CAAK,aAAA,CAAc,CAAC,QAAQ,CAAC,CAAA;AAC7B,QAAA,IAAA,CAAK,SAAA,EAAU;AAAA,MACjB;AACA,MAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,WAAW,CAAA;AAC/C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,eAAA,EAAiB,MAAA,CAAO,UAAU,IAAI,CAAA;AAC5D,MAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,WAAW,CAAA;AAC/C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,MAAA,CAAO,eAAe,CAAA;AAC9C,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAC9D,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ;AACrC,QAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,QAAA,IAAA,CAAK,SAAA,EAAU;AAAA,MACjB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,WAAW,CAAA;AAAA,EACjD;AAAA,EAEQ,wBAAwB,KAAA,EAAiC;AAG/D,IAAA,IAAI,KAAK,eAAA,IAAmB,OAAO,UAAU,QAAA,EAAU,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,SAC3E,KAAK,KAAK,kBAAA,EAAmB;AAAA,EACpC;AAAA,EAEQ,SAAA,CAAU,KAAwB,MAAA,EAA6B;AACrE,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAClB,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACpC,MAAA,IAAI,OAAO,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,IAAA,CAAK,eAAe,MAAA,EAAQ;AACrD,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,OAAO,EAAE,GAAG,IAAA,EAAM,UAAA,EAAY,QAAiB,MAAA,EAAQ,MAAA,IAAU,KAAK,MAAA,EAAO;AAAA,MAC/E;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAc,mBAAA,GAAqC;AACjD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,KAAK,OAAA,EAAS;AAAA,MACjB,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,MACrB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA,EAEQ,eAAe,KAAA,EAAqB;AAC1C,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,QAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GAAI,CAAA;AAC7E,IAAA,IAAI,UAAA,KAAe,KAAK,WAAA,EAAa;AACrC,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,IAAA,CAAK,IAAA,CAAK,qBAAA,EAAuB,EAAE,WAAA,EAAa,YAAY,CAAA;AAAA,EAC9D;AAAA,EAEQ,SAAA,CACN,IAAA,EACA,OAAA,EACA,WAAA,EAC+B;AAC/B,IAAA,MAAM,MAAA,GAAS,EAAE,IAAA,EAAM,OAAA,EAAS,WAAA,EAAY;AAC5C,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,MAAM,CAAA;AACzB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,IAAA,CACN,MACA,MAAA,EACM;AACN,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,IAAK,EAAC,EAAG,QAAA,CAAS,MAAM,CAAA;AAAA,EACxE;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAI,6BAAA,CAA8B,kBAAA,EAAoB,0EAAc,CAAA;AAAA,IAC5E;AAAA,EACF;AACF;AAEA,SAASJ,aAAAA,CAAa,OAAgB,KAAA,EAAuB;AAC3D,EAAA,MAAM,UAAA,GAAaI,gBAAe,KAAK,CAAA;AACvC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,6BAAA,CAA8B,uBAAA,EAAyB,CAAA,EAAG,KAAK,CAAA,+BAAA,CAAQ,CAAA;AAAA,EACnF;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAASA,gBAAe,KAAA,EAAwB;AAC9C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AACpD","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 sessionId: 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', 'session-id', '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\nconst SESSION_ID_PATTERN = /^[A-Za-z0-9._:-]{1,64}$/\n\n/**\n * Parses a structurally valid platform action from the final standalone JSON\n * block of an assistant response. Invalid or ambiguous input is returned\n * unchanged and is never made executable. Renderers must additionally compare\n * `action.sessionId` with the session that owns the assistant message.\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 !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 isAssistantActionSessionId(value: unknown): value is string {\n return typeof value === 'string' && SESSION_ID_PATTERN.test(value)\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"]}
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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@csntgao/ai-employee-client",
3
- "version": "0.15.0",
3
+ "version": "0.15.1",
4
4
  "description": "Browser client for Uniplat AI Employee sessions and realtime messages",
5
5
  "type": "module",
6
6
  "sideEffects": false,