@aiqa/sdk 2.0.0-develop.1 → 2.0.0-develop.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,7 +17,8 @@ declare enum Methods {
17
17
  ADD_FACT = "ADD_FACT",
18
18
  FLAG_FACT = "FLAG_FACT",
19
19
  SET_CONVERSATION_PRODUCT = "SET_CONVERSATION_PRODUCT",
20
- SET_CONVERSATION_LANGUAGE = "SET_CONVERSATION_LANGUAGE"
20
+ SET_CONVERSATION_LANGUAGE = "SET_CONVERSATION_LANGUAGE",
21
+ UPDATE_CONVERSATION = "UPDATE_CONVERSATION"
21
22
  }
22
23
  type SetConversationProductResult = {
23
24
  success: boolean;
@@ -27,6 +28,15 @@ type SetConversationLanguageResult = {
27
28
  success: boolean;
28
29
  language: string;
29
30
  };
31
+ type UpdateConversationInput = {
32
+ policyNumber?: string;
33
+ };
34
+ type UpdateConversationResult = {
35
+ success: boolean;
36
+ conversation: {
37
+ policy_number?: string;
38
+ };
39
+ };
30
40
  declare enum ConversationLanguage {
31
41
  EN = "en",
32
42
  ES = "es",
@@ -90,16 +100,15 @@ type QuestionStatus = "searching" | "asked" | "not_asked";
90
100
  * - `pending_confirmation_matched` backend has a matching answer but is
91
101
  * holding a settling window for mid-answer
92
102
  * clarifications (e.g. spellings, "I mean…");
93
- * resolves to `matched`/`unmatched`/`contradicted`
103
+ * resolves to `matched`/`unmatched`
94
104
  * - `pending_confirmation_unmatched` same as above but the held verdict is
95
105
  * `unmatched`; UI can show "we heard X but it
96
106
  * doesn't match, waiting to confirm" instead
97
107
  * of a hard red verdict
98
108
  * - `matched` terminal: answer matched expected
99
109
  * - `unmatched` terminal: budget exhausted with no match
100
- * - `contradicted` terminal (future): customer contradicted expected
101
110
  */
102
- type VerificationStatus = "processing" | "awaiting_question" | "awaiting_answer" | "partial" | "pending_confirmation_matched" | "pending_confirmation_unmatched" | "matched" | "unmatched" | "contradicted";
111
+ type VerificationStatus = "processing" | "awaiting_question" | "awaiting_answer" | "partial" | "pending_confirmation_matched" | "pending_confirmation_unmatched" | "matched" | "unmatched";
103
112
  type ApplicationFact = ApplicationFactInput & {
104
113
  ai_answer?: any;
105
114
  question_status: QuestionStatus;
@@ -133,8 +142,8 @@ interface AddFactResult {
133
142
  answer_match_score?: number;
134
143
  metadata?: Record<string, string>;
135
144
  /**
136
- * Top-level state at terminal resolution. Always one of `matched`,
137
- * `unmatched`, or `contradicted` because the `addFact()` Promise only
145
+ * Top-level state at terminal resolution. Always one of `matched`
146
+ * or `unmatched` because the `addFact()` Promise only
138
147
  * resolves on terminals. Optional during the rollout window for
139
148
  * backwards compatibility with older backends.
140
149
  */
@@ -154,7 +163,7 @@ interface AddFactResult {
154
163
  * Fires on EVERY state transition the verification queue produces —
155
164
  * non-terminal (`partial`, `awaiting_question`, `awaiting_answer`,
156
165
  * `pending_confirmation_matched`, `pending_confirmation_unmatched`,
157
- * `processing`) AND terminal (`matched`, `unmatched`, `contradicted`).
166
+ * `processing`) AND terminal (`matched`, `unmatched`).
158
167
  *
159
168
  * Subscribe with:
160
169
  * sdk.on("FACT_VERIFIED", (payload: FactVerifiedPayload) => {...});
@@ -264,6 +273,7 @@ declare abstract class IAiqaSdk {
264
273
  abstract getFacts(): Promise<ApplicationFact[]>;
265
274
  abstract setConversationProduct(product: string): Promise<SetConversationProductResult>;
266
275
  abstract setConversationLanguage(language: ConversationLanguage): Promise<SetConversationLanguageResult>;
276
+ abstract updateConversation(input: UpdateConversationInput): Promise<UpdateConversationResult>;
267
277
  }
268
278
 
269
279
  declare class AiQaSdk implements IAiqaSdk {
@@ -275,6 +285,13 @@ declare class AiQaSdk implements IAiqaSdk {
275
285
  internalListeners: Map<SdkEvent, Set<(...args: any[]) => void>>;
276
286
  internalEvents: Set<SdkEvent>;
277
287
  private wrappersByEvent;
288
+ /**
289
+ * Trailing-debounce window (ms) applied per fact in {@link addFact}. Defaults
290
+ * to {@link ADD_FACT_DEBOUNCE_MS}; set to 0 to disable debouncing and send
291
+ * every call immediately.
292
+ */
293
+ addFactDebounceMs: number;
294
+ private pendingAddFacts;
278
295
  constructor(applicationId: string, applicationSecret: string, url?: string);
279
296
  on(name: SdkEvent, callback: (...args: any[]) => any): void;
280
297
  off(name: SdkEvent, callback?: (...args: any[]) => any): void;
@@ -284,9 +301,12 @@ declare class AiQaSdk implements IAiqaSdk {
284
301
  getApplication(): Promise<Application>;
285
302
  getFacts(): Promise<ApplicationFact[]>;
286
303
  addFact(fact: ApplicationFactInput): Promise<AddFactResult>;
304
+ private flushAddFact;
305
+ private sendAddFact;
287
306
  flagFact(factId: string): Promise<FlagFactResult>;
288
307
  setConversationProduct(product: string): Promise<SetConversationProductResult>;
289
308
  setConversationLanguage(language: ConversationLanguage): Promise<SetConversationLanguageResult>;
309
+ updateConversation(input: UpdateConversationInput): Promise<UpdateConversationResult>;
290
310
  authenticate(): Promise<void>;
291
311
  startRecording(): Promise<boolean>;
292
312
  stopRecording(): Promise<boolean>;
@@ -296,4 +316,4 @@ declare class AiQaSdk implements IAiqaSdk {
296
316
  private isManagerEvent;
297
317
  }
298
318
 
299
- export { type AddFactResult, AiQaSdk, type Application, type ApplicationFact, type ApplicationFactAnswerChoice, type ApplicationFactAnswerFormat, type ApplicationFactInput, ConversationLanguage, type DialogAct, type DialogActConfidence, FactAnswerFormatType, type FactVerifiedPayload, type FlagFactResult, IAiqaSdk, Methods, type QuestionStatus, type SdkError, type SdkEvent, type SetConversationLanguageResult, type SetConversationProductResult, type TranscriptionUpdate, type Utterance, type VerificationStatus };
319
+ export { type AddFactResult, AiQaSdk, type Application, type ApplicationFact, type ApplicationFactAnswerChoice, type ApplicationFactAnswerFormat, type ApplicationFactInput, ConversationLanguage, type DialogAct, type DialogActConfidence, FactAnswerFormatType, type FactVerifiedPayload, type FlagFactResult, IAiqaSdk, Methods, type QuestionStatus, type SdkError, type SdkEvent, type SetConversationLanguageResult, type SetConversationProductResult, type TranscriptionUpdate, type UpdateConversationInput, type UpdateConversationResult, type Utterance, type VerificationStatus };
package/dist/node/node.js CHANGED
@@ -12,6 +12,7 @@ var Methods = /* @__PURE__ */ ((Methods2) => {
12
12
  Methods2["FLAG_FACT"] = "FLAG_FACT";
13
13
  Methods2["SET_CONVERSATION_PRODUCT"] = "SET_CONVERSATION_PRODUCT";
14
14
  Methods2["SET_CONVERSATION_LANGUAGE"] = "SET_CONVERSATION_LANGUAGE";
15
+ Methods2["UPDATE_CONVERSATION"] = "UPDATE_CONVERSATION";
15
16
  return Methods2;
16
17
  })(Methods || {});
17
18
  var ConversationLanguage = /* @__PURE__ */ ((ConversationLanguage3) => {
@@ -60,7 +61,7 @@ var compareVersions = (left, right) => {
60
61
  // package.json
61
62
  var package_default = {
62
63
  name: "@aiqa/sdk",
63
- version: "1.6.0-develop.1",
64
+ version: "2.0.0-develop.2",
64
65
  main: "dist/node/node.js",
65
66
  module: "dist/node/node.js",
66
67
  types: "dist/node/node.d.ts",
@@ -142,6 +143,7 @@ var package_default = {
142
143
  var SDK_VERSION = package_default.version ?? "0.0.1";
143
144
  var DEFAULT_URL = "ws://localhost:3025/ws";
144
145
  var DEFAULT_TIMEOUT_MS = 6e4;
146
+ var ADD_FACT_DEBOUNCE_MS = 500;
145
147
  var RUNTIME = typeof window !== "undefined" && typeof window.document !== "undefined" ? "browser" : "node";
146
148
  var USER_AGENT = RUNTIME === "browser" ? typeof navigator !== "undefined" ? navigator.userAgent : "browser/unknown" : typeof process !== "undefined" ? `node ${process.version} ${process.platform}` : "node/unknown";
147
149
  function isThenable(value) {
@@ -187,6 +189,15 @@ var AiQaSdk = class {
187
189
  // same fn twice registers two wrappers and two off() calls clear
188
190
  // both.
189
191
  this.wrappersByEvent = /* @__PURE__ */ new Map();
192
+ /**
193
+ * Trailing-debounce window (ms) applied per fact in {@link addFact}. Defaults
194
+ * to {@link ADD_FACT_DEBOUNCE_MS}; set to 0 to disable debouncing and send
195
+ * every call immediately.
196
+ */
197
+ this.addFactDebounceMs = ADD_FACT_DEBOUNCE_MS;
198
+ // In-flight debounce state keyed by fact id: the pending timer, the latest
199
+ // payload to send when it fires, and every caller awaiting that send.
200
+ this.pendingAddFacts = /* @__PURE__ */ new Map();
190
201
  this.url = url ?? DEFAULT_URL;
191
202
  this.internalListeners = /* @__PURE__ */ new Map();
192
203
  this.internalEvents = /* @__PURE__ */ new Set(["authenticated"]);
@@ -306,6 +317,13 @@ var AiQaSdk = class {
306
317
  this.socket.disconnect();
307
318
  }
308
319
  this.wrappersByEvent.clear();
320
+ for (const entry of this.pendingAddFacts.values()) {
321
+ clearTimeout(entry.timer);
322
+ entry.waiters.forEach(
323
+ (w) => w.reject(new Error("Socket disconnected before addFact was sent"))
324
+ );
325
+ }
326
+ this.pendingAddFacts.clear();
309
327
  }
310
328
  sendMessage(method, data) {
311
329
  return new Promise((resolve, reject) => {
@@ -355,7 +373,40 @@ var AiQaSdk = class {
355
373
  const result = await this.sendMessage("GET_FACTS" /* GET_FACTS */);
356
374
  return result && result.data !== void 0 ? result.data : result;
357
375
  }
358
- async addFact(fact) {
376
+ addFact(fact) {
377
+ if (this.addFactDebounceMs <= 0) {
378
+ return this.sendAddFact(fact);
379
+ }
380
+ const key = fact.questionId ?? fact.id;
381
+ return new Promise((resolve, reject) => {
382
+ const existing = this.pendingAddFacts.get(key);
383
+ if (existing) {
384
+ clearTimeout(existing.timer);
385
+ existing.latest = fact;
386
+ existing.waiters.push({ resolve, reject });
387
+ existing.timer = setTimeout(
388
+ () => this.flushAddFact(key),
389
+ this.addFactDebounceMs
390
+ );
391
+ return;
392
+ }
393
+ this.pendingAddFacts.set(key, {
394
+ latest: fact,
395
+ waiters: [{ resolve, reject }],
396
+ timer: setTimeout(() => this.flushAddFact(key), this.addFactDebounceMs)
397
+ });
398
+ });
399
+ }
400
+ flushAddFact(key) {
401
+ const entry = this.pendingAddFacts.get(key);
402
+ if (!entry) return;
403
+ this.pendingAddFacts.delete(key);
404
+ this.sendAddFact(entry.latest).then(
405
+ (result) => entry.waiters.forEach((w) => w.resolve(result)),
406
+ (error) => entry.waiters.forEach((w) => w.reject(error))
407
+ );
408
+ }
409
+ async sendAddFact(fact) {
359
410
  const payload = {
360
411
  ...fact,
361
412
  critical: fact.critical ?? false,
@@ -398,6 +449,10 @@ var AiQaSdk = class {
398
449
  });
399
450
  return result && result.data !== void 0 ? result.data : result;
400
451
  }
452
+ async updateConversation(input) {
453
+ const result = await this.sendMessage("UPDATE_CONVERSATION" /* UPDATE_CONVERSATION */, input);
454
+ return result && result.data !== void 0 ? result.data : result;
455
+ }
401
456
  async authenticate() {
402
457
  try {
403
458
  const result = await this.sendMessage("AUTHENTICATE" /* AUTHENTICATE */, {
@@ -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 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 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 };\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 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 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 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 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 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","export type Application = {\n application_id: string;\n client_name: string;\n client_phone_number: string;\n agent_id: string;\n agent_first_name: string;\n agent_last_name: string;\n};\n\nexport enum Methods {\n AUTHENTICATE = \"AUTHENTICATE\",\n GET_FACTS = \"GET_FACTS\",\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}\n\nexport type SetConversationProductResult = {\n success: boolean;\n product: string;\n};\n\nexport type SetConversationLanguageResult = {\n success: boolean;\n language: string;\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 // Broadcast channel for every server-side verification event,\n // non-terminal OR terminal. Subscribe with\n // `sdk.on(\"FACT_VERIFIED\", cb)` to receive progress\n // (`awaiting_question`, `awaiting_answer`, `partial`,\n // `pending_confirmation_matched`, `pending_confirmation_unmatched`)\n // alongside the terminal (`matched`, `unmatched`, `contradicted`)\n // verdicts. `addFact()`'s Promise resolves only on the terminal —\n // this event stream is the way to render progress.\n //\n // Uppercase matches the backend's `SocketEvents.FACT_VERIFIED`\n // constant (`apps/realtime-verification/src/socket/utils.ts`).\n | \"FACT_VERIFIED\"\n // Broadcast channel for every persisted utterance, real-time.\n // Subscribe with `sdk.on(\"TRANSCRIPTION_UPDATED\", cb)` to receive\n // `TranscriptionUpdate` payloads as transcripts land.\n //\n // Uppercase matches the backend's `SocketEvents.TRANSCRIPTION_UPDATED`\n // constant (`apps/realtime-verification/src/socket/utils.ts`).\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 and\n * conversations. When provided it is used to look up (or create) the matching\n * question row in the database instead of `id`. Keep this consistent across\n * calls — accuracy improvements and remaps configured in the management\n * dashboard are scoped per `questionId`.\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 critical?: boolean;\n is_skipped?: boolean;\n metadata?: Record<string, string>;\n};\n\nexport type QuestionStatus = \"searching\" | \"asked\" | \"not_asked\";\n\n/**\n * Per-fact verification state.\n *\n * Extended from the original three-state shape to carry progress signals\n * the backend already detects but previously could not express. Consumers\n * that switch on this value MUST treat unknown strings as \"processing\"\n * (default fall-through) so older SDK builds keep working after the\n * backend starts emitting the additive states.\n *\n * Semantics:\n * - `processing` generic, just queued or transcription not ready\n * - `awaiting_question` agent hasn't asked the question yet\n * - `awaiting_answer` question asked, customer hasn't answered yet\n * - `partial` partial evidence; backend still working on it\n * - `pending_confirmation_matched` backend has a matching answer but is\n * holding a settling window for mid-answer\n * clarifications (e.g. spellings, \"I mean…\");\n * resolves to `matched`/`unmatched`/`contradicted`\n * - `pending_confirmation_unmatched` same as above but the held verdict is\n * `unmatched`; UI can show \"we heard X but it\n * doesn't match, waiting to confirm\" instead\n * of a hard red verdict\n * - `matched` terminal: answer matched expected\n * - `unmatched` terminal: budget exhausted with no match\n * - `contradicted` terminal (future): customer contradicted expected\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 | \"contradicted\";\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\nexport interface AddFactResult {\n /** Conversation the fact was attached to. Useful for cross-fact correlation in agent UIs. */\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 is_valid_answer: boolean;\n question_asked?: boolean;\n /**\n * 0–1 (or 0–100 — scale matches the configured similarity method).\n * Similarity between the agent's utterance and the expected question.\n * Renamed from `match_score` to disambiguate from the answer-side score.\n */\n question_match_score?: number;\n /**\n * 0–1 score derived from how well the customer's answer matched expected.\n * Populated by the verification queue from partial-match heuristics\n * (numeric-prefix ratio, matched-components ratio). Undefined when no\n * partial signal exists or for terminal results before this rolls out.\n */\n answer_match_score?: number;\n metadata?: Record<string, string>;\n /**\n * Top-level state at terminal resolution. Always one of `matched`,\n * `unmatched`, or `contradicted` because the `addFact()` Promise only\n * resolves on terminals. Optional during the rollout window for\n * backwards compatibility with older backends.\n */\n verification_status?: VerificationStatus;\n /**\n * Per-fact partial-match breakdown carried through from the\n * verification queue's component-wise comparators. For numeric-prefix\n * facts these are `[\"prefix\"]` / `[\"suffix\"]`; future work will\n * generalise to addresses, names, dates, etc.\n */\n matched_components?: string[];\n missing_components?: string[];\n}\n\n/**\n * Payload of the `FACT_VERIFIED` broadcast event.\n *\n * Fires on EVERY state transition the verification queue produces —\n * non-terminal (`partial`, `awaiting_question`, `awaiting_answer`,\n * `pending_confirmation_matched`, `pending_confirmation_unmatched`,\n * `processing`) AND terminal (`matched`, `unmatched`, `contradicted`).\n *\n * Subscribe with:\n * sdk.on(\"FACT_VERIFIED\", (payload: FactVerifiedPayload) => {...});\n *\n * `addFact()`'s Promise resolves only on terminals; this event stream\n * is the channel for rendering live progress in the agent UI.\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 /**\n * Inner data payload. Shape matches `AddFactResult` (minus the\n * top-level envelope fields) so consumers can reuse the same\n * rendering code for the terminal addFact() resolution and the\n * broadcast event.\n */\n data?: AddFactResult;\n error?: string;\n}\n\nexport type FlagFactResult = {\n success: boolean;\n};\n\n/**\n * Coarse dialog-act label produced by the backend's `UtteranceEnricher`.\n * Advisory only — do not gate production behaviour on this value; the\n * enricher emits its best-effort categorical guess plus a separate\n * `dialog_act_confidence` band.\n *\n * Mirrors `DialogAct` in\n * `libs/types/src/utterance-enrichment.ts` on the backend.\n */\nexport type DialogAct =\n | \"question\"\n | \"answer\"\n | \"acknowledgement\"\n | \"filler\"\n | \"other\";\n\n/**\n * Categorical confidence band for `dialog_act` ONLY. Named distinctly\n * from the numeric STT `confidence` field on the same utterance — the\n * two are unrelated and conflating them is a documented drift hazard on\n * the backend.\n *\n * Mirrors `DialogActConfidence` in\n * `libs/types/src/utterance-enrichment.ts` on the backend.\n */\nexport type DialogActConfidence = \"high\" | \"medium\" | \"low\";\n\n/**\n * Persisted utterance shape — matches `TranscriptionUtteranceDto` on the\n * gateway (`apps/realtime-verification/src/socket/realtimeVerification.gateway.output.dto.ts`)\n * and the `Utterance` interface in `libs/types/src/common.ts` field for\n * field. Sent over the wire by the `TRANSCRIPTION_UPDATED` broadcast.\n *\n * The 7 enricher classification fields are all optional because\n * pre-cutover utterances (persisted before backend PR #234) lack them.\n * Treat any missing or nullish value as \"unknown\" — NOT as a deliberate\n * negative signal. `is_ivr_filler_candidate === false` in particular\n * does NOT round-trip through `undefined`, so consumer logic that wants\n * \"definitely not a filler\" must check `=== false` after confirming the\n * field is present.\n */\nexport type Utterance = {\n /** UUIDv7 — chronologically sortable. Use `id` (NOT `order`) for sorting. */\n id: string;\n call_id: number;\n /**\n * NOT YET IMPLEMENTED — currently hardcoded to 0 at write sites on\n * the backend. Do not use for sorting; sort by `id` (UUIDv7) instead.\n */\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/**\n * Payload of the `TRANSCRIPTION_UPDATED` broadcast event. Mirrors\n * `TranscriptionUpdateResponseDto` on the gateway.\n */\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}\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\": \"1.6.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","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\n// Trailing-debounce window for addFact(). Rapid re-fires of the SAME fact\n// (form re-render, per-keystroke onChange) collapse into a single send of the\n// latest payload; the actual send is delayed by this much after the last call\n// in a burst. Kept small so verification still starts promptly. Set to 0 to\n// send every call immediately. Note: this only coalesces calls that land\n// within the window — a genuinely re-submitted value spaced further apart is\n// still sent, by design.\nconst ADD_FACT_DEBOUNCE_MS = 500;\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 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 /**\n * Trailing-debounce window (ms) applied per fact in {@link addFact}. Defaults\n * to {@link ADD_FACT_DEBOUNCE_MS}; set to 0 to disable debouncing and send\n * every call immediately.\n */\n addFactDebounceMs: number = ADD_FACT_DEBOUNCE_MS;\n\n // In-flight debounce state keyed by fact id: the pending timer, the latest\n // payload to send when it fires, and every caller awaiting that send.\n private pendingAddFacts: Map<\n string,\n {\n timer: ReturnType<typeof setTimeout>;\n latest: ApplicationFactInput;\n waiters: Array<{\n resolve: (value: AddFactResult) => void;\n reject: (reason?: unknown) => void;\n }>;\n }\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 };\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 // Drop any debounced sends still waiting: the socket is gone, so reject\n // their awaiters rather than fire (and clear the timers) after teardown.\n for (const entry of this.pendingAddFacts.values()) {\n clearTimeout(entry.timer);\n entry.waiters.forEach((w) =>\n w.reject(new Error(\"Socket disconnected before addFact was sent\")),\n );\n }\n this.pendingAddFacts.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 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 addFact(fact: ApplicationFactInput): Promise<AddFactResult> {\n // Debounce per fact: collapse a burst of re-fires for the same fact into a\n // single send of the latest payload. Every caller in the window resolves\n // with that one send's terminal result. `questionId` (when present) is the\n // stable per-question key; fall back to the fact id.\n if (this.addFactDebounceMs <= 0) {\n return this.sendAddFact(fact);\n }\n const key = fact.questionId ?? fact.id;\n return new Promise<AddFactResult>((resolve, reject) => {\n const existing = this.pendingAddFacts.get(key);\n if (existing) {\n clearTimeout(existing.timer);\n existing.latest = fact;\n existing.waiters.push({ resolve, reject });\n existing.timer = setTimeout(\n () => this.flushAddFact(key),\n this.addFactDebounceMs,\n );\n return;\n }\n this.pendingAddFacts.set(key, {\n latest: fact,\n waiters: [{ resolve, reject }],\n timer: setTimeout(() => this.flushAddFact(key), this.addFactDebounceMs),\n });\n });\n }\n\n private flushAddFact(key: string): void {\n const entry = this.pendingAddFacts.get(key);\n if (!entry) return;\n this.pendingAddFacts.delete(key);\n this.sendAddFact(entry.latest).then(\n (result) => entry.waiters.forEach((w) => w.resolve(result)),\n (error) => entry.waiters.forEach((w) => w.reject(error)),\n );\n }\n\n private async sendAddFact(\n fact: ApplicationFactInput,\n ): Promise<AddFactResult> {\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 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 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","export type Application = {\n application_id: string;\n client_name: string;\n client_phone_number: string;\n agent_id: string;\n agent_first_name: string;\n agent_last_name: string;\n};\n\nexport enum Methods {\n AUTHENTICATE = \"AUTHENTICATE\",\n GET_FACTS = \"GET_FACTS\",\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\nexport type UpdateConversationInput = {\n policyNumber?: string;\n};\n\nexport type UpdateConversationResult = {\n success: boolean;\n conversation: {\n policy_number?: string;\n };\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 // Broadcast channel for every server-side verification event,\n // non-terminal OR terminal. Subscribe with\n // `sdk.on(\"FACT_VERIFIED\", cb)` to receive progress\n // (`awaiting_question`, `awaiting_answer`, `partial`,\n // `pending_confirmation_matched`, `pending_confirmation_unmatched`)\n // alongside the terminal (`matched`, `unmatched`)\n // verdicts. `addFact()`'s Promise resolves only on the terminal —\n // this event stream is the way to render progress.\n //\n // Uppercase matches the backend's `SocketEvents.FACT_VERIFIED`\n // constant (`apps/realtime-verification/src/socket/utils.ts`).\n | \"FACT_VERIFIED\"\n // Broadcast channel for every persisted utterance, real-time.\n // Subscribe with `sdk.on(\"TRANSCRIPTION_UPDATED\", cb)` to receive\n // `TranscriptionUpdate` payloads as transcripts land.\n //\n // Uppercase matches the backend's `SocketEvents.TRANSCRIPTION_UPDATED`\n // constant (`apps/realtime-verification/src/socket/utils.ts`).\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 and\n * conversations. When provided it is used to look up (or create) the matching\n * question row in the database instead of `id`. Keep this consistent across\n * calls — accuracy improvements and remaps configured in the management\n * dashboard are scoped per `questionId`.\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 critical?: boolean;\n is_skipped?: boolean;\n metadata?: Record<string, string>;\n};\n\nexport type QuestionStatus = \"searching\" | \"asked\" | \"not_asked\";\n\n/**\n * Per-fact verification state.\n *\n * Extended from the original three-state shape to carry progress signals\n * the backend already detects but previously could not express. Consumers\n * that switch on this value MUST treat unknown strings as \"processing\"\n * (default fall-through) so older SDK builds keep working after the\n * backend starts emitting the additive states.\n *\n * Semantics:\n * - `processing` generic, just queued or transcription not ready\n * - `awaiting_question` agent hasn't asked the question yet\n * - `awaiting_answer` question asked, customer hasn't answered yet\n * - `partial` partial evidence; backend still working on it\n * - `pending_confirmation_matched` backend has a matching answer but is\n * holding a settling window for mid-answer\n * clarifications (e.g. spellings, \"I mean…\");\n * resolves to `matched`/`unmatched`\n * - `pending_confirmation_unmatched` same as above but the held verdict is\n * `unmatched`; UI can show \"we heard X but it\n * doesn't match, waiting to confirm\" instead\n * of a hard red verdict\n * - `matched` terminal: answer matched expected\n * - `unmatched` terminal: budget exhausted with no 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\nexport interface AddFactResult {\n /** Conversation the fact was attached to. Useful for cross-fact correlation in agent UIs. */\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 is_valid_answer: boolean;\n question_asked?: boolean;\n /**\n * 0–1 (or 0–100 — scale matches the configured similarity method).\n * Similarity between the agent's utterance and the expected question.\n * Renamed from `match_score` to disambiguate from the answer-side score.\n */\n question_match_score?: number;\n /**\n * 0–1 score derived from how well the customer's answer matched expected.\n * Populated by the verification queue from partial-match heuristics\n * (numeric-prefix ratio, matched-components ratio). Undefined when no\n * partial signal exists or for terminal results before this rolls out.\n */\n answer_match_score?: number;\n metadata?: Record<string, string>;\n /**\n * Top-level state at terminal resolution. Always one of `matched`\n * or `unmatched` because the `addFact()` Promise only\n * resolves on terminals. Optional during the rollout window for\n * backwards compatibility with older backends.\n */\n verification_status?: VerificationStatus;\n /**\n * Per-fact partial-match breakdown carried through from the\n * verification queue's component-wise comparators. For numeric-prefix\n * facts these are `[\"prefix\"]` / `[\"suffix\"]`; future work will\n * generalise to addresses, names, dates, etc.\n */\n matched_components?: string[];\n missing_components?: string[];\n}\n\n/**\n * Payload of the `FACT_VERIFIED` broadcast event.\n *\n * Fires on EVERY state transition the verification queue produces —\n * non-terminal (`partial`, `awaiting_question`, `awaiting_answer`,\n * `pending_confirmation_matched`, `pending_confirmation_unmatched`,\n * `processing`) AND terminal (`matched`, `unmatched`).\n *\n * Subscribe with:\n * sdk.on(\"FACT_VERIFIED\", (payload: FactVerifiedPayload) => {...});\n *\n * `addFact()`'s Promise resolves only on terminals; this event stream\n * is the channel for rendering live progress in the agent UI.\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 /**\n * Inner data payload. Shape matches `AddFactResult` (minus the\n * top-level envelope fields) so consumers can reuse the same\n * rendering code for the terminal addFact() resolution and the\n * broadcast event.\n */\n data?: AddFactResult;\n error?: string;\n}\n\nexport type FlagFactResult = {\n success: boolean;\n};\n\n/**\n * Coarse dialog-act label produced by the backend's `UtteranceEnricher`.\n * Advisory only — do not gate production behaviour on this value; the\n * enricher emits its best-effort categorical guess plus a separate\n * `dialog_act_confidence` band.\n *\n * Mirrors `DialogAct` in\n * `libs/types/src/utterance-enrichment.ts` on the backend.\n */\nexport type DialogAct =\n | \"question\"\n | \"answer\"\n | \"acknowledgement\"\n | \"filler\"\n | \"other\";\n\n/**\n * Categorical confidence band for `dialog_act` ONLY. Named distinctly\n * from the numeric STT `confidence` field on the same utterance — the\n * two are unrelated and conflating them is a documented drift hazard on\n * the backend.\n *\n * Mirrors `DialogActConfidence` in\n * `libs/types/src/utterance-enrichment.ts` on the backend.\n */\nexport type DialogActConfidence = \"high\" | \"medium\" | \"low\";\n\n/**\n * Persisted utterance shape — matches `TranscriptionUtteranceDto` on the\n * gateway (`apps/realtime-verification/src/socket/realtimeVerification.gateway.output.dto.ts`)\n * and the `Utterance` interface in `libs/types/src/common.ts` field for\n * field. Sent over the wire by the `TRANSCRIPTION_UPDATED` broadcast.\n *\n * The 7 enricher classification fields are all optional because\n * pre-cutover utterances (persisted before backend PR #234) lack them.\n * Treat any missing or nullish value as \"unknown\" — NOT as a deliberate\n * negative signal. `is_ivr_filler_candidate === false` in particular\n * does NOT round-trip through `undefined`, so consumer logic that wants\n * \"definitely not a filler\" must check `=== false` after confirming the\n * field is present.\n */\nexport type Utterance = {\n /** UUIDv7 — chronologically sortable. Use `id` (NOT `order`) for sorting. */\n id: string;\n call_id: number;\n /**\n * NOT YET IMPLEMENTED — currently hardcoded to 0 at write sites on\n * the backend. Do not use for sorting; sort by `id` (UUIDv7) instead.\n */\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/**\n * Payload of the `TRANSCRIPTION_UPDATED` broadcast event. Mirrors\n * `TranscriptionUpdateResponseDto` on the gateway.\n */\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.0.0-develop.2\",\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","ConversationLanguage","FactAnswerFormatType","payload"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiqa/sdk",
3
- "version": "2.0.0-develop.1",
3
+ "version": "2.0.0-develop.3",
4
4
  "main": "dist/node/node.js",
5
5
  "module": "dist/node/node.js",
6
6
  "types": "dist/node/node.d.ts",