@burtson-labs/bandit-engine 2.0.161 → 2.0.162

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 (39) hide show
  1. package/dist/{aiProviderStore-BNZGM6QU.mjs → aiProviderStore-JOB2H4LP.mjs} +2 -2
  2. package/dist/chat-LB6UEEEW.mjs +16 -0
  3. package/dist/chat-provider.js +86 -31
  4. package/dist/chat-provider.js.map +1 -1
  5. package/dist/chat-provider.mjs +5 -5
  6. package/dist/{chunk-TTAORNWI.mjs → chunk-3ACT5BTW.mjs} +6 -6
  7. package/dist/{chunk-QPXG4A5C.mjs → chunk-47MOBOP3.mjs} +2 -2
  8. package/dist/{chunk-PFKKGJAQ.mjs → chunk-G5POQT2R.mjs} +2 -2
  9. package/dist/{chunk-MIDYEQOS.mjs → chunk-ODGVCSKV.mjs} +17 -11
  10. package/dist/{chunk-MIDYEQOS.mjs.map → chunk-ODGVCSKV.mjs.map} +1 -1
  11. package/dist/{chunk-FSRMNQRN.mjs → chunk-OGMXL7BF.mjs} +4 -4
  12. package/dist/{chunk-B3HAQC6F.mjs → chunk-Q6LXVYTC.mjs} +68 -25
  13. package/dist/chunk-Q6LXVYTC.mjs.map +1 -0
  14. package/dist/{chunk-EOMOOMUC.mjs → chunk-R6HMLYKQ.mjs} +3 -3
  15. package/dist/{chunk-XC7HDKFW.mjs → chunk-RUXYVMW2.mjs} +9 -9
  16. package/dist/{chunk-X65A3NED.mjs → chunk-YHSYHU5P.mjs} +5 -5
  17. package/dist/{chunk-QXITTH2X.mjs → chunk-ZNK3ELTZ.mjs} +2 -2
  18. package/dist/index.js +86 -31
  19. package/dist/index.js.map +1 -1
  20. package/dist/index.mjs +10 -10
  21. package/dist/management/management.js +86 -31
  22. package/dist/management/management.js.map +1 -1
  23. package/dist/management/management.mjs +8 -8
  24. package/dist/modals/chat-modal/chat-modal.js +86 -31
  25. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  26. package/dist/modals/chat-modal/chat-modal.mjs +4 -4
  27. package/package.json +1 -1
  28. package/dist/chat-3JAV77HO.mjs +0 -16
  29. package/dist/chunk-B3HAQC6F.mjs.map +0 -1
  30. /package/dist/{aiProviderStore-BNZGM6QU.mjs.map → aiProviderStore-JOB2H4LP.mjs.map} +0 -0
  31. /package/dist/{chat-3JAV77HO.mjs.map → chat-LB6UEEEW.mjs.map} +0 -0
  32. /package/dist/{chunk-TTAORNWI.mjs.map → chunk-3ACT5BTW.mjs.map} +0 -0
  33. /package/dist/{chunk-QPXG4A5C.mjs.map → chunk-47MOBOP3.mjs.map} +0 -0
  34. /package/dist/{chunk-PFKKGJAQ.mjs.map → chunk-G5POQT2R.mjs.map} +0 -0
  35. /package/dist/{chunk-FSRMNQRN.mjs.map → chunk-OGMXL7BF.mjs.map} +0 -0
  36. /package/dist/{chunk-EOMOOMUC.mjs.map → chunk-R6HMLYKQ.mjs.map} +0 -0
  37. /package/dist/{chunk-XC7HDKFW.mjs.map → chunk-RUXYVMW2.mjs.map} +0 -0
  38. /package/dist/{chunk-X65A3NED.mjs.map → chunk-YHSYHU5P.mjs.map} +0 -0
  39. /package/dist/{chunk-QXITTH2X.mjs.map → chunk-ZNK3ELTZ.mjs.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  useAIProviderStore
3
- } from "./chunk-B3HAQC6F.mjs";
3
+ } from "./chunk-Q6LXVYTC.mjs";
4
4
  import "./chunk-KCI46M23.mjs";
5
5
  import "./chunk-BJTO5JO5.mjs";
6
6
  export {
7
7
  useAIProviderStore
8
8
  };
9
- //# sourceMappingURL=aiProviderStore-BNZGM6QU.mjs.map
9
+ //# sourceMappingURL=aiProviderStore-JOB2H4LP.mjs.map
@@ -0,0 +1,16 @@
1
+ import {
2
+ chat_default
3
+ } from "./chunk-3ACT5BTW.mjs";
4
+ import "./chunk-ONQMRE2G.mjs";
5
+ import "./chunk-47MOBOP3.mjs";
6
+ import "./chunk-G5POQT2R.mjs";
7
+ import "./chunk-R6HMLYKQ.mjs";
8
+ import "./chunk-ODGVCSKV.mjs";
9
+ import "./chunk-WQEBTH2R.mjs";
10
+ import "./chunk-Q6LXVYTC.mjs";
11
+ import "./chunk-KCI46M23.mjs";
12
+ import "./chunk-BJTO5JO5.mjs";
13
+ export {
14
+ chat_default as default
15
+ };
16
+ //# sourceMappingURL=chat-LB6UEEEW.mjs.map
@@ -1174,6 +1174,40 @@ var init_common_types = __esm({
1174
1174
  }
1175
1175
  });
1176
1176
 
1177
+ // src/services/stream/streamLineParser.ts
1178
+ var SKIP, StreamLineParser;
1179
+ var init_streamLineParser = __esm({
1180
+ "src/services/stream/streamLineParser.ts"() {
1181
+ "use strict";
1182
+ SKIP = { kind: "skip" };
1183
+ StreamLineParser = class {
1184
+ /** Set by `event: ping` until the frame's blank-line terminator. */
1185
+ inHeartbeatFrame = false;
1186
+ next(rawLine) {
1187
+ const line = rawLine.trim();
1188
+ if (!line) {
1189
+ this.inHeartbeatFrame = false;
1190
+ return SKIP;
1191
+ }
1192
+ if (line.startsWith(":")) return SKIP;
1193
+ if (line.startsWith("event:")) {
1194
+ this.inHeartbeatFrame = line.slice(6).trim().toLowerCase() === "ping";
1195
+ return SKIP;
1196
+ }
1197
+ if (line.startsWith("id:") || line.startsWith("retry:")) return SKIP;
1198
+ if (line.startsWith("data:")) {
1199
+ if (this.inHeartbeatFrame) return SKIP;
1200
+ const data = line.slice(5).trim();
1201
+ if (!data) return SKIP;
1202
+ if (data === "[DONE]") return { kind: "done" };
1203
+ return { kind: "json", text: data };
1204
+ }
1205
+ return { kind: "json", text: line };
1206
+ }
1207
+ };
1208
+ }
1209
+ });
1210
+
1177
1211
  // src/services/ollama/ollama.service.ts
1178
1212
  var import_rxjs, handleError, parseResponseBody, OllamaService;
1179
1213
  var init_ollama_service = __esm({
@@ -1181,6 +1215,7 @@ var init_ollama_service = __esm({
1181
1215
  "use strict";
1182
1216
  import_rxjs = require("rxjs");
1183
1217
  init_debugLogger();
1218
+ init_streamLineParser();
1184
1219
  handleError = () => (obs) => obs.pipe(
1185
1220
  (0, import_rxjs.switchMap)(
1186
1221
  (response) => response.ok ? (0, import_rxjs.of)(response) : (0, import_rxjs.throwError)(() => new Error(`Request failed: ${response.status} ${response.statusText}`))
@@ -1271,13 +1306,15 @@ var init_ollama_service = __esm({
1271
1306
  this._throwErrorIfNotOk(url, response);
1272
1307
  const reader = response.body?.getReader();
1273
1308
  const decoder = new TextDecoder();
1309
+ const lineParser = new StreamLineParser();
1274
1310
  let buffer = "";
1275
1311
  const read = () => {
1276
1312
  reader?.read().then(({ done, value }) => {
1277
1313
  if (done) {
1278
- if (buffer.trim() !== "") {
1314
+ const tail = lineParser.next(buffer);
1315
+ if (tail.kind === "json") {
1279
1316
  try {
1280
- observer.next(JSON.parse(buffer));
1317
+ observer.next(JSON.parse(tail.text));
1281
1318
  } catch (err) {
1282
1319
  observer.error(err);
1283
1320
  debugLogger.error("Final chunk parsing error (generate):", { buffer });
@@ -1290,9 +1327,10 @@ var init_ollama_service = __esm({
1290
1327
  const lines = buffer.split("\n");
1291
1328
  buffer = lines.pop() ?? "";
1292
1329
  for (const line of lines) {
1293
- if (line.trim()) {
1330
+ const classified = lineParser.next(line);
1331
+ if (classified.kind === "json") {
1294
1332
  try {
1295
- observer.next(JSON.parse(line));
1333
+ observer.next(JSON.parse(classified.text));
1296
1334
  } catch (err) {
1297
1335
  observer.error(err);
1298
1336
  debugLogger.error("Error parsing JSON line (generate):", { line });
@@ -1322,13 +1360,15 @@ var init_ollama_service = __esm({
1322
1360
  this._throwErrorIfNotOk(url, response);
1323
1361
  const reader = response.body?.getReader();
1324
1362
  const decoder = new TextDecoder();
1363
+ const lineParser = new StreamLineParser();
1325
1364
  let buffer = "";
1326
1365
  const read = () => {
1327
1366
  reader?.read().then(({ done, value }) => {
1328
1367
  if (done) {
1329
- if (buffer.trim() !== "") {
1368
+ const tail = lineParser.next(buffer);
1369
+ if (tail.kind === "json") {
1330
1370
  try {
1331
- observer.next(JSON.parse(buffer));
1371
+ observer.next(JSON.parse(tail.text));
1332
1372
  } catch (err) {
1333
1373
  observer.error(err);
1334
1374
  debugLogger.error("Final chunk parsing error (chat):", { buffer });
@@ -1341,9 +1381,10 @@ var init_ollama_service = __esm({
1341
1381
  const lines = buffer.split("\n");
1342
1382
  buffer = lines.pop() ?? "";
1343
1383
  for (const line of lines) {
1344
- if (line.trim()) {
1384
+ const classified = lineParser.next(line);
1385
+ if (classified.kind === "json") {
1345
1386
  try {
1346
- observer.next(JSON.parse(line));
1387
+ observer.next(JSON.parse(classified.text));
1347
1388
  } catch (err) {
1348
1389
  observer.error(err);
1349
1390
  debugLogger.error("Error parsing JSON line (chat):", { line });
@@ -2237,6 +2278,7 @@ var init_gateway_service = __esm({
2237
2278
  "src/services/gateway/gateway.service.ts"() {
2238
2279
  "use strict";
2239
2280
  import_axios = __toESM(require("axios"));
2281
+ init_streamLineParser();
2240
2282
  import_rxjs6 = require("rxjs");
2241
2283
  init_debugLogger();
2242
2284
  init_authenticationService();
@@ -2418,13 +2460,15 @@ var init_gateway_service = __esm({
2418
2460
  const handleStreamingResponse = async (response) => {
2419
2461
  const reader = response.body?.getReader();
2420
2462
  const decoder = new TextDecoder();
2463
+ const lineParser = new StreamLineParser();
2421
2464
  let buffer = "";
2422
2465
  const read = () => {
2423
2466
  reader?.read().then(({ done, value }) => {
2424
2467
  if (done) {
2425
- if (buffer.trim() !== "") {
2468
+ const tail = lineParser.next(buffer);
2469
+ if (tail.kind === "json") {
2426
2470
  try {
2427
- const finalResponse = JSON.parse(buffer);
2471
+ const finalResponse = JSON.parse(tail.text);
2428
2472
  observer.next(finalResponse);
2429
2473
  } catch (err) {
2430
2474
  debugLogger.error("GatewayService chat final chunk parsing error", { buffer, error: err });
@@ -2438,16 +2482,14 @@ var init_gateway_service = __esm({
2438
2482
  const lines = buffer.split("\n");
2439
2483
  buffer = lines.pop() ?? "";
2440
2484
  for (const line of lines) {
2441
- const trimmed = line.trim();
2442
- if (trimmed) {
2443
- let data = trimmed;
2444
- if (trimmed.startsWith("data: ")) {
2445
- data = trimmed.slice(6);
2446
- if (data === "[DONE]") {
2447
- observer.complete();
2448
- return;
2449
- }
2450
- }
2485
+ const classified = lineParser.next(line);
2486
+ if (classified.kind === "done") {
2487
+ observer.complete();
2488
+ return;
2489
+ }
2490
+ if (classified.kind === "json") {
2491
+ const trimmed = line.trim();
2492
+ const data = classified.text;
2451
2493
  try {
2452
2494
  const parsed = JSON.parse(data);
2453
2495
  if (request.provider === "ollama" && parsed.message) {
@@ -2614,13 +2656,15 @@ var init_gateway_service = __esm({
2614
2656
  }
2615
2657
  const reader = response.body?.getReader();
2616
2658
  const decoder = new TextDecoder();
2659
+ const lineParser = new StreamLineParser();
2617
2660
  let buffer = "";
2618
2661
  const read = () => {
2619
2662
  reader?.read().then(({ done, value }) => {
2620
2663
  if (done) {
2621
- if (buffer.trim() !== "") {
2664
+ const tail = lineParser.next(buffer);
2665
+ if (tail.kind === "json") {
2622
2666
  try {
2623
- observer.next(JSON.parse(buffer));
2667
+ observer.next(JSON.parse(tail.text));
2624
2668
  } catch (err) {
2625
2669
  observer.error(err);
2626
2670
  debugLogger.error("Final chunk parsing error (gateway generate):", { buffer });
@@ -2633,9 +2677,14 @@ var init_gateway_service = __esm({
2633
2677
  const lines = buffer.split("\n");
2634
2678
  buffer = lines.pop() ?? "";
2635
2679
  for (const line of lines) {
2636
- if (line.trim()) {
2680
+ const classified = lineParser.next(line);
2681
+ if (classified.kind === "done") {
2682
+ observer.complete();
2683
+ return;
2684
+ }
2685
+ if (classified.kind === "json") {
2637
2686
  try {
2638
- observer.next(JSON.parse(line));
2687
+ observer.next(JSON.parse(classified.text));
2639
2688
  } catch (err) {
2640
2689
  observer.error(err);
2641
2690
  debugLogger.error("Error parsing JSON line (gateway generate):", { line });
@@ -9380,9 +9429,17 @@ var useVectorStore = () => {
9380
9429
  const hasAnyAdvancedFeatures = isAdvancedVectorFeaturesEnabled;
9381
9430
  const hasVectorAccess = features.isAdmin() || features.hasAdvancedSearch() || features.hasAdvancedMemories();
9382
9431
  const [hasCompatibleProvider, setHasCompatibleProvider] = (0, import_react3.useState)(false);
9432
+ const mountedRef = (0, import_react3.useRef)(true);
9433
+ (0, import_react3.useEffect)(() => {
9434
+ mountedRef.current = true;
9435
+ return () => {
9436
+ mountedRef.current = false;
9437
+ };
9438
+ }, []);
9383
9439
  const checkProviderCompatibility = (0, import_react3.useCallback)(async () => {
9384
9440
  try {
9385
9441
  const { useAIProviderStore: useAIProviderStore2 } = await Promise.resolve().then(() => (init_aiProviderStore(), aiProviderStore_exports));
9442
+ if (!mountedRef.current) return false;
9386
9443
  const aiProviderState = useAIProviderStore2.getState();
9387
9444
  const provider = aiProviderState.provider;
9388
9445
  const config = aiProviderState.config;
@@ -9399,7 +9456,7 @@ var useVectorStore = () => {
9399
9456
  return isCompatible;
9400
9457
  } catch (error) {
9401
9458
  debugLogger.warn("Could not check AI provider for vector compatibility", { error });
9402
- setHasCompatibleProvider(false);
9459
+ if (mountedRef.current) setHasCompatibleProvider(false);
9403
9460
  return false;
9404
9461
  }
9405
9462
  }, []);
@@ -9407,12 +9464,10 @@ var useVectorStore = () => {
9407
9464
  checkProviderCompatibility();
9408
9465
  }, [checkProviderCompatibility]);
9409
9466
  (0, import_react3.useEffect)(() => {
9410
- const checkOnProviderChange = async () => {
9411
- setTimeout(() => {
9412
- checkProviderCompatibility();
9413
- }, 100);
9414
- };
9415
- checkOnProviderChange();
9467
+ const timer = setTimeout(() => {
9468
+ void checkProviderCompatibility();
9469
+ }, 100);
9470
+ return () => clearTimeout(timer);
9416
9471
  }, [authStore.token, checkProviderCompatibility]);
9417
9472
  (0, import_react3.useEffect)(() => {
9418
9473
  const interval = setInterval(() => {