@iblai/iblai-js 2.11.2 → 2.11.4

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.
@@ -3620,7 +3620,10 @@ var datasetsTabLabels$3 = {
3620
3620
  description: "This dataset is currently untrained. You can train it to make it available for your agent, or permanently delete it if it's no longer needed.",
3621
3621
  "delete": "Delete",
3622
3622
  train: "Train",
3623
- training: "Training..."
3623
+ training: "Training...",
3624
+ userAgentLabel: "User-Agent (optional)",
3625
+ userAgentPlaceholder: "Iblai-bot/1.0 (+https://ibl.ai/bot)",
3626
+ userAgentHelpText: "Optional. Overrides the default crawler User-Agent for every request. Leave blank to keep the current setting."
3624
3627
  },
3625
3628
  retrainScheduleModal: {
3626
3629
  title: "Schedule Retraining",
@@ -10934,7 +10937,10 @@ var datasetsTabLabels$2 = {
10934
10937
  description: "Ce jeu de données n'est pas encore entraîné. Vous pouvez l'entraîner pour le rendre disponible à votre agent, ou le supprimer définitivement s'il n'est plus nécessaire.",
10935
10938
  "delete": "Supprimer",
10936
10939
  train: "Entraîner",
10937
- training: "Entraînement..."
10940
+ training: "Entraînement...",
10941
+ userAgentLabel: "User-Agent (facultatif)",
10942
+ userAgentPlaceholder: "Iblai-bot/1.0 (+https://ibl.ai/bot)",
10943
+ userAgentHelpText: "Facultatif. Remplace le User-Agent par defaut du robot d'exploration pour chaque requete. Laissez vide pour conserver le reglage actuel."
10938
10944
  },
10939
10945
  retrainScheduleModal: {
10940
10946
  title: "Planifier le réentraînement",
@@ -18082,7 +18088,10 @@ var datasetsTabLabels$1 = {
18082
18088
  description: "Este conjunto de datos no está entrenado actualmente. Puede entrenarlo para que esté disponible para su agente, o eliminarlo permanentemente si ya no lo necesita.",
18083
18089
  "delete": "Eliminar",
18084
18090
  train: "Entrenar",
18085
- training: "Entrenando..."
18091
+ training: "Entrenando...",
18092
+ userAgentLabel: "User-Agent (opcional)",
18093
+ userAgentPlaceholder: "Iblai-bot/1.0 (+https://ibl.ai/bot)",
18094
+ userAgentHelpText: "Opcional. Sustituye el User-Agent predeterminado del rastreador en cada solicitud. Dejalo en blanco para conservar la configuracion actual."
18086
18095
  },
18087
18096
  retrainScheduleModal: {
18088
18097
  title: "Programar reentrenamiento",
@@ -25230,7 +25239,10 @@ var datasetsTabLabels = {
25230
25239
  description: "该数据集当前未经训练。您可以对其进行训练以使其可供您的代理使用,或者如果不再需要则将其永久删除。",
25231
25240
  "delete": "删除",
25232
25241
  train: "训练",
25233
- training: "训练中..."
25242
+ training: "训练中...",
25243
+ userAgentLabel: "User-Agent(可选)",
25244
+ userAgentPlaceholder: "Iblai-bot/1.0 (+https://ibl.ai/bot)",
25245
+ userAgentHelpText: "可选。为每个请求覆盖默认的抓取工具 User-Agent。留空则保留当前设置。"
25234
25246
  },
25235
25247
  retrainScheduleModal: {
25236
25248
  title: "计划重新训练",
@@ -241464,6 +241476,25 @@ const RetrainScheduleModal$1 = dynamic(() => Promise.resolve().then(function ()
241464
241476
  const TrainOrDeleteModal$1 = dynamic(() => Promise.resolve().then(function () { return trainOrDeleteModal; }).then((mod) => ({
241465
241477
  default: mod.TrainOrDeleteModal,
241466
241478
  })));
241479
+ /**
241480
+ * Crawlable documents are re-fetched over HTTP on retrain, so crawler options
241481
+ * (such as a custom User-Agent) apply to them. Local uploads and cloud-provider
241482
+ * documents are not re-fetched, so they are not crawlable.
241483
+ */
241484
+ function isCrawlableDocType(documentType) {
241485
+ const docType = documentType === null || documentType === void 0 ? void 0 : documentType.toLowerCase();
241486
+ // Uploaded documents (local files like PDF, DOCX, etc.)
241487
+ const uploadedFileTypes = ['file'];
241488
+ if (uploadedFileTypes.some((type) => docType === null || docType === void 0 ? void 0 : docType.includes(type))) {
241489
+ return false;
241490
+ }
241491
+ // Cloud storage providers
241492
+ const cloudProviders = ['google drive', 'onedrive', 'dropbox', 'one drive'];
241493
+ if (cloudProviders.some((provider) => docType === null || docType === void 0 ? void 0 : docType.includes(provider))) {
241494
+ return false;
241495
+ }
241496
+ return true;
241497
+ }
241467
241498
  function DatasetItem({ dataset, onSelect, isSelected, labels }) {
241468
241499
  var _a, _b, _c, _d, _e;
241469
241500
  const t = useT();
@@ -241492,10 +241523,12 @@ function DatasetItem({ dataset, onSelect, isSelected, labels }) {
241492
241523
  console.error(JSON.stringify({ tenant: tenantKey, error }));
241493
241524
  }
241494
241525
  };
241495
- const handleTrainDataset = async () => {
241526
+ const handleTrainDataset = async (userAgent) => {
241527
+ const trimmedUserAgent = userAgent === null || userAgent === void 0 ? void 0 : userAgent.trim();
241496
241528
  await handleEditTrainingDocument({
241497
241529
  url: dataset.url,
241498
241530
  train: true,
241531
+ ...(trimmedUserAgent ? { crawler_extra_headers: { 'User-Agent': trimmedUserAgent } } : {}),
241499
241532
  });
241500
241533
  setIsTrainOrDeleteModalOpen(false);
241501
241534
  };
@@ -241505,23 +241538,12 @@ function DatasetItem({ dataset, onSelect, isSelected, labels }) {
241505
241538
  };
241506
241539
  // Helper function to check if retrain should be disabled
241507
241540
  const isRetrainDisabled = () => {
241508
- var _a;
241509
241541
  // Disable if the dataset is not trained yet
241510
241542
  if (!dataset.is_trained) {
241511
241543
  return true;
241512
241544
  }
241513
- const docType = (_a = dataset.document_type) === null || _a === void 0 ? void 0 : _a.toLowerCase();
241514
- // Disable for uploaded documents (local files like PDF, DOCX, etc.)
241515
- const uploadedFileTypes = ['file'];
241516
- if (uploadedFileTypes.some((type) => docType === null || docType === void 0 ? void 0 : docType.includes(type))) {
241517
- return true;
241518
- }
241519
- // Disable for cloud storage providers
241520
- const cloudProviders = ['google drive', 'onedrive', 'dropbox', 'one drive'];
241521
- if (cloudProviders.some((provider) => docType === null || docType === void 0 ? void 0 : docType.includes(provider))) {
241522
- return true;
241523
- }
241524
- return false;
241545
+ // Disable for uploaded documents and cloud storage providers
241546
+ return !isCrawlableDocType(dataset.document_type);
241525
241547
  };
241526
241548
  return (jsxs(Fragment$1, { children: [jsxs(TableRow, { className: `border-b last:border-0 ${onSelect ? 'hover:bg-muted/50 cursor-pointer' : ''} ${isSelected ? 'bg-blue-50' : ''}`, onClick: onSelect ? () => onSelect(dataset) : undefined, children: [jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { asChild: true, children: jsx(TableCell, { className: "max-w-[200px] truncate p-3 font-medium whitespace-nowrap text-[#646464]", children: jsx(WithFormPermissions, { name: ['document_name', 'url'],
241527
241549
  // @ts-ignore
@@ -241549,7 +241571,7 @@ function DatasetItem({ dataset, onSelect, isSelected, labels }) {
241549
241571
  }
241550
241572
  }, className: "text-gray-500 hover:text-gray-700", disabled: isEditTrainingDocumentLoading || disabled, children: dataset.access === 'private' ? (jsxs(Fragment$1, { children: [jsx(EyeOff, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: t('datasetsTabDatasetItem.makePublic') })] })) : (jsxs(Fragment$1, { children: [jsx(Eye, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: t('datasetsTabDatasetItem.makePrivate') })] })) })) }) }), jsx(TableCell, { className: "p-3 whitespace-nowrap", children: jsx(WithFormPermissions, { name: "is_trained",
241551
241573
  // @ts-ignore
241552
- permissions: (_e = dataset === null || dataset === void 0 ? void 0 : dataset.permissions) === null || _e === void 0 ? void 0 : _e.field, children: ({ disabled }) => (jsx(TrainingStatusSwitch, { is_trained: dataset.is_trained, url: dataset.url, disabled: disabled, training_status: dataset.training_status, handleEditTrainingDocument: handleEditTrainingDocument, onUntrainSuccess: () => setIsDeleteDatasetModalOpen(true), onTrainRequest: () => setIsTrainOrDeleteModalOpen(true) })) }) })] }, dataset.id), isDeleteDatasetModalOpen && (jsx(DeleteDatasetModal$1, { isOpen: isDeleteDatasetModalOpen, onClose: () => setIsDeleteDatasetModalOpen(false), dataset: dataset, labels: labels })), isRetrainScheduleModalOpen && (jsx(RetrainScheduleModal$1, { isOpen: isRetrainScheduleModalOpen, onClose: () => setIsRetrainScheduleModalOpen(false), dataset: dataset, labels: labels })), isTrainOrDeleteModalOpen && (jsx(TrainOrDeleteModal$1, { isOpen: isTrainOrDeleteModalOpen, onClose: () => setIsTrainOrDeleteModalOpen(false), onTrain: handleTrainDataset, onDelete: handleDeleteFromTrainModal, isLoading: isEditTrainingDocumentLoading, labels: labels }))] }));
241574
+ permissions: (_e = dataset === null || dataset === void 0 ? void 0 : dataset.permissions) === null || _e === void 0 ? void 0 : _e.field, children: ({ disabled }) => (jsx(TrainingStatusSwitch, { is_trained: dataset.is_trained, url: dataset.url, disabled: disabled, training_status: dataset.training_status, handleEditTrainingDocument: handleEditTrainingDocument, onUntrainSuccess: () => setIsDeleteDatasetModalOpen(true), onTrainRequest: () => setIsTrainOrDeleteModalOpen(true) })) }) })] }, dataset.id), isDeleteDatasetModalOpen && (jsx(DeleteDatasetModal$1, { isOpen: isDeleteDatasetModalOpen, onClose: () => setIsDeleteDatasetModalOpen(false), dataset: dataset, labels: labels })), isRetrainScheduleModalOpen && (jsx(RetrainScheduleModal$1, { isOpen: isRetrainScheduleModalOpen, onClose: () => setIsRetrainScheduleModalOpen(false), dataset: dataset, labels: labels })), isTrainOrDeleteModalOpen && (jsx(TrainOrDeleteModal$1, { isOpen: isTrainOrDeleteModalOpen, onClose: () => setIsTrainOrDeleteModalOpen(false), onTrain: handleTrainDataset, onDelete: handleDeleteFromTrainModal, showUserAgentField: isCrawlableDocType(dataset.document_type), isLoading: isEditTrainingDocumentLoading, labels: labels }))] }));
241553
241575
  }
241554
241576
  function TrainingStatusSwitch({ is_trained, url, training_status, disabled, handleEditTrainingDocument, onUntrainSuccess, onTrainRequest, }) {
241555
241577
  const t = useT();
@@ -241622,6 +241644,9 @@ const AGENT_DATASETS_TAB_LABELS = {
241622
241644
  delete: 'Delete',
241623
241645
  train: 'Train',
241624
241646
  training: 'Training...',
241647
+ userAgentLabel: 'User-Agent (optional)',
241648
+ userAgentPlaceholder: 'Iblai-bot/1.0 (+https://ibl.ai/bot)',
241649
+ userAgentHelpText: 'Optional. Overrides the default crawler User-Agent for every request. Leave blank to keep the current setting.',
241625
241650
  },
241626
241651
  retrainScheduleModal: {
241627
241652
  title: 'Schedule Retraining',
@@ -241682,6 +241707,9 @@ function buildDatasetsTabLabels(t) {
241682
241707
  delete: t('datasetsTabLabels.trainOrDeleteModal.delete'),
241683
241708
  train: t('datasetsTabLabels.trainOrDeleteModal.train'),
241684
241709
  training: t('datasetsTabLabels.trainOrDeleteModal.training'),
241710
+ userAgentLabel: t('datasetsTabLabels.trainOrDeleteModal.userAgentLabel'),
241711
+ userAgentPlaceholder: t('datasetsTabLabels.trainOrDeleteModal.userAgentPlaceholder'),
241712
+ userAgentHelpText: t('datasetsTabLabels.trainOrDeleteModal.userAgentHelpText'),
241685
241713
  },
241686
241714
  retrainScheduleModal: {
241687
241715
  title: t('datasetsTabLabels.retrainScheduleModal.title'),
@@ -245681,8 +245709,9 @@ var retrainScheduleModal = /*#__PURE__*/Object.freeze({
245681
245709
  RetrainScheduleModal: RetrainScheduleModal
245682
245710
  });
245683
245711
 
245684
- function TrainOrDeleteModal({ isOpen, onClose, onTrain, onDelete, isLoading, labels, }) {
245685
- return (jsx(Dialog, { open: isOpen, onOpenChange: onClose, children: jsxs(DialogContent, { "aria-describedby": "train-or-delete-description", className: "gap-0", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { className: "ibl-dialog-title", children: labels.trainOrDeleteModal.title }) }), jsx("div", { className: "my-5", children: jsx("p", { id: "train-or-delete-description", className: "text-sm text-[#646464]", children: labels.trainOrDeleteModal.description }) }), jsxs(DialogFooter, { className: "gap-3", children: [jsx(Button$1, { variant: "outline", onClick: onDelete, disabled: isLoading, children: labels.trainOrDeleteModal.delete }), jsx(Button$1, { className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", onClick: onTrain, disabled: isLoading, children: isLoading ? labels.trainOrDeleteModal.training : labels.trainOrDeleteModal.train })] })] }) }));
245712
+ function TrainOrDeleteModal({ isOpen, onClose, onTrain, onDelete, isLoading, showUserAgentField, labels, }) {
245713
+ const [userAgent, setUserAgent] = React__default.useState('');
245714
+ return (jsx(Dialog, { open: isOpen, onOpenChange: onClose, children: jsxs(DialogContent, { "aria-describedby": "train-or-delete-description", className: "gap-0", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { className: "ibl-dialog-title", children: labels.trainOrDeleteModal.title }) }), jsx("div", { className: "my-5", children: jsx("p", { id: "train-or-delete-description", className: "text-sm text-[#646464]", children: labels.trainOrDeleteModal.description }) }), showUserAgentField && (jsxs("div", { className: "mb-5 space-y-2", children: [jsx(Label$2, { htmlFor: "train-user-agent", className: "text-sm font-medium", children: labels.trainOrDeleteModal.userAgentLabel }), jsx(Input, { id: "train-user-agent", type: "text", value: userAgent, onChange: (e) => setUserAgent(e.target.value), disabled: isLoading, placeholder: labels.trainOrDeleteModal.userAgentPlaceholder, className: "h-10" }), jsx("p", { className: "text-muted-foreground text-xs", children: labels.trainOrDeleteModal.userAgentHelpText })] })), jsxs(DialogFooter, { className: "gap-3", children: [jsx(Button$1, { variant: "outline", onClick: onDelete, disabled: isLoading, children: labels.trainOrDeleteModal.delete }), jsx(Button$1, { className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", onClick: () => onTrain(userAgent.trim() || undefined), disabled: isLoading, children: isLoading ? labels.trainOrDeleteModal.training : labels.trainOrDeleteModal.train })] })] }) }));
245686
245715
  }
245687
245716
 
245688
245717
  var trainOrDeleteModal = /*#__PURE__*/Object.freeze({
@@ -98403,7 +98403,10 @@ var datasetsTabLabels$3 = {
98403
98403
  description: "This dataset is currently untrained. You can train it to make it available for your agent, or permanently delete it if it's no longer needed.",
98404
98404
  "delete": "Delete",
98405
98405
  train: "Train",
98406
- training: "Training..."
98406
+ training: "Training...",
98407
+ userAgentLabel: "User-Agent (optional)",
98408
+ userAgentPlaceholder: "Iblai-bot/1.0 (+https://ibl.ai/bot)",
98409
+ userAgentHelpText: "Optional. Overrides the default crawler User-Agent for every request. Leave blank to keep the current setting."
98407
98410
  },
98408
98411
  retrainScheduleModal: {
98409
98412
  title: "Schedule Retraining",
@@ -105717,7 +105720,10 @@ var datasetsTabLabels$2 = {
105717
105720
  description: "Ce jeu de données n'est pas encore entraîné. Vous pouvez l'entraîner pour le rendre disponible à votre agent, ou le supprimer définitivement s'il n'est plus nécessaire.",
105718
105721
  "delete": "Supprimer",
105719
105722
  train: "Entraîner",
105720
- training: "Entraînement..."
105723
+ training: "Entraînement...",
105724
+ userAgentLabel: "User-Agent (facultatif)",
105725
+ userAgentPlaceholder: "Iblai-bot/1.0 (+https://ibl.ai/bot)",
105726
+ userAgentHelpText: "Facultatif. Remplace le User-Agent par defaut du robot d'exploration pour chaque requete. Laissez vide pour conserver le reglage actuel."
105721
105727
  },
105722
105728
  retrainScheduleModal: {
105723
105729
  title: "Planifier le réentraînement",
@@ -112865,7 +112871,10 @@ var datasetsTabLabels$1 = {
112865
112871
  description: "Este conjunto de datos no está entrenado actualmente. Puede entrenarlo para que esté disponible para su agente, o eliminarlo permanentemente si ya no lo necesita.",
112866
112872
  "delete": "Eliminar",
112867
112873
  train: "Entrenar",
112868
- training: "Entrenando..."
112874
+ training: "Entrenando...",
112875
+ userAgentLabel: "User-Agent (opcional)",
112876
+ userAgentPlaceholder: "Iblai-bot/1.0 (+https://ibl.ai/bot)",
112877
+ userAgentHelpText: "Opcional. Sustituye el User-Agent predeterminado del rastreador en cada solicitud. Dejalo en blanco para conservar la configuracion actual."
112869
112878
  },
112870
112879
  retrainScheduleModal: {
112871
112880
  title: "Programar reentrenamiento",
@@ -120013,7 +120022,10 @@ var datasetsTabLabels = {
120013
120022
  description: "该数据集当前未经训练。您可以对其进行训练以使其可供您的代理使用,或者如果不再需要则将其永久删除。",
120014
120023
  "delete": "删除",
120015
120024
  train: "训练",
120016
- training: "训练中..."
120025
+ training: "训练中...",
120026
+ userAgentLabel: "User-Agent(可选)",
120027
+ userAgentPlaceholder: "Iblai-bot/1.0 (+https://ibl.ai/bot)",
120028
+ userAgentHelpText: "可选。为每个请求覆盖默认的抓取工具 User-Agent。留空则保留当前设置。"
120017
120029
  },
120018
120030
  retrainScheduleModal: {
120019
120031
  title: "计划重新训练",
@@ -262655,6 +262667,25 @@ const RetrainScheduleModal$1 = dynamic(() => Promise.resolve().then(function ()
262655
262667
  const TrainOrDeleteModal$1 = dynamic(() => Promise.resolve().then(function () { return trainOrDeleteModal; }).then((mod) => ({
262656
262668
  default: mod.TrainOrDeleteModal,
262657
262669
  })));
262670
+ /**
262671
+ * Crawlable documents are re-fetched over HTTP on retrain, so crawler options
262672
+ * (such as a custom User-Agent) apply to them. Local uploads and cloud-provider
262673
+ * documents are not re-fetched, so they are not crawlable.
262674
+ */
262675
+ function isCrawlableDocType(documentType) {
262676
+ const docType = documentType === null || documentType === void 0 ? void 0 : documentType.toLowerCase();
262677
+ // Uploaded documents (local files like PDF, DOCX, etc.)
262678
+ const uploadedFileTypes = ['file'];
262679
+ if (uploadedFileTypes.some((type) => docType === null || docType === void 0 ? void 0 : docType.includes(type))) {
262680
+ return false;
262681
+ }
262682
+ // Cloud storage providers
262683
+ const cloudProviders = ['google drive', 'onedrive', 'dropbox', 'one drive'];
262684
+ if (cloudProviders.some((provider) => docType === null || docType === void 0 ? void 0 : docType.includes(provider))) {
262685
+ return false;
262686
+ }
262687
+ return true;
262688
+ }
262658
262689
  function DatasetItem({ dataset, onSelect, isSelected, labels }) {
262659
262690
  var _a, _b, _c, _d, _e;
262660
262691
  const t = useT();
@@ -262683,10 +262714,12 @@ function DatasetItem({ dataset, onSelect, isSelected, labels }) {
262683
262714
  console.error(JSON.stringify({ tenant: tenantKey, error }));
262684
262715
  }
262685
262716
  };
262686
- const handleTrainDataset = async () => {
262717
+ const handleTrainDataset = async (userAgent) => {
262718
+ const trimmedUserAgent = userAgent === null || userAgent === void 0 ? void 0 : userAgent.trim();
262687
262719
  await handleEditTrainingDocument({
262688
262720
  url: dataset.url,
262689
262721
  train: true,
262722
+ ...(trimmedUserAgent ? { crawler_extra_headers: { 'User-Agent': trimmedUserAgent } } : {}),
262690
262723
  });
262691
262724
  setIsTrainOrDeleteModalOpen(false);
262692
262725
  };
@@ -262696,23 +262729,12 @@ function DatasetItem({ dataset, onSelect, isSelected, labels }) {
262696
262729
  };
262697
262730
  // Helper function to check if retrain should be disabled
262698
262731
  const isRetrainDisabled = () => {
262699
- var _a;
262700
262732
  // Disable if the dataset is not trained yet
262701
262733
  if (!dataset.is_trained) {
262702
262734
  return true;
262703
262735
  }
262704
- const docType = (_a = dataset.document_type) === null || _a === void 0 ? void 0 : _a.toLowerCase();
262705
- // Disable for uploaded documents (local files like PDF, DOCX, etc.)
262706
- const uploadedFileTypes = ['file'];
262707
- if (uploadedFileTypes.some((type) => docType === null || docType === void 0 ? void 0 : docType.includes(type))) {
262708
- return true;
262709
- }
262710
- // Disable for cloud storage providers
262711
- const cloudProviders = ['google drive', 'onedrive', 'dropbox', 'one drive'];
262712
- if (cloudProviders.some((provider) => docType === null || docType === void 0 ? void 0 : docType.includes(provider))) {
262713
- return true;
262714
- }
262715
- return false;
262736
+ // Disable for uploaded documents and cloud storage providers
262737
+ return !isCrawlableDocType(dataset.document_type);
262716
262738
  };
262717
262739
  return (jsxs(Fragment$1, { children: [jsxs(TableRow$1, { className: `border-b last:border-0 ${onSelect ? 'hover:bg-muted/50 cursor-pointer' : ''} ${isSelected ? 'bg-blue-50' : ''}`, onClick: onSelect ? () => onSelect(dataset) : undefined, children: [jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { asChild: true, children: jsx(TableCell$1, { className: "max-w-[200px] truncate p-3 font-medium whitespace-nowrap text-[#646464]", children: jsx(WithFormPermissions, { name: ['document_name', 'url'],
262718
262740
  // @ts-ignore
@@ -262740,7 +262762,7 @@ function DatasetItem({ dataset, onSelect, isSelected, labels }) {
262740
262762
  }
262741
262763
  }, className: "text-gray-500 hover:text-gray-700", disabled: isEditTrainingDocumentLoading || disabled, children: dataset.access === 'private' ? (jsxs(Fragment$1, { children: [jsx(EyeOff, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: t('datasetsTabDatasetItem.makePublic') })] })) : (jsxs(Fragment$1, { children: [jsx(Eye, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: t('datasetsTabDatasetItem.makePrivate') })] })) })) }) }), jsx(TableCell$1, { className: "p-3 whitespace-nowrap", children: jsx(WithFormPermissions, { name: "is_trained",
262742
262764
  // @ts-ignore
262743
- permissions: (_e = dataset === null || dataset === void 0 ? void 0 : dataset.permissions) === null || _e === void 0 ? void 0 : _e.field, children: ({ disabled }) => (jsx(TrainingStatusSwitch, { is_trained: dataset.is_trained, url: dataset.url, disabled: disabled, training_status: dataset.training_status, handleEditTrainingDocument: handleEditTrainingDocument, onUntrainSuccess: () => setIsDeleteDatasetModalOpen(true), onTrainRequest: () => setIsTrainOrDeleteModalOpen(true) })) }) })] }, dataset.id), isDeleteDatasetModalOpen && (jsx(DeleteDatasetModal$1, { isOpen: isDeleteDatasetModalOpen, onClose: () => setIsDeleteDatasetModalOpen(false), dataset: dataset, labels: labels })), isRetrainScheduleModalOpen && (jsx(RetrainScheduleModal$1, { isOpen: isRetrainScheduleModalOpen, onClose: () => setIsRetrainScheduleModalOpen(false), dataset: dataset, labels: labels })), isTrainOrDeleteModalOpen && (jsx(TrainOrDeleteModal$1, { isOpen: isTrainOrDeleteModalOpen, onClose: () => setIsTrainOrDeleteModalOpen(false), onTrain: handleTrainDataset, onDelete: handleDeleteFromTrainModal, isLoading: isEditTrainingDocumentLoading, labels: labels }))] }));
262765
+ permissions: (_e = dataset === null || dataset === void 0 ? void 0 : dataset.permissions) === null || _e === void 0 ? void 0 : _e.field, children: ({ disabled }) => (jsx(TrainingStatusSwitch, { is_trained: dataset.is_trained, url: dataset.url, disabled: disabled, training_status: dataset.training_status, handleEditTrainingDocument: handleEditTrainingDocument, onUntrainSuccess: () => setIsDeleteDatasetModalOpen(true), onTrainRequest: () => setIsTrainOrDeleteModalOpen(true) })) }) })] }, dataset.id), isDeleteDatasetModalOpen && (jsx(DeleteDatasetModal$1, { isOpen: isDeleteDatasetModalOpen, onClose: () => setIsDeleteDatasetModalOpen(false), dataset: dataset, labels: labels })), isRetrainScheduleModalOpen && (jsx(RetrainScheduleModal$1, { isOpen: isRetrainScheduleModalOpen, onClose: () => setIsRetrainScheduleModalOpen(false), dataset: dataset, labels: labels })), isTrainOrDeleteModalOpen && (jsx(TrainOrDeleteModal$1, { isOpen: isTrainOrDeleteModalOpen, onClose: () => setIsTrainOrDeleteModalOpen(false), onTrain: handleTrainDataset, onDelete: handleDeleteFromTrainModal, showUserAgentField: isCrawlableDocType(dataset.document_type), isLoading: isEditTrainingDocumentLoading, labels: labels }))] }));
262744
262766
  }
262745
262767
  function TrainingStatusSwitch({ is_trained, url, training_status, disabled, handleEditTrainingDocument, onUntrainSuccess, onTrainRequest, }) {
262746
262768
  const t = useT();
@@ -262813,6 +262835,9 @@ const AGENT_DATASETS_TAB_LABELS = {
262813
262835
  delete: 'Delete',
262814
262836
  train: 'Train',
262815
262837
  training: 'Training...',
262838
+ userAgentLabel: 'User-Agent (optional)',
262839
+ userAgentPlaceholder: 'Iblai-bot/1.0 (+https://ibl.ai/bot)',
262840
+ userAgentHelpText: 'Optional. Overrides the default crawler User-Agent for every request. Leave blank to keep the current setting.',
262816
262841
  },
262817
262842
  retrainScheduleModal: {
262818
262843
  title: 'Schedule Retraining',
@@ -262873,6 +262898,9 @@ function buildDatasetsTabLabels(t) {
262873
262898
  delete: t('datasetsTabLabels.trainOrDeleteModal.delete'),
262874
262899
  train: t('datasetsTabLabels.trainOrDeleteModal.train'),
262875
262900
  training: t('datasetsTabLabels.trainOrDeleteModal.training'),
262901
+ userAgentLabel: t('datasetsTabLabels.trainOrDeleteModal.userAgentLabel'),
262902
+ userAgentPlaceholder: t('datasetsTabLabels.trainOrDeleteModal.userAgentPlaceholder'),
262903
+ userAgentHelpText: t('datasetsTabLabels.trainOrDeleteModal.userAgentHelpText'),
262876
262904
  },
262877
262905
  retrainScheduleModal: {
262878
262906
  title: t('datasetsTabLabels.retrainScheduleModal.title'),
@@ -288579,8 +288607,9 @@ var retrainScheduleModal = /*#__PURE__*/Object.freeze({
288579
288607
  RetrainScheduleModal: RetrainScheduleModal
288580
288608
  });
288581
288609
 
288582
- function TrainOrDeleteModal({ isOpen, onClose, onTrain, onDelete, isLoading, labels, }) {
288583
- return (jsx(Dialog, { open: isOpen, onOpenChange: onClose, children: jsxs(DialogContent, { "aria-describedby": "train-or-delete-description", className: "gap-0", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { className: "ibl-dialog-title", children: labels.trainOrDeleteModal.title }) }), jsx("div", { className: "my-5", children: jsx("p", { id: "train-or-delete-description", className: "text-sm text-[#646464]", children: labels.trainOrDeleteModal.description }) }), jsxs(DialogFooter, { className: "gap-3", children: [jsx(Button$1, { variant: "outline", onClick: onDelete, disabled: isLoading, children: labels.trainOrDeleteModal.delete }), jsx(Button$1, { className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", onClick: onTrain, disabled: isLoading, children: isLoading ? labels.trainOrDeleteModal.training : labels.trainOrDeleteModal.train })] })] }) }));
288610
+ function TrainOrDeleteModal({ isOpen, onClose, onTrain, onDelete, isLoading, showUserAgentField, labels, }) {
288611
+ const [userAgent, setUserAgent] = React__default.useState('');
288612
+ return (jsx(Dialog, { open: isOpen, onOpenChange: onClose, children: jsxs(DialogContent, { "aria-describedby": "train-or-delete-description", className: "gap-0", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { className: "ibl-dialog-title", children: labels.trainOrDeleteModal.title }) }), jsx("div", { className: "my-5", children: jsx("p", { id: "train-or-delete-description", className: "text-sm text-[#646464]", children: labels.trainOrDeleteModal.description }) }), showUserAgentField && (jsxs("div", { className: "mb-5 space-y-2", children: [jsx(Label$1, { htmlFor: "train-user-agent", className: "text-sm font-medium", children: labels.trainOrDeleteModal.userAgentLabel }), jsx(Input, { id: "train-user-agent", type: "text", value: userAgent, onChange: (e) => setUserAgent(e.target.value), disabled: isLoading, placeholder: labels.trainOrDeleteModal.userAgentPlaceholder, className: "h-10" }), jsx("p", { className: "text-muted-foreground text-xs", children: labels.trainOrDeleteModal.userAgentHelpText })] })), jsxs(DialogFooter, { className: "gap-3", children: [jsx(Button$1, { variant: "outline", onClick: onDelete, disabled: isLoading, children: labels.trainOrDeleteModal.delete }), jsx(Button$1, { className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", onClick: () => onTrain(userAgent.trim() || undefined), disabled: isLoading, children: isLoading ? labels.trainOrDeleteModal.training : labels.trainOrDeleteModal.train })] })] }) }));
288584
288613
  }
288585
288614
 
288586
288615
  var trainOrDeleteModal = /*#__PURE__*/Object.freeze({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iblai/iblai-js",
3
- "version": "2.11.2",
3
+ "version": "2.11.4",
4
4
  "description": "Unified JavaScript SDK for IBL.ai — re-exports data-layer, web-containers, and web-utils under a single package",
5
5
  "type": "module",
6
6
  "engines": {
@@ -76,9 +76,9 @@
76
76
  "axios": "1.13.6",
77
77
  "dotenv": "16.6.1",
78
78
  "winston": "3.19.0",
79
- "@iblai/data-layer": "1.13.4",
79
+ "@iblai/data-layer": "1.13.5",
80
80
  "@iblai/mcp": "1.12.14",
81
- "@iblai/web-containers": "1.20.2",
81
+ "@iblai/web-containers": "1.20.3",
82
82
  "@iblai/web-utils": "2.4.6"
83
83
  },
84
84
  "peerDependencies": {