@burdenoff/microfe-botmanor 2026.1109.1 → 2026.1110.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 (73) hide show
  1. package/dist/botlit/BotlitRoutes.js +34 -45
  2. package/dist/botlit/BotlitRoutes.js.map +1 -1
  3. package/dist/botlit/components/Badge.js +2 -2
  4. package/dist/botlit/components/Badge.js.map +1 -1
  5. package/dist/botlit/components/ChannelSelectorSheet.js +4 -4
  6. package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
  7. package/dist/botlit/components/LoadMore.d.ts +9 -0
  8. package/dist/botlit/components/LoadMore.js +22 -0
  9. package/dist/botlit/components/LoadMore.js.map +1 -0
  10. package/dist/botlit/components/index.d.ts +1 -0
  11. package/dist/botlit/hooks/index.d.ts +1 -2
  12. package/dist/botlit/hooks/index.js +15 -16
  13. package/dist/botlit/hooks/internal/workspaceGateway.d.ts +47 -0
  14. package/dist/botlit/hooks/internal/workspaceGateway.js +59 -1
  15. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
  16. package/dist/botlit/hooks/useAgents.d.ts +2 -6
  17. package/dist/botlit/hooks/useAgents.js +71 -95
  18. package/dist/botlit/hooks/useAgents.js.map +1 -1
  19. package/dist/botlit/hooks/useBots.d.ts +2 -6
  20. package/dist/botlit/hooks/useBots.js +51 -75
  21. package/dist/botlit/hooks/useBots.js.map +1 -1
  22. package/dist/botlit/hooks/useBuckets.d.ts +5 -0
  23. package/dist/botlit/hooks/useBuckets.js +72 -38
  24. package/dist/botlit/hooks/useBuckets.js.map +1 -1
  25. package/dist/botlit/hooks/useExecutions.d.ts +2 -2
  26. package/dist/botlit/hooks/useExecutions.js +30 -34
  27. package/dist/botlit/hooks/useExecutions.js.map +1 -1
  28. package/dist/botlit/hooks/useStore.d.ts +3 -3
  29. package/dist/botlit/hooks/useStore.js +41 -50
  30. package/dist/botlit/hooks/useStore.js.map +1 -1
  31. package/dist/botlit/index.d.ts +0 -1
  32. package/dist/botlit/index.js +5 -6
  33. package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
  34. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  35. package/dist/botlit/pages/AgentDetailPage.js +1 -1
  36. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  37. package/dist/botlit/pages/AgentsListPage.js +157 -156
  38. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  39. package/dist/botlit/pages/BotChannelsTab.js +24 -24
  40. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  41. package/dist/botlit/pages/BotsListPage.js +147 -146
  42. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  43. package/dist/botlit/pages/BucketDetailPage.d.ts +2 -0
  44. package/dist/botlit/pages/BucketDetailPage.js +251 -0
  45. package/dist/botlit/pages/BucketDetailPage.js.map +1 -0
  46. package/dist/botlit/pages/BucketsPage.js +3 -3
  47. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  48. package/dist/botlit/pages/ChannelDetailPage.js +2 -2
  49. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  50. package/dist/botlit/pages/ExecutionsPage.js +141 -134
  51. package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
  52. package/dist/botlit/pages/InstalledPackagesPage.js +43 -36
  53. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  54. package/dist/botlit/pages/MCPServersPage.js +1 -1
  55. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  56. package/dist/botlit/pages/SettingsPage.js +2 -2
  57. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  58. package/dist/botlit/pages/SkillDetailPage.js +1 -1
  59. package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
  60. package/dist/botlit/pages/StorePackageDetailPage.js +1 -1
  61. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
  62. package/dist/botlit/pages/StorePage.js +150 -143
  63. package/dist/botlit/pages/StorePage.js.map +1 -1
  64. package/dist/botlit/pages/index.d.ts +1 -2
  65. package/dist/generated/wspace-operations.js +67 -67
  66. package/dist/generated/wspace-operations.js.map +1 -1
  67. package/dist/index.js +5 -6
  68. package/package.json +1 -1
  69. package/dist/botlit/hooks/useConversations.d.ts +0 -42
  70. package/dist/botlit/hooks/useConversations.js +0 -63
  71. package/dist/botlit/hooks/useConversations.js.map +0 -1
  72. package/dist/botlit/pages/ConversationDetailPage.d.ts +0 -2
  73. package/dist/botlit/pages/ConversationsPage.d.ts +0 -2
@@ -0,0 +1,251 @@
1
+ import { useBotlit as e } from "../providers/BotlitProvider.js";
2
+ import { useBots as t } from "../hooks/useBots.js";
3
+ import { useAgents as n } from "../hooks/useAgents.js";
4
+ import { PageLayout as r } from "../components/PageLayout.js";
5
+ import { Card as i, CardContent as a, CardDescription as o, CardHeader as s, CardTitle as c } from "../components/Card.js";
6
+ import { Button as l } from "../components/Button.js";
7
+ import { EmptyState as u } from "../components/EmptyState.js";
8
+ import { ErrorState as d } from "../components/ErrorState.js";
9
+ import { StatusBadge as f } from "../components/Badge.js";
10
+ import "../hooks/index.js";
11
+ import { useChannelConnectors as p } from "../hooks/useChannels.js";
12
+ import { usePolicies as m } from "../hooks/usePolicies.js";
13
+ import { useBucket as h, useChildBuckets as g } from "../hooks/useBuckets.js";
14
+ import { formatRelativeTime as _ } from "../utils/formatters.js";
15
+ import { PagePurpose as v } from "@burdenoff/fe-libs/ui";
16
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
17
+ import { Link as x, useParams as S } from "react-router";
18
+ import { ArrowLeft as C, Bot as w, Folder as T, FolderOpen as E, MessageSquare as D, Shield as O, Users as k } from "lucide-react";
19
+ // src/botlit/pages/BucketDetailPage.tsx
20
+ var A = ({ title: e, icon: t, loading: n, error: r, onRetry: o, children: l }) => /* @__PURE__ */ b(i, { children: [/* @__PURE__ */ y(s, { children: /* @__PURE__ */ b(c, {
21
+ className: "flex items-center gap-2",
22
+ children: [t, e]
23
+ }) }), /* @__PURE__ */ y(a, { children: n ? /* @__PURE__ */ y("div", {
24
+ className: "space-y-2",
25
+ children: [1, 2].map((e) => /* @__PURE__ */ y("div", { className: "h-9 bg-bg-sunken motion-safe:animate-vc-shimmer rounded" }, e))
26
+ }) : r ? /* @__PURE__ */ y(d, {
27
+ resource: e.toLowerCase(),
28
+ error: r,
29
+ onRetry: () => void o()
30
+ }) : l })] }), j = () => {
31
+ let { bucketId: j } = S(), { getPath: M } = e(), { data: N, loading: P, error: F, refetch: I } = h(j), { data: L, loading: R, error: z, refetch: B } = g(N?.id), V = h(N?.parentBucketId ?? void 0), H = n(N?.id ? { bucketId: N.id } : void 0), U = t(N?.id ? { bucketId: N.id } : void 0), W = p(N?.id ? { bucketId: N.id } : void 0), G = m(N?.id ? { bucketId: N.id } : void 0);
32
+ if (P) return /* @__PURE__ */ y(r, {
33
+ title: "Bucket",
34
+ children: /* @__PURE__ */ y("div", {
35
+ className: "space-y-4",
36
+ children: [
37
+ 1,
38
+ 2,
39
+ 3
40
+ ].map((e) => /* @__PURE__ */ y("div", { className: "h-24 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
41
+ })
42
+ });
43
+ if (F) return /* @__PURE__ */ y(r, {
44
+ title: "Bucket",
45
+ children: /* @__PURE__ */ y(d, {
46
+ resource: "bucket",
47
+ error: F,
48
+ onRetry: () => void I()
49
+ })
50
+ });
51
+ if (!N) return /* @__PURE__ */ y(r, {
52
+ title: "Bucket not found",
53
+ children: /* @__PURE__ */ y(u, {
54
+ illustration: "empty-search",
55
+ title: "Bucket not found",
56
+ description: "This bucket may have been deleted, or the link is out of date.",
57
+ action: /* @__PURE__ */ y(l, {
58
+ leftIcon: /* @__PURE__ */ y(C, { size: 16 }),
59
+ children: /* @__PURE__ */ y(x, {
60
+ to: M("buckets"),
61
+ children: "Back to Buckets"
62
+ })
63
+ })
64
+ })
65
+ });
66
+ let K = N.metadata && typeof N.metadata.visibility == "string" ? N.metadata.visibility : null, q = L;
67
+ return /* @__PURE__ */ y(r, {
68
+ title: N.name,
69
+ description: N.path,
70
+ actions: /* @__PURE__ */ y(l, {
71
+ variant: "outline",
72
+ leftIcon: /* @__PURE__ */ y(C, { size: 16 }),
73
+ children: /* @__PURE__ */ y(x, {
74
+ to: M("buckets"),
75
+ children: "Back to Buckets"
76
+ })
77
+ }),
78
+ children: /* @__PURE__ */ b("div", {
79
+ className: "space-y-6",
80
+ children: [
81
+ /* @__PURE__ */ y(v, {
82
+ icon: /* @__PURE__ */ y(T, { size: 18 }),
83
+ children: "Buckets group your agents, bots, channels and policies. This bucket contains its sub-buckets and every resource assigned to it, inherited down the hierarchy."
84
+ }),
85
+ /* @__PURE__ */ b(i, { children: [/* @__PURE__ */ b(s, { children: [/* @__PURE__ */ y(c, { children: "Details" }), /* @__PURE__ */ y(o, { children: N.description ?? "No description" })] }), /* @__PURE__ */ y(a, { children: /* @__PURE__ */ b("dl", {
86
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
87
+ children: [
88
+ /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("dt", {
89
+ className: "text-xs text-text-secondary",
90
+ children: "Slug"
91
+ }), /* @__PURE__ */ y("dd", {
92
+ className: "mt-1 text-sm font-medium",
93
+ children: N.slug
94
+ })] }),
95
+ /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("dt", {
96
+ className: "text-xs text-text-secondary",
97
+ children: "Visibility"
98
+ }), /* @__PURE__ */ y("dd", {
99
+ className: "mt-1 text-sm font-medium",
100
+ children: K ?? "—"
101
+ })] }),
102
+ /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("dt", {
103
+ className: "text-xs text-text-secondary",
104
+ children: "Created"
105
+ }), /* @__PURE__ */ y("dd", {
106
+ className: "mt-1 text-sm font-medium",
107
+ children: _(N.createdAt)
108
+ })] }),
109
+ /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("dt", {
110
+ className: "text-xs text-text-secondary",
111
+ children: "Parent bucket"
112
+ }), /* @__PURE__ */ y("dd", {
113
+ className: "mt-1 text-sm font-medium",
114
+ children: N.parentBucketId ? V.data ? /* @__PURE__ */ y(x, {
115
+ to: M(`buckets/${V.data.id}`),
116
+ className: "text-primary hover:underline",
117
+ children: V.data.name
118
+ }) : "—" : "Top level"
119
+ })] })
120
+ ]
121
+ }) })] }),
122
+ /* @__PURE__ */ b(i, { children: [/* @__PURE__ */ b(s, { children: [/* @__PURE__ */ b(c, {
123
+ className: "flex items-center gap-2",
124
+ children: [/* @__PURE__ */ y(E, { size: 18 }), "Sub-buckets"]
125
+ }), /* @__PURE__ */ y(o, { children: "Direct children of this bucket" })] }), /* @__PURE__ */ y(a, { children: R ? /* @__PURE__ */ y("div", {
126
+ className: "space-y-2",
127
+ children: [1, 2].map((e) => /* @__PURE__ */ y("div", { className: "h-9 bg-bg-sunken motion-safe:animate-vc-shimmer rounded" }, e))
128
+ }) : z ? /* @__PURE__ */ y(d, {
129
+ resource: "sub-buckets",
130
+ error: z,
131
+ onRetry: () => void B()
132
+ }) : q.length > 0 ? /* @__PURE__ */ y("ul", {
133
+ className: "divide-y divide-border-subtle",
134
+ children: q.map((e) => /* @__PURE__ */ y("li", { children: /* @__PURE__ */ b(x, {
135
+ to: M(`buckets/${e.id}`),
136
+ className: "flex items-center gap-2 py-2 text-sm hover:text-primary",
137
+ children: [
138
+ /* @__PURE__ */ y(T, {
139
+ size: 16,
140
+ className: "text-text-secondary"
141
+ }),
142
+ /* @__PURE__ */ y("span", {
143
+ className: "font-medium",
144
+ children: e.name
145
+ }),
146
+ /* @__PURE__ */ y("span", {
147
+ className: "text-xs text-text-secondary",
148
+ children: e.path
149
+ })
150
+ ]
151
+ }) }, e.id))
152
+ }) : /* @__PURE__ */ y("p", {
153
+ className: "text-sm text-text-secondary",
154
+ children: "No sub-buckets."
155
+ }) })] }),
156
+ /* @__PURE__ */ b("div", {
157
+ className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
158
+ children: [
159
+ /* @__PURE__ */ y(A, {
160
+ title: "Agents",
161
+ icon: /* @__PURE__ */ y(w, { size: 18 }),
162
+ loading: H.loading,
163
+ error: H.error,
164
+ onRetry: H.refetch,
165
+ children: H.data.length > 0 ? /* @__PURE__ */ y("ul", {
166
+ className: "divide-y divide-border-subtle",
167
+ children: H.data.map((e) => /* @__PURE__ */ y("li", { children: /* @__PURE__ */ b(x, {
168
+ to: M(`agents/${e.id}`),
169
+ className: "flex items-center justify-between gap-2 py-2 text-sm hover:text-primary",
170
+ children: [/* @__PURE__ */ y("span", {
171
+ className: "font-medium",
172
+ children: e.name
173
+ }), /* @__PURE__ */ y(f, { status: e.status })]
174
+ }) }, e.id))
175
+ }) : /* @__PURE__ */ y("p", {
176
+ className: "text-sm text-text-secondary",
177
+ children: "No agents in this bucket."
178
+ })
179
+ }),
180
+ /* @__PURE__ */ y(A, {
181
+ title: "Bots",
182
+ icon: /* @__PURE__ */ y(k, { size: 18 }),
183
+ loading: U.loading,
184
+ error: U.error,
185
+ onRetry: U.refetch,
186
+ children: U.data.length > 0 ? /* @__PURE__ */ y("ul", {
187
+ className: "divide-y divide-border-subtle",
188
+ children: U.data.map((e) => /* @__PURE__ */ y("li", { children: /* @__PURE__ */ b(x, {
189
+ to: M(`bots/${e.id}`),
190
+ className: "flex items-center justify-between gap-2 py-2 text-sm hover:text-primary",
191
+ children: [/* @__PURE__ */ y("span", {
192
+ className: "font-medium",
193
+ children: e.name
194
+ }), /* @__PURE__ */ y(f, { status: e.status })]
195
+ }) }, e.id))
196
+ }) : /* @__PURE__ */ y("p", {
197
+ className: "text-sm text-text-secondary",
198
+ children: "No bots in this bucket."
199
+ })
200
+ }),
201
+ /* @__PURE__ */ y(A, {
202
+ title: "Channels",
203
+ icon: /* @__PURE__ */ y(D, { size: 18 }),
204
+ loading: W.loading,
205
+ error: W.error,
206
+ onRetry: W.refetch,
207
+ children: W.data.length > 0 ? /* @__PURE__ */ y("ul", {
208
+ className: "divide-y divide-border-subtle",
209
+ children: W.data.map((e) => /* @__PURE__ */ y("li", { children: /* @__PURE__ */ b(x, {
210
+ to: M(`channels/${e.id}`),
211
+ className: "flex items-center justify-between gap-2 py-2 text-sm hover:text-primary",
212
+ children: [/* @__PURE__ */ y("span", {
213
+ className: "font-medium",
214
+ children: e.name
215
+ }), /* @__PURE__ */ y(f, { status: e.status })]
216
+ }) }, e.id))
217
+ }) : /* @__PURE__ */ y("p", {
218
+ className: "text-sm text-text-secondary",
219
+ children: "No channels in this bucket."
220
+ })
221
+ }),
222
+ /* @__PURE__ */ y(A, {
223
+ title: "Policies",
224
+ icon: /* @__PURE__ */ y(O, { size: 18 }),
225
+ loading: G.loading,
226
+ error: G.error,
227
+ onRetry: G.refetch,
228
+ children: G.data.length > 0 ? /* @__PURE__ */ y("ul", {
229
+ className: "divide-y divide-border-subtle",
230
+ children: G.data.map((e) => /* @__PURE__ */ y("li", { children: /* @__PURE__ */ b(x, {
231
+ to: M(`policies/${e.id}`),
232
+ className: "flex items-center justify-between gap-2 py-2 text-sm hover:text-primary",
233
+ children: [/* @__PURE__ */ y("span", {
234
+ className: "font-medium",
235
+ children: e.name
236
+ }), /* @__PURE__ */ y(f, { status: e.status })]
237
+ }) }, e.id))
238
+ }) : /* @__PURE__ */ y("p", {
239
+ className: "text-sm text-text-secondary",
240
+ children: "No policies in this bucket."
241
+ })
242
+ })
243
+ ]
244
+ })
245
+ ]
246
+ })
247
+ });
248
+ };
249
+ export { j as BucketDetailPage };
250
+
251
+ //# sourceMappingURL=BucketDetailPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BucketDetailPage.js","names":["ItemSection","Card","CardHeader","CardTitle","icon","title","CardContent","loading","i","error","ErrorState","onRetry","children","BucketDetailPage","useParams","useBotlit","bucket","bucketLoading","bucketError","refetchBucket","useBucket","bucketId","childrenLoading","childrenError","refetchChildren","useChildBuckets","parent","agents","useAgents","bots","useBots","channels","useChannelConnectors","policies","usePolicies","PageLayout","EmptyState","Button","ArrowLeft","Link","getPath","visibility","childList","PagePurpose","Folder","CardDescription","formatRelativeTime","FolderOpen","child","Bot","agent","StatusBadge","Users","bot","MessageSquare","channel","Shield","policy"],"sources":["../../../src/botlit/pages/BucketDetailPage.tsx"],"sourcesContent":["/**\n * Bucket Detail Page\n * @module botlit/pages\n *\n * A `Bucket` on wspace-botlit-svc is a hierarchical folder for BotManor\n * resources. The detail view reads the existing `getBucket` /\n * `listBuckets(filters: { parentBucketId })` operations plus the\n * `bucketId` filters every contained entity already exposes (agents, bots,\n * channels, policies) — no backend change is required.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { Link, useParams } from 'react-router';\nimport { ArrowLeft, Bot, Folder, FolderOpen, MessageSquare, Shield, Users } from 'lucide-react';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport { StatusBadge } from '../components/Badge';\nimport {\n useBucket,\n useChildBuckets,\n useAgents,\n useBots,\n useChannelConnectors,\n usePolicies,\n} from '../hooks';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\n\n/** One \"contained items\" section: entities of a single type living in the bucket. */\nconst ItemSection: FC<{\n title: string;\n icon: ReactNode;\n loading: boolean;\n error: Error | undefined;\n onRetry: () => Promise<void>;\n children: ReactNode;\n}> = ({ title, icon, loading, error, onRetry, children }) => (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n {icon}\n {title}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {loading ? (\n <div className=\"space-y-2\">\n {[1, 2].map((i) => (\n <div key={i} className=\"h-9 bg-bg-sunken motion-safe:animate-vc-shimmer rounded\" />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource={title.toLowerCase()} error={error} onRetry={() => void onRetry()} />\n ) : (\n children\n )}\n </CardContent>\n </Card>\n);\n\nexport const BucketDetailPage: FC = () => {\n const { bucketId } = useParams();\n const { getPath } = useBotlit();\n\n const {\n data: bucket,\n loading: bucketLoading,\n error: bucketError,\n refetch: refetchBucket,\n } = useBucket(bucketId);\n const {\n data: children,\n loading: childrenLoading,\n error: childrenError,\n refetch: refetchChildren,\n } = useChildBuckets(bucket?.id);\n const parent = useBucket(bucket?.parentBucketId ?? undefined);\n\n const agents = useAgents(bucket?.id ? { bucketId: bucket.id } : undefined);\n const bots = useBots(bucket?.id ? { bucketId: bucket.id } : undefined);\n const channels = useChannelConnectors(bucket?.id ? { bucketId: bucket.id } : undefined);\n const policies = usePolicies(bucket?.id ? { bucketId: bucket.id } : undefined);\n\n if (bucketLoading) {\n return (\n <PageLayout title=\"Bucket\">\n <div className=\"space-y-4\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-24 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n ))}\n </div>\n </PageLayout>\n );\n }\n\n if (bucketError) {\n return (\n <PageLayout title=\"Bucket\">\n <ErrorState resource=\"bucket\" error={bucketError} onRetry={() => void refetchBucket()} />\n </PageLayout>\n );\n }\n\n if (!bucket) {\n return (\n <PageLayout title=\"Bucket not found\">\n <EmptyState\n illustration=\"empty-search\"\n title=\"Bucket not found\"\n description=\"This bucket may have been deleted, or the link is out of date.\"\n action={\n <Button leftIcon={<ArrowLeft size={16} />}>\n <Link to={getPath('buckets')}>Back to Buckets</Link>\n </Button>\n }\n />\n </PageLayout>\n );\n }\n\n const visibility =\n bucket.metadata && typeof bucket.metadata.visibility === 'string'\n ? bucket.metadata.visibility\n : null;\n const childList = children;\n\n return (\n <PageLayout\n title={bucket.name}\n description={bucket.path}\n actions={\n <Button variant=\"outline\" leftIcon={<ArrowLeft size={16} />}>\n <Link to={getPath('buckets')}>Back to Buckets</Link>\n </Button>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Folder size={18} />}>\n Buckets group your agents, bots, channels and policies. This bucket contains its\n sub-buckets and every resource assigned to it, inherited down the hierarchy.\n </PagePurpose>\n\n {/* Overview */}\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n <CardDescription>{bucket.description ?? 'No description'}</CardDescription>\n </CardHeader>\n <CardContent>\n <dl className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <div>\n <dt className=\"text-xs text-text-secondary\">Slug</dt>\n <dd className=\"mt-1 text-sm font-medium\">{bucket.slug}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-secondary\">Visibility</dt>\n <dd className=\"mt-1 text-sm font-medium\">{visibility ?? MISSING_VALUE}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-secondary\">Created</dt>\n <dd className=\"mt-1 text-sm font-medium\">{formatRelativeTime(bucket.createdAt)}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-secondary\">Parent bucket</dt>\n <dd className=\"mt-1 text-sm font-medium\">\n {bucket.parentBucketId ? (\n parent.data ? (\n <Link\n to={getPath(`buckets/${parent.data.id}`)}\n className=\"text-primary hover:underline\"\n >\n {parent.data.name}\n </Link>\n ) : (\n MISSING_VALUE\n )\n ) : (\n 'Top level'\n )}\n </dd>\n </div>\n </dl>\n </CardContent>\n </Card>\n\n {/* Sub-buckets */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FolderOpen size={18} />\n Sub-buckets\n </CardTitle>\n <CardDescription>Direct children of this bucket</CardDescription>\n </CardHeader>\n <CardContent>\n {childrenLoading ? (\n <div className=\"space-y-2\">\n {[1, 2].map((i) => (\n <div\n key={i}\n className=\"h-9 bg-bg-sunken motion-safe:animate-vc-shimmer rounded\"\n />\n ))}\n </div>\n ) : childrenError ? (\n <ErrorState\n resource=\"sub-buckets\"\n error={childrenError}\n onRetry={() => void refetchChildren()}\n />\n ) : childList.length > 0 ? (\n <ul className=\"divide-y divide-border-subtle\">\n {childList.map((child) => (\n <li key={child.id}>\n <Link\n to={getPath(`buckets/${child.id}`)}\n className=\"flex items-center gap-2 py-2 text-sm hover:text-primary\"\n >\n <Folder size={16} className=\"text-text-secondary\" />\n <span className=\"font-medium\">{child.name}</span>\n <span className=\"text-xs text-text-secondary\">{child.path}</span>\n </Link>\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"text-sm text-text-secondary\">No sub-buckets.</p>\n )}\n </CardContent>\n </Card>\n\n {/* Contained items */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <ItemSection\n title=\"Agents\"\n icon={<Bot size={18} />}\n loading={agents.loading}\n error={agents.error}\n onRetry={agents.refetch}\n >\n {agents.data.length > 0 ? (\n <ul className=\"divide-y divide-border-subtle\">\n {agents.data.map((agent) => (\n <li key={agent.id}>\n <Link\n to={getPath(`agents/${agent.id}`)}\n className=\"flex items-center justify-between gap-2 py-2 text-sm hover:text-primary\"\n >\n <span className=\"font-medium\">{agent.name}</span>\n <StatusBadge status={agent.status} />\n </Link>\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"text-sm text-text-secondary\">No agents in this bucket.</p>\n )}\n </ItemSection>\n\n <ItemSection\n title=\"Bots\"\n icon={<Users size={18} />}\n loading={bots.loading}\n error={bots.error}\n onRetry={bots.refetch}\n >\n {bots.data.length > 0 ? (\n <ul className=\"divide-y divide-border-subtle\">\n {bots.data.map((bot) => (\n <li key={bot.id}>\n <Link\n to={getPath(`bots/${bot.id}`)}\n className=\"flex items-center justify-between gap-2 py-2 text-sm hover:text-primary\"\n >\n <span className=\"font-medium\">{bot.name}</span>\n <StatusBadge status={bot.status} />\n </Link>\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"text-sm text-text-secondary\">No bots in this bucket.</p>\n )}\n </ItemSection>\n\n <ItemSection\n title=\"Channels\"\n icon={<MessageSquare size={18} />}\n loading={channels.loading}\n error={channels.error}\n onRetry={channels.refetch}\n >\n {channels.data.length > 0 ? (\n <ul className=\"divide-y divide-border-subtle\">\n {channels.data.map((channel) => (\n <li key={channel.id}>\n <Link\n to={getPath(`channels/${channel.id}`)}\n className=\"flex items-center justify-between gap-2 py-2 text-sm hover:text-primary\"\n >\n <span className=\"font-medium\">{channel.name}</span>\n <StatusBadge status={channel.status} />\n </Link>\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"text-sm text-text-secondary\">No channels in this bucket.</p>\n )}\n </ItemSection>\n\n <ItemSection\n title=\"Policies\"\n icon={<Shield size={18} />}\n loading={policies.loading}\n error={policies.error}\n onRetry={policies.refetch}\n >\n {policies.data.length > 0 ? (\n <ul className=\"divide-y divide-border-subtle\">\n {policies.data.map((policy) => (\n <li key={policy.id}>\n <Link\n to={getPath(`policies/${policy.id}`)}\n className=\"flex items-center justify-between gap-2 py-2 text-sm hover:text-primary\"\n >\n <span className=\"font-medium\">{policy.name}</span>\n <StatusBadge status={policy.status} />\n </Link>\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"text-sm text-text-secondary\">No policies in this bucket.</p>\n )}\n </ItemSection>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -414,7 +414,7 @@ var I = ({ bucket: e, level: t, expanded: n, onToggle: r, getPath: s, onEdit: c,
414
414
  ]
415
415
  }) })] }),
416
416
  ue && /* @__PURE__ */ x("div", {
417
- className: "fixed inset-0 bg-black/50 flex items-center justify-center z-50",
417
+ className: "fixed inset-0 bg-bg-overlay flex items-center justify-center z-50",
418
418
  children: /* @__PURE__ */ S(c, {
419
419
  className: "w-full max-w-md mx-4",
420
420
  children: [
@@ -499,7 +499,7 @@ var I = ({ bucket: e, level: t, expanded: n, onToggle: r, getPath: s, onEdit: c,
499
499
  })
500
500
  }),
501
501
  V && /* @__PURE__ */ x("div", {
502
- className: "fixed inset-0 bg-black/50 flex items-center justify-center z-50",
502
+ className: "fixed inset-0 bg-bg-overlay flex items-center justify-center z-50",
503
503
  children: /* @__PURE__ */ S(c, {
504
504
  className: "w-full max-w-md mx-4",
505
505
  children: [
@@ -584,7 +584,7 @@ var I = ({ bucket: e, level: t, expanded: n, onToggle: r, getPath: s, onEdit: c,
584
584
  })
585
585
  }),
586
586
  z && /* @__PURE__ */ x("div", {
587
- className: "fixed inset-0 bg-black/50 flex items-center justify-center z-50",
587
+ className: "fixed inset-0 bg-bg-overlay flex items-center justify-center z-50",
588
588
  children: /* @__PURE__ */ S(c, {
589
589
  className: "w-full max-w-md mx-4",
590
590
  children: [
@@ -1 +1 @@
1
- {"version":3,"file":"BucketsPage.js","names":["SearchIcon","_Fragment","Textarea","Textarea$1","BucketTreeItem","isExpanded","expanded","bucket","hasChildren","isMenuOpen","activeMenu","can","useBotmanorCan","hasActions","BOTMANOR_PERMISSIONS","Link","getPath","level","e","onToggle","jsx","ChevronDown","ChevronRight","FolderOpen","Folder","Button","setActiveMenu","MoreHorizontal","BotmanorPermissionGate","onCreateChild","Plus","onEdit","Edit","onDelete","Trash2","child","BucketsPage","useBotlit","search","setSearch","useState","viewMode","setViewMode","setExpanded","showCreateModal","setShowCreateModal","showDeleteConfirm","setShowDeleteConfirm","editingBucket","setEditingBucket","actionMenuBucket","setActionMenuBucket","formData","setFormData","buckets","loadingBuckets","bucketsError","refetchBuckets","useBuckets","bucketTree","loadingTree","treeError","refetchTree","useBucketTree","createBucket","createBucketResult","useCreateBucket","updateBucket","updateBucketResult","useUpdateBucket","deleteBucket","deleteBucketResult","useDeleteBucket","handleToggle","next","prev","id","expandAll","allIds","collectIds","node","nodes","collapseAll","isLoading","loadError","retryLoad","handleCreate","err","toast","handleUpdate","handleDelete","bucketId","isNative","nativeNotify","startEditing","openCreateModal","parentId","PageLayout","PagePurpose","FolderTree","GlassCard","Search","Input","Settings","Card","CardContent","i","ErrorState","EmptyState","Fragment","CardHeader","CardTitle","CardDescription","formatRelativeTime","X","FormField","Save","nativeImpact"],"sources":["../../../src/botlit/pages/BucketsPage.tsx"],"sourcesContent":["/**\n * Buckets 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 { toast } from 'sonner';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n Plus,\n Search as SearchIcon,\n FolderTree,\n Folder,\n FolderOpen,\n ChevronRight,\n ChevronDown,\n MoreHorizontal,\n Settings,\n Edit,\n Trash2,\n X,\n Save,\n} from 'lucide-react';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport {\n useBuckets,\n useBucketTree,\n useCreateBucket,\n useDeleteBucket,\n useUpdateBucket,\n type BucketRecord,\n type BucketTreeNode,\n} from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport type { Visibility } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate, useBotmanorCan } from '../permissions';\n\ntype BucketNode = BucketTreeNode;\n\nconst BucketTreeItem: FC<{\n bucket: BucketNode;\n level: number;\n expanded: Set<string>;\n onToggle: (id: string) => void;\n getPath: (path: string) => string;\n onEdit: (bucket: BucketNode) => void;\n onDelete: (bucketId: string) => void;\n onCreateChild: (parentId: string) => void;\n activeMenu: string | null;\n setActiveMenu: (id: string | null) => void;\n}> = ({\n bucket,\n level,\n expanded,\n onToggle,\n getPath,\n onEdit,\n onDelete,\n onCreateChild,\n activeMenu,\n setActiveMenu,\n}) => {\n const isExpanded = expanded.has(bucket.id);\n const hasChildren = bucket.children.length > 0;\n const isMenuOpen = activeMenu === bucket.id;\n const can = useBotmanorCan();\n const hasActions =\n can(BOTMANOR_PERMISSIONS.BUCKET_CREATE) ||\n can(BOTMANOR_PERMISSIONS.BUCKET_UPDATE) ||\n can(BOTMANOR_PERMISSIONS.BUCKET_DELETE);\n\n return (\n <div>\n <Link to={getPath(`buckets/${bucket.id}`)}>\n <div\n className=\"flex items-center gap-2 px-3 py-2 hover:bg-accent rounded-md transition-colors cursor-pointer group\"\n style={{ paddingLeft: `${level * 24 + 12}px` }}\n >\n {hasChildren ? (\n <button\n onClick={(e) => {\n e.preventDefault();\n onToggle(bucket.id);\n }}\n className=\"p-0.5 hover:bg-bg-sunken rounded\"\n >\n {isExpanded ? (\n <ChevronDown size={16} className=\"text-text-secondary\" />\n ) : (\n <ChevronRight size={16} className=\"text-text-secondary\" />\n )}\n </button>\n ) : (\n <div className=\"w-5\" />\n )}\n\n {isExpanded ? (\n <FolderOpen size={18} className=\"text-primary\" />\n ) : (\n <Folder size={18} className=\"text-text-secondary\" />\n )}\n\n <span className=\"flex-1 font-medium\">{bucket.name}</span>\n\n {hasActions && (\n <div className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setActiveMenu(isMenuOpen ? null : bucket.id);\n }}\n >\n <MoreHorizontal size={14} />\n </Button>\n {isMenuOpen && (\n <div className=\"absolute right-0 top-8 bg-popover border rounded-md shadow-lg z-50 py-1 min-w-[160px]\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_CREATE}>\n <button\n className=\"w-full flex items-center gap-2 px-3 py-2 text-sm hover:bg-accent text-left\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onCreateChild(bucket.id);\n }}\n >\n <Plus size={14} />\n Add Sub-Bucket\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_UPDATE}>\n <button\n className=\"w-full flex items-center gap-2 px-3 py-2 text-sm hover:bg-accent text-left\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onEdit(bucket);\n }}\n >\n <Edit size={14} />\n Edit\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_DELETE}>\n <button\n className=\"w-full flex items-center gap-2 px-3 py-2 text-sm hover:bg-accent text-status-error-text text-left\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onDelete(bucket.id);\n }}\n >\n <Trash2 size={14} />\n Delete\n </button>\n </BotmanorPermissionGate>\n </div>\n )}\n </div>\n )}\n </div>\n </Link>\n\n {isExpanded &&\n bucket.children.map((child) => (\n <BucketTreeItem\n key={child.id}\n bucket={child}\n level={level + 1}\n expanded={expanded}\n onToggle={onToggle}\n getPath={getPath}\n onEdit={onEdit}\n onDelete={onDelete}\n onCreateChild={onCreateChild}\n activeMenu={activeMenu}\n setActiveMenu={setActiveMenu}\n />\n ))}\n </div>\n );\n};\n\nexport const BucketsPage: FC = () => {\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [viewMode, setViewMode] = useState<'tree' | 'list'>('tree');\n const [expanded, setExpanded] = useState<Set<string>>(new Set(['bucket-1']));\n\n // Modal states\n const [showCreateModal, setShowCreateModal] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState<string | null>(null);\n const [editingBucket, setEditingBucket] = useState<BucketNode | null>(null);\n const [actionMenuBucket, setActionMenuBucket] = useState<string | null>(null);\n\n // Form state\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n visibility: 'PRIVATE' as Visibility,\n parentBucketId: undefined as string | undefined,\n });\n\n const {\n data: buckets,\n loading: loadingBuckets,\n error: bucketsError,\n refetch: refetchBuckets,\n } = useBuckets({ search });\n const {\n data: bucketTree,\n loading: loadingTree,\n error: treeError,\n refetch: refetchTree,\n } = useBucketTree();\n const [createBucket, createBucketResult] = useCreateBucket();\n const [updateBucket, updateBucketResult] = useUpdateBucket();\n const [deleteBucket, deleteBucketResult] = useDeleteBucket();\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const expandAll = () => {\n if (bucketTree) {\n const allIds = new Set<string>();\n const collectIds = (nodes: BucketNode[]) => {\n for (const node of nodes) {\n allIds.add(node.id);\n if (node.children) collectIds(node.children);\n }\n };\n collectIds(bucketTree);\n setExpanded(allIds);\n }\n };\n\n const collapseAll = () => {\n setExpanded(new Set());\n };\n\n const isLoading = viewMode === 'tree' ? loadingTree : loadingBuckets;\n const loadError = viewMode === 'tree' ? treeError : bucketsError;\n const retryLoad = viewMode === 'tree' ? refetchTree : refetchBuckets;\n\n const handleCreate = async () => {\n if (!formData.name) return;\n try {\n await createBucket({\n name: formData.name,\n slug: formData.name.toLowerCase().replace(/\\s+/g, '-'),\n description: formData.description,\n parentBucketId: formData.parentBucketId,\n metadata: { visibility: formData.visibility },\n });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create bucket');\n return;\n }\n toast.success(`Bucket \"${formData.name}\" created`);\n void refetchBuckets();\n void refetchTree();\n setShowCreateModal(false);\n setFormData({ name: '', description: '', visibility: 'PRIVATE', parentBucketId: undefined });\n };\n\n const handleUpdate = async () => {\n if (!editingBucket || !formData.name) return;\n try {\n await updateBucket({\n bucketId: editingBucket.id,\n input: {\n name: formData.name,\n description: formData.description,\n },\n });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update bucket');\n return;\n }\n toast.success('Bucket updated');\n void refetchBuckets();\n void refetchTree();\n setEditingBucket(null);\n };\n\n const handleDelete = async (bucketId: string) => {\n try {\n await deleteBucket(bucketId);\n if (isNative()) void nativeNotify('success');\n toast.success('Bucket deleted');\n void refetchBuckets();\n void refetchTree();\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to delete bucket');\n return;\n }\n setShowDeleteConfirm(null);\n };\n\n const startEditing = (bucket: BucketNode) => {\n setFormData({\n name: bucket.name,\n description: bucket.description ?? '',\n visibility: 'PRIVATE' as Visibility,\n parentBucketId: undefined,\n });\n setEditingBucket(bucket);\n setActionMenuBucket(null);\n };\n\n const openCreateModal = (parentId?: string) => {\n setFormData({\n name: '',\n description: '',\n visibility: 'PRIVATE',\n parentBucketId: parentId,\n });\n setShowCreateModal(true);\n };\n\n return (\n <PageLayout\n title=\"Buckets\"\n description=\"Organize your agents, apps, and resources into hierarchical folders\"\n actions={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => openCreateModal()}>\n Create Bucket\n </Button>\n </BotmanorPermissionGate>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<FolderTree size={18} />}>\n Buckets are folders for everything you build in BotManor — agents, bots, skills, knowledge\n and more — arranged in a hierarchy that mirrors how your team works. Group resources by\n team, project or environment so they stay organised, easy to find and simple to share as\n your account grows. Browse the tree or list view to manage that structure.\n </PagePurpose>\n\n {/* Summary */}\n {buckets.length > 0 ? (\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-2\">\n <GlassCard treatment=\"glass\" glow className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Total buckets</p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {buckets.length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Top-level buckets</p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {bucketTree.length}\n </p>\n </GlassCard>\n </div>\n ) : null}\n\n {/* Controls */}\n <div className=\"flex items-center justify-between 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 buckets...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={expandAll}>\n Expand All\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={collapseAll}>\n Collapse All\n </Button>\n <div className=\"flex border border-border-subtle rounded-md overflow-hidden\">\n <Button\n variant={viewMode === 'tree' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"rounded-none\"\n onClick={() => setViewMode('tree')}\n >\n <FolderTree size={16} />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"rounded-none\"\n onClick={() => setViewMode('list')}\n >\n <Settings size={16} />\n </Button>\n </div>\n </div>\n </div>\n\n {/* Tree View */}\n {viewMode === 'tree' && (\n <Card>\n <CardContent className=\"p-2\">\n {isLoading ? (\n <div className=\"space-y-2 p-4\">\n {[1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className=\"h-10 bg-bg-sunken motion-safe:animate-vc-shimmer rounded\"\n />\n ))}\n </div>\n ) : loadError ? (\n <ErrorState resource=\"buckets\" error={loadError} onRetry={() => void retryLoad()} />\n ) : bucketTree.length > 0 ? (\n <div className=\"py-2\" onClick={() => setActionMenuBucket(null)}>\n {bucketTree.map((bucket) => (\n <BucketTreeItem\n key={bucket.id}\n bucket={bucket}\n level={0}\n expanded={expanded}\n onToggle={handleToggle}\n getPath={getPath}\n onEdit={startEditing}\n onDelete={(id) => setShowDeleteConfirm(id)}\n onCreateChild={(parentId) => openCreateModal(parentId)}\n activeMenu={actionMenuBucket}\n setActiveMenu={setActionMenuBucket}\n />\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-files\"\n title=\"No buckets created\"\n description=\"Create buckets to organize your BotManor resources.\"\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => openCreateModal()}>\n Create Bucket\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </CardContent>\n </Card>\n )}\n\n {/* List View */}\n {viewMode === 'list' && (\n <>\n {isLoading ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-32 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : loadError ? (\n <ErrorState resource=\"buckets\" error={loadError} onRetry={() => void retryLoad()} />\n ) : buckets.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {buckets.map((bucket: BucketRecord) => (\n <Link key={bucket.id} to={getPath(`buckets/${bucket.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 <Folder className=\"h-5 w-5 text-primary\" />\n <div>\n <CardTitle className=\"text-base\">{bucket.name}</CardTitle>\n <CardDescription className=\"text-xs\">{bucket.path}</CardDescription>\n </div>\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">{bucket.slug}</span>\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(bucket.createdAt)}\n </span>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No buckets found\"\n description=\"Create buckets to organize your BotManor resources.\"\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => openCreateModal()}>\n Create Bucket\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </>\n )}\n\n {/* Info Card */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FolderTree size={18} />\n Organizing with Buckets\n </CardTitle>\n <CardDescription>\n Buckets help you organize and manage permissions for your resources\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"space-y-2\">\n <h4 className=\"font-medium\">Hierarchical Organization</h4>\n <p className=\"text-sm text-text-secondary\">\n Create nested folder structures to organize apps, agents, and other resources by\n team, project, or domain.\n </p>\n </div>\n <div className=\"space-y-2\">\n <h4 className=\"font-medium\">Inherited Permissions</h4>\n <p className=\"text-sm text-text-secondary\">\n Set owners, editors, and viewers at the bucket level. Permissions cascade to all\n items within.\n </p>\n </div>\n <div className=\"space-y-2\">\n <h4 className=\"font-medium\">Default Policies</h4>\n <p className=\"text-sm text-text-secondary\">\n Configure default policy bindings for buckets. All new items inherit these\n policies automatically.\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Create Bucket Modal */}\n {showCreateModal && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-md mx-4\">\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between\">\n <span>Create Bucket</span>\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setShowCreateModal(false)}>\n <X size={16} />\n </Button>\n </CardTitle>\n <CardDescription>\n {formData.parentBucketId ? 'Create a new sub-bucket' : 'Create a new root bucket'}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Bucket Name\" required>\n <Input\n placeholder=\"e.g., Marketing Team\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What is this bucket for?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={2}\n />\n </FormField>\n <FormField label=\"Visibility\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </CardContent>\n <div className=\"flex justify-end gap-2 p-4 border-t\">\n <Button variant=\"outline\" onClick={() => setShowCreateModal(false)}>\n Cancel\n </Button>\n <Button\n onClick={handleCreate}\n isLoading={createBucketResult.loading}\n disabled={!formData.name}\n leftIcon={<Save size={16} />}\n >\n Create Bucket\n </Button>\n </div>\n </Card>\n </div>\n )}\n\n {/* Edit Bucket Modal */}\n {editingBucket && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-md mx-4\">\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between\">\n <span>Edit Bucket</span>\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setEditingBucket(null)}>\n <X size={16} />\n </Button>\n </CardTitle>\n <CardDescription>Update bucket details</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Bucket Name\" required>\n <Input\n placeholder=\"e.g., Marketing Team\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What is this bucket for?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={2}\n />\n </FormField>\n <FormField label=\"Visibility\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </CardContent>\n <div className=\"flex justify-end gap-2 p-4 border-t\">\n <Button variant=\"outline\" onClick={() => setEditingBucket(null)}>\n Cancel\n </Button>\n <Button\n onClick={handleUpdate}\n isLoading={updateBucketResult.loading}\n disabled={!formData.name}\n leftIcon={<Save size={16} />}\n >\n Save Changes\n </Button>\n </div>\n </Card>\n </div>\n )}\n\n {/* Delete Confirmation Modal */}\n {showDeleteConfirm && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-md mx-4\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-status-error-text\">\n <Trash2 size={18} />\n Delete Bucket\n </CardTitle>\n <CardDescription>\n Are you sure you want to delete this bucket? This action cannot be undone.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary\">\n Note: Buckets with children or items cannot be deleted. You must delete or move\n all contents first.\n </p>\n </CardContent>\n <div className=\"flex justify-end gap-2 p-4 border-t\">\n <Button variant=\"outline\" onClick={() => setShowDeleteConfirm(null)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete(showDeleteConfirm);\n }}\n isLoading={deleteBucketResult.loading}\n leftIcon={<Trash2 size={16} />}\n >\n Delete Bucket\n </Button>\n </div>\n </Card>\n </div>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"BucketsPage.js","names":["SearchIcon","_Fragment","Textarea","Textarea$1","BucketTreeItem","isExpanded","expanded","bucket","hasChildren","isMenuOpen","activeMenu","can","useBotmanorCan","hasActions","BOTMANOR_PERMISSIONS","Link","getPath","level","e","onToggle","jsx","ChevronDown","ChevronRight","FolderOpen","Folder","Button","setActiveMenu","MoreHorizontal","BotmanorPermissionGate","onCreateChild","Plus","onEdit","Edit","onDelete","Trash2","child","BucketsPage","useBotlit","search","setSearch","useState","viewMode","setViewMode","setExpanded","showCreateModal","setShowCreateModal","showDeleteConfirm","setShowDeleteConfirm","editingBucket","setEditingBucket","actionMenuBucket","setActionMenuBucket","formData","setFormData","buckets","loadingBuckets","bucketsError","refetchBuckets","useBuckets","bucketTree","loadingTree","treeError","refetchTree","useBucketTree","createBucket","createBucketResult","useCreateBucket","updateBucket","updateBucketResult","useUpdateBucket","deleteBucket","deleteBucketResult","useDeleteBucket","handleToggle","next","prev","id","expandAll","allIds","collectIds","node","nodes","collapseAll","isLoading","loadError","retryLoad","handleCreate","err","toast","handleUpdate","handleDelete","bucketId","isNative","nativeNotify","startEditing","openCreateModal","parentId","PageLayout","PagePurpose","FolderTree","GlassCard","Search","Input","Settings","Card","CardContent","i","ErrorState","EmptyState","Fragment","CardHeader","CardTitle","CardDescription","formatRelativeTime","X","FormField","Save","nativeImpact"],"sources":["../../../src/botlit/pages/BucketsPage.tsx"],"sourcesContent":["/**\n * Buckets 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 { toast } from 'sonner';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n Plus,\n Search as SearchIcon,\n FolderTree,\n Folder,\n FolderOpen,\n ChevronRight,\n ChevronDown,\n MoreHorizontal,\n Settings,\n Edit,\n Trash2,\n X,\n Save,\n} from 'lucide-react';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport {\n useBuckets,\n useBucketTree,\n useCreateBucket,\n useDeleteBucket,\n useUpdateBucket,\n type BucketRecord,\n type BucketTreeNode,\n} from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport type { Visibility } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate, useBotmanorCan } from '../permissions';\n\ntype BucketNode = BucketTreeNode;\n\nconst BucketTreeItem: FC<{\n bucket: BucketNode;\n level: number;\n expanded: Set<string>;\n onToggle: (id: string) => void;\n getPath: (path: string) => string;\n onEdit: (bucket: BucketNode) => void;\n onDelete: (bucketId: string) => void;\n onCreateChild: (parentId: string) => void;\n activeMenu: string | null;\n setActiveMenu: (id: string | null) => void;\n}> = ({\n bucket,\n level,\n expanded,\n onToggle,\n getPath,\n onEdit,\n onDelete,\n onCreateChild,\n activeMenu,\n setActiveMenu,\n}) => {\n const isExpanded = expanded.has(bucket.id);\n const hasChildren = bucket.children.length > 0;\n const isMenuOpen = activeMenu === bucket.id;\n const can = useBotmanorCan();\n const hasActions =\n can(BOTMANOR_PERMISSIONS.BUCKET_CREATE) ||\n can(BOTMANOR_PERMISSIONS.BUCKET_UPDATE) ||\n can(BOTMANOR_PERMISSIONS.BUCKET_DELETE);\n\n return (\n <div>\n <Link to={getPath(`buckets/${bucket.id}`)}>\n <div\n className=\"flex items-center gap-2 px-3 py-2 hover:bg-accent rounded-md transition-colors cursor-pointer group\"\n style={{ paddingLeft: `${level * 24 + 12}px` }}\n >\n {hasChildren ? (\n <button\n onClick={(e) => {\n e.preventDefault();\n onToggle(bucket.id);\n }}\n className=\"p-0.5 hover:bg-bg-sunken rounded\"\n >\n {isExpanded ? (\n <ChevronDown size={16} className=\"text-text-secondary\" />\n ) : (\n <ChevronRight size={16} className=\"text-text-secondary\" />\n )}\n </button>\n ) : (\n <div className=\"w-5\" />\n )}\n\n {isExpanded ? (\n <FolderOpen size={18} className=\"text-primary\" />\n ) : (\n <Folder size={18} className=\"text-text-secondary\" />\n )}\n\n <span className=\"flex-1 font-medium\">{bucket.name}</span>\n\n {hasActions && (\n <div className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setActiveMenu(isMenuOpen ? null : bucket.id);\n }}\n >\n <MoreHorizontal size={14} />\n </Button>\n {isMenuOpen && (\n <div className=\"absolute right-0 top-8 bg-popover border rounded-md shadow-lg z-50 py-1 min-w-[160px]\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_CREATE}>\n <button\n className=\"w-full flex items-center gap-2 px-3 py-2 text-sm hover:bg-accent text-left\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onCreateChild(bucket.id);\n }}\n >\n <Plus size={14} />\n Add Sub-Bucket\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_UPDATE}>\n <button\n className=\"w-full flex items-center gap-2 px-3 py-2 text-sm hover:bg-accent text-left\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onEdit(bucket);\n }}\n >\n <Edit size={14} />\n Edit\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_DELETE}>\n <button\n className=\"w-full flex items-center gap-2 px-3 py-2 text-sm hover:bg-accent text-status-error-text text-left\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onDelete(bucket.id);\n }}\n >\n <Trash2 size={14} />\n Delete\n </button>\n </BotmanorPermissionGate>\n </div>\n )}\n </div>\n )}\n </div>\n </Link>\n\n {isExpanded &&\n bucket.children.map((child) => (\n <BucketTreeItem\n key={child.id}\n bucket={child}\n level={level + 1}\n expanded={expanded}\n onToggle={onToggle}\n getPath={getPath}\n onEdit={onEdit}\n onDelete={onDelete}\n onCreateChild={onCreateChild}\n activeMenu={activeMenu}\n setActiveMenu={setActiveMenu}\n />\n ))}\n </div>\n );\n};\n\nexport const BucketsPage: FC = () => {\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [viewMode, setViewMode] = useState<'tree' | 'list'>('tree');\n const [expanded, setExpanded] = useState<Set<string>>(new Set(['bucket-1']));\n\n // Modal states\n const [showCreateModal, setShowCreateModal] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState<string | null>(null);\n const [editingBucket, setEditingBucket] = useState<BucketNode | null>(null);\n const [actionMenuBucket, setActionMenuBucket] = useState<string | null>(null);\n\n // Form state\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n visibility: 'PRIVATE' as Visibility,\n parentBucketId: undefined as string | undefined,\n });\n\n const {\n data: buckets,\n loading: loadingBuckets,\n error: bucketsError,\n refetch: refetchBuckets,\n } = useBuckets({ search });\n const {\n data: bucketTree,\n loading: loadingTree,\n error: treeError,\n refetch: refetchTree,\n } = useBucketTree();\n const [createBucket, createBucketResult] = useCreateBucket();\n const [updateBucket, updateBucketResult] = useUpdateBucket();\n const [deleteBucket, deleteBucketResult] = useDeleteBucket();\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const expandAll = () => {\n if (bucketTree) {\n const allIds = new Set<string>();\n const collectIds = (nodes: BucketNode[]) => {\n for (const node of nodes) {\n allIds.add(node.id);\n if (node.children) collectIds(node.children);\n }\n };\n collectIds(bucketTree);\n setExpanded(allIds);\n }\n };\n\n const collapseAll = () => {\n setExpanded(new Set());\n };\n\n const isLoading = viewMode === 'tree' ? loadingTree : loadingBuckets;\n const loadError = viewMode === 'tree' ? treeError : bucketsError;\n const retryLoad = viewMode === 'tree' ? refetchTree : refetchBuckets;\n\n const handleCreate = async () => {\n if (!formData.name) return;\n try {\n await createBucket({\n name: formData.name,\n slug: formData.name.toLowerCase().replace(/\\s+/g, '-'),\n description: formData.description,\n parentBucketId: formData.parentBucketId,\n metadata: { visibility: formData.visibility },\n });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create bucket');\n return;\n }\n toast.success(`Bucket \"${formData.name}\" created`);\n void refetchBuckets();\n void refetchTree();\n setShowCreateModal(false);\n setFormData({ name: '', description: '', visibility: 'PRIVATE', parentBucketId: undefined });\n };\n\n const handleUpdate = async () => {\n if (!editingBucket || !formData.name) return;\n try {\n await updateBucket({\n bucketId: editingBucket.id,\n input: {\n name: formData.name,\n description: formData.description,\n },\n });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update bucket');\n return;\n }\n toast.success('Bucket updated');\n void refetchBuckets();\n void refetchTree();\n setEditingBucket(null);\n };\n\n const handleDelete = async (bucketId: string) => {\n try {\n await deleteBucket(bucketId);\n if (isNative()) void nativeNotify('success');\n toast.success('Bucket deleted');\n void refetchBuckets();\n void refetchTree();\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to delete bucket');\n return;\n }\n setShowDeleteConfirm(null);\n };\n\n const startEditing = (bucket: BucketNode) => {\n setFormData({\n name: bucket.name,\n description: bucket.description ?? '',\n visibility: 'PRIVATE' as Visibility,\n parentBucketId: undefined,\n });\n setEditingBucket(bucket);\n setActionMenuBucket(null);\n };\n\n const openCreateModal = (parentId?: string) => {\n setFormData({\n name: '',\n description: '',\n visibility: 'PRIVATE',\n parentBucketId: parentId,\n });\n setShowCreateModal(true);\n };\n\n return (\n <PageLayout\n title=\"Buckets\"\n description=\"Organize your agents, apps, and resources into hierarchical folders\"\n actions={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => openCreateModal()}>\n Create Bucket\n </Button>\n </BotmanorPermissionGate>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<FolderTree size={18} />}>\n Buckets are folders for everything you build in BotManor — agents, bots, skills, knowledge\n and more — arranged in a hierarchy that mirrors how your team works. Group resources by\n team, project or environment so they stay organised, easy to find and simple to share as\n your account grows. Browse the tree or list view to manage that structure.\n </PagePurpose>\n\n {/* Summary */}\n {buckets.length > 0 ? (\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-2\">\n <GlassCard treatment=\"glass\" glow className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Total buckets</p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {buckets.length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Top-level buckets</p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {bucketTree.length}\n </p>\n </GlassCard>\n </div>\n ) : null}\n\n {/* Controls */}\n <div className=\"flex items-center justify-between 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 buckets...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={expandAll}>\n Expand All\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={collapseAll}>\n Collapse All\n </Button>\n <div className=\"flex border border-border-subtle rounded-md overflow-hidden\">\n <Button\n variant={viewMode === 'tree' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"rounded-none\"\n onClick={() => setViewMode('tree')}\n >\n <FolderTree size={16} />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"rounded-none\"\n onClick={() => setViewMode('list')}\n >\n <Settings size={16} />\n </Button>\n </div>\n </div>\n </div>\n\n {/* Tree View */}\n {viewMode === 'tree' && (\n <Card>\n <CardContent className=\"p-2\">\n {isLoading ? (\n <div className=\"space-y-2 p-4\">\n {[1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className=\"h-10 bg-bg-sunken motion-safe:animate-vc-shimmer rounded\"\n />\n ))}\n </div>\n ) : loadError ? (\n <ErrorState resource=\"buckets\" error={loadError} onRetry={() => void retryLoad()} />\n ) : bucketTree.length > 0 ? (\n <div className=\"py-2\" onClick={() => setActionMenuBucket(null)}>\n {bucketTree.map((bucket) => (\n <BucketTreeItem\n key={bucket.id}\n bucket={bucket}\n level={0}\n expanded={expanded}\n onToggle={handleToggle}\n getPath={getPath}\n onEdit={startEditing}\n onDelete={(id) => setShowDeleteConfirm(id)}\n onCreateChild={(parentId) => openCreateModal(parentId)}\n activeMenu={actionMenuBucket}\n setActiveMenu={setActionMenuBucket}\n />\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-files\"\n title=\"No buckets created\"\n description=\"Create buckets to organize your BotManor resources.\"\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => openCreateModal()}>\n Create Bucket\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </CardContent>\n </Card>\n )}\n\n {/* List View */}\n {viewMode === 'list' && (\n <>\n {isLoading ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-32 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : loadError ? (\n <ErrorState resource=\"buckets\" error={loadError} onRetry={() => void retryLoad()} />\n ) : buckets.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {buckets.map((bucket: BucketRecord) => (\n <Link key={bucket.id} to={getPath(`buckets/${bucket.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 <Folder className=\"h-5 w-5 text-primary\" />\n <div>\n <CardTitle className=\"text-base\">{bucket.name}</CardTitle>\n <CardDescription className=\"text-xs\">{bucket.path}</CardDescription>\n </div>\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">{bucket.slug}</span>\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(bucket.createdAt)}\n </span>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No buckets found\"\n description=\"Create buckets to organize your BotManor resources.\"\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.BUCKET_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => openCreateModal()}>\n Create Bucket\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </>\n )}\n\n {/* Info Card */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FolderTree size={18} />\n Organizing with Buckets\n </CardTitle>\n <CardDescription>\n Buckets help you organize and manage permissions for your resources\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"space-y-2\">\n <h4 className=\"font-medium\">Hierarchical Organization</h4>\n <p className=\"text-sm text-text-secondary\">\n Create nested folder structures to organize apps, agents, and other resources by\n team, project, or domain.\n </p>\n </div>\n <div className=\"space-y-2\">\n <h4 className=\"font-medium\">Inherited Permissions</h4>\n <p className=\"text-sm text-text-secondary\">\n Set owners, editors, and viewers at the bucket level. Permissions cascade to all\n items within.\n </p>\n </div>\n <div className=\"space-y-2\">\n <h4 className=\"font-medium\">Default Policies</h4>\n <p className=\"text-sm text-text-secondary\">\n Configure default policy bindings for buckets. All new items inherit these\n policies automatically.\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Create Bucket Modal */}\n {showCreateModal && (\n <div className=\"fixed inset-0 bg-bg-overlay flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-md mx-4\">\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between\">\n <span>Create Bucket</span>\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setShowCreateModal(false)}>\n <X size={16} />\n </Button>\n </CardTitle>\n <CardDescription>\n {formData.parentBucketId ? 'Create a new sub-bucket' : 'Create a new root bucket'}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Bucket Name\" required>\n <Input\n placeholder=\"e.g., Marketing Team\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What is this bucket for?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={2}\n />\n </FormField>\n <FormField label=\"Visibility\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </CardContent>\n <div className=\"flex justify-end gap-2 p-4 border-t\">\n <Button variant=\"outline\" onClick={() => setShowCreateModal(false)}>\n Cancel\n </Button>\n <Button\n onClick={handleCreate}\n isLoading={createBucketResult.loading}\n disabled={!formData.name}\n leftIcon={<Save size={16} />}\n >\n Create Bucket\n </Button>\n </div>\n </Card>\n </div>\n )}\n\n {/* Edit Bucket Modal */}\n {editingBucket && (\n <div className=\"fixed inset-0 bg-bg-overlay flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-md mx-4\">\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between\">\n <span>Edit Bucket</span>\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setEditingBucket(null)}>\n <X size={16} />\n </Button>\n </CardTitle>\n <CardDescription>Update bucket details</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Bucket Name\" required>\n <Input\n placeholder=\"e.g., Marketing Team\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What is this bucket for?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={2}\n />\n </FormField>\n <FormField label=\"Visibility\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </CardContent>\n <div className=\"flex justify-end gap-2 p-4 border-t\">\n <Button variant=\"outline\" onClick={() => setEditingBucket(null)}>\n Cancel\n </Button>\n <Button\n onClick={handleUpdate}\n isLoading={updateBucketResult.loading}\n disabled={!formData.name}\n leftIcon={<Save size={16} />}\n >\n Save Changes\n </Button>\n </div>\n </Card>\n </div>\n )}\n\n {/* Delete Confirmation Modal */}\n {showDeleteConfirm && (\n <div className=\"fixed inset-0 bg-bg-overlay flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-md mx-4\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-status-error-text\">\n <Trash2 size={18} />\n Delete Bucket\n </CardTitle>\n <CardDescription>\n Are you sure you want to delete this bucket? This action cannot be undone.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary\">\n Note: Buckets with children or items cannot be deleted. You must delete or move\n all contents first.\n </p>\n </CardContent>\n <div className=\"flex justify-end gap-2 p-4 border-t\">\n <Button variant=\"outline\" onClick={() => setShowDeleteConfirm(null)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete(showDeleteConfirm);\n }}\n isLoading={deleteBucketResult.loading}\n leftIcon={<Trash2 size={16} />}\n >\n Delete Bucket\n </Button>\n </div>\n </Card>\n </div>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -810,7 +810,7 @@ var Ie = ({ type: e }) => {
810
810
  children: [
811
811
  /* @__PURE__ */ b(Oe, {
812
812
  size: 20,
813
- className: "text-green-600 shrink-0"
813
+ className: "text-status-success-text shrink-0"
814
814
  }),
815
815
  /* @__PURE__ */ x("div", {
816
816
  className: "min-w-0 flex-1",
@@ -833,7 +833,7 @@ var Ie = ({ type: e }) => {
833
833
  className: "flex items-center gap-1",
834
834
  children: z.isTokenExpired && /* @__PURE__ */ b(h, {
835
835
  variant: "outline",
836
- className: "text-xs text-amber-600 border-amber-400",
836
+ className: "text-xs text-status-warning-text border-status-warning-border",
837
837
  children: "Token expired"
838
838
  })
839
839
  })