@aiqa/sdk 2.5.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -42,7 +42,7 @@ type ApplicationVerificationSummary = {
42
42
  count_pending: number;
43
43
  /**
44
44
  * Facts flagged as suspicious when the call is reviewed — for instance the
45
- * agent leading the customer to the expected answer. Independent of the
45
+ * advisor leading the customer to the expected answer. Independent of the
46
46
  * answer: a matched fact can be flagged. Reads 0 while the call is running.
47
47
  */
48
48
  count_suspicious: number;
@@ -51,11 +51,8 @@ type Application = {
51
51
  application_id: string;
52
52
  client_name: string;
53
53
  client_phone_number: string;
54
+ /** The advisor's AIQA user id; `updateConversation()` returns it as `conversation.advisor_id`. */
54
55
  agent_id: string;
55
- /** Comes back empty. Set an agent name with `updateConversation()`. */
56
- agent_first_name: string;
57
- /** Comes back empty. Set an agent name with `updateConversation()`. */
58
- agent_last_name: string;
59
56
  /**
60
57
  * The status you last reported with `updateConversation({ externalStatus })`,
61
58
  * folded to lowercase by the server. Missing when you never reported one —
@@ -110,18 +107,15 @@ type UpdateConversationInput = {
110
107
  clientPhone?: string;
111
108
  clientEmail?: string;
112
109
  clientId?: string;
113
- /** The agent's AIQA user id. Takes precedence over `agentEmail`. */
114
- agentId?: string;
115
- /** Email of the agent's AIQA user. Results: README, Agent identification. */
116
- agentEmail?: string;
117
- agentName?: string;
110
+ /** The advisor's AIQA user id. Takes precedence over `advisorEmail`. */
118
111
  advisorId?: string;
119
- advisorName?: string;
112
+ /** Email of the advisor's AIQA user. Results: README, Advisor identification. */
113
+ advisorEmail?: string;
120
114
  agentGroups?: string[];
121
115
  externalStatus?: ExternalStatus | (string & {});
122
116
  };
123
117
  /** Decide with `code`, not `message`. Codes: README, ConversationWarning. */
124
- type ConversationWarningCode = "agent_not_found" | "agent_lookup_unavailable" | (string & {});
118
+ type ConversationWarningCode = "advisor_not_found" | "advisor_lookup_unavailable" | (string & {});
125
119
  /** Part of an `updateConversation()` that was not applied; the rest was saved. */
126
120
  interface ConversationWarning {
127
121
  code: ConversationWarningCode;
@@ -137,10 +131,7 @@ type UpdateConversationResult = {
137
131
  client_phone?: string;
138
132
  client_email?: string;
139
133
  client_id?: string;
140
- agent_id?: string;
141
- agent_name?: string;
142
134
  advisor_id?: string;
143
- advisor_name?: string;
144
135
  agent_groups?: string[];
145
136
  external_status?: string;
146
137
  };
@@ -211,7 +202,7 @@ type QuestionStatus = "searching" | "asked" | "not_asked";
211
202
  * `processing`.
212
203
  *
213
204
  * - `processing` queued, or nothing to go on yet
214
- * - `awaiting_question` the agent hasn't asked the question yet
205
+ * - `awaiting_question` the advisor hasn't asked the question yet
215
206
  * - `awaiting_answer` asked, the customer hasn't answered yet
216
207
  * - `partial` partial evidence so far (e.g. "305" of "30521")
217
208
  * - `pending_confirmation_matched` a matching answer is held briefly in case
@@ -256,7 +247,7 @@ interface AddFactResult {
256
247
  is_valid_answer: boolean;
257
248
  question_asked?: boolean;
258
249
  /**
259
- * How closely the agent's utterance matched the expected question, on a 0–1
250
+ * How closely the advisor's utterance matched the expected question, on a 0–1
260
251
  * or a 0–100 scale. Higher is closer.
261
252
  */
262
253
  question_match_score?: number;
package/dist/node/node.js CHANGED
@@ -70,7 +70,7 @@ var compareVersions = (left, right) => {
70
70
  // package.json
71
71
  var package_default = {
72
72
  name: "@aiqa/sdk",
73
- version: "2.5.0-develop.1",
73
+ version: "3.0.0-develop.1",
74
74
  main: "dist/node/node.js",
75
75
  module: "dist/node/node.js",
76
76
  types: "dist/node/node.d.ts",
@@ -434,8 +434,18 @@ var AiQaSdk = class {
434
434
  return result && result.data !== void 0 ? result.data : result;
435
435
  }
436
436
  async updateConversation(input) {
437
- const result = await this.sendMessage("UPDATE_CONVERSATION" /* UPDATE_CONVERSATION */, input);
438
- return result && result.data !== void 0 ? result.data : result;
437
+ const { advisorId, advisorEmail, ...fields } = input;
438
+ const result = await this.sendMessage("UPDATE_CONVERSATION" /* UPDATE_CONVERSATION */, {
439
+ ...fields,
440
+ agentId: advisorId,
441
+ agentEmail: advisorEmail
442
+ });
443
+ const data = result && result.data !== void 0 ? result.data : result;
444
+ if (!data?.conversation || !("agent_id" in data.conversation)) {
445
+ return data;
446
+ }
447
+ const { agent_id, ...conversation } = data.conversation;
448
+ return { ...data, conversation: { ...conversation, advisor_id: agent_id } };
439
449
  }
440
450
  async authenticate() {
441
451
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shared.ts","../../src/types.ts","../../src/utils/compareVersions.ts","../../package.json"],"sourcesContent":["import { io, Socket } from \"socket.io-client\";\nimport {\n Methods,\n Application,\n ApplicationFact,\n ApplicationFactInput,\n SdkEvent,\n IAiqaSdk,\n AddFactResult,\n FlagFactResult,\n SetConversationProductResult,\n SetConversationLanguageResult,\n UpdateConversationInput,\n UpdateConversationResult,\n ConversationLanguage,\n} from \"./types.js\";\nimport { compareVersions } from \"./utils/compareVersions.js\";\n// @ts-ignore - compiled builds resolve this at build time\nimport pkg from \"../package.json\";\n\nconst SDK_VERSION = (pkg as { version?: string }).version ?? \"0.0.1\";\nconst DEFAULT_URL = \"ws://localhost:3025/ws\";\nconst DEFAULT_TIMEOUT_MS = 60000; // 1 minute\n\nconst RUNTIME: \"browser\" | \"node\" =\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\"\n ? \"browser\"\n : \"node\";\n\nconst USER_AGENT: string =\n RUNTIME === \"browser\"\n ? typeof navigator !== \"undefined\"\n ? navigator.userAgent\n : \"browser/unknown\"\n : typeof process !== \"undefined\"\n ? `node ${process.version} ${process.platform}`\n : \"node/unknown\";\n\nfunction isRequestTimeout(error: unknown, method: Methods): boolean {\n return (\n error instanceof Error &&\n error.message === `Request timed out for ${method}`\n );\n}\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as PromiseLike<unknown>).then === \"function\"\n );\n}\n\n// Fires the trailing ack callback (when present) after delivering the\n// payload to user code. Throws and async rejections are routed to\n// console.error — propagating them would skip subsequent listeners in\n// @socket.io/component-emitter's untryCatched loop.\n//\n// Auto-parses string args as JSON. The backend's broadcast emits\n// (`FACT_VERIFIED`, `TRANSCRIPTION_UPDATED`, `CALL_STATUS_UPDATED`) all\n// send `JSON.stringify(...)` payloads, but `FactVerifiedPayload` and\n// friends are typed as plain objects. Without this parse, a consumer\n// writing `payload.factId` would read a property off a string and get\n// `undefined`. Strings that don't parse (e.g. a primitive event name)\n// pass through unchanged.\nexport function wrapEventHandler(\n callback: (...args: any[]) => any,\n): (...args: any[]) => void {\n return (...args: any[]) => {\n const last = args[args.length - 1];\n const hasAck = typeof last === \"function\";\n const rawPayload = hasAck ? args.slice(0, -1) : args;\n const payload = rawPayload.map((arg) => {\n if (typeof arg !== \"string\") return arg;\n try {\n return JSON.parse(arg);\n } catch {\n return arg;\n }\n });\n try {\n const handlerResult = callback(...payload);\n if (isThenable(handlerResult)) {\n handlerResult.then(undefined, (err) => {\n // eslint-disable-next-line no-console\n console.error(\"[AiQaSdk] async event handler rejected:\", err);\n });\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[AiQaSdk] event handler threw:\", err);\n } finally {\n if (hasAck) {\n try {\n last();\n } catch {\n /* swallow */\n }\n }\n }\n };\n}\n\nclass AiQaSdk implements IAiqaSdk {\n socket: Socket | null = null;\n url: string;\n applicationId: string;\n applicationSecretKey: string;\n cachedApplication?: Application;\n internalListeners: Map<SdkEvent, Set<(...args: any[]) => void>>;\n internalEvents: Set<SdkEvent>;\n // event → originalCallback → Set<wrappedCallback> registered on\n // socket.io. A Set per (event, callback) so that subscribing the\n // same fn twice registers two wrappers and two off() calls clear\n // both.\n private wrappersByEvent: Map<\n SdkEvent,\n Map<(...args: any[]) => any, Set<(...args: any[]) => void>>\n > = new Map();\n\n constructor(applicationId: string, applicationSecret: string, url?: string) {\n this.url = url ?? DEFAULT_URL;\n this.internalListeners = new Map();\n this.internalEvents = new Set([\"authenticated\"]);\n\n if (applicationId && applicationSecret) {\n this.applicationId = applicationId;\n this.applicationSecretKey = applicationSecret;\n } else {\n throw new Error(\"Application id and application secret are required\");\n }\n }\n\n on(name: SdkEvent, callback: (...args: any[]) => any) {\n if (this.internalEvents.has(name)) {\n if (!this.internalListeners.has(name)) {\n this.internalListeners.set(name, new Set());\n }\n this.internalListeners.get(name)!.add(callback);\n return;\n }\n\n if (!this.socket) {\n throw new Error(\"Not connected\");\n }\n\n if (this.isManagerEvent(name)) {\n this.socket.io.on(name, callback);\n } else {\n const wrapped = wrapEventHandler(callback);\n let wrappersByCallback = this.wrappersByEvent.get(name);\n if (!wrappersByCallback) {\n wrappersByCallback = new Map();\n this.wrappersByEvent.set(name, wrappersByCallback);\n }\n let wrappers = wrappersByCallback.get(callback);\n if (!wrappers) {\n wrappers = new Set();\n wrappersByCallback.set(callback, wrappers);\n }\n wrappers.add(wrapped);\n this.socket.on(name, wrapped);\n }\n }\n\n off(name: SdkEvent, callback?: (...args: any[]) => any) {\n if (this.internalEvents.has(name)) {\n if (!callback) {\n this.internalListeners.delete(name);\n return;\n }\n const handlers = this.internalListeners.get(name);\n if (handlers) {\n handlers.delete(callback);\n if (handlers.size === 0) {\n this.internalListeners.delete(name);\n }\n }\n return;\n }\n\n if (!this.socket) {\n throw new Error(\"Not connected\");\n }\n\n if (this.isManagerEvent(name)) {\n this.socket.io.off(name, callback);\n return;\n }\n\n if (!callback) {\n this.socket.off(name);\n this.wrappersByEvent.delete(name);\n return;\n }\n\n const wrappersByCallback = this.wrappersByEvent.get(name);\n const wrappers = wrappersByCallback?.get(callback);\n if (wrappers && wrappers.size > 0) {\n const wrapped = wrappers.values().next().value as (\n ...args: any[]\n ) => void;\n wrappers.delete(wrapped);\n this.socket.off(name, wrapped);\n if (wrappers.size === 0) {\n wrappersByCallback!.delete(callback);\n if (wrappersByCallback!.size === 0) {\n this.wrappersByEvent.delete(name);\n }\n }\n } else {\n this.socket.off(name, callback);\n }\n }\n\n connect() {\n if (!this.url) {\n return;\n }\n\n const url = new URL(this.url);\n\n const socketOptions: any = {\n reconnectionDelayMax: 10000,\n path: url.pathname,\n // WebSocket only, skipping engine.io's default HTTP long-polling phase.\n // Some embedders sit behind proxies/security gateways that duplicate the\n // polling GETs across a fleet; the concurrent polls violate engine.io's\n // one-inflight-poll-per-session rule and tear the session down, so every\n // poll then returns \"Session ID unknown\" (HTTP 400) and the client never\n // authenticates. A single WebSocket has no repeated requests to duplicate.\n transports: [\"websocket\"],\n };\n\n this.socket = io(url.origin, socketOptions);\n\n this.socket.on(\"connect\", () => {\n this.authenticate();\n });\n\n this.socket.on(\n \"app_version\",\n wrapEventHandler((payload: any) => {\n const minVersion = payload?.min;\n const maxVersion = payload?.max;\n\n if (minVersion || maxVersion) {\n const tooLow = minVersion\n ? compareVersions(SDK_VERSION, minVersion) < 0\n : false;\n const tooHigh = maxVersion\n ? compareVersions(SDK_VERSION, maxVersion) > 0\n : false;\n if (tooLow || tooHigh) {\n const error = new Error(\n `SDK version ${SDK_VERSION} is not supported. Supported range: ${minVersion || \"-\"} to ${maxVersion || \"-\"}.`,\n );\n this.socket!.disconnect();\n this.socket!.emit(\"error\", error);\n }\n }\n }),\n );\n }\n\n disconnect() {\n if (this.socket) {\n this.socket.disconnect();\n }\n this.wrappersByEvent.clear();\n }\n\n sendMessage(method: Methods, data?: any): Promise<any> {\n return new Promise((resolve, reject) => {\n if (!this.socket || !this.socket.connected) {\n reject(new Error(\"Socket is not connected\"));\n return;\n }\n\n const requestId = this.createRequestId();\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const handler = (payload: any) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n this.socket!.off(requestId, handler);\n let parsed = payload;\n if (typeof payload === \"string\") {\n try {\n parsed = JSON.parse(payload);\n } catch (error) {\n parsed = payload;\n }\n }\n\n if (parsed && parsed.error !== undefined) {\n reject(parsed.error);\n return;\n }\n\n // Return the full parsed envelope. Every caller below\n // (addFact, getFacts, flagFact, set*) already does its own\n // `result.data !== undefined ? result.data : result` unwrap,\n // so removing the unwrap here is behaviourally a no-op for\n // them — but it exposes top-level envelope fields like\n // `verification_status` to addFact() so the terminal\n // resolution can carry them alongside the inner data block.\n resolve(parsed);\n };\n\n this.socket.on(requestId, handler);\n\n const payload =\n data && typeof data === \"object\"\n ? { ...data, requestId }\n : { requestId, data };\n this.socket.emit(method, JSON.stringify(payload));\n\n timeout = setTimeout(() => {\n this.socket!.off(requestId, handler);\n reject(new Error(`Request timed out for ${method}`));\n }, DEFAULT_TIMEOUT_MS);\n });\n }\n\n async getApplication(): Promise<Application> {\n try {\n const result = await this.sendMessage(Methods.GET_APPLICATION);\n const application =\n result && result.data !== undefined ? result.data : result;\n if (application && application.application_id !== undefined) {\n return application;\n }\n throw new Error(\"GET_APPLICATION returned no application\");\n } catch (error) {\n // Only a server that predates GET_APPLICATION is worth absorbing: it\n // never answers, so the request can only end in a timeout. Anything else\n // — a rejected request, a dropped socket, a server-side failure — is a\n // real error, and swallowing it would hand back the authentication\n // snapshot as though it were live.\n if (!isRequestTimeout(error, Methods.GET_APPLICATION)) {\n throw error;\n }\n }\n\n // Never overwritten by this method, so it stays the snapshot taken at\n // authentication: identity fields only, no `verification`. That absence is\n // the signal the caller reads — a stale summary would be indistinguishable\n // from a live one.\n if (this.cachedApplication) {\n return this.cachedApplication;\n }\n throw new Error(\n \"Application is not available yet. Wait for authentication to complete.\",\n );\n }\n\n async getFacts(): Promise<ApplicationFact[]> {\n const result = await this.sendMessage(Methods.GET_FACTS);\n return result && result.data !== undefined ? result.data : result;\n }\n\n async addFact(fact: ApplicationFactInput): Promise<AddFactResult> {\n // No `?? false` for `prefilled`, unlike critical/is_skipped: defaulting it\n // would relabel every existing integration's facts as agent-entered.\n const payload = {\n ...fact,\n critical: fact.critical ?? false,\n is_skipped: fact.is_skipped ?? false,\n };\n const result = await this.sendMessage(Methods.ADD_FACT, payload);\n if (!result) return result;\n const inner = result.data !== undefined ? result.data : result;\n\n // Older backends emit only `data` (or even a primitive like\n // `true`). New backends emit a `FactVerifiedResponseDto` envelope\n // carrying `verification_status` / `matched_components` /\n // `missing_components` at the top level ALONGSIDE the inner\n // `FactVerifiedDataDto`. Merge the envelope onto the resolved\n // value so callers awaiting addFact() see the full terminal\n // shape without subscribing to the broadcast `FACT_VERIFIED`\n // event. Skip the merge when the envelope is absent OR when inner\n // is not an object — spreading a primitive (`{ ...true }`) would\n // silently turn the resolution into `{}`.\n const hasEnvelope =\n result.verification_status !== undefined ||\n result.matched_components !== undefined ||\n result.missing_components !== undefined ||\n result.warnings !== undefined;\n if (!hasEnvelope || typeof inner !== \"object\" || inner === null) {\n return inner;\n }\n const merged = { ...inner } as AddFactResult;\n if (result.verification_status !== undefined) {\n merged.verification_status = result.verification_status;\n }\n if (result.matched_components !== undefined) {\n merged.matched_components = result.matched_components;\n }\n if (result.missing_components !== undefined) {\n merged.missing_components = result.missing_components;\n }\n if (result.warnings !== undefined) {\n merged.warnings = result.warnings;\n }\n return merged;\n }\n\n async flagFact(factId: string): Promise<FlagFactResult> {\n const result = await this.sendMessage(Methods.FLAG_FACT, {\n factId,\n });\n return result && result.data !== undefined ? result.data : result;\n }\n\n async setConversationProduct(\n product: string,\n ): Promise<SetConversationProductResult> {\n const result = await this.sendMessage(Methods.SET_CONVERSATION_PRODUCT, {\n product,\n });\n return result && result.data !== undefined ? result.data : result;\n }\n\n async setConversationLanguage(\n language: ConversationLanguage,\n ): Promise<SetConversationLanguageResult> {\n const result = await this.sendMessage(Methods.SET_CONVERSATION_LANGUAGE, {\n language,\n });\n return result && result.data !== undefined ? result.data : result;\n }\n\n async updateConversation(\n input: UpdateConversationInput,\n ): Promise<UpdateConversationResult> {\n const result = await this.sendMessage(Methods.UPDATE_CONVERSATION, input);\n return result && result.data !== undefined ? result.data : result;\n }\n\n async authenticate(): Promise<void> {\n try {\n const result = await this.sendMessage(Methods.AUTHENTICATE, {\n applicationId: this.applicationId,\n applicationSecretKey: this.applicationSecretKey,\n sdkVersion: SDK_VERSION,\n runtime: RUNTIME,\n userAgent: USER_AGENT,\n });\n\n const application =\n result && result.data !== undefined ? result.data : result;\n\n this.cachedApplication = application;\n\n this.emitInternal(\"authenticated\", application);\n } catch (error) {\n this.socket!.emit(\"error\", error);\n }\n }\n\n async startRecording(): Promise<boolean> {\n const result = await this.sendMessage(Methods.START_RECORDING);\n return result && result.data !== undefined ? result.data : result;\n }\n\n async stopRecording(): Promise<boolean> {\n const result = await this.sendMessage(Methods.STOP_RECORDING);\n return result && result.data !== undefined ? result.data : result;\n }\n\n async isRecordingNow(): Promise<boolean> {\n // @TODO: track it from the server, should be sent on successfull connect\n const result = await this.sendMessage(Methods.IS_RECORDING);\n return result && result.data !== undefined ? result.data : result;\n }\n\n private emitInternal(name: SdkEvent, ...args: any[]) {\n const handlers = this.internalListeners.get(name);\n if (!handlers) {\n return;\n }\n handlers.forEach((handler) => handler(...args));\n }\n\n private createRequestId() {\n return `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n private isManagerEvent(name: SdkEvent) {\n return (\n name === \"reconnect_attempt\" ||\n name === \"reconnect_error\" ||\n name === \"reconnect_failed\" ||\n name === \"error\"\n );\n }\n}\n\nexport default AiQaSdk;\n","/**\n * Overall result for the call: `critical_errors` if a fact you sent with\n * `critical: true` failed, `errors` if any other fact failed, else\n * `no_errors`.\n *\n * Only answers count. A question that was never asked never raises it, so a\n * call where nothing was asked reads `no_errors`.\n *\n * Not the same as `VerificationStatus`, which describes a single fact.\n */\nexport type ApplicationVerificationStatus =\n | \"no_errors\"\n | \"errors\"\n | \"critical_errors\";\n\n/**\n * How the facts on one application are counted up. None of these is a count of\n * facts that passed, and they overlap — to show a pass count, count the facts\n * whose `verification_status` is `matched` in `getFacts()`.\n */\nexport type ApplicationVerificationSummary = {\n status: ApplicationVerificationStatus;\n /** Facts whose answer did not match the expected one. */\n count_errors: number;\n /** The facts in `count_errors` that you sent with `critical: true`. */\n count_critical_errors: number;\n /**\n * Every fact on the application, checked or not. The other counters are\n * subsets of it and can overlap each other, so no subtraction from\n * `count_total` yields a pass count.\n */\n count_total: number;\n /**\n * Facts whose question was never asked. Excludes the still-pending ones, but\n * overlaps `count_errors`: a fact never asked that came back wrong is in both.\n */\n count_not_asked: number;\n /** The facts in `count_not_asked` that you sent with `critical: true`. */\n count_critical_not_asked: number;\n /**\n * Facts added but not resolved yet. During a live call most facts sit here\n * and move into the other counters as their results arrive.\n */\n count_pending: number;\n /**\n * Facts flagged as suspicious when the call is reviewed — for instance the\n * agent leading the customer to the expected answer. Independent of the\n * answer: a matched fact can be flagged. Reads 0 while the call is running.\n */\n count_suspicious: number;\n};\n\nexport type Application = {\n application_id: string;\n client_name: string;\n client_phone_number: string;\n agent_id: string;\n /** Comes back empty. Set an agent name with `updateConversation()`. */\n agent_first_name: string;\n /** Comes back empty. Set an agent name with `updateConversation()`. */\n agent_last_name: string;\n /**\n * The status you last reported with `updateConversation({ externalStatus })`,\n * folded to lowercase by the server. Missing when you never reported one —\n * which is not the same as `\"draft\"`. Unlike the fields above it is never in\n * the authentication snapshot, so on the fallback path described under\n * `verification` it is absent rather than stale.\n *\n * Same open union as the input side: the members autocomplete, and a status\n * the server learns before this package does still type-checks.\n */\n external_status?: ExternalStatus | (string & {});\n /**\n * How the call is going so far. When it is missing there is no summary —\n * which is not the same as all zeros — and the fields above may then be the\n * ones from authentication, without an `updateConversation()` you made since.\n */\n verification?: ApplicationVerificationSummary;\n};\n\nexport enum Methods {\n AUTHENTICATE = \"AUTHENTICATE\",\n GET_FACTS = \"GET_FACTS\",\n GET_APPLICATION = \"GET_APPLICATION\",\n START_RECORDING = \"START_RECORDING\",\n STOP_RECORDING = \"STOP_RECORDING\",\n IS_RECORDING = \"IS_RECORDING\",\n ADD_FACT = \"ADD_FACT\",\n FLAG_FACT = \"FLAG_FACT\",\n SET_CONVERSATION_PRODUCT = \"SET_CONVERSATION_PRODUCT\",\n SET_CONVERSATION_LANGUAGE = \"SET_CONVERSATION_LANGUAGE\",\n UPDATE_CONVERSATION = \"UPDATE_CONVERSATION\",\n}\n\nexport type SetConversationProductResult = {\n success: boolean;\n product: string;\n};\n\nexport type SetConversationLanguageResult = {\n success: boolean;\n language: string;\n};\n\n/** User-provided application status. */\nexport enum ExternalStatus {\n DRAFT = \"draft\",\n PENDING = \"pending\",\n COMPLETED = \"completed\",\n EXPIRED = \"expired\",\n CLOSED = \"closed\",\n}\n\nexport type UpdateConversationInput = {\n policyNumber?: string;\n insuredPhone?: string;\n clientName?: string;\n clientPhone?: string;\n clientEmail?: string;\n clientId?: string;\n /** The agent's AIQA user id. Takes precedence over `agentEmail`. */\n agentId?: string;\n /** Email of the agent's AIQA user. Results: README, Agent identification. */\n agentEmail?: string;\n agentName?: string;\n advisorId?: string;\n advisorName?: string;\n agentGroups?: string[];\n externalStatus?: ExternalStatus | (string & {});\n};\n\n/** Decide with `code`, not `message`. Codes: README, ConversationWarning. */\nexport type ConversationWarningCode =\n | \"agent_not_found\"\n | \"agent_lookup_unavailable\"\n | (string & {});\n\n/** Part of an `updateConversation()` that was not applied; the rest was saved. */\nexport interface ConversationWarning {\n code: ConversationWarningCode;\n message: string;\n}\n\n/** `conversation` holds the fields you sent; `warnings` only when part was not applied. */\nexport type UpdateConversationResult = {\n success: boolean;\n conversation: {\n policy_number?: string;\n insured_phone?: string;\n client_name?: string;\n client_phone?: string;\n client_email?: string;\n client_id?: string;\n agent_id?: string;\n agent_name?: string;\n advisor_id?: string;\n advisor_name?: string;\n agent_groups?: string[];\n external_status?: string;\n };\n warnings?: ConversationWarning[];\n};\n\nexport enum ConversationLanguage {\n EN = \"en\",\n ES = \"es\",\n FR = \"fr\",\n}\n\nexport type SdkEvent =\n | Methods\n | \"connect\"\n | \"disconnect\"\n | \"close\"\n | \"error\"\n | \"reconnect_attempt\"\n | \"reconnect_error\"\n | \"reconnect_failed\"\n | \"authenticated\"\n | \"app_version\"\n // Every verification state change, for every fact. Payload:\n // `FactVerifiedPayload`.\n | \"FACT_VERIFIED\"\n // Every utterance, as it is transcribed. Payload: `TranscriptionUpdate`.\n | \"TRANSCRIPTION_UPDATED\";\n\nexport enum FactAnswerFormatType {\n string = \"STRING\",\n number = \"NUMBER\",\n integer = \"INT\",\n float = \"FLOAT\",\n bool = \"BOOL\",\n list = \"LIST\",\n strict = \"STRICT\",\n single_choice = \"SINGLE_CHOICE\",\n multiple_choices = \"MULTIPLE_CHOICES\",\n}\n\nexport type ApplicationFactAnswerChoice = {\n key: string;\n text: string;\n};\n\nexport type ApplicationFactAnswerFormat = {\n type: FactAnswerFormatType;\n choices?: ApplicationFactAnswerChoice[];\n};\n\nexport type ApplicationFactInput = {\n id: string;\n /**\n * Stable identifier for the underlying question, shared across applications\n * and conversations. When provided it identifies the question instead of\n * `id`. Keep it consistent across calls: whatever AIQA has tuned for a\n * question is attached to this identity.\n */\n questionId?: string;\n question: string;\n expected_answer: any;\n answer_format: ApplicationFactAnswerFormat;\n\n category_id?: string;\n category_name?: string;\n language?: string;\n\n /**\n * Mark the question critical: its failures land in `count_critical_errors`,\n * and one of them sets the call's `status` to `critical_errors`.\n */\n critical?: boolean;\n is_skipped?: boolean;\n /** Optional (default: `false`). Use `true` when the fact was collected before the conversation started. It is stored, not verified. */\n prefilled?: boolean;\n /**\n * Your own identifiers for this fact — a form field ID, a section name,\n * anything that lets your UI map the result back to the right place.\n * `getFacts()` returns it unchanged — `{}` for a fact you added without\n * one — and it plays no part in verification.\n *\n * Keys and values must all be strings, and each value is limited to 1024\n * characters. A payload that breaks either rule is rejected.\n */\n metadata?: Record<string, string>;\n};\n\nexport type QuestionStatus = \"searching\" | \"asked\" | \"not_asked\";\n\n/**\n * Per-fact verification state. Handle any value you don't recognize as\n * `processing`.\n *\n * - `processing` queued, or nothing to go on yet\n * - `awaiting_question` the agent hasn't asked the question yet\n * - `awaiting_answer` asked, the customer hasn't answered yet\n * - `partial` partial evidence so far (e.g. \"305\" of \"30521\")\n * - `pending_confirmation_matched` a matching answer is held briefly in case\n * the customer corrects it mid-answer\n * (spellings, \"I mean…\"); resolves to\n * `matched`/`unmatched`\n * - `pending_confirmation_unmatched` same, with an unmatched answer held; show\n * \"we heard X but it doesn't match, waiting\n * to confirm\" rather than a hard result\n * - `matched` final: the answer matched\n * - `unmatched` final: the answer did not match\n */\nexport type VerificationStatus =\n | \"processing\"\n | \"awaiting_question\"\n | \"awaiting_answer\"\n | \"partial\"\n | \"pending_confirmation_matched\"\n | \"pending_confirmation_unmatched\"\n | \"matched\"\n | \"unmatched\";\n\nexport type ApplicationFact = ApplicationFactInput & {\n ai_answer?: any;\n question_status: QuestionStatus;\n verification_status: VerificationStatus;\n /** True once `flagFact(factId)` has been called for this fact. */\n flagged: boolean;\n};\n\n/**\n * Why part of an `addFact()` was not applied. Use it to choose what to do; do\n * not parse `message`. Later versions may add codes: log `message` and\n * continue. See \"FactWarning\" in the README.\n */\nexport type FactWarningCode = \"category_not_found\" | (string & {});\n\n/** Part of an `addFact()` that was not applied. The rest of the fact is saved. */\nexport interface FactWarning {\n code: FactWarningCode;\n message: string;\n}\n\nexport interface AddFactResult {\n /** Conversation the fact was attached to. */\n conversation_id?: string;\n /** Echo of the original question text from the fact input. */\n question?: string;\n /** Echo of the resolved `answer_format.type` (e.g. \"STRING\", \"NUMBER\", \"SINGLE_CHOICE\"). */\n answer_type?: string;\n agent_answer?: string;\n ai_answer?: string;\n /** `false` for a fact that was never verified, such as a prefilled one. */\n is_valid_answer: boolean;\n question_asked?: boolean;\n /**\n * How closely the agent's utterance matched the expected question, on a 0–1\n * or a 0–100 scale. Higher is closer.\n */\n question_match_score?: number;\n /**\n * 0–1 score for how closely the customer's answer matched the expected one.\n * Undefined when there is no partial signal to score.\n */\n answer_match_score?: number;\n metadata?: Record<string, string>;\n /**\n * The final state: `matched` or `unmatched` whenever it is present. Fall\n * back to `is_valid_answer` when it is missing.\n */\n verification_status?: VerificationStatus;\n /**\n * Component labels describing which parts of the expected answer\n * matched. Currently `[\"prefix\"]` / `[\"suffix\"]` for numeric facts;\n * treat the set as open-ended.\n */\n matched_components?: string[];\n missing_components?: string[];\n /** Present only when part of this `addFact()` was not applied. */\n warnings?: FactWarning[];\n}\n\n/**\n * Payload of the `FACT_VERIFIED` event, which fires on every state change —\n * see `VerificationStatus`. Use it to show progress; `addFact()` resolves\n * only once a fact is done.\n */\nexport interface FactVerifiedPayload {\n factId: string;\n success: boolean;\n verification_status?: VerificationStatus;\n question_match_score?: number;\n answer_match_score?: number;\n matched_components?: string[];\n missing_components?: string[];\n /** Inner payload, shaped like `AddFactResult` without `warnings`. */\n data?: Omit<AddFactResult, \"warnings\">;\n error?: string;\n}\n\nexport type FlagFactResult = {\n success: boolean;\n};\n\n/**\n * What the utterance appears to be doing in the conversation. A best-effort\n * guess: display it if it helps, but do not gate behaviour on it. Its\n * confidence band is `dialog_act_confidence`.\n */\nexport type DialogAct =\n | \"question\"\n | \"answer\"\n | \"acknowledgement\"\n | \"filler\"\n | \"other\";\n\n/**\n * Confidence band for `dialog_act` only. Unrelated to the numeric\n * `confidence` field on the same utterance — do not compare the two.\n */\nexport type DialogActConfidence = \"high\" | \"medium\" | \"low\";\n\n/**\n * An utterance from the `TRANSCRIPTION_UPDATED` event.\n *\n * A missing optional field means \"unknown\", not \"no\".\n */\nexport type Utterance = {\n /** Sort utterances by this: ids sort in chronological order. */\n id: string;\n call_id: number;\n /** Always 0. Sort by `id`, not this. */\n order: number;\n is_agent: boolean | null;\n speaker: number;\n text: string;\n text_en: string | null;\n start_time: number;\n end_time: number;\n dialog_act?: DialogAct;\n dialog_act_confidence?: DialogActConfidence;\n confidence?: number | null;\n top_alt_margin?: number | null;\n is_ivr_filler_candidate?: boolean;\n spoken_digits_normalized?: string | null;\n vendor?: string | null;\n};\n\n/** Payload of the `TRANSCRIPTION_UPDATED` broadcast event. */\nexport type TranscriptionUpdate = {\n policyNumber: string;\n conversationId: string;\n utterance: Utterance;\n};\n\nexport type SdkError = {\n code:\n | \"INVALID_CONFIG\"\n | \"CONNECTION_ERROR\"\n | \"TIMEOUT\"\n | \"SERVER_ERROR\"\n | \"UNEXPECTED_RESPONSE\";\n message: string;\n details?: any;\n};\n\nexport abstract class IAiqaSdk {\n abstract connect(): void;\n abstract disconnect(): void;\n\n abstract on(eventName: string, callback: (...args: any[]) => any): void;\n abstract off(eventName: string, callback?: (...args: any[]) => any): void;\n\n abstract getApplication(): Promise<Application>;\n abstract addFact(fact: ApplicationFactInput): Promise<AddFactResult>;\n abstract flagFact(factId: string): Promise<FlagFactResult>;\n abstract getFacts(): Promise<ApplicationFact[]>;\n abstract setConversationProduct(\n product: string,\n ): Promise<SetConversationProductResult>;\n abstract setConversationLanguage(\n language: ConversationLanguage,\n ): Promise<SetConversationLanguageResult>;\n abstract updateConversation(\n input: UpdateConversationInput,\n ): Promise<UpdateConversationResult>;\n}\n","const splitVersion = (value: string) => {\n const [core] = value.split(\"-\", 2);\n return core.split(\".\").map((part) => Number(part));\n};\n\nexport const compareVersions = (left: string, right: string): number => {\n const leftParts = splitVersion(left);\n const rightParts = splitVersion(right);\n const maxLength = Math.max(leftParts.length, rightParts.length);\n\n for (let i = 0; i < maxLength; i += 1) {\n const l = leftParts[i] ?? 0;\n const r = rightParts[i] ?? 0;\n if (l > r) {\n return 1;\n }\n if (l < r) {\n return -1;\n }\n }\n\n return 0;\n};\n","{\n \"name\": \"@aiqa/sdk\",\n \"version\": \"2.5.0-develop.1\",\n \"main\": \"dist/node/node.js\",\n \"module\": \"dist/node/node.js\",\n \"types\": \"dist/node/node.d.ts\",\n \"engines\": {\n \"node\": \">=18\"\n },\n \"scripts\": {\n \"build\": \"tsup && node -e \\\"const fs=require('fs');['dist/node/node','dist/browser/browser'].forEach(f=>{const mts=f+'.d.mts';const ts=f+'.d.ts';if(fs.existsSync(mts)){fs.renameSync(mts,ts);}});\\\"\",\n \"commitlint\": \"commitlint\",\n \"dev:node\": \"tsx src/node.ts\",\n \"lint\": \"tsc --noEmit -p tsconfig.json\",\n \"format\": \"prettier --check \\\"{src,tests}/**/*.{ts,tsx,js,json,md,yml,yaml}\\\" \\\"*.{js,json,md,yml,yaml,ts}\\\" --ignore-path .prettierignore\",\n \"release\": \"semantic-release\",\n \"start:node\": \"node dist/node/node.js\",\n \"serve:browser\": \"serve .\",\n \"test\": \"jest\",\n \"prepare\": \"husky\",\n \"lint-staged\": \"lint-staged\"\n },\n \"lint-staged\": {\n \"*.{ts,tsx,js,json,md,yml,yaml}\": [\n \"prettier --write\"\n ]\n },\n \"exports\": {\n \".\": {\n \"node\": {\n \"import\": \"./dist/node/node.js\",\n \"types\": \"./dist/node/node.d.ts\"\n },\n \"browser\": {\n \"import\": \"./dist/browser/browser.js\",\n \"types\": \"./dist/browser/browser.d.ts\"\n },\n \"default\": \"./dist/node/node.js\"\n }\n },\n \"private\": false,\n \"license\": \"MIT\",\n \"author\": \"AIQA\",\n \"description\": \"TypeScript/JavaScript SDK for interacting with the AIQA.\",\n \"keywords\": [\n \"aiqa\",\n \"sdk\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"devDependencies\": {\n \"@commitlint/cli\": \"^20.4.4\",\n \"@commitlint/config-conventional\": \"^20.4.4\",\n \"@jest/globals\": \"^29.7.0\",\n \"@semantic-release/commit-analyzer\": \"^13.0.1\",\n \"@semantic-release/git\": \"^10.0.1\",\n \"@semantic-release/npm\": \"^12.0.2\",\n \"@semantic-release/release-notes-generator\": \"^14.1.0\",\n \"@types/node\": \"^22.0.0\",\n \"conventional-changelog-conventionalcommits\": \"^9.3.0\",\n \"esbuild\": \"^0.23.0\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^29.7.0\",\n \"lint-staged\": \"^16.4.0\",\n \"prettier\": \"^3.8.1\",\n \"semantic-release\": \"^24.2.9\",\n \"serve\": \"^14.2.3\",\n \"socket.io\": \"^4.7.5\",\n \"ts-jest\": \"^29.2.3\",\n \"ts-node\": \"^10.9.2\",\n \"tsup\": \"^8.0.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.7.0\"\n },\n \"dependencies\": {\n \"socket.io-client\": \"^4.7.5\"\n }\n}\n"],"mappings":"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","names":["Methods","ExternalStatus","ConversationLanguage","FactAnswerFormatType","payload"]}
1
+ {"version":3,"sources":["../../src/shared.ts","../../src/types.ts","../../src/utils/compareVersions.ts","../../package.json"],"sourcesContent":["import { io, Socket } from \"socket.io-client\";\nimport {\n Methods,\n Application,\n ApplicationFact,\n ApplicationFactInput,\n SdkEvent,\n IAiqaSdk,\n AddFactResult,\n FlagFactResult,\n SetConversationProductResult,\n SetConversationLanguageResult,\n UpdateConversationInput,\n UpdateConversationResult,\n ConversationLanguage,\n} from \"./types.js\";\nimport { compareVersions } from \"./utils/compareVersions.js\";\n// @ts-ignore - compiled builds resolve this at build time\nimport pkg from \"../package.json\";\n\nconst SDK_VERSION = (pkg as { version?: string }).version ?? \"0.0.1\";\nconst DEFAULT_URL = \"ws://localhost:3025/ws\";\nconst DEFAULT_TIMEOUT_MS = 60000; // 1 minute\n\nconst RUNTIME: \"browser\" | \"node\" =\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\"\n ? \"browser\"\n : \"node\";\n\nconst USER_AGENT: string =\n RUNTIME === \"browser\"\n ? typeof navigator !== \"undefined\"\n ? navigator.userAgent\n : \"browser/unknown\"\n : typeof process !== \"undefined\"\n ? `node ${process.version} ${process.platform}`\n : \"node/unknown\";\n\nfunction isRequestTimeout(error: unknown, method: Methods): boolean {\n return (\n error instanceof Error &&\n error.message === `Request timed out for ${method}`\n );\n}\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as PromiseLike<unknown>).then === \"function\"\n );\n}\n\n// Fires the trailing ack callback (when present) after delivering the\n// payload to user code. Throws and async rejections are routed to\n// console.error — propagating them would skip subsequent listeners in\n// @socket.io/component-emitter's untryCatched loop.\n//\n// Auto-parses string args as JSON. The backend's broadcast emits\n// (`FACT_VERIFIED`, `TRANSCRIPTION_UPDATED`, `CALL_STATUS_UPDATED`) all\n// send `JSON.stringify(...)` payloads, but `FactVerifiedPayload` and\n// friends are typed as plain objects. Without this parse, a consumer\n// writing `payload.factId` would read a property off a string and get\n// `undefined`. Strings that don't parse (e.g. a primitive event name)\n// pass through unchanged.\nexport function wrapEventHandler(\n callback: (...args: any[]) => any,\n): (...args: any[]) => void {\n return (...args: any[]) => {\n const last = args[args.length - 1];\n const hasAck = typeof last === \"function\";\n const rawPayload = hasAck ? args.slice(0, -1) : args;\n const payload = rawPayload.map((arg) => {\n if (typeof arg !== \"string\") return arg;\n try {\n return JSON.parse(arg);\n } catch {\n return arg;\n }\n });\n try {\n const handlerResult = callback(...payload);\n if (isThenable(handlerResult)) {\n handlerResult.then(undefined, (err) => {\n // eslint-disable-next-line no-console\n console.error(\"[AiQaSdk] async event handler rejected:\", err);\n });\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[AiQaSdk] event handler threw:\", err);\n } finally {\n if (hasAck) {\n try {\n last();\n } catch {\n /* swallow */\n }\n }\n }\n };\n}\n\nclass AiQaSdk implements IAiqaSdk {\n socket: Socket | null = null;\n url: string;\n applicationId: string;\n applicationSecretKey: string;\n cachedApplication?: Application;\n internalListeners: Map<SdkEvent, Set<(...args: any[]) => void>>;\n internalEvents: Set<SdkEvent>;\n // event → originalCallback → Set<wrappedCallback> registered on\n // socket.io. A Set per (event, callback) so that subscribing the\n // same fn twice registers two wrappers and two off() calls clear\n // both.\n private wrappersByEvent: Map<\n SdkEvent,\n Map<(...args: any[]) => any, Set<(...args: any[]) => void>>\n > = new Map();\n\n constructor(applicationId: string, applicationSecret: string, url?: string) {\n this.url = url ?? DEFAULT_URL;\n this.internalListeners = new Map();\n this.internalEvents = new Set([\"authenticated\"]);\n\n if (applicationId && applicationSecret) {\n this.applicationId = applicationId;\n this.applicationSecretKey = applicationSecret;\n } else {\n throw new Error(\"Application id and application secret are required\");\n }\n }\n\n on(name: SdkEvent, callback: (...args: any[]) => any) {\n if (this.internalEvents.has(name)) {\n if (!this.internalListeners.has(name)) {\n this.internalListeners.set(name, new Set());\n }\n this.internalListeners.get(name)!.add(callback);\n return;\n }\n\n if (!this.socket) {\n throw new Error(\"Not connected\");\n }\n\n if (this.isManagerEvent(name)) {\n this.socket.io.on(name, callback);\n } else {\n const wrapped = wrapEventHandler(callback);\n let wrappersByCallback = this.wrappersByEvent.get(name);\n if (!wrappersByCallback) {\n wrappersByCallback = new Map();\n this.wrappersByEvent.set(name, wrappersByCallback);\n }\n let wrappers = wrappersByCallback.get(callback);\n if (!wrappers) {\n wrappers = new Set();\n wrappersByCallback.set(callback, wrappers);\n }\n wrappers.add(wrapped);\n this.socket.on(name, wrapped);\n }\n }\n\n off(name: SdkEvent, callback?: (...args: any[]) => any) {\n if (this.internalEvents.has(name)) {\n if (!callback) {\n this.internalListeners.delete(name);\n return;\n }\n const handlers = this.internalListeners.get(name);\n if (handlers) {\n handlers.delete(callback);\n if (handlers.size === 0) {\n this.internalListeners.delete(name);\n }\n }\n return;\n }\n\n if (!this.socket) {\n throw new Error(\"Not connected\");\n }\n\n if (this.isManagerEvent(name)) {\n this.socket.io.off(name, callback);\n return;\n }\n\n if (!callback) {\n this.socket.off(name);\n this.wrappersByEvent.delete(name);\n return;\n }\n\n const wrappersByCallback = this.wrappersByEvent.get(name);\n const wrappers = wrappersByCallback?.get(callback);\n if (wrappers && wrappers.size > 0) {\n const wrapped = wrappers.values().next().value as (\n ...args: any[]\n ) => void;\n wrappers.delete(wrapped);\n this.socket.off(name, wrapped);\n if (wrappers.size === 0) {\n wrappersByCallback!.delete(callback);\n if (wrappersByCallback!.size === 0) {\n this.wrappersByEvent.delete(name);\n }\n }\n } else {\n this.socket.off(name, callback);\n }\n }\n\n connect() {\n if (!this.url) {\n return;\n }\n\n const url = new URL(this.url);\n\n const socketOptions: any = {\n reconnectionDelayMax: 10000,\n path: url.pathname,\n // WebSocket only, skipping engine.io's default HTTP long-polling phase.\n // Some embedders sit behind proxies/security gateways that duplicate the\n // polling GETs across a fleet; the concurrent polls violate engine.io's\n // one-inflight-poll-per-session rule and tear the session down, so every\n // poll then returns \"Session ID unknown\" (HTTP 400) and the client never\n // authenticates. A single WebSocket has no repeated requests to duplicate.\n transports: [\"websocket\"],\n };\n\n this.socket = io(url.origin, socketOptions);\n\n this.socket.on(\"connect\", () => {\n this.authenticate();\n });\n\n this.socket.on(\n \"app_version\",\n wrapEventHandler((payload: any) => {\n const minVersion = payload?.min;\n const maxVersion = payload?.max;\n\n if (minVersion || maxVersion) {\n const tooLow = minVersion\n ? compareVersions(SDK_VERSION, minVersion) < 0\n : false;\n const tooHigh = maxVersion\n ? compareVersions(SDK_VERSION, maxVersion) > 0\n : false;\n if (tooLow || tooHigh) {\n const error = new Error(\n `SDK version ${SDK_VERSION} is not supported. Supported range: ${minVersion || \"-\"} to ${maxVersion || \"-\"}.`,\n );\n this.socket!.disconnect();\n this.socket!.emit(\"error\", error);\n }\n }\n }),\n );\n }\n\n disconnect() {\n if (this.socket) {\n this.socket.disconnect();\n }\n this.wrappersByEvent.clear();\n }\n\n sendMessage(method: Methods, data?: any): Promise<any> {\n return new Promise((resolve, reject) => {\n if (!this.socket || !this.socket.connected) {\n reject(new Error(\"Socket is not connected\"));\n return;\n }\n\n const requestId = this.createRequestId();\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const handler = (payload: any) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n this.socket!.off(requestId, handler);\n let parsed = payload;\n if (typeof payload === \"string\") {\n try {\n parsed = JSON.parse(payload);\n } catch (error) {\n parsed = payload;\n }\n }\n\n if (parsed && parsed.error !== undefined) {\n reject(parsed.error);\n return;\n }\n\n // Return the full parsed envelope. Every caller below\n // (addFact, getFacts, flagFact, set*) already does its own\n // `result.data !== undefined ? result.data : result` unwrap,\n // so removing the unwrap here is behaviourally a no-op for\n // them — but it exposes top-level envelope fields like\n // `verification_status` to addFact() so the terminal\n // resolution can carry them alongside the inner data block.\n resolve(parsed);\n };\n\n this.socket.on(requestId, handler);\n\n const payload =\n data && typeof data === \"object\"\n ? { ...data, requestId }\n : { requestId, data };\n this.socket.emit(method, JSON.stringify(payload));\n\n timeout = setTimeout(() => {\n this.socket!.off(requestId, handler);\n reject(new Error(`Request timed out for ${method}`));\n }, DEFAULT_TIMEOUT_MS);\n });\n }\n\n async getApplication(): Promise<Application> {\n try {\n const result = await this.sendMessage(Methods.GET_APPLICATION);\n const application =\n result && result.data !== undefined ? result.data : result;\n if (application && application.application_id !== undefined) {\n return application;\n }\n throw new Error(\"GET_APPLICATION returned no application\");\n } catch (error) {\n // Only a server that predates GET_APPLICATION is worth absorbing: it\n // never answers, so the request can only end in a timeout. Anything else\n // — a rejected request, a dropped socket, a server-side failure — is a\n // real error, and swallowing it would hand back the authentication\n // snapshot as though it were live.\n if (!isRequestTimeout(error, Methods.GET_APPLICATION)) {\n throw error;\n }\n }\n\n // Never overwritten by this method, so it stays the snapshot taken at\n // authentication: identity fields only, no `verification`. That absence is\n // the signal the caller reads — a stale summary would be indistinguishable\n // from a live one.\n if (this.cachedApplication) {\n return this.cachedApplication;\n }\n throw new Error(\n \"Application is not available yet. Wait for authentication to complete.\",\n );\n }\n\n async getFacts(): Promise<ApplicationFact[]> {\n const result = await this.sendMessage(Methods.GET_FACTS);\n return result && result.data !== undefined ? result.data : result;\n }\n\n async addFact(fact: ApplicationFactInput): Promise<AddFactResult> {\n // No `?? false` for `prefilled`, unlike critical/is_skipped: defaulting it\n // would relabel every existing integration's facts as agent-entered.\n const payload = {\n ...fact,\n critical: fact.critical ?? false,\n is_skipped: fact.is_skipped ?? false,\n };\n const result = await this.sendMessage(Methods.ADD_FACT, payload);\n if (!result) return result;\n const inner = result.data !== undefined ? result.data : result;\n\n // Older backends emit only `data` (or even a primitive like\n // `true`). New backends emit a `FactVerifiedResponseDto` envelope\n // carrying `verification_status` / `matched_components` /\n // `missing_components` at the top level ALONGSIDE the inner\n // `FactVerifiedDataDto`. Merge the envelope onto the resolved\n // value so callers awaiting addFact() see the full terminal\n // shape without subscribing to the broadcast `FACT_VERIFIED`\n // event. Skip the merge when the envelope is absent OR when inner\n // is not an object — spreading a primitive (`{ ...true }`) would\n // silently turn the resolution into `{}`.\n const hasEnvelope =\n result.verification_status !== undefined ||\n result.matched_components !== undefined ||\n result.missing_components !== undefined ||\n result.warnings !== undefined;\n if (!hasEnvelope || typeof inner !== \"object\" || inner === null) {\n return inner;\n }\n const merged = { ...inner } as AddFactResult;\n if (result.verification_status !== undefined) {\n merged.verification_status = result.verification_status;\n }\n if (result.matched_components !== undefined) {\n merged.matched_components = result.matched_components;\n }\n if (result.missing_components !== undefined) {\n merged.missing_components = result.missing_components;\n }\n if (result.warnings !== undefined) {\n merged.warnings = result.warnings;\n }\n return merged;\n }\n\n async flagFact(factId: string): Promise<FlagFactResult> {\n const result = await this.sendMessage(Methods.FLAG_FACT, {\n factId,\n });\n return result && result.data !== undefined ? result.data : result;\n }\n\n async setConversationProduct(\n product: string,\n ): Promise<SetConversationProductResult> {\n const result = await this.sendMessage(Methods.SET_CONVERSATION_PRODUCT, {\n product,\n });\n return result && result.data !== undefined ? result.data : result;\n }\n\n async setConversationLanguage(\n language: ConversationLanguage,\n ): Promise<SetConversationLanguageResult> {\n const result = await this.sendMessage(Methods.SET_CONVERSATION_LANGUAGE, {\n language,\n });\n return result && result.data !== undefined ? result.data : result;\n }\n\n async updateConversation(\n input: UpdateConversationInput,\n ): Promise<UpdateConversationResult> {\n const { advisorId, advisorEmail, ...fields } = input;\n const result = await this.sendMessage(Methods.UPDATE_CONVERSATION, {\n ...fields,\n agentId: advisorId,\n agentEmail: advisorEmail,\n });\n const data = result && result.data !== undefined ? result.data : result;\n if (!data?.conversation || !(\"agent_id\" in data.conversation)) {\n return data;\n }\n const { agent_id, ...conversation } = data.conversation;\n return { ...data, conversation: { ...conversation, advisor_id: agent_id } };\n }\n\n async authenticate(): Promise<void> {\n try {\n const result = await this.sendMessage(Methods.AUTHENTICATE, {\n applicationId: this.applicationId,\n applicationSecretKey: this.applicationSecretKey,\n sdkVersion: SDK_VERSION,\n runtime: RUNTIME,\n userAgent: USER_AGENT,\n });\n\n const application =\n result && result.data !== undefined ? result.data : result;\n\n this.cachedApplication = application;\n\n this.emitInternal(\"authenticated\", application);\n } catch (error) {\n this.socket!.emit(\"error\", error);\n }\n }\n\n async startRecording(): Promise<boolean> {\n const result = await this.sendMessage(Methods.START_RECORDING);\n return result && result.data !== undefined ? result.data : result;\n }\n\n async stopRecording(): Promise<boolean> {\n const result = await this.sendMessage(Methods.STOP_RECORDING);\n return result && result.data !== undefined ? result.data : result;\n }\n\n async isRecordingNow(): Promise<boolean> {\n // @TODO: track it from the server, should be sent on successfull connect\n const result = await this.sendMessage(Methods.IS_RECORDING);\n return result && result.data !== undefined ? result.data : result;\n }\n\n private emitInternal(name: SdkEvent, ...args: any[]) {\n const handlers = this.internalListeners.get(name);\n if (!handlers) {\n return;\n }\n handlers.forEach((handler) => handler(...args));\n }\n\n private createRequestId() {\n return `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n private isManagerEvent(name: SdkEvent) {\n return (\n name === \"reconnect_attempt\" ||\n name === \"reconnect_error\" ||\n name === \"reconnect_failed\" ||\n name === \"error\"\n );\n }\n}\n\nexport default AiQaSdk;\n","/**\n * Overall result for the call: `critical_errors` if a fact you sent with\n * `critical: true` failed, `errors` if any other fact failed, else\n * `no_errors`.\n *\n * Only answers count. A question that was never asked never raises it, so a\n * call where nothing was asked reads `no_errors`.\n *\n * Not the same as `VerificationStatus`, which describes a single fact.\n */\nexport type ApplicationVerificationStatus =\n | \"no_errors\"\n | \"errors\"\n | \"critical_errors\";\n\n/**\n * How the facts on one application are counted up. None of these is a count of\n * facts that passed, and they overlap — to show a pass count, count the facts\n * whose `verification_status` is `matched` in `getFacts()`.\n */\nexport type ApplicationVerificationSummary = {\n status: ApplicationVerificationStatus;\n /** Facts whose answer did not match the expected one. */\n count_errors: number;\n /** The facts in `count_errors` that you sent with `critical: true`. */\n count_critical_errors: number;\n /**\n * Every fact on the application, checked or not. The other counters are\n * subsets of it and can overlap each other, so no subtraction from\n * `count_total` yields a pass count.\n */\n count_total: number;\n /**\n * Facts whose question was never asked. Excludes the still-pending ones, but\n * overlaps `count_errors`: a fact never asked that came back wrong is in both.\n */\n count_not_asked: number;\n /** The facts in `count_not_asked` that you sent with `critical: true`. */\n count_critical_not_asked: number;\n /**\n * Facts added but not resolved yet. During a live call most facts sit here\n * and move into the other counters as their results arrive.\n */\n count_pending: number;\n /**\n * Facts flagged as suspicious when the call is reviewed — for instance the\n * advisor leading the customer to the expected answer. Independent of the\n * answer: a matched fact can be flagged. Reads 0 while the call is running.\n */\n count_suspicious: number;\n};\n\nexport type Application = {\n application_id: string;\n client_name: string;\n client_phone_number: string;\n /** The advisor's AIQA user id; `updateConversation()` returns it as `conversation.advisor_id`. */\n agent_id: string;\n /**\n * The status you last reported with `updateConversation({ externalStatus })`,\n * folded to lowercase by the server. Missing when you never reported one —\n * which is not the same as `\"draft\"`. Unlike the fields above it is never in\n * the authentication snapshot, so on the fallback path described under\n * `verification` it is absent rather than stale.\n *\n * Same open union as the input side: the members autocomplete, and a status\n * the server learns before this package does still type-checks.\n */\n external_status?: ExternalStatus | (string & {});\n /**\n * How the call is going so far. When it is missing there is no summary —\n * which is not the same as all zeros — and the fields above may then be the\n * ones from authentication, without an `updateConversation()` you made since.\n */\n verification?: ApplicationVerificationSummary;\n};\n\nexport enum Methods {\n AUTHENTICATE = \"AUTHENTICATE\",\n GET_FACTS = \"GET_FACTS\",\n GET_APPLICATION = \"GET_APPLICATION\",\n START_RECORDING = \"START_RECORDING\",\n STOP_RECORDING = \"STOP_RECORDING\",\n IS_RECORDING = \"IS_RECORDING\",\n ADD_FACT = \"ADD_FACT\",\n FLAG_FACT = \"FLAG_FACT\",\n SET_CONVERSATION_PRODUCT = \"SET_CONVERSATION_PRODUCT\",\n SET_CONVERSATION_LANGUAGE = \"SET_CONVERSATION_LANGUAGE\",\n UPDATE_CONVERSATION = \"UPDATE_CONVERSATION\",\n}\n\nexport type SetConversationProductResult = {\n success: boolean;\n product: string;\n};\n\nexport type SetConversationLanguageResult = {\n success: boolean;\n language: string;\n};\n\n/** User-provided application status. */\nexport enum ExternalStatus {\n DRAFT = \"draft\",\n PENDING = \"pending\",\n COMPLETED = \"completed\",\n EXPIRED = \"expired\",\n CLOSED = \"closed\",\n}\n\nexport type UpdateConversationInput = {\n policyNumber?: string;\n insuredPhone?: string;\n clientName?: string;\n clientPhone?: string;\n clientEmail?: string;\n clientId?: string;\n /** The advisor's AIQA user id. Takes precedence over `advisorEmail`. */\n advisorId?: string;\n /** Email of the advisor's AIQA user. Results: README, Advisor identification. */\n advisorEmail?: string;\n agentGroups?: string[];\n externalStatus?: ExternalStatus | (string & {});\n};\n\n/** Decide with `code`, not `message`. Codes: README, ConversationWarning. */\nexport type ConversationWarningCode =\n | \"advisor_not_found\"\n | \"advisor_lookup_unavailable\"\n | (string & {});\n\n/** Part of an `updateConversation()` that was not applied; the rest was saved. */\nexport interface ConversationWarning {\n code: ConversationWarningCode;\n message: string;\n}\n\n/** `conversation` holds the fields you sent; `warnings` only when part was not applied. */\nexport type UpdateConversationResult = {\n success: boolean;\n conversation: {\n policy_number?: string;\n insured_phone?: string;\n client_name?: string;\n client_phone?: string;\n client_email?: string;\n client_id?: string;\n advisor_id?: string;\n agent_groups?: string[];\n external_status?: string;\n };\n warnings?: ConversationWarning[];\n};\n\nexport enum ConversationLanguage {\n EN = \"en\",\n ES = \"es\",\n FR = \"fr\",\n}\n\nexport type SdkEvent =\n | Methods\n | \"connect\"\n | \"disconnect\"\n | \"close\"\n | \"error\"\n | \"reconnect_attempt\"\n | \"reconnect_error\"\n | \"reconnect_failed\"\n | \"authenticated\"\n | \"app_version\"\n // Every verification state change, for every fact. Payload:\n // `FactVerifiedPayload`.\n | \"FACT_VERIFIED\"\n // Every utterance, as it is transcribed. Payload: `TranscriptionUpdate`.\n | \"TRANSCRIPTION_UPDATED\";\n\nexport enum FactAnswerFormatType {\n string = \"STRING\",\n number = \"NUMBER\",\n integer = \"INT\",\n float = \"FLOAT\",\n bool = \"BOOL\",\n list = \"LIST\",\n strict = \"STRICT\",\n single_choice = \"SINGLE_CHOICE\",\n multiple_choices = \"MULTIPLE_CHOICES\",\n}\n\nexport type ApplicationFactAnswerChoice = {\n key: string;\n text: string;\n};\n\nexport type ApplicationFactAnswerFormat = {\n type: FactAnswerFormatType;\n choices?: ApplicationFactAnswerChoice[];\n};\n\nexport type ApplicationFactInput = {\n id: string;\n /**\n * Stable identifier for the underlying question, shared across applications\n * and conversations. When provided it identifies the question instead of\n * `id`. Keep it consistent across calls: whatever AIQA has tuned for a\n * question is attached to this identity.\n */\n questionId?: string;\n question: string;\n expected_answer: any;\n answer_format: ApplicationFactAnswerFormat;\n\n category_id?: string;\n category_name?: string;\n language?: string;\n\n /**\n * Mark the question critical: its failures land in `count_critical_errors`,\n * and one of them sets the call's `status` to `critical_errors`.\n */\n critical?: boolean;\n is_skipped?: boolean;\n /** Optional (default: `false`). Use `true` when the fact was collected before the conversation started. It is stored, not verified. */\n prefilled?: boolean;\n /**\n * Your own identifiers for this fact — a form field ID, a section name,\n * anything that lets your UI map the result back to the right place.\n * `getFacts()` returns it unchanged — `{}` for a fact you added without\n * one — and it plays no part in verification.\n *\n * Keys and values must all be strings, and each value is limited to 1024\n * characters. A payload that breaks either rule is rejected.\n */\n metadata?: Record<string, string>;\n};\n\nexport type QuestionStatus = \"searching\" | \"asked\" | \"not_asked\";\n\n/**\n * Per-fact verification state. Handle any value you don't recognize as\n * `processing`.\n *\n * - `processing` queued, or nothing to go on yet\n * - `awaiting_question` the advisor hasn't asked the question yet\n * - `awaiting_answer` asked, the customer hasn't answered yet\n * - `partial` partial evidence so far (e.g. \"305\" of \"30521\")\n * - `pending_confirmation_matched` a matching answer is held briefly in case\n * the customer corrects it mid-answer\n * (spellings, \"I mean…\"); resolves to\n * `matched`/`unmatched`\n * - `pending_confirmation_unmatched` same, with an unmatched answer held; show\n * \"we heard X but it doesn't match, waiting\n * to confirm\" rather than a hard result\n * - `matched` final: the answer matched\n * - `unmatched` final: the answer did not match\n */\nexport type VerificationStatus =\n | \"processing\"\n | \"awaiting_question\"\n | \"awaiting_answer\"\n | \"partial\"\n | \"pending_confirmation_matched\"\n | \"pending_confirmation_unmatched\"\n | \"matched\"\n | \"unmatched\";\n\nexport type ApplicationFact = ApplicationFactInput & {\n ai_answer?: any;\n question_status: QuestionStatus;\n verification_status: VerificationStatus;\n /** True once `flagFact(factId)` has been called for this fact. */\n flagged: boolean;\n};\n\n/**\n * Why part of an `addFact()` was not applied. Use it to choose what to do; do\n * not parse `message`. Later versions may add codes: log `message` and\n * continue. See \"FactWarning\" in the README.\n */\nexport type FactWarningCode = \"category_not_found\" | (string & {});\n\n/** Part of an `addFact()` that was not applied. The rest of the fact is saved. */\nexport interface FactWarning {\n code: FactWarningCode;\n message: string;\n}\n\nexport interface AddFactResult {\n /** Conversation the fact was attached to. */\n conversation_id?: string;\n /** Echo of the original question text from the fact input. */\n question?: string;\n /** Echo of the resolved `answer_format.type` (e.g. \"STRING\", \"NUMBER\", \"SINGLE_CHOICE\"). */\n answer_type?: string;\n agent_answer?: string;\n ai_answer?: string;\n /** `false` for a fact that was never verified, such as a prefilled one. */\n is_valid_answer: boolean;\n question_asked?: boolean;\n /**\n * How closely the advisor's utterance matched the expected question, on a 0–1\n * or a 0–100 scale. Higher is closer.\n */\n question_match_score?: number;\n /**\n * 0–1 score for how closely the customer's answer matched the expected one.\n * Undefined when there is no partial signal to score.\n */\n answer_match_score?: number;\n metadata?: Record<string, string>;\n /**\n * The final state: `matched` or `unmatched` whenever it is present. Fall\n * back to `is_valid_answer` when it is missing.\n */\n verification_status?: VerificationStatus;\n /**\n * Component labels describing which parts of the expected answer\n * matched. Currently `[\"prefix\"]` / `[\"suffix\"]` for numeric facts;\n * treat the set as open-ended.\n */\n matched_components?: string[];\n missing_components?: string[];\n /** Present only when part of this `addFact()` was not applied. */\n warnings?: FactWarning[];\n}\n\n/**\n * Payload of the `FACT_VERIFIED` event, which fires on every state change —\n * see `VerificationStatus`. Use it to show progress; `addFact()` resolves\n * only once a fact is done.\n */\nexport interface FactVerifiedPayload {\n factId: string;\n success: boolean;\n verification_status?: VerificationStatus;\n question_match_score?: number;\n answer_match_score?: number;\n matched_components?: string[];\n missing_components?: string[];\n /** Inner payload, shaped like `AddFactResult` without `warnings`. */\n data?: Omit<AddFactResult, \"warnings\">;\n error?: string;\n}\n\nexport type FlagFactResult = {\n success: boolean;\n};\n\n/**\n * What the utterance appears to be doing in the conversation. A best-effort\n * guess: display it if it helps, but do not gate behaviour on it. Its\n * confidence band is `dialog_act_confidence`.\n */\nexport type DialogAct =\n | \"question\"\n | \"answer\"\n | \"acknowledgement\"\n | \"filler\"\n | \"other\";\n\n/**\n * Confidence band for `dialog_act` only. Unrelated to the numeric\n * `confidence` field on the same utterance — do not compare the two.\n */\nexport type DialogActConfidence = \"high\" | \"medium\" | \"low\";\n\n/**\n * An utterance from the `TRANSCRIPTION_UPDATED` event.\n *\n * A missing optional field means \"unknown\", not \"no\".\n */\nexport type Utterance = {\n /** Sort utterances by this: ids sort in chronological order. */\n id: string;\n call_id: number;\n /** Always 0. Sort by `id`, not this. */\n order: number;\n is_agent: boolean | null;\n speaker: number;\n text: string;\n text_en: string | null;\n start_time: number;\n end_time: number;\n dialog_act?: DialogAct;\n dialog_act_confidence?: DialogActConfidence;\n confidence?: number | null;\n top_alt_margin?: number | null;\n is_ivr_filler_candidate?: boolean;\n spoken_digits_normalized?: string | null;\n vendor?: string | null;\n};\n\n/** Payload of the `TRANSCRIPTION_UPDATED` broadcast event. */\nexport type TranscriptionUpdate = {\n policyNumber: string;\n conversationId: string;\n utterance: Utterance;\n};\n\nexport type SdkError = {\n code:\n | \"INVALID_CONFIG\"\n | \"CONNECTION_ERROR\"\n | \"TIMEOUT\"\n | \"SERVER_ERROR\"\n | \"UNEXPECTED_RESPONSE\";\n message: string;\n details?: any;\n};\n\nexport abstract class IAiqaSdk {\n abstract connect(): void;\n abstract disconnect(): void;\n\n abstract on(eventName: string, callback: (...args: any[]) => any): void;\n abstract off(eventName: string, callback?: (...args: any[]) => any): void;\n\n abstract getApplication(): Promise<Application>;\n abstract addFact(fact: ApplicationFactInput): Promise<AddFactResult>;\n abstract flagFact(factId: string): Promise<FlagFactResult>;\n abstract getFacts(): Promise<ApplicationFact[]>;\n abstract setConversationProduct(\n product: string,\n ): Promise<SetConversationProductResult>;\n abstract setConversationLanguage(\n language: ConversationLanguage,\n ): Promise<SetConversationLanguageResult>;\n abstract updateConversation(\n input: UpdateConversationInput,\n ): Promise<UpdateConversationResult>;\n}\n","const splitVersion = (value: string) => {\n const [core] = value.split(\"-\", 2);\n return core.split(\".\").map((part) => Number(part));\n};\n\nexport const compareVersions = (left: string, right: string): number => {\n const leftParts = splitVersion(left);\n const rightParts = splitVersion(right);\n const maxLength = Math.max(leftParts.length, rightParts.length);\n\n for (let i = 0; i < maxLength; i += 1) {\n const l = leftParts[i] ?? 0;\n const r = rightParts[i] ?? 0;\n if (l > r) {\n return 1;\n }\n if (l < r) {\n return -1;\n }\n }\n\n return 0;\n};\n","{\n \"name\": \"@aiqa/sdk\",\n \"version\": \"3.0.0-develop.1\",\n \"main\": \"dist/node/node.js\",\n \"module\": \"dist/node/node.js\",\n \"types\": \"dist/node/node.d.ts\",\n \"engines\": {\n \"node\": \">=18\"\n },\n \"scripts\": {\n \"build\": \"tsup && node -e \\\"const fs=require('fs');['dist/node/node','dist/browser/browser'].forEach(f=>{const mts=f+'.d.mts';const ts=f+'.d.ts';if(fs.existsSync(mts)){fs.renameSync(mts,ts);}});\\\"\",\n \"commitlint\": \"commitlint\",\n \"dev:node\": \"tsx src/node.ts\",\n \"lint\": \"tsc --noEmit -p tsconfig.json\",\n \"format\": \"prettier --check \\\"{src,tests}/**/*.{ts,tsx,js,json,md,yml,yaml}\\\" \\\"*.{js,json,md,yml,yaml,ts}\\\" --ignore-path .prettierignore\",\n \"release\": \"semantic-release\",\n \"start:node\": \"node dist/node/node.js\",\n \"serve:browser\": \"serve .\",\n \"test\": \"jest\",\n \"prepare\": \"husky\",\n \"lint-staged\": \"lint-staged\"\n },\n \"lint-staged\": {\n \"*.{ts,tsx,js,json,md,yml,yaml}\": [\n \"prettier --write\"\n ]\n },\n \"exports\": {\n \".\": {\n \"node\": {\n \"import\": \"./dist/node/node.js\",\n \"types\": \"./dist/node/node.d.ts\"\n },\n \"browser\": {\n \"import\": \"./dist/browser/browser.js\",\n \"types\": \"./dist/browser/browser.d.ts\"\n },\n \"default\": \"./dist/node/node.js\"\n }\n },\n \"private\": false,\n \"license\": \"MIT\",\n \"author\": \"AIQA\",\n \"description\": \"TypeScript/JavaScript SDK for interacting with the AIQA.\",\n \"keywords\": [\n \"aiqa\",\n \"sdk\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"devDependencies\": {\n \"@commitlint/cli\": \"^20.4.4\",\n \"@commitlint/config-conventional\": \"^20.4.4\",\n \"@jest/globals\": \"^29.7.0\",\n \"@semantic-release/commit-analyzer\": \"^13.0.1\",\n \"@semantic-release/git\": \"^10.0.1\",\n \"@semantic-release/npm\": \"^12.0.2\",\n \"@semantic-release/release-notes-generator\": \"^14.1.0\",\n \"@types/node\": \"^22.0.0\",\n \"conventional-changelog-conventionalcommits\": \"^9.3.0\",\n \"esbuild\": \"^0.23.0\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^29.7.0\",\n \"lint-staged\": \"^16.4.0\",\n \"prettier\": \"^3.8.1\",\n \"semantic-release\": \"^24.2.9\",\n \"serve\": \"^14.2.3\",\n \"socket.io\": \"^4.7.5\",\n \"ts-jest\": \"^29.2.3\",\n \"ts-node\": \"^10.9.2\",\n \"tsup\": \"^8.0.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.7.0\"\n },\n \"dependencies\": {\n \"socket.io-client\": \"^4.7.5\"\n }\n}\n"],"mappings":"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","names":["Methods","ExternalStatus","ConversationLanguage","FactAnswerFormatType","payload"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiqa/sdk",
3
- "version": "2.5.0",
3
+ "version": "3.0.0",
4
4
  "main": "dist/node/node.js",
5
5
  "module": "dist/node/node.js",
6
6
  "types": "dist/node/node.d.ts",