@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.
- package/dist/{chat-6N5B7A7F.mjs → chat-7LOFYEWE.mjs} +5 -5
- package/dist/chat-provider.js +154 -38
- package/dist/chat-provider.js.map +1 -1
- package/dist/chat-provider.mjs +2 -2
- package/dist/{chunk-PK3LFBGC.mjs → chunk-4SXXEGEK.mjs} +142 -27
- package/dist/chunk-4SXXEGEK.mjs.map +1 -0
- package/dist/{chunk-KDIL5WUL.mjs → chunk-62IYSU3I.mjs} +4 -3
- package/dist/chunk-62IYSU3I.mjs.map +1 -0
- package/dist/{chunk-5BZWJQ5O.mjs → chunk-JD6C64CT.mjs} +2 -2
- package/dist/{chunk-46OGYEME.mjs → chunk-KAXUI5H7.mjs} +154 -40
- package/dist/chunk-KAXUI5H7.mjs.map +1 -0
- package/dist/{chunk-US4TG745.mjs → chunk-QI67R5F6.mjs} +2 -2
- package/dist/{chunk-N4BQ6HKL.mjs → chunk-R3NOM2DG.mjs} +3 -3
- package/dist/{chunk-SHYNXDRO.mjs → chunk-YGOLNWXJ.mjs} +4 -4
- package/dist/index.d.mts +54 -2
- package/dist/index.d.ts +54 -2
- package/dist/index.js +306 -68
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/management/management.js +305 -68
- package/dist/management/management.js.map +1 -1
- package/dist/management/management.mjs +5 -5
- package/dist/modals/chat-modal/chat-modal.js +159 -42
- package/dist/modals/chat-modal/chat-modal.js.map +1 -1
- package/dist/modals/chat-modal/chat-modal.mjs +3 -3
- package/package.json +1 -1
- package/dist/chunk-46OGYEME.mjs.map +0 -1
- package/dist/chunk-KDIL5WUL.mjs.map +0 -1
- package/dist/chunk-PK3LFBGC.mjs.map +0 -1
- /package/dist/{chat-6N5B7A7F.mjs.map → chat-7LOFYEWE.mjs.map} +0 -0
- /package/dist/{chunk-5BZWJQ5O.mjs.map → chunk-JD6C64CT.mjs.map} +0 -0
- /package/dist/{chunk-US4TG745.mjs.map → chunk-QI67R5F6.mjs.map} +0 -0
- /package/dist/{chunk-N4BQ6HKL.mjs.map → chunk-R3NOM2DG.mjs.map} +0 -0
- /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-
|
|
4
|
-
import "../chunk-
|
|
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-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
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 = (
|
|
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
|
-
*
|
|
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
|
|
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
|
-
|
|
6542
|
-
|
|
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("
|
|
6563
|
-
return
|
|
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
|
|
9358
|
-
const isTeamContent = typeof record.isTeamContent === "boolean" ? record.isTeamContent :
|
|
9359
|
-
const
|
|
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
|
|
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
|
|
9929
|
-
|
|
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
|
-
}, [
|
|
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
|
-
|
|
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 = (
|
|
19078
|
-
return
|
|
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) {
|