gentiq 0.11.0 → 0.12.0-beta.2

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.
@@ -4,7 +4,7 @@ import { createContext as pe, useContext as ke, useState as P, useEffect as V, u
4
4
  import { useTranslation as z, initReactI18next as Bn } from "react-i18next";
5
5
  import { Slot as Kt } from "@radix-ui/react-slot";
6
6
  import { cva as ot } from "class-variance-authority";
7
- import { QuoteIcon as Oe, CheckIcon as Le, SendIcon as Hn, ArrowDownIcon as jn, ChevronDownIcon as we, BookIcon as Gn, XIcon as be, ArrowUpIcon as Wn, Loader2Icon as Vn, SquareIcon as Yn, FileIcon as Qt, PaperclipIcon as Xn, RefreshCcwIcon as Kn, ThumbsUpIcon as Qn, ThumbsDownIcon as Zn, CopyIcon as Zt, BrainIcon as Jn, WrenchIcon as eo, ImagePlusIcon as to, CodeIcon as no, DownloadIcon as Te, GlobeIcon as oo, XCircleIcon as Jt, CheckCircleIcon as ro, ClockIcon as ao, CircleIcon as io, ChevronUpIcon as lo } from "lucide-react";
7
+ import { QuoteIcon as Oe, CheckIcon as De, SendIcon as Hn, ArrowDownIcon as jn, ChevronDownIcon as we, BookIcon as Gn, XIcon as be, ArrowUpIcon as Wn, Loader2Icon as Vn, SquareIcon as Yn, FileIcon as Qt, PaperclipIcon as Xn, RefreshCcwIcon as Kn, ThumbsUpIcon as Qn, ThumbsDownIcon as Zn, CopyIcon as Zt, BrainIcon as Jn, WrenchIcon as eo, ImagePlusIcon as to, CodeIcon as no, DownloadIcon as Ce, GlobeIcon as oo, XCircleIcon as Jt, CheckCircleIcon as ro, ClockIcon as ao, CircleIcon as io, ChevronUpIcon as lo } from "lucide-react";
8
8
  import * as ce from "@radix-ui/react-tooltip";
9
9
  import { toast as so } from "sonner";
10
10
  import { createPortal as co } from "react-dom";
@@ -58,8 +58,8 @@ function pl({
58
58
  const d = window.document.documentElement, w = m.language?.split("-")[0] || m.language;
59
59
  let _ = o?.typography?.fontFamily;
60
60
  if (typeof _ == "object" && _ !== null && (_ = _[m.language] || _[w] || _.en || Object.values(_)[0]), _) {
61
- const C = _.includes(" ") && !_.startsWith("'") && !_.startsWith('"') ? `"${_}"` : _;
62
- d.style.setProperty("--gentiq-font-family", C), d.style.fontFamily = C, window.document.body && (window.document.body.style.fontFamily = C);
61
+ const T = _.includes(" ") && !_.startsWith("'") && !_.startsWith('"') ? `"${_}"` : _;
62
+ d.style.setProperty("--gentiq-font-family", T), d.style.fontFamily = T, window.document.body && (window.document.body.style.fontFamily = T);
63
63
  }
64
64
  const y = u || (typeof o?.radius == "number" ? `${o.radius}px` : o?.radius);
65
65
  y !== void 0 && d.style.setProperty("--radius", y), p !== void 0 ? d.style.setProperty("--gentiq-primary", p) : d.style.removeProperty("--gentiq-primary"), window.document.documentElement.dir = m.dir();
@@ -349,29 +349,29 @@ function fl({
349
349
  }, []), d = W(
350
350
  (x) => {
351
351
  if (!b) return null;
352
- const T = {
352
+ const C = {
353
353
  ...x,
354
354
  id: x.id || `ref_${en(10)}`,
355
355
  label: Me(x.label || a("reference"), 90),
356
356
  excerpt: Me(x.excerpt, o)
357
357
  };
358
- return T.excerpt ? (c((O) => {
359
- const U = ft(T), q = O.filter((I) => ft(I) !== U);
360
- return [T, ...q].slice(0, n);
361
- }), T) : null;
358
+ return C.excerpt ? (c((O) => {
359
+ const U = ft(C), q = O.filter((I) => ft(I) !== U);
360
+ return [C, ...q].slice(0, n);
361
+ }), C) : null;
362
362
  },
363
363
  [b, o, n, a]
364
364
  ), w = W((x) => {
365
- c((T) => T.filter((O) => O.id !== x));
365
+ c((C) => C.filter((O) => O.id !== x));
366
366
  }, []), _ = W(() => {
367
367
  c([]);
368
368
  }, []), y = W((x) => {
369
369
  if (typeof document > "u") return !1;
370
- const T = Eo(x);
371
- if (!T) return !1;
372
- const O = typeof x.metadata?.textStart == "number" ? x.metadata.textStart : void 0, U = typeof x.metadata?.textEnd == "number" ? x.metadata.textEnd : void 0, q = x.kind === "text" ? O !== void 0 && U !== void 0 ? sn(T, O, U) : No(T, x.excerpt) : !1;
373
- return So(q || T), q || (T.classList.add("gentiq-reference-highlight"), m.current && window.clearTimeout(m.current), m.current = window.setTimeout(() => {
374
- T.classList.remove("gentiq-reference-highlight"), m.current = null;
370
+ const C = Eo(x);
371
+ if (!C) return !1;
372
+ const O = typeof x.metadata?.textStart == "number" ? x.metadata.textStart : void 0, U = typeof x.metadata?.textEnd == "number" ? x.metadata.textEnd : void 0, q = x.kind === "text" ? O !== void 0 && U !== void 0 ? sn(C, O, U) : No(C, x.excerpt) : !1;
373
+ return So(q || C), q || (C.classList.add("gentiq-reference-highlight"), m.current && window.clearTimeout(m.current), m.current = window.setTimeout(() => {
374
+ C.classList.remove("gentiq-reference-highlight"), m.current = null;
375
375
  }, 1800)), !0;
376
376
  }, []);
377
377
  V(() => {
@@ -417,12 +417,12 @@ function fl({
417
417
  }
418
418
  });
419
419
  }, 0);
420
- }, T = () => {
420
+ }, C = () => {
421
421
  const O = window.getSelection();
422
422
  (!O || O.isCollapsed) && u(null);
423
423
  };
424
- return document.addEventListener("mouseup", x), document.addEventListener("touchend", x), document.addEventListener("selectionchange", T), () => {
425
- document.removeEventListener("mouseup", x), document.removeEventListener("touchend", x), document.removeEventListener("selectionchange", T);
424
+ return document.addEventListener("mouseup", x), document.addEventListener("touchend", x), document.addEventListener("selectionchange", C), () => {
425
+ document.removeEventListener("mouseup", x), document.removeEventListener("touchend", x), document.removeEventListener("selectionchange", C);
426
426
  };
427
427
  }, [b, o]), V(
428
428
  () => () => {
@@ -430,7 +430,7 @@ function fl({
430
430
  },
431
431
  []
432
432
  );
433
- const C = de(
433
+ const T = de(
434
434
  () => ({
435
435
  references: l,
436
436
  addReference: d,
@@ -452,7 +452,7 @@ function fl({
452
452
  e
453
453
  ]
454
454
  );
455
- return /* @__PURE__ */ k(an.Provider, { value: C, children: [
455
+ return /* @__PURE__ */ k(an.Provider, { value: T, children: [
456
456
  r,
457
457
  s && typeof document < "u" && co(
458
458
  /* @__PURE__ */ i(
@@ -574,7 +574,7 @@ function fe(e) {
574
574
  allowCustom: t.allowCustom !== !1
575
575
  };
576
576
  }
577
- function Co(e) {
577
+ function To(e) {
578
578
  if (!e) return [];
579
579
  const t = [], n = (r) => {
580
580
  r && t.push({ type: "text", text: r });
@@ -597,7 +597,7 @@ function Co(e) {
597
597
  }
598
598
  return t;
599
599
  }
600
- function To({ part: e, disabled: t, onAnswer: n }) {
600
+ function Co({ part: e, disabled: t, onAnswer: n }) {
601
601
  const o = de(() => fe(e.data), [e.data]), [r, a] = P(""), [l, c] = P(null), [s, u] = P(!1);
602
602
  if (!o) return null;
603
603
  const g = t || s || l !== null || !n, m = async (p) => {
@@ -641,7 +641,7 @@ function To({ part: e, disabled: t, onAnswer: n }) {
641
641
  "flex size-5 shrink-0 items-center justify-center rounded-full border border-border/70 text-transparent transition",
642
642
  h && "border-primary bg-primary text-primary-foreground"
643
643
  ),
644
- children: /* @__PURE__ */ i(Le, { className: "size-3.5" })
644
+ children: /* @__PURE__ */ i(De, { className: "size-3.5" })
645
645
  }
646
646
  )
647
647
  ]
@@ -694,9 +694,9 @@ function Ao(e) {
694
694
  FilePart: w,
695
695
  ReferencePart: _,
696
696
  ChoiceQuestionPart: y,
697
- toolComponents: C,
697
+ toolComponents: T,
698
698
  referenceAdapters: x,
699
- threadActions: T
699
+ threadActions: C
700
700
  } = ge(), { feedback: O, handleFeedback: U, copy: q } = bo(n, c), I = (N) => {
701
701
  if (N.toolName) return N.toolName;
702
702
  if (typeof N.type == "string" && N.type.startsWith("tool-")) {
@@ -707,25 +707,25 @@ function Ao(e) {
707
707
  const S = N.output;
708
708
  if (typeof S == "string") return S;
709
709
  if (S && typeof S == "object") {
710
- const D = Object.values(S).filter((Q) => ["string", "number", "boolean"].includes(typeof Q)).slice(0, 3).map(String);
711
- if (D.length > 0) return D.join(" · ");
710
+ const L = Object.values(S).filter((Q) => ["string", "number", "boolean"].includes(typeof Q)).slice(0, 3).map(String);
711
+ if (L.length > 0) return L.join(" · ");
712
712
  }
713
- const L = N.input;
714
- if (L && typeof L == "object") {
715
- const D = Object.values(L).filter((Q) => ["string", "number", "boolean"].includes(typeof Q)).slice(0, 3).map(String);
716
- if (D.length > 0) return D.join(" · ");
713
+ const D = N.input;
714
+ if (D && typeof D == "object") {
715
+ const L = Object.values(D).filter((Q) => ["string", "number", "boolean"].includes(typeof Q)).slice(0, 3).map(String);
716
+ if (L.length > 0) return L.join(" · ");
717
717
  }
718
718
  return I(N) || "Tool result";
719
719
  }, Y = (N, S) => {
720
- const D = (S ? x?.[S] : void 0)?.({ part: t, message: n, toolName: S, chat: g }) || {};
720
+ const L = (S ? x?.[S] : void 0)?.({ part: t, message: n, toolName: S, chat: g }) || {};
721
721
  return {
722
722
  ...N,
723
- ...D,
724
- sourceId: D.sourceId || N.sourceId,
725
- messageId: D.messageId || N.messageId,
726
- partIndex: D.partIndex ?? N.partIndex,
727
- role: D.role || N.role,
728
- kind: D.kind || N.kind
723
+ ...L,
724
+ sourceId: L.sourceId || N.sourceId,
725
+ messageId: L.messageId || N.messageId,
726
+ partIndex: L.partIndex ?? N.partIndex,
727
+ role: L.role || N.role,
728
+ kind: L.kind || N.kind
729
729
  };
730
730
  };
731
731
  if (u) {
@@ -770,8 +770,8 @@ function Ao(e) {
770
770
  feedback: O,
771
771
  handleFeedback: U,
772
772
  copyHost: q,
773
- feedbackEnabled: m ? !1 : T?.feedback ?? !1,
774
- retryEnabled: m ? !1 : T?.retry ?? !1,
773
+ feedbackEnabled: m ? !1 : C?.feedback ?? !1,
774
+ retryEnabled: m ? !1 : C?.retry ?? !1,
775
775
  reference: {
776
776
  kind: "text",
777
777
  messageId: n.id,
@@ -783,13 +783,13 @@ function Ao(e) {
783
783
  }
784
784
  },
785
785
  ie
786
- ), S = j(t).text || "", L = Co(S);
787
- if (!L.some((G) => G.type === "choice-question"))
786
+ ), S = j(t).text || "", D = To(S);
787
+ if (!D.some((G) => G.type === "choice-question"))
788
788
  return N(S, "text");
789
789
  const Pe = n.parts.some(
790
790
  (G) => G.type === "data-choice-question"
791
- ) ? -1 : L.findIndex((G) => G.type === "choice-question");
792
- return /* @__PURE__ */ i(oe, { children: L.map((G, ie) => G.type === "text" ? N(G.text, `text-${ie}`) : ie !== Pe ? null : /* @__PURE__ */ i(
791
+ ) ? -1 : D.findIndex((G) => G.type === "choice-question");
792
+ return /* @__PURE__ */ i(oe, { children: D.map((G, ie) => G.type === "text" ? N(G.text, `text-${ie}`) : ie !== Pe ? null : /* @__PURE__ */ i(
793
793
  y,
794
794
  {
795
795
  part: {
@@ -838,7 +838,7 @@ function Ao(e) {
838
838
  part: t,
839
839
  message: n,
840
840
  chat: g,
841
- toolComponents: C,
841
+ toolComponents: T,
842
842
  showToolCalls: !!b
843
843
  }
844
844
  )
@@ -877,7 +877,7 @@ const ze = ({ className: e, ...t }) => /* @__PURE__ */ i("div", { className: v("
877
877
  },
878
878
  n
879
879
  )) }), Io = /[\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC]/;
880
- function De(e, t = "ltr") {
880
+ function Le(e, t = "ltr") {
881
881
  if (!e) return t;
882
882
  for (const n of e) {
883
883
  if (Io.test(n))
@@ -930,14 +930,14 @@ const Oo = ({ className: e, ...t }) => /* @__PURE__ */ i(
930
930
  role: "log",
931
931
  ...t
932
932
  }
933
- ), Lo = ({ className: e, ...t }) => /* @__PURE__ */ i(
933
+ ), Do = ({ className: e, ...t }) => /* @__PURE__ */ i(
934
934
  tn.Content,
935
935
  {
936
936
  className: v("p-4 pb-6 stick-to-bottom", e),
937
937
  scrollClassName: "custom-scrollbar",
938
938
  ...t
939
939
  }
940
- ), Do = ({ status: e }) => {
940
+ ), Lo = ({ status: e }) => {
941
941
  const { scrollToBottom: t } = nn(), n = Z(e);
942
942
  return V(() => {
943
943
  e === "submitted" && n.current !== "submitted" && t(), n.current = e;
@@ -1007,7 +1007,7 @@ const Po = ({ className: e, ...t }) => /* @__PURE__ */ i(lt, { className: v("not
1007
1007
  const p = j(b);
1008
1008
  return p.type === "text" && (p.text || "").trim().length > 0 || p.type === "tool-invocation" || p.type === "tool-call" || p.type === "data-choice-question";
1009
1009
  }) && o !== "running")) return null;
1010
- const u = o === "running", g = o === "error", m = De(r);
1010
+ const u = o === "running", g = o === "error", m = Le(r);
1011
1011
  return /* @__PURE__ */ i(
1012
1012
  "div",
1013
1013
  {
@@ -1024,7 +1024,7 @@ const Po = ({ className: e, ...t }) => /* @__PURE__ */ i(lt, { className: v("not
1024
1024
  ),
1025
1025
  dir: m,
1026
1026
  children: [
1027
- u ? /* @__PURE__ */ i("div", { className: "size-4 animate-spin rounded-full border-2 border-primary border-r-transparent shrink-0" }) : g ? /* @__PURE__ */ i(be, { className: "size-4 text-destructive shrink-0" }) : /* @__PURE__ */ i(Le, { className: "size-4 text-green-500 shrink-0" }),
1027
+ u ? /* @__PURE__ */ i("div", { className: "size-4 animate-spin rounded-full border-2 border-primary border-r-transparent shrink-0" }) : g ? /* @__PURE__ */ i(be, { className: "size-4 text-destructive shrink-0" }) : /* @__PURE__ */ i(De, { className: "size-4 text-green-500 shrink-0" }),
1028
1028
  /* @__PURE__ */ i("span", { className: v("font-medium", u && "animate-pulse"), children: r })
1029
1029
  ]
1030
1030
  }
@@ -1045,8 +1045,8 @@ function $o({
1045
1045
  }) {
1046
1046
  const { i18n: u, t: g } = z(["chat", "translation"]), m = u.language === "fa", b = e[e.length - 1], p = b?.role === "assistant" && (t === "ready" || b.parts.some((h) => h.type === "data-chat-finished"));
1047
1047
  return /* @__PURE__ */ k(Oo, { className: v("min-h-0 flex-1", c), children: [
1048
- /* @__PURE__ */ i(Do, { status: t }),
1049
- /* @__PURE__ */ k(Lo, { className: "max-w-4xl mx-auto w-full px-4 md:px-0 pb-32", dir: "ltr", children: [
1048
+ /* @__PURE__ */ i(Lo, { status: t }),
1049
+ /* @__PURE__ */ k(Do, { className: "max-w-4xl mx-auto w-full px-4 md:px-0 pb-32", dir: "ltr", children: [
1050
1050
  e.length === 0 && !n ? null : e.map((h) => /* @__PURE__ */ k(
1051
1051
  "div",
1052
1052
  {
@@ -1173,7 +1173,7 @@ const Ho = ({ className: e, ...t }) => /* @__PURE__ */ i("div", { className: "bg
1173
1173
  const s = c.currentTarget.form;
1174
1174
  s && s.requestSubmit();
1175
1175
  }
1176
- }, { i18n: a } = z(["chat"]), l = De(o.value, a.dir());
1176
+ }, { i18n: a } = z(["chat"]), l = Le(o.value, a.dir());
1177
1177
  return /* @__PURE__ */ i(
1178
1178
  Bo,
1179
1179
  {
@@ -1368,39 +1368,39 @@ function er({
1368
1368
  newChat: l,
1369
1369
  className: c
1370
1370
  }) {
1371
- const { t: s } = z(["chat", "translation"]), { composer: u } = ge(), { typingMessages: g } = hn({ enabled: !!l }), m = Jo(l ? g : []), b = !!l && g.length > 0, p = u?.placeholder ? s(u.placeholder) : s("input_placeholder"), h = b ? m : p, [d, w] = P(""), [_, y] = P([]), C = Xo(), {
1371
+ const { t: s } = z(["chat", "translation"]), { composer: u } = ge(), { typingMessages: g } = hn({ enabled: !!l }), m = Jo(l ? g : []), b = !!l && g.length > 0, p = u?.placeholder ? s(u.placeholder) : s("input_placeholder"), h = b ? m : p, [d, w] = P(""), [_, y] = P([]), T = Xo(), {
1372
1372
  references: x,
1373
- removeReference: T,
1373
+ removeReference: C,
1374
1374
  clearReferences: O,
1375
1375
  focusReference: U,
1376
1376
  enabled: q
1377
1377
  } = it(), I = Z(null), me = Z(null);
1378
1378
  V(() => {
1379
- !C && a === "/" && I.current && I.current.focus();
1380
- }, [a, C]);
1379
+ !T && a === "/" && I.current && I.current.focus();
1380
+ }, [a, T]);
1381
1381
  const Y = Z(x.length);
1382
1382
  V(() => {
1383
- x.length > Y.current && !C && I.current?.focus(), Y.current = x.length;
1384
- }, [x.length, C]);
1383
+ x.length > Y.current && !T && I.current?.focus(), Y.current = x.length;
1384
+ }, [x.length, T]);
1385
1385
  const Se = W(
1386
1386
  (S) => {
1387
1387
  if (S.target.files) {
1388
- const L = Array.from(S.target.files), D = u?.attachments?.maxSize;
1389
- if (D && L.filter((Pe) => Pe.size > D).length > 0) {
1390
- so.error(s("file_too_large", { size: D }));
1388
+ const D = Array.from(S.target.files), L = u?.attachments?.maxSize;
1389
+ if (L && D.filter((Pe) => Pe.size > L).length > 0) {
1390
+ so.error(s("file_too_large", { size: L }));
1391
1391
  return;
1392
1392
  }
1393
- y((Q) => [...Q, ...L]);
1393
+ y((Q) => [...Q, ...D]);
1394
1394
  }
1395
1395
  S.target.value = "";
1396
1396
  },
1397
1397
  [u, s]
1398
1398
  ), X = W((S) => {
1399
- y((L) => L.filter((D, Q) => Q !== S));
1399
+ y((D) => D.filter((L, Q) => Q !== S));
1400
1400
  }, []), ee = t === "streaming" && !n, N = (S) => {
1401
1401
  if (S.preventDefault(), !ee && (d.trim() || _.length > 0 || x.length > 0)) {
1402
- const L = new DataTransfer();
1403
- _.forEach((D) => L.items.add(D)), e(d, L.files, x), w(""), y([]), O();
1402
+ const D = new DataTransfer();
1403
+ _.forEach((L) => D.items.add(L)), e(d, D.files, x), w(""), y([]), O();
1404
1404
  }
1405
1405
  };
1406
1406
  return /* @__PURE__ */ i("div", { className: v("shrink-0 px-4 pb-5 pt-2 md:px-6 md:pb-6 w-full", c), children: /* @__PURE__ */ i("div", { className: "max-w-[50rem] mx-auto w-full", children: /* @__PURE__ */ k(Ho, { onSubmit: N, children: [
@@ -1438,8 +1438,8 @@ function er({
1438
1438
  "button",
1439
1439
  {
1440
1440
  type: "button",
1441
- onClick: (L) => {
1442
- L.stopPropagation(), T(S.id);
1441
+ onClick: (D) => {
1442
+ D.stopPropagation(), C(S.id);
1443
1443
  },
1444
1444
  className: "ml-0.5 flex size-4 shrink-0 items-center justify-center rounded-full text-muted-foreground/60 transition hover:bg-destructive/15 hover:text-destructive",
1445
1445
  "aria-label": `${s("remove_reference")}: ${S.excerpt}`,
@@ -1451,7 +1451,7 @@ function er({
1451
1451
  },
1452
1452
  S.id
1453
1453
  )) }),
1454
- _.length > 0 && /* @__PURE__ */ i("div", { className: "flex flex-wrap gap-2 px-2 pt-2", children: _.map((S, L) => /* @__PURE__ */ k(
1454
+ _.length > 0 && /* @__PURE__ */ i("div", { className: "flex flex-wrap gap-2 px-2 pt-2", children: _.map((S, D) => /* @__PURE__ */ k(
1455
1455
  "div",
1456
1456
  {
1457
1457
  className: "group relative flex items-center gap-2 rounded-xl glass-surface px-2.5 py-1.5 text-sm shadow-sm",
@@ -1469,7 +1469,7 @@ function er({
1469
1469
  "button",
1470
1470
  {
1471
1471
  type: "button",
1472
- onClick: () => X(L),
1472
+ onClick: () => X(D),
1473
1473
  className: "ml-0.5 flex items-center justify-center size-4 rounded-full hover:bg-destructive/15 text-muted-foreground/60 hover:text-destructive transition-all duration-150",
1474
1474
  "aria-label": `${s("remove_file")}: ${S.name}`,
1475
1475
  children: /* @__PURE__ */ i(be, { className: "size-2.5" })
@@ -1477,7 +1477,7 @@ function er({
1477
1477
  )
1478
1478
  ]
1479
1479
  },
1480
- `${S.name}-${L}`
1480
+ `${S.name}-${D}`
1481
1481
  )) }),
1482
1482
  /* @__PURE__ */ i(
1483
1483
  jo,
@@ -1485,7 +1485,7 @@ function er({
1485
1485
  ref: I,
1486
1486
  onChange: (S) => w(S.target.value),
1487
1487
  value: d,
1488
- autoFocus: !C,
1488
+ autoFocus: !T,
1489
1489
  placeholder: h,
1490
1490
  "aria-label": s("input_placeholder"),
1491
1491
  "aria-busy": ee
@@ -2975,7 +2975,7 @@ function wr(e, t) {
2975
2975
  e
2976
2976
  );
2977
2977
  case 9:
2978
- return Ct(
2978
+ return Tt(
2979
2979
  /** @type {Document} */
2980
2980
  e,
2981
2981
  t
@@ -2983,7 +2983,7 @@ function wr(e, t) {
2983
2983
  case 10:
2984
2984
  return xr();
2985
2985
  case 11:
2986
- return Ct(
2986
+ return Tt(
2987
2987
  /** @type {DocumentFragment} */
2988
2988
  e,
2989
2989
  t
@@ -2992,7 +2992,7 @@ function wr(e, t) {
2992
2992
  return;
2993
2993
  }
2994
2994
  }
2995
- function Ct(e, t) {
2995
+ function Tt(e, t) {
2996
2996
  return { type: "root", children: En(e, t) };
2997
2997
  }
2998
2998
  function xr() {
@@ -3024,14 +3024,14 @@ function En(e, t) {
3024
3024
  return o;
3025
3025
  }
3026
3026
  new DOMParser();
3027
- function Cr(e, t) {
3028
- const n = Tr(e);
3027
+ function Tr(e, t) {
3028
+ const n = Cr(e);
3029
3029
  return (
3030
3030
  /** @type {Root} */
3031
3031
  kr(n)
3032
3032
  );
3033
3033
  }
3034
- function Tr(e) {
3034
+ function Cr(e) {
3035
3035
  const t = document.createElement("template");
3036
3036
  return t.innerHTML = e, t.content;
3037
3037
  }
@@ -3109,7 +3109,7 @@ function Rr(e) {
3109
3109
  function Fe(e) {
3110
3110
  return t;
3111
3111
  function t(n, o, r) {
3112
- return !!(Lr(n) && e.call(
3112
+ return !!(Dr(n) && e.call(
3113
3113
  this,
3114
3114
  n,
3115
3115
  typeof o == "number" ? o : void 0,
@@ -3120,10 +3120,10 @@ function Fe(e) {
3120
3120
  function Or() {
3121
3121
  return !0;
3122
3122
  }
3123
- function Lr(e) {
3123
+ function Dr(e) {
3124
3124
  return e !== null && typeof e == "object" && "type" in e;
3125
3125
  }
3126
- const Tt = (
3126
+ const Ct = (
3127
3127
  // Note: overloads like this are needed to support optional generics.
3128
3128
  /**
3129
3129
  * @type {(
@@ -3170,13 +3170,13 @@ const Tt = (
3170
3170
  if (typeof e == "string")
3171
3171
  return Fr(e);
3172
3172
  if (typeof e == "object")
3173
- return Dr(e);
3173
+ return Lr(e);
3174
3174
  if (typeof e == "function")
3175
3175
  return pt(e);
3176
3176
  throw new Error("Expected function, string, or array as `test`");
3177
3177
  })
3178
3178
  );
3179
- function Dr(e) {
3179
+ function Lr(e) {
3180
3180
  const t = [];
3181
3181
  let n = -1;
3182
3182
  for (; ++n < e.length; )
@@ -3316,7 +3316,7 @@ function qr(e, t) {
3316
3316
  whitespace: n.whitespace || "normal"
3317
3317
  }), l = [];
3318
3318
  (e.type === "text" || e.type === "comment") && l.push(
3319
- ...Tn(e, {
3319
+ ...Cn(e, {
3320
3320
  breakBefore: !0,
3321
3321
  breakAfter: !0
3322
3322
  })
@@ -3324,7 +3324,7 @@ function qr(e, t) {
3324
3324
  let c = -1;
3325
3325
  for (; ++c < o.length; )
3326
3326
  l.push(
3327
- ...Cn(
3327
+ ...Tn(
3328
3328
  o[c],
3329
3329
  // @ts-expect-error: `tree` is a parent if we’re here.
3330
3330
  e,
@@ -3344,8 +3344,8 @@ function qr(e, t) {
3344
3344
  }
3345
3345
  return s.join("");
3346
3346
  }
3347
- function Cn(e, t, n) {
3348
- return e.type === "element" ? $r(e, t, n) : e.type === "text" ? n.whitespace === "normal" ? Tn(e, n) : Br(e) : [];
3347
+ function Tn(e, t, n) {
3348
+ return e.type === "element" ? $r(e, t, n) : e.type === "text" ? n.whitespace === "normal" ? Cn(e, n) : Br(e) : [];
3349
3349
  }
3350
3350
  function $r(e, t, n) {
3351
3351
  const o = An(e, n), r = e.children || [];
@@ -3354,19 +3354,19 @@ function $r(e, t, n) {
3354
3354
  return l;
3355
3355
  let c, s;
3356
3356
  for (tt(e) || Ot(e) && // @ts-expect-error: something up with types of parents.
3357
- Tt(t, e, Ot) ? s = `
3357
+ Ct(t, e, Ot) ? s = `
3358
3358
  ` : zr(e) ? (c = 2, s = 2) : Nn(e) && (c = 1, s = 1); ++a < r.length; )
3359
3359
  l = l.concat(
3360
- Cn(r[a], e, {
3360
+ Tn(r[a], e, {
3361
3361
  whitespace: o,
3362
3362
  breakBefore: a ? void 0 : c,
3363
3363
  breakAfter: a < r.length - 1 ? tt(r[a + 1]) : s
3364
3364
  })
3365
3365
  );
3366
3366
  return Rt(e) && // @ts-expect-error: something up with types of parents.
3367
- Tt(t, e, Rt) && l.push(" "), c && l.unshift(c), s && l.push(s), l;
3367
+ Ct(t, e, Rt) && l.push(" "), c && l.unshift(c), s && l.push(s), l;
3368
3368
  }
3369
- function Tn(e, t) {
3369
+ function Cn(e, t) {
3370
3370
  const n = String(e.value), o = [], r = [];
3371
3371
  let a = 0;
3372
3372
  for (; a <= n.length; ) {
@@ -3433,7 +3433,7 @@ function Gr(e) {
3433
3433
  function Wr(e) {
3434
3434
  return e.tagName === "dialog" && !(e.properties || {}).open;
3435
3435
  }
3436
- const In = [], Vr = !0, Lt = !1, Rn = "skip";
3436
+ const In = [], Vr = !0, Dt = !1, Rn = "skip";
3437
3437
  function Yr(e, t, n, o) {
3438
3438
  let r;
3439
3439
  r = t;
@@ -3459,7 +3459,7 @@ function Yr(e, t, n, o) {
3459
3459
  return b;
3460
3460
  function b() {
3461
3461
  let p = In, h, d, w;
3462
- if (a(s, u, g[g.length - 1] || void 0) && (p = Xr(n(s, g)), p[0] === Lt))
3462
+ if (a(s, u, g[g.length - 1] || void 0) && (p = Xr(n(s, g)), p[0] === Dt))
3463
3463
  return p;
3464
3464
  if ("children" in s && s.children) {
3465
3465
  const _ = (
@@ -3469,7 +3469,7 @@ function Yr(e, t, n, o) {
3469
3469
  if (_.children && p[0] !== Rn)
3470
3470
  for (d = -1 + l, w = g.concat(_); d > -1 && d < _.children.length; ) {
3471
3471
  const y = _.children[d];
3472
- if (h = c(y, d, w)(), h[0] === Lt)
3472
+ if (h = c(y, d, w)(), h[0] === Dt)
3473
3473
  return h;
3474
3474
  d = typeof h[1] == "number" ? h[1] : d + l;
3475
3475
  }
@@ -3535,7 +3535,7 @@ function Zr(e) {
3535
3535
  }
3536
3536
  }
3537
3537
  typeof h == "string" && (h = /** @type {Array<ElementContent>} */
3538
- Cr(h).children);
3538
+ Tr(h).children);
3539
3539
  const d = m.children.indexOf(b);
3540
3540
  return m.children.splice(d, 1, ...h), Rn;
3541
3541
  });
@@ -3689,18 +3689,18 @@ function ta(e) {
3689
3689
  function ne(e) {
3690
3690
  return e !== null && e < -2;
3691
3691
  }
3692
- function Dt(e) {
3692
+ function Lt(e) {
3693
3693
  return e === -2 || e === -1 || e === 32;
3694
3694
  }
3695
- function Ce(e, t, n, o) {
3695
+ function Te(e, t, n, o) {
3696
3696
  const r = o ? o - 1 : Number.POSITIVE_INFINITY;
3697
3697
  let a = 0;
3698
3698
  return l;
3699
3699
  function l(s) {
3700
- return Dt(s) ? (e.enter(n), c(s)) : t(s);
3700
+ return Lt(s) ? (e.enter(n), c(s)) : t(s);
3701
3701
  }
3702
3702
  function c(s) {
3703
- return Dt(s) && a++ < r ? (e.consume(s), c) : (e.exit(n), t(s));
3703
+ return Lt(s) && a++ < r ? (e.consume(s), c) : (e.exit(n), t(s));
3704
3704
  }
3705
3705
  }
3706
3706
  const na = {
@@ -3719,7 +3719,7 @@ function oa(e, t, n) {
3719
3719
  return e.enter("mathFlow"), e.enter("mathFlowFence"), e.enter("mathFlowFenceSequence"), s(y);
3720
3720
  }
3721
3721
  function s(y) {
3722
- return y === 36 ? (e.consume(y), l++, s) : l < 2 ? n(y) : (e.exit("mathFlowFenceSequence"), Ce(e, u, "whitespace")(y));
3722
+ return y === 36 ? (e.consume(y), l++, s) : l < 2 ? n(y) : (e.exit("mathFlowFenceSequence"), Te(e, u, "whitespace")(y));
3723
3723
  }
3724
3724
  function u(y) {
3725
3725
  return y === null || ne(y) ? m(y) : (e.enter("mathFlowFenceMeta"), e.enter("chunkString", {
@@ -3739,7 +3739,7 @@ function oa(e, t, n) {
3739
3739
  }, w, p)(y);
3740
3740
  }
3741
3741
  function p(y) {
3742
- return (a ? Ce(e, h, "linePrefix", a + 1) : h)(y);
3742
+ return (a ? Te(e, h, "linePrefix", a + 1) : h)(y);
3743
3743
  }
3744
3744
  function h(y) {
3745
3745
  return y === null ? w(y) : ne(y) ? e.attempt(Ft, b, w)(y) : (e.enter("mathFlowValue"), d(y));
@@ -3750,17 +3750,17 @@ function oa(e, t, n) {
3750
3750
  function w(y) {
3751
3751
  return e.exit("mathFlow"), t(y);
3752
3752
  }
3753
- function _(y, C, x) {
3754
- let T = 0;
3755
- return Ce(y, O, "linePrefix", o.parser.constructs.disable.null.includes("codeIndented") ? void 0 : 4);
3753
+ function _(y, T, x) {
3754
+ let C = 0;
3755
+ return Te(y, O, "linePrefix", o.parser.constructs.disable.null.includes("codeIndented") ? void 0 : 4);
3756
3756
  function O(I) {
3757
3757
  return y.enter("mathFlowFence"), y.enter("mathFlowFenceSequence"), U(I);
3758
3758
  }
3759
3759
  function U(I) {
3760
- return I === 36 ? (T++, y.consume(I), U) : T < l ? x(I) : (y.exit("mathFlowFenceSequence"), Ce(y, q, "whitespace")(I));
3760
+ return I === 36 ? (C++, y.consume(I), U) : C < l ? x(I) : (y.exit("mathFlowFenceSequence"), Te(y, q, "whitespace")(I));
3761
3761
  }
3762
3762
  function q(I) {
3763
- return I === null || ne(I) ? (y.exit("mathFlowFence"), C(I)) : x(I);
3763
+ return I === null || ne(I) ? (y.exit("mathFlowFence"), T(I)) : x(I);
3764
3764
  }
3765
3765
  }
3766
3766
  }
@@ -3872,7 +3872,7 @@ function pa({
3872
3872
  retryEnabled: m,
3873
3873
  reference: b
3874
3874
  }) {
3875
- const { t: p } = z(["chat"]), { textComponents: h, remarkPlugins: d, rehypePlugins: w } = ge(), _ = De(e.text), y = !o && r && (n === "streaming" || n === "submitted"), C = l || (() => {
3875
+ const { t: p } = z(["chat"]), { textComponents: h, remarkPlugins: d, rehypePlugins: w } = ge(), _ = Le(e.text), y = !o && r && (n === "streaming" || n === "submitted"), T = l || (() => {
3876
3876
  });
3877
3877
  return /* @__PURE__ */ k("div", { className: "group py-2 first:pt-4 animate-in-bubble", children: [
3878
3878
  /* @__PURE__ */ i(gn, { from: t.role, children: /* @__PURE__ */ i(mn, { dir: _, children: b ? /* @__PURE__ */ i(Qe, { showAction: !1, reference: b, children: /* @__PURE__ */ i(
@@ -3899,7 +3899,7 @@ function pa({
3899
3899
  r && m && /* @__PURE__ */ i(
3900
3900
  Ne,
3901
3901
  {
3902
- onClick: () => C(t.id),
3902
+ onClick: () => T(t.id),
3903
3903
  label: p("retry"),
3904
3904
  tooltip: p("retry"),
3905
3905
  children: /* @__PURE__ */ i(Kn, { className: "size-3" })
@@ -3947,7 +3947,7 @@ const On = pe(null), ha = () => {
3947
3947
  if (!e)
3948
3948
  throw new Error("Reasoning components must be used within Reasoning");
3949
3949
  return e;
3950
- }, ga = 1e3, ma = 1e3, Ln = Re(
3950
+ }, ga = 1e3, ma = 1e3, Dn = Re(
3951
3951
  ({
3952
3952
  className: e,
3953
3953
  isStreaming: t = !1,
@@ -3993,7 +3993,7 @@ const On = pe(null), ha = () => {
3993
3993
  }
3994
3994
  ) });
3995
3995
  }
3996
- ), Dn = Re(({ className: e, children: t, ...n }) => {
3996
+ ), Ln = Re(({ className: e, children: t, ...n }) => {
3997
3997
  const { isStreaming: o, isOpen: r, duration: a } = ha();
3998
3998
  return /* @__PURE__ */ i(
3999
3999
  st,
@@ -4032,8 +4032,8 @@ const On = pe(null), ha = () => {
4032
4032
  children: /* @__PURE__ */ i(Ie, { className: "grid gap-2", children: t })
4033
4033
  }
4034
4034
  ));
4035
- Ln.displayName = "Reasoning";
4036
- Dn.displayName = "ReasoningTrigger";
4035
+ Dn.displayName = "Reasoning";
4036
+ Ln.displayName = "ReasoningTrigger";
4037
4037
  Fn.displayName = "ReasoningContent";
4038
4038
  function fa({
4039
4039
  part: e,
@@ -4042,14 +4042,14 @@ function fa({
4042
4042
  partsCount: o,
4043
4043
  lastMessage: r
4044
4044
  }) {
4045
- const a = De(e.text);
4045
+ const a = Le(e.text);
4046
4046
  return /* @__PURE__ */ k(
4047
- Ln,
4047
+ Dn,
4048
4048
  {
4049
4049
  className: "w-full animate-in-bubble",
4050
4050
  isStreaming: t === "streaming" && n === o - 1 && r,
4051
4051
  children: [
4052
- /* @__PURE__ */ i(Dn, {}),
4052
+ /* @__PURE__ */ i(Ln, {}),
4053
4053
  /* @__PURE__ */ i(Fn, { dir: a, children: e.text })
4054
4054
  ]
4055
4055
  }
@@ -4679,7 +4679,7 @@ const Na = {
4679
4679
  ".prism-previewer-easing.prism-previewer-easing line": {
4680
4680
  stroke: "hsl(220, 14%, 71%)"
4681
4681
  }
4682
- }, Ca = {
4682
+ }, Ta = {
4683
4683
  'code[class*="language-"]': {
4684
4684
  background: "hsl(230, 1%, 98%)",
4685
4685
  color: "hsl(230, 8%, 24%)",
@@ -5172,7 +5172,7 @@ function te(e) {
5172
5172
  return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
5173
5173
  }
5174
5174
  var Be, Mt;
5175
- function Ta() {
5175
+ function Ca() {
5176
5176
  if (Mt) return Be;
5177
5177
  Mt = 1, Be = e, e.displayName = "python", e.aliases = ["py"];
5178
5178
  function e(t) {
@@ -5240,7 +5240,7 @@ function Ta() {
5240
5240
  }
5241
5241
  return Be;
5242
5242
  }
5243
- var Aa = Ta();
5243
+ var Aa = Ca();
5244
5244
  const Ia = /* @__PURE__ */ te(Aa);
5245
5245
  var He, zt;
5246
5246
  function Ra() {
@@ -5373,9 +5373,9 @@ function Ra() {
5373
5373
  return He;
5374
5374
  }
5375
5375
  var Oa = Ra();
5376
- const La = /* @__PURE__ */ te(Oa);
5376
+ const Da = /* @__PURE__ */ te(Oa);
5377
5377
  var je, Ut;
5378
- function Da() {
5378
+ function La() {
5379
5379
  if (Ut) return je;
5380
5380
  Ut = 1, je = e, e.displayName = "typescript", e.aliases = ["ts"];
5381
5381
  function e(t) {
@@ -5427,7 +5427,7 @@ function Da() {
5427
5427
  }
5428
5428
  return je;
5429
5429
  }
5430
- var Fa = Da();
5430
+ var Fa = La();
5431
5431
  const Pa = /* @__PURE__ */ te(Fa);
5432
5432
  var Ge, qt;
5433
5433
  function Ma() {
@@ -6087,12 +6087,12 @@ function Xa() {
6087
6087
  p(_.content);
6088
6088
  continue;
6089
6089
  }
6090
- var y = _.content[1], C = _.content[3];
6091
- if (y && C && y.type === "code-language" && C.type === "code-block" && typeof y.content == "string") {
6090
+ var y = _.content[1], T = _.content[3];
6091
+ if (y && T && y.type === "code-language" && T.type === "code-block" && typeof y.content == "string") {
6092
6092
  var x = y.content.replace(/\b#/g, "sharp").replace(/\b\+\+/g, "pp");
6093
6093
  x = (/[a-z][\w-]*/i.exec(x) || [""])[0].toLowerCase();
6094
- var T = "language-" + x;
6095
- C.alias ? typeof C.alias == "string" ? C.alias = [C.alias, T] : C.alias.push(T) : C.alias = [T];
6094
+ var C = "language-" + x;
6095
+ T.alias ? typeof T.alias == "string" ? T.alias = [T.alias, C] : T.alias.push(C) : T.alias = [C];
6096
6096
  }
6097
6097
  }
6098
6098
  }
@@ -6114,9 +6114,9 @@ function Xa() {
6114
6114
  p
6115
6115
  );
6116
6116
  else if (p && p !== "none" && n.plugins.autoloader) {
6117
- var C = "md-" + (/* @__PURE__ */ new Date()).valueOf() + "-" + Math.floor(Math.random() * 1e16);
6118
- b.attributes.id = C, n.plugins.autoloader.loadLanguages(p, function() {
6119
- var x = document.getElementById(C);
6117
+ var T = "md-" + (/* @__PURE__ */ new Date()).valueOf() + "-" + Math.floor(Math.random() * 1e16);
6118
+ b.attributes.id = T, n.plugins.autoloader.loadLanguages(p, function() {
6119
+ var x = document.getElementById(T);
6120
6120
  x && (x.innerHTML = n.highlight(
6121
6121
  x.textContent,
6122
6122
  n.languages[p],
@@ -6152,7 +6152,7 @@ function Xa() {
6152
6152
  var Ka = Xa();
6153
6153
  const Qa = /* @__PURE__ */ te(Ka);
6154
6154
  K.registerLanguage("python", Ia);
6155
- K.registerLanguage("javascript", La);
6155
+ K.registerLanguage("javascript", Da);
6156
6156
  K.registerLanguage("typescript", Pa);
6157
6157
  K.registerLanguage("json", Ua);
6158
6158
  K.registerLanguage("bash", Ba);
@@ -6199,7 +6199,7 @@ const Za = pe({
6199
6199
  minWidth: "2.5rem"
6200
6200
  },
6201
6201
  showLineNumbers: n,
6202
- style: Ca,
6202
+ style: Ta,
6203
6203
  children: e
6204
6204
  }
6205
6205
  ),
@@ -6235,7 +6235,7 @@ const Za = pe({
6235
6235
  function Ja(e, t = "size-4") {
6236
6236
  return {
6237
6237
  web_search: /* @__PURE__ */ i(oo, { className: t }),
6238
- web_fetch: /* @__PURE__ */ i(Te, { className: t }),
6238
+ web_fetch: /* @__PURE__ */ i(Ce, { className: t }),
6239
6239
  code_execution: /* @__PURE__ */ i(no, { className: t }),
6240
6240
  image_generation: /* @__PURE__ */ i(to, { className: t })
6241
6241
  }[e] ?? /* @__PURE__ */ i(eo, { className: t });
@@ -6394,7 +6394,7 @@ function li({ part: e, message: t }) {
6394
6394
  onClick: l,
6395
6395
  className: "p-1.5 bg-white/20 hover:bg-white/30 backdrop-blur-md rounded-full text-white transition-all hover:scale-110 active:scale-95",
6396
6396
  title: n("download", "Download"),
6397
- children: /* @__PURE__ */ i(Te, { className: "size-4" })
6397
+ children: /* @__PURE__ */ i(Ce, { className: "size-4" })
6398
6398
  }
6399
6399
  )
6400
6400
  ] }),
@@ -6403,7 +6403,7 @@ function li({ part: e, message: t }) {
6403
6403
  {
6404
6404
  onClick: l,
6405
6405
  className: "p-1.5 bg-black/40 backdrop-blur-md rounded-full text-white",
6406
- children: /* @__PURE__ */ i(Te, { className: "size-4" })
6406
+ children: /* @__PURE__ */ i(Ce, { className: "size-4" })
6407
6407
  }
6408
6408
  ) })
6409
6409
  ] }) : /* @__PURE__ */ i("div", { className: "flex flex-col gap-1.5", children: /* @__PURE__ */ k("div", { className: "group inline-flex items-center gap-3 rounded-xl p-3 text-sm transition-all duration-300 bg-secondary/10 border border-border/5 hover:border-primary/30 hover:bg-secondary/20 hover:shadow-[0_0_15px_var(--glow)]", children: [
@@ -6418,7 +6418,7 @@ function li({ part: e, message: t }) {
6418
6418
  onClick: l,
6419
6419
  className: "ml-auto p-2 hover:bg-primary hover:text-primary-foreground rounded-lg text-muted-foreground transition-all active:scale-90",
6420
6420
  title: n("download", "Download"),
6421
- children: /* @__PURE__ */ i(Te, { className: "size-4" })
6421
+ children: /* @__PURE__ */ i(Ce, { className: "size-4" })
6422
6422
  }
6423
6423
  )
6424
6424
  ] }) }) }) }) });
@@ -6455,7 +6455,7 @@ const R = {
6455
6455
  ToolPart: ii,
6456
6456
  FilePart: li,
6457
6457
  ReferencePart: si,
6458
- ChoiceQuestionPart: To,
6458
+ ChoiceQuestionPart: Co,
6459
6459
  toolComponents: void 0,
6460
6460
  referenceAdapters: void 0,
6461
6461
  textComponents: void 0,
@@ -6864,18 +6864,18 @@ class qn {
6864
6864
  }
6865
6865
  }
6866
6866
  qn.type = "languageDetector";
6867
- const Si = { new_conversation: "New conversation", tooltip_new_conversation: "Start a new conversation", delete_conversation: "Delete", delete_confirm_title: "Delete conversation?", delete_confirm_description: "Are you sure you want to delete this chat? This action cannot be undone.", cancel: "Cancel", delete: "Delete", chat_deleted_success: "Chat deleted successfully", logout: "Logout", new_chat: "New Chat", rename_conversation: "Rename", rename_success: "Conversation renamed successfully", rename_failed: "Failed to rename conversation", search_conversations: "Search conversations...", save: "Save", no_conversations: "No conversations yet", loading_more: "Loading more...", pinned_success: "Conversation pinned", unpinned_success: "Conversation unpinned", pin_failed: "Failed to pin conversation", share_success: "Link copied", share_description: "The shareable link has been copied to your clipboard.", share_failed: "Failed to generate share link", pin_conversation: "Pin", unpin_conversation: "Unpin", share_conversation: "Share" }, Ei = { tools: "Tools", error: "Error:", input_placeholder: "Ask something...", insufficient_balance: "Insufficient balance. Please recharge your account to continue.", regenerate: "Regenerate", retry: "Retry", copy: "Copy", like: "Like", dislike: "Dislike", attach_file: "Attach file", remove_file: "Remove file", reference: "Reference", reference_selection: "Reference selection", remove_reference: "Remove reference", referenced_context: "Referenced context", source_unavailable: "Source unavailable", tool_reference: "Tool reference", card_reference: "Card reference", used_sources: "Used {{count}} sources", welcome: { title: "Hello! How can I help you today?", subtitle: "Ask me anything and I'll do my best to help.", suggestions: ["What can you help me with?", "Tell me something interesting", "Help me write an email", "Explain a concept to me"] }, disclaimer: "AI can make mistakes. Check important info." }, Ni = { pending: "Pending", running: "Running", completed: "Completed", error: "Error", parameters: "Parameters", result: "Result", view_error: "View Error", tool_error: "Tool Error", copied: "Copied!", copy_error: "Copy Error" }, Ci = { login_tab: "Login", signup_tab: "Sign Up", phone: "Phone", phone_placeholder: "Phone number", password: "Password", name: "Name", name_placeholder: "First Name", surname: "Surname", surname_placeholder: "Last Name", loading: "Loading...", logging_in: "Logging in...", signing_up: "Signing up...", auth_page_disabled_title: "The sign-in page is currently disabled.", auth_page_disabled_description: "Please contact the administrator for access.", select_placeholder: "Select an option", login_button: "Login", signup_button: "Sign Up" }, Ti = { toggle: "Change theme", light: "Switch to light theme", dark: "Switch to dark theme", system: "Switch to system theme" }, Ai = /* @__PURE__ */ JSON.parse(`{"select_placeholder":"Select an option","loading":"Loading...","retry":"Retry","save":"Save","saving":"Saving...","cancel":"Cancel","delete":"Delete","edit":"Edit","search":"Search","search_placeholder":"Search...","no_data":"No data available","loading_more":"Loading more...","confirm_delete":"Are you sure you want to delete?","error_loading":"Error loading data","close":"Close","jobs":{"section_title":"Maintenance Jobs","no_jobs":"No jobs are registered for this deployment.","run":"Run","run_dry":"Dry run","run_started":"Started \\"{{name}}\\"","run_failed":"Failed to start job","history":"Run history","history_help":"Recent runs. Click a row to see its inputs and output.","view_history":"View run history","inputs":"Inputs","no_runs":"No runs yet.","dry_run":"Dry run","dry_run_help":"Simulate the job without writing any changes.","confirm_destructive":"This is a destructive job. Type \\"{{name}}\\" to confirm.","output":"Output","no_output":"(no output)","output_truncated":"...[output truncated]","result":"Result","cancel_run":"Cancel run","triggered_by":"Triggered by {{user}}","triggered_by_api":"Triggered via API key","danger":{"safe":"safe","caution":"caution","destructive":"destructive"},"status":{"queued":"Queued","processing":"Running","completed":"Completed","failed":"Failed","cancelled":"Cancelled"},"raw":{"title":"Run raw Python","warning":"This executes arbitrary Python on the server with full process privileges. There is no sandbox — only access control and an audit log. Use only when you know exactly what you are doing.","confirm_label":"Type \\"{{phrase}}\\" to enable running.","run":"Execute"}},"dashboard":{"title":"Admin Panel","logout":"Logout","tabs":{"analytics":"Analytics","chat_history":"Chats","users":"Users","admins":"Admins","settings":"Settings"}},"app_settings":{"title":"System Settings","subtitle":"Manage global configuration for application appearance and behavior.","sections":{"general":"Basic Information","chat":"Chat Experience","user_billing":"User & Billing"},"general":{"app_name":"App Name","admin_title":"Admin Panel Title","language":"Default Language","language_help":"The language users see on their first visit (if not auto-detected).","appearance":"Default Appearance","appearance_help":"These values apply when a user has not saved their own appearance preferences.","default_theme":"Default Theme","default_accent":"Default Accent Color","default_accent_help":"Enter any browser-supported CSS color, such as #3b82f6, rgb(59 130 246), or oklch(0.623 0.214 259.815).","default_accent_invalid":"Enter a valid browser-supported CSS color.","default_accent_preview":"Accent color preview"},"chat":{"welcome_greeting":"Welcome Greeting","welcome_subtitle":"Welcome Subtitle","disclaimer":"Disclaimer Text","show_tool_details":"Show technical tool details","show_tool_details_help":"Enable this to show professional technical details of AI tools to users.","show_settings":"Show settings icon for users","show_settings_help":"Show a settings gear icon in the chat interface for user customization.","show_version_in_settings":"Show app version in user settings","show_version_in_settings_help":"Show the app version at the bottom of the user settings dialog. This does not affect the admin settings page.","disable_signup":"Disable signup","disable_signup_help":"Hide the signup tab so users can only log in.","disable_auth_page":"Disable login/signup page","disable_auth_page_help":"Hide the entire auth page and prevent users from reaching login or signup forms.","composer_attachments":"Enable File Attachments","composer_attachments_help":"Allow users to upload and attach files to their messages.","thread_actions_feedback":"Enable Feedback Buttons","thread_actions_feedback_help":"Show like/dislike buttons on AI responses.","thread_actions_retry":"Enable Retry Button","thread_actions_retry_help":"Show a retry button to regenerate the last AI response.","history_enabled":"Enable Chat History Sidebar","history_enabled_help":"Show the sidebar containing previous conversations.","history_show_delete":"Allow Deleting Conversations","history_show_rename":"Allow Renaming Conversations","history_show_share":"Allow Sharing Conversations","history_show_pin":"Allow Pinning Conversations","sections_modes":"Settings Tab Modes","sections_modes_help":"Control visibility and interactability of settings tabs for users.","mode_editable":"Enable (Editable)","mode_faded":"Fade (Readonly)","mode_hidden":"Hide (Disable)","general_tab":"General Tab","profile_tab":"Profile Tab","account_tab":"Account Tab","inner_fields_modes":"Inner Fields Visibility","inner_fields_modes_help":"Configure visibility for individual fields within each tab."},"user_billing":{"initial_balance_tokens":"Default Initial Tokens","initial_balance_requests":"Default Initial Requests","initial_balance_help":"These values will be assigned to new users by default if not specified during creation."},"save_success":"Settings saved successfully","save_error":"Failed to save settings","save":"Save Changes","translations_management":"Translations Management","editor_tips":"All changes are saved automatically to local state. Don't forget to push 'Save Changes' to persist.","sync_from_code":"Sync from Code","reset_button":"Reset to Defaults","reset_confirm_title":"Reset Settings?","reset_confirm_description":"This will reset all fields to their original default values from the code. Current unsaved changes will be lost.","preview":"Preview","tips_label":"TIPS"},"analytics":{"title":"Analytics & Statistics","days":"{{count}} Days","time_range_label":"Last","days_unit":"days","total_users":"Total Users","total_threads":"Total Threads","total_messages":"Total Messages","total_token_usage":"Total Token Usage","usage_cost":"Usage & Cost","input":"Input","output":"Output","cost":"Cost","threads_chart":"Threads","messages_chart":"Messages","token_usage_chart":"Token Usage","cost_chart":"Cost Per Day","active_users":"Active Users","conversations":"conversations","threads":"threads","feedback":"User Feedback","total_feedback":"Total Feedback","positive":"Positive","negative":"Negative","loading_analytics":"Loading analytics...","error_loading":"Error loading data","source_human":"Users","source_service":"Service","source_all":"All","source_caption_human":"Showing real users only","source_caption_service":"Showing service traffic only","source_caption_all":"Showing all traffic"},"chat_history":{"title":"Chat History Management","search_placeholder":"Search by name, phone, thread title, or ID...","search_button":"Search","threads_list":"Threads List","thread_count":"{{count}}","no_thread_title":"Untitled conversation","messages":"Messages","messages_for":"Messages for: {{title}}","select_thread":"Select a conversation to view","no_threads":"No conversations found","empty_thread":"This conversation is empty","loading_threads":"Loading...","loading_messages":"Loading messages...","user_label":"User","assistant_label":"AI Assistant","subagent_label":"Subagent","input_tokens":"Input: {{value}}","output_tokens":"Output: {{value}}","total_tokens":"Total: {{value}}","cost":"Cost: {{value}}","unpriced":"Unpriced","all_feedbacks":"All Conversations","liked_feedbacks":"Liked 👍","disliked_feedbacks":"Disliked 👎","any_feedback":"With Feedback","output_available":"Output Available","running":"Running...","unnamed_file":"Unnamed File","download_file":"Download File","source_human":"Users","source_service":"Service","source_all":"All sources","external_user_id":"Service ref"},"users":{"title":"User Management","user_count":"User count: {{count}}","add_user":"Add New User","edit_user":"Edit User","phone":"Phone Number","phone_placeholder":"09123456789","name":"Name","surname":"Surname","initial_tokens":"Initial Tokens (optional)","initial_requests":"Initial Requests (optional)","balance":"Balance","requests_label":"Requests","tokens_label":"Tokens","token_limit":"Token Limit","request_limit":"Request Limit","tokens_usage":"Tokens Usage","requests_usage":"Requests Usage","actions":"Actions","copy_token":"Copy Token (auto-refresh)","token_copied":"Token copied successfully","no_token":"No token found for this user","recharge":"Recharge Balance","full_charge":"Full Charge","update_balance":"Update Balance","update_balance_for":"Update Balance for","token_count":"Token Count","request_count":"Request Count","updating":"Updating...","no_users":"No users found.","sort_ascending":"Sort ascending","sort_descending":"Sort descending","confirm_delete_user":"Are you sure you want to delete this user?","tokens_exceed_limit":"Tokens cannot exceed the specified limit","requests_exceed_limit":"Requests cannot exceed the specified limit","metadata":"Metadata (JSON)","initial_balance":"Initial Balance","custom_fields":"Additional Fields","metadata_raw":"Metadata (Raw JSON)","advanced_usage":"Advanced usage","invalid_json":"Invalid JSON format","auto_recharge":"Automatic Balance Renewal","auto_recharge_help":"Restore this user's balance to its limits on a recurring schedule.","enabled":"Enabled","recharge_interval":"Every","recharge_unit":"Interval Unit","recharge_unit_minute":"Minute(s)","recharge_unit_hour":"Hour(s)","recharge_unit_day":"Day(s)","recharge_unit_week":"Week(s)","recharge_unit_month":"Month(s)","recharge_schedule_help":"New schedules begin when saved. Existing schedules keep their current cycle anchor.","next_recharge":"Next renewal","last_recharge":"Last automatic renewal","not_available":"Not available","recharge_interval_invalid":"The renewal interval must be a positive whole number","recharge_policy_not_saved":"The backend did not save the renewal policy. Restart or update the backend to the version that supports automatic renewal.","usage_summary":"Usage Summary","input_tokens":"Input Tokens","output_tokens":"Output Tokens","total_tokens":"Total Tokens","requests_made":"Requests Made","total_cost":"Total Cost","renewals":"Balance Renewals","unpriced_requests":"Unpriced Requests","bulk_balance":"Bulk Balance","bulk_balance_help":"Apply a balance change to all matching users using search, explicit IDs, and metadata filters.","bulk_operation":"Operation","bulk_operation_add":"Add to balance","bulk_operation_set":"Set exact balance","bulk_operation_full_charge":"Fill to limits","bulk_use_current_search":"Use current search text","bulk_user_ids":"User IDs (optional)","bulk_metadata_filters":"Metadata Filters (JSON)","bulk_available_metadata":"Available metadata keys","bulk_preview_empty":"Affected users will be checked before applying.","bulk_preview_count":"{{count}} users match","apply_bulk_balance":"Apply Change","bulk_balance_confirm":"Apply this balance change to {{count}} users?","matching_users":"matching","bulk_apply_balance":"Update balances","bulk_apply_renewal":"Update renewal policy","bulk_select_change":"Select at least one bulk change to apply.","bulk_renewal_policy":"Renewal Policy","bulk_renewal_policy_help":"Enable or disable automatic renewal for every matched user.","bulk_renewal_anchor":"First renewal time (optional)","source_human":"Users","source_service":"Service","source_all":"All","account_type":"Account type","account_type_human":"Human user","account_type_service":"Service (external API)","account_type_service_help":"External API consumer. Phone is optional; share this account’s token with the integrating service.","service_name":"Service name","service_name_placeholder":"e.g. Acme CRM integration","optional":"optional"},"admins":{"title":"Admin Management","admin_count":"Admin count: {{count}}","add_admin":"Add New Admin","edit_admin":"Edit Admin","username":"Username","name":"Name","password":"Password","password_edit":"New Password (leave empty to keep current)","permissions":"Permissions","perm_chat_history":"Chat History","perm_admin_management":"Admin Management","perm_user_management":"User Management","perm_analytics":"Analytics","perm_settings":"Settings","no_admins":"No admins found.","confirm_delete_admin":"Are you sure you want to delete this admin?"},"errors":{"access_denied_title":"Access Denied","access_denied_message":"You don't have the necessary permissions to access this page. You can contact the administrator!","back_to_dashboard":"Back to Dashboard"},"login":{"title":"Admin Panel","setup_title":"Initial Setup","setup_description":"No admin account exists yet. Set a password for the default admin user to get started.","set_password":"Set Password","set_password_placeholder":"Choose a strong password","confirm_password":"Confirm Password","confirm_password_placeholder":"Re-enter the password","passwords_mismatch":"Passwords do not match","password_too_short":"Password must be at least 4 characters","create_admin":"Create Admin & Login","setting_up":"Setting up...","username":"Username","username_placeholder":"Username","password":"Password","password_placeholder":"••••••••","submit":"Login","logging_in":"Logging in...","error":"Login failed","copyright":"© 2026 AI Chatbot Platform"}}`), Ii = { title: "Settings", sections: { profile: "Profile", general: "General", account: "Account" }, profile: { title: "Profile Information", subtitle: "Update your personal details below.", name: "First Name", surname: "Last Name", phone: "Phone Number", password: "New Password", password_placeholder: "Leave empty to keep current", save: "Save Changes", saving: "Saving...", success: "Profile updated successfully", error: "Failed to update profile", select_placeholder: "Select an option" }, general: { title: "General Settings", subtitle: "Configure look and feel and language.", theme: "Theme", language: "Language", themes: { light: "Light", dark: "Dark", system: "System" }, accent: "Accent Color", radius: "Rounded Corners", radius_levels: { sharp: "Sharp", round: "Round" }, languages: { en: "English", fa: "Persian" } }, account: { title: "Account & Usage", subtitle: "Monitor your quotas and manage your session.", balance: "Current Balance", tokens: "Tokens", requests: "Requests", logout: "Logout", logout_confirm: "Are you sure you want to logout?", last_recharge: "Last balance update on" } }, Ri = { unauthorized: "Authentication required. Please login again.", invalid_credentials: "Invalid phone number or password.", phone_required: "Phone number is required.", password_required: "Password is required.", name_surname_required: "Name and surname are required.", phone_already_exists: "This phone number is already registered.", invalid_token: "Your session has expired. Please login again.", user_not_found: "User not found.", insufficient_balance: "Insufficient balance. Please recharge your account.", insufficient_balance_recharge: "You've reached your balance quota. It will be reset on {{datetime, datetime}}.", insufficient_balance_no_recharge: "You've run out of balance. Please contact support to recharge your account.", me_update_failed: "Failed to update profile information.", thread_not_found: "Conversation not found.", access_denied: "You do not have permission to perform this action.", feedback_save_failed: "Failed to save feedback.", thread_update_failed: "Failed to update conversation.", thread_delete_failed: "Failed to delete conversation.", attachment_not_found: "Attachment not found.", thread_share_failed: "Failed to share conversation.", model_quota_reached_error: "The system cannot respond at this time. Please try again later.", admin_already_exists: "Admin with this username already exists.", admin_not_found: "Admin not found.", cannot_delete_self: "You cannot delete your own admin account.", admin_update_failed: "Failed to update admin information.", internal_error: "An internal server error occurred. Please try again later.", validation_error: "Invalid data provided. Please check your input.", not_found: "The requested resource was not found." }, Oi = {
6867
+ const Si = { new_conversation: "New conversation", tooltip_new_conversation: "Start a new conversation", delete_conversation: "Delete", delete_confirm_title: "Delete conversation?", delete_confirm_description: "Are you sure you want to delete this chat? This action cannot be undone.", cancel: "Cancel", delete: "Delete", chat_deleted_success: "Chat deleted successfully", logout: "Logout", new_chat: "New Chat", rename_conversation: "Rename", rename_success: "Conversation renamed successfully", rename_failed: "Failed to rename conversation", search_conversations: "Search conversations...", save: "Save", no_conversations: "No conversations yet", loading_more: "Loading more...", pinned_success: "Conversation pinned", unpinned_success: "Conversation unpinned", pin_failed: "Failed to pin conversation", share_success: "Link copied", share_description: "The shareable link has been copied to your clipboard.", share_failed: "Failed to generate share link", pin_conversation: "Pin", unpin_conversation: "Unpin", share_conversation: "Share" }, Ei = { tools: "Tools", error: "Error:", input_placeholder: "Ask something...", insufficient_balance: "Insufficient balance. Please recharge your account to continue.", regenerate: "Regenerate", retry: "Retry", copy: "Copy", like: "Like", dislike: "Dislike", attach_file: "Attach file", remove_file: "Remove file", reference: "Reference", reference_selection: "Reference selection", remove_reference: "Remove reference", referenced_context: "Referenced context", source_unavailable: "Source unavailable", tool_reference: "Tool reference", card_reference: "Card reference", used_sources: "Used {{count}} sources", welcome: { title: "Hello! How can I help you today?", subtitle: "Ask me anything and I'll do my best to help.", suggestions: ["What can you help me with?", "Tell me something interesting", "Help me write an email", "Explain a concept to me"] }, disclaimer: "AI can make mistakes. Check important info." }, Ni = { pending: "Pending", running: "Running", completed: "Completed", error: "Error", parameters: "Parameters", result: "Result", view_error: "View Error", tool_error: "Tool Error", copied: "Copied!", copy_error: "Copy Error" }, Ti = { login_tab: "Login", signup_tab: "Sign Up", phone: "Phone", phone_placeholder: "Phone number", password: "Password", name: "Name", name_placeholder: "First Name", surname: "Surname", surname_placeholder: "Last Name", loading: "Loading...", logging_in: "Logging in...", signing_up: "Signing up...", auth_page_disabled_title: "The sign-in page is currently disabled.", auth_page_disabled_description: "Please contact the administrator for access.", select_placeholder: "Select an option", login_button: "Login", signup_button: "Sign Up", username: "Username", username_placeholder: "Username", email: "Email", email_placeholder: "you@example.com" }, Ci = { toggle: "Change theme", light: "Switch to light theme", dark: "Switch to dark theme", system: "Switch to system theme" }, Ai = /* @__PURE__ */ JSON.parse(`{"select_placeholder":"Select an option","loading":"Loading...","retry":"Retry","save":"Save","saving":"Saving...","cancel":"Cancel","delete":"Delete","edit":"Edit","search":"Search","search_placeholder":"Search...","no_data":"No data available","loading_more":"Loading more...","confirm_delete":"Are you sure you want to delete?","error_loading":"Error loading data","close":"Close","jobs":{"section_title":"Maintenance Jobs","no_jobs":"No jobs are registered for this deployment.","run":"Run","run_dry":"Dry run","run_started":"Started \\"{{name}}\\"","run_failed":"Failed to start job","history":"Run history","history_help":"Recent runs. Click a row to see its inputs and output.","view_history":"View run history","inputs":"Inputs","no_runs":"No runs yet.","dry_run":"Dry run","dry_run_help":"Simulate the job without writing any changes.","confirm_destructive":"This is a destructive job. Type \\"{{name}}\\" to confirm.","output":"Output","no_output":"(no output)","output_truncated":"...[output truncated]","result":"Result","cancel_run":"Cancel run","triggered_by":"Triggered by {{user}}","triggered_by_api":"Triggered via API key","danger":{"safe":"safe","caution":"caution","destructive":"destructive"},"status":{"queued":"Queued","processing":"Running","completed":"Completed","failed":"Failed","cancelled":"Cancelled"},"raw":{"title":"Run raw Python","warning":"This executes arbitrary Python on the server with full process privileges. There is no sandbox — only access control and an audit log. Use only when you know exactly what you are doing.","confirm_label":"Type \\"{{phrase}}\\" to enable running.","run":"Execute"}},"dashboard":{"title":"Admin Panel","logout":"Logout","tabs":{"analytics":"Analytics","chat_history":"Chats","users":"Users","admins":"Admins","settings":"Settings"}},"app_settings":{"title":"System Settings","subtitle":"Manage global configuration for application appearance and behavior.","sections":{"general":"Basic Information","chat":"Chat Experience","user_billing":"User & Billing"},"general":{"app_name":"App Name","admin_title":"Admin Panel Title","language":"Default Language","language_help":"The language users see on their first visit (if not auto-detected).","appearance":"Default Appearance","appearance_help":"These values apply when a user has not saved their own appearance preferences.","default_theme":"Default Theme","default_accent":"Default Accent Color","default_accent_help":"Enter any browser-supported CSS color, such as #3b82f6, rgb(59 130 246), or oklch(0.623 0.214 259.815).","default_accent_invalid":"Enter a valid browser-supported CSS color.","default_accent_preview":"Accent color preview"},"chat":{"welcome_greeting":"Welcome Greeting","welcome_subtitle":"Welcome Subtitle","disclaimer":"Disclaimer Text","show_tool_details":"Show technical tool details","show_tool_details_help":"Enable this to show professional technical details of AI tools to users.","show_settings":"Show settings icon for users","show_settings_help":"Show a settings gear icon in the chat interface for user customization.","show_version_in_settings":"Show app version in user settings","show_version_in_settings_help":"Show the app version at the bottom of the user settings dialog. This does not affect the admin settings page.","disable_signup":"Disable signup","disable_signup_help":"Hide the signup tab so users can only log in.","disable_auth_page":"Disable login/signup page","disable_auth_page_help":"Hide the entire auth page and prevent users from reaching login or signup forms.","composer_attachments":"Enable File Attachments","composer_attachments_help":"Allow users to upload and attach files to their messages.","thread_actions_feedback":"Enable Feedback Buttons","thread_actions_feedback_help":"Show like/dislike buttons on AI responses.","thread_actions_retry":"Enable Retry Button","thread_actions_retry_help":"Show a retry button to regenerate the last AI response.","history_enabled":"Enable Chat History Sidebar","history_enabled_help":"Show the sidebar containing previous conversations.","history_show_delete":"Allow Deleting Conversations","history_show_rename":"Allow Renaming Conversations","history_show_share":"Allow Sharing Conversations","history_show_pin":"Allow Pinning Conversations","sections_modes":"Settings Tab Modes","sections_modes_help":"Control visibility and interactability of settings tabs for users.","mode_editable":"Enable (Editable)","mode_faded":"Fade (Readonly)","mode_hidden":"Hide (Disable)","general_tab":"General Tab","profile_tab":"Profile Tab","account_tab":"Account Tab","inner_fields_modes":"Inner Fields Visibility","inner_fields_modes_help":"Configure visibility for individual fields within each tab."},"user_billing":{"initial_balance_tokens":"Default Initial Tokens","initial_balance_requests":"Default Initial Requests","initial_balance_help":"These values will be assigned to new users by default if not specified during creation."},"save_success":"Settings saved successfully","save_error":"Failed to save settings","save":"Save Changes","translations_management":"Translations Management","editor_tips":"All changes are saved automatically to local state. Don't forget to push 'Save Changes' to persist.","sync_from_code":"Sync from Code","reset_button":"Reset to Defaults","reset_confirm_title":"Reset Settings?","reset_confirm_description":"This will reset all fields to their original default values from the code. Current unsaved changes will be lost.","preview":"Preview","tips_label":"TIPS"},"analytics":{"title":"Analytics & Statistics","days":"{{count}} Days","time_range_label":"Last","days_unit":"days","total_users":"Total Users","total_threads":"Total Threads","total_messages":"Total Messages","total_token_usage":"Total Token Usage","usage_cost":"Usage & Cost","input":"Input","output":"Output","cost":"Cost","threads_chart":"Threads","messages_chart":"Messages","token_usage_chart":"Token Usage","cost_chart":"Cost Per Day","active_users":"Active Users","conversations":"conversations","threads":"threads","feedback":"User Feedback","total_feedback":"Total Feedback","positive":"Positive","negative":"Negative","loading_analytics":"Loading analytics...","error_loading":"Error loading data","source_human":"Users","source_service":"Service","source_all":"All","source_caption_human":"Showing real users only","source_caption_service":"Showing service traffic only","source_caption_all":"Showing all traffic"},"chat_history":{"title":"Chat History Management","search_placeholder":"Search by name, phone, thread title, or ID...","search_button":"Search","threads_list":"Threads List","thread_count":"{{count}}","no_thread_title":"Untitled conversation","messages":"Messages","messages_for":"Messages for: {{title}}","select_thread":"Select a conversation to view","no_threads":"No conversations found","empty_thread":"This conversation is empty","loading_threads":"Loading...","loading_messages":"Loading messages...","user_label":"User","assistant_label":"AI Assistant","subagent_label":"Subagent","input_tokens":"Input: {{value}}","output_tokens":"Output: {{value}}","total_tokens":"Total: {{value}}","cost":"Cost: {{value}}","unpriced":"Unpriced","all_feedbacks":"All Conversations","liked_feedbacks":"Liked 👍","disliked_feedbacks":"Disliked 👎","any_feedback":"With Feedback","output_available":"Output Available","running":"Running...","unnamed_file":"Unnamed File","download_file":"Download File","source_human":"Users","source_service":"Service","source_all":"All sources","external_user_id":"Service ref"},"users":{"title":"User Management","user_count":"User count: {{count}}","add_user":"Add New User","edit_user":"Edit User","phone":"Phone Number","phone_placeholder":"09123456789","name":"Name","surname":"Surname","initial_tokens":"Initial Tokens (optional)","initial_requests":"Initial Requests (optional)","balance":"Balance","requests_label":"Requests","tokens_label":"Tokens","token_limit":"Token Limit","request_limit":"Request Limit","tokens_usage":"Tokens Usage","requests_usage":"Requests Usage","actions":"Actions","copy_token":"Copy Token (auto-refresh)","token_copied":"Token copied successfully","no_token":"No token found for this user","recharge":"Recharge Balance","full_charge":"Full Charge","update_balance":"Update Balance","update_balance_for":"Update Balance for","token_count":"Token Count","request_count":"Request Count","updating":"Updating...","no_users":"No users found.","sort_ascending":"Sort ascending","sort_descending":"Sort descending","confirm_delete_user":"Are you sure you want to delete this user?","tokens_exceed_limit":"Tokens cannot exceed the specified limit","requests_exceed_limit":"Requests cannot exceed the specified limit","metadata":"Metadata (JSON)","initial_balance":"Initial Balance","custom_fields":"Additional Fields","metadata_raw":"Metadata (Raw JSON)","advanced_usage":"Advanced usage","invalid_json":"Invalid JSON format","auto_recharge":"Automatic Balance Renewal","auto_recharge_help":"Restore this user's balance to its limits on a recurring schedule.","enabled":"Enabled","recharge_interval":"Every","recharge_unit":"Interval Unit","recharge_unit_minute":"Minute(s)","recharge_unit_hour":"Hour(s)","recharge_unit_day":"Day(s)","recharge_unit_week":"Week(s)","recharge_unit_month":"Month(s)","recharge_schedule_help":"New schedules begin when saved. Existing schedules keep their current cycle anchor.","next_recharge":"Next renewal","last_recharge":"Last automatic renewal","not_available":"Not available","recharge_interval_invalid":"The renewal interval must be a positive whole number","recharge_policy_not_saved":"The backend did not save the renewal policy. Restart or update the backend to the version that supports automatic renewal.","usage_summary":"Usage Summary","input_tokens":"Input Tokens","output_tokens":"Output Tokens","total_tokens":"Total Tokens","requests_made":"Requests Made","total_cost":"Total Cost","renewals":"Balance Renewals","unpriced_requests":"Unpriced Requests","bulk_balance":"Bulk Balance","bulk_balance_help":"Apply a balance change to all matching users using search, explicit IDs, and metadata filters.","bulk_operation":"Operation","bulk_operation_add":"Add to balance","bulk_operation_set":"Set exact balance","bulk_operation_full_charge":"Fill to limits","bulk_use_current_search":"Use current search text","bulk_user_ids":"User IDs (optional)","bulk_metadata_filters":"Metadata Filters (JSON)","bulk_available_metadata":"Available metadata keys","bulk_preview_empty":"Affected users will be checked before applying.","bulk_preview_count":"{{count}} users match","apply_bulk_balance":"Apply Change","bulk_balance_confirm":"Apply this balance change to {{count}} users?","matching_users":"matching","bulk_apply_balance":"Update balances","bulk_apply_renewal":"Update renewal policy","bulk_select_change":"Select at least one bulk change to apply.","bulk_renewal_policy":"Renewal Policy","bulk_renewal_policy_help":"Enable or disable automatic renewal for every matched user.","bulk_renewal_anchor":"First renewal time (optional)","source_human":"Users","source_service":"Service","source_all":"All","account_type":"Account type","account_type_human":"Human user","account_type_service":"Service (external API)","account_type_service_help":"External API consumer. Phone is optional; share this account’s token with the integrating service.","service_name":"Service name","service_name_placeholder":"e.g. Acme CRM integration","optional":"optional","username":"Username","username_placeholder":"username","email":"Email","email_placeholder":"you@example.com"},"admins":{"title":"Admin Management","admin_count":"Admin count: {{count}}","add_admin":"Add New Admin","edit_admin":"Edit Admin","username":"Username","name":"Name","password":"Password","password_edit":"New Password (leave empty to keep current)","permissions":"Permissions","perm_chat_history":"Chat History","perm_admin_management":"Admin Management","perm_user_management":"User Management","perm_analytics":"Analytics","perm_settings":"Settings","no_admins":"No admins found.","confirm_delete_admin":"Are you sure you want to delete this admin?"},"errors":{"access_denied_title":"Access Denied","access_denied_message":"You don't have the necessary permissions to access this page. You can contact the administrator!","back_to_dashboard":"Back to Dashboard"},"login":{"title":"Admin Panel","setup_title":"Initial Setup","setup_description":"No admin account exists yet. Set a password for the default admin user to get started.","set_password":"Set Password","set_password_placeholder":"Choose a strong password","confirm_password":"Confirm Password","confirm_password_placeholder":"Re-enter the password","passwords_mismatch":"Passwords do not match","password_too_short":"Password must be at least 4 characters","create_admin":"Create Admin & Login","setting_up":"Setting up...","username":"Username","username_placeholder":"Username","password":"Password","password_placeholder":"••••••••","submit":"Login","logging_in":"Logging in...","error":"Login failed","copyright":"© 2026 AI Chatbot Platform"}}`), Ii = { title: "Settings", sections: { profile: "Profile", general: "General", account: "Account" }, profile: { title: "Profile Information", subtitle: "Update your personal details below.", name: "First Name", surname: "Last Name", username: "Username", email: "Email", phone: "Phone Number", password: "New Password", password_placeholder: "Leave empty to keep current", save: "Save Changes", saving: "Saving...", success: "Profile updated successfully", error: "Failed to update profile", select_placeholder: "Select an option" }, general: { title: "General Settings", subtitle: "Configure look and feel and language.", theme: "Theme", language: "Language", themes: { light: "Light", dark: "Dark", system: "System" }, accent: "Accent Color", radius: "Rounded Corners", radius_levels: { sharp: "Sharp", round: "Round" }, languages: { en: "English", fa: "Persian" } }, account: { title: "Account & Usage", subtitle: "Monitor your quotas and manage your session.", balance: "Current Balance", tokens: "Tokens", requests: "Requests", logout: "Logout", logout_confirm: "Are you sure you want to logout?", last_recharge: "Last balance update on" } }, Ri = { unauthorized: "Authentication required. Please login again.", invalid_credentials: "Invalid phone number or password.", phone_required: "Phone number is required.", password_required: "Password is required.", name_surname_required: "Name and surname are required.", phone_already_exists: "This phone number is already registered.", invalid_token: "Your session has expired. Please login again.", user_not_found: "User not found.", insufficient_balance: "Insufficient balance. Please recharge your account.", insufficient_balance_recharge: "You've reached your balance quota. It will be reset on {{datetime, datetime}}.", insufficient_balance_no_recharge: "You've run out of balance. Please contact support to recharge your account.", me_update_failed: "Failed to update profile information.", thread_not_found: "Conversation not found.", access_denied: "You do not have permission to perform this action.", feedback_save_failed: "Failed to save feedback.", thread_update_failed: "Failed to update conversation.", thread_delete_failed: "Failed to delete conversation.", attachment_not_found: "Attachment not found.", thread_share_failed: "Failed to share conversation.", model_quota_reached_error: "The system cannot respond at this time. Please try again later.", admin_already_exists: "Admin with this username already exists.", admin_not_found: "Admin not found.", cannot_delete_self: "You cannot delete your own admin account.", admin_update_failed: "Failed to update admin information.", internal_error: "An internal server error occurred. Please try again later.", validation_error: "Invalid data provided. Please check your input.", not_found: "The requested resource was not found.", identity_required: "This field is required.", identity_already_exists: "This value is already registered." }, Oi = {
6868
6868
  sidebar: Si,
6869
6869
  chat: Ei,
6870
6870
  tools_ui: Ni,
6871
- login: Ci,
6872
- theme: Ti,
6871
+ login: Ti,
6872
+ theme: Ci,
6873
6873
  admin: Ai,
6874
6874
  settings: Ii,
6875
6875
  errors: Ri
6876
- }, Li = { new_conversation: "گفتگوی جدید", tooltip_new_conversation: "شروع یک گفتگوی جدید", delete_conversation: "حذف", delete_confirm_title: "حذف گفتگو؟", delete_confirm_description: "آیا از حذف این گفتگو اطمینان دارید؟ این عمل قابل بازگشت نیست.", cancel: "انصراف", delete: "حذف", chat_deleted_success: "گفتگو با موفقیت حذف شد", logout: "خروج", new_chat: "گفتگوی جدید", rename_conversation: "تغییر نام", rename_success: "نام گفتگو با موفقیت تغییر کرد", rename_failed: "خطا در تغییر نام گفتگو", search_conversations: "جستجوی گفتگوها...", save: "ذخیره", no_conversations: "هنوز گفتگویی ندارید", loading_more: "در حال بارگذاری...", pinned_success: "گفتگو پین شد", unpinned_success: "گفتگو از حالت پین خارج شد", pin_failed: "خطا در پین کردن گفتگو", share_success: "لینک کپی شد", share_description: "لینک اشتراک‌گذاری در حافظه موقت کپی شد.", share_failed: "خطا در ایجاد لینک اشتراک‌گذاری", pin_conversation: "پین", unpin_conversation: "برداشتن پین", share_conversation: "اشتراک‌گذاری" }, Di = { tools: "ابزارها", error: "خطا:", input_placeholder: "سوالتو اینجا بپرس...", insufficient_balance: "موجودی حساب شما کافی نیست. لطفا برای ادامه، حساب خود را شارژ کنید.", regenerate: "تولید مجدد", retry: "تلاش مجدد", copy: "کپی", like: "پسندیدم", dislike: "نپسندیدم", attach_file: "پیوست فایل", remove_file: "حذف فایل", reference: "ارجاع", reference_selection: "ارجاع به بخش انتخاب‌شده", remove_reference: "حذف ارجاع", referenced_context: "بخش ارجاع‌شده", source_unavailable: "منبع در دسترس نیست", tool_reference: "ارجاع به ابزار", card_reference: "ارجاع به کارت", used_sources: "از {{count}} منبع استفاده شد", welcome: { title: "سلام! چطور می‌تونم کمکت کنم؟", subtitle: "هر سوالی داری بپرس، تمام تلاشمو می‌کنم کمکت کنم.", suggestions: ["چه کارهایی می‌تونی انجام بدی؟", "یه چیز جالب بهم بگو", "کمکم کن یه ایمیل بنویسم", "یه مفهوم رو برام توضیح بده"] }, disclaimer: "هوش مصنوعی ممکن است اشتباه کند. اطلاعات مهم را بررسی کنید." }, Fi = { pending: "در انتظار", running: "در حال اجرا", completed: "تکمیل شده", error: "خطا", parameters: "پارامترها", result: "نتیجه", view_error: "نمایش خطا", tool_error: "خطای ابزار", copied: "کپی شد!", copy_error: "کپی خطا" }, Pi = { login_tab: "ورود", signup_tab: "ثبت نام", phone: "شماره تلفن", phone_placeholder: "شماره تلفن", password: "رمز عبور", name: "نام", name_placeholder: "نام", surname: "نام خانوادگی", surname_placeholder: "نام خانوادگی", logging_in: "در حال ورود...", signing_up: "در حال ثبت نام...", auth_page_disabled_title: "صفحه ورود غیرفعال شده است.", auth_page_disabled_description: "برای دسترسی با مدیر سامانه تماس بگیرید.", select_placeholder: "انتخاب کنید", login_button: "ورود", signup_button: "ثبت نام" }, Mi = { toggle: "تغییر تم", light: "تغییر به تم روشن", dark: "تغییر به تم تاریک", system: "تغییر به تم سیستم" }, zi = /* @__PURE__ */ JSON.parse('{"select_placeholder":"انتخاب کنید","loading":"در حال بارگذاری...","retry":"تلاش مجدد","save":"ذخیره","saving":"در حال ذخیره...","cancel":"انصراف","delete":"حذف","edit":"ویرایش","search":"جستجو","search_placeholder":"جستجو...","no_data":"داده‌ای موجود نیست","loading_more":"در حال بارگذاری بیشتر...","confirm_delete":"آیا از حذف اطمینان دارید؟","error_loading":"خطا در بارگذاری داده‌ها","close":"بستن","jobs":{"section_title":"کارهای سیستمی","no_jobs":"هیچ کاری برای این برنامه تعریف نشده است.","run":"اجرا","run_dry":"اجرای آزمایشی","run_started":"کار «{{name}}» اجرا شد","run_failed":"اجرای کار با خطا مواجه شد","history":"تاریخچهٔ اجراها","history_help":"اجراهای اخیر. برای دیدن ورودی‌ها و خروجی هر اجرا روی آن کلیک کنید.","view_history":"مشاهدهٔ تاریخچهٔ اجراها","inputs":"ورودی‌ها","no_runs":"هنوز هیچ کاری اجرا نشده است.","dry_run":"اجرای آزمایشی","dry_run_help":"کار را بدون اعمال هیچ تغییری شبیه‌سازی می‌کند.","confirm_destructive":"این یک کار مخرب است. برای تأیید، نام «{{name}}» را وارد کنید.","output":"خروجی","no_output":"(خروجی‌ای ثبت نشد)","output_truncated":"...[خروجی کوتاه شد]","result":"نتیجه","cancel_run":"لغو اجرا","triggered_by":"اجرا شده توسط {{user}}","triggered_by_api":"اجرا شده با کلید API","danger":{"safe":"بی‌خطر","caution":"نیازمند احتیاط","destructive":"مخرب"},"status":{"queued":"در صف","processing":"در حال اجرا","completed":"انجام شد","failed":"ناموفق","cancelled":"لغو شد"},"raw":{"title":"اجرای کد پایتون","warning":"این بخش کد پایتون دلخواه را با دسترسی کامل روی سرور اجرا می‌کند. هیچ ایزوله‌سازی‌ای در کار نیست؛ تنها محافظت، کنترل دسترسی و ثبت در گزارش است. فقط زمانی استفاده کنید که از کاری که انجام می‌دهید کاملاً مطمئن هستید.","confirm_label":"برای فعال شدن دکمهٔ اجرا، عبارت «{{phrase}}» را وارد کنید.","run":"اجرای کد"}},"dashboard":{"title":"پنل ادمین","logout":"خروج","tabs":{"analytics":"تحلیل و آمار","chat_history":"گفتگوها","users":"کاربران","admins":"ادمین‌ها","settings":"تنظیمات"}},"app_settings":{"title":"تنظیمات سامانه","subtitle":"پیکربندی کلی ظاهر و رفتار سامانه را مدیریت کنید.","sections":{"general":"اطلاعات پایه","chat":"تنظیمات گفتگو","user_billing":"کاربری و مالی"},"general":{"app_name":"نام سامانه","admin_title":"عنوان پنل ادمین","language":"زبان پیش‌فرض","language_help":"زبانی که کاربر در اولین ورود مشاهده می‌کند (در صورت عدم تشخیص خودکار).","appearance":"ظاهر پیش‌فرض","appearance_help":"این مقادیر زمانی اعمال می‌شوند که کاربر تنظیمات ظاهری خود را ذخیره نکرده باشد.","default_theme":"پوسته پیش‌فرض","default_accent":"رنگ اصلی پیش‌فرض","default_accent_help":"هر رنگ CSS پشتیبانی‌شده توسط مرورگر را وارد کنید؛ مانند #3b82f6 یا rgb(59 130 246).","default_accent_invalid":"یک رنگ CSS معتبر و پشتیبانی‌شده توسط مرورگر وارد کنید.","default_accent_preview":"پیش‌نمایش رنگ اصلی"},"chat":{"welcome_greeting":"پیام خوش‌آمدگویی","welcome_subtitle":"زیرعنوان خوش‌آمدگویی","disclaimer":"متن سلب مسئولیت","show_tool_details":"نمایش جزئیات فنی ابزارها (Tools)","show_tool_details_help":"برای نمایش جزئیات فنی و نحوه عملکرد ابزارهای هوش مصنوعی به کاربران، این گزینه را فعال کنید.","show_settings":"نمایش آیکون تنظیمات برای کاربران","show_settings_help":"نمایش چرخ‌دنده تنظیمات در محیط چت برای شخصی‌سازی توسط کاربر.","show_version_in_settings":"نمایش نسخه برنامه در تنظیمات کاربر","show_version_in_settings_help":"نسخه برنامه را در پایین پنجره تنظیمات کاربر نمایش می‌دهد. این گزینه روی صفحه تنظیمات ادمین اثری ندارد.","disable_signup":"غیرفعال‌سازی ثبت‌نام","disable_signup_help":"تب ثبت‌نام را مخفی می‌کند تا کاربران فقط بتوانند وارد شوند.","disable_auth_page":"غیرفعال‌سازی صفحه ورود/ثبت‌نام","disable_auth_page_help":"کل صفحه احراز هویت را مخفی می‌کند و دسترسی به فرم‌های ورود و ثبت‌نام را می‌بندد.","composer_attachments":"فعال‌سازی پیوست فایل","composer_attachments_help":"اجازه به کاربران برای آپلود و پیوست فایل به پیام‌ها.","thread_actions_feedback":"فعال‌سازی دکمه‌های بازخورد","thread_actions_feedback_help":"نمایش دکمه‌های پسندیدن/نپسندیدن در پاسخ‌های هوش مصنوعی.","thread_actions_retry":"فعال‌سازی دکمه تلاش مجدد","thread_actions_retry_help":"نمایش دکمه تلاش مجدد برای تولید دوباره آخرین پاسخ هوش مصنوعی.","history_enabled":"فعال‌سازی سایدبار تاریخچه","history_enabled_help":"نمایش منوی کناری شامل گفتگوهای قبلی.","history_show_delete":"اجازه حذف گفتگوها","history_show_rename":"اجازه تغییر نام گفتگوها","history_show_share":"اجازه اشتراک‌گذاری گفتگوها","history_show_pin":"اجازه پین کردن گفتگوها","sections_modes":"وضعیت نمایش تب‌های تنظیمات","sections_modes_help":"کنترل نمایش یا غیرفعال بودن تب‌های مختلف در بخش تنظیمات کاربر.","mode_editable":"فعال (قابل ویرایش)","mode_faded":"محو (فقط خواندنی)","mode_hidden":"مخفی (غیرفعال)","general_tab":"تب عمومی","profile_tab":"تب پروفایل","account_tab":"تب حساب کاربری","inner_fields_modes":"مشاهده‌پذیری فیلدهای داخلی","inner_fields_modes_help":"وضعیت نمایش فیلدهای هر تب را به‌صورت مجزا پیکربندی کنید."},"user_billing":{"initial_balance_tokens":"توکن اولیه پیش‌فرض","initial_balance_requests":"تعداد درخواست اولیه پیش‌فرض","initial_balance_help":"این مقادیر به‌صورت خودکار به کاربران جدید اختصاص داده می‌شوند، مگر اینکه هنگام ایجاد کاربر مقدار دیگری تعیین شود."},"save_success":"تنظیمات با موفقیت ذخیره شد","save_error":"خطا در ذخیره‌سازی تنظیمات","save":"ذخیره تغییرات","translations_management":"مدیریت ترجمه‌ها","editor_tips":"تمام تغییرات به‌صورت خودکار در حالت محلی ذخیره می‌شوند. برای نهایی‌سازی، دکمه «ذخیره تغییرات» را بزنید.","sync_from_code":"همگام‌سازی از کد","reset_button":"بازنشانی به تنظیمات اولیه","reset_confirm_title":"بازنشانی تنظیمات؟","reset_confirm_description":"این عمل تمام فیلدها را به مقادیر پیش‌فرض در کد بازمی‌گرداند. تغییرات ذخیره نشده فعلی از بین خواهند رفت.","preview":"پیش‌نمایش","tips_label":"نکته"},"analytics":{"title":"تحلیل و آمار","days":"{{count}} روز","time_range_label":"بازه","days_unit":"روز","total_users":"تعداد کاربران","total_threads":"تعداد گفتگوها","total_messages":"تعداد پیام‌ها","total_token_usage":"مصرف کل توکن","usage_cost":"مصرف و هزینه","input":"ورودی","output":"خروجی","cost":"هزینه","threads_chart":"گفتگوها","messages_chart":"پیام‌ها","token_usage_chart":"مصرف توکن","cost_chart":"هزینه روزانه","active_users":"کاربران فعال","conversations":"گفتگو","threads":"گفتگو","feedback":"نظرات کاربران","total_feedback":"کل نظرات","positive":"مثبت","negative":"منفی","loading_analytics":"در حال بارگذاری تحلیل‌ها...","error_loading":"خطا در بارگذاری داده‌ها","source_human":"کاربران","source_service":"سرویس","source_all":"همه","source_caption_human":"نمایش فقط کاربران واقعی","source_caption_service":"نمایش فقط ترافیک سرویس","source_caption_all":"نمایش همهٔ ترافیک"},"chat_history":{"title":"مدیریت تاریخچه گفتگوها","search_placeholder":"جستجو بر اساس نام، شماره تماس، عنوان گفتگو یا شناسه...","search_button":"جستجو","threads_list":"لیست گفتگوها","thread_count":"{{count}}","no_thread_title":"گفتگو بدون عنوان","messages":"پیام‌ها","messages_for":"پیام‌های گفتگو: {{title}}","select_thread":"یک گفتگو را برای مشاهده انتخاب کنید","no_threads":"هیچ گفتگویی یافت نشد","empty_thread":"این گفتگو خالی است","loading_threads":"در حال بارگذاری...","loading_messages":"در حال بارگذاری پیام‌ها...","user_label":"کاربر","assistant_label":"دستیار هوشمند","subagent_label":"زیرعامل","input_tokens":"ورودی: {{value}}","output_tokens":"خروجی: {{value}}","total_tokens":"کل: {{value}}","cost":"هزینه: {{value}}","unpriced":"بدون هزینه","all_feedbacks":"همه گفتگوها","liked_feedbacks":"پسندیده شده 👍","disliked_feedbacks":"نپسندیده شده 👎","any_feedback":"دارای بازخورد","output_available":"خروجی موجود است","running":"در حال اجرا...","unnamed_file":"فایل بدون نام","download_file":"دانلود فایل","source_human":"کاربران","source_service":"سرویس","source_all":"همهٔ منابع","external_user_id":"شناسهٔ سرویس"},"users":{"title":"مدیریت کاربران","user_count":"تعداد کاربران: {{count}}","add_user":"افزودن کاربر جدید","edit_user":"ویرایش کاربر","phone":"شماره تلفن","phone_placeholder":"۰۹۱۲۳۴۵۶۷۸۹","name":"نام","surname":"نام خانوادگی","initial_tokens":"تعداد توکن اولیه (اختیاری)","initial_requests":"تعداد درخواست اولیه (اختیاری)","balance":"موجودی","requests_label":"درخواست‌ها","tokens_label":"توکن‌ها","token_limit":"سقف توکن","request_limit":"سقف درخواست","tokens_usage":"میزان مصرف توکن","requests_usage":"میزان مصرف درخواست","actions":"عملیات","copy_token":"کپی توکن (با بروزرسانی خودکار)","token_copied":"توکن با موفقیت کپی شد","no_token":"توکنی برای این کاربر یافت نشد","recharge":"شارژ موجودی","full_charge":"شارژ کامل","update_balance":"بروزرسانی موجودی","update_balance_for":"بروزرسانی موجودی","token_count":"تعداد توکن","request_count":"تعداد درخواست","updating":"در حال بروزرسانی...","no_users":"هیچ کاربری یافت نشد.","sort_ascending":"مرتب‌سازی صعودی","sort_descending":"مرتب‌سازی نزولی","confirm_delete_user":"آیا از حذف این کاربر اطمینان دارید؟","tokens_exceed_limit":"تعداد توکن نمی‌تواند بیشتر از سقف مجاز باشد","requests_exceed_limit":"تعداد درخواست نمی‌تواند بیشتر از سقف مجاز باشد","metadata":"متادیتا (JSON)","initial_balance":"موجودی اولیه","custom_fields":"فیلدهای اضافه","metadata_raw":"متادیتا (JSON خام)","advanced_usage":"استفاده پیشرفته","invalid_json":"فرمت JSON نامعتبر است","auto_recharge":"تمدید خودکار موجودی","auto_recharge_help":"موجودی این کاربر را طبق یک برنامه تکرارشونده تا سقف تعیین‌شده بازنشانی می‌کند.","enabled":"فعال","recharge_interval":"هر","recharge_unit":"واحد بازه","recharge_unit_minute":"دقیقه","recharge_unit_hour":"ساعت","recharge_unit_day":"روز","recharge_unit_week":"هفته","recharge_unit_month":"ماه","recharge_schedule_help":"برنامه جدید از زمان ذخیره آغاز می‌شود. برنامه موجود مبدأ دوره فعلی خود را حفظ می‌کند.","next_recharge":"تمدید بعدی","last_recharge":"آخرین تمدید خودکار","not_available":"در دسترس نیست","recharge_interval_invalid":"بازه تمدید باید یک عدد صحیح مثبت باشد","recharge_policy_not_saved":"سرور تنظیمات تمدید خودکار را ذخیره نکرد. سرور را راه‌اندازی مجدد یا به نسخه پشتیبان‌کننده از تمدید خودکار بروزرسانی کنید.","usage_summary":"خلاصه مصرف","input_tokens":"توکن‌های ورودی","output_tokens":"توکن‌های خروجی","total_tokens":"کل توکن‌ها","requests_made":"تعداد درخواست‌ها","total_cost":"هزینه کل","renewals":"دفعات شارژ موجودی","unpriced_requests":"درخواست‌های بدون هزینه‌ی ثبت شده","bulk_balance":"تغییر گروهی موجودی","bulk_balance_help":"تغییر موجودی را روی کاربران مطابق جستجو، شناسه‌های مشخص و فیلترهای متادیتا اعمال کنید.","bulk_operation":"عملیات","bulk_operation_add":"افزودن به موجودی","bulk_operation_set":"تنظیم مقدار دقیق","bulk_operation_full_charge":"شارژ تا سقف","bulk_use_current_search":"استفاده از جستجوی فعلی","bulk_user_ids":"شناسه کاربران (اختیاری)","bulk_metadata_filters":"فیلترهای متادیتا (JSON)","bulk_available_metadata":"کلیدهای متادیتای در دسترس","bulk_preview_empty":"تعداد کاربران مطابق قبل از اعمال بررسی می‌شود.","bulk_preview_count":"{{count}} کاربر مطابق هستند","apply_bulk_balance":"اعمال تغییر","bulk_balance_confirm":"این تغییر موجودی برای {{count}} کاربر اعمال شود؟","matching_users":"کاربران مطابق","bulk_apply_balance":"بروزرسانی موجودی","bulk_apply_renewal":"بروزرسانی سیاست تمدید","bulk_select_change":"حداقل یک تغییر گروهی را برای اعمال انتخاب کنید.","bulk_renewal_policy":"سیاست تمدید","bulk_renewal_policy_help":"تمدید خودکار را برای همه کاربران مطابق فعال یا غیرفعال کنید.","bulk_renewal_anchor":"زمان اولین تمدید (اختیاری)","source_human":"کاربران","source_service":"سرویس","source_all":"همه","account_type":"نوع حساب","account_type_human":"کاربر انسانی","account_type_service":"سرویس","account_type_service_help":"مصرف‌کنندهٔ سرویس خارجی. شمارهٔ تلفن اختیاری است؛ توکن این حساب را با سرویس یکپارچه‌شونده به اشتراک بگذارید.","service_name":"نام سرویس","service_name_placeholder":"مثلاً یکپارچه‌سازی CRM","optional":"اختیاری"},"admins":{"title":"مدیریت ادمین‌ها","admin_count":"تعداد ادمین‌ها: {{count}}","add_admin":"افزودن ادمین جدید","edit_admin":"ویرایش ادمین","username":"نام کاربری","name":"نام","password":"رمز عبور","password_edit":"رمز عبور جدید (خالی بگذارید تا تغییر نکند)","permissions":"دسترسی‌ها","perm_chat_history":"تاریخچه گفتگوها","perm_admin_management":"مدیریت ادمین‌ها","perm_user_management":"مدیریت کاربران","perm_analytics":"تحلیل و آمار","perm_settings":"تنظیمات","no_admins":"هیچ ادمینی یافت نشد.","confirm_delete_admin":"آیا از حذف این ادمین اطمینان دارید؟"},"errors":{"access_denied_title":"عدم دسترسی","access_denied_message":"شما مجوزهای لازم برای دسترسی به این صفحه را ندارید. می‌توانید با مدیر سیستم تماس بگیرید.","back_to_dashboard":"بازگشت به پیشخوان"},"login":{"title":"پنل ادمین","setup_title":"راه‌اندازی اولیه","setup_description":"هنوز حساب ادمینی وجود ندارد. برای شروع، یک رمز عبور برای کاربر ادمین پیش‌فرض تنظیم کنید.","set_password":"تعیین رمز عبور","set_password_placeholder":"یک رمز عبور قوی انتخاب کنید","confirm_password":"تأیید رمز عبور","confirm_password_placeholder":"رمز عبور را دوباره وارد کنید","passwords_mismatch":"رمزهای عبور مطابقت ندارند","password_too_short":"رمز عبور باید حداقل ۴ کاراکتر باشد","create_admin":"ایجاد ادمین و ورود","setting_up":"در حال راه‌اندازی...","username":"نام کاربری","username_placeholder":"نام کاربری","password":"رمز عبور","password_placeholder":"••••••••","submit":"ورود به پنل","logging_in":"در حال ورود...","error":"خطا در ورود","copyright":"© ۲۰۲۶ پلتفرم چت‌بات هوشمند"}}'), Ui = { title: "تنظیمات", sections: { profile: "پروفایل", general: "عمومی", account: "حساب کاربری" }, profile: { title: "اطلاعات پروفایل", subtitle: "اطلاعات شخصی خود را در زیر بروز کنید.", name: "نام", surname: "نام خانوادگی", phone: "شماره تلفن", password: "رمز عبور جدید", password_placeholder: "برای عدم تغییر خالی بگذارید", save: "ذخیره تغییرات", saving: "در حال ذخیره...", success: "پروفایل با موفقیت بروزرسانی شد", error: "خطا در بروزرسانی پروفایل", select_placeholder: "انتخاب کنید" }, general: { title: "تنظیمات عمومی", subtitle: "ظاهر و زبان برنامه را تنظیم کنید.", theme: "تم", language: "زبان", themes: { light: "روشن", dark: "تاریک", system: "سیستم" }, accent: "رنگ اصلی", radius: "میزان گردی لبه‌ها", radius_levels: { sharp: "تیز", round: "گرد" }, languages: { en: "English", fa: "فارسی" } }, account: { title: "حساب و میزان مصرف", subtitle: "سهمیه مصرف و نشست خود را مدیریت کنید.", balance: "موجود فعلی", tokens: "توکن‌ها", requests: "درخواست‌ها", logout: "خروج از حساب", logout_confirm: "آیا از خروج اطمینان دارید؟", last_recharge: "آخرین بروزرسانی اعتبار در تاریخ" } }, qi = { unauthorized: "دسترسی مجاز نیست. لطفاً دوباره وارد شوید.", invalid_credentials: "شماره تلفن یا رمز عبور اشتباه است.", phone_required: "شماره تلفن الزامی است.", password_required: "رمز عبور الزامی است.", name_surname_required: "نام و نام خانوادگی الزامی است.", phone_already_exists: "این شماره تلفن قبلاً ثبت شده است.", invalid_token: "نشست شما منقضی شده است. لطفاً دوباره وارد شوید.", user_not_found: "کاربر یافت نشد.", insufficient_balance: "موجودی کافی نیست. لطفاً حساب خود را شارژ کنید.", insufficient_balance_recharge: "شما به سقف موجودی خود رسیده‌اید. موجودی شما {{datetime, datetime}} بازنشانی خواهد شد.", insufficient_balance_no_recharge: "موجودی شما به پایان رسیده است. لطفاً برای شارژ حساب خود با پشتیبانی تماس بگیرید.", me_update_failed: "خطا در بروزرسانی اطلاعات پروفایل.", thread_not_found: "گفتگو یافت نشد.", access_denied: "شما اجازه انجام این عملیات را ندارید.", feedback_save_failed: "خطا در ثبت بازخورد.", thread_update_failed: "خطا در بروزرسانی گفتگو.", thread_delete_failed: "خطا در حذف گفتگو.", attachment_not_found: "فایل پیوست یافت نشد.", thread_share_failed: "خطا در اشتراک‌گذاری گفتگو.", model_quota_reached_error: "سامانه در حال حاضر قادر به پاسخ‌گویی نیست. لطفاً بعداً دوباره تلاش کنید.", admin_already_exists: "ادمین با این نام کاربری قبلاً ایجاد شده است.", admin_not_found: "ادمین یافت نشد.", cannot_delete_self: "شما نمی‌توانید حساب مدیریت خود را حذف کنید.", admin_update_failed: "خطا در بروزرسانی اطلاعات ادمین.", internal_error: "یک خطای داخلی در سرور رخ داده است. لطفاً بعداً تلاش کنید.", validation_error: "داده‌های ارسالی معتبر نیستند. لطفاً ورودی‌های خود را بررسی کنید.", not_found: "منبع مورد نظر یافت نشد." }, $i = {
6877
- sidebar: Li,
6878
- chat: Di,
6876
+ }, Di = { new_conversation: "گفتگوی جدید", tooltip_new_conversation: "شروع یک گفتگوی جدید", delete_conversation: "حذف", delete_confirm_title: "حذف گفتگو؟", delete_confirm_description: "آیا از حذف این گفتگو اطمینان دارید؟ این عمل قابل بازگشت نیست.", cancel: "انصراف", delete: "حذف", chat_deleted_success: "گفتگو با موفقیت حذف شد", logout: "خروج", new_chat: "گفتگوی جدید", rename_conversation: "تغییر نام", rename_success: "نام گفتگو با موفقیت تغییر کرد", rename_failed: "خطا در تغییر نام گفتگو", search_conversations: "جستجوی گفتگوها...", save: "ذخیره", no_conversations: "هنوز گفتگویی ندارید", loading_more: "در حال بارگذاری...", pinned_success: "گفتگو پین شد", unpinned_success: "گفتگو از حالت پین خارج شد", pin_failed: "خطا در پین کردن گفتگو", share_success: "لینک کپی شد", share_description: "لینک اشتراک‌گذاری در حافظه موقت کپی شد.", share_failed: "خطا در ایجاد لینک اشتراک‌گذاری", pin_conversation: "پین", unpin_conversation: "برداشتن پین", share_conversation: "اشتراک‌گذاری" }, Li = { tools: "ابزارها", error: "خطا:", input_placeholder: "سوالتو اینجا بپرس...", insufficient_balance: "موجودی حساب شما کافی نیست. لطفا برای ادامه، حساب خود را شارژ کنید.", regenerate: "تولید مجدد", retry: "تلاش مجدد", copy: "کپی", like: "پسندیدم", dislike: "نپسندیدم", attach_file: "پیوست فایل", remove_file: "حذف فایل", reference: "ارجاع", reference_selection: "ارجاع به بخش انتخاب‌شده", remove_reference: "حذف ارجاع", referenced_context: "بخش ارجاع‌شده", source_unavailable: "منبع در دسترس نیست", tool_reference: "ارجاع به ابزار", card_reference: "ارجاع به کارت", used_sources: "از {{count}} منبع استفاده شد", welcome: { title: "سلام! چطور می‌تونم کمکت کنم؟", subtitle: "هر سوالی داری بپرس، تمام تلاشمو می‌کنم کمکت کنم.", suggestions: ["چه کارهایی می‌تونی انجام بدی؟", "یه چیز جالب بهم بگو", "کمکم کن یه ایمیل بنویسم", "یه مفهوم رو برام توضیح بده"] }, disclaimer: "هوش مصنوعی ممکن است اشتباه کند. اطلاعات مهم را بررسی کنید." }, Fi = { pending: "در انتظار", running: "در حال اجرا", completed: "تکمیل شده", error: "خطا", parameters: "پارامترها", result: "نتیجه", view_error: "نمایش خطا", tool_error: "خطای ابزار", copied: "کپی شد!", copy_error: "کپی خطا" }, Pi = { login_tab: "ورود", signup_tab: "ثبت نام", phone: "شماره تلفن", phone_placeholder: "شماره تلفن", password: "رمز عبور", name: "نام", name_placeholder: "نام", surname: "نام خانوادگی", surname_placeholder: "نام خانوادگی", logging_in: "در حال ورود...", signing_up: "در حال ثبت نام...", auth_page_disabled_title: "صفحه ورود غیرفعال شده است.", auth_page_disabled_description: "برای دسترسی با مدیر سامانه تماس بگیرید.", select_placeholder: "انتخاب کنید", login_button: "ورود", signup_button: "ثبت نام", username: "نام کاربری", username_placeholder: "نام کاربری", email: "ایمیل", email_placeholder: "you@example.com" }, Mi = { toggle: "تغییر تم", light: "تغییر به تم روشن", dark: "تغییر به تم تاریک", system: "تغییر به تم سیستم" }, zi = /* @__PURE__ */ JSON.parse('{"select_placeholder":"انتخاب کنید","loading":"در حال بارگذاری...","retry":"تلاش مجدد","save":"ذخیره","saving":"در حال ذخیره...","cancel":"انصراف","delete":"حذف","edit":"ویرایش","search":"جستجو","search_placeholder":"جستجو...","no_data":"داده‌ای موجود نیست","loading_more":"در حال بارگذاری بیشتر...","confirm_delete":"آیا از حذف اطمینان دارید؟","error_loading":"خطا در بارگذاری داده‌ها","close":"بستن","jobs":{"section_title":"کارهای سیستمی","no_jobs":"هیچ کاری برای این برنامه تعریف نشده است.","run":"اجرا","run_dry":"اجرای آزمایشی","run_started":"کار «{{name}}» اجرا شد","run_failed":"اجرای کار با خطا مواجه شد","history":"تاریخچهٔ اجراها","history_help":"اجراهای اخیر. برای دیدن ورودی‌ها و خروجی هر اجرا روی آن کلیک کنید.","view_history":"مشاهدهٔ تاریخچهٔ اجراها","inputs":"ورودی‌ها","no_runs":"هنوز هیچ کاری اجرا نشده است.","dry_run":"اجرای آزمایشی","dry_run_help":"کار را بدون اعمال هیچ تغییری شبیه‌سازی می‌کند.","confirm_destructive":"این یک کار مخرب است. برای تأیید، نام «{{name}}» را وارد کنید.","output":"خروجی","no_output":"(خروجی‌ای ثبت نشد)","output_truncated":"...[خروجی کوتاه شد]","result":"نتیجه","cancel_run":"لغو اجرا","triggered_by":"اجرا شده توسط {{user}}","triggered_by_api":"اجرا شده با کلید API","danger":{"safe":"بی‌خطر","caution":"نیازمند احتیاط","destructive":"مخرب"},"status":{"queued":"در صف","processing":"در حال اجرا","completed":"انجام شد","failed":"ناموفق","cancelled":"لغو شد"},"raw":{"title":"اجرای کد پایتون","warning":"این بخش کد پایتون دلخواه را با دسترسی کامل روی سرور اجرا می‌کند. هیچ ایزوله‌سازی‌ای در کار نیست؛ تنها محافظت، کنترل دسترسی و ثبت در گزارش است. فقط زمانی استفاده کنید که از کاری که انجام می‌دهید کاملاً مطمئن هستید.","confirm_label":"برای فعال شدن دکمهٔ اجرا، عبارت «{{phrase}}» را وارد کنید.","run":"اجرای کد"}},"dashboard":{"title":"پنل ادمین","logout":"خروج","tabs":{"analytics":"تحلیل و آمار","chat_history":"گفتگوها","users":"کاربران","admins":"ادمین‌ها","settings":"تنظیمات"}},"app_settings":{"title":"تنظیمات سامانه","subtitle":"پیکربندی کلی ظاهر و رفتار سامانه را مدیریت کنید.","sections":{"general":"اطلاعات پایه","chat":"تنظیمات گفتگو","user_billing":"کاربری و مالی"},"general":{"app_name":"نام سامانه","admin_title":"عنوان پنل ادمین","language":"زبان پیش‌فرض","language_help":"زبانی که کاربر در اولین ورود مشاهده می‌کند (در صورت عدم تشخیص خودکار).","appearance":"ظاهر پیش‌فرض","appearance_help":"این مقادیر زمانی اعمال می‌شوند که کاربر تنظیمات ظاهری خود را ذخیره نکرده باشد.","default_theme":"پوسته پیش‌فرض","default_accent":"رنگ اصلی پیش‌فرض","default_accent_help":"هر رنگ CSS پشتیبانی‌شده توسط مرورگر را وارد کنید؛ مانند #3b82f6 یا rgb(59 130 246).","default_accent_invalid":"یک رنگ CSS معتبر و پشتیبانی‌شده توسط مرورگر وارد کنید.","default_accent_preview":"پیش‌نمایش رنگ اصلی"},"chat":{"welcome_greeting":"پیام خوش‌آمدگویی","welcome_subtitle":"زیرعنوان خوش‌آمدگویی","disclaimer":"متن سلب مسئولیت","show_tool_details":"نمایش جزئیات فنی ابزارها (Tools)","show_tool_details_help":"برای نمایش جزئیات فنی و نحوه عملکرد ابزارهای هوش مصنوعی به کاربران، این گزینه را فعال کنید.","show_settings":"نمایش آیکون تنظیمات برای کاربران","show_settings_help":"نمایش چرخ‌دنده تنظیمات در محیط چت برای شخصی‌سازی توسط کاربر.","show_version_in_settings":"نمایش نسخه برنامه در تنظیمات کاربر","show_version_in_settings_help":"نسخه برنامه را در پایین پنجره تنظیمات کاربر نمایش می‌دهد. این گزینه روی صفحه تنظیمات ادمین اثری ندارد.","disable_signup":"غیرفعال‌سازی ثبت‌نام","disable_signup_help":"تب ثبت‌نام را مخفی می‌کند تا کاربران فقط بتوانند وارد شوند.","disable_auth_page":"غیرفعال‌سازی صفحه ورود/ثبت‌نام","disable_auth_page_help":"کل صفحه احراز هویت را مخفی می‌کند و دسترسی به فرم‌های ورود و ثبت‌نام را می‌بندد.","composer_attachments":"فعال‌سازی پیوست فایل","composer_attachments_help":"اجازه به کاربران برای آپلود و پیوست فایل به پیام‌ها.","thread_actions_feedback":"فعال‌سازی دکمه‌های بازخورد","thread_actions_feedback_help":"نمایش دکمه‌های پسندیدن/نپسندیدن در پاسخ‌های هوش مصنوعی.","thread_actions_retry":"فعال‌سازی دکمه تلاش مجدد","thread_actions_retry_help":"نمایش دکمه تلاش مجدد برای تولید دوباره آخرین پاسخ هوش مصنوعی.","history_enabled":"فعال‌سازی سایدبار تاریخچه","history_enabled_help":"نمایش منوی کناری شامل گفتگوهای قبلی.","history_show_delete":"اجازه حذف گفتگوها","history_show_rename":"اجازه تغییر نام گفتگوها","history_show_share":"اجازه اشتراک‌گذاری گفتگوها","history_show_pin":"اجازه پین کردن گفتگوها","sections_modes":"وضعیت نمایش تب‌های تنظیمات","sections_modes_help":"کنترل نمایش یا غیرفعال بودن تب‌های مختلف در بخش تنظیمات کاربر.","mode_editable":"فعال (قابل ویرایش)","mode_faded":"محو (فقط خواندنی)","mode_hidden":"مخفی (غیرفعال)","general_tab":"تب عمومی","profile_tab":"تب پروفایل","account_tab":"تب حساب کاربری","inner_fields_modes":"مشاهده‌پذیری فیلدهای داخلی","inner_fields_modes_help":"وضعیت نمایش فیلدهای هر تب را به‌صورت مجزا پیکربندی کنید."},"user_billing":{"initial_balance_tokens":"توکن اولیه پیش‌فرض","initial_balance_requests":"تعداد درخواست اولیه پیش‌فرض","initial_balance_help":"این مقادیر به‌صورت خودکار به کاربران جدید اختصاص داده می‌شوند، مگر اینکه هنگام ایجاد کاربر مقدار دیگری تعیین شود."},"save_success":"تنظیمات با موفقیت ذخیره شد","save_error":"خطا در ذخیره‌سازی تنظیمات","save":"ذخیره تغییرات","translations_management":"مدیریت ترجمه‌ها","editor_tips":"تمام تغییرات به‌صورت خودکار در حالت محلی ذخیره می‌شوند. برای نهایی‌سازی، دکمه «ذخیره تغییرات» را بزنید.","sync_from_code":"همگام‌سازی از کد","reset_button":"بازنشانی به تنظیمات اولیه","reset_confirm_title":"بازنشانی تنظیمات؟","reset_confirm_description":"این عمل تمام فیلدها را به مقادیر پیش‌فرض در کد بازمی‌گرداند. تغییرات ذخیره نشده فعلی از بین خواهند رفت.","preview":"پیش‌نمایش","tips_label":"نکته"},"analytics":{"title":"تحلیل و آمار","days":"{{count}} روز","time_range_label":"بازه","days_unit":"روز","total_users":"تعداد کاربران","total_threads":"تعداد گفتگوها","total_messages":"تعداد پیام‌ها","total_token_usage":"مصرف کل توکن","usage_cost":"مصرف و هزینه","input":"ورودی","output":"خروجی","cost":"هزینه","threads_chart":"گفتگوها","messages_chart":"پیام‌ها","token_usage_chart":"مصرف توکن","cost_chart":"هزینه روزانه","active_users":"کاربران فعال","conversations":"گفتگو","threads":"گفتگو","feedback":"نظرات کاربران","total_feedback":"کل نظرات","positive":"مثبت","negative":"منفی","loading_analytics":"در حال بارگذاری تحلیل‌ها...","error_loading":"خطا در بارگذاری داده‌ها","source_human":"کاربران","source_service":"سرویس","source_all":"همه","source_caption_human":"نمایش فقط کاربران واقعی","source_caption_service":"نمایش فقط ترافیک سرویس","source_caption_all":"نمایش همهٔ ترافیک"},"chat_history":{"title":"مدیریت تاریخچه گفتگوها","search_placeholder":"جستجو بر اساس نام، شماره تماس، عنوان گفتگو یا شناسه...","search_button":"جستجو","threads_list":"لیست گفتگوها","thread_count":"{{count}}","no_thread_title":"گفتگو بدون عنوان","messages":"پیام‌ها","messages_for":"پیام‌های گفتگو: {{title}}","select_thread":"یک گفتگو را برای مشاهده انتخاب کنید","no_threads":"هیچ گفتگویی یافت نشد","empty_thread":"این گفتگو خالی است","loading_threads":"در حال بارگذاری...","loading_messages":"در حال بارگذاری پیام‌ها...","user_label":"کاربر","assistant_label":"دستیار هوشمند","subagent_label":"زیرعامل","input_tokens":"ورودی: {{value}}","output_tokens":"خروجی: {{value}}","total_tokens":"کل: {{value}}","cost":"هزینه: {{value}}","unpriced":"بدون هزینه","all_feedbacks":"همه گفتگوها","liked_feedbacks":"پسندیده شده 👍","disliked_feedbacks":"نپسندیده شده 👎","any_feedback":"دارای بازخورد","output_available":"خروجی موجود است","running":"در حال اجرا...","unnamed_file":"فایل بدون نام","download_file":"دانلود فایل","source_human":"کاربران","source_service":"سرویس","source_all":"همهٔ منابع","external_user_id":"شناسهٔ سرویس"},"users":{"title":"مدیریت کاربران","user_count":"تعداد کاربران: {{count}}","add_user":"افزودن کاربر جدید","edit_user":"ویرایش کاربر","phone":"شماره تلفن","phone_placeholder":"۰۹۱۲۳۴۵۶۷۸۹","name":"نام","surname":"نام خانوادگی","initial_tokens":"تعداد توکن اولیه (اختیاری)","initial_requests":"تعداد درخواست اولیه (اختیاری)","balance":"موجودی","requests_label":"درخواست‌ها","tokens_label":"توکن‌ها","token_limit":"سقف توکن","request_limit":"سقف درخواست","tokens_usage":"میزان مصرف توکن","requests_usage":"میزان مصرف درخواست","actions":"عملیات","copy_token":"کپی توکن (با بروزرسانی خودکار)","token_copied":"توکن با موفقیت کپی شد","no_token":"توکنی برای این کاربر یافت نشد","recharge":"شارژ موجودی","full_charge":"شارژ کامل","update_balance":"بروزرسانی موجودی","update_balance_for":"بروزرسانی موجودی","token_count":"تعداد توکن","request_count":"تعداد درخواست","updating":"در حال بروزرسانی...","no_users":"هیچ کاربری یافت نشد.","sort_ascending":"مرتب‌سازی صعودی","sort_descending":"مرتب‌سازی نزولی","confirm_delete_user":"آیا از حذف این کاربر اطمینان دارید؟","tokens_exceed_limit":"تعداد توکن نمی‌تواند بیشتر از سقف مجاز باشد","requests_exceed_limit":"تعداد درخواست نمی‌تواند بیشتر از سقف مجاز باشد","metadata":"متادیتا (JSON)","initial_balance":"موجودی اولیه","custom_fields":"فیلدهای اضافه","metadata_raw":"متادیتا (JSON خام)","advanced_usage":"استفاده پیشرفته","invalid_json":"فرمت JSON نامعتبر است","auto_recharge":"تمدید خودکار موجودی","auto_recharge_help":"موجودی این کاربر را طبق یک برنامه تکرارشونده تا سقف تعیین‌شده بازنشانی می‌کند.","enabled":"فعال","recharge_interval":"هر","recharge_unit":"واحد بازه","recharge_unit_minute":"دقیقه","recharge_unit_hour":"ساعت","recharge_unit_day":"روز","recharge_unit_week":"هفته","recharge_unit_month":"ماه","recharge_schedule_help":"برنامه جدید از زمان ذخیره آغاز می‌شود. برنامه موجود مبدأ دوره فعلی خود را حفظ می‌کند.","next_recharge":"تمدید بعدی","last_recharge":"آخرین تمدید خودکار","not_available":"در دسترس نیست","recharge_interval_invalid":"بازه تمدید باید یک عدد صحیح مثبت باشد","recharge_policy_not_saved":"سرور تنظیمات تمدید خودکار را ذخیره نکرد. سرور را راه‌اندازی مجدد یا به نسخه پشتیبان‌کننده از تمدید خودکار بروزرسانی کنید.","usage_summary":"خلاصه مصرف","input_tokens":"توکن‌های ورودی","output_tokens":"توکن‌های خروجی","total_tokens":"کل توکن‌ها","requests_made":"تعداد درخواست‌ها","total_cost":"هزینه کل","renewals":"دفعات شارژ موجودی","unpriced_requests":"درخواست‌های بدون هزینه‌ی ثبت شده","bulk_balance":"تغییر گروهی موجودی","bulk_balance_help":"تغییر موجودی را روی کاربران مطابق جستجو، شناسه‌های مشخص و فیلترهای متادیتا اعمال کنید.","bulk_operation":"عملیات","bulk_operation_add":"افزودن به موجودی","bulk_operation_set":"تنظیم مقدار دقیق","bulk_operation_full_charge":"شارژ تا سقف","bulk_use_current_search":"استفاده از جستجوی فعلی","bulk_user_ids":"شناسه کاربران (اختیاری)","bulk_metadata_filters":"فیلترهای متادیتا (JSON)","bulk_available_metadata":"کلیدهای متادیتای در دسترس","bulk_preview_empty":"تعداد کاربران مطابق قبل از اعمال بررسی می‌شود.","bulk_preview_count":"{{count}} کاربر مطابق هستند","apply_bulk_balance":"اعمال تغییر","bulk_balance_confirm":"این تغییر موجودی برای {{count}} کاربر اعمال شود؟","matching_users":"کاربران مطابق","bulk_apply_balance":"بروزرسانی موجودی","bulk_apply_renewal":"بروزرسانی سیاست تمدید","bulk_select_change":"حداقل یک تغییر گروهی را برای اعمال انتخاب کنید.","bulk_renewal_policy":"سیاست تمدید","bulk_renewal_policy_help":"تمدید خودکار را برای همه کاربران مطابق فعال یا غیرفعال کنید.","bulk_renewal_anchor":"زمان اولین تمدید (اختیاری)","source_human":"کاربران","source_service":"سرویس","source_all":"همه","account_type":"نوع حساب","account_type_human":"کاربر انسانی","account_type_service":"سرویس","account_type_service_help":"مصرف‌کنندهٔ سرویس خارجی. شمارهٔ تلفن اختیاری است؛ توکن این حساب را با سرویس یکپارچه‌شونده به اشتراک بگذارید.","service_name":"نام سرویس","service_name_placeholder":"مثلاً یکپارچه‌سازی CRM","optional":"اختیاری","username":"نام کاربری","username_placeholder":"نام کاربری","email":"ایمیل","email_placeholder":"you@example.com"},"admins":{"title":"مدیریت ادمین‌ها","admin_count":"تعداد ادمین‌ها: {{count}}","add_admin":"افزودن ادمین جدید","edit_admin":"ویرایش ادمین","username":"نام کاربری","name":"نام","password":"رمز عبور","password_edit":"رمز عبور جدید (خالی بگذارید تا تغییر نکند)","permissions":"دسترسی‌ها","perm_chat_history":"تاریخچه گفتگوها","perm_admin_management":"مدیریت ادمین‌ها","perm_user_management":"مدیریت کاربران","perm_analytics":"تحلیل و آمار","perm_settings":"تنظیمات","no_admins":"هیچ ادمینی یافت نشد.","confirm_delete_admin":"آیا از حذف این ادمین اطمینان دارید؟"},"errors":{"access_denied_title":"عدم دسترسی","access_denied_message":"شما مجوزهای لازم برای دسترسی به این صفحه را ندارید. می‌توانید با مدیر سیستم تماس بگیرید.","back_to_dashboard":"بازگشت به پیشخوان"},"login":{"title":"پنل ادمین","setup_title":"راه‌اندازی اولیه","setup_description":"هنوز حساب ادمینی وجود ندارد. برای شروع، یک رمز عبور برای کاربر ادمین پیش‌فرض تنظیم کنید.","set_password":"تعیین رمز عبور","set_password_placeholder":"یک رمز عبور قوی انتخاب کنید","confirm_password":"تأیید رمز عبور","confirm_password_placeholder":"رمز عبور را دوباره وارد کنید","passwords_mismatch":"رمزهای عبور مطابقت ندارند","password_too_short":"رمز عبور باید حداقل ۴ کاراکتر باشد","create_admin":"ایجاد ادمین و ورود","setting_up":"در حال راه‌اندازی...","username":"نام کاربری","username_placeholder":"نام کاربری","password":"رمز عبور","password_placeholder":"••••••••","submit":"ورود به پنل","logging_in":"در حال ورود...","error":"خطا در ورود","copyright":"© ۲۰۲۶ پلتفرم چت‌بات هوشمند"}}'), Ui = { title: "تنظیمات", sections: { profile: "پروفایل", general: "عمومی", account: "حساب کاربری" }, profile: { title: "اطلاعات پروفایل", subtitle: "اطلاعات شخصی خود را در زیر بروز کنید.", name: "نام", surname: "نام خانوادگی", username: "نام کاربری", email: "ایمیل", phone: "شماره تلفن", password: "رمز عبور جدید", password_placeholder: "برای عدم تغییر خالی بگذارید", save: "ذخیره تغییرات", saving: "در حال ذخیره...", success: "پروفایل با موفقیت بروزرسانی شد", error: "خطا در بروزرسانی پروفایل", select_placeholder: "انتخاب کنید" }, general: { title: "تنظیمات عمومی", subtitle: "ظاهر و زبان برنامه را تنظیم کنید.", theme: "تم", language: "زبان", themes: { light: "روشن", dark: "تاریک", system: "سیستم" }, accent: "رنگ اصلی", radius: "میزان گردی لبه‌ها", radius_levels: { sharp: "تیز", round: "گرد" }, languages: { en: "English", fa: "فارسی" } }, account: { title: "حساب و میزان مصرف", subtitle: "سهمیه مصرف و نشست خود را مدیریت کنید.", balance: "موجود فعلی", tokens: "توکن‌ها", requests: "درخواست‌ها", logout: "خروج از حساب", logout_confirm: "آیا از خروج اطمینان دارید؟", last_recharge: "آخرین بروزرسانی اعتبار در تاریخ" } }, qi = { unauthorized: "دسترسی مجاز نیست. لطفاً دوباره وارد شوید.", invalid_credentials: "شماره تلفن یا رمز عبور اشتباه است.", phone_required: "شماره تلفن الزامی است.", password_required: "رمز عبور الزامی است.", name_surname_required: "نام و نام خانوادگی الزامی است.", phone_already_exists: "این شماره تلفن قبلاً ثبت شده است.", invalid_token: "نشست شما منقضی شده است. لطفاً دوباره وارد شوید.", user_not_found: "کاربر یافت نشد.", insufficient_balance: "موجودی کافی نیست. لطفاً حساب خود را شارژ کنید.", insufficient_balance_recharge: "شما به سقف موجودی خود رسیده‌اید. موجودی شما {{datetime, datetime}} بازنشانی خواهد شد.", insufficient_balance_no_recharge: "موجودی شما به پایان رسیده است. لطفاً برای شارژ حساب خود با پشتیبانی تماس بگیرید.", me_update_failed: "خطا در بروزرسانی اطلاعات پروفایل.", thread_not_found: "گفتگو یافت نشد.", access_denied: "شما اجازه انجام این عملیات را ندارید.", feedback_save_failed: "خطا در ثبت بازخورد.", thread_update_failed: "خطا در بروزرسانی گفتگو.", thread_delete_failed: "خطا در حذف گفتگو.", attachment_not_found: "فایل پیوست یافت نشد.", thread_share_failed: "خطا در اشتراک‌گذاری گفتگو.", model_quota_reached_error: "سامانه در حال حاضر قادر به پاسخ‌گویی نیست. لطفاً بعداً دوباره تلاش کنید.", admin_already_exists: "ادمین با این نام کاربری قبلاً ایجاد شده است.", admin_not_found: "ادمین یافت نشد.", cannot_delete_self: "شما نمی‌توانید حساب مدیریت خود را حذف کنید.", admin_update_failed: "خطا در بروزرسانی اطلاعات ادمین.", internal_error: "یک خطای داخلی در سرور رخ داده است. لطفاً بعداً تلاش کنید.", validation_error: "داده‌های ارسالی معتبر نیستند. لطفاً ورودی‌های خود را بررسی کنید.", not_found: "منبع مورد نظر یافت نشد.", identity_required: "این فیلد الزامی است.", identity_already_exists: "این مقدار قبلاً ثبت شده است." }, $i = {
6877
+ sidebar: Di,
6878
+ chat: Li,
6879
6879
  tools_ui: Fi,
6880
6880
  login: Pi,
6881
6881
  theme: Mi,
@@ -6926,6 +6926,8 @@ const Xt = {
6926
6926
  PASSWORD_REQUIRED: "password_required",
6927
6927
  NAME_SURNAME_REQUIRED: "name_surname_required",
6928
6928
  PHONE_ALREADY_EXISTS: "phone_already_exists",
6929
+ IDENTITY_REQUIRED: "identity_required",
6930
+ IDENTITY_ALREADY_EXISTS: "identity_already_exists",
6929
6931
  INVALID_TOKEN: "invalid_token",
6930
6932
  // User & Balance Errors
6931
6933
  USER_NOT_FOUND: "user_not_found",
@@ -7007,10 +7009,10 @@ function El({ ...e }) {
7007
7009
  function Nl({ ...e }) {
7008
7010
  return /* @__PURE__ */ i(M.Group, { "data-slot": "select-group", ...e });
7009
7011
  }
7010
- function Cl({ ...e }) {
7012
+ function Tl({ ...e }) {
7011
7013
  return /* @__PURE__ */ i(M.Value, { "data-slot": "select-value", ...e });
7012
7014
  }
7013
- function Tl({
7015
+ function Cl({
7014
7016
  className: e,
7015
7017
  size: t = "default",
7016
7018
  children: n,
@@ -7088,7 +7090,7 @@ function Rl({ className: e, children: t, ...n }) {
7088
7090
  ),
7089
7091
  ...n,
7090
7092
  children: [
7091
- /* @__PURE__ */ i("span", { className: "absolute end-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ i(M.ItemIndicator, { children: /* @__PURE__ */ i(Le, { className: "size-4" }) }) }),
7093
+ /* @__PURE__ */ i("span", { className: "absolute end-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ i(M.ItemIndicator, { children: /* @__PURE__ */ i(De, { className: "size-4" }) }) }),
7092
7094
  /* @__PURE__ */ i(M.ItemText, { children: t })
7093
7095
  ]
7094
7096
  }
@@ -7129,7 +7131,7 @@ function Vi({
7129
7131
  }
7130
7132
  );
7131
7133
  }
7132
- function Ll(e, t) {
7134
+ function Dl(e, t) {
7133
7135
  if (!e) return !0;
7134
7136
  const { field: n, operator: o = "equals", value: r } = e, a = t[n];
7135
7137
  switch (o) {
@@ -7145,7 +7147,7 @@ function Ll(e, t) {
7145
7147
  return !0;
7146
7148
  }
7147
7149
  }
7148
- function Dl({ ...e }) {
7150
+ function Ll({ ...e }) {
7149
7151
  return /* @__PURE__ */ i(ye.Root, { "data-slot": "dropdown-menu", ...e });
7150
7152
  }
7151
7153
  function Fl({ ...e }) {
@@ -7204,7 +7206,7 @@ function zl({ className: e, ...t }) {
7204
7206
  {
7205
7207
  "data-slot": "checkbox-indicator",
7206
7208
  className: "grid place-content-center text-current transition-none",
7207
- children: /* @__PURE__ */ i(Le, { className: "size-3.5" })
7209
+ children: /* @__PURE__ */ i(De, { className: "size-3.5" })
7208
7210
  }
7209
7211
  )
7210
7212
  }
@@ -7212,11 +7214,11 @@ function zl({ className: e, ...t }) {
7212
7214
  }
7213
7215
  export {
7214
7216
  Nl as $,
7215
- De as A,
7217
+ Le as A,
7216
7218
  _e as B,
7217
7219
  vl as C,
7218
7220
  _a as D,
7219
- Dl as E,
7221
+ Ll as E,
7220
7222
  Fl as F,
7221
7223
  kl as G,
7222
7224
  Pl as H,
@@ -7229,7 +7231,7 @@ export {
7229
7231
  yl as O,
7230
7232
  zl as P,
7231
7233
  ze as Q,
7232
- To as R,
7234
+ Co as R,
7233
7235
  El as S,
7234
7236
  pl as T,
7235
7237
  li as U,
@@ -7269,12 +7271,12 @@ export {
7269
7271
  dn as n,
7270
7272
  pn as o,
7271
7273
  hl as p,
7272
- Ll as q,
7274
+ Dl as q,
7273
7275
  va as r,
7274
7276
  xa as s,
7275
- Tl as t,
7277
+ Cl as t,
7276
7278
  ge as u,
7277
- Cl as v,
7279
+ Tl as v,
7278
7280
  Al as w,
7279
7281
  Rl as x,
7280
7282
  Ko as y,