@burdenoff/microfe-botmanor 2026.819.1 → 2026.925.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/botlit/BotlitRoutes.js.map +1 -1
  2. package/dist/botlit/BotmanorRoot.js.map +1 -1
  3. package/dist/botlit/BotmanorRootInner.js +4 -4
  4. package/dist/botlit/BotmanorRootInner.js.map +1 -1
  5. package/dist/botlit/components/ErrorState.js +33 -29
  6. package/dist/botlit/components/ErrorState.js.map +1 -1
  7. package/dist/botlit/components/RouteLoader.js +52 -48
  8. package/dist/botlit/components/RouteLoader.js.map +1 -1
  9. package/dist/botlit/components/VersionHistoryPanel.js +74 -77
  10. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
  11. package/dist/botlit/components/WorkspaceRequired.js +31 -30
  12. package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
  13. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
  14. package/dist/botlit/hooks/useConversations.js.map +1 -1
  15. package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
  16. package/dist/botlit/hooks/useMCPServers.js +60 -49
  17. package/dist/botlit/hooks/useMCPServers.js.map +1 -1
  18. package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
  19. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  20. package/dist/botlit/pages/A2ARegistryPage.js +116 -124
  21. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
  22. package/dist/botlit/pages/AgentDetailPage.js +169 -172
  23. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  24. package/dist/botlit/pages/AgentsListPage.js +96 -90
  25. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  26. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  27. package/dist/botlit/pages/BotDetailPage.js +228 -231
  28. package/dist/botlit/pages/BotDetailPage.js.map +1 -1
  29. package/dist/botlit/pages/BotWorkflowTab.js +84 -87
  30. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
  31. package/dist/botlit/pages/BotsListPage.js +144 -147
  32. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  33. package/dist/botlit/pages/BucketsPage.js +3 -3
  34. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  35. package/dist/botlit/pages/ChannelDetailPage.js +1 -1
  36. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  37. package/dist/botlit/pages/ChannelsPage.js +156 -149
  38. package/dist/botlit/pages/ChannelsPage.js.map +1 -1
  39. package/dist/botlit/pages/ChatPage.js +126 -129
  40. package/dist/botlit/pages/ChatPage.js.map +1 -1
  41. package/dist/botlit/pages/DashboardPage.js +111 -114
  42. package/dist/botlit/pages/DashboardPage.js.map +1 -1
  43. package/dist/botlit/pages/ExecutionsPage.js +163 -159
  44. package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
  45. package/dist/botlit/pages/InstalledPackagesPage.js +3 -3
  46. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  47. package/dist/botlit/pages/KnowledgeBasesPage.js +84 -78
  48. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
  49. package/dist/botlit/pages/MCPServerDetailPage.js +295 -238
  50. package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
  51. package/dist/botlit/pages/MCPServersPage.js +159 -154
  52. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  53. package/dist/botlit/pages/PoliciesPage.js +119 -114
  54. package/dist/botlit/pages/PoliciesPage.js.map +1 -1
  55. package/dist/botlit/pages/RetrievalProfilesPage.js +102 -109
  56. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
  57. package/dist/botlit/pages/SettingsPage.js +144 -159
  58. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  59. package/dist/botlit/pages/SkillsPage.js +122 -105
  60. package/dist/botlit/pages/SkillsPage.js.map +1 -1
  61. package/dist/botlit/pages/StorePage.js +176 -175
  62. package/dist/botlit/pages/StorePage.js.map +1 -1
  63. package/dist/botlit/providers/BotlitProvider.js.map +1 -1
  64. package/dist/botlit/store/botlitStore.js +1 -1
  65. package/dist/botlit/store/botlitStore.js.map +1 -1
  66. package/dist/botlit/utils/navigation.js.map +1 -1
  67. package/dist/generated/wspace-operations.js +45 -29
  68. package/dist/generated/wspace-operations.js.map +1 -1
  69. package/dist/generated/wspace-types.js.map +1 -1
  70. package/dist/shared/hooks/useTr.js +14 -0
  71. package/dist/shared/hooks/useTr.js.map +1 -0
  72. package/package.json +33 -9
@@ -1,72 +1,69 @@
1
- import { useBotlit as e } from "../providers/BotlitProvider.js";
2
- import { useBots as t } from "../hooks/useBots.js";
3
- import { useAgents as n } from "../hooks/useAgents.js";
4
- import { formatNumber as r } from "../utils/formatters.js";
5
- import { PageLayout as i } from "../components/PageLayout.js";
6
- import { Card as a, CardContent as o, CardHeader as s, CardTitle as c } from "../components/Card.js";
7
- import { Button as l } from "../components/Button.js";
8
- import { StatusBadge as u } from "../components/Badge.js";
9
- import { GlassCard as d, GradientText as f, PagePurpose as p } from "@burdenoff/fe-libs/ui";
10
- import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
11
- import { Link as _ } from "react-router";
12
- import { AppWindow as v, ArrowRight as y, BookOpen as b, Bot as x, Plus as S, Zap as C } from "lucide-react";
13
- import { useI18n as w } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
1
+ import { useTr as e } from "../../shared/hooks/useTr.js";
2
+ import { useBotlit as t } from "../providers/BotlitProvider.js";
3
+ import { useBots as n } from "../hooks/useBots.js";
4
+ import { useAgents as r } from "../hooks/useAgents.js";
5
+ import { formatNumber as i } from "../utils/formatters.js";
6
+ import { PageLayout as a } from "../components/PageLayout.js";
7
+ import { Card as o, CardContent as s, CardHeader as c, CardTitle as l } from "../components/Card.js";
8
+ import { Button as u } from "../components/Button.js";
9
+ import { StatusBadge as d } from "../components/Badge.js";
10
+ import { GlassCard as f, GradientText as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
11
+ import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
12
+ import { Link as v } from "react-router";
13
+ import { AppWindow as y, ArrowRight as b, BookOpen as x, Bot as S, Plus as C, Zap as w } from "lucide-react";
14
14
  //#region src/botlit/pages/DashboardPage.tsx
15
15
  var T = () => {
16
- let { t: T } = w(), E = (e, t) => {
17
- let n = T(e);
18
- return n === e ? t : n;
19
- }, { currentUser: D, navigateTo: O, getPath: k } = e(), { data: A, loading: j } = t(), { data: M, loading: N } = n(), P = [{
20
- label: E("botlit.dashboard.stats.totalBots", "Total Bots"),
21
- value: A?.length || 0,
22
- icon: /* @__PURE__ */ h(v, { className: "h-5 w-5" }),
16
+ let T = e(), { currentUser: E, navigateTo: D, getPath: O } = t(), { data: k, loading: A } = n(), { data: j, loading: M } = r(), N = [{
17
+ label: T("botlit.dashboard.stats.totalBots", "Total Bots"),
18
+ value: k?.length || 0,
19
+ icon: /* @__PURE__ */ g(y, { className: "h-5 w-5" }),
23
20
  hero: !0
24
21
  }, {
25
- label: E("botlit.dashboard.stats.activeAgents", "Active Agents"),
26
- value: M?.filter((e) => e.status === "ACTIVE").length || 0,
27
- icon: /* @__PURE__ */ h(x, { className: "h-5 w-5" }),
22
+ label: T("botlit.dashboard.stats.activeAgents", "Active Agents"),
23
+ value: j?.filter((e) => e.status === "ACTIVE").length || 0,
24
+ icon: /* @__PURE__ */ g(S, { className: "h-5 w-5" }),
28
25
  hero: !1
29
- }], F = D?.name ? D.name.split(" ")[0] : "";
30
- return /* @__PURE__ */ h(i, {
26
+ }], P = E?.name ? E.name.split(" ")[0] : "";
27
+ return /* @__PURE__ */ g(a, {
31
28
  hero: !0,
32
- title: /* @__PURE__ */ g(m, { children: [E("botlit.dashboard.title", "Welcome back"), F ? /* @__PURE__ */ g(m, { children: [", ", /* @__PURE__ */ h(f, { children: F })] }) : null] }),
33
- description: E("botlit.dashboard.description", "Here's an overview of your AI agents and bots"),
34
- actions: /* @__PURE__ */ g("div", {
29
+ title: /* @__PURE__ */ _(h, { children: [T("botlit.dashboard.title", "Welcome back"), P ? /* @__PURE__ */ _(h, { children: [", ", /* @__PURE__ */ g(p, { children: P })] }) : null] }),
30
+ description: T("botlit.dashboard.description", "Here's an overview of your AI agents and bots"),
31
+ actions: /* @__PURE__ */ _("div", {
35
32
  className: "flex gap-2",
36
- children: [/* @__PURE__ */ h(l, {
33
+ children: [/* @__PURE__ */ g(u, {
37
34
  variant: "outline",
38
- leftIcon: /* @__PURE__ */ h(S, { size: 16 }),
39
- onClick: () => O("bots/new"),
40
- children: E("botlit.dashboard.actions.newBot", "New Bot")
41
- }), /* @__PURE__ */ h(l, {
42
- leftIcon: /* @__PURE__ */ h(x, { size: 16 }),
43
- onClick: () => O("agents/new"),
44
- children: E("botlit.dashboard.actions.createAgent", "Create Agent")
35
+ leftIcon: /* @__PURE__ */ g(C, { size: 16 }),
36
+ onClick: () => D("bots/new"),
37
+ children: T("botlit.dashboard.actions.newBot", "New Bot")
38
+ }), /* @__PURE__ */ g(u, {
39
+ leftIcon: /* @__PURE__ */ g(S, { size: 16 }),
40
+ onClick: () => D("agents/new"),
41
+ children: T("botlit.dashboard.actions.createAgent", "Create Agent")
45
42
  })]
46
43
  }),
47
- children: /* @__PURE__ */ g("div", {
44
+ children: /* @__PURE__ */ _("div", {
48
45
  className: "space-y-6",
49
46
  children: [
50
- /* @__PURE__ */ h(p, {
51
- icon: /* @__PURE__ */ h(C, { size: 18 }),
52
- children: E("botlit.dashboard.purpose", "This is your home base — a quick pulse on every bot and agent in your workspace. Glance at the headline numbers, jump back into recent work, and use the quick actions below to start something new. If you are just getting started, create your first agent and connect it to a bot.")
47
+ /* @__PURE__ */ g(m, {
48
+ icon: /* @__PURE__ */ g(w, { size: 18 }),
49
+ children: T("botlit.dashboard.purpose", "This is your home base — a quick pulse on every bot and agent in your workspace. Glance at the headline numbers, jump back into recent work, and use the quick actions below to start something new. If you are just getting started, create your first agent and connect it to a bot.")
53
50
  }),
54
- /* @__PURE__ */ h("div", {
51
+ /* @__PURE__ */ g("div", {
55
52
  className: "grid grid-cols-1 md:grid-cols-2 gap-4",
56
- children: P.map((e) => /* @__PURE__ */ h(a, {
53
+ children: N.map((e) => /* @__PURE__ */ g(o, {
57
54
  treatment: e.hero ? "glass" : "metric",
58
55
  glow: e.hero,
59
- children: /* @__PURE__ */ h(o, {
56
+ children: /* @__PURE__ */ g(s, {
60
57
  className: "pt-6",
61
- children: /* @__PURE__ */ g("div", {
58
+ children: /* @__PURE__ */ _("div", {
62
59
  className: "flex items-center gap-4",
63
- children: [/* @__PURE__ */ h("div", {
60
+ children: [/* @__PURE__ */ g("div", {
64
61
  className: "p-3 rounded-lg bg-[var(--color-accent-soft)] text-text-primary [&>svg]:text-text-primary",
65
62
  children: e.icon
66
- }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
63
+ }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
67
64
  className: "text-2xl font-bold text-text-primary tabular-nums",
68
65
  children: e.value
69
- }), /* @__PURE__ */ h("p", {
66
+ }), /* @__PURE__ */ g("p", {
70
67
  className: "text-sm text-text-secondary",
71
68
  children: e.label
72
69
  })] })]
@@ -74,159 +71,159 @@ var T = () => {
74
71
  })
75
72
  }, e.label))
76
73
  }),
77
- /* @__PURE__ */ g("div", {
74
+ /* @__PURE__ */ _("div", {
78
75
  className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
79
- children: [/* @__PURE__ */ g(a, {
76
+ children: [/* @__PURE__ */ _(o, {
80
77
  treatment: "insight",
81
- children: [/* @__PURE__ */ g(s, {
78
+ children: [/* @__PURE__ */ _(c, {
82
79
  className: "flex flex-row items-center justify-between",
83
- children: [/* @__PURE__ */ h(c, { children: E("botlit.dashboard.recentBots.title", "Recent Bots") }), /* @__PURE__ */ h(l, {
80
+ children: [/* @__PURE__ */ g(l, { children: T("botlit.dashboard.recentBots.title", "Recent Bots") }), /* @__PURE__ */ g(u, {
84
81
  variant: "ghost",
85
82
  size: "sm",
86
- rightIcon: /* @__PURE__ */ h(y, { size: 16 }),
87
- onClick: () => O("bots"),
88
- children: E("botlit.common.viewAll", "View All")
83
+ rightIcon: /* @__PURE__ */ g(b, { size: 16 }),
84
+ onClick: () => D("bots"),
85
+ children: T("botlit.common.viewAll", "View All")
89
86
  })]
90
- }), /* @__PURE__ */ h(o, { children: j ? /* @__PURE__ */ h("div", {
87
+ }), /* @__PURE__ */ g(s, { children: A ? /* @__PURE__ */ g("div", {
91
88
  className: "space-y-3",
92
89
  children: [
93
90
  1,
94
91
  2,
95
92
  3
96
- ].map((e) => /* @__PURE__ */ h("div", { className: "h-16 bg-bg-sunken rounded-lg motion-safe:animate-vc-shimmer" }, e))
97
- }) : A && A.length > 0 ? /* @__PURE__ */ h("div", {
93
+ ].map((e) => /* @__PURE__ */ g("div", { className: "h-16 bg-bg-sunken rounded-lg motion-safe:animate-vc-shimmer" }, e))
94
+ }) : k && k.length > 0 ? /* @__PURE__ */ g("div", {
98
95
  className: "space-y-3",
99
- children: A.slice(0, 4).map((e) => /* @__PURE__ */ g(_, {
100
- to: k(`bots/${e.id}`),
96
+ children: k.slice(0, 4).map((e) => /* @__PURE__ */ _(v, {
97
+ to: O(`bots/${e.id}`),
101
98
  className: "flex items-center justify-between p-3 rounded-lg border border-border-seam hover:border-border-strong hover:bg-accent transition-colors",
102
- children: [/* @__PURE__ */ g("div", {
99
+ children: [/* @__PURE__ */ _("div", {
103
100
  className: "flex items-center gap-3",
104
- children: [/* @__PURE__ */ h("span", {
101
+ children: [/* @__PURE__ */ g("span", {
105
102
  className: "text-2xl",
106
103
  children: e.icon || "🤖"
107
- }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
104
+ }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
108
105
  className: "font-medium text-text-primary",
109
106
  children: e.name
110
- }), /* @__PURE__ */ g("p", {
107
+ }), /* @__PURE__ */ _("p", {
111
108
  className: "text-xs text-text-secondary",
112
109
  children: [
113
110
  e.executionCount || 0,
114
111
  " ",
115
- E("botlit.common.executions", "executions")
112
+ T("botlit.common.executions", "executions")
116
113
  ]
117
114
  })] })]
118
- }), /* @__PURE__ */ h(u, { status: e.status })]
115
+ }), /* @__PURE__ */ g(d, { status: e.status })]
119
116
  }, e.id))
120
- }) : /* @__PURE__ */ g("div", {
117
+ }) : /* @__PURE__ */ _("div", {
121
118
  className: "text-center py-8 text-text-secondary",
122
119
  children: [
123
- /* @__PURE__ */ h(v, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
124
- /* @__PURE__ */ h("p", { children: E("botlit.dashboard.recentBots.emptyTitle", "No bots yet") }),
125
- /* @__PURE__ */ h(l, {
120
+ /* @__PURE__ */ g(y, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
121
+ /* @__PURE__ */ g("p", { children: T("botlit.dashboard.recentBots.emptyTitle", "No bots yet") }),
122
+ /* @__PURE__ */ g(u, {
126
123
  variant: "outline",
127
124
  size: "sm",
128
125
  className: "mt-3",
129
- onClick: () => O("bots/new"),
130
- children: E("botlit.dashboard.recentBots.emptyAction", "Create your first bot")
126
+ onClick: () => D("bots/new"),
127
+ children: T("botlit.dashboard.recentBots.emptyAction", "Create your first bot")
131
128
  })
132
129
  ]
133
130
  }) })]
134
- }), /* @__PURE__ */ g(a, {
131
+ }), /* @__PURE__ */ _(o, {
135
132
  treatment: "insight",
136
- children: [/* @__PURE__ */ g(s, {
133
+ children: [/* @__PURE__ */ _(c, {
137
134
  className: "flex flex-row items-center justify-between",
138
- children: [/* @__PURE__ */ h(c, { children: E("botlit.dashboard.activeAgents.title", "Active Agents") }), /* @__PURE__ */ h(l, {
135
+ children: [/* @__PURE__ */ g(l, { children: T("botlit.dashboard.activeAgents.title", "Active Agents") }), /* @__PURE__ */ g(u, {
139
136
  variant: "ghost",
140
137
  size: "sm",
141
- rightIcon: /* @__PURE__ */ h(y, { size: 16 }),
142
- onClick: () => O("agents"),
143
- children: E("botlit.common.viewAll", "View All")
138
+ rightIcon: /* @__PURE__ */ g(b, { size: 16 }),
139
+ onClick: () => D("agents"),
140
+ children: T("botlit.common.viewAll", "View All")
144
141
  })]
145
- }), /* @__PURE__ */ h(o, { children: N ? /* @__PURE__ */ h("div", {
142
+ }), /* @__PURE__ */ g(s, { children: M ? /* @__PURE__ */ g("div", {
146
143
  className: "space-y-3",
147
144
  children: [
148
145
  1,
149
146
  2,
150
147
  3
151
- ].map((e) => /* @__PURE__ */ h("div", { className: "h-16 bg-bg-sunken rounded-lg motion-safe:animate-vc-shimmer" }, e))
152
- }) : M && M.length > 0 ? /* @__PURE__ */ h("div", {
148
+ ].map((e) => /* @__PURE__ */ g("div", { className: "h-16 bg-bg-sunken rounded-lg motion-safe:animate-vc-shimmer" }, e))
149
+ }) : j && j.length > 0 ? /* @__PURE__ */ g("div", {
153
150
  className: "space-y-3",
154
- children: M.filter((e) => e.status === "ACTIVE").slice(0, 4).map((e) => /* @__PURE__ */ h(_, {
155
- to: k(`agents/${e.id}`),
151
+ children: j.filter((e) => e.status === "ACTIVE").slice(0, 4).map((e) => /* @__PURE__ */ g(v, {
152
+ to: O(`agents/${e.id}`),
156
153
  className: "flex items-center justify-between p-3 rounded-lg border border-border-seam hover:border-border-strong hover:bg-accent transition-colors",
157
- children: /* @__PURE__ */ g("div", {
154
+ children: /* @__PURE__ */ _("div", {
158
155
  className: "flex items-center gap-3",
159
- children: [/* @__PURE__ */ g("span", {
156
+ children: [/* @__PURE__ */ _("span", {
160
157
  className: "relative text-2xl",
161
- children: ["🤖", /* @__PURE__ */ h("span", { className: "absolute -right-0.5 -top-0.5 size-2 rounded-full bg-status-success-text motion-safe:animate-vc-glow-pulse" })]
162
- }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
158
+ children: ["🤖", /* @__PURE__ */ g("span", { className: "absolute -right-0.5 -top-0.5 size-2 rounded-full bg-status-success-text motion-safe:animate-vc-glow-pulse" })]
159
+ }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
163
160
  className: "font-medium text-text-primary",
164
161
  children: e.name
165
- }), /* @__PURE__ */ g("p", {
162
+ }), /* @__PURE__ */ _("p", {
166
163
  className: "text-xs text-text-secondary",
167
164
  children: [
168
- r(e.executionCount ?? 0),
165
+ i(e.executionCount ?? 0),
169
166
  " ",
170
- E("botlit.common.executions", "executions")
167
+ T("botlit.common.executions", "executions")
171
168
  ]
172
169
  })] })]
173
170
  })
174
171
  }, e.id))
175
- }) : /* @__PURE__ */ g("div", {
172
+ }) : /* @__PURE__ */ _("div", {
176
173
  className: "text-center py-8 text-text-secondary",
177
174
  children: [
178
- /* @__PURE__ */ h(x, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
179
- /* @__PURE__ */ h("p", { children: E("botlit.dashboard.activeAgents.emptyTitle", "No active agents") }),
180
- /* @__PURE__ */ h(l, {
175
+ /* @__PURE__ */ g(S, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
176
+ /* @__PURE__ */ g("p", { children: T("botlit.dashboard.activeAgents.emptyTitle", "No active agents") }),
177
+ /* @__PURE__ */ g(u, {
181
178
  variant: "outline",
182
179
  size: "sm",
183
180
  className: "mt-3",
184
- onClick: () => O("agents/new"),
185
- children: E("botlit.dashboard.activeAgents.emptyAction", "Create your first agent")
181
+ onClick: () => D("agents/new"),
182
+ children: T("botlit.dashboard.activeAgents.emptyAction", "Create your first agent")
186
183
  })
187
184
  ]
188
185
  }) })]
189
186
  })]
190
187
  }),
191
- /* @__PURE__ */ g(d, {
188
+ /* @__PURE__ */ _(f, {
192
189
  treatment: "plain",
193
190
  className: "border-border-seam p-6",
194
- children: [/* @__PURE__ */ h("h2", {
191
+ children: [/* @__PURE__ */ g("h2", {
195
192
  className: "text-lg font-semibold tracking-tight text-text-primary",
196
- children: E("botlit.dashboard.quickActions.title", "Quick Actions")
197
- }), /* @__PURE__ */ g("div", {
193
+ children: T("botlit.dashboard.quickActions.title", "Quick Actions")
194
+ }), /* @__PURE__ */ _("div", {
198
195
  className: "mt-4 grid grid-cols-2 md:grid-cols-4 gap-4",
199
196
  children: [
200
- /* @__PURE__ */ g(_, {
201
- to: k("bots/new"),
197
+ /* @__PURE__ */ _(v, {
198
+ to: O("bots/new"),
202
199
  className: "flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]",
203
- children: [/* @__PURE__ */ h(v, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ h("span", {
200
+ children: [/* @__PURE__ */ g(y, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ g("span", {
204
201
  className: "text-sm font-medium",
205
- children: E("botlit.dashboard.quickActions.createBot", "Create Bot")
202
+ children: T("botlit.dashboard.quickActions.createBot", "Create Bot")
206
203
  })]
207
204
  }),
208
- /* @__PURE__ */ g(_, {
209
- to: k("agents/new"),
205
+ /* @__PURE__ */ _(v, {
206
+ to: O("agents/new"),
210
207
  className: "flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]",
211
- children: [/* @__PURE__ */ h(x, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ h("span", {
208
+ children: [/* @__PURE__ */ g(S, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ g("span", {
212
209
  className: "text-sm font-medium",
213
- children: E("botlit.dashboard.quickActions.buildAgent", "Build Agent")
210
+ children: T("botlit.dashboard.quickActions.buildAgent", "Build Agent")
214
211
  })]
215
212
  }),
216
- /* @__PURE__ */ g(_, {
217
- to: k("knowledge/new"),
213
+ /* @__PURE__ */ _(v, {
214
+ to: O("knowledge/new"),
218
215
  className: "flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]",
219
- children: [/* @__PURE__ */ h(b, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ h("span", {
216
+ children: [/* @__PURE__ */ g(x, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ g("span", {
220
217
  className: "text-sm font-medium",
221
- children: E("botlit.dashboard.quickActions.addKnowledge", "Add Knowledge")
218
+ children: T("botlit.dashboard.quickActions.addKnowledge", "Add Knowledge")
222
219
  })]
223
220
  }),
224
- /* @__PURE__ */ g("a", {
221
+ /* @__PURE__ */ _("a", {
225
222
  href: "/conversations",
226
223
  className: "flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]",
227
- children: [/* @__PURE__ */ h(C, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ h("span", {
224
+ children: [/* @__PURE__ */ g(w, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ g("span", {
228
225
  className: "text-sm font-medium",
229
- children: E("botlit.dashboard.quickActions.quickChat", "Quick Chat")
226
+ children: T("botlit.dashboard.quickActions.quickChat", "Quick Chat")
230
227
  })]
231
228
  })
232
229
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/botlit/pages/DashboardPage.tsx"],"sourcesContent":["/**\n * Dashboard Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { Link } from 'react-router';\nimport { AppWindow, Bot, BookOpen, Zap, ArrowRight, Plus } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { GradientText, GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { StatusBadge } from '../components/Badge';\nimport { useBots } from '../hooks/useBots';\nimport { useAgents } from '../hooks/useAgents';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatNumber } from '../utils/formatters';\n\nexport const DashboardPage: FC = () => {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { currentUser, navigateTo, getPath } = useBotlit();\n const { data: bots, loading: botsLoading } = useBots();\n const { data: agents, loading: agentsLoading } = useAgents();\n\n const stats = [\n {\n label: t('botlit.dashboard.stats.totalBots', 'Total Bots'),\n value: bots?.length || 0,\n icon: <AppWindow className=\"h-5 w-5\" />,\n hero: true,\n },\n {\n label: t('botlit.dashboard.stats.activeAgents', 'Active Agents'),\n value: agents?.filter((a: { status: string }) => a.status === 'ACTIVE').length || 0,\n icon: <Bot className=\"h-5 w-5\" />,\n hero: false,\n },\n ];\n\n const firstName = currentUser?.name ? currentUser.name.split(' ')[0] : '';\n\n return (\n <PageLayout\n hero\n title={\n <>\n {t('botlit.dashboard.title', 'Welcome back')}\n {firstName ? (\n <>\n , <GradientText>{firstName}</GradientText>\n </>\n ) : null}\n </>\n }\n description={t(\n 'botlit.dashboard.description',\n \"Here's an overview of your AI agents and bots\"\n )}\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n leftIcon={<Plus size={16} />}\n onClick={() => navigateTo('bots/new')}\n >\n {t('botlit.dashboard.actions.newBot', 'New Bot')}\n </Button>\n <Button leftIcon={<Bot size={16} />} onClick={() => navigateTo('agents/new')}>\n {t('botlit.dashboard.actions.createAgent', 'Create Agent')}\n </Button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Zap size={18} />}>\n {t(\n 'botlit.dashboard.purpose',\n 'This is your home base — a quick pulse on every bot and agent in your workspace. Glance at the headline numbers, jump back into recent work, and use the quick actions below to start something new. If you are just getting started, create your first agent and connect it to a bot.'\n )}\n </PagePurpose>\n\n {/* Stats Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {stats.map((stat) => (\n <Card key={stat.label} treatment={stat.hero ? 'glass' : 'metric'} glow={stat.hero}>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center gap-4\">\n <div className=\"p-3 rounded-lg bg-[var(--color-accent-soft)] text-text-primary [&>svg]:text-text-primary\">\n {stat.icon}\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary tabular-nums\">\n {stat.value}\n </p>\n <p className=\"text-sm text-text-secondary\">{stat.label}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n {/* Main Content Grid */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Recent Bots */}\n <Card treatment=\"insight\">\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle>{t('botlit.dashboard.recentBots.title', 'Recent Bots')}</CardTitle>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n rightIcon={<ArrowRight size={16} />}\n onClick={() => navigateTo('bots')}\n >\n {t('botlit.common.viewAll', 'View All')}\n </Button>\n </CardHeader>\n <CardContent>\n {botsLoading ? (\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-16 bg-bg-sunken rounded-lg motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : bots && bots.length > 0 ? (\n <div className=\"space-y-3\">\n {bots.slice(0, 4).map((bot) => (\n <Link\n key={bot.id}\n to={getPath(`bots/${bot.id}`)}\n className=\"flex items-center justify-between p-3 rounded-lg border border-border-seam hover:border-border-strong hover:bg-accent transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <span className=\"text-2xl\">{bot.icon || '🤖'}</span>\n <div>\n <p className=\"font-medium text-text-primary\">{bot.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {bot.executionCount || 0} {t('botlit.common.executions', 'executions')}\n </p>\n </div>\n </div>\n <StatusBadge status={bot.status} />\n </Link>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-8 text-text-secondary\">\n <AppWindow className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>{t('botlit.dashboard.recentBots.emptyTitle', 'No bots yet')}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-3\"\n onClick={() => navigateTo('bots/new')}\n >\n {t('botlit.dashboard.recentBots.emptyAction', 'Create your first bot')}\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Active Agents */}\n <Card treatment=\"insight\">\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle>{t('botlit.dashboard.activeAgents.title', 'Active Agents')}</CardTitle>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n rightIcon={<ArrowRight size={16} />}\n onClick={() => navigateTo('agents')}\n >\n {t('botlit.common.viewAll', 'View All')}\n </Button>\n </CardHeader>\n <CardContent>\n {agentsLoading ? (\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-16 bg-bg-sunken rounded-lg motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : agents && agents.length > 0 ? (\n <div className=\"space-y-3\">\n {agents\n .filter((a) => a.status === 'ACTIVE')\n .slice(0, 4)\n .map((agent) => (\n <Link\n key={agent.id}\n to={getPath(`agents/${agent.id}`)}\n className=\"flex items-center justify-between p-3 rounded-lg border border-border-seam hover:border-border-strong hover:bg-accent transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <span className=\"relative text-2xl\">\n 🤖\n <span className=\"absolute -right-0.5 -top-0.5 size-2 rounded-full bg-status-success-text motion-safe:animate-vc-glow-pulse\" />\n </span>\n <div>\n <p className=\"font-medium text-text-primary\">{agent.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatNumber(agent.executionCount ?? 0)}{' '}\n {t('botlit.common.executions', 'executions')}\n </p>\n </div>\n </div>\n </Link>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-8 text-text-secondary\">\n <Bot className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>{t('botlit.dashboard.activeAgents.emptyTitle', 'No active agents')}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-3\"\n onClick={() => navigateTo('agents/new')}\n >\n {t('botlit.dashboard.activeAgents.emptyAction', 'Create your first agent')}\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n\n {/* Quick Actions */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <h2 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.dashboard.quickActions.title', 'Quick Actions')}\n </h2>\n <div className=\"mt-4 grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Link\n to={getPath('bots/new')}\n className=\"flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]\"\n >\n <AppWindow className=\"h-8 w-8 text-text-secondary\" />\n <span className=\"text-sm font-medium\">\n {t('botlit.dashboard.quickActions.createBot', 'Create Bot')}\n </span>\n </Link>\n <Link\n to={getPath('agents/new')}\n className=\"flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]\"\n >\n <Bot className=\"h-8 w-8 text-text-secondary\" />\n <span className=\"text-sm font-medium\">\n {t('botlit.dashboard.quickActions.buildAgent', 'Build Agent')}\n </span>\n </Link>\n <Link\n to={getPath('knowledge/new')}\n className=\"flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]\"\n >\n <BookOpen className=\"h-8 w-8 text-text-secondary\" />\n <span className=\"text-sm font-medium\">\n {t('botlit.dashboard.quickActions.addKnowledge', 'Add Knowledge')}\n </span>\n </Link>\n <a\n href=\"/conversations\"\n className=\"flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]\"\n >\n <Zap className=\"h-8 w-8 text-text-secondary\" />\n <span className=\"text-sm font-medium\">\n {t('botlit.dashboard.quickActions.quickChat', 'Quick Chat')}\n </span>\n </a>\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/botlit/pages/DashboardPage.tsx"],"sourcesContent":["/**\n * Dashboard Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { Link } from 'react-router';\nimport { AppWindow, Bot, BookOpen, Zap, ArrowRight, Plus } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { GradientText, GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { StatusBadge } from '../components/Badge';\nimport { useBots } from '../hooks/useBots';\nimport { useAgents } from '../hooks/useAgents';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatNumber } from '../utils/formatters';\n\nexport const DashboardPage: FC = () => {\n const t = useTr();\n const { currentUser, navigateTo, getPath } = useBotlit();\n const { data: bots, loading: botsLoading } = useBots();\n const { data: agents, loading: agentsLoading } = useAgents();\n\n const stats = [\n {\n label: t('botlit.dashboard.stats.totalBots', 'Total Bots'),\n value: bots?.length || 0,\n icon: <AppWindow className=\"h-5 w-5\" />,\n hero: true,\n },\n {\n label: t('botlit.dashboard.stats.activeAgents', 'Active Agents'),\n value: agents?.filter((a: { status: string }) => a.status === 'ACTIVE').length || 0,\n icon: <Bot className=\"h-5 w-5\" />,\n hero: false,\n },\n ];\n\n const firstName = currentUser?.name ? currentUser.name.split(' ')[0] : '';\n\n return (\n <PageLayout\n hero\n title={\n <>\n {t('botlit.dashboard.title', 'Welcome back')}\n {firstName ? (\n <>\n , <GradientText>{firstName}</GradientText>\n </>\n ) : null}\n </>\n }\n description={t(\n 'botlit.dashboard.description',\n \"Here's an overview of your AI agents and bots\"\n )}\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n leftIcon={<Plus size={16} />}\n onClick={() => navigateTo('bots/new')}\n >\n {t('botlit.dashboard.actions.newBot', 'New Bot')}\n </Button>\n <Button leftIcon={<Bot size={16} />} onClick={() => navigateTo('agents/new')}>\n {t('botlit.dashboard.actions.createAgent', 'Create Agent')}\n </Button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Zap size={18} />}>\n {t(\n 'botlit.dashboard.purpose',\n 'This is your home base — a quick pulse on every bot and agent in your workspace. Glance at the headline numbers, jump back into recent work, and use the quick actions below to start something new. If you are just getting started, create your first agent and connect it to a bot.'\n )}\n </PagePurpose>\n\n {/* Stats Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {stats.map((stat) => (\n <Card key={stat.label} treatment={stat.hero ? 'glass' : 'metric'} glow={stat.hero}>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center gap-4\">\n <div className=\"p-3 rounded-lg bg-[var(--color-accent-soft)] text-text-primary [&>svg]:text-text-primary\">\n {stat.icon}\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary tabular-nums\">\n {stat.value}\n </p>\n <p className=\"text-sm text-text-secondary\">{stat.label}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n {/* Main Content Grid */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Recent Bots */}\n <Card treatment=\"insight\">\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle>{t('botlit.dashboard.recentBots.title', 'Recent Bots')}</CardTitle>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n rightIcon={<ArrowRight size={16} />}\n onClick={() => navigateTo('bots')}\n >\n {t('botlit.common.viewAll', 'View All')}\n </Button>\n </CardHeader>\n <CardContent>\n {botsLoading ? (\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-16 bg-bg-sunken rounded-lg motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : bots && bots.length > 0 ? (\n <div className=\"space-y-3\">\n {bots.slice(0, 4).map((bot) => (\n <Link\n key={bot.id}\n to={getPath(`bots/${bot.id}`)}\n className=\"flex items-center justify-between p-3 rounded-lg border border-border-seam hover:border-border-strong hover:bg-accent transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <span className=\"text-2xl\">{bot.icon || '🤖'}</span>\n <div>\n <p className=\"font-medium text-text-primary\">{bot.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {bot.executionCount || 0} {t('botlit.common.executions', 'executions')}\n </p>\n </div>\n </div>\n <StatusBadge status={bot.status} />\n </Link>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-8 text-text-secondary\">\n <AppWindow className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>{t('botlit.dashboard.recentBots.emptyTitle', 'No bots yet')}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-3\"\n onClick={() => navigateTo('bots/new')}\n >\n {t('botlit.dashboard.recentBots.emptyAction', 'Create your first bot')}\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Active Agents */}\n <Card treatment=\"insight\">\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle>{t('botlit.dashboard.activeAgents.title', 'Active Agents')}</CardTitle>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n rightIcon={<ArrowRight size={16} />}\n onClick={() => navigateTo('agents')}\n >\n {t('botlit.common.viewAll', 'View All')}\n </Button>\n </CardHeader>\n <CardContent>\n {agentsLoading ? (\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-16 bg-bg-sunken rounded-lg motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : agents && agents.length > 0 ? (\n <div className=\"space-y-3\">\n {agents\n .filter((a) => a.status === 'ACTIVE')\n .slice(0, 4)\n .map((agent) => (\n <Link\n key={agent.id}\n to={getPath(`agents/${agent.id}`)}\n className=\"flex items-center justify-between p-3 rounded-lg border border-border-seam hover:border-border-strong hover:bg-accent transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <span className=\"relative text-2xl\">\n 🤖\n <span className=\"absolute -right-0.5 -top-0.5 size-2 rounded-full bg-status-success-text motion-safe:animate-vc-glow-pulse\" />\n </span>\n <div>\n <p className=\"font-medium text-text-primary\">{agent.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatNumber(agent.executionCount ?? 0)}{' '}\n {t('botlit.common.executions', 'executions')}\n </p>\n </div>\n </div>\n </Link>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-8 text-text-secondary\">\n <Bot className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>{t('botlit.dashboard.activeAgents.emptyTitle', 'No active agents')}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-3\"\n onClick={() => navigateTo('agents/new')}\n >\n {t('botlit.dashboard.activeAgents.emptyAction', 'Create your first agent')}\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n\n {/* Quick Actions */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <h2 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.dashboard.quickActions.title', 'Quick Actions')}\n </h2>\n <div className=\"mt-4 grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Link\n to={getPath('bots/new')}\n className=\"flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]\"\n >\n <AppWindow className=\"h-8 w-8 text-text-secondary\" />\n <span className=\"text-sm font-medium\">\n {t('botlit.dashboard.quickActions.createBot', 'Create Bot')}\n </span>\n </Link>\n <Link\n to={getPath('agents/new')}\n className=\"flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]\"\n >\n <Bot className=\"h-8 w-8 text-text-secondary\" />\n <span className=\"text-sm font-medium\">\n {t('botlit.dashboard.quickActions.buildAgent', 'Build Agent')}\n </span>\n </Link>\n <Link\n to={getPath('knowledge/new')}\n className=\"flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]\"\n >\n <BookOpen className=\"h-8 w-8 text-text-secondary\" />\n <span className=\"text-sm font-medium\">\n {t('botlit.dashboard.quickActions.addKnowledge', 'Add Knowledge')}\n </span>\n </Link>\n <a\n href=\"/conversations\"\n className=\"flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]\"\n >\n <Zap className=\"h-8 w-8 text-text-secondary\" />\n <span className=\"text-sm font-medium\">\n {t('botlit.dashboard.quickActions.quickChat', 'Quick Chat')}\n </span>\n </a>\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}