@djangocfg/ext-knowbase 1.0.21 → 1.0.23

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/config.cjs CHANGED
@@ -27,7 +27,7 @@ var import_ext_base = require("@djangocfg/ext-base");
27
27
  // package.json
28
28
  var package_default = {
29
29
  name: "@djangocfg/ext-knowbase",
30
- version: "1.0.21",
30
+ version: "1.0.23",
31
31
  description: "Knowledge base and chat extension for DjangoCFG",
32
32
  keywords: [
33
33
  "django",
@@ -73,6 +73,11 @@ var package_default = {
73
73
  types: "./dist/config.d.ts",
74
74
  import: "./dist/config.js",
75
75
  require: "./dist/config.cjs"
76
+ },
77
+ "./i18n": {
78
+ types: "./dist/i18n.d.ts",
79
+ import: "./dist/i18n.js",
80
+ require: "./dist/i18n.cjs"
76
81
  }
77
82
  },
78
83
  files: [
@@ -88,27 +93,31 @@ var package_default = {
88
93
  peerDependencies: {
89
94
  "@djangocfg/api": "workspace:*",
90
95
  "@djangocfg/ext-base": "workspace:*",
96
+ "@djangocfg/i18n": "workspace:*",
91
97
  "@djangocfg/ui-core": "workspace:*",
92
98
  "@djangocfg/ui-nextjs": "workspace:*",
93
99
  consola: "^3.4.2",
94
100
  "lucide-react": "^0.545.0",
101
+ moment: "^2.30.1",
95
102
  next: "^16",
103
+ "next-intl": "^4",
96
104
  "p-retry": "^7.0.0",
97
105
  react: "^19",
98
106
  "react-dom": "^19",
99
107
  "react-markdown": "^9.0.0 || ^10.0.0",
100
108
  swr: "^2.3.7",
101
- zod: "^4.3.4",
102
- moment: "^2.30.1"
109
+ zod: "^4.3.4"
103
110
  },
104
111
  devDependencies: {
105
112
  "@djangocfg/api": "workspace:*",
106
113
  "@djangocfg/ext-base": "workspace:*",
114
+ "@djangocfg/i18n": "workspace:*",
107
115
  "@djangocfg/ui-core": "workspace:*",
108
116
  "@djangocfg/typescript-config": "workspace:*",
109
117
  "@types/node": "^24.7.2",
110
118
  "@types/react": "^19.0.0",
111
119
  consola: "^3.4.2",
120
+ "next-intl": "^4.1.0",
112
121
  "p-retry": "^7.0.0",
113
122
  swr: "^2.3.7",
114
123
  tsup: "^8.5.0",
package/dist/config.js CHANGED
@@ -4,7 +4,7 @@ import { createExtensionConfig } from "@djangocfg/ext-base";
4
4
  // package.json
5
5
  var package_default = {
6
6
  name: "@djangocfg/ext-knowbase",
7
- version: "1.0.21",
7
+ version: "1.0.23",
8
8
  description: "Knowledge base and chat extension for DjangoCFG",
9
9
  keywords: [
10
10
  "django",
@@ -50,6 +50,11 @@ var package_default = {
50
50
  types: "./dist/config.d.ts",
51
51
  import: "./dist/config.js",
52
52
  require: "./dist/config.cjs"
53
+ },
54
+ "./i18n": {
55
+ types: "./dist/i18n.d.ts",
56
+ import: "./dist/i18n.js",
57
+ require: "./dist/i18n.cjs"
53
58
  }
54
59
  },
55
60
  files: [
@@ -65,27 +70,31 @@ var package_default = {
65
70
  peerDependencies: {
66
71
  "@djangocfg/api": "workspace:*",
67
72
  "@djangocfg/ext-base": "workspace:*",
73
+ "@djangocfg/i18n": "workspace:*",
68
74
  "@djangocfg/ui-core": "workspace:*",
69
75
  "@djangocfg/ui-nextjs": "workspace:*",
70
76
  consola: "^3.4.2",
71
77
  "lucide-react": "^0.545.0",
78
+ moment: "^2.30.1",
72
79
  next: "^16",
80
+ "next-intl": "^4",
73
81
  "p-retry": "^7.0.0",
74
82
  react: "^19",
75
83
  "react-dom": "^19",
76
84
  "react-markdown": "^9.0.0 || ^10.0.0",
77
85
  swr: "^2.3.7",
78
- zod: "^4.3.4",
79
- moment: "^2.30.1"
86
+ zod: "^4.3.4"
80
87
  },
81
88
  devDependencies: {
82
89
  "@djangocfg/api": "workspace:*",
83
90
  "@djangocfg/ext-base": "workspace:*",
91
+ "@djangocfg/i18n": "workspace:*",
84
92
  "@djangocfg/ui-core": "workspace:*",
85
93
  "@djangocfg/typescript-config": "workspace:*",
86
94
  "@types/node": "^24.7.2",
87
95
  "@types/react": "^19.0.0",
88
96
  consola: "^3.4.2",
97
+ "next-intl": "^4.1.0",
89
98
  "p-retry": "^7.0.0",
90
99
  swr: "^2.3.7",
91
100
  tsup: "^8.5.0",
package/dist/hooks.cjs CHANGED
@@ -12,6 +12,7 @@ var jsxRuntime = require('react/jsx-runtime');
12
12
  var lucideReact = require('lucide-react');
13
13
  var navigation = require('next/navigation');
14
14
  var reactDom = require('react-dom');
15
+ var nextIntl = require('next-intl');
15
16
  var uiNextjs = require('@djangocfg/ui-nextjs');
16
17
  var hooks = require('@djangocfg/ui-core/hooks');
17
18
  var moment = require('moment');
@@ -4797,7 +4798,7 @@ var apiKnowbase = api.createExtensionAPI(API);
4797
4798
  // package.json
4798
4799
  var package_default = {
4799
4800
  name: "@djangocfg/ext-knowbase",
4800
- version: "1.0.21",
4801
+ version: "1.0.23",
4801
4802
  description: "Knowledge base and chat extension for DjangoCFG",
4802
4803
  keywords: [
4803
4804
  "django",
@@ -4843,6 +4844,11 @@ var package_default = {
4843
4844
  types: "./dist/config.d.ts",
4844
4845
  import: "./dist/config.js",
4845
4846
  require: "./dist/config.cjs"
4847
+ },
4848
+ "./i18n": {
4849
+ types: "./dist/i18n.d.ts",
4850
+ import: "./dist/i18n.js",
4851
+ require: "./dist/i18n.cjs"
4846
4852
  }
4847
4853
  },
4848
4854
  files: [
@@ -4858,27 +4864,31 @@ var package_default = {
4858
4864
  peerDependencies: {
4859
4865
  "@djangocfg/api": "workspace:*",
4860
4866
  "@djangocfg/ext-base": "workspace:*",
4867
+ "@djangocfg/i18n": "workspace:*",
4861
4868
  "@djangocfg/ui-core": "workspace:*",
4862
4869
  "@djangocfg/ui-nextjs": "workspace:*",
4863
4870
  consola: "^3.4.2",
4864
4871
  "lucide-react": "^0.545.0",
4872
+ moment: "^2.30.1",
4865
4873
  next: "^16",
4874
+ "next-intl": "^4",
4866
4875
  "p-retry": "^7.0.0",
4867
4876
  react: "^19",
4868
4877
  "react-dom": "^19",
4869
4878
  "react-markdown": "^9.0.0 || ^10.0.0",
4870
4879
  swr: "^2.3.7",
4871
- zod: "^4.3.4",
4872
- moment: "^2.30.1"
4880
+ zod: "^4.3.4"
4873
4881
  },
4874
4882
  devDependencies: {
4875
4883
  "@djangocfg/api": "workspace:*",
4876
4884
  "@djangocfg/ext-base": "workspace:*",
4885
+ "@djangocfg/i18n": "workspace:*",
4877
4886
  "@djangocfg/ui-core": "workspace:*",
4878
4887
  "@djangocfg/typescript-config": "workspace:*",
4879
4888
  "@types/node": "^24.7.2",
4880
4889
  "@types/react": "^19.0.0",
4881
4890
  consola: "^3.4.2",
4891
+ "next-intl": "^4.1.0",
4882
4892
  "p-retry": "^7.0.0",
4883
4893
  swr: "^2.3.7",
4884
4894
  tsup: "^8.5.0",
@@ -5245,6 +5255,131 @@ function useChatUI() {
5245
5255
  }
5246
5256
  return context;
5247
5257
  }
5258
+
5259
+ // src/i18n/locales/en.ts
5260
+ var en = {
5261
+ chat: {
5262
+ title: "Knowledge Assistant",
5263
+ titleShort: "Support",
5264
+ placeholder: "Ask me anything...",
5265
+ enterToSend: "Press Enter to send, Shift+Enter for new line",
5266
+ thinking: "Thinking...",
5267
+ source: "Source {index}",
5268
+ startConversation: "Start a Conversation",
5269
+ startConversationDescription: "Ask me anything about the documentation, features, or get help with your project.",
5270
+ openChat: "Open Support Chat"
5271
+ },
5272
+ sessions: {
5273
+ title: "Chat Sessions",
5274
+ description: "View and manage your chat history",
5275
+ noSessions: "No Sessions Yet",
5276
+ noSessionsDescription: "Start a new conversation to create your first session.",
5277
+ untitled: "Untitled Session",
5278
+ active: "Active",
5279
+ archive: "Archive",
5280
+ delete: "Delete",
5281
+ loadingMore: "Loading more...",
5282
+ noMore: "No more sessions",
5283
+ newChat: "New Chat"
5284
+ },
5285
+ actions: {
5286
+ sessions: "Sessions",
5287
+ collapse: "Collapse",
5288
+ expand: "Expand",
5289
+ close: "Close"
5290
+ }
5291
+ };
5292
+
5293
+ // src/i18n/locales/ru.ts
5294
+ var ru = {
5295
+ chat: {
5296
+ title: "\u0411\u0430\u0437\u0430 \u0437\u043D\u0430\u043D\u0438\u0439",
5297
+ titleShort: "\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0430",
5298
+ placeholder: "\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u0432\u043E\u043F\u0440\u043E\u0441...",
5299
+ enterToSend: "Enter \u0434\u043B\u044F \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u0438, Shift+Enter \u0434\u043B\u044F \u043D\u043E\u0432\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438",
5300
+ thinking: "\u0414\u0443\u043C\u0430\u044E...",
5301
+ source: "\u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A {index}",
5302
+ startConversation: "\u041D\u0430\u0447\u0430\u0442\u044C \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440",
5303
+ startConversationDescription: "\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u043B\u044E\u0431\u043E\u0439 \u0432\u043E\u043F\u0440\u043E\u0441 \u043E \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438, \u0444\u0443\u043D\u043A\u0446\u0438\u044F\u0445 \u0438\u043B\u0438 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u0435 \u043F\u043E\u043C\u043E\u0449\u044C \u0441 \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u043C.",
5304
+ openChat: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0438"
5305
+ },
5306
+ sessions: {
5307
+ title: "\u0421\u0435\u0441\u0441\u0438\u0438 \u0447\u0430\u0442\u0430",
5308
+ description: "\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0438 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0438\u0441\u0442\u043E\u0440\u0438\u0435\u0439 \u0447\u0430\u0442\u0430",
5309
+ noSessions: "\u041D\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u0439",
5310
+ noSessionsDescription: "\u041D\u0430\u0447\u043D\u0438\u0442\u0435 \u043D\u043E\u0432\u044B\u0439 \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440, \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u0443\u044E \u0441\u0435\u0441\u0441\u0438\u044E.",
5311
+ untitled: "\u0411\u0435\u0437 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044F",
5312
+ active: "\u0410\u043A\u0442\u0438\u0432\u043D\u0430\u044F",
5313
+ archive: "\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
5314
+ delete: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C",
5315
+ loadingMore: "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...",
5316
+ noMore: "\u0411\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u0439",
5317
+ newChat: "\u041D\u043E\u0432\u044B\u0439 \u0447\u0430\u0442"
5318
+ },
5319
+ actions: {
5320
+ sessions: "\u0421\u0435\u0441\u0441\u0438\u0438",
5321
+ collapse: "\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
5322
+ expand: "\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
5323
+ close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C"
5324
+ }
5325
+ };
5326
+
5327
+ // src/i18n/locales/ko.ts
5328
+ var ko = {
5329
+ chat: {
5330
+ title: "\uC9C0\uC2DD \uB3C4\uC6B0\uBBF8",
5331
+ titleShort: "\uC9C0\uC6D0",
5332
+ placeholder: "\uBB34\uC5C7\uC774\uB4E0 \uBB3C\uC5B4\uBCF4\uC138\uC694...",
5333
+ enterToSend: "Enter\uB85C \uC804\uC1A1, Shift+Enter\uB85C \uC904\uBC14\uAFC8",
5334
+ thinking: "\uC0DD\uAC01 \uC911...",
5335
+ source: "\uCD9C\uCC98 {index}",
5336
+ startConversation: "\uB300\uD654 \uC2DC\uC791\uD558\uAE30",
5337
+ startConversationDescription: "\uBB38\uC11C, \uAE30\uB2A5\uC5D0 \uB300\uD574 \uC9C8\uBB38\uD558\uAC70\uB098 \uD504\uB85C\uC81D\uD2B8 \uB3C4\uC6C0\uC744 \uBC1B\uC73C\uC138\uC694.",
5338
+ openChat: "\uC9C0\uC6D0 \uCC44\uD305 \uC5F4\uAE30"
5339
+ },
5340
+ sessions: {
5341
+ title: "\uCC44\uD305 \uC138\uC158",
5342
+ description: "\uCC44\uD305 \uAE30\uB85D \uBCF4\uAE30 \uBC0F \uAD00\uB9AC",
5343
+ noSessions: "\uC138\uC158 \uC5C6\uC74C",
5344
+ noSessionsDescription: "\uC0C8 \uB300\uD654\uB97C \uC2DC\uC791\uD558\uC5EC \uCCAB \uBC88\uC9F8 \uC138\uC158\uC744 \uB9CC\uB4DC\uC138\uC694.",
5345
+ untitled: "\uC81C\uBAA9 \uC5C6\uC74C",
5346
+ active: "\uD65C\uC131",
5347
+ archive: "\uBCF4\uAD00",
5348
+ delete: "\uC0AD\uC81C",
5349
+ loadingMore: "\uBD88\uB7EC\uC624\uB294 \uC911...",
5350
+ noMore: "\uB354 \uC774\uC0C1 \uC138\uC158 \uC5C6\uC74C",
5351
+ newChat: "\uC0C8 \uCC44\uD305"
5352
+ },
5353
+ actions: {
5354
+ sessions: "\uC138\uC158",
5355
+ collapse: "\uCD95\uC18C",
5356
+ expand: "\uD655\uC7A5",
5357
+ close: "\uB2EB\uAE30"
5358
+ }
5359
+ };
5360
+
5361
+ // src/i18n/useKnowbaseT.ts
5362
+ var translations = { en, ru, ko };
5363
+ function getNestedValue(obj, path) {
5364
+ const keys = path.split(".");
5365
+ let result = obj;
5366
+ for (const key of keys) {
5367
+ if (result && typeof result === "object" && key in result) {
5368
+ result = result[key];
5369
+ } else {
5370
+ return path;
5371
+ }
5372
+ }
5373
+ return typeof result === "string" ? result : path;
5374
+ }
5375
+ function useKnowbaseT() {
5376
+ const locale = nextIntl.useLocale();
5377
+ const t = react.useMemo(() => translations[locale] || translations.en, [locale]);
5378
+ return react.useCallback(
5379
+ (key) => getNestedValue(t, key),
5380
+ [t]
5381
+ );
5382
+ }
5248
5383
  var isDevelopment = process.env.NODE_ENV === "development";
5249
5384
  var logger = consola.createConsola({
5250
5385
  level: isDevelopment ? 4 : 1
@@ -5261,8 +5396,15 @@ var MessageList = ({
5261
5396
  autoScroll = true,
5262
5397
  className = ""
5263
5398
  }) => {
5399
+ const kt = useKnowbaseT();
5264
5400
  const scrollRef = react.useRef(null);
5265
5401
  const { user } = auth.useAuth();
5402
+ const labels = react.useMemo(() => ({
5403
+ startConversation: kt("chat.startConversation"),
5404
+ startConversationDescription: kt("chat.startConversationDescription"),
5405
+ source: kt("chat.source"),
5406
+ thinking: kt("chat.thinking")
5407
+ }), [kt]);
5266
5408
  react.useEffect(() => {
5267
5409
  if (autoScroll && scrollRef.current) {
5268
5410
  const scrollContainer = scrollRef.current.querySelector("[data-radix-scroll-area-viewport]");
@@ -5278,8 +5420,8 @@ var MessageList = ({
5278
5420
  return /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.ScrollArea, { className: `h-full bg-muted/50 ${className}`, viewportRef: scrollRef, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4 p-4", children: [
5279
5421
  messages.length === 0 && !isLoading ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center h-full text-center py-12", children: [
5280
5422
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bot, { className: "h-12 w-12 text-muted-foreground mb-4" }),
5281
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold text-foreground mb-2", children: "Start a Conversation" }),
5282
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground max-w-md", children: "Ask me anything about the documentation, features, or get help with your project." })
5423
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold text-foreground mb-2", children: labels.startConversation }),
5424
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground max-w-md", children: labels.startConversationDescription })
5283
5425
  ] }) : messages.map((message, index) => {
5284
5426
  const isUser = message.role === Enums.ChatMessageRole.USER;
5285
5427
  const isAssistant = message.role === Enums.ChatMessageRole.ASSISTANT;
@@ -5308,10 +5450,10 @@ var MessageList = ({
5308
5450
  uiNextjs.Badge,
5309
5451
  {
5310
5452
  variant: "secondary",
5311
- className: "text-xs flex items-center gap-1 cursor-pointer \n hover:bg-secondary/80 hover:scale-105 active:scale-95 \n transition-all duration-200 animate-in fade-in zoom-in-95",
5453
+ className: "text-xs flex items-center gap-1 cursor-pointer\n hover:bg-secondary/80 hover:scale-105 active:scale-95\n transition-all duration-200 animate-in fade-in zoom-in-95",
5312
5454
  style: { animationDelay: `${(idx + 1) * 100}ms` },
5313
5455
  children: [
5314
- source.document_title || `Source ${idx + 1}`,
5456
+ source.document_title || labels.source.replace("{index}", String(idx + 1)),
5315
5457
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLink, { className: "h-3 w-3" })
5316
5458
  ]
5317
5459
  }
@@ -5332,7 +5474,7 @@ var MessageList = ({
5332
5474
  /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.Avatar, { className: "h-8 w-8 shrink-0 animate-pulse", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full w-full items-center justify-center bg-primary text-primary-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bot, { className: "h-5 w-5 animate-bounce" }) }) }),
5333
5475
  /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.Card, { className: "bg-muted animate-pulse", children: /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.CardContent, { className: "p-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
5334
5476
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-4 w-4 animate-spin" }),
5335
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "animate-pulse", children: "Thinking..." })
5477
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "animate-pulse", children: labels.thinking })
5336
5478
  ] }) }) })
5337
5479
  ] })
5338
5480
  ] }) });
@@ -5341,12 +5483,17 @@ var MessageInput = ({
5341
5483
  onSend,
5342
5484
  isLoading = false,
5343
5485
  disabled = false,
5344
- placeholder = "Ask me anything...",
5486
+ placeholder,
5345
5487
  className = ""
5346
5488
  }) => {
5489
+ const kt = useKnowbaseT();
5347
5490
  const [message, setMessage] = react.useState("");
5348
5491
  const [rows, setRows] = react.useState(1);
5349
5492
  const textareaRef = react.useRef(null);
5493
+ const labels = react.useMemo(() => ({
5494
+ placeholder: placeholder || kt("chat.placeholder"),
5495
+ enterToSend: kt("chat.enterToSend")
5496
+ }), [kt, placeholder]);
5350
5497
  react.useEffect(() => {
5351
5498
  if (textareaRef.current) {
5352
5499
  const lineHeight = 24;
@@ -5401,10 +5548,10 @@ var MessageInput = ({
5401
5548
  value: message,
5402
5549
  onChange: (e) => setMessage(e.target.value),
5403
5550
  onKeyDown: handleKeyDown,
5404
- placeholder,
5551
+ placeholder: labels.placeholder,
5405
5552
  disabled: isDisabled,
5406
5553
  rows,
5407
- className: "resize-none min-h-[40px] max-h-[120px] transition-all duration-200 \n focus:ring-2 focus:ring-primary/20",
5554
+ className: "resize-none min-h-[40px] max-h-[120px] transition-all duration-200\n focus:ring-2 focus:ring-primary/20",
5408
5555
  style: { resize: "none" }
5409
5556
  }
5410
5557
  ),
@@ -5414,12 +5561,12 @@ var MessageInput = ({
5414
5561
  type: "submit",
5415
5562
  size: "icon",
5416
5563
  disabled: !canSend,
5417
- className: "shrink-0 h-10 w-10 transition-all duration-200 \n hover:scale-110 active:scale-95 disabled:scale-100",
5564
+ className: "shrink-0 h-10 w-10 transition-all duration-200\n hover:scale-110 active:scale-95 disabled:scale-100",
5418
5565
  children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Send, { className: "h-4 w-4" })
5419
5566
  }
5420
5567
  )
5421
5568
  ] }),
5422
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground mt-2", children: "Press Enter to send, Shift+Enter for new line" })
5569
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground mt-2", children: labels.enterToSend })
5423
5570
  ] });
5424
5571
  };
5425
5572
  var PAGE_SIZE = 20;
@@ -5476,6 +5623,7 @@ var SessionList = ({
5476
5623
  onSelectSession,
5477
5624
  className = ""
5478
5625
  }) => {
5626
+ const kt = useKnowbaseT();
5479
5627
  const { deleteSession, archiveSession } = useKnowbaseSessionsContext();
5480
5628
  const {
5481
5629
  sessions,
@@ -5484,6 +5632,18 @@ var SessionList = ({
5484
5632
  hasMore,
5485
5633
  loadMore
5486
5634
  } = useInfiniteSessions();
5635
+ const labels = react.useMemo(() => ({
5636
+ title: kt("sessions.title"),
5637
+ description: kt("sessions.description"),
5638
+ noSessions: kt("sessions.noSessions"),
5639
+ noSessionsDescription: kt("sessions.noSessionsDescription"),
5640
+ untitled: kt("sessions.untitled"),
5641
+ active: kt("sessions.active"),
5642
+ archive: kt("sessions.archive"),
5643
+ delete: kt("sessions.delete"),
5644
+ loadingMore: kt("sessions.loadingMore"),
5645
+ noMore: kt("sessions.noMore")
5646
+ }), [kt]);
5487
5647
  const scrollRef = react.useRef(null);
5488
5648
  const handleScroll = react.useCallback(() => {
5489
5649
  if (!scrollRef.current || isLoadingMore || !hasMore) return;
@@ -5506,13 +5666,13 @@ var SessionList = ({
5506
5666
  };
5507
5667
  return /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.Sheet, { open: isOpen, onOpenChange: onClose, children: /* @__PURE__ */ jsxRuntime.jsxs(uiNextjs.SheetContent, { side: "left", className: `w-[400px] sm:w-[540px] ${className}`, children: [
5508
5668
  /* @__PURE__ */ jsxRuntime.jsxs(uiNextjs.SheetHeader, { children: [
5509
- /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.SheetTitle, { children: "Chat Sessions" }),
5510
- /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.SheetDescription, { children: "View and manage your chat history" })
5669
+ /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.SheetTitle, { children: labels.title }),
5670
+ /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.SheetDescription, { children: labels.description })
5511
5671
  ] }),
5512
5672
  /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.ScrollArea, { className: "h-[calc(100vh-120px)] mt-6", viewportRef: scrollRef, children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-6 w-6 animate-spin text-muted-foreground" }) }) : !sessions || sessions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center py-12 text-center", children: [
5513
5673
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageSquare, { className: "h-12 w-12 text-muted-foreground mb-4" }),
5514
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold text-foreground mb-2", children: "No Sessions Yet" }),
5515
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground max-w-md", children: "Start a new conversation to create your first session." })
5674
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold text-foreground mb-2", children: labels.noSessions }),
5675
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground max-w-md", children: labels.noSessionsDescription })
5516
5676
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
5517
5677
  sessions.map((session, index) => /* @__PURE__ */ jsxRuntime.jsxs(
5518
5678
  "div",
@@ -5527,8 +5687,8 @@ var SessionList = ({
5527
5687
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 mt-1", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageSquare, { className: "h-5 w-5 text-muted-foreground" }) }),
5528
5688
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [
5529
5689
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-2 mb-1", children: [
5530
- /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-medium text-sm truncate", children: session.title || "Untitled Session" }),
5531
- session.is_active && /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.Badge, { variant: "default", className: "shrink-0 text-xs", children: "Active" })
5690
+ /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-medium text-sm truncate", children: session.title || labels.untitled }),
5691
+ session.is_active && /* @__PURE__ */ jsxRuntime.jsx(uiNextjs.Badge, { variant: "default", className: "shrink-0 text-xs", children: labels.active })
5532
5692
  ] }),
5533
5693
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [
5534
5694
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Clock, { className: "h-3 w-3" }),
@@ -5546,7 +5706,7 @@ var SessionList = ({
5546
5706
  e.stopPropagation();
5547
5707
  archiveSession(session.id, {});
5548
5708
  },
5549
- title: "Archive",
5709
+ title: labels.archive,
5550
5710
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Archive, { className: "h-4 w-4" })
5551
5711
  }
5552
5712
  ),
@@ -5555,12 +5715,12 @@ var SessionList = ({
5555
5715
  {
5556
5716
  variant: "ghost",
5557
5717
  size: "sm",
5558
- className: "h-8 w-8 p-0 text-destructive hover:text-destructive \n hover:scale-110 active:scale-95 transition-transform duration-200",
5718
+ className: "h-8 w-8 p-0 text-destructive hover:text-destructive\n hover:scale-110 active:scale-95 transition-transform duration-200",
5559
5719
  onClick: (e) => {
5560
5720
  e.stopPropagation();
5561
5721
  deleteSession(session.id);
5562
5722
  },
5563
- title: "Delete",
5723
+ title: labels.delete,
5564
5724
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2, { className: "h-4 w-4" })
5565
5725
  }
5566
5726
  )
@@ -5571,9 +5731,9 @@ var SessionList = ({
5571
5731
  )),
5572
5732
  isLoadingMore && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center py-6", children: [
5573
5733
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-5 w-5 animate-spin text-muted-foreground mr-2" }),
5574
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: "Loading more..." })
5734
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: labels.loadingMore })
5575
5735
  ] }),
5576
- !hasMore && sessions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-4", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "No more sessions" }) })
5736
+ !hasMore && sessions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-4", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: labels.noMore }) })
5577
5737
  ] }) })
5578
5738
  ] }) });
5579
5739
  };
@@ -5586,6 +5746,7 @@ var ChatWidget = ({
5586
5746
  onToggle,
5587
5747
  onMessage
5588
5748
  }) => {
5749
+ const kt = useKnowbaseT();
5589
5750
  const { sendQuery, getChatHistory } = useKnowbaseChatContext();
5590
5751
  const { createSession, getSession } = useKnowbaseSessionsContext();
5591
5752
  const {
@@ -5596,6 +5757,17 @@ var ChatWidget = ({
5596
5757
  toggleSources,
5597
5758
  toggleTimestamps
5598
5759
  } = useChatUI();
5760
+ const labels = react.useMemo(() => ({
5761
+ title: kt("chat.title"),
5762
+ titleShort: kt("chat.titleShort"),
5763
+ placeholder: kt("chat.placeholder"),
5764
+ openChat: kt("chat.openChat"),
5765
+ sessions: kt("actions.sessions"),
5766
+ newChat: kt("sessions.newChat"),
5767
+ collapse: kt("actions.collapse"),
5768
+ expand: kt("actions.expand"),
5769
+ close: kt("actions.close")
5770
+ }), [kt]);
5599
5771
  const pathname = navigation.usePathname();
5600
5772
  const isMobile = hooks.useIsMobile();
5601
5773
  const [isLoading, setIsLoading] = react.useState(false);
@@ -5736,7 +5908,7 @@ var ChatWidget = ({
5736
5908
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between p-4 border-b bg-background shadow-sm", children: [
5737
5909
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
5738
5910
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageSquare, { className: "h-5 w-5 text-primary" }),
5739
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "font-semibold text-foreground", children: "Knowledge Assistant" })
5911
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "font-semibold text-foreground", children: labels.title })
5740
5912
  ] }),
5741
5913
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
5742
5914
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -5746,7 +5918,7 @@ var ChatWidget = ({
5746
5918
  size: "sm",
5747
5919
  onClick: () => setShowSessions(true),
5748
5920
  className: "text-muted-foreground hover:text-foreground",
5749
- title: "Sessions",
5921
+ title: labels.sessions,
5750
5922
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.List, { className: "h-5 w-5" })
5751
5923
  }
5752
5924
  ),
@@ -5757,7 +5929,7 @@ var ChatWidget = ({
5757
5929
  size: "sm",
5758
5930
  onClick: handleNewChat,
5759
5931
  className: "text-muted-foreground hover:text-foreground",
5760
- title: "New Chat",
5932
+ title: labels.newChat,
5761
5933
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "h-5 w-5" })
5762
5934
  }
5763
5935
  ),
@@ -5790,7 +5962,7 @@ var ChatWidget = ({
5790
5962
  {
5791
5963
  onSend: handleSendMessage,
5792
5964
  isLoading,
5793
- placeholder: "Ask me anything..."
5965
+ placeholder: labels.placeholder
5794
5966
  }
5795
5967
  )
5796
5968
  ] })
@@ -5839,7 +6011,7 @@ var ChatWidget = ({
5839
6011
  /* @__PURE__ */ jsxRuntime.jsxs(uiNextjs.CardHeader, { className: "flex-row items-center justify-between space-y-0 pb-3 border-b", children: [
5840
6012
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
5841
6013
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageSquare, { className: "h-5 w-5 text-primary" }),
5842
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-semibold text-foreground", children: "Support" })
6014
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-semibold text-foreground", children: labels.titleShort })
5843
6015
  ] }),
5844
6016
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
5845
6017
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -5849,7 +6021,7 @@ var ChatWidget = ({
5849
6021
  size: "sm",
5850
6022
  onClick: () => setShowSessions(true),
5851
6023
  className: "h-8 w-8 p-0",
5852
- title: "Sessions",
6024
+ title: labels.sessions,
5853
6025
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.List, { className: "h-4 w-4" })
5854
6026
  }
5855
6027
  ),
@@ -5860,7 +6032,7 @@ var ChatWidget = ({
5860
6032
  size: "sm",
5861
6033
  onClick: handleNewChat,
5862
6034
  className: "h-8 w-8 p-0",
5863
- title: "New Chat",
6035
+ title: labels.newChat,
5864
6036
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "h-4 w-4" })
5865
6037
  }
5866
6038
  ),
@@ -5871,7 +6043,7 @@ var ChatWidget = ({
5871
6043
  size: "sm",
5872
6044
  onClick: uiState.isExpanded ? collapseChat : expandChat,
5873
6045
  className: "h-8 w-8 p-0",
5874
- title: uiState.isExpanded ? "Collapse" : "Expand",
6046
+ title: uiState.isExpanded ? labels.collapse : labels.expand,
5875
6047
  children: uiState.isExpanded ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minimize2, { className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Maximize2, { className: "h-4 w-4" })
5876
6048
  }
5877
6049
  ),
@@ -5882,7 +6054,7 @@ var ChatWidget = ({
5882
6054
  size: "sm",
5883
6055
  onClick: toggleChat,
5884
6056
  className: "h-8 w-8 p-0",
5885
- title: "Close",
6057
+ title: labels.close,
5886
6058
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" })
5887
6059
  }
5888
6060
  )
@@ -5905,7 +6077,7 @@ var ChatWidget = ({
5905
6077
  {
5906
6078
  onSend: handleSendMessage,
5907
6079
  isLoading,
5908
- placeholder: "Ask me anything..."
6080
+ placeholder: labels.placeholder
5909
6081
  }
5910
6082
  )
5911
6083
  ] })
@@ -5940,14 +6112,14 @@ var ChatWidget = ({
5940
6112
  uiNextjs.Button,
5941
6113
  {
5942
6114
  onClick: toggleChat,
5943
- className: "w-full h-full rounded-full shadow-2xl \n hover:scale-110 hover:rotate-12 active:scale-95 \n transition-all duration-300 ease-out\n flex items-center justify-center\n group",
6115
+ className: "w-full h-full rounded-full shadow-2xl\n hover:scale-110 hover:rotate-12 active:scale-95\n transition-all duration-300 ease-out\n flex items-center justify-center\n group",
5944
6116
  style: {
5945
6117
  backgroundColor: "hsl(var(--primary))",
5946
6118
  borderRadius: "50%",
5947
6119
  padding: 0
5948
6120
  },
5949
- title: "Open Support Chat",
5950
- "aria-label": "Open Support Chat",
6121
+ title: labels.openChat,
6122
+ "aria-label": labels.openChat,
5951
6123
  children: /* @__PURE__ */ jsxRuntime.jsx(
5952
6124
  lucideReact.MessageSquare,
5953
6125
  {