@aiqa/sdk 1.5.0-develop.2 → 1.5.0-develop.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/browser.d.ts +2 -1
- package/dist/browser/browser.js +96 -24
- package/dist/browser/browser.js.map +1 -1
- package/dist/node/node.d.ts +2 -1
- package/dist/node/node.js +96 -24
- package/dist/node/node.js.map +1 -1
- package/package.json +1 -1
package/dist/node/node.d.ts
CHANGED
|
@@ -257,7 +257,7 @@ declare abstract class IAiqaSdk {
|
|
|
257
257
|
abstract connect(): void;
|
|
258
258
|
abstract disconnect(): void;
|
|
259
259
|
abstract on(eventName: string, callback: (...args: any[]) => any): void;
|
|
260
|
-
abstract off(eventName: string): void;
|
|
260
|
+
abstract off(eventName: string, callback?: (...args: any[]) => any): void;
|
|
261
261
|
abstract getApplication(): Promise<Application>;
|
|
262
262
|
abstract addFact(fact: ApplicationFactInput): Promise<AddFactResult>;
|
|
263
263
|
abstract flagFact(factId: string): Promise<FlagFactResult>;
|
|
@@ -274,6 +274,7 @@ declare class AiQaSdk implements IAiqaSdk {
|
|
|
274
274
|
cachedApplication?: Application;
|
|
275
275
|
internalListeners: Map<SdkEvent, Set<(...args: any[]) => void>>;
|
|
276
276
|
internalEvents: Set<SdkEvent>;
|
|
277
|
+
private wrappersByEvent;
|
|
277
278
|
constructor(applicationId: string, applicationSecret: string, url?: string);
|
|
278
279
|
on(name: SdkEvent, callback: (...args: any[]) => any): void;
|
|
279
280
|
off(name: SdkEvent, callback?: (...args: any[]) => any): void;
|
package/dist/node/node.js
CHANGED
|
@@ -60,7 +60,7 @@ var compareVersions = (left, right) => {
|
|
|
60
60
|
// package.json
|
|
61
61
|
var package_default = {
|
|
62
62
|
name: "@aiqa/sdk",
|
|
63
|
-
version: "1.5.0-develop.
|
|
63
|
+
version: "1.5.0-develop.3",
|
|
64
64
|
main: "dist/node/node.js",
|
|
65
65
|
module: "dist/node/node.js",
|
|
66
66
|
types: "dist/node/node.d.ts",
|
|
@@ -142,9 +142,43 @@ var package_default = {
|
|
|
142
142
|
var SDK_VERSION = package_default.version ?? "0.0.1";
|
|
143
143
|
var DEFAULT_URL = "ws://localhost:3025/ws";
|
|
144
144
|
var DEFAULT_TIMEOUT_MS = 6e4;
|
|
145
|
+
var RUNTIME = typeof window !== "undefined" && typeof window.document !== "undefined" ? "browser" : "node";
|
|
146
|
+
var USER_AGENT = RUNTIME === "browser" ? typeof navigator !== "undefined" ? navigator.userAgent : "browser/unknown" : typeof process !== "undefined" ? `node ${process.version} ${process.platform}` : "node/unknown";
|
|
147
|
+
function isThenable(value) {
|
|
148
|
+
return value !== null && typeof value === "object" && typeof value.then === "function";
|
|
149
|
+
}
|
|
150
|
+
function wrapAckHandler(callback) {
|
|
151
|
+
return (...args) => {
|
|
152
|
+
const last = args[args.length - 1];
|
|
153
|
+
const hasAck = typeof last === "function";
|
|
154
|
+
const payload = hasAck ? args.slice(0, -1) : args;
|
|
155
|
+
try {
|
|
156
|
+
const handlerResult = callback(...payload);
|
|
157
|
+
if (isThenable(handlerResult)) {
|
|
158
|
+
handlerResult.then(void 0, (err) => {
|
|
159
|
+
console.error("[AiQaSdk] async event handler rejected:", err);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
} catch (err) {
|
|
163
|
+
console.error("[AiQaSdk] event handler threw:", err);
|
|
164
|
+
} finally {
|
|
165
|
+
if (hasAck) {
|
|
166
|
+
try {
|
|
167
|
+
last();
|
|
168
|
+
} catch {
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
}
|
|
145
174
|
var AiQaSdk = class {
|
|
146
175
|
constructor(applicationId, applicationSecret, url) {
|
|
147
176
|
this.socket = null;
|
|
177
|
+
// event → originalCallback → Set<wrappedCallback> registered on
|
|
178
|
+
// socket.io. A Set per (event, callback) so that subscribing the
|
|
179
|
+
// same fn twice registers two wrappers and two off() calls clear
|
|
180
|
+
// both.
|
|
181
|
+
this.wrappersByEvent = /* @__PURE__ */ new Map();
|
|
148
182
|
this.url = url ?? DEFAULT_URL;
|
|
149
183
|
this.internalListeners = /* @__PURE__ */ new Map();
|
|
150
184
|
this.internalEvents = /* @__PURE__ */ new Set(["authenticated"]);
|
|
@@ -169,7 +203,19 @@ var AiQaSdk = class {
|
|
|
169
203
|
if (this.isManagerEvent(name)) {
|
|
170
204
|
this.socket.io.on(name, callback);
|
|
171
205
|
} else {
|
|
172
|
-
|
|
206
|
+
const wrapped = wrapAckHandler(callback);
|
|
207
|
+
let wrappersByCallback = this.wrappersByEvent.get(name);
|
|
208
|
+
if (!wrappersByCallback) {
|
|
209
|
+
wrappersByCallback = /* @__PURE__ */ new Map();
|
|
210
|
+
this.wrappersByEvent.set(name, wrappersByCallback);
|
|
211
|
+
}
|
|
212
|
+
let wrappers = wrappersByCallback.get(callback);
|
|
213
|
+
if (!wrappers) {
|
|
214
|
+
wrappers = /* @__PURE__ */ new Set();
|
|
215
|
+
wrappersByCallback.set(callback, wrappers);
|
|
216
|
+
}
|
|
217
|
+
wrappers.add(wrapped);
|
|
218
|
+
this.socket.on(name, wrapped);
|
|
173
219
|
}
|
|
174
220
|
}
|
|
175
221
|
off(name, callback) {
|
|
@@ -192,6 +238,25 @@ var AiQaSdk = class {
|
|
|
192
238
|
}
|
|
193
239
|
if (this.isManagerEvent(name)) {
|
|
194
240
|
this.socket.io.off(name, callback);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (!callback) {
|
|
244
|
+
this.socket.off(name);
|
|
245
|
+
this.wrappersByEvent.delete(name);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const wrappersByCallback = this.wrappersByEvent.get(name);
|
|
249
|
+
const wrappers = wrappersByCallback?.get(callback);
|
|
250
|
+
if (wrappers && wrappers.size > 0) {
|
|
251
|
+
const wrapped = wrappers.values().next().value;
|
|
252
|
+
wrappers.delete(wrapped);
|
|
253
|
+
this.socket.off(name, wrapped);
|
|
254
|
+
if (wrappers.size === 0) {
|
|
255
|
+
wrappersByCallback.delete(callback);
|
|
256
|
+
if (wrappersByCallback.size === 0) {
|
|
257
|
+
this.wrappersByEvent.delete(name);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
195
260
|
} else {
|
|
196
261
|
this.socket.off(name, callback);
|
|
197
262
|
}
|
|
@@ -209,34 +274,38 @@ var AiQaSdk = class {
|
|
|
209
274
|
this.socket.on("connect", () => {
|
|
210
275
|
this.authenticate();
|
|
211
276
|
});
|
|
212
|
-
this.socket.on(
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
277
|
+
this.socket.on(
|
|
278
|
+
"app_version",
|
|
279
|
+
wrapAckHandler((payload) => {
|
|
280
|
+
let versionRange = payload;
|
|
281
|
+
if (typeof payload === "string") {
|
|
282
|
+
try {
|
|
283
|
+
versionRange = JSON.parse(payload);
|
|
284
|
+
} catch (error) {
|
|
285
|
+
versionRange = payload;
|
|
286
|
+
}
|
|
219
287
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
288
|
+
const minVersion = versionRange?.min;
|
|
289
|
+
const maxVersion = versionRange?.max;
|
|
290
|
+
if (minVersion || maxVersion) {
|
|
291
|
+
const tooLow = minVersion ? compareVersions(SDK_VERSION, minVersion) < 0 : false;
|
|
292
|
+
const tooHigh = maxVersion ? compareVersions(SDK_VERSION, maxVersion) > 0 : false;
|
|
293
|
+
if (tooLow || tooHigh) {
|
|
294
|
+
const error = new Error(
|
|
295
|
+
`SDK version ${SDK_VERSION} is not supported. Supported range: ${minVersion || "-"} to ${maxVersion || "-"}.`
|
|
296
|
+
);
|
|
297
|
+
this.socket.disconnect();
|
|
298
|
+
this.socket.emit("error", error);
|
|
299
|
+
}
|
|
232
300
|
}
|
|
233
|
-
}
|
|
234
|
-
|
|
301
|
+
})
|
|
302
|
+
);
|
|
235
303
|
}
|
|
236
304
|
disconnect() {
|
|
237
305
|
if (this.socket) {
|
|
238
306
|
this.socket.disconnect();
|
|
239
307
|
}
|
|
308
|
+
this.wrappersByEvent.clear();
|
|
240
309
|
}
|
|
241
310
|
sendMessage(method, data) {
|
|
242
311
|
return new Promise((resolve, reject) => {
|
|
@@ -333,7 +402,10 @@ var AiQaSdk = class {
|
|
|
333
402
|
try {
|
|
334
403
|
const result = await this.sendMessage("AUTHENTICATE" /* AUTHENTICATE */, {
|
|
335
404
|
applicationId: this.applicationId,
|
|
336
|
-
applicationSecretKey: this.applicationSecretKey
|
|
405
|
+
applicationSecretKey: this.applicationSecretKey,
|
|
406
|
+
sdkVersion: SDK_VERSION,
|
|
407
|
+
runtime: RUNTIME,
|
|
408
|
+
userAgent: USER_AGENT
|
|
337
409
|
});
|
|
338
410
|
const application = result && result.data !== void 0 ? result.data : result;
|
|
339
411
|
this.cachedApplication = application;
|
package/dist/node/node.js.map
CHANGED
|
@@ -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\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\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 this.socket.on(name, callback);\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 } 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(\"app_version\", (payload: any) => {\n let versionRange = payload;\n if (typeof payload === \"string\") {\n try {\n versionRange = JSON.parse(payload);\n } catch (error) {\n versionRange = payload;\n }\n }\n\n const minVersion = versionRange?.min;\n const maxVersion = versionRange?.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 disconnect() {\n if (this.socket) {\n this.socket.disconnect();\n }\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 });\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): 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.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","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 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.\nexport function wrapAckHandler(\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 payload = hasAck ? args.slice(0, -1) : args;\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 = wrapAckHandler(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 wrapAckHandler((payload: any) => {\n let versionRange = payload;\n if (typeof payload === \"string\") {\n try {\n versionRange = JSON.parse(payload);\n } catch (error) {\n versionRange = payload;\n }\n }\n\n const minVersion = versionRange?.min;\n const maxVersion = versionRange?.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.5.0-develop.3\",\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"]}
|