@trainly/react 1.4.1 → 1.4.3

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.
@@ -246,7 +246,7 @@ export function TrainlyProvider(_a) {
246
246
  }
247
247
  });
248
248
  }); };
249
- var ask = function (question) { return __awaiter(_this, void 0, void 0, function () {
249
+ var ask = function (question, options) { return __awaiter(_this, void 0, void 0, function () {
250
250
  var response, err_3, errorMessage, newToken, response, refreshError_1, error_3;
251
251
  return __generator(this, function (_a) {
252
252
  switch (_a.label) {
@@ -254,10 +254,10 @@ export function TrainlyProvider(_a) {
254
254
  _a.trys.push([0, 2, 10, 11]);
255
255
  setIsLoading(true);
256
256
  setError(null);
257
- return [4 /*yield*/, client.ask(question)];
257
+ return [4 /*yield*/, client.ask(question, options || {})];
258
258
  case 1:
259
259
  response = _a.sent();
260
- return [2 /*return*/, response.answer];
260
+ return [2 /*return*/, response];
261
261
  case 2:
262
262
  err_3 = _a.sent();
263
263
  errorMessage = err_3 instanceof Error ? err_3.message : String(err_3);
@@ -277,11 +277,11 @@ export function TrainlyProvider(_a) {
277
277
  return [4 /*yield*/, client.connectWithOAuthToken(newToken)];
278
278
  case 5:
279
279
  _a.sent();
280
- return [4 /*yield*/, client.ask(question)];
280
+ return [4 /*yield*/, client.ask(question, options || {})];
281
281
  case 6:
282
282
  response = _a.sent();
283
283
  console.log("✅ Query succeeded after token refresh");
284
- return [2 /*return*/, response.answer];
284
+ return [2 /*return*/, response];
285
285
  case 7: return [3 /*break*/, 9];
286
286
  case 8:
287
287
  refreshError_1 = _a.sent();
@@ -302,39 +302,23 @@ export function TrainlyProvider(_a) {
302
302
  }
303
303
  });
304
304
  }); };
305
+ // Legacy wrapper for backward compatibility (deprecated - use ask() with options instead)
305
306
  var askWithCitations = function (question) { return __awaiter(_this, void 0, void 0, function () {
306
- var response, err_4, error_4;
307
+ var response;
307
308
  return __generator(this, function (_a) {
308
309
  switch (_a.label) {
309
- case 0:
310
- _a.trys.push([0, 2, 3, 4]);
311
- setIsLoading(true);
312
- setError(null);
313
- return [4 /*yield*/, client.ask(question, { includeCitations: true })];
310
+ case 0: return [4 /*yield*/, ask(question, { includeCitations: true })];
314
311
  case 1:
315
312
  response = _a.sent();
316
313
  return [2 /*return*/, {
317
314
  answer: response.answer,
318
315
  citations: response.citations || [],
319
316
  }];
320
- case 2:
321
- err_4 = _a.sent();
322
- error_4 = {
323
- code: "QUERY_FAILED",
324
- message: "Failed to get answer with citations",
325
- details: err_4,
326
- };
327
- setError(error_4);
328
- throw error_4;
329
- case 3:
330
- setIsLoading(false);
331
- return [7 /*endfinally*/];
332
- case 4: return [2 /*return*/];
333
317
  }
334
318
  });
335
319
  }); };
336
320
  var upload = function (file, scopeValues) { return __awaiter(_this, void 0, void 0, function () {
337
- var result, err_5, errorMessage, newToken, result, refreshError_2, error_5;
321
+ var result, err_4, errorMessage, newToken, result, refreshError_2, error_4;
338
322
  return __generator(this, function (_a) {
339
323
  switch (_a.label) {
340
324
  case 0:
@@ -346,8 +330,8 @@ export function TrainlyProvider(_a) {
346
330
  result = _a.sent();
347
331
  return [2 /*return*/, result];
348
332
  case 2:
349
- err_5 = _a.sent();
350
- errorMessage = err_5 instanceof Error ? err_5.message : String(err_5);
333
+ err_4 = _a.sent();
334
+ errorMessage = err_4 instanceof Error ? err_4.message : String(err_4);
351
335
  if (!(getToken &&
352
336
  appId &&
353
337
  (errorMessage.includes("401") ||
@@ -375,13 +359,13 @@ export function TrainlyProvider(_a) {
375
359
  console.error("❌ Token refresh failed:", refreshError_2);
376
360
  return [3 /*break*/, 9];
377
361
  case 9:
378
- error_5 = {
362
+ error_4 = {
379
363
  code: "UPLOAD_FAILED",
380
364
  message: "Failed to upload file",
381
- details: err_5,
365
+ details: err_4,
382
366
  };
383
- setError(error_5);
384
- throw error_5;
367
+ setError(error_4);
368
+ throw error_4;
385
369
  case 10:
386
370
  setIsLoading(false);
387
371
  return [7 /*endfinally*/];
@@ -390,7 +374,7 @@ export function TrainlyProvider(_a) {
390
374
  });
391
375
  }); };
392
376
  var bulkUploadFiles = function (files, scopeValues) { return __awaiter(_this, void 0, void 0, function () {
393
- var result, err_6, errorMessage, newToken, result, refreshError_3, error_6;
377
+ var result, err_5, errorMessage, newToken, result, refreshError_3, error_5;
394
378
  return __generator(this, function (_a) {
395
379
  switch (_a.label) {
396
380
  case 0:
@@ -402,8 +386,8 @@ export function TrainlyProvider(_a) {
402
386
  result = _a.sent();
403
387
  return [2 /*return*/, result];
404
388
  case 2:
405
- err_6 = _a.sent();
406
- errorMessage = err_6 instanceof Error ? err_6.message : String(err_6);
389
+ err_5 = _a.sent();
390
+ errorMessage = err_5 instanceof Error ? err_5.message : String(err_5);
407
391
  if (!(getToken &&
408
392
  appId &&
409
393
  (errorMessage.includes("401") ||
@@ -431,13 +415,13 @@ export function TrainlyProvider(_a) {
431
415
  console.error("❌ Token refresh failed during bulk upload:", refreshError_3);
432
416
  return [3 /*break*/, 9];
433
417
  case 9:
434
- error_6 = {
418
+ error_5 = {
435
419
  code: "BULK_UPLOAD_FAILED",
436
420
  message: "Failed to upload files",
437
- details: err_6,
421
+ details: err_5,
438
422
  };
439
- setError(error_6);
440
- throw error_6;
423
+ setError(error_5);
424
+ throw error_5;
441
425
  case 10:
442
426
  setIsLoading(false);
443
427
  return [7 /*endfinally*/];
@@ -446,7 +430,7 @@ export function TrainlyProvider(_a) {
446
430
  });
447
431
  }); };
448
432
  var listFiles = function () { return __awaiter(_this, void 0, void 0, function () {
449
- var result, err_7, errorMessage, newToken, result, refreshError_4, error_7;
433
+ var result, err_6, errorMessage, newToken, result, refreshError_4, error_6;
450
434
  return __generator(this, function (_a) {
451
435
  switch (_a.label) {
452
436
  case 0:
@@ -458,8 +442,8 @@ export function TrainlyProvider(_a) {
458
442
  result = _a.sent();
459
443
  return [2 /*return*/, result];
460
444
  case 2:
461
- err_7 = _a.sent();
462
- errorMessage = err_7 instanceof Error ? err_7.message : String(err_7);
445
+ err_6 = _a.sent();
446
+ errorMessage = err_6 instanceof Error ? err_6.message : String(err_6);
463
447
  if (!(getToken &&
464
448
  appId &&
465
449
  (errorMessage.includes("401") ||
@@ -487,13 +471,13 @@ export function TrainlyProvider(_a) {
487
471
  console.error("❌ Token refresh failed:", refreshError_4);
488
472
  return [3 /*break*/, 9];
489
473
  case 9:
490
- error_7 = {
474
+ error_6 = {
491
475
  code: "LIST_FILES_FAILED",
492
476
  message: "Failed to list files",
493
- details: err_7,
477
+ details: err_6,
494
478
  };
495
- setError(error_7);
496
- throw error_7;
479
+ setError(error_6);
480
+ throw error_6;
497
481
  case 10:
498
482
  setIsLoading(false);
499
483
  return [7 /*endfinally*/];
@@ -502,7 +486,7 @@ export function TrainlyProvider(_a) {
502
486
  });
503
487
  }); };
504
488
  var deleteFile = function (fileId) { return __awaiter(_this, void 0, void 0, function () {
505
- var result, err_8, errorMessage, newToken, result, refreshError_5, error_8;
489
+ var result, err_7, errorMessage, newToken, result, refreshError_5, error_7;
506
490
  return __generator(this, function (_a) {
507
491
  switch (_a.label) {
508
492
  case 0:
@@ -514,8 +498,8 @@ export function TrainlyProvider(_a) {
514
498
  result = _a.sent();
515
499
  return [2 /*return*/, result];
516
500
  case 2:
517
- err_8 = _a.sent();
518
- errorMessage = err_8 instanceof Error ? err_8.message : String(err_8);
501
+ err_7 = _a.sent();
502
+ errorMessage = err_7 instanceof Error ? err_7.message : String(err_7);
519
503
  if (!(getToken &&
520
504
  appId &&
521
505
  (errorMessage.includes("401") ||
@@ -543,13 +527,13 @@ export function TrainlyProvider(_a) {
543
527
  console.error("❌ Token refresh failed:", refreshError_5);
544
528
  return [3 /*break*/, 9];
545
529
  case 9:
546
- error_8 = {
530
+ error_7 = {
547
531
  code: "DELETE_FILE_FAILED",
548
532
  message: "Failed to delete file",
549
- details: err_8,
533
+ details: err_7,
550
534
  };
551
- setError(error_8);
552
- throw error_8;
535
+ setError(error_7);
536
+ throw error_7;
553
537
  case 10:
554
538
  setIsLoading(false);
555
539
  return [7 /*endfinally*/];
@@ -558,7 +542,7 @@ export function TrainlyProvider(_a) {
558
542
  });
559
543
  }); };
560
544
  var sendMessage = function (content) { return __awaiter(_this, void 0, void 0, function () {
561
- var userMessage, response, assistantMessage_1, err_9;
545
+ var userMessage, response, assistantMessage_1, err_8;
562
546
  return __generator(this, function (_a) {
563
547
  switch (_a.label) {
564
548
  case 0:
@@ -585,9 +569,9 @@ export function TrainlyProvider(_a) {
585
569
  setMessages(function (prev) { return __spreadArray(__spreadArray([], prev, true), [assistantMessage_1], false); });
586
570
  return [3 /*break*/, 4];
587
571
  case 3:
588
- err_9 = _a.sent();
572
+ err_8 = _a.sent();
589
573
  // Error is already set by askWithCitations
590
- console.error("Failed to send message:", err_9);
574
+ console.error("Failed to send message:", err_8);
591
575
  return [3 /*break*/, 4];
592
576
  case 4: return [2 /*return*/];
593
577
  }
@@ -598,7 +582,7 @@ export function TrainlyProvider(_a) {
598
582
  var clearMessages = function () { return setMessages([]); };
599
583
  var value = {
600
584
  ask: ask,
601
- askWithCitations: askWithCitations,
585
+ askWithCitations: askWithCitations, // Deprecated - kept for backward compatibility
602
586
  upload: upload,
603
587
  bulkUploadFiles: bulkUploadFiles, // NEW: Bulk file upload method
604
588
  listFiles: listFiles, // NEW: File management methods
@@ -5,10 +5,11 @@ export interface TrainlyChatProps {
5
5
  showCitations?: boolean;
6
6
  enableFileUpload?: boolean;
7
7
  theme?: "light" | "dark" | "auto";
8
+ scopeFilters?: Record<string, string | number | boolean>;
8
9
  onMessage?: (message: {
9
10
  role: "user" | "assistant";
10
11
  content: string;
11
12
  }) => void;
12
13
  onError?: (error: string) => void;
13
14
  }
14
- export declare function TrainlyChat({ height, className, placeholder, showCitations, enableFileUpload, theme, onMessage, onError, }: TrainlyChatProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function TrainlyChat({ height, className, placeholder, showCitations, enableFileUpload, theme, scopeFilters, onMessage, onError, }: TrainlyChatProps): import("react/jsx-runtime").JSX.Element;
@@ -35,14 +35,26 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
35
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
36
  }
37
37
  };
38
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
39
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
40
+ if (ar || !(i in from)) {
41
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
42
+ ar[i] = from[i];
43
+ }
44
+ }
45
+ return to.concat(ar || Array.prototype.slice.call(from));
46
+ };
38
47
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
39
48
  import * as React from "react";
40
49
  import { useTrainly } from "../useTrainly";
41
50
  export function TrainlyChat(_a) {
42
51
  var _this = this;
43
- var _b = _a.height, height = _b === void 0 ? "400px" : _b, _c = _a.className, className = _c === void 0 ? "" : _c, _d = _a.placeholder, placeholder = _d === void 0 ? "Ask me anything..." : _d, _e = _a.showCitations, showCitations = _e === void 0 ? true : _e, _f = _a.enableFileUpload, enableFileUpload = _f === void 0 ? true : _f, _g = _a.theme, theme = _g === void 0 ? "auto" : _g, onMessage = _a.onMessage, onError = _a.onError;
44
- var _h = useTrainly(), messages = _h.messages, sendMessage = _h.sendMessage, isLoading = _h.isLoading, error = _h.error, clearError = _h.clearError;
45
- var _j = React.useState(""), input = _j[0], setInput = _j[1];
52
+ var _b = _a.height, height = _b === void 0 ? "400px" : _b, _c = _a.className, className = _c === void 0 ? "" : _c, _d = _a.placeholder, placeholder = _d === void 0 ? "Ask me anything..." : _d, _e = _a.showCitations, showCitations = _e === void 0 ? true : _e, _f = _a.enableFileUpload, enableFileUpload = _f === void 0 ? true : _f, _g = _a.theme, theme = _g === void 0 ? "auto" : _g, scopeFilters = _a.scopeFilters, onMessage = _a.onMessage, onError = _a.onError;
53
+ var ask = useTrainly().ask;
54
+ var _h = React.useState(""), input = _h[0], setInput = _h[1];
55
+ var _j = React.useState([]), messages = _j[0], setMessages = _j[1];
56
+ var _k = React.useState(false), isLoading = _k[0], setIsLoading = _k[1];
57
+ var _l = React.useState(null), error = _l[0], setError = _l[1];
46
58
  var messagesEndRef = React.useRef(null);
47
59
  var fileInputRef = React.useRef(null);
48
60
  // Auto-scroll to bottom
@@ -56,8 +68,9 @@ export function TrainlyChat(_a) {
56
68
  onError(error.message);
57
69
  }
58
70
  }, [error, onError]);
71
+ var clearError = function () { return setError(null); };
59
72
  var handleSubmit = function (e) { return __awaiter(_this, void 0, void 0, function () {
60
- var messageContent, err_1;
73
+ var messageContent, userMessage, response, assistantMessage_1, err_1, errorMsg;
61
74
  return __generator(this, function (_a) {
62
75
  switch (_a.label) {
63
76
  case 0:
@@ -66,19 +79,43 @@ export function TrainlyChat(_a) {
66
79
  return [2 /*return*/];
67
80
  messageContent = input.trim();
68
81
  setInput("");
82
+ setError(null);
83
+ userMessage = {
84
+ id: Date.now().toString(),
85
+ role: "user",
86
+ content: messageContent,
87
+ };
88
+ setMessages(function (prev) { return __spreadArray(__spreadArray([], prev, true), [userMessage], false); });
89
+ onMessage === null || onMessage === void 0 ? void 0 : onMessage(userMessage);
90
+ setIsLoading(true);
69
91
  _a.label = 1;
70
92
  case 1:
71
- _a.trys.push([1, 3, , 4]);
72
- return [4 /*yield*/, sendMessage(messageContent)];
93
+ _a.trys.push([1, 3, 4, 5]);
94
+ return [4 /*yield*/, ask(messageContent, {
95
+ includeCitations: showCitations,
96
+ scope_filters: scopeFilters,
97
+ })];
73
98
  case 2:
74
- _a.sent();
75
- onMessage === null || onMessage === void 0 ? void 0 : onMessage({ role: "user", content: messageContent });
76
- return [3 /*break*/, 4];
99
+ response = _a.sent();
100
+ assistantMessage_1 = {
101
+ id: (Date.now() + 1).toString(),
102
+ role: "assistant",
103
+ content: response.answer,
104
+ citations: response.citations,
105
+ };
106
+ setMessages(function (prev) { return __spreadArray(__spreadArray([], prev, true), [assistantMessage_1], false); });
107
+ onMessage === null || onMessage === void 0 ? void 0 : onMessage(assistantMessage_1);
108
+ return [3 /*break*/, 5];
77
109
  case 3:
78
110
  err_1 = _a.sent();
111
+ errorMsg = err_1 instanceof Error ? err_1.message : "Failed to send message";
112
+ setError({ message: errorMsg });
79
113
  console.error("Failed to send message:", err_1);
80
- return [3 /*break*/, 4];
81
- case 4: return [2 /*return*/];
114
+ return [3 /*break*/, 5];
115
+ case 4:
116
+ setIsLoading(false);
117
+ return [7 /*endfinally*/];
118
+ case 5: return [2 /*return*/];
82
119
  }
83
120
  });
84
121
  }); };
package/dist/types.d.ts CHANGED
@@ -88,7 +88,13 @@ export interface TrainlyFileManagerProps {
88
88
  maxFileSize?: number;
89
89
  }
90
90
  export interface TrainlyContextValue {
91
- ask: (question: string) => Promise<string>;
91
+ ask: (question: string, options?: {
92
+ includeCitations?: boolean;
93
+ scope_filters?: Record<string, string | number | boolean>;
94
+ }) => Promise<{
95
+ answer: string;
96
+ citations?: Citation[];
97
+ }>;
92
98
  askWithCitations: (question: string) => Promise<{
93
99
  answer: string;
94
100
  citations: Citation[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trainly/react",
3
- "version": "1.4.1",
3
+ "version": "1.4.3",
4
4
  "description": "Dead simple RAG integration for React apps with OAuth authentication and custom scopes",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",