@burdenoff/microfe-botmanor 2026.1027.2 → 2026.1028.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 (91) hide show
  1. package/dist/botlit/BotlitRoutes.js +142 -132
  2. package/dist/botlit/BotlitRoutes.js.map +1 -1
  3. package/dist/botlit/components/AgentApprovalPanel.js +144 -126
  4. package/dist/botlit/components/AgentApprovalPanel.js.map +1 -1
  5. package/dist/botlit/components/ModelRegistrationPanel.js +4 -4
  6. package/dist/botlit/components/RetentionStatusPanel.js +95 -0
  7. package/dist/botlit/components/RetentionStatusPanel.js.map +1 -0
  8. package/dist/botlit/components/VersionHistoryPanel.js +92 -83
  9. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
  10. package/dist/botlit/hooks/index.js +1 -0
  11. package/dist/botlit/hooks/useRetention.js +31 -0
  12. package/dist/botlit/hooks/useRetention.js.map +1 -0
  13. package/dist/botlit/pages/A2AAgentDetailPage.js +212 -203
  14. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  15. package/dist/botlit/pages/A2ARegistryPage.js +129 -117
  16. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
  17. package/dist/botlit/pages/AgentApprovalsPage.js +122 -110
  18. package/dist/botlit/pages/AgentApprovalsPage.js.map +1 -1
  19. package/dist/botlit/pages/AgentBuilderPage.js +18 -18
  20. package/dist/botlit/pages/AgentDetailPage.js +298 -273
  21. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  22. package/dist/botlit/pages/AgentsListPage.js +145 -121
  23. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  24. package/dist/botlit/pages/BotChannelsTab.js +238 -226
  25. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  26. package/dist/botlit/pages/BotDetailPage.js +307 -288
  27. package/dist/botlit/pages/BotDetailPage.js.map +1 -1
  28. package/dist/botlit/pages/BotWorkflowTab.js +125 -116
  29. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
  30. package/dist/botlit/pages/BotsListPage.js +159 -144
  31. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  32. package/dist/botlit/pages/BucketsPage.js +279 -258
  33. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  34. package/dist/botlit/pages/ChannelDetailPage.js +346 -328
  35. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  36. package/dist/botlit/pages/ChannelRoutesPage.js +10 -10
  37. package/dist/botlit/pages/ChannelsPage.js +163 -148
  38. package/dist/botlit/pages/ChannelsPage.js.map +1 -1
  39. package/dist/botlit/pages/DashboardPage.js +129 -114
  40. package/dist/botlit/pages/DashboardPage.js.map +1 -1
  41. package/dist/botlit/pages/ExecutionDetailPage.js +145 -139
  42. package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -1
  43. package/dist/botlit/pages/ExecutionsPage.js +14 -14
  44. package/dist/botlit/pages/InstalledPackagesPage.js +245 -227
  45. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  46. package/dist/botlit/pages/KnowledgeBaseDetailPage.js +168 -156
  47. package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -1
  48. package/dist/botlit/pages/KnowledgeBasesPage.js +91 -79
  49. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
  50. package/dist/botlit/pages/MCPServerDetailPage.js +200 -188
  51. package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
  52. package/dist/botlit/pages/MCPServersPage.js +170 -155
  53. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  54. package/dist/botlit/pages/PoliciesPage.js +115 -104
  55. package/dist/botlit/pages/PoliciesPage.js.map +1 -1
  56. package/dist/botlit/pages/PolicyDetailPage.js +368 -324
  57. package/dist/botlit/pages/PolicyDetailPage.js.map +1 -1
  58. package/dist/botlit/pages/PromptStudioPage.js +106 -97
  59. package/dist/botlit/pages/PromptStudioPage.js.map +1 -1
  60. package/dist/botlit/pages/PromptTemplateDetailPage.js +359 -347
  61. package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -1
  62. package/dist/botlit/pages/PromptTemplatesPage.js +127 -112
  63. package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -1
  64. package/dist/botlit/pages/RetrievalProfileDetailPage.js +219 -210
  65. package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -1
  66. package/dist/botlit/pages/RetrievalProfilesPage.js +112 -103
  67. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
  68. package/dist/botlit/pages/SettingsPage.js +264 -252
  69. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  70. package/dist/botlit/pages/SkillDetailPage.js +235 -226
  71. package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
  72. package/dist/botlit/pages/SkillsPage.js +115 -106
  73. package/dist/botlit/pages/SkillsPage.js.map +1 -1
  74. package/dist/botlit/pages/StorePackageDetailPage.js +194 -188
  75. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
  76. package/dist/botlit/pages/StorePage.js +161 -155
  77. package/dist/botlit/pages/StorePage.js.map +1 -1
  78. package/dist/botlit/permissions/PermissionRequired.js +45 -0
  79. package/dist/botlit/permissions/PermissionRequired.js.map +1 -0
  80. package/dist/botlit/permissions/botmanorPermissions.js +72 -0
  81. package/dist/botlit/permissions/botmanorPermissions.js.map +1 -0
  82. package/dist/botlit/permissions/index.js +3 -0
  83. package/dist/botlit/permissions/useBotmanorPermissions.js +19 -0
  84. package/dist/botlit/permissions/useBotmanorPermissions.js.map +1 -0
  85. package/dist/botlit/utils/policyConfig.js +67 -42
  86. package/dist/botlit/utils/policyConfig.js.map +1 -1
  87. package/dist/generated/global-types.js.map +1 -1
  88. package/dist/generated/wspace-operations.js +90 -54
  89. package/dist/generated/wspace-operations.js.map +1 -1
  90. package/dist/generated/wspace-types.js.map +1 -1
  91. package/package.json +1 -1
@@ -1,34 +1,38 @@
1
1
  import { useTr as e } from "../../shared/hooks/useTr.js";
2
2
  import { useBotlit as t } from "../providers/BotlitProvider.js";
3
3
  import { formatRelativeTime as n } from "../utils/formatters.js";
4
- import { PageLayout as r } from "../components/PageLayout.js";
5
- import { Card as i, CardContent as a, CardHeader as o, CardTitle as s } from "../components/Card.js";
6
- import { Button as c } from "../components/Button.js";
7
- import { Badge as l, StatusBadge as u } from "../components/Badge.js";
8
- import { EmptyState as d } from "../components/EmptyState.js";
9
- import { Input as f } from "../components/Input.js";
10
- import { ErrorState as p } from "../components/ErrorState.js";
11
- import { usePolicies as m } from "../hooks/usePolicies.js";
4
+ import { BOTMANOR_PERMISSIONS as r } from "../permissions/botmanorPermissions.js";
5
+ import { BotmanorPermissionGate as i } from "../permissions/useBotmanorPermissions.js";
6
+ import { PageLayout as a } from "../components/PageLayout.js";
7
+ import { Button as o } from "../components/Button.js";
8
+ import "../permissions/index.js";
9
+ import { Card as s, CardContent as c, CardHeader as l, CardTitle as u } from "../components/Card.js";
10
+ import { Badge as d, StatusBadge as f } from "../components/Badge.js";
11
+ import { EmptyState as p } from "../components/EmptyState.js";
12
+ import { Input as m } from "../components/Input.js";
13
+ import { ErrorState as h } from "../components/ErrorState.js";
14
+ import { usePolicies as g } from "../hooks/usePolicies.js";
12
15
  import "../hooks/index.js";
13
- import { useState as h } from "react";
14
- import { GlassCard as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
15
- import { jsx as v, jsxs as y } from "react/jsx-runtime";
16
- import { Link as b } from "react-router";
17
- import { AlertTriangle as x, Clock as S, Database as C, DollarSign as w, Filter as T, MessageSquare as E, Plus as D, Search as O, Shield as k, Trash2 as A, Wrench as j } from "lucide-react";
16
+ import { RetentionStatusPanel as _ } from "../components/RetentionStatusPanel.js";
17
+ import { useState as v } from "react";
18
+ import { GlassCard as y, PagePurpose as b } from "@burdenoff/fe-libs/ui";
19
+ import { jsx as x, jsxs as S } from "react/jsx-runtime";
20
+ import { Link as C } from "react-router";
21
+ import { AlertTriangle as w, Clock as T, Database as E, DollarSign as D, Filter as O, MessageSquare as k, Plus as A, Search as j, Shield as M, Trash2 as N, Wrench as P } from "lucide-react";
18
22
  //#region src/botlit/pages/PoliciesPage.tsx
19
- var M = ({ type: e, className: t }) => {
23
+ var F = ({ type: e, className: t }) => {
20
24
  switch (e) {
21
- case "CONTENT": return /* @__PURE__ */ v(x, { className: t });
22
- case "TOOL": return /* @__PURE__ */ v(j, { className: t });
23
- case "DATA": return /* @__PURE__ */ v(C, { className: t });
24
- case "RESPONSE": return /* @__PURE__ */ v(E, { className: t });
25
- case "BUDGET": return /* @__PURE__ */ v(w, { className: t });
26
- case "RATE_LIMIT": return /* @__PURE__ */ v(S, { className: t });
27
- case "RETENTION": return /* @__PURE__ */ v(A, { className: t });
28
- default: return /* @__PURE__ */ v(k, { className: t });
25
+ case "CONTENT": return /* @__PURE__ */ x(w, { className: t });
26
+ case "TOOL": return /* @__PURE__ */ x(P, { className: t });
27
+ case "DATA": return /* @__PURE__ */ x(E, { className: t });
28
+ case "RESPONSE": return /* @__PURE__ */ x(k, { className: t });
29
+ case "BUDGET": return /* @__PURE__ */ x(D, { className: t });
30
+ case "RATE_LIMIT": return /* @__PURE__ */ x(T, { className: t });
31
+ case "RETENTION": return /* @__PURE__ */ x(N, { className: t });
32
+ default: return /* @__PURE__ */ x(M, { className: t });
29
33
  }
30
34
  };
31
- function N(e) {
35
+ function I(e) {
32
36
  return {
33
37
  CONTENT: e("botlit.policies.typeLabel.CONTENT", "Content Safety"),
34
38
  TOOL: e("botlit.policies.typeLabel.TOOL", "Tool Access"),
@@ -39,32 +43,36 @@ function N(e) {
39
43
  RETENTION: e("botlit.policies.typeLabel.RETENTION", "Data Retention")
40
44
  };
41
45
  }
42
- var P = () => {
43
- let x = e(), { getPath: S } = t(), [C, w] = h(""), [E, A] = h(null), { data: j, loading: P, error: F, refetch: I } = m({ search: C }), L = N(x), R = E ? j.filter((e) => e.type === E) : j;
44
- return /* @__PURE__ */ v(r, {
45
- title: x("botlit.policies.title", "Policies & Guardrails"),
46
- description: x("botlit.policies.description", "Configure safety rules, access controls, and operational limits"),
47
- actions: /* @__PURE__ */ v(c, {
48
- leftIcon: /* @__PURE__ */ v(D, { size: 16 }),
49
- children: /* @__PURE__ */ v(b, {
50
- to: S("policies/new"),
51
- children: x("botlit.policies.actions.createPolicy", "Create Policy")
46
+ var L = () => {
47
+ let w = e(), { getPath: T } = t(), [E, D] = v(""), [k, N] = v(null), { data: P, loading: L, error: R, refetch: z } = g({ search: E }), B = I(w), V = k ? P.filter((e) => e.type === k) : P;
48
+ return /* @__PURE__ */ x(a, {
49
+ title: w("botlit.policies.title", "Policies & Guardrails"),
50
+ description: w("botlit.policies.description", "Configure safety rules, access controls, and operational limits"),
51
+ actions: /* @__PURE__ */ x(i, {
52
+ permission: r.POLICY_CREATE,
53
+ children: /* @__PURE__ */ x(o, {
54
+ leftIcon: /* @__PURE__ */ x(A, { size: 16 }),
55
+ children: /* @__PURE__ */ x(C, {
56
+ to: T("policies/new"),
57
+ children: w("botlit.policies.actions.createPolicy", "Create Policy")
58
+ })
52
59
  })
53
60
  }),
54
- children: /* @__PURE__ */ y("div", {
61
+ children: /* @__PURE__ */ S("div", {
55
62
  className: "space-y-6",
56
63
  children: [
57
- /* @__PURE__ */ v(_, {
58
- icon: /* @__PURE__ */ v(k, { size: 18 }),
59
- children: x("botlit.policies.purpose", "Policies are the guardrails that keep your agents safe and within budget. Each policy enforces one kind of rule — blocking harmful content or PII, restricting which tools an agent may call, capping token spend, or rate-limiting requests. Define policies here and attach them to agents so every execution stays compliant and predictable.")
64
+ /* @__PURE__ */ x(b, {
65
+ icon: /* @__PURE__ */ x(M, { size: 18 }),
66
+ children: w("botlit.policies.purpose", "Policies are the guardrails that keep your agents safe and within budget. Each policy enforces one kind of rule — blocking harmful content or PII, restricting which tools an agent may call, capping token spend, or rate-limiting requests. Define policies here and attach them to agents so every execution stays compliant and predictable.")
60
67
  }),
61
- /* @__PURE__ */ y("div", {
68
+ /* @__PURE__ */ x(_, {}),
69
+ /* @__PURE__ */ S("div", {
62
70
  className: "flex flex-wrap gap-2",
63
- children: [/* @__PURE__ */ v(c, {
64
- variant: E === null ? "default" : "outline",
71
+ children: [/* @__PURE__ */ x(o, {
72
+ variant: k === null ? "default" : "outline",
65
73
  size: "sm",
66
- onClick: () => A(null),
67
- children: x("botlit.store.filters.all", "All")
74
+ onClick: () => N(null),
75
+ children: w("botlit.store.filters.all", "All")
68
76
  }), [
69
77
  "CONTENT",
70
78
  "TOOL",
@@ -73,34 +81,34 @@ var P = () => {
73
81
  "BUDGET",
74
82
  "RATE_LIMIT",
75
83
  "RETENTION"
76
- ].map((e) => /* @__PURE__ */ v(c, {
77
- variant: E === e ? "default" : "outline",
84
+ ].map((e) => /* @__PURE__ */ x(o, {
85
+ variant: k === e ? "default" : "outline",
78
86
  size: "sm",
79
- onClick: () => A(e),
80
- leftIcon: /* @__PURE__ */ v(M, {
87
+ onClick: () => N(e),
88
+ leftIcon: /* @__PURE__ */ x(F, {
81
89
  type: e,
82
90
  className: "h-4 w-4"
83
91
  }),
84
- children: L[e]
92
+ children: B[e]
85
93
  }, e))]
86
94
  }),
87
- /* @__PURE__ */ y("div", {
95
+ /* @__PURE__ */ S("div", {
88
96
  className: "flex items-center gap-4",
89
- children: [/* @__PURE__ */ y("div", {
97
+ children: [/* @__PURE__ */ S("div", {
90
98
  className: "relative flex-1 max-w-md",
91
- children: [/* @__PURE__ */ v(O, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ v(f, {
92
- placeholder: x("botlit.policies.searchPlaceholder", "Search policies..."),
93
- value: C,
94
- onChange: (e) => w(e.target.value),
99
+ children: [/* @__PURE__ */ x(j, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ x(m, {
100
+ placeholder: w("botlit.policies.searchPlaceholder", "Search policies..."),
101
+ value: E,
102
+ onChange: (e) => D(e.target.value),
95
103
  className: "pl-9"
96
104
  })]
97
- }), /* @__PURE__ */ v(c, {
105
+ }), /* @__PURE__ */ x(o, {
98
106
  variant: "outline",
99
- leftIcon: /* @__PURE__ */ v(T, { size: 16 }),
100
- children: x("botlit.policies.actions.moreFilters", "More Filters")
107
+ leftIcon: /* @__PURE__ */ x(O, { size: 16 }),
108
+ children: w("botlit.policies.actions.moreFilters", "More Filters")
101
109
  })]
102
110
  }),
103
- P ? /* @__PURE__ */ v("div", {
111
+ L ? /* @__PURE__ */ x("div", {
104
112
  className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
105
113
  children: [
106
114
  1,
@@ -109,47 +117,47 @@ var P = () => {
109
117
  4,
110
118
  5,
111
119
  6
112
- ].map((e) => /* @__PURE__ */ v("div", { className: "h-40 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
113
- }) : F ? /* @__PURE__ */ v(p, {
120
+ ].map((e) => /* @__PURE__ */ x("div", { className: "h-40 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
121
+ }) : R ? /* @__PURE__ */ x(h, {
114
122
  resource: "policies",
115
- error: F,
116
- onRetry: () => void I()
117
- }) : R.length > 0 ? /* @__PURE__ */ v("div", {
123
+ error: R,
124
+ onRetry: () => void z()
125
+ }) : V.length > 0 ? /* @__PURE__ */ x("div", {
118
126
  className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
119
- children: R.map((e) => /* @__PURE__ */ v(b, {
120
- to: S(`policies/${e.id}`),
121
- children: /* @__PURE__ */ y(i, {
127
+ children: V.map((e) => /* @__PURE__ */ x(C, {
128
+ to: T(`policies/${e.id}`),
129
+ children: /* @__PURE__ */ S(s, {
122
130
  className: "h-full hover:border-primary/50 transition-colors cursor-pointer",
123
- children: [/* @__PURE__ */ v(o, {
131
+ children: [/* @__PURE__ */ x(l, {
124
132
  className: "pb-2",
125
- children: /* @__PURE__ */ y("div", {
133
+ children: /* @__PURE__ */ S("div", {
126
134
  className: "flex items-start justify-between",
127
- children: [/* @__PURE__ */ y("div", {
135
+ children: [/* @__PURE__ */ S("div", {
128
136
  className: "flex items-center gap-3",
129
- children: [/* @__PURE__ */ v("div", {
137
+ children: [/* @__PURE__ */ x("div", {
130
138
  className: `p-2 rounded-lg ${e.type === "CONTENT" ? "bg-status-error-bg-subtle" : e.type === "TOOL" ? "bg-status-info-bg-subtle" : e.type === "BUDGET" ? "bg-status-warning-bg-subtle" : "bg-action-primary-bg/10"}`,
131
- children: /* @__PURE__ */ v(M, {
139
+ children: /* @__PURE__ */ x(F, {
132
140
  type: e.type,
133
141
  className: `h-5 w-5 ${e.type === "CONTENT" ? "text-status-error-text" : e.type === "TOOL" ? "text-status-info-text" : e.type === "BUDGET" ? "text-status-warning-text" : "text-primary"}`
134
142
  })
135
- }), /* @__PURE__ */ v("div", { children: /* @__PURE__ */ v(s, {
143
+ }), /* @__PURE__ */ x("div", { children: /* @__PURE__ */ x(u, {
136
144
  className: "text-base",
137
145
  children: e.name
138
146
  }) })]
139
- }), /* @__PURE__ */ v(u, { status: e.status })]
147
+ }), /* @__PURE__ */ x(f, { status: e.status })]
140
148
  })
141
- }), /* @__PURE__ */ v(a, { children: /* @__PURE__ */ y("div", {
149
+ }), /* @__PURE__ */ x(c, { children: /* @__PURE__ */ S("div", {
142
150
  className: "space-y-3",
143
- children: [/* @__PURE__ */ v("p", {
151
+ children: [/* @__PURE__ */ x("p", {
144
152
  className: "text-sm text-text-secondary line-clamp-2",
145
153
  children: e.description
146
- }), /* @__PURE__ */ y("div", {
154
+ }), /* @__PURE__ */ S("div", {
147
155
  className: "flex items-center justify-between",
148
- children: [/* @__PURE__ */ v(l, {
156
+ children: [/* @__PURE__ */ x(d, {
149
157
  variant: "outline",
150
158
  className: "text-xs",
151
- children: L[e.type]
152
- }), /* @__PURE__ */ v("span", {
159
+ children: B[e.type]
160
+ }), /* @__PURE__ */ x("span", {
153
161
  className: "text-xs text-text-secondary",
154
162
  children: n(e.createdAt)
155
163
  })]
@@ -157,62 +165,65 @@ var P = () => {
157
165
  }) })]
158
166
  })
159
167
  }, e.id))
160
- }) : /* @__PURE__ */ v(d, {
168
+ }) : /* @__PURE__ */ x(p, {
161
169
  illustration: "empty-generic",
162
- title: E ? x("botlit.policies.empty.titleNoType", "No {{type}} policies", { type: L[E] }) : x("botlit.policies.empty.title", "No policies"),
163
- description: x("botlit.policies.empty.description", "Create policies to enforce safety rules and operational limits across your agents."),
164
- action: /* @__PURE__ */ v(c, {
165
- leftIcon: /* @__PURE__ */ v(D, { size: 16 }),
166
- children: /* @__PURE__ */ v(b, {
167
- to: S("policies/new"),
168
- children: x("botlit.policies.actions.createPolicy", "Create Policy")
170
+ title: k ? w("botlit.policies.empty.titleNoType", "No {{type}} policies", { type: B[k] }) : w("botlit.policies.empty.title", "No policies"),
171
+ description: w("botlit.policies.empty.description", "Create policies to enforce safety rules and operational limits across your agents."),
172
+ action: /* @__PURE__ */ x(i, {
173
+ permission: r.POLICY_CREATE,
174
+ children: /* @__PURE__ */ x(o, {
175
+ leftIcon: /* @__PURE__ */ x(A, { size: 16 }),
176
+ children: /* @__PURE__ */ x(C, {
177
+ to: T("policies/new"),
178
+ children: w("botlit.policies.actions.createPolicy", "Create Policy")
179
+ })
169
180
  })
170
181
  })
171
182
  }),
172
- /* @__PURE__ */ y(g, {
183
+ /* @__PURE__ */ S(y, {
173
184
  treatment: "glass",
174
185
  glow: !0,
175
186
  className: "p-6",
176
- children: [/* @__PURE__ */ y("div", {
187
+ children: [/* @__PURE__ */ S("div", {
177
188
  className: "mb-4",
178
- children: [/* @__PURE__ */ v("h2", {
189
+ children: [/* @__PURE__ */ x("h2", {
179
190
  className: "text-lg font-semibold tracking-tight text-text-primary",
180
- children: x("botlit.policies.overview.title", "Policy Types")
181
- }), /* @__PURE__ */ v("p", {
191
+ children: w("botlit.policies.overview.title", "Policy Types")
192
+ }), /* @__PURE__ */ x("p", {
182
193
  className: "text-sm text-text-secondary",
183
- children: x("botlit.policies.overview.description", "Different policy types control different aspects of agent behavior")
194
+ children: w("botlit.policies.overview.description", "Different policy types control different aspects of agent behavior")
184
195
  })]
185
- }), /* @__PURE__ */ v("div", {
196
+ }), /* @__PURE__ */ x("div", {
186
197
  className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",
187
198
  children: [
188
199
  {
189
200
  type: "CONTENT",
190
- desc: x("botlit.policies.overview.contentDescription", "Detect and block harmful content, jailbreaks, and PII")
201
+ desc: w("botlit.policies.overview.contentDescription", "Detect and block harmful content, jailbreaks, and PII")
191
202
  },
192
203
  {
193
204
  type: "TOOL",
194
- desc: x("botlit.policies.overview.toolDescription", "Control which tools agents can access and use")
205
+ desc: w("botlit.policies.overview.toolDescription", "Control which tools agents can access and use")
195
206
  },
196
207
  {
197
208
  type: "BUDGET",
198
- desc: x("botlit.policies.overview.budgetDescription", "Set token limits and cost caps per execution")
209
+ desc: w("botlit.policies.overview.budgetDescription", "Set token limits and cost caps per execution")
199
210
  },
200
211
  {
201
212
  type: "RATE_LIMIT",
202
- desc: x("botlit.policies.overview.rateLimitDescription", "Limit request frequency to prevent abuse")
213
+ desc: w("botlit.policies.overview.rateLimitDescription", "Limit request frequency to prevent abuse")
203
214
  }
204
- ].map((e) => /* @__PURE__ */ y("div", {
215
+ ].map((e) => /* @__PURE__ */ S("div", {
205
216
  className: "p-4 border border-border-subtle rounded-lg",
206
- children: [/* @__PURE__ */ y("div", {
217
+ children: [/* @__PURE__ */ S("div", {
207
218
  className: "flex items-center gap-2 mb-2",
208
- children: [/* @__PURE__ */ v(M, {
219
+ children: [/* @__PURE__ */ x(F, {
209
220
  type: e.type,
210
221
  className: "h-5 w-5 text-primary"
211
- }), /* @__PURE__ */ v("span", {
222
+ }), /* @__PURE__ */ x("span", {
212
223
  className: "font-medium",
213
- children: L[e.type]
224
+ children: B[e.type]
214
225
  })]
215
- }), /* @__PURE__ */ v("p", {
226
+ }), /* @__PURE__ */ x("p", {
216
227
  className: "text-sm text-text-secondary",
217
228
  children: e.desc
218
229
  })]
@@ -224,6 +235,6 @@ var P = () => {
224
235
  });
225
236
  };
226
237
  //#endregion
227
- export { P as PoliciesPage };
238
+ export { L as PoliciesPage };
228
239
 
229
240
  //# sourceMappingURL=PoliciesPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PoliciesPage.js","names":[],"sources":["../../../src/botlit/pages/PoliciesPage.tsx"],"sourcesContent":["/**\n * Policies Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Plus,\n Search as SearchIcon,\n Filter,\n Shield,\n Wrench,\n Database,\n MessageSquare,\n DollarSign,\n Clock,\n Trash2,\n AlertTriangle,\n} from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input } from '../components/Input';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport { usePolicies, type PolicyRecord } from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport type { PolicyType } from '../types';\n\nconst PolicyTypeIcon: FC<{ type: string; className?: string }> = ({ type, className }) => {\n switch (type) {\n case 'CONTENT':\n return <AlertTriangle className={className} />;\n case 'TOOL':\n return <Wrench className={className} />;\n case 'DATA':\n return <Database className={className} />;\n case 'RESPONSE':\n return <MessageSquare className={className} />;\n case 'BUDGET':\n return <DollarSign className={className} />;\n case 'RATE_LIMIT':\n return <Clock className={className} />;\n case 'RETENTION':\n return <Trash2 className={className} />;\n default:\n return <Shield className={className} />;\n }\n};\n\nfunction usePolicyTypeLabel(t: ReturnType<typeof useTr>): Record<string, string> {\n return {\n CONTENT: t('botlit.policies.typeLabel.CONTENT', 'Content Safety'),\n TOOL: t('botlit.policies.typeLabel.TOOL', 'Tool Access'),\n DATA: t('botlit.policies.typeLabel.DATA', 'Data Access'),\n // New key: the platform i18n store already holds a row for the old\n // `typeLabel.RESPONSE` key (\"Response Format\") and that row wins.\n RESPONSE: t('botlit.policies.typeLabel.RESPONSE_MODELS', 'Response & Models'),\n BUDGET: t('botlit.policies.typeLabel.BUDGET', 'Budget Limits'),\n RATE_LIMIT: t('botlit.policies.typeLabel.RATE_LIMIT', 'Rate Limiting'),\n RETENTION: t('botlit.policies.typeLabel.RETENTION', 'Data Retention'),\n };\n}\n\nexport const PoliciesPage: FC = () => {\n const t = useTr();\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [selectedType, setSelectedType] = useState<PolicyType | null>(null);\n const { data: policies, loading, error, refetch } = usePolicies({ search });\n const policyTypeLabel = usePolicyTypeLabel(t);\n\n const filteredPolicies = selectedType\n ? policies.filter((policy) => policy.type === selectedType)\n : policies;\n\n const policyTypes: PolicyType[] = [\n 'CONTENT',\n 'TOOL',\n 'DATA',\n 'RESPONSE',\n 'BUDGET',\n 'RATE_LIMIT',\n 'RETENTION',\n ];\n\n return (\n <PageLayout\n title={t('botlit.policies.title', 'Policies & Guardrails')}\n description={t(\n 'botlit.policies.description',\n 'Configure safety rules, access controls, and operational limits'\n )}\n actions={\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('policies/new')}>\n {t('botlit.policies.actions.createPolicy', 'Create Policy')}\n </Link>\n </Button>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Shield size={18} />}>\n {t(\n 'botlit.policies.purpose',\n 'Policies are the guardrails that keep your agents safe and within budget. Each policy enforces one kind of rule — blocking harmful content or PII, restricting which tools an agent may call, capping token spend, or rate-limiting requests. Define policies here and attach them to agents so every execution stays compliant and predictable.'\n )}\n </PagePurpose>\n\n {/* Policy Type Filters */}\n <div className=\"flex flex-wrap gap-2\">\n <Button\n variant={selectedType === null ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedType(null)}\n >\n {t('botlit.store.filters.all', 'All')}\n </Button>\n {policyTypes.map((type) => (\n <Button\n key={type}\n variant={selectedType === type ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedType(type)}\n leftIcon={<PolicyTypeIcon type={type} className=\"h-4 w-4\" />}\n >\n {policyTypeLabel[type]}\n </Button>\n ))}\n </div>\n\n {/* Search */}\n <div className=\"flex items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <SearchIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder={t('botlit.policies.searchPlaceholder', 'Search policies...')}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <Button variant=\"outline\" leftIcon={<Filter size={16} />}>\n {t('botlit.policies.actions.moreFilters', 'More Filters')}\n </Button>\n </div>\n\n {/* Policies List */}\n {loading ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"h-40 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"policies\" error={error} onRetry={() => void refetch()} />\n ) : filteredPolicies.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {filteredPolicies.map((policy: PolicyRecord) => (\n <Link key={policy.id} to={getPath(`policies/${policy.id}`)}>\n <Card className=\"h-full hover:border-primary/50 transition-colors cursor-pointer\">\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div\n className={`p-2 rounded-lg ${\n policy.type === 'CONTENT'\n ? 'bg-status-error-bg-subtle'\n : policy.type === 'TOOL'\n ? 'bg-status-info-bg-subtle'\n : policy.type === 'BUDGET'\n ? 'bg-status-warning-bg-subtle'\n : 'bg-action-primary-bg/10'\n }`}\n >\n <PolicyTypeIcon\n type={policy.type}\n className={`h-5 w-5 ${\n policy.type === 'CONTENT'\n ? 'text-status-error-text'\n : policy.type === 'TOOL'\n ? 'text-status-info-text'\n : policy.type === 'BUDGET'\n ? 'text-status-warning-text'\n : 'text-primary'\n }`}\n />\n </div>\n <div>\n <CardTitle className=\"text-base\">{policy.name}</CardTitle>\n </div>\n </div>\n <StatusBadge status={policy.status} />\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary line-clamp-2\">\n {policy.description}\n </p>\n\n {/* Type Badge */}\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {policyTypeLabel[policy.type]}\n </Badge>\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(policy.createdAt)}\n </span>\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-generic\"\n title={\n selectedType\n ? t('botlit.policies.empty.titleNoType', 'No {{type}} policies', {\n type: policyTypeLabel[selectedType],\n })\n : t('botlit.policies.empty.title', 'No policies')\n }\n description={t(\n 'botlit.policies.empty.description',\n 'Create policies to enforce safety rules and operational limits across your agents.'\n )}\n action={\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('policies/new')}>\n {t('botlit.policies.actions.createPolicy', 'Create Policy')}\n </Link>\n </Button>\n }\n />\n )}\n\n {/* Policy Types Guide */}\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <div className=\"mb-4\">\n <h2 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.policies.overview.title', 'Policy Types')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {t(\n 'botlit.policies.overview.description',\n 'Different policy types control different aspects of agent behavior'\n )}\n </p>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\n {[\n {\n type: 'CONTENT' as PolicyType,\n desc: t(\n 'botlit.policies.overview.contentDescription',\n 'Detect and block harmful content, jailbreaks, and PII'\n ),\n },\n {\n type: 'TOOL' as PolicyType,\n desc: t(\n 'botlit.policies.overview.toolDescription',\n 'Control which tools agents can access and use'\n ),\n },\n {\n type: 'BUDGET' as PolicyType,\n desc: t(\n 'botlit.policies.overview.budgetDescription',\n 'Set token limits and cost caps per execution'\n ),\n },\n {\n type: 'RATE_LIMIT' as PolicyType,\n desc: t(\n 'botlit.policies.overview.rateLimitDescription',\n 'Limit request frequency to prevent abuse'\n ),\n },\n ].map((item) => (\n <div key={item.type} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center gap-2 mb-2\">\n <PolicyTypeIcon type={item.type} className=\"h-5 w-5 text-primary\" />\n <span className=\"font-medium\">{policyTypeLabel[item.type]}</span>\n </div>\n <p className=\"text-sm text-text-secondary\">{item.desc}</p>\n </div>\n ))}\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"PoliciesPage.js","names":[],"sources":["../../../src/botlit/pages/PoliciesPage.tsx"],"sourcesContent":["/**\n * Policies Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Plus,\n Search as SearchIcon,\n Filter,\n Shield,\n Wrench,\n Database,\n MessageSquare,\n DollarSign,\n Clock,\n Trash2,\n AlertTriangle,\n} from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input } from '../components/Input';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport { usePolicies, type PolicyRecord } from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport type { PolicyType } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\nimport { RetentionStatusPanel } from '../components/RetentionStatusPanel';\n\nconst PolicyTypeIcon: FC<{ type: string; className?: string }> = ({ type, className }) => {\n switch (type) {\n case 'CONTENT':\n return <AlertTriangle className={className} />;\n case 'TOOL':\n return <Wrench className={className} />;\n case 'DATA':\n return <Database className={className} />;\n case 'RESPONSE':\n return <MessageSquare className={className} />;\n case 'BUDGET':\n return <DollarSign className={className} />;\n case 'RATE_LIMIT':\n return <Clock className={className} />;\n case 'RETENTION':\n return <Trash2 className={className} />;\n default:\n return <Shield className={className} />;\n }\n};\n\nfunction usePolicyTypeLabel(t: ReturnType<typeof useTr>): Record<string, string> {\n return {\n CONTENT: t('botlit.policies.typeLabel.CONTENT', 'Content Safety'),\n TOOL: t('botlit.policies.typeLabel.TOOL', 'Tool Access'),\n DATA: t('botlit.policies.typeLabel.DATA', 'Data Access'),\n // New key: the platform i18n store already holds a row for the old\n // `typeLabel.RESPONSE` key (\"Response Format\") and that row wins.\n RESPONSE: t('botlit.policies.typeLabel.RESPONSE_MODELS', 'Response & Models'),\n BUDGET: t('botlit.policies.typeLabel.BUDGET', 'Budget Limits'),\n RATE_LIMIT: t('botlit.policies.typeLabel.RATE_LIMIT', 'Rate Limiting'),\n RETENTION: t('botlit.policies.typeLabel.RETENTION', 'Data Retention'),\n };\n}\n\nexport const PoliciesPage: FC = () => {\n const t = useTr();\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [selectedType, setSelectedType] = useState<PolicyType | null>(null);\n const { data: policies, loading, error, refetch } = usePolicies({ search });\n const policyTypeLabel = usePolicyTypeLabel(t);\n\n const filteredPolicies = selectedType\n ? policies.filter((policy) => policy.type === selectedType)\n : policies;\n\n const policyTypes: PolicyType[] = [\n 'CONTENT',\n 'TOOL',\n 'DATA',\n 'RESPONSE',\n 'BUDGET',\n 'RATE_LIMIT',\n 'RETENTION',\n ];\n\n return (\n <PageLayout\n title={t('botlit.policies.title', 'Policies & Guardrails')}\n description={t(\n 'botlit.policies.description',\n 'Configure safety rules, access controls, and operational limits'\n )}\n actions={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.POLICY_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('policies/new')}>\n {t('botlit.policies.actions.createPolicy', 'Create Policy')}\n </Link>\n </Button>\n </BotmanorPermissionGate>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Shield size={18} />}>\n {t(\n 'botlit.policies.purpose',\n 'Policies are the guardrails that keep your agents safe and within budget. Each policy enforces one kind of rule — blocking harmful content or PII, restricting which tools an agent may call, capping token spend, or rate-limiting requests. Define policies here and attach them to agents so every execution stays compliant and predictable.'\n )}\n </PagePurpose>\n\n <RetentionStatusPanel />\n\n {/* Policy Type Filters */}\n <div className=\"flex flex-wrap gap-2\">\n <Button\n variant={selectedType === null ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedType(null)}\n >\n {t('botlit.store.filters.all', 'All')}\n </Button>\n {policyTypes.map((type) => (\n <Button\n key={type}\n variant={selectedType === type ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedType(type)}\n leftIcon={<PolicyTypeIcon type={type} className=\"h-4 w-4\" />}\n >\n {policyTypeLabel[type]}\n </Button>\n ))}\n </div>\n\n {/* Search */}\n <div className=\"flex items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <SearchIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder={t('botlit.policies.searchPlaceholder', 'Search policies...')}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <Button variant=\"outline\" leftIcon={<Filter size={16} />}>\n {t('botlit.policies.actions.moreFilters', 'More Filters')}\n </Button>\n </div>\n\n {/* Policies List */}\n {loading ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"h-40 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"policies\" error={error} onRetry={() => void refetch()} />\n ) : filteredPolicies.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {filteredPolicies.map((policy: PolicyRecord) => (\n <Link key={policy.id} to={getPath(`policies/${policy.id}`)}>\n <Card className=\"h-full hover:border-primary/50 transition-colors cursor-pointer\">\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div\n className={`p-2 rounded-lg ${\n policy.type === 'CONTENT'\n ? 'bg-status-error-bg-subtle'\n : policy.type === 'TOOL'\n ? 'bg-status-info-bg-subtle'\n : policy.type === 'BUDGET'\n ? 'bg-status-warning-bg-subtle'\n : 'bg-action-primary-bg/10'\n }`}\n >\n <PolicyTypeIcon\n type={policy.type}\n className={`h-5 w-5 ${\n policy.type === 'CONTENT'\n ? 'text-status-error-text'\n : policy.type === 'TOOL'\n ? 'text-status-info-text'\n : policy.type === 'BUDGET'\n ? 'text-status-warning-text'\n : 'text-primary'\n }`}\n />\n </div>\n <div>\n <CardTitle className=\"text-base\">{policy.name}</CardTitle>\n </div>\n </div>\n <StatusBadge status={policy.status} />\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary line-clamp-2\">\n {policy.description}\n </p>\n\n {/* Type Badge */}\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {policyTypeLabel[policy.type]}\n </Badge>\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(policy.createdAt)}\n </span>\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-generic\"\n title={\n selectedType\n ? t('botlit.policies.empty.titleNoType', 'No {{type}} policies', {\n type: policyTypeLabel[selectedType],\n })\n : t('botlit.policies.empty.title', 'No policies')\n }\n description={t(\n 'botlit.policies.empty.description',\n 'Create policies to enforce safety rules and operational limits across your agents.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.POLICY_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('policies/new')}>\n {t('botlit.policies.actions.createPolicy', 'Create Policy')}\n </Link>\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n\n {/* Policy Types Guide */}\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <div className=\"mb-4\">\n <h2 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.policies.overview.title', 'Policy Types')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {t(\n 'botlit.policies.overview.description',\n 'Different policy types control different aspects of agent behavior'\n )}\n </p>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\n {[\n {\n type: 'CONTENT' as PolicyType,\n desc: t(\n 'botlit.policies.overview.contentDescription',\n 'Detect and block harmful content, jailbreaks, and PII'\n ),\n },\n {\n type: 'TOOL' as PolicyType,\n desc: t(\n 'botlit.policies.overview.toolDescription',\n 'Control which tools agents can access and use'\n ),\n },\n {\n type: 'BUDGET' as PolicyType,\n desc: t(\n 'botlit.policies.overview.budgetDescription',\n 'Set token limits and cost caps per execution'\n ),\n },\n {\n type: 'RATE_LIMIT' as PolicyType,\n desc: t(\n 'botlit.policies.overview.rateLimitDescription',\n 'Limit request frequency to prevent abuse'\n ),\n },\n ].map((item) => (\n <div key={item.type} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center gap-2 mb-2\">\n <PolicyTypeIcon type={item.type} className=\"h-5 w-5 text-primary\" />\n <span className=\"font-medium\">{policyTypeLabel[item.type]}</span>\n </div>\n <p className=\"text-sm text-text-secondary\">{item.desc}</p>\n </div>\n ))}\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}