@burdenoff/microfe-botmanor 2026.813.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 (160) hide show
  1. package/README.md +12 -0
  2. package/dist/botlit/BotlitRoutes.js +357 -0
  3. package/dist/botlit/BotlitRoutes.js.map +1 -0
  4. package/dist/botlit/BotmanorRoot.js +12 -0
  5. package/dist/botlit/BotmanorRoot.js.map +1 -0
  6. package/dist/botlit/BotmanorRootInner.js +101 -0
  7. package/dist/botlit/BotmanorRootInner.js.map +1 -0
  8. package/dist/botlit/components/Badge.js +39 -0
  9. package/dist/botlit/components/Badge.js.map +1 -0
  10. package/dist/botlit/components/Button.js +46 -0
  11. package/dist/botlit/components/Button.js.map +1 -0
  12. package/dist/botlit/components/Card.js +31 -0
  13. package/dist/botlit/components/Card.js.map +1 -0
  14. package/dist/botlit/components/ChannelSelectorSheet.js +130 -0
  15. package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -0
  16. package/dist/botlit/components/EmptyState.js +35 -0
  17. package/dist/botlit/components/EmptyState.js.map +1 -0
  18. package/dist/botlit/components/ErrorState.js +33 -0
  19. package/dist/botlit/components/ErrorState.js.map +1 -0
  20. package/dist/botlit/components/Input.js +59 -0
  21. package/dist/botlit/components/Input.js.map +1 -0
  22. package/dist/botlit/components/PageLayout.js +34 -0
  23. package/dist/botlit/components/PageLayout.js.map +1 -0
  24. package/dist/botlit/components/QuotaExhaustedDialog.js +20 -0
  25. package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -0
  26. package/dist/botlit/components/RouteLoader.js +52 -0
  27. package/dist/botlit/components/RouteLoader.js.map +1 -0
  28. package/dist/botlit/components/VersionHistoryPanel.js +144 -0
  29. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -0
  30. package/dist/botlit/components/WorkspaceRequired.js +70 -0
  31. package/dist/botlit/components/WorkspaceRequired.js.map +1 -0
  32. package/dist/botlit/hooks/index.js +16 -0
  33. package/dist/botlit/hooks/internal/mutationInput.js +16 -0
  34. package/dist/botlit/hooks/internal/mutationInput.js.map +1 -0
  35. package/dist/botlit/hooks/internal/workspaceGateway.js +99 -0
  36. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -0
  37. package/dist/botlit/hooks/useA2A.js +184 -0
  38. package/dist/botlit/hooks/useA2A.js.map +1 -0
  39. package/dist/botlit/hooks/useAgents.js +469 -0
  40. package/dist/botlit/hooks/useAgents.js.map +1 -0
  41. package/dist/botlit/hooks/useBots.js +306 -0
  42. package/dist/botlit/hooks/useBots.js.map +1 -0
  43. package/dist/botlit/hooks/useBuckets.js +119 -0
  44. package/dist/botlit/hooks/useBuckets.js.map +1 -0
  45. package/dist/botlit/hooks/useChannels.js +213 -0
  46. package/dist/botlit/hooks/useChannels.js.map +1 -0
  47. package/dist/botlit/hooks/useConversations.js +64 -0
  48. package/dist/botlit/hooks/useConversations.js.map +1 -0
  49. package/dist/botlit/hooks/useExecutions.js +86 -0
  50. package/dist/botlit/hooks/useExecutions.js.map +1 -0
  51. package/dist/botlit/hooks/useKnowledgeBases.js +113 -0
  52. package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -0
  53. package/dist/botlit/hooks/useLLMProviders.js +83 -0
  54. package/dist/botlit/hooks/useLLMProviders.js.map +1 -0
  55. package/dist/botlit/hooks/useMCPServers.js +134 -0
  56. package/dist/botlit/hooks/useMCPServers.js.map +1 -0
  57. package/dist/botlit/hooks/usePolicies.js +120 -0
  58. package/dist/botlit/hooks/usePolicies.js.map +1 -0
  59. package/dist/botlit/hooks/usePromptTemplates.js +161 -0
  60. package/dist/botlit/hooks/usePromptTemplates.js.map +1 -0
  61. package/dist/botlit/hooks/useRetrievalProfiles.js +146 -0
  62. package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -0
  63. package/dist/botlit/hooks/useSkills.js +132 -0
  64. package/dist/botlit/hooks/useSkills.js.map +1 -0
  65. package/dist/botlit/hooks/useStore.js +167 -0
  66. package/dist/botlit/hooks/useStore.js.map +1 -0
  67. package/dist/botlit/hooks/useUserPlatformConnection.js +172 -0
  68. package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -0
  69. package/dist/botlit/index.js +11 -0
  70. package/dist/botlit/pages/A2AAgentDetailPage.js +589 -0
  71. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -0
  72. package/dist/botlit/pages/A2ARegistryPage.js +240 -0
  73. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -0
  74. package/dist/botlit/pages/AgentBuilderPage.js +486 -0
  75. package/dist/botlit/pages/AgentBuilderPage.js.map +1 -0
  76. package/dist/botlit/pages/AgentDetailPage.js +517 -0
  77. package/dist/botlit/pages/AgentDetailPage.js.map +1 -0
  78. package/dist/botlit/pages/AgentsListPage.js +294 -0
  79. package/dist/botlit/pages/AgentsListPage.js.map +1 -0
  80. package/dist/botlit/pages/BotChannelsTab.js +530 -0
  81. package/dist/botlit/pages/BotChannelsTab.js.map +1 -0
  82. package/dist/botlit/pages/BotDetailPage.js +872 -0
  83. package/dist/botlit/pages/BotDetailPage.js.map +1 -0
  84. package/dist/botlit/pages/BotWorkflowTab.js +229 -0
  85. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -0
  86. package/dist/botlit/pages/BotsListPage.js +313 -0
  87. package/dist/botlit/pages/BotsListPage.js.map +1 -0
  88. package/dist/botlit/pages/BucketsPage.js +604 -0
  89. package/dist/botlit/pages/BucketsPage.js.map +1 -0
  90. package/dist/botlit/pages/ChannelDetailPage.js +955 -0
  91. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -0
  92. package/dist/botlit/pages/ChannelRoutesPage.js +218 -0
  93. package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -0
  94. package/dist/botlit/pages/ChannelsPage.js +304 -0
  95. package/dist/botlit/pages/ChannelsPage.js.map +1 -0
  96. package/dist/botlit/pages/ChatPage.js +247 -0
  97. package/dist/botlit/pages/ChatPage.js.map +1 -0
  98. package/dist/botlit/pages/DashboardPage.js +318 -0
  99. package/dist/botlit/pages/DashboardPage.js.map +1 -0
  100. package/dist/botlit/pages/ExecutionDetailPage.js +313 -0
  101. package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -0
  102. package/dist/botlit/pages/ExecutionsPage.js +294 -0
  103. package/dist/botlit/pages/ExecutionsPage.js.map +1 -0
  104. package/dist/botlit/pages/InstalledPackagesPage.js +619 -0
  105. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -0
  106. package/dist/botlit/pages/KnowledgeBaseDetailPage.js +473 -0
  107. package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -0
  108. package/dist/botlit/pages/KnowledgeBasesPage.js +150 -0
  109. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -0
  110. package/dist/botlit/pages/MCPServerDetailPage.js +550 -0
  111. package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -0
  112. package/dist/botlit/pages/MCPServersPage.js +321 -0
  113. package/dist/botlit/pages/MCPServersPage.js.map +1 -0
  114. package/dist/botlit/pages/PoliciesPage.js +224 -0
  115. package/dist/botlit/pages/PoliciesPage.js.map +1 -0
  116. package/dist/botlit/pages/PolicyDetailPage.js +861 -0
  117. package/dist/botlit/pages/PolicyDetailPage.js.map +1 -0
  118. package/dist/botlit/pages/PromptStudioPage.js +236 -0
  119. package/dist/botlit/pages/PromptStudioPage.js.map +1 -0
  120. package/dist/botlit/pages/PromptTemplateDetailPage.js +812 -0
  121. package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -0
  122. package/dist/botlit/pages/PromptTemplatesPage.js +269 -0
  123. package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -0
  124. package/dist/botlit/pages/RetrievalProfileDetailPage.js +559 -0
  125. package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -0
  126. package/dist/botlit/pages/RetrievalProfilesPage.js +219 -0
  127. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -0
  128. package/dist/botlit/pages/SettingsPage.js +655 -0
  129. package/dist/botlit/pages/SettingsPage.js.map +1 -0
  130. package/dist/botlit/pages/SkillDetailPage.js +778 -0
  131. package/dist/botlit/pages/SkillDetailPage.js.map +1 -0
  132. package/dist/botlit/pages/SkillsPage.js +206 -0
  133. package/dist/botlit/pages/SkillsPage.js.map +1 -0
  134. package/dist/botlit/pages/StorePackageDetailPage.js +462 -0
  135. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -0
  136. package/dist/botlit/pages/StorePage.js +315 -0
  137. package/dist/botlit/pages/StorePage.js.map +1 -0
  138. package/dist/botlit/providers/BotlitProvider.js +93 -0
  139. package/dist/botlit/providers/BotlitProvider.js.map +1 -0
  140. package/dist/botlit/store/botlitStore.js +101 -0
  141. package/dist/botlit/store/botlitStore.js.map +1 -0
  142. package/dist/botlit/utils/cn.js +10 -0
  143. package/dist/botlit/utils/cn.js.map +1 -0
  144. package/dist/botlit/utils/formatters.js +37 -0
  145. package/dist/botlit/utils/formatters.js.map +1 -0
  146. package/dist/botlit/utils/navigation.js +9 -0
  147. package/dist/botlit/utils/navigation.js.map +1 -0
  148. package/dist/botlit/utils/unions.js +14 -0
  149. package/dist/botlit/utils/unions.js.map +1 -0
  150. package/dist/generated/global-operations.js +66 -0
  151. package/dist/generated/global-operations.js.map +1 -0
  152. package/dist/generated/global-types.js +8 -0
  153. package/dist/generated/global-types.js.map +1 -0
  154. package/dist/generated/wspace-operations.js +1591 -0
  155. package/dist/generated/wspace-operations.js.map +1 -0
  156. package/dist/generated/wspace-types.js +12 -0
  157. package/dist/generated/wspace-types.js.map +1 -0
  158. package/dist/index.js +13 -0
  159. package/dist/utils/nativeBridge.js +2 -0
  160. package/package.json +133 -0
@@ -0,0 +1,315 @@
1
+ import { useBotlit as e } from "../providers/BotlitProvider.js";
2
+ import { formatRelativeTime as t } from "../utils/formatters.js";
3
+ import { PageLayout as n } from "../components/PageLayout.js";
4
+ import { Card as r, CardContent as i, CardDescription as a, CardHeader as o, CardTitle as s } from "../components/Card.js";
5
+ import { Button as c } from "../components/Button.js";
6
+ import { Badge as l } from "../components/Badge.js";
7
+ import { EmptyState as u } from "../components/EmptyState.js";
8
+ import { Input as d } from "../components/Input.js";
9
+ import { ErrorState as f } from "../components/ErrorState.js";
10
+ import { storePackageDescription as p, storePackageName as m, useInstallPackage as h, useInstalledPackages as g, useStorePackages as _ } from "../hooks/useStore.js";
11
+ import "../hooks/index.js";
12
+ import { InstallMode as v, PackageKind as y } from "../../generated/wspace-types.js";
13
+ import { useMemo as b, useState as x } from "react";
14
+ import { GlassCard as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
15
+ import { jsx as w, jsxs as T } from "react/jsx-runtime";
16
+ import { Link as E } from "react-router";
17
+ import { Bot as D, Check as O, Database as k, ExternalLink as A, FileText as j, Package as M, Search as N, Shield as P, Sparkles as F, Store as I, Wrench as L } from "lucide-react";
18
+ import { toast as R } from "sonner";
19
+ //#region src/botlit/pages/StorePage.tsx
20
+ var z = ({ kind: e, className: t }) => {
21
+ switch (e) {
22
+ case "APP": return /* @__PURE__ */ w(M, { className: t });
23
+ case "AGENT":
24
+ case "A2A_AGENT": return /* @__PURE__ */ w(D, { className: t });
25
+ case "MCP_PACK":
26
+ case "TOOL": return /* @__PURE__ */ w(L, { className: t });
27
+ case "PROMPT_TEMPLATE":
28
+ case "PROMPT": return /* @__PURE__ */ w(j, { className: t });
29
+ case "SKILL": return /* @__PURE__ */ w(F, { className: t });
30
+ case "RETRIEVAL_PROFILE":
31
+ case "KNOWLEDGE_BASE":
32
+ case "KB_TEMPLATE": return /* @__PURE__ */ w(k, { className: t });
33
+ case "POLICY_BUNDLE": return /* @__PURE__ */ w(P, { className: t });
34
+ default: return /* @__PURE__ */ w(M, { className: t });
35
+ }
36
+ }, B = {
37
+ APP: "Bot",
38
+ AGENT: "Agent",
39
+ MCP_PACK: "MCP Pack",
40
+ PROMPT_TEMPLATE: "Prompt Template",
41
+ PROMPT: "Prompt",
42
+ SKILL: "Skill",
43
+ RETRIEVAL_PROFILE: "Retrieval Profile",
44
+ POLICY_BUNDLE: "Policy Bundle",
45
+ CHANNEL_TEMPLATE: "Channel Template",
46
+ A2A_AGENT: "A2A Agent",
47
+ KB_TEMPLATE: "KB Template",
48
+ KNOWLEDGE_BASE: "Knowledge Base",
49
+ INTEGRATION: "Integration",
50
+ TEMPLATE: "Template",
51
+ TOOL: "Tool",
52
+ WORKFLOW: "Workflow"
53
+ }, V = () => {
54
+ let { getPath: D } = e(), [k, j] = x(""), [M, P] = x(null), [F, L] = x("recent"), [V, H] = x(null), { data: U, loading: W, error: G, refetch: K } = _(b(() => ({
55
+ search: k,
56
+ kind: M ? [M] : void 0,
57
+ sortBy: F
58
+ }), [
59
+ k,
60
+ M,
61
+ F
62
+ ])), { data: q, refetch: J } = g(), { install: Y } = h(), X = b(() => new Set(q.map((e) => e.package?.slug).filter((e) => typeof e == "string")), [q]), Z = async (e, t) => {
63
+ t.preventDefault(), t.stopPropagation(), H(e.slug);
64
+ try {
65
+ await Y({
66
+ packageId: e.id,
67
+ mode: v.Linked
68
+ }), R.success(`Installed "${m(e)}"`), J();
69
+ } catch (e) {
70
+ R.error(e instanceof Error ? e.message : "Failed to install package");
71
+ } finally {
72
+ H(null);
73
+ }
74
+ }, Q = [
75
+ y.Agent,
76
+ y.McpPack,
77
+ y.Skill,
78
+ y.PromptTemplate,
79
+ y.PolicyBundle
80
+ ];
81
+ return /* @__PURE__ */ w(n, {
82
+ title: "Botlit Store",
83
+ description: "Discover and install pre-built agents, tools, and configurations",
84
+ actions: /* @__PURE__ */ T("div", {
85
+ className: "flex gap-2",
86
+ children: [/* @__PURE__ */ w(c, {
87
+ variant: "outline",
88
+ children: /* @__PURE__ */ T(E, {
89
+ to: D("store/installed"),
90
+ children: [
91
+ "View Installed (",
92
+ q.length,
93
+ ")"
94
+ ]
95
+ })
96
+ }), /* @__PURE__ */ w(c, {
97
+ variant: "outline",
98
+ leftIcon: /* @__PURE__ */ w(A, { size: 16 }),
99
+ children: "Publish Package"
100
+ })]
101
+ }),
102
+ children: /* @__PURE__ */ T("div", {
103
+ className: "space-y-6",
104
+ children: [
105
+ /* @__PURE__ */ w(C, {
106
+ icon: /* @__PURE__ */ w(I, { size: 18 }),
107
+ children: "The store is a marketplace of ready-made building blocks — full bots, agents, MCP tool packs, prompt templates and policy bundles published by the Botlit team and the community. Browse and install a package to skip the setup and start from a working example, then customise it for your own use case instead of building everything from scratch."
108
+ }),
109
+ /* @__PURE__ */ T("div", {
110
+ className: "flex flex-wrap items-center gap-4",
111
+ children: [
112
+ /* @__PURE__ */ T("div", {
113
+ className: "relative flex-1 max-w-md",
114
+ children: [/* @__PURE__ */ w(N, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ w(d, {
115
+ placeholder: "Search packages...",
116
+ value: k,
117
+ onChange: (e) => j(e.target.value),
118
+ className: "pl-9"
119
+ })]
120
+ }),
121
+ /* @__PURE__ */ T("div", {
122
+ className: "flex gap-2",
123
+ children: [/* @__PURE__ */ w(c, {
124
+ variant: M === null ? "default" : "outline",
125
+ size: "sm",
126
+ onClick: () => P(null),
127
+ children: "All"
128
+ }), Q.map((e) => /* @__PURE__ */ w(c, {
129
+ variant: M === e ? "default" : "outline",
130
+ size: "sm",
131
+ onClick: () => P(e),
132
+ leftIcon: /* @__PURE__ */ w(z, {
133
+ kind: e,
134
+ className: "h-4 w-4"
135
+ }),
136
+ children: B[e]
137
+ }, e))]
138
+ }),
139
+ /* @__PURE__ */ T("select", {
140
+ "aria-label": "Sort packages",
141
+ className: "h-9 px-3 border border-border-default rounded-md bg-bg-surface text-sm",
142
+ value: F,
143
+ onChange: (e) => L(e.target.value),
144
+ children: [/* @__PURE__ */ w("option", {
145
+ value: "recent",
146
+ children: "Recently Published"
147
+ }), /* @__PURE__ */ w("option", {
148
+ value: "name",
149
+ children: "Name (A–Z)"
150
+ })]
151
+ })
152
+ ]
153
+ }),
154
+ /* @__PURE__ */ T("div", {
155
+ className: "grid grid-cols-1 md:grid-cols-3 gap-4",
156
+ children: [/* @__PURE__ */ w(S, {
157
+ treatment: "glass",
158
+ glow: !0,
159
+ className: "md:col-span-2 p-6",
160
+ children: /* @__PURE__ */ T("div", {
161
+ className: "flex items-start gap-4",
162
+ children: [/* @__PURE__ */ w("div", {
163
+ className: "p-3 bg-action-primary-bg/20 rounded-lg",
164
+ children: /* @__PURE__ */ w(I, { className: "h-8 w-8 text-primary" })
165
+ }), /* @__PURE__ */ T("div", { children: [
166
+ /* @__PURE__ */ w("h3", {
167
+ className: "text-lg font-semibold text-text-primary",
168
+ children: "Welcome to the Botlit Store"
169
+ }),
170
+ /* @__PURE__ */ w("p", {
171
+ className: "text-sm text-text-secondary mt-1",
172
+ children: "Discover production-ready agents, tool packs, and configurations built by the community and Botlit team. Install packages to jumpstart your AI applications."
173
+ }),
174
+ /* @__PURE__ */ T("div", {
175
+ className: "flex gap-4 mt-4",
176
+ children: [/* @__PURE__ */ T("div", {
177
+ className: "text-center",
178
+ children: [/* @__PURE__ */ w("p", {
179
+ className: "text-2xl font-bold tabular-nums",
180
+ children: U.length
181
+ }), /* @__PURE__ */ w("p", {
182
+ className: "text-xs text-text-secondary",
183
+ children: "Packages"
184
+ })]
185
+ }), /* @__PURE__ */ T("div", {
186
+ className: "text-center",
187
+ children: [/* @__PURE__ */ w("p", {
188
+ className: "text-2xl font-bold tabular-nums",
189
+ children: q.length
190
+ }), /* @__PURE__ */ w("p", {
191
+ className: "text-xs text-text-secondary",
192
+ children: "Installed"
193
+ })]
194
+ })]
195
+ })
196
+ ] })]
197
+ })
198
+ }), /* @__PURE__ */ T(r, { children: [/* @__PURE__ */ w(o, {
199
+ className: "pb-2",
200
+ children: /* @__PURE__ */ w(s, {
201
+ className: "text-sm",
202
+ children: "Quick Install"
203
+ })
204
+ }), /* @__PURE__ */ w(i, {
205
+ className: "space-y-2",
206
+ children: U.slice(0, 3).map((e) => /* @__PURE__ */ T("div", {
207
+ className: "flex items-center justify-between p-2 bg-bg-sunken rounded",
208
+ children: [/* @__PURE__ */ T("div", {
209
+ className: "flex items-center gap-2",
210
+ children: [/* @__PURE__ */ w(z, {
211
+ kind: e.kind,
212
+ className: "h-4 w-4 text-text-secondary"
213
+ }), /* @__PURE__ */ w("span", {
214
+ className: "text-sm truncate max-w-[150px]",
215
+ children: m(e)
216
+ })]
217
+ }), X.has(e.slug) ? /* @__PURE__ */ T(l, {
218
+ variant: "success",
219
+ className: "text-xs",
220
+ children: [/* @__PURE__ */ w(O, {
221
+ size: 12,
222
+ className: "mr-1"
223
+ }), "Installed"]
224
+ }) : /* @__PURE__ */ w(c, {
225
+ size: "sm",
226
+ variant: "ghost",
227
+ className: "h-6 text-xs",
228
+ onClick: (t) => void Z(e, t),
229
+ isLoading: V === e.slug,
230
+ children: "Install"
231
+ })]
232
+ }, e.id))
233
+ })] })]
234
+ }),
235
+ W ? /* @__PURE__ */ w("div", {
236
+ className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
237
+ children: [
238
+ 1,
239
+ 2,
240
+ 3,
241
+ 4,
242
+ 5,
243
+ 6
244
+ ].map((e) => /* @__PURE__ */ w("div", { className: "h-56 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
245
+ }) : G ? /* @__PURE__ */ w(f, {
246
+ resource: "store packages",
247
+ error: G,
248
+ onRetry: () => void K()
249
+ }) : U.length > 0 ? /* @__PURE__ */ w("div", {
250
+ className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
251
+ children: U.map((e) => /* @__PURE__ */ w(E, {
252
+ to: D(`store/package/${e.slug}`),
253
+ children: /* @__PURE__ */ T(r, {
254
+ className: "h-full hover:border-primary/50 transition-colors cursor-pointer",
255
+ children: [/* @__PURE__ */ w(o, { children: /* @__PURE__ */ T("div", {
256
+ className: "flex items-start justify-between",
257
+ children: [/* @__PURE__ */ T("div", {
258
+ className: "flex items-center gap-3",
259
+ children: [/* @__PURE__ */ w("div", {
260
+ className: "p-2 bg-action-primary-bg/10 rounded-lg",
261
+ children: /* @__PURE__ */ w(z, {
262
+ kind: e.kind,
263
+ className: "h-5 w-5 text-primary"
264
+ })
265
+ }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w(s, {
266
+ className: "text-base",
267
+ children: m(e)
268
+ }), /* @__PURE__ */ T(a, {
269
+ className: "text-xs",
270
+ children: [
271
+ e.slug,
272
+ " v",
273
+ e.version
274
+ ]
275
+ })] })]
276
+ }), X.has(e.slug) && /* @__PURE__ */ T(l, {
277
+ variant: "success",
278
+ className: "text-xs",
279
+ children: [/* @__PURE__ */ w(O, {
280
+ size: 10,
281
+ className: "mr-1"
282
+ }), "Installed"]
283
+ })]
284
+ }) }), /* @__PURE__ */ w(i, { children: /* @__PURE__ */ T("div", {
285
+ className: "space-y-3",
286
+ children: [/* @__PURE__ */ w("p", {
287
+ className: "text-sm text-text-secondary line-clamp-2",
288
+ children: p(e)
289
+ }), /* @__PURE__ */ T("div", {
290
+ className: "pt-3 border-t border-border-subtle flex items-center justify-between",
291
+ children: [/* @__PURE__ */ w(l, {
292
+ variant: "outline",
293
+ className: "text-xs",
294
+ children: B[e.kind] ?? e.kind
295
+ }), /* @__PURE__ */ w("span", {
296
+ className: "text-xs text-text-secondary",
297
+ children: t(e.publishedAt)
298
+ })]
299
+ })]
300
+ }) })]
301
+ })
302
+ }, e.id))
303
+ }) : /* @__PURE__ */ w(u, {
304
+ illustration: "empty-search",
305
+ title: "No packages found",
306
+ description: k || M ? "Try adjusting your search or filters." : "No packages available in the store yet."
307
+ })
308
+ ]
309
+ })
310
+ });
311
+ };
312
+ //#endregion
313
+ export { V as StorePage };
314
+
315
+ //# sourceMappingURL=StorePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorePage.js","names":[],"sources":["../../../src/botlit/pages/StorePage.tsx"],"sourcesContent":["/**\n * Store Page\n * @module botlit/pages\n */\n\nimport type { FC, MouseEvent } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Search as SearchIcon,\n Store,\n Package,\n Bot,\n Wrench,\n FileText,\n Sparkles,\n Database,\n Shield,\n Check,\n ExternalLink,\n} from 'lucide-react';\nimport { toast } from 'sonner';\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 } from '../components/Input';\nimport { Badge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport {\n useStorePackages,\n useInstalledPackages,\n useInstallPackage,\n storePackageName,\n storePackageDescription,\n type StorePackageRecord,\n type StoreSortBy,\n} from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport {\n InstallMode as GqlInstallMode,\n PackageKind as GqlPackageKind,\n} from '../../generated/wspace-types';\nimport type { PackageKind } from '../types';\n\nconst KindIcon: FC<{ kind: string; className?: string }> = ({ kind, className }) => {\n switch (kind) {\n case 'APP':\n return <Package className={className} />;\n case 'AGENT':\n case 'A2A_AGENT':\n return <Bot className={className} />;\n case 'MCP_PACK':\n case 'TOOL':\n return <Wrench className={className} />;\n case 'PROMPT_TEMPLATE':\n case 'PROMPT':\n return <FileText className={className} />;\n case 'SKILL':\n return <Sparkles className={className} />;\n case 'RETRIEVAL_PROFILE':\n case 'KNOWLEDGE_BASE':\n case 'KB_TEMPLATE':\n return <Database className={className} />;\n case 'POLICY_BUNDLE':\n return <Shield className={className} />;\n default:\n return <Package className={className} />;\n }\n};\n\nconst KindLabel: Record<string, string> = {\n APP: 'Bot',\n AGENT: 'Agent',\n MCP_PACK: 'MCP Pack',\n PROMPT_TEMPLATE: 'Prompt Template',\n PROMPT: 'Prompt',\n SKILL: 'Skill',\n RETRIEVAL_PROFILE: 'Retrieval Profile',\n POLICY_BUNDLE: 'Policy Bundle',\n CHANNEL_TEMPLATE: 'Channel Template',\n A2A_AGENT: 'A2A Agent',\n KB_TEMPLATE: 'KB Template',\n KNOWLEDGE_BASE: 'Knowledge Base',\n INTEGRATION: 'Integration',\n TEMPLATE: 'Template',\n TOOL: 'Tool',\n WORKFLOW: 'Workflow',\n};\n\nexport const StorePage: FC = () => {\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [selectedKind, setSelectedKind] = useState<PackageKind | null>(null);\n const [sortBy, setSortBy] = useState<StoreSortBy>('recent');\n const [installingSlug, setInstallingSlug] = useState<string | null>(null);\n\n const storeFilter = useMemo(\n () => ({ search, kind: selectedKind ? [selectedKind] : undefined, sortBy }),\n [search, selectedKind, sortBy]\n );\n const { data: packages, loading, error, refetch } = useStorePackages(storeFilter);\n const { data: installed, refetch: refetchInstalled } = useInstalledPackages();\n const { install } = useInstallPackage();\n\n const installedSlugs = useMemo(\n () =>\n new Set(\n installed\n .map((entry) => entry.package?.slug)\n .filter((slug): slug is string => typeof slug === 'string')\n ),\n [installed]\n );\n\n const handleInstall = async (pkg: StorePackageRecord, e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setInstallingSlug(pkg.slug);\n try {\n await install({ packageId: pkg.id, mode: GqlInstallMode.Linked });\n toast.success(`Installed \"${storePackageName(pkg)}\"`);\n void refetchInstalled();\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to install package');\n } finally {\n setInstallingSlug(null);\n }\n };\n\n const kinds: PackageKind[] = [\n GqlPackageKind.Agent,\n GqlPackageKind.McpPack,\n GqlPackageKind.Skill,\n GqlPackageKind.PromptTemplate,\n GqlPackageKind.PolicyBundle,\n ];\n\n return (\n <PageLayout\n title=\"Botlit Store\"\n description=\"Discover and install pre-built agents, tools, and configurations\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\">\n <Link to={getPath('store/installed')}>View Installed ({installed.length})</Link>\n </Button>\n <Button variant=\"outline\" leftIcon={<ExternalLink size={16} />}>\n Publish Package\n </Button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Store size={18} />}>\n The store is a marketplace of ready-made building blocks — full bots, agents, MCP tool\n packs, prompt templates and policy bundles published by the Botlit team and the community.\n Browse and install a package to skip the setup and start from a working example, then\n customise it for your own use case instead of building everything from scratch.\n </PagePurpose>\n\n {/* Search and Filters */}\n <div className=\"flex flex-wrap 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 packages...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n\n {/* Kind Filters */}\n <div className=\"flex gap-2\">\n <Button\n variant={selectedKind === null ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedKind(null)}\n >\n All\n </Button>\n {kinds.map((kind) => (\n <Button\n key={kind}\n variant={selectedKind === kind ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedKind(kind)}\n leftIcon={<KindIcon kind={kind} className=\"h-4 w-4\" />}\n >\n {KindLabel[kind]}\n </Button>\n ))}\n </div>\n\n {/* Sort */}\n <select\n aria-label=\"Sort packages\"\n className=\"h-9 px-3 border border-border-default rounded-md bg-bg-surface text-sm\"\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value as StoreSortBy)}\n >\n <option value=\"recent\">Recently Published</option>\n <option value=\"name\">Name (A–Z)</option>\n </select>\n </div>\n\n {/* Featured Section */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <GlassCard treatment=\"glass\" glow className=\"md:col-span-2 p-6\">\n <div className=\"flex items-start gap-4\">\n <div className=\"p-3 bg-action-primary-bg/20 rounded-lg\">\n <Store className=\"h-8 w-8 text-primary\" />\n </div>\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary\">\n Welcome to the Botlit Store\n </h3>\n <p className=\"text-sm text-text-secondary mt-1\">\n Discover production-ready agents, tool packs, and configurations built by the\n community and Botlit team. Install packages to jumpstart your AI applications.\n </p>\n <div className=\"flex gap-4 mt-4\">\n <div className=\"text-center\">\n <p className=\"text-2xl font-bold tabular-nums\">{packages.length}</p>\n <p className=\"text-xs text-text-secondary\">Packages</p>\n </div>\n <div className=\"text-center\">\n <p className=\"text-2xl font-bold tabular-nums\">{installed.length}</p>\n <p className=\"text-xs text-text-secondary\">Installed</p>\n </div>\n </div>\n </div>\n </div>\n </GlassCard>\n <Card>\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"text-sm\">Quick Install</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {packages.slice(0, 3).map((pkg: StorePackageRecord) => (\n <div\n key={pkg.id}\n className=\"flex items-center justify-between p-2 bg-bg-sunken rounded\"\n >\n <div className=\"flex items-center gap-2\">\n <KindIcon kind={pkg.kind} className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"text-sm truncate max-w-[150px]\">{storePackageName(pkg)}</span>\n </div>\n {installedSlugs.has(pkg.slug) ? (\n <Badge variant=\"success\" className=\"text-xs\">\n <Check size={12} className=\"mr-1\" />\n Installed\n </Badge>\n ) : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 text-xs\"\n onClick={(e) => void handleInstall(pkg, e)}\n isLoading={installingSlug === pkg.slug}\n >\n Install\n </Button>\n )}\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n {/* Packages Grid */}\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-56 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"store packages\" error={error} onRetry={() => void refetch()} />\n ) : packages.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {packages.map((pkg: StorePackageRecord) => (\n <Link key={pkg.id} to={getPath(`store/package/${pkg.slug}`)}>\n <Card className=\"h-full hover:border-primary/50 transition-colors cursor-pointer\">\n <CardHeader>\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-action-primary-bg/10 rounded-lg\">\n <KindIcon kind={pkg.kind} className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <CardTitle className=\"text-base\">{storePackageName(pkg)}</CardTitle>\n <CardDescription className=\"text-xs\">\n {pkg.slug} v{pkg.version}\n </CardDescription>\n </div>\n </div>\n {installedSlugs.has(pkg.slug) && (\n <Badge variant=\"success\" className=\"text-xs\">\n <Check size={10} className=\"mr-1\" />\n Installed\n </Badge>\n )}\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary line-clamp-2\">\n {storePackageDescription(pkg)}\n </p>\n\n {/* Footer */}\n <div className=\"pt-3 border-t border-border-subtle flex items-center justify-between\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {KindLabel[pkg.kind] ?? pkg.kind}\n </Badge>\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(pkg.publishedAt)}\n </span>\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No packages found\"\n description={\n search || selectedKind\n ? 'Try adjusting your search or filters.'\n : 'No packages available in the store yet.'\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { joinPath as e } from "../utils/navigation.js";
2
+ import { createContext as t, useCallback as n, useContext as r, useMemo as i } from "react";
3
+ import { jsx as a } from "react/jsx-runtime";
4
+ import { MemoryRouter as o, useNavigate as s } from "react-router";
5
+ //#region src/botlit/providers/BotlitProvider.tsx
6
+ var c = t(null);
7
+ function l() {
8
+ let e = r(c);
9
+ if (!e) throw Error("useBotlit must be used within a BotlitProvider");
10
+ return e;
11
+ }
12
+ var u = ({ children: t, basePath: r, currentUser: o, tenantId: l, workspaceId: u, apiGatewayUrl: d, authToken: f, onBotSelect: p, onAgentSelect: m }) => {
13
+ let h = s(), g = r || "/", _ = n((t) => e(g, t), [g]), v = n((t) => {
14
+ h(e(g, t));
15
+ }, [g, h]), y = i(() => ({
16
+ basePath: g,
17
+ navigate: void 0,
18
+ currentUser: o,
19
+ tenantId: l,
20
+ workspaceId: u,
21
+ apiGatewayUrl: d,
22
+ authToken: f,
23
+ onBotSelect: p,
24
+ onAgentSelect: m,
25
+ isStandalone: !0,
26
+ navigateTo: v,
27
+ getPath: _
28
+ }), [
29
+ g,
30
+ o,
31
+ l,
32
+ u,
33
+ d,
34
+ f,
35
+ p,
36
+ m,
37
+ v,
38
+ _
39
+ ]);
40
+ return /* @__PURE__ */ a(c.Provider, {
41
+ value: y,
42
+ children: t
43
+ });
44
+ }, d = ({ children: t, basePath: r, navigate: o, currentUser: s, tenantId: l, workspaceId: u, apiGatewayUrl: d, authToken: f, onBotSelect: p, onAgentSelect: m }) => {
45
+ let h = r || "/", g = n((t) => e(h, t), [h]), _ = n((t) => {
46
+ o(e(h, t));
47
+ }, [h, o]), v = i(() => ({
48
+ basePath: h,
49
+ navigate: o,
50
+ currentUser: s,
51
+ tenantId: l,
52
+ workspaceId: u,
53
+ apiGatewayUrl: d,
54
+ authToken: f,
55
+ onBotSelect: p,
56
+ onAgentSelect: m,
57
+ isStandalone: !1,
58
+ navigateTo: _,
59
+ getPath: g
60
+ }), [
61
+ h,
62
+ o,
63
+ s,
64
+ l,
65
+ u,
66
+ d,
67
+ f,
68
+ p,
69
+ m,
70
+ _,
71
+ g
72
+ ]);
73
+ return /* @__PURE__ */ a(c.Provider, {
74
+ value: v,
75
+ children: t
76
+ });
77
+ }, f = (e) => {
78
+ let { children: t, navigate: n } = e;
79
+ return n ? /* @__PURE__ */ a(d, {
80
+ ...e,
81
+ navigate: n,
82
+ isStandalone: !1,
83
+ children: t
84
+ }) : /* @__PURE__ */ a(o, { children: /* @__PURE__ */ a(u, {
85
+ ...e,
86
+ isStandalone: !0,
87
+ children: t
88
+ }) });
89
+ };
90
+ //#endregion
91
+ export { f as BotlitProvider, l as useBotlit };
92
+
93
+ //# sourceMappingURL=BotlitProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BotlitProvider.js","names":[],"sources":["../../../src/botlit/providers/BotlitProvider.tsx"],"sourcesContent":["/**\n * Botlit Context Provider\n * @module botlit/providers\n */\n\nimport type { FC, PropsWithChildren } from 'react';\nimport { createContext, useContext, useMemo, useCallback } from 'react';\nimport { MemoryRouter, useNavigate as useRouterNavigate } from 'react-router';\nimport type { BotmanorRootProps } from '../types';\nimport { joinPath } from '../utils/navigation';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface BotlitContextValue extends Omit<\n BotmanorRootProps,\n 'registerNavItems' | 'registerFooterItems' | 'navigate'\n> {\n isStandalone: boolean;\n /** Shell's navigate function (only available in integrated mode) */\n navigate?: (path: string) => void;\n /** Navigate to a path relative to basePath */\n navigateTo: (relativePath: string) => void;\n /** Get the full path for a relative path */\n getPath: (relativePath: string) => string;\n}\n\nconst BotlitContext = createContext<BotlitContextValue | null>(null);\n\n// ============================================================================\n// Hook\n// ============================================================================\n\nexport function useBotlit(): BotlitContextValue {\n const context = useContext(BotlitContext);\n if (!context) {\n throw new Error('useBotlit must be used within a BotlitProvider');\n }\n return context;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\ntype ProviderProps = Omit<BotmanorRootProps, 'registerNavItems' | 'registerFooterItems'> & {\n isStandalone: boolean;\n};\n\n/** Provider for standalone mode (has access to MemoryRouter) */\nconst StandaloneProviderInner: FC<PropsWithChildren<ProviderProps>> = ({\n children,\n basePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onBotSelect,\n onAgentSelect,\n}) => {\n // Always call hooks unconditionally in this component\n const routerNavigate = useRouterNavigate();\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n const fullPath = joinPath(effectiveBasePath, relativePath);\n routerNavigate(fullPath);\n },\n [effectiveBasePath, routerNavigate]\n );\n\n const contextValue = useMemo<BotlitContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate: undefined,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onBotSelect,\n onAgentSelect,\n isStandalone: true,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onBotSelect,\n onAgentSelect,\n navigateTo,\n getPath,\n ]\n );\n\n return <BotlitContext.Provider value={contextValue}>{children}</BotlitContext.Provider>;\n};\n\n/** Provider for integrated mode (shell provides navigate) */\nconst IntegratedProviderInner: FC<\n PropsWithChildren<ProviderProps & { navigate: (path: string) => void }>\n> = ({\n children,\n basePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onBotSelect,\n onAgentSelect,\n}) => {\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n const fullPath = joinPath(effectiveBasePath, relativePath);\n navigate(fullPath);\n },\n [effectiveBasePath, navigate]\n );\n\n const contextValue = useMemo<BotlitContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onBotSelect,\n onAgentSelect,\n isStandalone: false,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onBotSelect,\n onAgentSelect,\n navigateTo,\n getPath,\n ]\n );\n\n return <BotlitContext.Provider value={contextValue}>{children}</BotlitContext.Provider>;\n};\n\nexport const BotlitProvider: FC<PropsWithChildren<BotmanorRootProps>> = (props) => {\n const { children, navigate } = props;\n // Standalone mode: no navigate function provided (MFE manages its own router)\n // Integrated mode: navigate function provided by shell (shell provides router)\n const isStandalone = !navigate;\n\n // Standalone mode: wrap in MemoryRouter\n if (isStandalone) {\n return (\n <MemoryRouter>\n <StandaloneProviderInner {...props} isStandalone={true}>\n {children}\n </StandaloneProviderInner>\n </MemoryRouter>\n );\n }\n\n // Integrated mode: shell provides router\n return (\n <IntegratedProviderInner {...props} navigate={navigate} isStandalone={false}>\n {children}\n </IntegratedProviderInner>\n );\n};\n"],"mappings":";;;;;AA4BA,IAAM,IAAgB,EAAyC,KAAK;AAMpE,SAAgB,IAAgC;CAC9C,IAAM,IAAU,EAAW,EAAc;AACzC,KAAI,CAAC,EACH,OAAU,MAAM,iDAAiD;AAEnE,QAAO;;AAYT,IAAM,KAAiE,EACrE,aACA,aACA,gBACA,aACA,gBACA,kBACA,cACA,gBACA,uBACI;CAEJ,IAAM,IAAiB,GAAmB,EACpC,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,EAAa,EACnE,CAAC,EAAkB,CACpB,EAEK,IAAa,GAChB,MAAyB;AAExB,IADiB,EAAS,GAAmB,EAAa,CAClC;IAE1B,CAAC,GAAmB,EAAe,CACpC,EAEK,IAAe,SACZ;EACL,UAAU;EACV,UAAU,KAAA;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QAAO,kBAAC,EAAc,UAAf;EAAwB,OAAO;EAAe;EAAkC,CAAA;GAInF,KAED,EACH,aACA,aACA,aACA,gBACA,aACA,gBACA,kBACA,cACA,gBACA,uBACI;CACJ,IAAM,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,EAAa,EACnE,CAAC,EAAkB,CACpB,EAEK,IAAa,GAChB,MAAyB;AAExB,IADiB,EAAS,GAAmB,EAAa,CACxC;IAEpB,CAAC,GAAmB,EAAS,CAC9B,EAEK,IAAe,SACZ;EACL,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QAAO,kBAAC,EAAc,UAAf;EAAwB,OAAO;EAAe;EAAkC,CAAA;GAG5E,KAA4D,MAAU;CACjF,IAAM,EAAE,aAAU,gBAAa;AAiB/B,QAdsB,IAepB,kBAAC,GAAD;EAAyB,GAAI;EAAiB;EAAU,cAAc;EACnE;EACuB,CAAA,GAZxB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAyB,GAAI;EAAO,cAAc;EAC/C;EACuB,CAAA,EACb,CAAA"}
@@ -0,0 +1,101 @@
1
+ import { create as e } from "zustand";
2
+ import { devtools as t, persist as n } from "zustand/middleware";
3
+ import { createProfileScopedStorage as r } from "@burdenoff/fe-libs/shared/utils";
4
+ //#region src/botlit/store/botlitStore.ts
5
+ var i = {
6
+ viewMode: "grid",
7
+ sidebarCollapsed: !1,
8
+ activeTab: "bots",
9
+ selectedBot: null,
10
+ selectedAgent: null,
11
+ selectedKnowledgeBase: null,
12
+ selectedConversation: null,
13
+ botFilter: {
14
+ search: "",
15
+ status: void 0,
16
+ sortBy: "updatedAt",
17
+ sortOrder: "desc"
18
+ },
19
+ agentFilter: {
20
+ search: "",
21
+ appId: void 0,
22
+ type: void 0,
23
+ status: void 0,
24
+ sortBy: "updatedAt",
25
+ sortOrder: "desc"
26
+ },
27
+ conversationFilter: {
28
+ search: "",
29
+ botId: void 0,
30
+ agentId: void 0,
31
+ status: void 0,
32
+ sortBy: "updatedAt",
33
+ sortOrder: "desc"
34
+ },
35
+ isCreatingBot: !1,
36
+ isCreatingAgent: !1,
37
+ isUploadingDocument: !1,
38
+ isChatOpen: !1,
39
+ chatAgentId: null,
40
+ recentBots: [],
41
+ recentAgents: [],
42
+ recentConversations: []
43
+ }, a = e()(t(n((e) => ({
44
+ ...i,
45
+ setViewMode: (t) => e({ viewMode: t }),
46
+ toggleSidebar: () => e((e) => ({ sidebarCollapsed: !e.sidebarCollapsed })),
47
+ setActiveTab: (t) => e({ activeTab: t }),
48
+ setSelectedBot: (t) => e({ selectedBot: t }),
49
+ setSelectedAgent: (t) => e({ selectedAgent: t }),
50
+ setSelectedKnowledgeBase: (t) => e({ selectedKnowledgeBase: t }),
51
+ setSelectedConversation: (t) => e({ selectedConversation: t }),
52
+ updateBotFilter: (t) => e((e) => ({ botFilter: {
53
+ ...e.botFilter,
54
+ ...t
55
+ } })),
56
+ updateAgentFilter: (t) => e((e) => ({ agentFilter: {
57
+ ...e.agentFilter,
58
+ ...t
59
+ } })),
60
+ updateConversationFilter: (t) => e((e) => ({ conversationFilter: {
61
+ ...e.conversationFilter,
62
+ ...t
63
+ } })),
64
+ resetFilters: () => e({
65
+ botFilter: i.botFilter,
66
+ agentFilter: i.agentFilter,
67
+ conversationFilter: i.conversationFilter
68
+ }),
69
+ setIsCreatingBot: (t) => e({ isCreatingBot: t }),
70
+ setIsCreatingAgent: (t) => e({ isCreatingAgent: t }),
71
+ setIsUploadingDocument: (t) => e({ isUploadingDocument: t }),
72
+ openChat: (t) => e({
73
+ isChatOpen: !0,
74
+ chatAgentId: t
75
+ }),
76
+ closeChat: () => e({
77
+ isChatOpen: !1,
78
+ chatAgentId: null
79
+ }),
80
+ addRecentBot: (t) => e((e) => ({ recentBots: [t, ...e.recentBots.filter((e) => e !== t)].slice(0, 10) })),
81
+ addRecentAgent: (t) => e((e) => ({ recentAgents: [t, ...e.recentAgents.filter((e) => e !== t)].slice(0, 10) })),
82
+ addRecentConversation: (t) => e((e) => ({ recentConversations: [t, ...e.recentConversations.filter((e) => e !== t)].slice(0, 10) })),
83
+ reset: () => e(i)
84
+ }), {
85
+ name: "burdenoff-botlit-storage",
86
+ storage: r(),
87
+ partialize: (e) => ({
88
+ viewMode: e.viewMode,
89
+ sidebarCollapsed: e.sidebarCollapsed,
90
+ recentBots: e.recentBots,
91
+ recentAgents: e.recentAgents,
92
+ recentConversations: e.recentConversations
93
+ })
94
+ }), {
95
+ name: "Botlit Store",
96
+ enabled: !1
97
+ }));
98
+ //#endregion
99
+ export { a as useBotlitStore };
100
+
101
+ //# sourceMappingURL=botlitStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"botlitStore.js","names":[],"sources":["../../../src/botlit/store/botlitStore.ts"],"sourcesContent":["/**\n * Botlit Zustand Store\n * @module botlit/store\n */\n\nimport { create } from 'zustand';\nimport { devtools, persist } from 'zustand/middleware';\nimport { createProfileScopedStorage } from '@burdenoff/fe-libs/shared/utils';\nimport type {\n BotSummary,\n AgentSummary,\n KnowledgeBaseSummary,\n Conversation,\n ViewMode,\n BotFilter,\n AgentFilter,\n BaseFilter,\n} from '../types';\n\n// ConversationFilter extends BaseFilter with conversation-specific fields\ninterface ConversationFilter extends BaseFilter {\n botId?: string;\n agentId?: string;\n}\n\n// ============================================================================\n// State Interface\n// ============================================================================\n\ninterface BotlitState {\n // View state\n viewMode: ViewMode;\n sidebarCollapsed: boolean;\n activeTab: string;\n\n // Selected entities\n selectedBot: BotSummary | null;\n selectedAgent: AgentSummary | null;\n selectedKnowledgeBase: KnowledgeBaseSummary | null;\n selectedConversation: Conversation | null;\n\n // Filters\n botFilter: BotFilter;\n agentFilter: AgentFilter;\n conversationFilter: ConversationFilter;\n\n // UI State\n isCreatingBot: boolean;\n isCreatingAgent: boolean;\n isUploadingDocument: boolean;\n isChatOpen: boolean;\n chatAgentId: string | null;\n\n // Recent items\n recentBots: string[];\n recentAgents: string[];\n recentConversations: string[];\n\n // Actions\n setViewMode: (mode: ViewMode) => void;\n toggleSidebar: () => void;\n setActiveTab: (tab: string) => void;\n\n setSelectedBot: (bot: BotSummary | null) => void;\n setSelectedAgent: (agent: AgentSummary | null) => void;\n setSelectedKnowledgeBase: (kb: KnowledgeBaseSummary | null) => void;\n setSelectedConversation: (conversation: Conversation | null) => void;\n\n updateBotFilter: (filter: Partial<BotFilter>) => void;\n updateAgentFilter: (filter: Partial<AgentFilter>) => void;\n updateConversationFilter: (filter: Partial<ConversationFilter>) => void;\n resetFilters: () => void;\n\n setIsCreatingBot: (value: boolean) => void;\n setIsCreatingAgent: (value: boolean) => void;\n setIsUploadingDocument: (value: boolean) => void;\n openChat: (agentId: string) => void;\n closeChat: () => void;\n\n addRecentBot: (botId: string) => void;\n addRecentAgent: (agentId: string) => void;\n addRecentConversation: (conversationId: string) => void;\n\n reset: () => void;\n}\n\n// ============================================================================\n// Initial State\n// ============================================================================\n\nconst initialState = {\n viewMode: 'grid' as ViewMode,\n sidebarCollapsed: false,\n activeTab: 'bots',\n\n selectedBot: null,\n selectedAgent: null,\n selectedKnowledgeBase: null,\n selectedConversation: null,\n\n botFilter: {\n search: '',\n status: undefined,\n sortBy: 'updatedAt' as const,\n sortOrder: 'desc' as const,\n },\n agentFilter: {\n search: '',\n appId: undefined,\n type: undefined,\n status: undefined,\n sortBy: 'updatedAt' as const,\n sortOrder: 'desc' as const,\n },\n conversationFilter: {\n search: '',\n botId: undefined,\n agentId: undefined,\n status: undefined,\n sortBy: 'updatedAt' as const,\n sortOrder: 'desc' as const,\n },\n\n isCreatingBot: false,\n isCreatingAgent: false,\n isUploadingDocument: false,\n isChatOpen: false,\n chatAgentId: null,\n\n recentBots: [] as string[],\n recentAgents: [] as string[],\n recentConversations: [] as string[],\n};\n\n// ============================================================================\n// Store\n// ============================================================================\n\nexport const useBotlitStore = create<BotlitState>()(\n devtools(\n persist(\n (set) => ({\n ...initialState,\n\n // View actions\n setViewMode: (mode) => set({ viewMode: mode }),\n toggleSidebar: () => set((state) => ({ sidebarCollapsed: !state.sidebarCollapsed })),\n setActiveTab: (tab) => set({ activeTab: tab }),\n\n // Selection actions\n setSelectedBot: (bot) => set({ selectedBot: bot }),\n setSelectedAgent: (agent) => set({ selectedAgent: agent }),\n setSelectedKnowledgeBase: (kb) => set({ selectedKnowledgeBase: kb }),\n setSelectedConversation: (conversation) => set({ selectedConversation: conversation }),\n\n // Filter actions\n updateBotFilter: (filter) =>\n set((state) => ({\n botFilter: { ...state.botFilter, ...filter },\n })),\n updateAgentFilter: (filter) =>\n set((state) => ({\n agentFilter: { ...state.agentFilter, ...filter },\n })),\n updateConversationFilter: (filter) =>\n set((state) => ({\n conversationFilter: { ...state.conversationFilter, ...filter },\n })),\n resetFilters: () =>\n set({\n botFilter: initialState.botFilter,\n agentFilter: initialState.agentFilter,\n conversationFilter: initialState.conversationFilter,\n }),\n\n // UI state actions\n setIsCreatingBot: (value) => set({ isCreatingBot: value }),\n setIsCreatingAgent: (value) => set({ isCreatingAgent: value }),\n setIsUploadingDocument: (value) => set({ isUploadingDocument: value }),\n openChat: (agentId) => set({ isChatOpen: true, chatAgentId: agentId }),\n closeChat: () => set({ isChatOpen: false, chatAgentId: null }),\n\n // Recent items actions\n addRecentBot: (botId) =>\n set((state) => ({\n recentBots: [botId, ...state.recentBots.filter((id) => id !== botId)].slice(0, 10),\n })),\n addRecentAgent: (agentId) =>\n set((state) => ({\n recentAgents: [agentId, ...state.recentAgents.filter((id) => id !== agentId)].slice(\n 0,\n 10\n ),\n })),\n addRecentConversation: (conversationId) =>\n set((state) => ({\n recentConversations: [\n conversationId,\n ...state.recentConversations.filter((id) => id !== conversationId),\n ].slice(0, 10),\n })),\n\n // Reset\n reset: () => set(initialState),\n }),\n {\n name: 'burdenoff-botlit-storage',\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n viewMode: state.viewMode,\n sidebarCollapsed: state.sidebarCollapsed,\n recentBots: state.recentBots,\n recentAgents: state.recentAgents,\n recentConversations: state.recentConversations,\n }),\n }\n ),\n { name: 'Botlit Store', enabled: import.meta.env?.DEV === true }\n )\n);\n"],"mappings":";;;;AA0FA,IAAM,IAAe;CACnB,UAAU;CACV,kBAAkB;CAClB,WAAW;CAEX,aAAa;CACb,eAAe;CACf,uBAAuB;CACvB,sBAAsB;CAEtB,WAAW;EACT,QAAQ;EACR,QAAQ,KAAA;EACR,QAAQ;EACR,WAAW;EACZ;CACD,aAAa;EACX,QAAQ;EACR,OAAO,KAAA;EACP,MAAM,KAAA;EACN,QAAQ,KAAA;EACR,QAAQ;EACR,WAAW;EACZ;CACD,oBAAoB;EAClB,QAAQ;EACR,OAAO,KAAA;EACP,SAAS,KAAA;EACT,QAAQ,KAAA;EACR,QAAQ;EACR,WAAW;EACZ;CAED,eAAe;CACf,iBAAiB;CACjB,qBAAqB;CACrB,YAAY;CACZ,aAAa;CAEb,YAAY,EAAE;CACd,cAAc,EAAE;CAChB,qBAAqB,EAAE;CACxB,EAMY,IAAiB,GAAqB,CACjD,EACE,GACG,OAAS;CACR,GAAG;CAGH,cAAc,MAAS,EAAI,EAAE,UAAU,GAAM,CAAC;CAC9C,qBAAqB,GAAK,OAAW,EAAE,kBAAkB,CAAC,EAAM,kBAAkB,EAAE;CACpF,eAAe,MAAQ,EAAI,EAAE,WAAW,GAAK,CAAC;CAG9C,iBAAiB,MAAQ,EAAI,EAAE,aAAa,GAAK,CAAC;CAClD,mBAAmB,MAAU,EAAI,EAAE,eAAe,GAAO,CAAC;CAC1D,2BAA2B,MAAO,EAAI,EAAE,uBAAuB,GAAI,CAAC;CACpE,0BAA0B,MAAiB,EAAI,EAAE,sBAAsB,GAAc,CAAC;CAGtF,kBAAkB,MAChB,GAAK,OAAW,EACd,WAAW;EAAE,GAAG,EAAM;EAAW,GAAG;EAAQ,EAC7C,EAAE;CACL,oBAAoB,MAClB,GAAK,OAAW,EACd,aAAa;EAAE,GAAG,EAAM;EAAa,GAAG;EAAQ,EACjD,EAAE;CACL,2BAA2B,MACzB,GAAK,OAAW,EACd,oBAAoB;EAAE,GAAG,EAAM;EAAoB,GAAG;EAAQ,EAC/D,EAAE;CACL,oBACE,EAAI;EACF,WAAW,EAAa;EACxB,aAAa,EAAa;EAC1B,oBAAoB,EAAa;EAClC,CAAC;CAGJ,mBAAmB,MAAU,EAAI,EAAE,eAAe,GAAO,CAAC;CAC1D,qBAAqB,MAAU,EAAI,EAAE,iBAAiB,GAAO,CAAC;CAC9D,yBAAyB,MAAU,EAAI,EAAE,qBAAqB,GAAO,CAAC;CACtE,WAAW,MAAY,EAAI;EAAE,YAAY;EAAM,aAAa;EAAS,CAAC;CACtE,iBAAiB,EAAI;EAAE,YAAY;EAAO,aAAa;EAAM,CAAC;CAG9D,eAAe,MACb,GAAK,OAAW,EACd,YAAY,CAAC,GAAO,GAAG,EAAM,WAAW,QAAQ,MAAO,MAAO,EAAM,CAAC,CAAC,MAAM,GAAG,GAAG,EACnF,EAAE;CACL,iBAAiB,MACf,GAAK,OAAW,EACd,cAAc,CAAC,GAAS,GAAG,EAAM,aAAa,QAAQ,MAAO,MAAO,EAAQ,CAAC,CAAC,MAC5E,GACA,GACD,EACF,EAAE;CACL,wBAAwB,MACtB,GAAK,OAAW,EACd,qBAAqB,CACnB,GACA,GAAG,EAAM,oBAAoB,QAAQ,MAAO,MAAO,EAAe,CACnE,CAAC,MAAM,GAAG,GAAG,EACf,EAAE;CAGL,aAAa,EAAI,EAAa;CAC/B,GACD;CACE,MAAM;CACN,SAAS,GAA4B;CACrC,aAAa,OAAW;EACtB,UAAU,EAAM;EAChB,kBAAkB,EAAM;EACxB,YAAY,EAAM;EAClB,cAAc,EAAM;EACpB,qBAAqB,EAAM;EAC5B;CACF,CACF,EACD;CAAE,MAAM;CAAgB,SAAS;CAA+B,CACjE,CACF"}
@@ -0,0 +1,10 @@
1
+ import { clsx as e } from "clsx";
2
+ import { twMerge as t } from "tailwind-merge";
3
+ //#region src/botlit/utils/cn.ts
4
+ function n(...n) {
5
+ return t(e(n));
6
+ }
7
+ //#endregion
8
+ export { n as cn };
9
+
10
+ //# sourceMappingURL=cn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.js","names":[],"sources":["../../../src/botlit/utils/cn.ts"],"sourcesContent":["/**\n * Class name utility\n * @module botlit/utils\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;AAQA,SAAgB,EAAG,GAAG,GAA8B;AAClD,QAAO,EAAQ,EAAK,EAAO,CAAC"}
@@ -0,0 +1,37 @@
1
+ function e(e, t) {
2
+ if (!e) return "—";
3
+ let n = new Date(e);
4
+ return Number.isNaN(n.getTime()) ? "—" : n.toLocaleDateString("en-US", {
5
+ year: "numeric",
6
+ month: "short",
7
+ day: "numeric",
8
+ ...t
9
+ });
10
+ }
11
+ function t(t) {
12
+ if (!t) return "—";
13
+ let n = new Date(t);
14
+ if (Number.isNaN(n.getTime())) return "—";
15
+ let r = (/* @__PURE__ */ new Date()).getTime() - n.getTime(), i = Math.floor(r / 1e3), a = Math.floor(i / 60), o = Math.floor(a / 60), s = Math.floor(o / 24), c = Math.floor(s / 7), l = Math.floor(s / 30);
16
+ return i < 60 ? "just now" : a < 60 ? `${a} minute${a === 1 ? "" : "s"} ago` : o < 24 ? `${o} hour${o === 1 ? "" : "s"} ago` : s < 7 ? `${s} day${s === 1 ? "" : "s"} ago` : c < 4 ? `${c} week${c === 1 ? "" : "s"} ago` : l < 12 ? `${l} month${l === 1 ? "" : "s"} ago` : e(t);
17
+ }
18
+ function n(e) {
19
+ return (e ?? 0).toLocaleString("en-US");
20
+ }
21
+ function r(e) {
22
+ let t = e ?? 0;
23
+ return t < 1e3 ? `${t}ms` : t < 6e4 ? `${(t / 1e3).toFixed(1)}s` : `${Math.floor(t / 6e4)}m ${Math.floor(t % 6e4 / 1e3)}s`;
24
+ }
25
+ function i(e, t = "USD") {
26
+ let n = e ?? 0;
27
+ return new Intl.NumberFormat("en-US", {
28
+ style: "currency",
29
+ currency: t,
30
+ minimumFractionDigits: 2,
31
+ maximumFractionDigits: n < 1 ? 4 : 2
32
+ }).format(n);
33
+ }
34
+ //#endregion
35
+ export { i as formatCurrency, e as formatDate, r as formatDuration, n as formatNumber, t as formatRelativeTime };
36
+
37
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","names":[],"sources":["../../../src/botlit/utils/formatters.ts"],"sourcesContent":["/**\n * Formatting utilities\n * @module botlit/utils\n */\n\n/** Rendered in place of a value the service has not provided. */\nexport const MISSING_VALUE = '\\u2014';\n\n/**\n * Format a date string to a localized date format\n */\nexport function formatDate(\n dateString: string | null | undefined,\n options?: Intl.DateTimeFormatOptions\n): string {\n if (!dateString) return MISSING_VALUE;\n const date = new Date(dateString);\n if (Number.isNaN(date.getTime())) return MISSING_VALUE;\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n ...options,\n });\n}\n\n/**\n * Format a date string to a relative time (e.g., \"2 hours ago\")\n */\nexport function formatRelativeTime(dateString: string | null | undefined): string {\n if (!dateString) return MISSING_VALUE;\n const date = new Date(dateString);\n if (Number.isNaN(date.getTime())) return MISSING_VALUE;\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHr = Math.floor(diffMin / 60);\n const diffDays = Math.floor(diffHr / 24);\n const diffWeeks = Math.floor(diffDays / 7);\n const diffMonths = Math.floor(diffDays / 30);\n\n if (diffSec < 60) {\n return 'just now';\n } else if (diffMin < 60) {\n return `${diffMin} minute${diffMin === 1 ? '' : 's'} ago`;\n } else if (diffHr < 24) {\n return `${diffHr} hour${diffHr === 1 ? '' : 's'} ago`;\n } else if (diffDays < 7) {\n return `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;\n } else if (diffWeeks < 4) {\n return `${diffWeeks} week${diffWeeks === 1 ? '' : 's'} ago`;\n } else if (diffMonths < 12) {\n return `${diffMonths} month${diffMonths === 1 ? '' : 's'} ago`;\n } else {\n return formatDate(dateString);\n }\n}\n\n/**\n * Format a number with commas\n */\nexport function formatNumber(num: number | null | undefined): string {\n return (num ?? 0).toLocaleString('en-US');\n}\n\n/**\n * Format bytes to human-readable size\n */\nexport function formatBytes(bytesValue: number | null | undefined): string {\n const bytes = bytesValue ?? 0;\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\n/**\n * Format duration in milliseconds to human-readable format\n */\nexport function formatDuration(msValue: number | null | undefined): string {\n const ms = msValue ?? 0;\n if (ms < 1000) {\n return `${ms}ms`;\n } else if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n } else {\n const min = Math.floor(ms / 60000);\n const sec = Math.floor((ms % 60000) / 1000);\n return `${min}m ${sec}s`;\n }\n}\n\n/**\n * Format tokens count\n */\nexport function formatTokens(tokensValue: number | null | undefined): string {\n const tokens = tokensValue ?? 0;\n if (tokens < 1000) {\n return tokens.toString();\n } else if (tokens < 1000000) {\n return `${(tokens / 1000).toFixed(1)}K`;\n } else {\n return `${(tokens / 1000000).toFixed(2)}M`;\n }\n}\n\n/**\n * Format cost in USD\n */\nexport function formatCost(costValue: number | null | undefined): string {\n const cost = costValue ?? 0;\n if (cost < 0.01) {\n return `$${cost.toFixed(4)}`;\n } else if (cost < 1) {\n return `$${cost.toFixed(3)}`;\n } else {\n return `$${cost.toFixed(2)}`;\n }\n}\n\n/**\n * Format currency (alias for formatCost with more flexibility)\n */\nexport function formatCurrency(\n amountValue: number | null | undefined,\n currency: string = 'USD'\n): string {\n const amount = amountValue ?? 0;\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: amount < 1 ? 4 : 2,\n }).format(amount);\n}\n"],"mappings":"AAWA,SAAgB,EACd,GACA,GACQ;AACR,KAAI,CAAC,EAAY,QAAA;CACjB,IAAM,IAAO,IAAI,KAAK,EAAW;AAEjC,QADI,OAAO,MAAM,EAAK,SAAS,CAAC,GAAE,MAC3B,EAAK,mBAAmB,SAAS;EACtC,MAAM;EACN,OAAO;EACP,KAAK;EACL,GAAG;EACJ,CAAC;;AAMJ,SAAgB,EAAmB,GAA+C;AAChF,KAAI,CAAC,EAAY,QAAA;CACjB,IAAM,IAAO,IAAI,KAAK,EAAW;AACjC,KAAI,OAAO,MAAM,EAAK,SAAS,CAAC,CAAE,QAAA;CAElC,IAAM,qBADM,IAAI,MAAM,EACH,SAAS,GAAG,EAAK,SAAS,EACvC,IAAU,KAAK,MAAM,IAAS,IAAK,EACnC,IAAU,KAAK,MAAM,IAAU,GAAG,EAClC,IAAS,KAAK,MAAM,IAAU,GAAG,EACjC,IAAW,KAAK,MAAM,IAAS,GAAG,EAClC,IAAY,KAAK,MAAM,IAAW,EAAE,EACpC,IAAa,KAAK,MAAM,IAAW,GAAG;AAe1C,QAbE,IAAU,KACL,aACE,IAAU,KACZ,GAAG,EAAQ,SAAS,MAAY,IAAI,KAAK,IAAI,QAC3C,IAAS,KACX,GAAG,EAAO,OAAO,MAAW,IAAI,KAAK,IAAI,QACvC,IAAW,IACb,GAAG,EAAS,MAAM,MAAa,IAAI,KAAK,IAAI,QAC1C,IAAY,IACd,GAAG,EAAU,OAAO,MAAc,IAAI,KAAK,IAAI,QAC7C,IAAa,KACf,GAAG,EAAW,QAAQ,MAAe,IAAI,KAAK,IAAI,QAElD,EAAW,EAAW;;AAOjC,SAAgB,EAAa,GAAwC;AACnE,SAAQ,KAAO,GAAG,eAAe,QAAQ;;AAkB3C,SAAgB,EAAe,GAA4C;CACzE,IAAM,IAAK,KAAW;AAQpB,QAPE,IAAK,MACA,GAAG,EAAG,MACJ,IAAK,MACP,IAAI,IAAK,KAAM,QAAQ,EAAE,CAAC,KAI1B,GAFK,KAAK,MAAM,IAAK,IAAM,CAEpB,IADF,KAAK,MAAO,IAAK,MAAS,IAAK,CACrB;;AAmC1B,SAAgB,EACd,GACA,IAAmB,OACX;CACR,IAAM,IAAS,KAAe;AAC9B,QAAO,IAAI,KAAK,aAAa,SAAS;EACpC,OAAO;EACP;EACA,uBAAuB;EACvB,uBAAuB,IAAS,IAAI,IAAI;EACzC,CAAC,CAAC,OAAO,EAAO"}