@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,559 @@
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, StatusBadge as u } from "../components/Badge.js";
7
+ import { isNative as d, nativeImpact as f, nativeNotify as p } from "../../utils/nativeBridge.js";
8
+ import { EmptyState as m } from "../components/EmptyState.js";
9
+ import { FormField as h, Input as g, Textarea as _ } from "../components/Input.js";
10
+ import { useCreateRetrievalProfile as v, useDeleteRetrievalProfile as y, useRetrievalProfile as b, useUpdateRetrievalProfile as ee } from "../hooks/useRetrievalProfiles.js";
11
+ import { useEffect as x, useState as S } from "react";
12
+ import { PagePurpose as C } from "@burdenoff/fe-libs/ui";
13
+ import { Fragment as w, jsx as T, jsxs as E } from "react/jsx-runtime";
14
+ import { useParams as te } from "react-router";
15
+ import { ArrowLeft as ne, CheckSquare as re, Edit as D, FileText as O, Search as k, Settings as A, Target as j, Trash2 as ie } from "lucide-react";
16
+ import { toast as M } from "sonner";
17
+ //#region src/botlit/pages/RetrievalProfileDetailPage.tsx
18
+ var N = {
19
+ name: "",
20
+ description: "",
21
+ strategyMode: "HYBRID",
22
+ topK: 10,
23
+ reranker: "OFF",
24
+ queryRewrite: "OFF",
25
+ multiHop: "OFF",
26
+ citationsRequired: !0,
27
+ showSources: !0,
28
+ minSources: 1,
29
+ snippetMaxChars: 500,
30
+ citationFormat: "[{index}]",
31
+ minRelevanceScore: .7,
32
+ noAnswerIfBelowThreshold: !0
33
+ }, P = [
34
+ "VECTOR",
35
+ "HYBRID",
36
+ "BM25_ONLY"
37
+ ];
38
+ function F(e) {
39
+ return e === "ON" ? "ON" : "OFF";
40
+ }
41
+ function I(e) {
42
+ return P.includes(e) ? e : "HYBRID";
43
+ }
44
+ function L(e) {
45
+ return {
46
+ name: e.name,
47
+ description: e.description ?? "",
48
+ strategyMode: I(e.strategyMode),
49
+ topK: e.topK,
50
+ reranker: F(e.reranker),
51
+ queryRewrite: F(e.queryRewrite),
52
+ multiHop: F(e.multiHop),
53
+ citationsRequired: e.citationsRequired,
54
+ showSources: e.showSources,
55
+ minSources: e.minSources,
56
+ snippetMaxChars: e.snippetMaxChars,
57
+ citationFormat: e.citationFormat ?? N.citationFormat,
58
+ minRelevanceScore: e.minRelevanceScore ?? N.minRelevanceScore,
59
+ noAnswerIfBelowThreshold: e.noAnswerIfBelowThreshold
60
+ };
61
+ }
62
+ function R(e) {
63
+ return {
64
+ name: e.name.trim(),
65
+ description: e.description.trim() || null,
66
+ strategyMode: e.strategyMode,
67
+ topK: e.topK,
68
+ reranker: e.reranker,
69
+ queryRewrite: e.queryRewrite,
70
+ multiHop: e.multiHop,
71
+ citationsRequired: e.citationsRequired,
72
+ showSources: e.showSources,
73
+ minSources: e.minSources,
74
+ snippetMaxChars: e.snippetMaxChars,
75
+ citationFormat: e.citationFormat.trim() || null,
76
+ minRelevanceScore: e.minRelevanceScore,
77
+ noAnswerIfBelowThreshold: e.noAnswerIfBelowThreshold
78
+ };
79
+ }
80
+ function z(e, t) {
81
+ let n = Number(e);
82
+ return e.trim() !== "" && Number.isFinite(n) ? n : t;
83
+ }
84
+ var B = ({ isNew: I = !1 }) => {
85
+ let { profileId: B } = te(), { navigateTo: V } = e(), { data: H, loading: U, refetch: W } = b(I ? void 0 : B), { create: G, loading: K } = v(), { update: q, loading: J } = ee(), { remove: ae, loading: oe } = y(), [Y, X] = S(I), [se, Z] = S(!1), [Q, $] = S(N);
86
+ if (x(() => {
87
+ H && !I && $(L(H));
88
+ }, [H, I]), U && !I) return /* @__PURE__ */ T(n, {
89
+ title: "Loading...",
90
+ children: /* @__PURE__ */ T("div", { className: "h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" })
91
+ });
92
+ if (!H && !I) return /* @__PURE__ */ T(n, {
93
+ title: "Profile Not Found",
94
+ children: /* @__PURE__ */ T(m, {
95
+ illustration: "empty-files",
96
+ title: "Profile Not Found",
97
+ description: "The retrieval profile doesn't exist.",
98
+ action: /* @__PURE__ */ T(c, {
99
+ onClick: () => V("retrieval-profiles"),
100
+ children: "Back to Profiles"
101
+ })
102
+ })
103
+ });
104
+ let ce = async () => {
105
+ if (!Q.name.trim()) {
106
+ M.error("Name is required");
107
+ return;
108
+ }
109
+ try {
110
+ if (I) {
111
+ let e = await G(R(Q));
112
+ M.success(`Profile "${e.name}" created`), V(`retrieval-profiles/${e.id}`);
113
+ return;
114
+ }
115
+ if (!B) return;
116
+ await q({
117
+ profileId: B,
118
+ input: R(Q)
119
+ }), await W(), M.success("Retrieval profile updated"), X(!1);
120
+ } catch (e) {
121
+ M.error(e instanceof Error ? e.message : "Failed to save retrieval profile");
122
+ }
123
+ }, le = async () => {
124
+ if (B) try {
125
+ await ae(B), d() && p("success"), M.success("Retrieval profile deleted"), V("retrieval-profiles");
126
+ } catch (e) {
127
+ d() && p("error"), M.error(e instanceof Error ? e.message : "Failed to delete retrieval profile");
128
+ }
129
+ };
130
+ return /* @__PURE__ */ T(n, {
131
+ title: /* @__PURE__ */ E("div", {
132
+ className: "flex items-center gap-3",
133
+ children: [
134
+ /* @__PURE__ */ T(c, {
135
+ variant: "ghost",
136
+ size: "icon",
137
+ onClick: () => V("retrieval-profiles"),
138
+ children: /* @__PURE__ */ T(ne, { size: 20 })
139
+ }),
140
+ /* @__PURE__ */ T(k, {
141
+ size: 24,
142
+ className: "text-primary"
143
+ }),
144
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ E("div", {
145
+ className: "flex items-center gap-2",
146
+ children: [/* @__PURE__ */ T("span", { children: I ? "New Retrieval Profile" : H?.name }), !I && H && /* @__PURE__ */ T(u, { status: H.status })]
147
+ }), !I && H?.description && /* @__PURE__ */ T("p", {
148
+ className: "text-sm font-normal text-text-secondary",
149
+ children: H.description
150
+ })] })
151
+ ]
152
+ }),
153
+ actions: /* @__PURE__ */ T("div", {
154
+ className: "flex gap-2",
155
+ children: Y ? /* @__PURE__ */ E(w, { children: [/* @__PURE__ */ T(c, {
156
+ variant: "outline",
157
+ onClick: () => {
158
+ if (I) {
159
+ V("retrieval-profiles");
160
+ return;
161
+ }
162
+ H && $(L(H)), X(!1);
163
+ },
164
+ children: "Cancel"
165
+ }), /* @__PURE__ */ T(c, {
166
+ onClick: ce,
167
+ isLoading: K || J,
168
+ children: I ? "Create Profile" : "Save Changes"
169
+ })] }) : /* @__PURE__ */ E(w, { children: [/* @__PURE__ */ T(c, {
170
+ variant: "outline",
171
+ leftIcon: /* @__PURE__ */ T(D, { size: 16 }),
172
+ onClick: () => {
173
+ H && $(L(H)), X(!0);
174
+ },
175
+ children: "Edit"
176
+ }), se ? /* @__PURE__ */ E("div", {
177
+ className: "flex gap-2",
178
+ children: [/* @__PURE__ */ T(c, {
179
+ variant: "outline",
180
+ size: "sm",
181
+ onClick: () => Z(!1),
182
+ children: "Cancel"
183
+ }), /* @__PURE__ */ T(c, {
184
+ variant: "destructive",
185
+ size: "sm",
186
+ onClick: () => {
187
+ f("medium"), le();
188
+ },
189
+ isLoading: oe,
190
+ children: "Confirm Delete"
191
+ })]
192
+ }) : /* @__PURE__ */ T(c, {
193
+ variant: "destructive",
194
+ leftIcon: /* @__PURE__ */ T(ie, { size: 16 }),
195
+ onClick: () => Z(!0),
196
+ children: "Delete"
197
+ })] })
198
+ }),
199
+ children: /* @__PURE__ */ E("div", {
200
+ className: "space-y-6",
201
+ children: [
202
+ /* @__PURE__ */ T(C, {
203
+ icon: /* @__PURE__ */ T(A, { size: 18 }),
204
+ children: "This profile defines exactly how an agent searches your knowledge — the retrieval mode, how many results to pull, whether to rerank them and whether to rewrite the query first. Adjust the strategy here to dial in the balance between answer accuracy and speed, then attach the profile to the agents that should use it."
205
+ }),
206
+ Y ? /* @__PURE__ */ E(r, { children: [/* @__PURE__ */ T(o, { children: /* @__PURE__ */ T(s, { children: "Basic Information" }) }), /* @__PURE__ */ E(i, {
207
+ className: "space-y-4",
208
+ children: [/* @__PURE__ */ T(h, {
209
+ label: "Name",
210
+ required: !0,
211
+ children: /* @__PURE__ */ T(g, {
212
+ value: Q.name,
213
+ onChange: (e) => $({
214
+ ...Q,
215
+ name: e.target.value
216
+ }),
217
+ placeholder: "e.g., Default Hybrid Search"
218
+ })
219
+ }), /* @__PURE__ */ T(h, {
220
+ label: "Description",
221
+ children: /* @__PURE__ */ T(_, {
222
+ value: Q.description,
223
+ onChange: (e) => $({
224
+ ...Q,
225
+ description: e.target.value
226
+ }),
227
+ placeholder: "Describe when to use this profile...",
228
+ rows: 3
229
+ })
230
+ })]
231
+ })] }) : null,
232
+ /* @__PURE__ */ E(r, {
233
+ treatment: "glass",
234
+ glow: !0,
235
+ children: [/* @__PURE__ */ E(o, { children: [/* @__PURE__ */ E(s, {
236
+ className: "flex items-center gap-2",
237
+ children: [/* @__PURE__ */ T(A, { size: 18 }), "Retrieval Strategy"]
238
+ }), /* @__PURE__ */ T(a, { children: "How documents are searched and ranked" })] }), /* @__PURE__ */ T(i, {
239
+ className: "space-y-4",
240
+ children: Y ? /* @__PURE__ */ E(w, { children: [
241
+ /* @__PURE__ */ T(h, {
242
+ label: "Retrieval Mode",
243
+ children: /* @__PURE__ */ T("div", {
244
+ className: "flex gap-4",
245
+ children: P.map((e) => /* @__PURE__ */ E("label", {
246
+ className: "flex items-center gap-2",
247
+ children: [/* @__PURE__ */ T("input", {
248
+ type: "radio",
249
+ name: "strategyMode",
250
+ checked: Q.strategyMode === e,
251
+ onChange: () => $({
252
+ ...Q,
253
+ strategyMode: e
254
+ })
255
+ }), /* @__PURE__ */ T("span", {
256
+ className: "capitalize",
257
+ children: e.replace("_", " ")
258
+ })]
259
+ }, e))
260
+ })
261
+ }),
262
+ /* @__PURE__ */ E("div", {
263
+ className: "grid grid-cols-2 gap-4",
264
+ children: [/* @__PURE__ */ T(h, {
265
+ label: "Top K Results",
266
+ children: /* @__PURE__ */ T(g, {
267
+ type: "number",
268
+ value: Q.topK,
269
+ onChange: (e) => $({
270
+ ...Q,
271
+ topK: z(e.target.value, N.topK)
272
+ })
273
+ })
274
+ }), /* @__PURE__ */ T(h, {
275
+ label: "Reranker",
276
+ children: /* @__PURE__ */ E("select", {
277
+ className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
278
+ value: Q.reranker,
279
+ onChange: (e) => $({
280
+ ...Q,
281
+ reranker: F(e.target.value)
282
+ }),
283
+ children: [/* @__PURE__ */ T("option", {
284
+ value: "OFF",
285
+ children: "Disabled"
286
+ }), /* @__PURE__ */ T("option", {
287
+ value: "ON",
288
+ children: "Enabled"
289
+ })]
290
+ })
291
+ })]
292
+ }),
293
+ /* @__PURE__ */ E("div", {
294
+ className: "grid grid-cols-2 gap-4",
295
+ children: [/* @__PURE__ */ T(h, {
296
+ label: "Query Rewrite",
297
+ children: /* @__PURE__ */ E("select", {
298
+ className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
299
+ value: Q.queryRewrite,
300
+ onChange: (e) => $({
301
+ ...Q,
302
+ queryRewrite: F(e.target.value)
303
+ }),
304
+ children: [/* @__PURE__ */ T("option", {
305
+ value: "OFF",
306
+ children: "Disabled"
307
+ }), /* @__PURE__ */ T("option", {
308
+ value: "ON",
309
+ children: "Enabled"
310
+ })]
311
+ })
312
+ }), /* @__PURE__ */ T(h, {
313
+ label: "Multi-Hop",
314
+ children: /* @__PURE__ */ E("select", {
315
+ className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
316
+ value: Q.multiHop,
317
+ onChange: (e) => $({
318
+ ...Q,
319
+ multiHop: F(e.target.value)
320
+ }),
321
+ children: [/* @__PURE__ */ T("option", {
322
+ value: "OFF",
323
+ children: "Disabled"
324
+ }), /* @__PURE__ */ T("option", {
325
+ value: "ON",
326
+ children: "Enabled"
327
+ })]
328
+ })
329
+ })]
330
+ })
331
+ ] }) : /* @__PURE__ */ E("div", {
332
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
333
+ children: [
334
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
335
+ className: "text-sm text-text-secondary",
336
+ children: "Mode"
337
+ }), /* @__PURE__ */ T(l, {
338
+ variant: "outline",
339
+ children: H?.strategyMode
340
+ })] }),
341
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
342
+ className: "text-sm text-text-secondary",
343
+ children: "Top K"
344
+ }), /* @__PURE__ */ T("p", {
345
+ className: "font-medium",
346
+ children: H?.topK
347
+ })] }),
348
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
349
+ className: "text-sm text-text-secondary",
350
+ children: "Reranker"
351
+ }), /* @__PURE__ */ T(l, {
352
+ variant: H?.reranker === "ON" ? "success" : "secondary",
353
+ children: H?.reranker
354
+ })] }),
355
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
356
+ className: "text-sm text-text-secondary",
357
+ children: "Query Rewrite"
358
+ }), /* @__PURE__ */ T(l, {
359
+ variant: H?.queryRewrite === "ON" ? "success" : "secondary",
360
+ children: H?.queryRewrite
361
+ })] })
362
+ ]
363
+ })
364
+ })]
365
+ }),
366
+ /* @__PURE__ */ E(r, { children: [/* @__PURE__ */ E(o, { children: [/* @__PURE__ */ E(s, {
367
+ className: "flex items-center gap-2",
368
+ children: [/* @__PURE__ */ T(O, { size: 18 }), "Grounding & Citations"]
369
+ }), /* @__PURE__ */ T(a, { children: "How sources are cited in responses" })] }), /* @__PURE__ */ T(i, {
370
+ className: "space-y-4",
371
+ children: Y ? /* @__PURE__ */ E(w, { children: [
372
+ /* @__PURE__ */ E("div", {
373
+ className: "flex items-center gap-4",
374
+ children: [/* @__PURE__ */ E("label", {
375
+ className: "flex items-center gap-2",
376
+ children: [/* @__PURE__ */ T("input", {
377
+ type: "checkbox",
378
+ checked: Q.citationsRequired,
379
+ onChange: (e) => $({
380
+ ...Q,
381
+ citationsRequired: e.target.checked
382
+ })
383
+ }), /* @__PURE__ */ T("span", { children: "Citations Required" })]
384
+ }), /* @__PURE__ */ E("label", {
385
+ className: "flex items-center gap-2",
386
+ children: [/* @__PURE__ */ T("input", {
387
+ type: "checkbox",
388
+ checked: Q.showSources,
389
+ onChange: (e) => $({
390
+ ...Q,
391
+ showSources: e.target.checked
392
+ })
393
+ }), /* @__PURE__ */ T("span", { children: "Show Sources" })]
394
+ })]
395
+ }),
396
+ /* @__PURE__ */ E("div", {
397
+ className: "grid grid-cols-2 gap-4",
398
+ children: [/* @__PURE__ */ T(h, {
399
+ label: "Min Sources",
400
+ children: /* @__PURE__ */ T(g, {
401
+ type: "number",
402
+ value: Q.minSources,
403
+ onChange: (e) => $({
404
+ ...Q,
405
+ minSources: z(e.target.value, N.minSources)
406
+ })
407
+ })
408
+ }), /* @__PURE__ */ T(h, {
409
+ label: "Max Snippet Chars",
410
+ children: /* @__PURE__ */ T(g, {
411
+ type: "number",
412
+ value: Q.snippetMaxChars,
413
+ onChange: (e) => $({
414
+ ...Q,
415
+ snippetMaxChars: z(e.target.value, N.snippetMaxChars)
416
+ })
417
+ })
418
+ })]
419
+ }),
420
+ /* @__PURE__ */ T(h, {
421
+ label: "Citation Format Template",
422
+ children: /* @__PURE__ */ T(g, {
423
+ value: Q.citationFormat,
424
+ onChange: (e) => $({
425
+ ...Q,
426
+ citationFormat: e.target.value
427
+ }),
428
+ placeholder: "[{index}]"
429
+ })
430
+ })
431
+ ] }) : /* @__PURE__ */ E("div", {
432
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
433
+ children: [
434
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
435
+ className: "text-sm text-text-secondary",
436
+ children: "Citations Required"
437
+ }), /* @__PURE__ */ T(l, {
438
+ variant: H?.citationsRequired ? "success" : "secondary",
439
+ children: H?.citationsRequired ? "Yes" : "No"
440
+ })] }),
441
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
442
+ className: "text-sm text-text-secondary",
443
+ children: "Min Sources"
444
+ }), /* @__PURE__ */ T("p", {
445
+ className: "font-medium",
446
+ children: H?.minSources
447
+ })] }),
448
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
449
+ className: "text-sm text-text-secondary",
450
+ children: "Max Snippet"
451
+ }), /* @__PURE__ */ E("p", {
452
+ className: "font-medium",
453
+ children: [H?.snippetMaxChars, " chars"]
454
+ })] }),
455
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
456
+ className: "text-sm text-text-secondary",
457
+ children: "Citation Format"
458
+ }), /* @__PURE__ */ T("code", {
459
+ className: "text-sm",
460
+ children: H?.citationFormat ?? "—"
461
+ })] })
462
+ ]
463
+ })
464
+ })] }),
465
+ /* @__PURE__ */ E(r, { children: [/* @__PURE__ */ E(o, { children: [/* @__PURE__ */ E(s, {
466
+ className: "flex items-center gap-2",
467
+ children: [/* @__PURE__ */ T(j, { size: 18 }), "Relevance Thresholds"]
468
+ }), /* @__PURE__ */ T(a, { children: "Minimum quality requirements for results" })] }), /* @__PURE__ */ T(i, {
469
+ className: "space-y-4",
470
+ children: Y ? /* @__PURE__ */ E("div", {
471
+ className: "grid grid-cols-2 gap-4",
472
+ children: [/* @__PURE__ */ T(h, {
473
+ label: "Min Relevance Score (0-1)",
474
+ children: /* @__PURE__ */ T(g, {
475
+ type: "number",
476
+ step: "0.1",
477
+ min: "0",
478
+ max: "1",
479
+ value: Q.minRelevanceScore,
480
+ onChange: (e) => $({
481
+ ...Q,
482
+ minRelevanceScore: z(e.target.value, N.minRelevanceScore)
483
+ })
484
+ })
485
+ }), /* @__PURE__ */ T("div", {
486
+ className: "flex items-center",
487
+ children: /* @__PURE__ */ E("label", {
488
+ className: "flex items-center gap-2",
489
+ children: [/* @__PURE__ */ T("input", {
490
+ type: "checkbox",
491
+ checked: Q.noAnswerIfBelowThreshold,
492
+ onChange: (e) => $({
493
+ ...Q,
494
+ noAnswerIfBelowThreshold: e.target.checked
495
+ })
496
+ }), /* @__PURE__ */ T("span", { children: "No Answer if Below Threshold" })]
497
+ })
498
+ })]
499
+ }) : /* @__PURE__ */ E("div", {
500
+ className: "grid grid-cols-2 gap-4",
501
+ children: [/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
502
+ className: "text-sm text-text-secondary",
503
+ children: "Min Relevance Score"
504
+ }), /* @__PURE__ */ T("p", {
505
+ className: "font-medium",
506
+ children: H?.minRelevanceScore ?? "Not set"
507
+ })] }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
508
+ className: "text-sm text-text-secondary",
509
+ children: "No Answer Below Threshold"
510
+ }), /* @__PURE__ */ T(l, {
511
+ variant: H?.noAnswerIfBelowThreshold ? "warning" : "secondary",
512
+ children: H?.noAnswerIfBelowThreshold ? "Yes" : "No"
513
+ })] })]
514
+ })
515
+ })] }),
516
+ !I && H && /* @__PURE__ */ E(r, { children: [/* @__PURE__ */ T(o, { children: /* @__PURE__ */ E(s, {
517
+ className: "flex items-center gap-2",
518
+ children: [/* @__PURE__ */ T(re, { size: 18 }), "Metadata"]
519
+ }) }), /* @__PURE__ */ T(i, { children: /* @__PURE__ */ E("div", {
520
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4 text-sm",
521
+ children: [
522
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
523
+ className: "text-text-secondary",
524
+ children: "Created"
525
+ }), /* @__PURE__ */ T("p", {
526
+ className: "font-medium",
527
+ children: t(H.createdAt)
528
+ })] }),
529
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
530
+ className: "text-text-secondary",
531
+ children: "Updated"
532
+ }), /* @__PURE__ */ T("p", {
533
+ className: "font-medium",
534
+ children: t(H.updatedAt)
535
+ })] }),
536
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
537
+ className: "text-text-secondary",
538
+ children: "Revision"
539
+ }), /* @__PURE__ */ T("p", {
540
+ className: "font-medium",
541
+ children: H.revision
542
+ })] }),
543
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
544
+ className: "text-text-secondary",
545
+ children: "Visibility"
546
+ }), /* @__PURE__ */ T(l, {
547
+ variant: "outline",
548
+ children: H.visibility
549
+ })] })
550
+ ]
551
+ }) })] })
552
+ ]
553
+ })
554
+ });
555
+ };
556
+ //#endregion
557
+ export { B as RetrievalProfileDetailPage };
558
+
559
+ //# sourceMappingURL=RetrievalProfileDetailPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RetrievalProfileDetailPage.js","names":[],"sources":["../../../src/botlit/pages/RetrievalProfileDetailPage.tsx"],"sourcesContent":["/**\n * Retrieval Profile Detail Page\n * @module botlit/pages\n *\n * `RetrievalProfile` is FLAT on wspace-botlit-svc — `strategyMode`, `topK`,\n * `citationsRequired`, `minRelevanceScore` and friends all sit at the top\n * level. There is no nested `strategy`/`grounding`/`thresholds` object, so the\n * form state below mirrors the create/update inputs field for field and the\n * payload is built explicitly rather than handing the whole record back.\n */\n\nimport type { FC } from 'react';\nimport { useEffect, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Edit,\n Trash2,\n Search,\n FileText,\n Settings,\n Target,\n CheckSquare,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport {\n useRetrievalProfile,\n useCreateRetrievalProfile,\n useUpdateRetrievalProfile,\n useDeleteRetrievalProfile,\n type CreateRetrievalProfileVariables,\n type RetrievalProfileRecord,\n} from '../hooks/useRetrievalProfiles';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { RetrievalMode, RerankerMode } from '../types';\n\ninterface RetrievalProfileDetailPageProps {\n isNew?: boolean;\n}\n\n/** Editable subset of the retrieval profile — one field per input field. */\ninterface RetrievalProfileForm {\n name: string;\n description: string;\n strategyMode: RetrievalMode;\n topK: number;\n reranker: RerankerMode;\n queryRewrite: RerankerMode;\n multiHop: RerankerMode;\n citationsRequired: boolean;\n showSources: boolean;\n minSources: number;\n snippetMaxChars: number;\n citationFormat: string;\n minRelevanceScore: number;\n noAnswerIfBelowThreshold: boolean;\n}\n\nconst DEFAULT_FORM: RetrievalProfileForm = {\n name: '',\n description: '',\n strategyMode: 'HYBRID',\n topK: 10,\n reranker: 'OFF',\n queryRewrite: 'OFF',\n multiHop: 'OFF',\n citationsRequired: true,\n showSources: true,\n minSources: 1,\n snippetMaxChars: 500,\n citationFormat: '[{index}]',\n minRelevanceScore: 0.7,\n noAnswerIfBelowThreshold: true,\n};\n\nconst RETRIEVAL_MODES: RetrievalMode[] = ['VECTOR', 'HYBRID', 'BM25_ONLY'];\n\n/** `reranker`/`queryRewrite`/`multiHop` are free-form strings on the service. */\nfunction toRerankerMode(value: string): RerankerMode {\n return value === 'ON' ? 'ON' : 'OFF';\n}\n\nfunction toRetrievalMode(value: string): RetrievalMode {\n return RETRIEVAL_MODES.includes(value as RetrievalMode) ? (value as RetrievalMode) : 'HYBRID';\n}\n\n/** Seeds the form from a loaded profile. */\nfunction toForm(profile: RetrievalProfileRecord): RetrievalProfileForm {\n return {\n name: profile.name,\n description: profile.description ?? '',\n strategyMode: toRetrievalMode(profile.strategyMode),\n topK: profile.topK,\n reranker: toRerankerMode(profile.reranker),\n queryRewrite: toRerankerMode(profile.queryRewrite),\n multiHop: toRerankerMode(profile.multiHop),\n citationsRequired: profile.citationsRequired,\n showSources: profile.showSources,\n minSources: profile.minSources,\n snippetMaxChars: profile.snippetMaxChars,\n citationFormat: profile.citationFormat ?? DEFAULT_FORM.citationFormat,\n minRelevanceScore: profile.minRelevanceScore ?? DEFAULT_FORM.minRelevanceScore,\n noAnswerIfBelowThreshold: profile.noAnswerIfBelowThreshold,\n };\n}\n\n/**\n * Builds the mutation payload. Every key here is declared by both\n * `CreateRetrievalProfileInput` and `UpdateRetrievalProfileInput`, so the same\n * projection serves create and update.\n */\nfunction toInput(form: RetrievalProfileForm): CreateRetrievalProfileVariables {\n return {\n name: form.name.trim(),\n description: form.description.trim() || null,\n strategyMode: form.strategyMode,\n topK: form.topK,\n reranker: form.reranker,\n queryRewrite: form.queryRewrite,\n multiHop: form.multiHop,\n citationsRequired: form.citationsRequired,\n showSources: form.showSources,\n minSources: form.minSources,\n snippetMaxChars: form.snippetMaxChars,\n citationFormat: form.citationFormat.trim() || null,\n minRelevanceScore: form.minRelevanceScore,\n noAnswerIfBelowThreshold: form.noAnswerIfBelowThreshold,\n };\n}\n\n/** `Number('')` is 0 and `Number('abc')` is NaN — keep the previous value instead. */\nfunction toNumber(value: string, fallback: number): number {\n const parsed = Number(value);\n return value.trim() !== '' && Number.isFinite(parsed) ? parsed : fallback;\n}\n\nexport const RetrievalProfileDetailPage: FC<RetrievalProfileDetailPageProps> = ({\n isNew = false,\n}) => {\n const { profileId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: profile, loading, refetch } = useRetrievalProfile(isNew ? undefined : profileId);\n const { create: createProfile, loading: createLoading } = useCreateRetrievalProfile();\n const { update: updateProfile, loading: updateLoading } = useUpdateRetrievalProfile();\n const { remove: deleteProfile, loading: deleteLoading } = useDeleteRetrievalProfile();\n\n const [isEditing, setIsEditing] = useState(isNew);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [formData, setFormData] = useState<RetrievalProfileForm>(DEFAULT_FORM);\n\n // Seed the form once the profile arrives so \"Edit\" always opens on current values.\n useEffect(() => {\n if (profile && !isNew) {\n setFormData(toForm(profile));\n }\n }, [profile, isNew]);\n\n if (loading && !isNew) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!profile && !isNew) {\n return (\n <PageLayout title=\"Profile Not Found\">\n <EmptyState\n illustration=\"empty-files\"\n title=\"Profile Not Found\"\n description=\"The retrieval profile doesn't exist.\"\n action={\n <Button onClick={() => navigateTo('retrieval-profiles')}>Back to Profiles</Button>\n }\n />\n </PageLayout>\n );\n }\n\n const handleSave = async () => {\n if (!formData.name.trim()) {\n toast.error('Name is required');\n return;\n }\n try {\n if (isNew) {\n const created = await createProfile(toInput(formData));\n toast.success(`Profile \"${created.name}\" created`);\n navigateTo(`retrieval-profiles/${created.id}`);\n return;\n }\n if (!profileId) return;\n await updateProfile({ profileId, input: toInput(formData) });\n await refetch();\n toast.success('Retrieval profile updated');\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to save retrieval profile');\n }\n };\n\n const handleDelete = async () => {\n if (!profileId) return;\n try {\n await deleteProfile(profileId);\n if (isNative()) void nativeNotify('success');\n toast.success('Retrieval profile deleted');\n navigateTo('retrieval-profiles');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to delete retrieval profile');\n }\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('retrieval-profiles')}>\n <ArrowLeft size={20} />\n </Button>\n <Search size={24} className=\"text-primary\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{isNew ? 'New Retrieval Profile' : profile?.name}</span>\n {!isNew && profile && <StatusBadge status={profile.status} />}\n </div>\n {!isNew && profile?.description && (\n <p className=\"text-sm font-normal text-text-secondary\">{profile.description}</p>\n )}\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {isEditing ? (\n <>\n <Button\n variant=\"outline\"\n onClick={() => {\n if (isNew) {\n navigateTo('retrieval-profiles');\n return;\n }\n if (profile) setFormData(toForm(profile));\n setIsEditing(false);\n }}\n >\n Cancel\n </Button>\n <Button onClick={handleSave} isLoading={createLoading || updateLoading}>\n {isNew ? 'Create Profile' : 'Save Changes'}\n </Button>\n </>\n ) : (\n <>\n <Button\n variant=\"outline\"\n leftIcon={<Edit size={16} />}\n onClick={() => {\n if (profile) setFormData(toForm(profile));\n setIsEditing(true);\n }}\n >\n Edit\n </Button>\n {showDeleteConfirm ? (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowDeleteConfirm(false)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n isLoading={deleteLoading}\n >\n Confirm Delete\n </Button>\n </div>\n ) : (\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Delete\n </Button>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Settings size={18} />}>\n This profile defines exactly how an agent searches your knowledge — the retrieval mode,\n how many results to pull, whether to rerank them and whether to rewrite the query first.\n Adjust the strategy here to dial in the balance between answer accuracy and speed, then\n attach the profile to the agents that should use it.\n </PagePurpose>\n\n {/* Basic Info */}\n {isEditing ? (\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n placeholder=\"e.g., Default Hybrid Search\"\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Describe when to use this profile...\"\n rows={3}\n />\n </FormField>\n </CardContent>\n </Card>\n ) : null}\n\n {/* Strategy Configuration */}\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Retrieval Strategy\n </CardTitle>\n <CardDescription>How documents are searched and ranked</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {isEditing ? (\n <>\n <FormField label=\"Retrieval Mode\">\n <div className=\"flex gap-4\">\n {RETRIEVAL_MODES.map((mode) => (\n <label key={mode} className=\"flex items-center gap-2\">\n <input\n type=\"radio\"\n name=\"strategyMode\"\n checked={formData.strategyMode === mode}\n onChange={() => setFormData({ ...formData, strategyMode: mode })}\n />\n <span className=\"capitalize\">{mode.replace('_', ' ')}</span>\n </label>\n ))}\n </div>\n </FormField>\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Top K Results\">\n <Input\n type=\"number\"\n value={formData.topK}\n onChange={(e) =>\n setFormData({\n ...formData,\n topK: toNumber(e.target.value, DEFAULT_FORM.topK),\n })\n }\n />\n </FormField>\n <FormField label=\"Reranker\">\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.reranker}\n onChange={(e) =>\n setFormData({ ...formData, reranker: toRerankerMode(e.target.value) })\n }\n >\n <option value=\"OFF\">Disabled</option>\n <option value=\"ON\">Enabled</option>\n </select>\n </FormField>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Query Rewrite\">\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.queryRewrite}\n onChange={(e) =>\n setFormData({ ...formData, queryRewrite: toRerankerMode(e.target.value) })\n }\n >\n <option value=\"OFF\">Disabled</option>\n <option value=\"ON\">Enabled</option>\n </select>\n </FormField>\n <FormField label=\"Multi-Hop\">\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.multiHop}\n onChange={(e) =>\n setFormData({ ...formData, multiHop: toRerankerMode(e.target.value) })\n }\n >\n <option value=\"OFF\">Disabled</option>\n <option value=\"ON\">Enabled</option>\n </select>\n </FormField>\n </div>\n </>\n ) : (\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Mode</p>\n <Badge variant=\"outline\">{profile?.strategyMode}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Top K</p>\n <p className=\"font-medium\">{profile?.topK}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Reranker</p>\n <Badge variant={profile?.reranker === 'ON' ? 'success' : 'secondary'}>\n {profile?.reranker}\n </Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Query Rewrite</p>\n <Badge variant={profile?.queryRewrite === 'ON' ? 'success' : 'secondary'}>\n {profile?.queryRewrite}\n </Badge>\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Grounding Configuration */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n Grounding & Citations\n </CardTitle>\n <CardDescription>How sources are cited in responses</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {isEditing ? (\n <>\n <div className=\"flex items-center gap-4\">\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.citationsRequired}\n onChange={(e) =>\n setFormData({ ...formData, citationsRequired: e.target.checked })\n }\n />\n <span>Citations Required</span>\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.showSources}\n onChange={(e) => setFormData({ ...formData, showSources: e.target.checked })}\n />\n <span>Show Sources</span>\n </label>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Min Sources\">\n <Input\n type=\"number\"\n value={formData.minSources}\n onChange={(e) =>\n setFormData({\n ...formData,\n minSources: toNumber(e.target.value, DEFAULT_FORM.minSources),\n })\n }\n />\n </FormField>\n <FormField label=\"Max Snippet Chars\">\n <Input\n type=\"number\"\n value={formData.snippetMaxChars}\n onChange={(e) =>\n setFormData({\n ...formData,\n snippetMaxChars: toNumber(e.target.value, DEFAULT_FORM.snippetMaxChars),\n })\n }\n />\n </FormField>\n </div>\n <FormField label=\"Citation Format Template\">\n <Input\n value={formData.citationFormat}\n onChange={(e) => setFormData({ ...formData, citationFormat: e.target.value })}\n placeholder=\"[{index}]\"\n />\n </FormField>\n </>\n ) : (\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Citations Required</p>\n <Badge variant={profile?.citationsRequired ? 'success' : 'secondary'}>\n {profile?.citationsRequired ? 'Yes' : 'No'}\n </Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Min Sources</p>\n <p className=\"font-medium\">{profile?.minSources}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Max Snippet</p>\n <p className=\"font-medium\">{profile?.snippetMaxChars} chars</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Citation Format</p>\n <code className=\"text-sm\">{profile?.citationFormat ?? MISSING_VALUE}</code>\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Thresholds */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Target size={18} />\n Relevance Thresholds\n </CardTitle>\n <CardDescription>Minimum quality requirements for results</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {isEditing ? (\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Min Relevance Score (0-1)\">\n <Input\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n max=\"1\"\n value={formData.minRelevanceScore}\n onChange={(e) =>\n setFormData({\n ...formData,\n minRelevanceScore: toNumber(e.target.value, DEFAULT_FORM.minRelevanceScore),\n })\n }\n />\n </FormField>\n <div className=\"flex items-center\">\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.noAnswerIfBelowThreshold}\n onChange={(e) =>\n setFormData({ ...formData, noAnswerIfBelowThreshold: e.target.checked })\n }\n />\n <span>No Answer if Below Threshold</span>\n </label>\n </div>\n </div>\n ) : (\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Min Relevance Score</p>\n <p className=\"font-medium\">{profile?.minRelevanceScore ?? 'Not set'}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">No Answer Below Threshold</p>\n <Badge variant={profile?.noAnswerIfBelowThreshold ? 'warning' : 'secondary'}>\n {profile?.noAnswerIfBelowThreshold ? 'Yes' : 'No'}\n </Badge>\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Metadata (view only) */}\n {!isNew && profile && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <CheckSquare size={18} />\n Metadata\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(profile.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(profile.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Revision</p>\n <p className=\"font-medium\">{profile.revision}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Visibility</p>\n <Badge variant=\"outline\">{profile.visibility}</Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}