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