@truefoundry/trueforge-ui 0.3.0 → 0.4.0-rc.0

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 (97) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/NOTICE +1 -1
  3. package/README.md +26 -89
  4. package/dist/{AgentCodeSnippets-EK7KMIY2.js → AgentCodeSnippets-BPC6TD7K.js} +7 -7
  5. package/dist/AgentMetricChart-T6DZZ37Y.js +15 -0
  6. package/dist/{AgentOverview-5UPMYHT2.js → AgentOverview-BFU7EO4Y.js} +7 -7
  7. package/dist/{AgentSessionEventTimeline-V6NPCYMW.js → AgentSessionEventTimeline-ATVBTYDF.js} +7 -7
  8. package/dist/{AgentSessionEventTimelineChart-YQWZBQCG.js → AgentSessionEventTimelineChart-H577STKW.js} +7 -7
  9. package/dist/{AgentSessions-WNYVVB6Q.js → AgentSessions-GDLBXFIK.js} +8 -8
  10. package/dist/{ConnectorSettings-O4I24244.js → ConnectorSettings-FYNF6J3F.js} +7 -7
  11. package/dist/{DockLayout-JMBZVMGB.js → DockLayout-SGUOMZ5E.js} +10 -10
  12. package/dist/{DrawerLayout-E6G3IF6R.js → DrawerLayout-MJJYQDCW.js} +11 -11
  13. package/dist/{ModelSettings-ZVXMXIU4.js → ModelSettings-6EW7U2MP.js} +9 -9
  14. package/dist/ModelSettings-6EW7U2MP.js.map +1 -0
  15. package/dist/OpenUiFenceBlock-BZPFNXWZ.js +9 -0
  16. package/dist/{SandboxSettings-H6BA2DJQ.js → SandboxSettings-HQVBGHXZ.js} +7 -7
  17. package/dist/SchedulesPage-ZO3PJY4J.js +15 -0
  18. package/dist/{SettingsBuilder-VA3VGWZC.js → SettingsBuilder-FODMI7HG.js} +20 -11
  19. package/dist/SettingsBuilder-FODMI7HG.js.map +1 -0
  20. package/dist/{ShellRouteSync-ZT4PBE6T.js → ShellRouteSync-4I5BP2VY.js} +4 -4
  21. package/dist/{SidebarLayout-ICXEN7ZL.js → SidebarLayout-ZLWG2YGO.js} +12 -12
  22. package/dist/{SkillSettings-F5JGGFXR.js → SkillSettings-AFSAOU6O.js} +7 -7
  23. package/dist/{TrueForgeUIWithRouter-MKJ7IEWG.js → TrueForgeUIWithRouter-RQX5XWGI.js} +9 -9
  24. package/dist/WebSearchSettings-BW4CWGRR.js +322 -0
  25. package/dist/WebSearchSettings-BW4CWGRR.js.map +1 -0
  26. package/dist/{WidgetLayout-J7ZRW3V3.js → WidgetLayout-WIPKUIL4.js} +10 -10
  27. package/dist/chunk-6UACSIIY.js +587 -0
  28. package/dist/chunk-6UACSIIY.js.map +1 -0
  29. package/dist/{chunk-U7WONUMR.js → chunk-7S7A3PNP.js} +6 -4
  30. package/dist/chunk-7S7A3PNP.js.map +1 -0
  31. package/dist/{chunk-VTOW2UIX.js → chunk-GHXA46A2.js} +78 -43
  32. package/dist/chunk-GHXA46A2.js.map +1 -0
  33. package/dist/{chunk-7AAO4UDQ.js → chunk-HCGDDQ4G.js} +5 -5
  34. package/dist/chunk-HCGDDQ4G.js.map +1 -0
  35. package/dist/{chunk-SCIEO6CF.js → chunk-HDMBSLDC.js} +2 -2
  36. package/dist/{chunk-KZK2PQ4A.js → chunk-MLMR26WQ.js} +244 -152
  37. package/dist/chunk-MLMR26WQ.js.map +1 -0
  38. package/dist/{chunk-BREN6OSX.js → chunk-Q22RHDYS.js} +42 -61
  39. package/dist/chunk-Q22RHDYS.js.map +1 -0
  40. package/dist/{chunk-WFIA627Q.js → chunk-QKFMAQ7O.js} +2 -2
  41. package/dist/{chunk-7VWUB5OV.js → chunk-TFQWCBFQ.js} +12 -12
  42. package/dist/chunk-TFQWCBFQ.js.map +1 -0
  43. package/dist/{chunk-JEAULQNF.js → chunk-TJGGIEF6.js} +3 -3
  44. package/dist/{chunk-KDCVFHPZ.js → chunk-TX6PB3DY.js} +3 -3
  45. package/dist/{chunk-MEW7WZ7Q.js → chunk-VBZXCX7Y.js} +253 -99
  46. package/dist/chunk-VBZXCX7Y.js.map +1 -0
  47. package/dist/{chunk-QI4HGU5E.js → chunk-Y47LJKXD.js} +13 -19
  48. package/dist/{chunk-QI4HGU5E.js.map → chunk-Y47LJKXD.js.map} +1 -1
  49. package/dist/{chunk-MB7Z5FPI.js → chunk-YN5ZBBQM.js} +9 -9
  50. package/dist/{chunk-UN7WPTTK.js → chunk-ZYJ2SBF7.js} +2 -2
  51. package/dist/createTrueForgeServer-DiSooQdh.d.ts +42 -0
  52. package/dist/index.d.ts +45 -39
  53. package/dist/index.js +43 -43
  54. package/dist/index.js.map +1 -1
  55. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +57 -894
  56. package/dist/plugins/trueforge-agent-server-adapter/index.js +110 -7
  57. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  58. package/dist/styles.css +1 -1
  59. package/package.json +8 -7
  60. package/dist/AgentMetricChart-UZCYOC4M.js +0 -15
  61. package/dist/ModelSettings-ZVXMXIU4.js.map +0 -1
  62. package/dist/OpenUiFenceBlock-F3YVDKAG.js +0 -9
  63. package/dist/SchedulesPage-FS2QZ5KB.js +0 -15
  64. package/dist/SettingsBuilder-VA3VGWZC.js.map +0 -1
  65. package/dist/chunk-7AAO4UDQ.js.map +0 -1
  66. package/dist/chunk-7VWUB5OV.js.map +0 -1
  67. package/dist/chunk-BREN6OSX.js.map +0 -1
  68. package/dist/chunk-KZK2PQ4A.js.map +0 -1
  69. package/dist/chunk-MEW7WZ7Q.js.map +0 -1
  70. package/dist/chunk-NXK4XW4U.js +0 -587
  71. package/dist/chunk-NXK4XW4U.js.map +0 -1
  72. package/dist/chunk-U7WONUMR.js.map +0 -1
  73. package/dist/chunk-VTOW2UIX.js.map +0 -1
  74. package/dist/createTrueFoundryServer-B_FYhSdn.d.ts +0 -42
  75. /package/dist/{AgentCodeSnippets-EK7KMIY2.js.map → AgentCodeSnippets-BPC6TD7K.js.map} +0 -0
  76. /package/dist/{AgentMetricChart-UZCYOC4M.js.map → AgentMetricChart-T6DZZ37Y.js.map} +0 -0
  77. /package/dist/{AgentOverview-5UPMYHT2.js.map → AgentOverview-BFU7EO4Y.js.map} +0 -0
  78. /package/dist/{AgentSessionEventTimeline-V6NPCYMW.js.map → AgentSessionEventTimeline-ATVBTYDF.js.map} +0 -0
  79. /package/dist/{AgentSessionEventTimelineChart-YQWZBQCG.js.map → AgentSessionEventTimelineChart-H577STKW.js.map} +0 -0
  80. /package/dist/{AgentSessions-WNYVVB6Q.js.map → AgentSessions-GDLBXFIK.js.map} +0 -0
  81. /package/dist/{ConnectorSettings-O4I24244.js.map → ConnectorSettings-FYNF6J3F.js.map} +0 -0
  82. /package/dist/{DockLayout-JMBZVMGB.js.map → DockLayout-SGUOMZ5E.js.map} +0 -0
  83. /package/dist/{DrawerLayout-E6G3IF6R.js.map → DrawerLayout-MJJYQDCW.js.map} +0 -0
  84. /package/dist/{OpenUiFenceBlock-F3YVDKAG.js.map → OpenUiFenceBlock-BZPFNXWZ.js.map} +0 -0
  85. /package/dist/{SandboxSettings-H6BA2DJQ.js.map → SandboxSettings-HQVBGHXZ.js.map} +0 -0
  86. /package/dist/{SchedulesPage-FS2QZ5KB.js.map → SchedulesPage-ZO3PJY4J.js.map} +0 -0
  87. /package/dist/{ShellRouteSync-ZT4PBE6T.js.map → ShellRouteSync-4I5BP2VY.js.map} +0 -0
  88. /package/dist/{SidebarLayout-ICXEN7ZL.js.map → SidebarLayout-ZLWG2YGO.js.map} +0 -0
  89. /package/dist/{SkillSettings-F5JGGFXR.js.map → SkillSettings-AFSAOU6O.js.map} +0 -0
  90. /package/dist/{TrueForgeUIWithRouter-MKJ7IEWG.js.map → TrueForgeUIWithRouter-RQX5XWGI.js.map} +0 -0
  91. /package/dist/{WidgetLayout-J7ZRW3V3.js.map → WidgetLayout-WIPKUIL4.js.map} +0 -0
  92. /package/dist/{chunk-SCIEO6CF.js.map → chunk-HDMBSLDC.js.map} +0 -0
  93. /package/dist/{chunk-WFIA627Q.js.map → chunk-QKFMAQ7O.js.map} +0 -0
  94. /package/dist/{chunk-JEAULQNF.js.map → chunk-TJGGIEF6.js.map} +0 -0
  95. /package/dist/{chunk-KDCVFHPZ.js.map → chunk-TX6PB3DY.js.map} +0 -0
  96. /package/dist/{chunk-MB7Z5FPI.js.map → chunk-YN5ZBBQM.js.map} +0 -0
  97. /package/dist/{chunk-UN7WPTTK.js.map → chunk-ZYJ2SBF7.js.map} +0 -0
@@ -0,0 +1,322 @@
1
+ "use client";
2
+ import {
3
+ Button,
4
+ CenteredModal,
5
+ auiInputClass,
6
+ useToasterOptional
7
+ } from "./chunk-MLMR26WQ.js";
8
+ import {
9
+ Icon
10
+ } from "./chunk-TX6PB3DY.js";
11
+ import "./chunk-ZYJ2SBF7.js";
12
+ import {
13
+ getErrorMessage,
14
+ useCatalogServer
15
+ } from "./chunk-7S7A3PNP.js";
16
+ import "./chunk-M6MHLVSO.js";
17
+ import "./chunk-QKFMAQ7O.js";
18
+ import "./chunk-6UACSIIY.js";
19
+
20
+ // src/containers/SettingsBuilder/WebSearchSettings.tsx
21
+ import { useCallback, useEffect as useEffect2, useMemo, useState as useState2 } from "react";
22
+
23
+ // src/containers/SettingsBuilder/ConfigureWebSearchForm.tsx
24
+ import { useEffect, useState } from "react";
25
+ import { jsx, jsxs } from "react/jsx-runtime";
26
+ var inputClassName = auiInputClass("h-11 shadow-sm");
27
+ var ConfigureWebSearchForm = ({
28
+ open,
29
+ onOpenChange,
30
+ onSave,
31
+ title,
32
+ description,
33
+ requireApiKey = true,
34
+ busy = false,
35
+ error
36
+ }) => {
37
+ const [apiKey, setApiKey] = useState("");
38
+ const resetForm = () => {
39
+ setApiKey("");
40
+ };
41
+ useEffect(() => {
42
+ if (!open) return;
43
+ setApiKey("");
44
+ }, [open]);
45
+ const handleOpenChange = (nextOpen) => {
46
+ if (!nextOpen) resetForm();
47
+ onOpenChange(nextOpen);
48
+ };
49
+ const trimmedKey = apiKey.trim();
50
+ const isValid = !requireApiKey || !!trimmedKey;
51
+ const handleSubmit = async (event) => {
52
+ event.preventDefault();
53
+ if (!isValid || busy) return;
54
+ try {
55
+ await onSave({ apiKey: trimmedKey });
56
+ resetForm();
57
+ onOpenChange(false);
58
+ } catch {
59
+ }
60
+ };
61
+ return /* @__PURE__ */ jsx(
62
+ CenteredModal,
63
+ {
64
+ open,
65
+ onOpenChange: handleOpenChange,
66
+ title,
67
+ description,
68
+ contentSized: true,
69
+ headerIcon: /* @__PURE__ */ jsx(
70
+ "span",
71
+ {
72
+ className: "flex size-11 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary",
73
+ "aria-hidden": true,
74
+ children: /* @__PURE__ */ jsx(Icon, { name: "search", className: "size-6" })
75
+ }
76
+ ),
77
+ children: /* @__PURE__ */ jsxs("form", { className: "flex flex-col overflow-y-auto p-5 md:p-6", onSubmit: handleSubmit, children: [
78
+ /* @__PURE__ */ jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxs("div", { children: [
79
+ /* @__PURE__ */ jsxs("label", { htmlFor: "web-search-api-key", className: "mb-1.5 block text-sm font-medium text-text-primary", children: [
80
+ "API key",
81
+ !requireApiKey ? /* @__PURE__ */ jsx("span", { className: "font-normal text-text-secondary", children: " (optional)" }) : null
82
+ ] }),
83
+ /* @__PURE__ */ jsx(
84
+ "input",
85
+ {
86
+ id: "web-search-api-key",
87
+ type: "password",
88
+ required: requireApiKey,
89
+ value: apiKey,
90
+ onChange: (event) => {
91
+ setApiKey(event.target.value);
92
+ },
93
+ placeholder: requireApiKey ? "Parallel API key" : "Leave blank to keep existing",
94
+ autoFocus: true,
95
+ className: inputClassName
96
+ }
97
+ )
98
+ ] }) }),
99
+ /* @__PURE__ */ jsxs("div", { className: "mt-6 space-y-3", children: [
100
+ error ? /* @__PURE__ */ jsx("p", { className: "text-failure-bg text-sm", children: error }) : null,
101
+ /* @__PURE__ */ jsx(Button.Primary, { type: "submit", size: "large", disabled: !isValid || busy, className: "w-full shrink-0", children: "Save" })
102
+ ] })
103
+ ] })
104
+ }
105
+ );
106
+ };
107
+ var ConfigureWebSearchForm_default = ConfigureWebSearchForm;
108
+
109
+ // src/containers/SettingsBuilder/WebSearchSettings.tsx
110
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
111
+ var WebSearchSettings = () => {
112
+ const { webSearchCatalog } = useCatalogServer();
113
+ const toaster = useToasterOptional();
114
+ const [providers, setProviders] = useState2([]);
115
+ const [catalog, setCatalog] = useState2([]);
116
+ const [loading, setLoading] = useState2(true);
117
+ const [error, setError] = useState2(null);
118
+ const [formError, setFormError] = useState2(null);
119
+ const [busy, setBusy] = useState2(false);
120
+ const [createEntry, setCreateEntry] = useState2(null);
121
+ const [updateProvider, setUpdateProvider] = useState2(null);
122
+ const refresh = useCallback(
123
+ async ({ quiet = false } = {}) => {
124
+ if (!webSearchCatalog) return;
125
+ if (!quiet) setLoading(true);
126
+ setError(null);
127
+ try {
128
+ const [listed, available] = await Promise.all([
129
+ webSearchCatalog.listWebSearchProviders(),
130
+ webSearchCatalog.getWebSearchProviderCatalog()
131
+ ]);
132
+ setProviders(listed);
133
+ setCatalog(available);
134
+ } catch (err) {
135
+ setError(getErrorMessage(err, "Failed to load web search providers"));
136
+ } finally {
137
+ if (!quiet) setLoading(false);
138
+ }
139
+ },
140
+ [webSearchCatalog]
141
+ );
142
+ useEffect2(() => {
143
+ void refresh();
144
+ }, [refresh]);
145
+ const hasConfiguredProvider = providers.length > 0;
146
+ const availableEntries = useMemo(() => {
147
+ if (hasConfiguredProvider) return [];
148
+ const connectedCatalogIds = new Set(providers.map((provider) => provider.catalogId));
149
+ return catalog.filter((entry) => !connectedCatalogIds.has(entry.id));
150
+ }, [catalog, providers, hasConfiguredProvider]);
151
+ if (!webSearchCatalog) {
152
+ return /* @__PURE__ */ jsx2("p", { className: "text-sm text-text-secondary", children: "Web search provider catalog is not available." });
153
+ }
154
+ const runMutation = async (fn, setMutationError = setError) => {
155
+ setBusy(true);
156
+ setError(null);
157
+ try {
158
+ await fn();
159
+ await refresh({ quiet: true });
160
+ } catch (err) {
161
+ setMutationError(getErrorMessage(err, "Request failed"));
162
+ throw err;
163
+ } finally {
164
+ setBusy(false);
165
+ }
166
+ };
167
+ const handleCreate = async (draft) => {
168
+ if (!createEntry) return;
169
+ setFormError(null);
170
+ await runMutation(async () => {
171
+ await webSearchCatalog.createWebSearchProvider({
172
+ catalogId: createEntry.id,
173
+ name: createEntry.name,
174
+ type: createEntry.type,
175
+ apiKey: draft.apiKey
176
+ });
177
+ }, setFormError);
178
+ setCreateEntry(null);
179
+ setTimeout(() => {
180
+ toaster?.showSuccess({ title: `${createEntry.name} configured` });
181
+ }, 0);
182
+ };
183
+ const handleUpdate = async (draft) => {
184
+ if (!updateProvider) return;
185
+ setFormError(null);
186
+ await runMutation(async () => {
187
+ await webSearchCatalog.updateWebSearchProvider({
188
+ id: updateProvider.id,
189
+ ...draft.apiKey ? { apiKey: draft.apiKey } : {}
190
+ });
191
+ }, setFormError);
192
+ setUpdateProvider(null);
193
+ setTimeout(() => {
194
+ toaster?.showSuccess({ title: `${updateProvider.name} updated` });
195
+ }, 0);
196
+ };
197
+ const formOpen = createEntry != null || updateProvider != null;
198
+ const isUpdate = updateProvider != null;
199
+ const formTitle = updateProvider ? `Update ${updateProvider.name}` : createEntry ? `Configure ${createEntry.name}` : "Configure web search provider";
200
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
201
+ /* @__PURE__ */ jsx2("h3", { className: "text-xl font-semibold tracking-tight text-text-primary", children: "Web search" }),
202
+ /* @__PURE__ */ jsx2("p", { className: "mt-1 text-sm text-text-secondary", children: "Configure a provider so agents can search the web. Only one can be active at a time." }),
203
+ error ? /* @__PURE__ */ jsx2("p", { className: "mt-3 rounded-md border border-failure-bg/30 bg-failure-bg/10 px-3 py-2 text-sm text-failure-bg", children: error }) : null,
204
+ /* @__PURE__ */ jsx2("div", { className: "mt-4 flex-1 overflow-y-auto", children: loading ? /* @__PURE__ */ jsx2("p", { className: "text-sm text-text-secondary", children: "Loading web search providers\u2026" }) : /* @__PURE__ */ jsxs2("div", { className: "space-y-6", children: [
205
+ providers.length > 0 ? /* @__PURE__ */ jsxs2("section", { children: [
206
+ /* @__PURE__ */ jsxs2("h4", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary", children: [
207
+ "Configured \xB7 ",
208
+ providers.length
209
+ ] }),
210
+ /* @__PURE__ */ jsx2("div", { className: "overflow-hidden rounded-xl border border-border bg-card-bg", children: providers.map((provider) => /* @__PURE__ */ jsxs2(
211
+ "article",
212
+ {
213
+ className: "flex flex-col gap-3 border-b border-border p-3 last:border-b-0 sm:flex-row sm:items-center",
214
+ children: [
215
+ /* @__PURE__ */ jsxs2("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [
216
+ /* @__PURE__ */ jsx2(
217
+ "span",
218
+ {
219
+ className: "flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary",
220
+ "aria-hidden": true,
221
+ children: /* @__PURE__ */ jsx2(Icon, { name: "search", className: "size-4.5" })
222
+ }
223
+ ),
224
+ /* @__PURE__ */ jsxs2("div", { className: "min-w-0", children: [
225
+ /* @__PURE__ */ jsx2("h5", { className: "truncate text-sm font-medium text-text-primary", children: provider.name }),
226
+ /* @__PURE__ */ jsx2("p", { className: "truncate text-xs text-text-secondary", children: "Parallel web search" })
227
+ ] })
228
+ ] }),
229
+ /* @__PURE__ */ jsxs2("div", { className: "flex flex-wrap items-center gap-2.5 sm:justify-end", children: [
230
+ /* @__PURE__ */ jsxs2("span", { className: "inline-flex items-center gap-1.5 text-sm font-medium text-success-bg", children: [
231
+ /* @__PURE__ */ jsx2("span", { className: "size-2 rounded-full bg-success-bg", "aria-hidden": true }),
232
+ "Connected"
233
+ ] }),
234
+ /* @__PURE__ */ jsx2(
235
+ Button.Secondary,
236
+ {
237
+ size: "small",
238
+ type: "button",
239
+ disabled: busy,
240
+ onClick: () => {
241
+ setFormError(null);
242
+ setCreateEntry(null);
243
+ setUpdateProvider(provider);
244
+ },
245
+ children: "Update"
246
+ }
247
+ )
248
+ ] })
249
+ ]
250
+ },
251
+ provider.id
252
+ )) })
253
+ ] }) : null,
254
+ !hasConfiguredProvider ? /* @__PURE__ */ jsxs2("section", { children: [
255
+ /* @__PURE__ */ jsxs2("h4", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary", children: [
256
+ "Available \xB7 ",
257
+ availableEntries.length
258
+ ] }),
259
+ availableEntries.length === 0 ? /* @__PURE__ */ jsx2("p", { className: "text-sm text-text-secondary", children: catalog.length > 0 ? "All catalog providers are configured." : "No web search providers in the catalog." }) : /* @__PURE__ */ jsx2("div", { className: "overflow-hidden rounded-xl border border-border bg-card-bg", children: availableEntries.map((entry) => /* @__PURE__ */ jsxs2(
260
+ "article",
261
+ {
262
+ className: "flex flex-col gap-3 border-b border-border p-3 last:border-b-0 sm:flex-row sm:items-center",
263
+ children: [
264
+ /* @__PURE__ */ jsxs2("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [
265
+ /* @__PURE__ */ jsx2(
266
+ "span",
267
+ {
268
+ className: "flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary",
269
+ "aria-hidden": true,
270
+ children: /* @__PURE__ */ jsx2(Icon, { name: "search", className: "size-4.5" })
271
+ }
272
+ ),
273
+ /* @__PURE__ */ jsxs2("div", { className: "min-w-0", children: [
274
+ /* @__PURE__ */ jsx2("h5", { className: "truncate text-sm font-medium text-text-primary", children: entry.name }),
275
+ /* @__PURE__ */ jsx2("p", { className: "truncate text-xs text-text-secondary", children: "Parallel web search" })
276
+ ] })
277
+ ] }),
278
+ /* @__PURE__ */ jsx2(
279
+ Button.Secondary,
280
+ {
281
+ type: "button",
282
+ disabled: busy,
283
+ onClick: () => {
284
+ setFormError(null);
285
+ setUpdateProvider(null);
286
+ setCreateEntry(entry);
287
+ },
288
+ children: "Configure"
289
+ }
290
+ )
291
+ ]
292
+ },
293
+ entry.id
294
+ )) })
295
+ ] }) : null
296
+ ] }) }),
297
+ /* @__PURE__ */ jsx2(
298
+ ConfigureWebSearchForm_default,
299
+ {
300
+ open: formOpen,
301
+ onOpenChange: (open) => {
302
+ if (!open) {
303
+ setFormError(null);
304
+ setCreateEntry(null);
305
+ setUpdateProvider(null);
306
+ }
307
+ },
308
+ onSave: isUpdate ? handleUpdate : handleCreate,
309
+ title: formTitle,
310
+ description: isUpdate ? "Update this web search provider. Leave API key blank to keep the existing key." : "Configure this web search provider. API key is never stored in the catalog.",
311
+ requireApiKey: !isUpdate,
312
+ busy,
313
+ error: formError
314
+ }
315
+ )
316
+ ] });
317
+ };
318
+ var WebSearchSettings_default = WebSearchSettings;
319
+ export {
320
+ WebSearchSettings_default as default
321
+ };
322
+ //# sourceMappingURL=WebSearchSettings-BW4CWGRR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/containers/SettingsBuilder/WebSearchSettings.tsx","../src/containers/SettingsBuilder/ConfigureWebSearchForm.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Button } from '../../atoms/primitives/Button.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { useCatalogServer } from '../../server/ServerContext.js';\nimport type { WebSearchProviderBase, WebSearchProviderCatalogEntry } from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\nimport { useToasterOptional } from '../ToasterContainer.js';\nimport ConfigureWebSearchForm, { type WebSearchConfigDraft } from './ConfigureWebSearchForm.js';\n\nconst WebSearchSettings = () => {\n const { webSearchCatalog } = useCatalogServer();\n const toaster = useToasterOptional();\n\n const [providers, setProviders] = useState<WebSearchProviderBase[]>([]);\n const [catalog, setCatalog] = useState<WebSearchProviderCatalogEntry[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const [createEntry, setCreateEntry] = useState<WebSearchProviderCatalogEntry | null>(null);\n const [updateProvider, setUpdateProvider] = useState<WebSearchProviderBase | null>(null);\n\n const refresh = useCallback(\n async ({ quiet = false }: { quiet?: boolean } = {}) => {\n if (!webSearchCatalog) return;\n if (!quiet) setLoading(true);\n setError(null);\n try {\n const [listed, available] = await Promise.all([\n webSearchCatalog.listWebSearchProviders(),\n webSearchCatalog.getWebSearchProviderCatalog(),\n ]);\n setProviders(listed);\n setCatalog(available);\n } catch (err) {\n setError(getErrorMessage(err, 'Failed to load web search providers'));\n } finally {\n if (!quiet) setLoading(false);\n }\n },\n [webSearchCatalog],\n );\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n // Tenant/UI-wide: only one web-search provider may be configured at a time.\n const hasConfiguredProvider = providers.length > 0;\n const availableEntries = useMemo(() => {\n if (hasConfiguredProvider) return [];\n const connectedCatalogIds = new Set(providers.map(provider => provider.catalogId));\n return catalog.filter(entry => !connectedCatalogIds.has(entry.id));\n }, [catalog, providers, hasConfiguredProvider]);\n\n if (!webSearchCatalog) {\n return <p className=\"text-sm text-text-secondary\">Web search provider catalog is not available.</p>;\n }\n\n const runMutation = async (fn: () => Promise<void>, setMutationError = setError) => {\n setBusy(true);\n setError(null);\n try {\n await fn();\n await refresh({ quiet: true });\n } catch (err) {\n setMutationError(getErrorMessage(err, 'Request failed'));\n throw err;\n } finally {\n setBusy(false);\n }\n };\n\n const handleCreate = async (draft: WebSearchConfigDraft) => {\n if (!createEntry) return;\n setFormError(null);\n await runMutation(async () => {\n await webSearchCatalog.createWebSearchProvider({\n catalogId: createEntry.id,\n name: createEntry.name,\n type: createEntry.type,\n apiKey: draft.apiKey,\n });\n }, setFormError);\n setCreateEntry(null);\n setTimeout(() => {\n toaster?.showSuccess({ title: `${createEntry.name} configured` });\n }, 0);\n };\n\n const handleUpdate = async (draft: WebSearchConfigDraft) => {\n if (!updateProvider) return;\n setFormError(null);\n await runMutation(async () => {\n await webSearchCatalog.updateWebSearchProvider({\n id: updateProvider.id,\n ...(draft.apiKey ? { apiKey: draft.apiKey } : {}),\n });\n }, setFormError);\n setUpdateProvider(null);\n setTimeout(() => {\n toaster?.showSuccess({ title: `${updateProvider.name} updated` });\n }, 0);\n };\n\n const formOpen = createEntry != null || updateProvider != null;\n const isUpdate = updateProvider != null;\n const formTitle = updateProvider\n ? `Update ${updateProvider.name}`\n : createEntry\n ? `Configure ${createEntry.name}`\n : 'Configure web search provider';\n\n return (\n <>\n <h3 className=\"text-xl font-semibold tracking-tight text-text-primary\">Web search</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Configure a provider so agents can search the web. Only one can be active at a time.\n </p>\n\n {error ? (\n <p className=\"mt-3 rounded-md border border-failure-bg/30 bg-failure-bg/10 px-3 py-2 text-sm text-failure-bg\">\n {error}\n </p>\n ) : null}\n\n <div className=\"mt-4 flex-1 overflow-y-auto\">\n {loading ? (\n <p className=\"text-sm text-text-secondary\">Loading web search providers…</p>\n ) : (\n <div className=\"space-y-6\">\n {providers.length > 0 ? (\n <section>\n <h4 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n Configured · {providers.length}\n </h4>\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {providers.map(provider => (\n <article\n key={provider.id}\n className=\"flex flex-col gap-3 border-b border-border p-3 last:border-b-0 sm:flex-row sm:items-center\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span\n className=\"flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n <Icon name=\"search\" className=\"size-4.5\" />\n </span>\n <div className=\"min-w-0\">\n <h5 className=\"truncate text-sm font-medium text-text-primary\">{provider.name}</h5>\n <p className=\"truncate text-xs text-text-secondary\">Parallel web search</p>\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2.5 sm:justify-end\">\n <span className=\"inline-flex items-center gap-1.5 text-sm font-medium text-success-bg\">\n <span className=\"size-2 rounded-full bg-success-bg\" aria-hidden />\n Connected\n </span>\n <Button.Secondary\n size=\"small\"\n type=\"button\"\n disabled={busy}\n onClick={() => {\n setFormError(null);\n setCreateEntry(null);\n setUpdateProvider(provider);\n }}\n >\n Update\n </Button.Secondary>\n </div>\n </article>\n ))}\n </div>\n </section>\n ) : null}\n\n {!hasConfiguredProvider ? (\n <section>\n <h4 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n Available · {availableEntries.length}\n </h4>\n {availableEntries.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n {catalog.length > 0\n ? 'All catalog providers are configured.'\n : 'No web search providers in the catalog.'}\n </p>\n ) : (\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {availableEntries.map(entry => (\n <article\n key={entry.id}\n className=\"flex flex-col gap-3 border-b border-border p-3 last:border-b-0 sm:flex-row sm:items-center\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span\n className=\"flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n <Icon name=\"search\" className=\"size-4.5\" />\n </span>\n <div className=\"min-w-0\">\n <h5 className=\"truncate text-sm font-medium text-text-primary\">{entry.name}</h5>\n <p className=\"truncate text-xs text-text-secondary\">Parallel web search</p>\n </div>\n </div>\n\n <Button.Secondary\n type=\"button\"\n disabled={busy}\n onClick={() => {\n setFormError(null);\n setUpdateProvider(null);\n setCreateEntry(entry);\n }}\n >\n Configure\n </Button.Secondary>\n </article>\n ))}\n </div>\n )}\n </section>\n ) : null}\n </div>\n )}\n </div>\n\n <ConfigureWebSearchForm\n open={formOpen}\n onOpenChange={open => {\n if (!open) {\n setFormError(null);\n setCreateEntry(null);\n setUpdateProvider(null);\n }\n }}\n onSave={isUpdate ? handleUpdate : handleCreate}\n title={formTitle}\n description={\n isUpdate\n ? 'Update this web search provider. Leave API key blank to keep the existing key.'\n : 'Configure this web search provider. API key is never stored in the catalog.'\n }\n requireApiKey={!isUpdate}\n busy={busy}\n error={formError}\n />\n </>\n );\n};\n\nexport default WebSearchSettings;\n","'use client';\n\nimport { useEffect, useState, type FormEvent } from 'react';\n\nimport { auiInputClass } from '../../atoms/lib/inputClasses.js';\nimport { Button } from '../../atoms/primitives/Button.js';\nimport { CenteredModal } from '../../atoms/primitives/CenteredModal.js';\nimport { Icon } from '../../icons/Icon.js';\n\nexport type WebSearchConfigDraft = {\n apiKey: string;\n};\n\ntype ConfigureWebSearchFormProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSave: (draft: WebSearchConfigDraft) => void | Promise<void>;\n title: string;\n description?: string;\n /** When false (updates), empty apiKey means keep the existing key. */\n requireApiKey?: boolean;\n busy?: boolean;\n error?: string | null;\n};\n\nconst inputClassName = auiInputClass('h-11 shadow-sm');\n\nconst ConfigureWebSearchForm = ({\n open,\n onOpenChange,\n onSave,\n title,\n description,\n requireApiKey = true,\n busy = false,\n error,\n}: ConfigureWebSearchFormProps) => {\n const [apiKey, setApiKey] = useState('');\n\n const resetForm = () => {\n setApiKey('');\n };\n\n useEffect(() => {\n if (!open) return;\n setApiKey('');\n }, [open]);\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (!nextOpen) resetForm();\n onOpenChange(nextOpen);\n };\n\n const trimmedKey = apiKey.trim();\n const isValid = !requireApiKey || !!trimmedKey;\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (!isValid || busy) return;\n\n try {\n await onSave({ apiKey: trimmedKey });\n resetForm();\n onOpenChange(false);\n } catch {\n // Parent surfaces error; keep form open.\n }\n };\n\n return (\n <CenteredModal\n open={open}\n onOpenChange={handleOpenChange}\n title={title}\n description={description}\n contentSized\n headerIcon={\n <span\n className=\"flex size-11 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n <Icon name=\"search\" className=\"size-6\" />\n </span>\n }\n >\n <form className=\"flex flex-col overflow-y-auto p-5 md:p-6\" onSubmit={handleSubmit}>\n <div className=\"space-y-4\">\n <div>\n <label htmlFor=\"web-search-api-key\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n API key\n {!requireApiKey ? <span className=\"font-normal text-text-secondary\"> (optional)</span> : null}\n </label>\n <input\n id=\"web-search-api-key\"\n type=\"password\"\n required={requireApiKey}\n value={apiKey}\n onChange={event => {\n setApiKey(event.target.value);\n }}\n placeholder={requireApiKey ? 'Parallel API key' : 'Leave blank to keep existing'}\n autoFocus\n className={inputClassName}\n />\n </div>\n </div>\n\n <div className=\"mt-6 space-y-3\">\n {error ? <p className=\"text-failure-bg text-sm\">{error}</p> : null}\n <Button.Primary type=\"submit\" size=\"large\" disabled={!isValid || busy} className=\"w-full shrink-0\">\n Save\n </Button.Primary>\n </div>\n </form>\n </CenteredModal>\n );\n};\n\nexport default ConfigureWebSearchForm;\n"],"mappings":"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","names":["useEffect","useState","jsx","jsxs","useState","useEffect"]}
@@ -1,28 +1,28 @@
1
1
  "use client";
2
2
  import {
3
3
  StackChatPanel
4
- } from "./chunk-MB7Z5FPI.js";
5
- import "./chunk-7VWUB5OV.js";
6
- import "./chunk-VTOW2UIX.js";
4
+ } from "./chunk-YN5ZBBQM.js";
5
+ import "./chunk-TFQWCBFQ.js";
6
+ import "./chunk-GHXA46A2.js";
7
7
  import {
8
8
  useWidgetVisibility
9
9
  } from "./chunk-DJUFS2BW.js";
10
10
  import "./chunk-BSIPI3KV.js";
11
11
  import {
12
12
  useSlot
13
- } from "./chunk-KZK2PQ4A.js";
14
- import "./chunk-UN7WPTTK.js";
13
+ } from "./chunk-MLMR26WQ.js";
15
14
  import {
16
15
  CompactLayoutProvider,
17
16
  Icon,
18
17
  auiButtonClass
19
- } from "./chunk-KDCVFHPZ.js";
20
- import "./chunk-U7WONUMR.js";
18
+ } from "./chunk-TX6PB3DY.js";
19
+ import "./chunk-ZYJ2SBF7.js";
20
+ import "./chunk-7S7A3PNP.js";
21
21
  import "./chunk-M6MHLVSO.js";
22
- import "./chunk-WFIA627Q.js";
22
+ import "./chunk-QKFMAQ7O.js";
23
23
  import {
24
24
  cn
25
- } from "./chunk-NXK4XW4U.js";
25
+ } from "./chunk-6UACSIIY.js";
26
26
 
27
27
  // src/layouts/WidgetLayout.tsx
28
28
  import { useEffect, useRef } from "react";
@@ -104,4 +104,4 @@ function WidgetLayout({ className }) {
104
104
  export {
105
105
  WidgetLayout
106
106
  };
107
- //# sourceMappingURL=WidgetLayout-J7ZRW3V3.js.map
107
+ //# sourceMappingURL=WidgetLayout-WIPKUIL4.js.map