@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
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  indexedDBService_default,
3
3
  usePackageSettingsStore
4
- } from "./chunk-YH5YWK4K.mjs";
4
+ } from "./chunk-SZJB5FLZ.mjs";
5
5
  import {
6
6
  authenticationService,
7
7
  useAIProviderStore
@@ -213,4 +213,4 @@ var aiProviderInitService = AIProviderInitService.getInstance();
213
213
  export {
214
214
  aiProviderInitService
215
215
  };
216
- //# sourceMappingURL=chunk-6KRAPGXE.mjs.map
216
+ //# sourceMappingURL=chunk-CABOLDNR.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  indexedDBService_default,
3
3
  usePackageSettingsStore
4
- } from "./chunk-YH5YWK4K.mjs";
4
+ } from "./chunk-SZJB5FLZ.mjs";
5
5
  import {
6
6
  authenticationService
7
7
  } from "./chunk-GRPTCHFN.mjs";
@@ -387,4 +387,4 @@ export {
387
387
  discoverMcpTools,
388
388
  useMCPToolsStore
389
389
  };
390
- //# sourceMappingURL=chunk-MM3NRLVR.mjs.map
390
+ //# sourceMappingURL=chunk-E5WMDLE3.mjs.map
@@ -6,7 +6,7 @@ import {
6
6
  markdownSanitizeSchema,
7
7
  maybeHandleFileLinkClick,
8
8
  renderLowlightChildren
9
- } from "./chunk-Q2DINRIU.mjs";
9
+ } from "./chunk-62IYSU3I.mjs";
10
10
 
11
11
  // src/components/StreamingMarkdown.tsx
12
12
  import React, { useEffect, useMemo, useRef, useState } from "react";
@@ -513,4 +513,4 @@ export {
513
513
  isNativeShell,
514
514
  isStandalonePwa
515
515
  };
516
- //# sourceMappingURL=chunk-IB2LPSQQ.mjs.map
516
+ //# sourceMappingURL=chunk-JD6C64CT.mjs.map
@@ -2,7 +2,7 @@ import {
2
2
  indexedDBService_default,
3
3
  useModelStore,
4
4
  usePackageSettingsStore
5
- } from "./chunk-YH5YWK4K.mjs";
5
+ } from "./chunk-SZJB5FLZ.mjs";
6
6
  import {
7
7
  AUTH_TOKEN_CHANGED_EVENT,
8
8
  TOKEN_KEY,
@@ -2090,7 +2090,7 @@ var useKnowledgeStore = create6((set, get) => ({
2090
2090
  }));
2091
2091
 
2092
2092
  // src/util.ts
2093
- var toTitleCase = (str) => str.toLowerCase().split(" ").map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
2093
+ var toTitleCase = (str2) => str2.toLowerCase().split(" ").map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
2094
2094
  var generateSeed = () => Math.floor(Math.random() * 1e4);
2095
2095
  var fetchAndConvertToBase64 = async (src) => {
2096
2096
  const response = await fetch(src);
@@ -2802,6 +2802,93 @@ var EmbeddingService = class {
2802
2802
  };
2803
2803
  var embeddingService = new EmbeddingService();
2804
2804
 
2805
+ // src/services/vectorDatabase/knowledgeFiles.ts
2806
+ var KNOWLEDGE_PAGE_LIMIT_MAX = 200;
2807
+ var MEDIA_MIME_PREFIXES = ["image/", "video/", "audio/"];
2808
+ var MEDIA_EXTENSIONS = /* @__PURE__ */ new Set([
2809
+ "png",
2810
+ "jpg",
2811
+ "jpeg",
2812
+ "gif",
2813
+ "webp",
2814
+ "bmp",
2815
+ "tif",
2816
+ "tiff",
2817
+ "heic",
2818
+ "heif",
2819
+ "svg",
2820
+ "ico",
2821
+ "avif",
2822
+ "mp4",
2823
+ "mov",
2824
+ "m4v",
2825
+ "webm",
2826
+ "avi",
2827
+ "mkv",
2828
+ "mp3",
2829
+ "wav",
2830
+ "m4a",
2831
+ "aac",
2832
+ "ogg",
2833
+ "flac"
2834
+ ]);
2835
+ var TEMP_NAME = /^(~WRD\d*|~\$|~\w+\.tmp$)|\.tmp$/i;
2836
+ var str = (value) => typeof value === "string" ? value : "";
2837
+ var recordName = (record) => str(record.filename) || str(record.fileName) || str(record.name);
2838
+ var recordMime = (record) => (str(record.mimeType) || str(record.contentType) || str(record.type)).toLowerCase();
2839
+ var isLikelyKnowledgeFile = (record) => {
2840
+ const name = recordName(record);
2841
+ if (TEMP_NAME.test(name)) return false;
2842
+ const ext = name.includes(".") ? name.split(".").pop().toLowerCase() : "";
2843
+ if (MEDIA_EXTENSIONS.has(ext)) return false;
2844
+ const mime = recordMime(record);
2845
+ if (MEDIA_MIME_PREFIXES.some((prefix) => mime.startsWith(prefix))) return false;
2846
+ return true;
2847
+ };
2848
+ var toRecords = (value) => Array.isArray(value) ? value.filter((item) => !!item && typeof item === "object" && !Array.isArray(item)) : [];
2849
+ var num = (value, fallback) => typeof value === "number" && Number.isFinite(value) ? value : fallback;
2850
+ var parseKnowledgeFileList = (body, request) => {
2851
+ if (body && typeof body === "object" && !Array.isArray(body) && "total" in body) {
2852
+ const envelope = body;
2853
+ const files2 = toRecords(envelope.files);
2854
+ const total = num(envelope.total, files2.length);
2855
+ const skip = num(envelope.skip, request.skip);
2856
+ const scope = envelope.scope === "all" ? "all" : "knowledge";
2857
+ return {
2858
+ files: files2,
2859
+ total,
2860
+ hasMore: typeof envelope.hasMore === "boolean" ? envelope.hasMore : skip + files2.length < total,
2861
+ scope,
2862
+ serverScoped: true,
2863
+ knowledgeFilterUnavailable: envelope.knowledgeFilterUnavailable === true,
2864
+ hiddenCount: 0
2865
+ };
2866
+ }
2867
+ const raw = body && typeof body === "object" && !Array.isArray(body) ? toRecords(body.files) : toRecords(body);
2868
+ const hasMore = raw.length >= request.limit;
2869
+ if (request.scope === "all") {
2870
+ return {
2871
+ files: raw,
2872
+ total: request.skip + raw.length,
2873
+ hasMore,
2874
+ scope: "all",
2875
+ serverScoped: false,
2876
+ knowledgeFilterUnavailable: false,
2877
+ hiddenCount: 0
2878
+ };
2879
+ }
2880
+ const files = raw.filter(isLikelyKnowledgeFile);
2881
+ return {
2882
+ files,
2883
+ total: files.length,
2884
+ hasMore,
2885
+ scope: "knowledge",
2886
+ serverScoped: false,
2887
+ knowledgeFilterUnavailable: false,
2888
+ hiddenCount: raw.length - files.length
2889
+ };
2890
+ };
2891
+
2805
2892
  // src/services/vectorDatabase/vectorDatabaseService.ts
2806
2893
  var VectorDatabaseService = class {
2807
2894
  baseUrl;
@@ -3562,36 +3649,44 @@ var VectorDatabaseService = class {
3562
3649
  }
3563
3650
  }
3564
3651
  /**
3565
- * Get user's files - tries both Gateway API and file storage API
3652
+ * One page of the Knowledge file list from the gateway (see ./knowledgeFiles).
3653
+ *
3654
+ * No fallback to the file storage API here: its listing is the whole Drive (every product's
3655
+ * files), which is exactly what Knowledge must not show. A failure surfaces to the caller.
3566
3656
  */
3567
- async getUserFiles(skip = 0, limit = 50) {
3657
+ async listKnowledgeFiles(skip = 0, limit = 50, scope = "knowledge") {
3568
3658
  if (!this.isAvailable()) {
3569
- return [];
3659
+ return parseKnowledgeFileList([], { skip, limit, scope });
3660
+ }
3661
+ const safeSkip = Math.max(0, Math.floor(skip));
3662
+ const safeLimit = Math.min(KNOWLEDGE_PAGE_LIMIT_MAX, Math.max(1, Math.floor(limit)));
3663
+ const query = new URLSearchParams({
3664
+ skip: String(safeSkip),
3665
+ limit: String(safeLimit),
3666
+ scope
3667
+ });
3668
+ debugLogger.debug("Fetching knowledge files from Gateway API", { skip: safeSkip, limit: safeLimit, scope });
3669
+ const response = await fetch(`${this.baseUrl}/embedding/files?${query.toString()}`, {
3670
+ method: "GET",
3671
+ headers: this.getHeaders()
3672
+ });
3673
+ if (!response.ok) {
3674
+ throw new Error(`Couldn't list documents (gateway answered ${response.status})`);
3570
3675
  }
3676
+ const body = await response.json();
3677
+ return parseKnowledgeFileList(body, { skip: safeSkip, limit: safeLimit, scope });
3678
+ }
3679
+ /**
3680
+ * Get the user's Knowledge files (first page, knowledge scope). Kept for existing callers;
3681
+ * prefer listKnowledgeFiles for totals and paging.
3682
+ */
3683
+ async getUserFiles(skip = 0, limit = 50) {
3571
3684
  try {
3572
- debugLogger.debug("Fetching user files from Gateway API", { skip, limit });
3573
- const response = await fetch(`${this.baseUrl}/embedding/files?skip=${skip}&limit=${limit}`, {
3574
- method: "GET",
3575
- headers: this.getHeaders()
3576
- });
3577
- if (!response.ok) {
3578
- debugLogger.warn("Gateway API files endpoint failed, falling back to file storage API", {
3579
- status: response.status
3580
- });
3581
- return await this.getUserFilesFromFileStorage(skip, limit);
3582
- }
3583
- const result = await response.json();
3584
- debugLogger.debug("Gateway API files response", result);
3585
- if (Array.isArray(result)) {
3586
- return this.toRecordArray(result);
3587
- }
3588
- if (result && Array.isArray(result.files)) {
3589
- return this.toRecordArray(result.files);
3590
- }
3591
- return [];
3685
+ const page = await this.listKnowledgeFiles(skip, limit, "knowledge");
3686
+ return page.files;
3592
3687
  } catch (error) {
3593
- debugLogger.error("Gateway API failed while fetching user files, trying file storage API", { error });
3594
- return await this.getUserFilesFromFileStorage(skip, limit);
3688
+ debugLogger.error("Failed to fetch knowledge files from Gateway API", { error });
3689
+ return [];
3595
3690
  }
3596
3691
  }
3597
3692
  /**
@@ -4796,6 +4891,7 @@ var knowledgeDocToVectorDocument = (doc) => ({
4796
4891
  isTeamContent: doc.isTeamContent ?? false,
4797
4892
  contentSource: doc.contentSource ?? (doc.isTeamContent ? "team" : "user")
4798
4893
  });
4894
+ var optionalString = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
4799
4895
  var rawFileRecordToVectorDocument = (record) => {
4800
4896
  if (!record || typeof record !== "object") {
4801
4897
  return null;
@@ -4810,10 +4906,12 @@ var rawFileRecordToVectorDocument = (record) => {
4810
4906
  const mimeType = typeof record.mimeType === "string" ? record.mimeType : "application/octet-stream";
4811
4907
  const uploadedBy = typeof record.uploadedBy === "string" ? record.uploadedBy : "unknown";
4812
4908
  const uploadedAt = typeof record.uploadedAt === "string" ? record.uploadedAt : (/* @__PURE__ */ new Date()).toISOString();
4813
- const isUserContent = typeof record.isUserContent === "boolean" ? record.isUserContent : true;
4814
- const isTeamContent = typeof record.isTeamContent === "boolean" ? record.isTeamContent : false;
4815
- const contentSource = record.contentSource === "team" ? "team" : "user";
4909
+ const teamSid = optionalString(record.teamSid);
4910
+ const isTeamContent = typeof record.isTeamContent === "boolean" ? record.isTeamContent : !!teamSid;
4911
+ const isUserContent = typeof record.isUserContent === "boolean" ? record.isUserContent : !isTeamContent;
4912
+ const contentSource = record.contentSource === "team" || record.contentSource === void 0 && isTeamContent ? "team" : "user";
4816
4913
  const score = typeof record.score === "number" ? record.score : void 0;
4914
+ const size = typeof record.size === "number" && Number.isFinite(record.size) && record.size >= 0 ? record.size : void 0;
4817
4915
  return {
4818
4916
  id,
4819
4917
  filename,
@@ -4824,7 +4922,12 @@ var rawFileRecordToVectorDocument = (record) => {
4824
4922
  isUserContent,
4825
4923
  isTeamContent,
4826
4924
  contentSource,
4827
- score
4925
+ score,
4926
+ size,
4927
+ bucket: optionalString(record.bucket),
4928
+ teamSid,
4929
+ userEmail: optionalString(record.userEmail),
4930
+ preview
4828
4931
  };
4829
4932
  };
4830
4933
  var useVectorStore = () => {
@@ -5376,22 +5479,32 @@ var useVectorStore = () => {
5376
5479
  useEffect2(() => {
5377
5480
  initializeVectorService();
5378
5481
  }, [initializeVectorService]);
5379
- const getUserDocuments = useCallback2(async (skip = 0, limit = 50) => {
5482
+ const getKnowledgeDocumentsPage = useCallback2(async (skip = 0, limit = 50, scope = "knowledge") => {
5380
5483
  if (!status.isEnabled || status.migrationRequired) {
5381
- return [];
5484
+ return {
5485
+ documents: [],
5486
+ total: 0,
5487
+ hasMore: false,
5488
+ scope,
5489
+ serverScoped: false,
5490
+ knowledgeFilterUnavailable: false,
5491
+ hiddenCount: 0
5492
+ };
5382
5493
  }
5494
+ const { files, ...meta } = await vectorDatabaseService.listKnowledgeFiles(skip, limit, scope);
5495
+ const documents = files.map(rawFileRecordToVectorDocument).filter((doc) => doc !== null);
5496
+ debugLogger.info("Retrieved knowledge documents", { count: documents.length, total: meta.total, scope: meta.scope });
5497
+ return { documents, ...meta };
5498
+ }, [status.isEnabled, status.migrationRequired]);
5499
+ const getUserDocuments = useCallback2(async (skip = 0, limit = 50) => {
5383
5500
  try {
5384
- const records = await vectorDatabaseService.getUserFiles(skip, limit);
5385
- const documents = records.map(rawFileRecordToVectorDocument).filter((doc) => doc !== null);
5386
- debugLogger.info("Retrieved user documents from vector database", {
5387
- count: documents.length
5388
- });
5389
- return documents;
5501
+ const page = await getKnowledgeDocumentsPage(skip, limit, "knowledge");
5502
+ return page.documents;
5390
5503
  } catch (error) {
5391
5504
  debugLogger.error("Failed to get user documents", { error });
5392
5505
  return [];
5393
5506
  }
5394
- }, [status.isEnabled, status.migrationRequired]);
5507
+ }, [getKnowledgeDocumentsPage]);
5395
5508
  const deleteDocument = useCallback2(async (fileId) => {
5396
5509
  if (!status.isEnabled || status.migrationRequired) {
5397
5510
  return {
@@ -5488,6 +5601,7 @@ var useVectorStore = () => {
5488
5601
  uploadDocument,
5489
5602
  searchDocuments,
5490
5603
  getUserDocuments,
5604
+ getKnowledgeDocumentsPage,
5491
5605
  deleteDocument,
5492
5606
  downloadVectorFile,
5493
5607
  getFilePreview,
@@ -5892,4 +6006,4 @@ export {
5892
6006
  useNotification,
5893
6007
  NotificationProvider
5894
6008
  };
5895
- //# sourceMappingURL=chunk-33OSALGS.mjs.map
6009
+ //# sourceMappingURL=chunk-KAXUI5H7.mjs.map