@burtson-labs/bandit-engine 2.0.167 → 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 (34) hide show
  1. package/dist/{chat-6N5B7A7F.mjs → chat-7LOFYEWE.mjs} +5 -5
  2. package/dist/chat-provider.js +154 -38
  3. package/dist/chat-provider.js.map +1 -1
  4. package/dist/chat-provider.mjs +2 -2
  5. package/dist/{chunk-PK3LFBGC.mjs → chunk-4SXXEGEK.mjs} +142 -27
  6. package/dist/chunk-4SXXEGEK.mjs.map +1 -0
  7. package/dist/{chunk-KDIL5WUL.mjs → chunk-62IYSU3I.mjs} +4 -3
  8. package/dist/chunk-62IYSU3I.mjs.map +1 -0
  9. package/dist/{chunk-5BZWJQ5O.mjs → chunk-JD6C64CT.mjs} +2 -2
  10. package/dist/{chunk-46OGYEME.mjs → chunk-KAXUI5H7.mjs} +154 -40
  11. package/dist/chunk-KAXUI5H7.mjs.map +1 -0
  12. package/dist/{chunk-US4TG745.mjs → chunk-QI67R5F6.mjs} +2 -2
  13. package/dist/{chunk-N4BQ6HKL.mjs → chunk-R3NOM2DG.mjs} +3 -3
  14. package/dist/{chunk-SHYNXDRO.mjs → chunk-YGOLNWXJ.mjs} +4 -4
  15. package/dist/index.d.mts +54 -2
  16. package/dist/index.d.ts +54 -2
  17. package/dist/index.js +306 -68
  18. package/dist/index.js.map +1 -1
  19. package/dist/index.mjs +7 -7
  20. package/dist/management/management.js +305 -68
  21. package/dist/management/management.js.map +1 -1
  22. package/dist/management/management.mjs +5 -5
  23. package/dist/modals/chat-modal/chat-modal.js +159 -42
  24. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  25. package/dist/modals/chat-modal/chat-modal.mjs +3 -3
  26. package/package.json +1 -1
  27. package/dist/chunk-46OGYEME.mjs.map +0 -1
  28. package/dist/chunk-KDIL5WUL.mjs.map +0 -1
  29. package/dist/chunk-PK3LFBGC.mjs.map +0 -1
  30. /package/dist/{chat-6N5B7A7F.mjs.map → chat-7LOFYEWE.mjs.map} +0 -0
  31. /package/dist/{chunk-5BZWJQ5O.mjs.map → chunk-JD6C64CT.mjs.map} +0 -0
  32. /package/dist/{chunk-US4TG745.mjs.map → chunk-QI67R5F6.mjs.map} +0 -0
  33. /package/dist/{chunk-N4BQ6HKL.mjs.map → chunk-R3NOM2DG.mjs.map} +0 -0
  34. /package/dist/{chunk-SHYNXDRO.mjs.map → chunk-YGOLNWXJ.mjs.map} +0 -0
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  management_default
3
- } from "../chunk-PK3LFBGC.mjs";
4
- import "../chunk-5BZWJQ5O.mjs";
3
+ } from "../chunk-4SXXEGEK.mjs";
4
+ import "../chunk-JD6C64CT.mjs";
5
5
  import "../chunk-CABOLDNR.mjs";
6
6
  import "../chunk-E5WMDLE3.mjs";
7
- import "../chunk-N4BQ6HKL.mjs";
8
- import "../chunk-KDIL5WUL.mjs";
9
- import "../chunk-46OGYEME.mjs";
7
+ import "../chunk-R3NOM2DG.mjs";
8
+ import "../chunk-62IYSU3I.mjs";
9
+ import "../chunk-KAXUI5H7.mjs";
10
10
  import "../chunk-SZJB5FLZ.mjs";
11
11
  import "../chunk-GRPTCHFN.mjs";
12
12
  import "../chunk-HNXPDIWC.mjs";
@@ -5316,7 +5316,7 @@ init_packageSettingsStore();
5316
5316
 
5317
5317
  // src/util.ts
5318
5318
  init_debugLogger();
5319
- var toTitleCase = (str) => str.toLowerCase().split(" ").map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
5319
+ var toTitleCase = (str2) => str2.toLowerCase().split(" ").map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
5320
5320
 
5321
5321
  // src/services/prompts/conversationStarters.ts
5322
5322
  init_debugLogger();
@@ -5772,6 +5772,95 @@ init_debugLogger();
5772
5772
 
5773
5773
  // src/services/vectorDatabase/vectorDatabaseService.ts
5774
5774
  init_debugLogger();
5775
+
5776
+ // src/services/vectorDatabase/knowledgeFiles.ts
5777
+ var KNOWLEDGE_PAGE_LIMIT_MAX = 200;
5778
+ var MEDIA_MIME_PREFIXES = ["image/", "video/", "audio/"];
5779
+ var MEDIA_EXTENSIONS = /* @__PURE__ */ new Set([
5780
+ "png",
5781
+ "jpg",
5782
+ "jpeg",
5783
+ "gif",
5784
+ "webp",
5785
+ "bmp",
5786
+ "tif",
5787
+ "tiff",
5788
+ "heic",
5789
+ "heif",
5790
+ "svg",
5791
+ "ico",
5792
+ "avif",
5793
+ "mp4",
5794
+ "mov",
5795
+ "m4v",
5796
+ "webm",
5797
+ "avi",
5798
+ "mkv",
5799
+ "mp3",
5800
+ "wav",
5801
+ "m4a",
5802
+ "aac",
5803
+ "ogg",
5804
+ "flac"
5805
+ ]);
5806
+ var TEMP_NAME = /^(~WRD\d*|~\$|~\w+\.tmp$)|\.tmp$/i;
5807
+ var str = (value) => typeof value === "string" ? value : "";
5808
+ var recordName = (record) => str(record.filename) || str(record.fileName) || str(record.name);
5809
+ var recordMime = (record) => (str(record.mimeType) || str(record.contentType) || str(record.type)).toLowerCase();
5810
+ var isLikelyKnowledgeFile = (record) => {
5811
+ const name = recordName(record);
5812
+ if (TEMP_NAME.test(name)) return false;
5813
+ const ext = name.includes(".") ? name.split(".").pop().toLowerCase() : "";
5814
+ if (MEDIA_EXTENSIONS.has(ext)) return false;
5815
+ const mime = recordMime(record);
5816
+ if (MEDIA_MIME_PREFIXES.some((prefix) => mime.startsWith(prefix))) return false;
5817
+ return true;
5818
+ };
5819
+ var toRecords = (value) => Array.isArray(value) ? value.filter((item) => !!item && typeof item === "object" && !Array.isArray(item)) : [];
5820
+ var num = (value, fallback) => typeof value === "number" && Number.isFinite(value) ? value : fallback;
5821
+ var parseKnowledgeFileList = (body, request) => {
5822
+ if (body && typeof body === "object" && !Array.isArray(body) && "total" in body) {
5823
+ const envelope = body;
5824
+ const files2 = toRecords(envelope.files);
5825
+ const total = num(envelope.total, files2.length);
5826
+ const skip = num(envelope.skip, request.skip);
5827
+ const scope = envelope.scope === "all" ? "all" : "knowledge";
5828
+ return {
5829
+ files: files2,
5830
+ total,
5831
+ hasMore: typeof envelope.hasMore === "boolean" ? envelope.hasMore : skip + files2.length < total,
5832
+ scope,
5833
+ serverScoped: true,
5834
+ knowledgeFilterUnavailable: envelope.knowledgeFilterUnavailable === true,
5835
+ hiddenCount: 0
5836
+ };
5837
+ }
5838
+ const raw = body && typeof body === "object" && !Array.isArray(body) ? toRecords(body.files) : toRecords(body);
5839
+ const hasMore = raw.length >= request.limit;
5840
+ if (request.scope === "all") {
5841
+ return {
5842
+ files: raw,
5843
+ total: request.skip + raw.length,
5844
+ hasMore,
5845
+ scope: "all",
5846
+ serverScoped: false,
5847
+ knowledgeFilterUnavailable: false,
5848
+ hiddenCount: 0
5849
+ };
5850
+ }
5851
+ const files = raw.filter(isLikelyKnowledgeFile);
5852
+ return {
5853
+ files,
5854
+ total: files.length,
5855
+ hasMore,
5856
+ scope: "knowledge",
5857
+ serverScoped: false,
5858
+ knowledgeFilterUnavailable: false,
5859
+ hiddenCount: raw.length - files.length
5860
+ };
5861
+ };
5862
+
5863
+ // src/services/vectorDatabase/vectorDatabaseService.ts
5775
5864
  var VectorDatabaseService = class {
5776
5865
  baseUrl;
5777
5866
  fileStorageApiUrl;
@@ -6531,36 +6620,44 @@ var VectorDatabaseService = class {
6531
6620
  }
6532
6621
  }
6533
6622
  /**
6534
- * Get user's files - tries both Gateway API and file storage API
6623
+ * One page of the Knowledge file list from the gateway (see ./knowledgeFiles).
6624
+ *
6625
+ * No fallback to the file storage API here: its listing is the whole Drive (every product's
6626
+ * files), which is exactly what Knowledge must not show. A failure surfaces to the caller.
6535
6627
  */
6536
- async getUserFiles(skip = 0, limit = 50) {
6628
+ async listKnowledgeFiles(skip = 0, limit = 50, scope = "knowledge") {
6537
6629
  if (!this.isAvailable()) {
6538
- return [];
6630
+ return parseKnowledgeFileList([], { skip, limit, scope });
6631
+ }
6632
+ const safeSkip = Math.max(0, Math.floor(skip));
6633
+ const safeLimit = Math.min(KNOWLEDGE_PAGE_LIMIT_MAX, Math.max(1, Math.floor(limit)));
6634
+ const query = new URLSearchParams({
6635
+ skip: String(safeSkip),
6636
+ limit: String(safeLimit),
6637
+ scope
6638
+ });
6639
+ debugLogger.debug("Fetching knowledge files from Gateway API", { skip: safeSkip, limit: safeLimit, scope });
6640
+ const response = await fetch(`${this.baseUrl}/embedding/files?${query.toString()}`, {
6641
+ method: "GET",
6642
+ headers: this.getHeaders()
6643
+ });
6644
+ if (!response.ok) {
6645
+ throw new Error(`Couldn't list documents (gateway answered ${response.status})`);
6539
6646
  }
6647
+ const body = await response.json();
6648
+ return parseKnowledgeFileList(body, { skip: safeSkip, limit: safeLimit, scope });
6649
+ }
6650
+ /**
6651
+ * Get the user's Knowledge files (first page, knowledge scope). Kept for existing callers;
6652
+ * prefer listKnowledgeFiles for totals and paging.
6653
+ */
6654
+ async getUserFiles(skip = 0, limit = 50) {
6540
6655
  try {
6541
- debugLogger.debug("Fetching user files from Gateway API", { skip, limit });
6542
- const response = await fetch(`${this.baseUrl}/embedding/files?skip=${skip}&limit=${limit}`, {
6543
- method: "GET",
6544
- headers: this.getHeaders()
6545
- });
6546
- if (!response.ok) {
6547
- debugLogger.warn("Gateway API files endpoint failed, falling back to file storage API", {
6548
- status: response.status
6549
- });
6550
- return await this.getUserFilesFromFileStorage(skip, limit);
6551
- }
6552
- const result = await response.json();
6553
- debugLogger.debug("Gateway API files response", result);
6554
- if (Array.isArray(result)) {
6555
- return this.toRecordArray(result);
6556
- }
6557
- if (result && Array.isArray(result.files)) {
6558
- return this.toRecordArray(result.files);
6559
- }
6560
- return [];
6656
+ const page = await this.listKnowledgeFiles(skip, limit, "knowledge");
6657
+ return page.files;
6561
6658
  } catch (error) {
6562
- debugLogger.error("Gateway API failed while fetching user files, trying file storage API", { error });
6563
- return await this.getUserFilesFromFileStorage(skip, limit);
6659
+ debugLogger.error("Failed to fetch knowledge files from Gateway API", { error });
6660
+ return [];
6564
6661
  }
6565
6662
  }
6566
6663
  /**
@@ -9340,6 +9437,7 @@ var knowledgeDocToVectorDocument = (doc) => ({
9340
9437
  isTeamContent: doc.isTeamContent ?? false,
9341
9438
  contentSource: doc.contentSource ?? (doc.isTeamContent ? "team" : "user")
9342
9439
  });
9440
+ var optionalString = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
9343
9441
  var rawFileRecordToVectorDocument = (record) => {
9344
9442
  if (!record || typeof record !== "object") {
9345
9443
  return null;
@@ -9354,10 +9452,12 @@ var rawFileRecordToVectorDocument = (record) => {
9354
9452
  const mimeType = typeof record.mimeType === "string" ? record.mimeType : "application/octet-stream";
9355
9453
  const uploadedBy = typeof record.uploadedBy === "string" ? record.uploadedBy : "unknown";
9356
9454
  const uploadedAt = typeof record.uploadedAt === "string" ? record.uploadedAt : (/* @__PURE__ */ new Date()).toISOString();
9357
- const isUserContent = typeof record.isUserContent === "boolean" ? record.isUserContent : true;
9358
- const isTeamContent = typeof record.isTeamContent === "boolean" ? record.isTeamContent : false;
9359
- const contentSource = record.contentSource === "team" ? "team" : "user";
9455
+ const teamSid = optionalString(record.teamSid);
9456
+ const isTeamContent = typeof record.isTeamContent === "boolean" ? record.isTeamContent : !!teamSid;
9457
+ const isUserContent = typeof record.isUserContent === "boolean" ? record.isUserContent : !isTeamContent;
9458
+ const contentSource = record.contentSource === "team" || record.contentSource === void 0 && isTeamContent ? "team" : "user";
9360
9459
  const score = typeof record.score === "number" ? record.score : void 0;
9460
+ const size = typeof record.size === "number" && Number.isFinite(record.size) && record.size >= 0 ? record.size : void 0;
9361
9461
  return {
9362
9462
  id,
9363
9463
  filename,
@@ -9368,7 +9468,12 @@ var rawFileRecordToVectorDocument = (record) => {
9368
9468
  isUserContent,
9369
9469
  isTeamContent,
9370
9470
  contentSource,
9371
- score
9471
+ score,
9472
+ size,
9473
+ bucket: optionalString(record.bucket),
9474
+ teamSid,
9475
+ userEmail: optionalString(record.userEmail),
9476
+ preview
9372
9477
  };
9373
9478
  };
9374
9479
  var useVectorStore = () => {
@@ -9920,22 +10025,32 @@ var useVectorStore = () => {
9920
10025
  (0, import_react6.useEffect)(() => {
9921
10026
  initializeVectorService();
9922
10027
  }, [initializeVectorService]);
9923
- const getUserDocuments = (0, import_react6.useCallback)(async (skip = 0, limit = 50) => {
10028
+ const getKnowledgeDocumentsPage = (0, import_react6.useCallback)(async (skip = 0, limit = 50, scope = "knowledge") => {
9924
10029
  if (!status.isEnabled || status.migrationRequired) {
9925
- return [];
10030
+ return {
10031
+ documents: [],
10032
+ total: 0,
10033
+ hasMore: false,
10034
+ scope,
10035
+ serverScoped: false,
10036
+ knowledgeFilterUnavailable: false,
10037
+ hiddenCount: 0
10038
+ };
9926
10039
  }
10040
+ const { files, ...meta } = await vectorDatabaseService.listKnowledgeFiles(skip, limit, scope);
10041
+ const documents = files.map(rawFileRecordToVectorDocument).filter((doc) => doc !== null);
10042
+ debugLogger.info("Retrieved knowledge documents", { count: documents.length, total: meta.total, scope: meta.scope });
10043
+ return { documents, ...meta };
10044
+ }, [status.isEnabled, status.migrationRequired]);
10045
+ const getUserDocuments = (0, import_react6.useCallback)(async (skip = 0, limit = 50) => {
9927
10046
  try {
9928
- const records = await vectorDatabaseService.getUserFiles(skip, limit);
9929
- const documents = records.map(rawFileRecordToVectorDocument).filter((doc) => doc !== null);
9930
- debugLogger.info("Retrieved user documents from vector database", {
9931
- count: documents.length
9932
- });
9933
- return documents;
10047
+ const page = await getKnowledgeDocumentsPage(skip, limit, "knowledge");
10048
+ return page.documents;
9934
10049
  } catch (error) {
9935
10050
  debugLogger.error("Failed to get user documents", { error });
9936
10051
  return [];
9937
10052
  }
9938
- }, [status.isEnabled, status.migrationRequired]);
10053
+ }, [getKnowledgeDocumentsPage]);
9939
10054
  const deleteDocument = (0, import_react6.useCallback)(async (fileId) => {
9940
10055
  if (!status.isEnabled || status.migrationRequired) {
9941
10056
  return {
@@ -10032,6 +10147,7 @@ var useVectorStore = () => {
10032
10147
  uploadDocument,
10033
10148
  searchDocuments,
10034
10149
  getUserDocuments,
10150
+ getKnowledgeDocumentsPage,
10035
10151
  deleteDocument,
10036
10152
  downloadVectorFile,
10037
10153
  getFilePreview,
@@ -10362,7 +10478,8 @@ var DocumentCard = ({
10362
10478
  const metaLine = [
10363
10479
  sourceLabel,
10364
10480
  fileInfo.language ?? fileInfo.category,
10365
- formatFileSize((doc.content?.length || 0) * 2)
10481
+ // Real file size when the listing reports one; otherwise estimate from the text content.
10482
+ formatFileSize(typeof doc.size === "number" && doc.size > 0 ? doc.size : (doc.content?.length || 0) * 2)
10366
10483
  ].join(" \xB7 ");
10367
10484
  if (documentState === "unavailable" && !allowErrorStates) {
10368
10485
  return null;
@@ -19074,8 +19191,8 @@ var ChatModal = ({
19074
19191
  }
19075
19192
  }
19076
19193
  };
19077
- const toTitleCase2 = (str) => {
19078
- return str.replace(/\w\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase());
19194
+ const toTitleCase2 = (str2) => {
19195
+ return str2.replace(/\w\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase());
19079
19196
  };
19080
19197
  (0, import_react27.useEffect)(() => {
19081
19198
  if (!SYSTEM_PROMPT) {