@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.
- package/dist/botlit/BotlitRoutes.js.map +1 -1
- package/dist/botlit/BotmanorRoot.js.map +1 -1
- package/dist/botlit/BotmanorRootInner.js +4 -4
- package/dist/botlit/BotmanorRootInner.js.map +1 -1
- package/dist/botlit/components/ErrorState.js +33 -29
- package/dist/botlit/components/ErrorState.js.map +1 -1
- package/dist/botlit/components/RouteLoader.js +52 -48
- package/dist/botlit/components/RouteLoader.js.map +1 -1
- package/dist/botlit/components/VersionHistoryPanel.js +74 -77
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
- package/dist/botlit/components/WorkspaceRequired.js +31 -30
- package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useConversations.js.map +1 -1
- package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/A2ARegistryPage.js +116 -124
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.js +169 -172
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +96 -90
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotDetailPage.js +228 -231
- package/dist/botlit/pages/BotDetailPage.js.map +1 -1
- package/dist/botlit/pages/BotWorkflowTab.js +84 -87
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +144 -147
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.js +3 -3
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ChannelsPage.js +156 -149
- package/dist/botlit/pages/ChannelsPage.js.map +1 -1
- package/dist/botlit/pages/ChatPage.js +126 -129
- package/dist/botlit/pages/ChatPage.js.map +1 -1
- package/dist/botlit/pages/DashboardPage.js +111 -114
- package/dist/botlit/pages/DashboardPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +163 -159
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.js +3 -3
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBasesPage.js +84 -78
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +159 -154
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/PoliciesPage.js +119 -114
- package/dist/botlit/pages/PoliciesPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfilesPage.js +102 -109
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +144 -159
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillsPage.js +122 -105
- package/dist/botlit/pages/SkillsPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +176 -175
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/dist/botlit/providers/BotlitProvider.js.map +1 -1
- package/dist/botlit/store/botlitStore.js +1 -1
- package/dist/botlit/store/botlitStore.js.map +1 -1
- package/dist/botlit/utils/navigation.js.map +1 -1
- package/dist/shared/hooks/useTr.js +14 -0
- package/dist/shared/hooks/useTr.js.map +1 -0
- package/package.json +33 -9
|
@@ -1,65 +1,70 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
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
|
|
13
|
-
import { GlassCard as
|
|
14
|
-
import { jsx as
|
|
15
|
-
import { Link as
|
|
16
|
-
import { AlertTriangle as
|
|
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
|
|
19
|
+
var M = ({ type: e, className: t }) => {
|
|
19
20
|
switch (e) {
|
|
20
|
-
case "CONTENT": return /* @__PURE__ */
|
|
21
|
-
case "TOOL": return /* @__PURE__ */
|
|
22
|
-
case "DATA": return /* @__PURE__ */
|
|
23
|
-
case "RESPONSE": return /* @__PURE__ */
|
|
24
|
-
case "BUDGET": return /* @__PURE__ */
|
|
25
|
-
case "RATE_LIMIT": return /* @__PURE__ */
|
|
26
|
-
case "RETENTION": return /* @__PURE__ */
|
|
27
|
-
default: return /* @__PURE__ */
|
|
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
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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__ */
|
|
54
|
+
children: /* @__PURE__ */ y("div", {
|
|
50
55
|
className: "space-y-6",
|
|
51
56
|
children: [
|
|
52
|
-
/* @__PURE__ */ _
|
|
53
|
-
icon: /* @__PURE__ */
|
|
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__ */
|
|
61
|
+
/* @__PURE__ */ y("div", {
|
|
57
62
|
className: "flex flex-wrap gap-2",
|
|
58
|
-
children: [/* @__PURE__ */
|
|
59
|
-
variant:
|
|
63
|
+
children: [/* @__PURE__ */ v(c, {
|
|
64
|
+
variant: E === null ? "default" : "outline",
|
|
60
65
|
size: "sm",
|
|
61
|
-
onClick: () =>
|
|
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__ */
|
|
72
|
-
variant:
|
|
76
|
+
].map((e) => /* @__PURE__ */ v(c, {
|
|
77
|
+
variant: E === e ? "default" : "outline",
|
|
73
78
|
size: "sm",
|
|
74
|
-
onClick: () =>
|
|
75
|
-
leftIcon: /* @__PURE__ */
|
|
79
|
+
onClick: () => A(e),
|
|
80
|
+
leftIcon: /* @__PURE__ */ v(M, {
|
|
76
81
|
type: e,
|
|
77
82
|
className: "h-4 w-4"
|
|
78
83
|
}),
|
|
79
|
-
children:
|
|
84
|
+
children: L[e]
|
|
80
85
|
}, e))]
|
|
81
86
|
}),
|
|
82
|
-
/* @__PURE__ */
|
|
87
|
+
/* @__PURE__ */ y("div", {
|
|
83
88
|
className: "flex items-center gap-4",
|
|
84
|
-
children: [/* @__PURE__ */
|
|
89
|
+
children: [/* @__PURE__ */ y("div", {
|
|
85
90
|
className: "relative flex-1 max-w-md",
|
|
86
|
-
children: [/* @__PURE__ */
|
|
87
|
-
placeholder: "Search policies...",
|
|
88
|
-
value:
|
|
89
|
-
onChange: (e) =>
|
|
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__ */
|
|
97
|
+
}), /* @__PURE__ */ v(c, {
|
|
93
98
|
variant: "outline",
|
|
94
|
-
leftIcon: /* @__PURE__ */
|
|
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
|
-
|
|
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__ */
|
|
108
|
-
}) :
|
|
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:
|
|
111
|
-
onRetry: () => void
|
|
112
|
-
}) :
|
|
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:
|
|
115
|
-
to:
|
|
116
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
123
|
+
children: [/* @__PURE__ */ v(o, {
|
|
119
124
|
className: "pb-2",
|
|
120
|
-
children: /* @__PURE__ */
|
|
125
|
+
children: /* @__PURE__ */ y("div", {
|
|
121
126
|
className: "flex items-start justify-between",
|
|
122
|
-
children: [/* @__PURE__ */
|
|
127
|
+
children: [/* @__PURE__ */ y("div", {
|
|
123
128
|
className: "flex items-center gap-3",
|
|
124
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
135
|
+
}), /* @__PURE__ */ v("div", { children: /* @__PURE__ */ v(s, {
|
|
131
136
|
className: "text-base",
|
|
132
137
|
children: e.name
|
|
133
138
|
}) })]
|
|
134
|
-
}), /* @__PURE__ */
|
|
139
|
+
}), /* @__PURE__ */ v(u, { status: e.status })]
|
|
135
140
|
})
|
|
136
|
-
}), /* @__PURE__ */
|
|
141
|
+
}), /* @__PURE__ */ v(a, { children: /* @__PURE__ */ y("div", {
|
|
137
142
|
className: "space-y-3",
|
|
138
|
-
children: [/* @__PURE__ */
|
|
143
|
+
children: [/* @__PURE__ */ v("p", {
|
|
139
144
|
className: "text-sm text-text-secondary line-clamp-2",
|
|
140
145
|
children: e.description
|
|
141
|
-
}), /* @__PURE__ */
|
|
146
|
+
}), /* @__PURE__ */ y("div", {
|
|
142
147
|
className: "flex items-center justify-between",
|
|
143
|
-
children: [/* @__PURE__ */
|
|
148
|
+
children: [/* @__PURE__ */ v(l, {
|
|
144
149
|
variant: "outline",
|
|
145
150
|
className: "text-xs",
|
|
146
|
-
children:
|
|
147
|
-
}), /* @__PURE__ */
|
|
151
|
+
children: L[e.type]
|
|
152
|
+
}), /* @__PURE__ */ v("span", {
|
|
148
153
|
className: "text-xs text-text-secondary",
|
|
149
|
-
children:
|
|
154
|
+
children: n(e.createdAt)
|
|
150
155
|
})]
|
|
151
156
|
})]
|
|
152
157
|
}) })]
|
|
153
158
|
})
|
|
154
159
|
}, e.id))
|
|
155
|
-
}) : /* @__PURE__ */
|
|
160
|
+
}) : /* @__PURE__ */ v(d, {
|
|
156
161
|
illustration: "empty-generic",
|
|
157
|
-
title:
|
|
158
|
-
description: "Create policies to enforce safety rules and operational limits across your agents.",
|
|
159
|
-
action: /* @__PURE__ */
|
|
160
|
-
leftIcon: /* @__PURE__ */
|
|
161
|
-
children: /* @__PURE__ */
|
|
162
|
-
to:
|
|
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__ */
|
|
172
|
+
/* @__PURE__ */ y(g, {
|
|
168
173
|
treatment: "glass",
|
|
169
174
|
glow: !0,
|
|
170
175
|
className: "p-6",
|
|
171
|
-
children: [/* @__PURE__ */
|
|
176
|
+
children: [/* @__PURE__ */ y("div", {
|
|
172
177
|
className: "mb-4",
|
|
173
|
-
children: [/* @__PURE__ */
|
|
178
|
+
children: [/* @__PURE__ */ v("h2", {
|
|
174
179
|
className: "text-lg font-semibold tracking-tight text-text-primary",
|
|
175
|
-
children: "Policy Types"
|
|
176
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
204
|
+
].map((e) => /* @__PURE__ */ y("div", {
|
|
200
205
|
className: "p-4 border border-border-subtle rounded-lg",
|
|
201
|
-
children: [/* @__PURE__ */
|
|
206
|
+
children: [/* @__PURE__ */ y("div", {
|
|
202
207
|
className: "flex items-center gap-2 mb-2",
|
|
203
|
-
children: [/* @__PURE__ */
|
|
208
|
+
children: [/* @__PURE__ */ v(M, {
|
|
204
209
|
type: e.type,
|
|
205
210
|
className: "h-5 w-5 text-primary"
|
|
206
|
-
}), /* @__PURE__ */
|
|
211
|
+
}), /* @__PURE__ */ v("span", {
|
|
207
212
|
className: "font-medium",
|
|
208
|
-
children:
|
|
213
|
+
children: L[e.type]
|
|
209
214
|
})]
|
|
210
|
-
}), /* @__PURE__ */
|
|
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 {
|
|
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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"}
|