@burtson-labs/bandit-engine 2.0.166 → 2.0.168

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.
Files changed (48) hide show
  1. package/dist/chat-7LOFYEWE.mjs +15 -0
  2. package/dist/chat-provider.js +154 -38
  3. package/dist/chat-provider.js.map +1 -1
  4. package/dist/chat-provider.mjs +5 -5
  5. package/dist/{chunk-M4DWPNZZ.mjs → chunk-4SXXEGEK.mjs} +145 -30
  6. package/dist/chunk-4SXXEGEK.mjs.map +1 -0
  7. package/dist/{chunk-Q2DINRIU.mjs → chunk-62IYSU3I.mjs} +5 -4
  8. package/dist/chunk-62IYSU3I.mjs.map +1 -0
  9. package/dist/{chunk-6KRAPGXE.mjs → chunk-CABOLDNR.mjs} +2 -2
  10. package/dist/{chunk-MM3NRLVR.mjs → chunk-E5WMDLE3.mjs} +2 -2
  11. package/dist/{chunk-IB2LPSQQ.mjs → chunk-JD6C64CT.mjs} +2 -2
  12. package/dist/{chunk-33OSALGS.mjs → chunk-KAXUI5H7.mjs} +155 -41
  13. package/dist/chunk-KAXUI5H7.mjs.map +1 -0
  14. package/dist/{chunk-A6W6XIDD.mjs → chunk-QI67R5F6.mjs} +5 -5
  15. package/dist/{chunk-75OBTJPN.mjs → chunk-R3NOM2DG.mjs} +4 -4
  16. package/dist/{chunk-YH5YWK4K.mjs → chunk-SZJB5FLZ.mjs} +2 -2
  17. package/dist/{chunk-YH5YWK4K.mjs.map → chunk-SZJB5FLZ.mjs.map} +1 -1
  18. package/dist/{chunk-WSZE3DDJ.mjs → chunk-YGOLNWXJ.mjs} +9 -6
  19. package/dist/chunk-YGOLNWXJ.mjs.map +1 -0
  20. package/dist/index.d.mts +56 -4
  21. package/dist/index.d.ts +56 -4
  22. package/dist/index.js +309 -68
  23. package/dist/index.js.map +1 -1
  24. package/dist/index.mjs +10 -10
  25. package/dist/management/management.js +308 -68
  26. package/dist/management/management.js.map +1 -1
  27. package/dist/management/management.mjs +8 -8
  28. package/dist/modals/chat-modal/chat-modal.js +159 -42
  29. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  30. package/dist/modals/chat-modal/chat-modal.mjs +4 -4
  31. package/dist/{modelStore-F6JQUXGG.mjs → modelStore-TFNX4GEC.mjs} +2 -2
  32. package/dist/{public-0EYmtpGD.d.ts → public-DJa4Db00.d.mts} +9 -0
  33. package/dist/{public-0EYmtpGD.d.mts → public-DJa4Db00.d.ts} +9 -0
  34. package/dist/public-types.d.mts +1 -1
  35. package/dist/public-types.d.ts +1 -1
  36. package/package.json +1 -1
  37. package/dist/chat-RCMZYACB.mjs +0 -15
  38. package/dist/chunk-33OSALGS.mjs.map +0 -1
  39. package/dist/chunk-M4DWPNZZ.mjs.map +0 -1
  40. package/dist/chunk-Q2DINRIU.mjs.map +0 -1
  41. package/dist/chunk-WSZE3DDJ.mjs.map +0 -1
  42. /package/dist/{chat-RCMZYACB.mjs.map → chat-7LOFYEWE.mjs.map} +0 -0
  43. /package/dist/{chunk-6KRAPGXE.mjs.map → chunk-CABOLDNR.mjs.map} +0 -0
  44. /package/dist/{chunk-MM3NRLVR.mjs.map → chunk-E5WMDLE3.mjs.map} +0 -0
  45. /package/dist/{chunk-IB2LPSQQ.mjs.map → chunk-JD6C64CT.mjs.map} +0 -0
  46. /package/dist/{chunk-A6W6XIDD.mjs.map → chunk-QI67R5F6.mjs.map} +0 -0
  47. /package/dist/{chunk-75OBTJPN.mjs.map → chunk-R3NOM2DG.mjs.map} +0 -0
  48. /package/dist/{modelStore-F6JQUXGG.mjs.map → modelStore-TFNX4GEC.mjs.map} +0 -0
@@ -0,0 +1,15 @@
1
+ import {
2
+ chat_default
3
+ } from "./chunk-YGOLNWXJ.mjs";
4
+ import "./chunk-ONQMRE2G.mjs";
5
+ import "./chunk-JD6C64CT.mjs";
6
+ import "./chunk-E5WMDLE3.mjs";
7
+ import "./chunk-62IYSU3I.mjs";
8
+ import "./chunk-KAXUI5H7.mjs";
9
+ import "./chunk-SZJB5FLZ.mjs";
10
+ import "./chunk-GRPTCHFN.mjs";
11
+ import "./chunk-HNXPDIWC.mjs";
12
+ export {
13
+ chat_default as default
14
+ };
15
+ //# sourceMappingURL=chat-7LOFYEWE.mjs.map
@@ -7563,6 +7563,95 @@ init_debugLogger();
7563
7563
 
7564
7564
  // src/services/vectorDatabase/vectorDatabaseService.ts
7565
7565
  init_debugLogger();
7566
+
7567
+ // src/services/vectorDatabase/knowledgeFiles.ts
7568
+ var KNOWLEDGE_PAGE_LIMIT_MAX = 200;
7569
+ var MEDIA_MIME_PREFIXES = ["image/", "video/", "audio/"];
7570
+ var MEDIA_EXTENSIONS = /* @__PURE__ */ new Set([
7571
+ "png",
7572
+ "jpg",
7573
+ "jpeg",
7574
+ "gif",
7575
+ "webp",
7576
+ "bmp",
7577
+ "tif",
7578
+ "tiff",
7579
+ "heic",
7580
+ "heif",
7581
+ "svg",
7582
+ "ico",
7583
+ "avif",
7584
+ "mp4",
7585
+ "mov",
7586
+ "m4v",
7587
+ "webm",
7588
+ "avi",
7589
+ "mkv",
7590
+ "mp3",
7591
+ "wav",
7592
+ "m4a",
7593
+ "aac",
7594
+ "ogg",
7595
+ "flac"
7596
+ ]);
7597
+ var TEMP_NAME = /^(~WRD\d*|~\$|~\w+\.tmp$)|\.tmp$/i;
7598
+ var str = (value) => typeof value === "string" ? value : "";
7599
+ var recordName = (record) => str(record.filename) || str(record.fileName) || str(record.name);
7600
+ var recordMime = (record) => (str(record.mimeType) || str(record.contentType) || str(record.type)).toLowerCase();
7601
+ var isLikelyKnowledgeFile = (record) => {
7602
+ const name = recordName(record);
7603
+ if (TEMP_NAME.test(name)) return false;
7604
+ const ext = name.includes(".") ? name.split(".").pop().toLowerCase() : "";
7605
+ if (MEDIA_EXTENSIONS.has(ext)) return false;
7606
+ const mime = recordMime(record);
7607
+ if (MEDIA_MIME_PREFIXES.some((prefix) => mime.startsWith(prefix))) return false;
7608
+ return true;
7609
+ };
7610
+ var toRecords = (value) => Array.isArray(value) ? value.filter((item) => !!item && typeof item === "object" && !Array.isArray(item)) : [];
7611
+ var num = (value, fallback) => typeof value === "number" && Number.isFinite(value) ? value : fallback;
7612
+ var parseKnowledgeFileList = (body, request) => {
7613
+ if (body && typeof body === "object" && !Array.isArray(body) && "total" in body) {
7614
+ const envelope = body;
7615
+ const files2 = toRecords(envelope.files);
7616
+ const total = num(envelope.total, files2.length);
7617
+ const skip = num(envelope.skip, request.skip);
7618
+ const scope = envelope.scope === "all" ? "all" : "knowledge";
7619
+ return {
7620
+ files: files2,
7621
+ total,
7622
+ hasMore: typeof envelope.hasMore === "boolean" ? envelope.hasMore : skip + files2.length < total,
7623
+ scope,
7624
+ serverScoped: true,
7625
+ knowledgeFilterUnavailable: envelope.knowledgeFilterUnavailable === true,
7626
+ hiddenCount: 0
7627
+ };
7628
+ }
7629
+ const raw = body && typeof body === "object" && !Array.isArray(body) ? toRecords(body.files) : toRecords(body);
7630
+ const hasMore = raw.length >= request.limit;
7631
+ if (request.scope === "all") {
7632
+ return {
7633
+ files: raw,
7634
+ total: request.skip + raw.length,
7635
+ hasMore,
7636
+ scope: "all",
7637
+ serverScoped: false,
7638
+ knowledgeFilterUnavailable: false,
7639
+ hiddenCount: 0
7640
+ };
7641
+ }
7642
+ const files = raw.filter(isLikelyKnowledgeFile);
7643
+ return {
7644
+ files,
7645
+ total: files.length,
7646
+ hasMore,
7647
+ scope: "knowledge",
7648
+ serverScoped: false,
7649
+ knowledgeFilterUnavailable: false,
7650
+ hiddenCount: raw.length - files.length
7651
+ };
7652
+ };
7653
+
7654
+ // src/services/vectorDatabase/vectorDatabaseService.ts
7566
7655
  var VectorDatabaseService = class {
7567
7656
  baseUrl;
7568
7657
  fileStorageApiUrl;
@@ -8322,36 +8411,44 @@ var VectorDatabaseService = class {
8322
8411
  }
8323
8412
  }
8324
8413
  /**
8325
- * Get user's files - tries both Gateway API and file storage API
8414
+ * One page of the Knowledge file list from the gateway (see ./knowledgeFiles).
8415
+ *
8416
+ * No fallback to the file storage API here: its listing is the whole Drive (every product's
8417
+ * files), which is exactly what Knowledge must not show. A failure surfaces to the caller.
8326
8418
  */
8327
- async getUserFiles(skip = 0, limit = 50) {
8419
+ async listKnowledgeFiles(skip = 0, limit = 50, scope = "knowledge") {
8328
8420
  if (!this.isAvailable()) {
8329
- return [];
8421
+ return parseKnowledgeFileList([], { skip, limit, scope });
8422
+ }
8423
+ const safeSkip = Math.max(0, Math.floor(skip));
8424
+ const safeLimit = Math.min(KNOWLEDGE_PAGE_LIMIT_MAX, Math.max(1, Math.floor(limit)));
8425
+ const query = new URLSearchParams({
8426
+ skip: String(safeSkip),
8427
+ limit: String(safeLimit),
8428
+ scope
8429
+ });
8430
+ debugLogger.debug("Fetching knowledge files from Gateway API", { skip: safeSkip, limit: safeLimit, scope });
8431
+ const response = await fetch(`${this.baseUrl}/embedding/files?${query.toString()}`, {
8432
+ method: "GET",
8433
+ headers: this.getHeaders()
8434
+ });
8435
+ if (!response.ok) {
8436
+ throw new Error(`Couldn't list documents (gateway answered ${response.status})`);
8330
8437
  }
8438
+ const body = await response.json();
8439
+ return parseKnowledgeFileList(body, { skip: safeSkip, limit: safeLimit, scope });
8440
+ }
8441
+ /**
8442
+ * Get the user's Knowledge files (first page, knowledge scope). Kept for existing callers;
8443
+ * prefer listKnowledgeFiles for totals and paging.
8444
+ */
8445
+ async getUserFiles(skip = 0, limit = 50) {
8331
8446
  try {
8332
- debugLogger.debug("Fetching user files from Gateway API", { skip, limit });
8333
- const response = await fetch(`${this.baseUrl}/embedding/files?skip=${skip}&limit=${limit}`, {
8334
- method: "GET",
8335
- headers: this.getHeaders()
8336
- });
8337
- if (!response.ok) {
8338
- debugLogger.warn("Gateway API files endpoint failed, falling back to file storage API", {
8339
- status: response.status
8340
- });
8341
- return await this.getUserFilesFromFileStorage(skip, limit);
8342
- }
8343
- const result = await response.json();
8344
- debugLogger.debug("Gateway API files response", result);
8345
- if (Array.isArray(result)) {
8346
- return this.toRecordArray(result);
8347
- }
8348
- if (result && Array.isArray(result.files)) {
8349
- return this.toRecordArray(result.files);
8350
- }
8351
- return [];
8447
+ const page = await this.listKnowledgeFiles(skip, limit, "knowledge");
8448
+ return page.files;
8352
8449
  } catch (error) {
8353
- debugLogger.error("Gateway API failed while fetching user files, trying file storage API", { error });
8354
- return await this.getUserFilesFromFileStorage(skip, limit);
8450
+ debugLogger.error("Failed to fetch knowledge files from Gateway API", { error });
8451
+ return [];
8355
8452
  }
8356
8453
  }
8357
8454
  /**
@@ -9527,6 +9624,7 @@ var knowledgeDocToVectorDocument = (doc) => ({
9527
9624
  isTeamContent: doc.isTeamContent ?? false,
9528
9625
  contentSource: doc.contentSource ?? (doc.isTeamContent ? "team" : "user")
9529
9626
  });
9627
+ var optionalString = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
9530
9628
  var rawFileRecordToVectorDocument = (record) => {
9531
9629
  if (!record || typeof record !== "object") {
9532
9630
  return null;
@@ -9541,10 +9639,12 @@ var rawFileRecordToVectorDocument = (record) => {
9541
9639
  const mimeType = typeof record.mimeType === "string" ? record.mimeType : "application/octet-stream";
9542
9640
  const uploadedBy = typeof record.uploadedBy === "string" ? record.uploadedBy : "unknown";
9543
9641
  const uploadedAt = typeof record.uploadedAt === "string" ? record.uploadedAt : (/* @__PURE__ */ new Date()).toISOString();
9544
- const isUserContent = typeof record.isUserContent === "boolean" ? record.isUserContent : true;
9545
- const isTeamContent = typeof record.isTeamContent === "boolean" ? record.isTeamContent : false;
9546
- const contentSource = record.contentSource === "team" ? "team" : "user";
9642
+ const teamSid = optionalString(record.teamSid);
9643
+ const isTeamContent = typeof record.isTeamContent === "boolean" ? record.isTeamContent : !!teamSid;
9644
+ const isUserContent = typeof record.isUserContent === "boolean" ? record.isUserContent : !isTeamContent;
9645
+ const contentSource = record.contentSource === "team" || record.contentSource === void 0 && isTeamContent ? "team" : "user";
9547
9646
  const score = typeof record.score === "number" ? record.score : void 0;
9647
+ const size = typeof record.size === "number" && Number.isFinite(record.size) && record.size >= 0 ? record.size : void 0;
9548
9648
  return {
9549
9649
  id,
9550
9650
  filename,
@@ -9555,7 +9655,12 @@ var rawFileRecordToVectorDocument = (record) => {
9555
9655
  isUserContent,
9556
9656
  isTeamContent,
9557
9657
  contentSource,
9558
- score
9658
+ score,
9659
+ size,
9660
+ bucket: optionalString(record.bucket),
9661
+ teamSid,
9662
+ userEmail: optionalString(record.userEmail),
9663
+ preview
9559
9664
  };
9560
9665
  };
9561
9666
  var useVectorStore = () => {
@@ -10107,22 +10212,32 @@ var useVectorStore = () => {
10107
10212
  (0, import_react3.useEffect)(() => {
10108
10213
  initializeVectorService();
10109
10214
  }, [initializeVectorService]);
10110
- const getUserDocuments = (0, import_react3.useCallback)(async (skip = 0, limit = 50) => {
10215
+ const getKnowledgeDocumentsPage = (0, import_react3.useCallback)(async (skip = 0, limit = 50, scope = "knowledge") => {
10111
10216
  if (!status.isEnabled || status.migrationRequired) {
10112
- return [];
10217
+ return {
10218
+ documents: [],
10219
+ total: 0,
10220
+ hasMore: false,
10221
+ scope,
10222
+ serverScoped: false,
10223
+ knowledgeFilterUnavailable: false,
10224
+ hiddenCount: 0
10225
+ };
10113
10226
  }
10227
+ const { files, ...meta } = await vectorDatabaseService.listKnowledgeFiles(skip, limit, scope);
10228
+ const documents = files.map(rawFileRecordToVectorDocument).filter((doc) => doc !== null);
10229
+ debugLogger.info("Retrieved knowledge documents", { count: documents.length, total: meta.total, scope: meta.scope });
10230
+ return { documents, ...meta };
10231
+ }, [status.isEnabled, status.migrationRequired]);
10232
+ const getUserDocuments = (0, import_react3.useCallback)(async (skip = 0, limit = 50) => {
10114
10233
  try {
10115
- const records = await vectorDatabaseService.getUserFiles(skip, limit);
10116
- const documents = records.map(rawFileRecordToVectorDocument).filter((doc) => doc !== null);
10117
- debugLogger.info("Retrieved user documents from vector database", {
10118
- count: documents.length
10119
- });
10120
- return documents;
10234
+ const page = await getKnowledgeDocumentsPage(skip, limit, "knowledge");
10235
+ return page.documents;
10121
10236
  } catch (error) {
10122
10237
  debugLogger.error("Failed to get user documents", { error });
10123
10238
  return [];
10124
10239
  }
10125
- }, [status.isEnabled, status.migrationRequired]);
10240
+ }, [getKnowledgeDocumentsPage]);
10126
10241
  const deleteDocument = (0, import_react3.useCallback)(async (fileId) => {
10127
10242
  if (!status.isEnabled || status.migrationRequired) {
10128
10243
  return {
@@ -10219,6 +10334,7 @@ var useVectorStore = () => {
10219
10334
  uploadDocument,
10220
10335
  searchDocuments,
10221
10336
  getUserDocuments,
10337
+ getKnowledgeDocumentsPage,
10222
10338
  deleteDocument,
10223
10339
  downloadVectorFile,
10224
10340
  getFilePreview,