@truefoundry/trueforge-ui 0.3.1 → 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 (85) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/NOTICE +1 -1
  3. package/README.md +26 -89
  4. package/dist/{AgentCodeSnippets-DAZWEBJS.js → AgentCodeSnippets-BPC6TD7K.js} +5 -5
  5. package/dist/AgentMetricChart-T6DZZ37Y.js +15 -0
  6. package/dist/{AgentOverview-5JIVYXPX.js → AgentOverview-BFU7EO4Y.js} +5 -5
  7. package/dist/{AgentSessionEventTimeline-WELJSS6O.js → AgentSessionEventTimeline-ATVBTYDF.js} +5 -5
  8. package/dist/{AgentSessionEventTimelineChart-ADB3KICM.js → AgentSessionEventTimelineChart-H577STKW.js} +5 -5
  9. package/dist/{AgentSessions-NSN4LIGJ.js → AgentSessions-GDLBXFIK.js} +6 -6
  10. package/dist/{ConnectorSettings-C6MFCKYX.js → ConnectorSettings-FYNF6J3F.js} +5 -5
  11. package/dist/{DockLayout-VY7OZ55R.js → DockLayout-SGUOMZ5E.js} +8 -8
  12. package/dist/{DrawerLayout-B2UA3CZO.js → DrawerLayout-MJJYQDCW.js} +9 -9
  13. package/dist/{ModelSettings-3YAHICJ3.js → ModelSettings-6EW7U2MP.js} +5 -5
  14. package/dist/{SandboxSettings-ALR6F5KU.js → SandboxSettings-HQVBGHXZ.js} +5 -5
  15. package/dist/SchedulesPage-ZO3PJY4J.js +15 -0
  16. package/dist/{SettingsBuilder-G5CP5X6Q.js → SettingsBuilder-FODMI7HG.js} +19 -10
  17. package/dist/SettingsBuilder-FODMI7HG.js.map +1 -0
  18. package/dist/{ShellRouteSync-G7IJ5VIW.js → ShellRouteSync-4I5BP2VY.js} +4 -4
  19. package/dist/{SidebarLayout-FKRLGEDB.js → SidebarLayout-ZLWG2YGO.js} +10 -10
  20. package/dist/{SkillSettings-E5SJ4U3T.js → SkillSettings-AFSAOU6O.js} +5 -5
  21. package/dist/{TrueForgeUIWithRouter-WD7O3TWR.js → TrueForgeUIWithRouter-RQX5XWGI.js} +7 -7
  22. package/dist/WebSearchSettings-BW4CWGRR.js +322 -0
  23. package/dist/WebSearchSettings-BW4CWGRR.js.map +1 -0
  24. package/dist/{WidgetLayout-KQZTQNE7.js → WidgetLayout-WIPKUIL4.js} +8 -8
  25. package/dist/{chunk-2XT2VUT4.js → chunk-7S7A3PNP.js} +3 -3
  26. package/dist/chunk-7S7A3PNP.js.map +1 -0
  27. package/dist/{chunk-AU4BJQMK.js → chunk-GHXA46A2.js} +22 -22
  28. package/dist/chunk-GHXA46A2.js.map +1 -0
  29. package/dist/{chunk-7AAO4UDQ.js → chunk-HCGDDQ4G.js} +5 -5
  30. package/dist/chunk-HCGDDQ4G.js.map +1 -0
  31. package/dist/{chunk-XHPIJ77Q.js → chunk-HDMBSLDC.js} +2 -2
  32. package/dist/{chunk-XR4S7B2K.js → chunk-MLMR26WQ.js} +53 -50
  33. package/dist/chunk-MLMR26WQ.js.map +1 -0
  34. package/dist/{chunk-7UE7LZS2.js → chunk-Q22RHDYS.js} +34 -59
  35. package/dist/chunk-Q22RHDYS.js.map +1 -0
  36. package/dist/{chunk-G7BT4OKG.js → chunk-TFQWCBFQ.js} +11 -11
  37. package/dist/chunk-TFQWCBFQ.js.map +1 -0
  38. package/dist/{chunk-B76JC5B2.js → chunk-TJGGIEF6.js} +3 -3
  39. package/dist/{chunk-4OZFQVSR.js → chunk-TX6PB3DY.js} +2 -2
  40. package/dist/{chunk-2XFOONKH.js → chunk-VBZXCX7Y.js} +7 -7
  41. package/dist/{chunk-SAYUMANU.js → chunk-Y47LJKXD.js} +10 -10
  42. package/dist/{chunk-IGYCJIU7.js → chunk-YN5ZBBQM.js} +8 -8
  43. package/dist/{chunk-AO23SZBG.js → chunk-ZYJ2SBF7.js} +2 -2
  44. package/dist/createTrueForgeServer-DiSooQdh.d.ts +42 -0
  45. package/dist/index.d.ts +29 -36
  46. package/dist/index.js +41 -41
  47. package/dist/index.js.map +1 -1
  48. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +57 -894
  49. package/dist/plugins/trueforge-agent-server-adapter/index.js +104 -5
  50. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  51. package/package.json +8 -7
  52. package/dist/AgentMetricChart-VDIE3S2P.js +0 -15
  53. package/dist/SchedulesPage-TIS3BH67.js +0 -15
  54. package/dist/SettingsBuilder-G5CP5X6Q.js.map +0 -1
  55. package/dist/chunk-2XT2VUT4.js.map +0 -1
  56. package/dist/chunk-7AAO4UDQ.js.map +0 -1
  57. package/dist/chunk-7UE7LZS2.js.map +0 -1
  58. package/dist/chunk-AU4BJQMK.js.map +0 -1
  59. package/dist/chunk-G7BT4OKG.js.map +0 -1
  60. package/dist/chunk-XR4S7B2K.js.map +0 -1
  61. package/dist/createTrueFoundryServer-B_FYhSdn.d.ts +0 -42
  62. /package/dist/{AgentCodeSnippets-DAZWEBJS.js.map → AgentCodeSnippets-BPC6TD7K.js.map} +0 -0
  63. /package/dist/{AgentMetricChart-VDIE3S2P.js.map → AgentMetricChart-T6DZZ37Y.js.map} +0 -0
  64. /package/dist/{AgentOverview-5JIVYXPX.js.map → AgentOverview-BFU7EO4Y.js.map} +0 -0
  65. /package/dist/{AgentSessionEventTimeline-WELJSS6O.js.map → AgentSessionEventTimeline-ATVBTYDF.js.map} +0 -0
  66. /package/dist/{AgentSessionEventTimelineChart-ADB3KICM.js.map → AgentSessionEventTimelineChart-H577STKW.js.map} +0 -0
  67. /package/dist/{AgentSessions-NSN4LIGJ.js.map → AgentSessions-GDLBXFIK.js.map} +0 -0
  68. /package/dist/{ConnectorSettings-C6MFCKYX.js.map → ConnectorSettings-FYNF6J3F.js.map} +0 -0
  69. /package/dist/{DockLayout-VY7OZ55R.js.map → DockLayout-SGUOMZ5E.js.map} +0 -0
  70. /package/dist/{DrawerLayout-B2UA3CZO.js.map → DrawerLayout-MJJYQDCW.js.map} +0 -0
  71. /package/dist/{ModelSettings-3YAHICJ3.js.map → ModelSettings-6EW7U2MP.js.map} +0 -0
  72. /package/dist/{SandboxSettings-ALR6F5KU.js.map → SandboxSettings-HQVBGHXZ.js.map} +0 -0
  73. /package/dist/{SchedulesPage-TIS3BH67.js.map → SchedulesPage-ZO3PJY4J.js.map} +0 -0
  74. /package/dist/{ShellRouteSync-G7IJ5VIW.js.map → ShellRouteSync-4I5BP2VY.js.map} +0 -0
  75. /package/dist/{SidebarLayout-FKRLGEDB.js.map → SidebarLayout-ZLWG2YGO.js.map} +0 -0
  76. /package/dist/{SkillSettings-E5SJ4U3T.js.map → SkillSettings-AFSAOU6O.js.map} +0 -0
  77. /package/dist/{TrueForgeUIWithRouter-WD7O3TWR.js.map → TrueForgeUIWithRouter-RQX5XWGI.js.map} +0 -0
  78. /package/dist/{WidgetLayout-KQZTQNE7.js.map → WidgetLayout-WIPKUIL4.js.map} +0 -0
  79. /package/dist/{chunk-XHPIJ77Q.js.map → chunk-HDMBSLDC.js.map} +0 -0
  80. /package/dist/{chunk-B76JC5B2.js.map → chunk-TJGGIEF6.js.map} +0 -0
  81. /package/dist/{chunk-4OZFQVSR.js.map → chunk-TX6PB3DY.js.map} +0 -0
  82. /package/dist/{chunk-2XFOONKH.js.map → chunk-VBZXCX7Y.js.map} +0 -0
  83. /package/dist/{chunk-SAYUMANU.js.map → chunk-Y47LJKXD.js.map} +0 -0
  84. /package/dist/{chunk-IGYCJIU7.js.map → chunk-YN5ZBBQM.js.map} +0 -0
  85. /package/dist/{chunk-AO23SZBG.js.map → chunk-ZYJ2SBF7.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/containers/SettingsBuilder/index.tsx"],"sourcesContent":["'use client';\n\nimport { lazy, Suspense, useCallback, useEffect, useMemo } from 'react';\n\nimport { useDraftCatalog } from '@/atoms/draft/DraftCatalogProvider.js';\nimport { auiButtonClass } from '@/atoms/lib/buttonClasses.js';\nimport { cn } from '@/atoms/lib/cn.js';\nimport { useCompactLayout } from '@/atoms/lib/CompactLayoutContext.js';\nimport { PageHeader } from '@/atoms/PageHeader.js';\nimport { Spinner } from '@/atoms/primitives/Spinner.js';\nimport { Icon } from '@/icons/Icon.js';\nimport { useOptionalCatalogServer, useOptionalRefreshServerCapabilities } from '@/server/ServerContext.js';\nimport { useShellMode, type SettingsSection } from '@/server/ShellModeContext.js';\n\n// Section modules (and their list/catalog APIs) load only when that tab mounts.\nconst ModelSettings = lazy(() => import('./ModelSettings.js'));\nconst ConnectorSettings = lazy(() => import('./ConnectorSettings.js'));\nconst SkillSettings = lazy(() => import('./SkillSettings.js'));\nconst SandboxSettings = lazy(() => import('./SandboxSettings.js'));\nconst WebSearchSettings = lazy(() => import('./WebSearchSettings.js'));\n\nfunction SettingsSectionFallback() {\n return (\n <div className=\"flex flex-1 items-center justify-center py-8\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <Spinner size={20} className=\"text-text-secondary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n );\n}\n\nconst TruefoundrySettingsBuilder = () => {\n const { settingsOpen, settingsSection: section, setSettingsOpen } = useShellMode();\n const catalog = useOptionalCatalogServer();\n const refreshServerCapabilities = useOptionalRefreshServerCapabilities();\n const { refresh: refreshDraftCatalog } = useDraftCatalog();\n // dock/widget panels are ~mobile width even on a wide viewport — keep Settings stacked.\n const compact = useCompactLayout();\n const hasSkills = catalog?.skillCatalog != null;\n const hasSandbox = catalog?.sandboxCatalog != null;\n const hasWebSearch = catalog?.webSearchCatalog != null;\n\n const closeSettings = useCallback(() => {\n setSettingsOpen(false);\n }, [setSettingsOpen]);\n\n // Refresh catalogs whenever settings are closed or navigated away from.\n useEffect(() => {\n if (!settingsOpen) return;\n return () => {\n refreshDraftCatalog();\n refreshServerCapabilities?.();\n };\n }, [settingsOpen, refreshDraftCatalog, refreshServerCapabilities]);\n\n useEffect(() => {\n if (!hasSkills && section === 'skills') {\n setSettingsOpen(settingsOpen, 'models');\n }\n if (!hasSandbox && section === 'sandbox') {\n setSettingsOpen(settingsOpen, 'models');\n }\n if (!hasWebSearch && section === 'web-search') {\n setSettingsOpen(settingsOpen, 'models');\n }\n }, [hasSkills, hasSandbox, hasWebSearch, section, settingsOpen, setSettingsOpen]);\n\n useEffect(() => {\n if (!settingsOpen) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n event.stopImmediatePropagation();\n closeSettings();\n };\n // Capture so layout Escape handlers (sessions drawer / widget) do not also fire.\n window.addEventListener('keydown', onKeyDown, true);\n return () => window.removeEventListener('keydown', onKeyDown, true);\n }, [closeSettings, settingsOpen]);\n\n const sections = useMemo<\n Array<{\n id: SettingsSection;\n label: string;\n icon: 'cpu' | 'plug' | 'lightbulb' | 'cube' | 'search';\n }>\n >(() => {\n const baseSections: Array<{\n id: SettingsSection;\n label: string;\n icon: 'cpu' | 'plug' | 'lightbulb' | 'cube' | 'search';\n }> = [\n { id: 'models', label: 'Models', icon: 'cpu' },\n { id: 'connectors', label: 'Connectors', icon: 'plug' },\n ];\n if (hasSkills) {\n baseSections.push({ id: 'skills', label: 'Skills', icon: 'lightbulb' });\n }\n if (hasSandbox) {\n baseSections.push({ id: 'sandbox', label: 'Sandbox providers', icon: 'cube' });\n }\n if (hasWebSearch) {\n baseSections.push({ id: 'web-search', label: 'Web search', icon: 'search' });\n }\n return baseSections;\n }, [hasSkills, hasSandbox, hasWebSearch]);\n\n if (!settingsOpen || !catalog) return null;\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col bg-primary-bg\">\n <PageHeader\n title=\"Settings\"\n start={\n <button\n type=\"button\"\n aria-label=\"Back\"\n title=\"Back\"\n className={auiButtonClass({ variant: 'ghost', size: 'icon' })}\n onClick={closeSettings}\n >\n <Icon name=\"arrow-left\" />\n </button>\n }\n />\n\n <div className={cn('flex min-h-0 flex-1 flex-col', !compact && 'md:flex-row')}>\n <nav\n aria-label=\"Settings sections\"\n className={cn(\n 'flex w-full gap-1 border-b border-border bg-secondary-bg/40 p-2',\n compact ? 'min-w-0' : 'justify-center md:w-48 md:flex-col md:justify-start md:border-b-0 md:border-r',\n )}\n >\n {sections.map(item => (\n <button\n key={item.id}\n type=\"button\"\n aria-current={section === item.id ? 'page' : undefined}\n {...(compact ? { title: item.label } : {})}\n className={cn(\n 'flex min-h-9 items-center gap-2 rounded-md px-3 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring',\n // Narrow panels cannot fit fixed-width tabs, so tabs split the row instead.\n compact ? 'min-w-0 flex-1 justify-center gap-1.5 px-1.5' : 'shrink-0',\n section === item.id\n ? 'bg-primary-button-bg/10 text-primary-button-bg'\n : 'text-text-secondary hover:bg-ghost-button-hover/60 hover:text-text-primary',\n )}\n onClick={() => {\n setSettingsOpen(true, item.id);\n }}\n >\n <Icon name={item.icon} className=\"h-4 w-4 shrink-0\" />\n {compact ? <span className=\"truncate\">{item.label}</span> : item.label}\n </button>\n ))}\n </nav>\n\n <section className=\"flex flex-col h-full flex-1 overflow-y-hidden px-6 py-4\">\n <div className=\"w-full max-w-210 h-full min-h-0 flex flex-col mx-auto\">\n <Suspense fallback={<SettingsSectionFallback />}>\n {section === 'models' ? <ModelSettings /> : null}\n {section === 'connectors' ? <ConnectorSettings /> : null}\n {section === 'skills' && hasSkills ? <SkillSettings /> : null}\n {section === 'sandbox' && hasSandbox ? <SandboxSettings /> : null}\n {section === 'web-search' && hasWebSearch ? <WebSearchSettings /> : null}\n </Suspense>\n </div>\n </section>\n </div>\n </div>\n );\n};\n\nexport default TruefoundrySettingsBuilder;\n"],"mappings":"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","names":[]}
@@ -4,13 +4,13 @@ import {
4
4
  matchLocation,
5
5
  placesEqual,
6
6
  sanitizeSearchForPlace
7
- } from "./chunk-B76JC5B2.js";
7
+ } from "./chunk-TJGGIEF6.js";
8
8
  import {
9
9
  sessionIsCreateAgent
10
10
  } from "./chunk-RDXBMTP5.js";
11
11
  import {
12
12
  findAgentByName
13
- } from "./chunk-AO23SZBG.js";
13
+ } from "./chunk-ZYJ2SBF7.js";
14
14
  import {
15
15
  libraryAgentId,
16
16
  toEffectiveRoutes,
@@ -21,7 +21,7 @@ import {
21
21
  useServerCapabilities,
22
22
  useServerCapabilitiesSettled,
23
23
  useShellMode
24
- } from "./chunk-2XT2VUT4.js";
24
+ } from "./chunk-7S7A3PNP.js";
25
25
 
26
26
  // src/routing/ShellRouteSync.tsx
27
27
  import { useCallback, useEffect, useMemo, useRef } from "react";
@@ -387,4 +387,4 @@ function ShellRouteSync({
387
387
  export {
388
388
  ShellRouteSync
389
389
  };
390
- //# sourceMappingURL=ShellRouteSync-G7IJ5VIW.js.map
390
+ //# sourceMappingURL=ShellRouteSync-4I5BP2VY.js.map
@@ -3,32 +3,32 @@ import {
3
3
  AgentConfigDrawerContainer,
4
4
  NamedAgentHeaderLabel,
5
5
  ShellActions
6
- } from "./chunk-G7BT4OKG.js";
6
+ } from "./chunk-TFQWCBFQ.js";
7
7
  import {
8
8
  ThreadListContainer
9
- } from "./chunk-2XFOONKH.js";
9
+ } from "./chunk-VBZXCX7Y.js";
10
10
  import {
11
11
  Thread
12
- } from "./chunk-AU4BJQMK.js";
12
+ } from "./chunk-GHXA46A2.js";
13
13
  import "./chunk-BSIPI3KV.js";
14
14
  import {
15
15
  resolveBrandChrome,
16
16
  useChatHeaderContentVisible,
17
17
  useIsMobile,
18
18
  useSlot
19
- } from "./chunk-XR4S7B2K.js";
20
- import "./chunk-AO23SZBG.js";
19
+ } from "./chunk-MLMR26WQ.js";
21
20
  import {
22
21
  Icon,
23
22
  PageHeader,
24
23
  Spinner,
25
24
  auiButtonClass,
26
25
  sidebarRailButtonClassName
27
- } from "./chunk-4OZFQVSR.js";
26
+ } from "./chunk-TX6PB3DY.js";
27
+ import "./chunk-ZYJ2SBF7.js";
28
28
  import {
29
29
  shellIsCreateAgent,
30
30
  useOptionalShellMode
31
- } from "./chunk-2XT2VUT4.js";
31
+ } from "./chunk-7S7A3PNP.js";
32
32
  import {
33
33
  useAui
34
34
  } from "./chunk-M6MHLVSO.js";
@@ -47,9 +47,9 @@ import {
47
47
  useState
48
48
  } from "react";
49
49
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
50
- var TruefoundrySettingsBuilder = lazy(() => import("./SettingsBuilder-G5CP5X6Q.js"));
50
+ var TruefoundrySettingsBuilder = lazy(() => import("./SettingsBuilder-FODMI7HG.js"));
51
51
  var SchedulesPage = lazy(
52
- () => import("./SchedulesPage-TIS3BH67.js").then((m) => ({ default: m.SchedulesPage }))
52
+ () => import("./SchedulesPage-ZO3PJY4J.js").then((m) => ({ default: m.SchedulesPage }))
53
53
  );
54
54
  var brandLogoClassName = "h-5 w-5 max-w-40 shrink-0 object-contain";
55
55
  var railWidthClassName = "w-20";
@@ -327,4 +327,4 @@ function SidebarLayout({ className }) {
327
327
  export {
328
328
  SidebarLayout
329
329
  };
330
- //# sourceMappingURL=SidebarLayout-FKRLGEDB.js.map
330
+ //# sourceMappingURL=SidebarLayout-ZLWG2YGO.js.map
@@ -5,15 +5,15 @@ import {
5
5
  SearchInput_default,
6
6
  auiInputClass,
7
7
  useToasterOptional
8
- } from "./chunk-XR4S7B2K.js";
9
- import "./chunk-AO23SZBG.js";
8
+ } from "./chunk-MLMR26WQ.js";
10
9
  import {
11
10
  Icon
12
- } from "./chunk-4OZFQVSR.js";
11
+ } from "./chunk-TX6PB3DY.js";
12
+ import "./chunk-ZYJ2SBF7.js";
13
13
  import {
14
14
  getErrorMessage,
15
15
  useCatalogServer
16
- } from "./chunk-2XT2VUT4.js";
16
+ } from "./chunk-7S7A3PNP.js";
17
17
  import "./chunk-M6MHLVSO.js";
18
18
  import "./chunk-QKFMAQ7O.js";
19
19
  import "./chunk-6UACSIIY.js";
@@ -392,4 +392,4 @@ var SkillSettings_default = SkillSettings;
392
392
  export {
393
393
  SkillSettings_default as default
394
394
  };
395
- //# sourceMappingURL=SkillSettings-E5SJ4U3T.js.map
395
+ //# sourceMappingURL=SkillSettings-AFSAOU6O.js.map
@@ -1,18 +1,18 @@
1
1
  "use client";
2
2
  import {
3
3
  TrueForgeUIShell
4
- } from "./chunk-7UE7LZS2.js";
4
+ } from "./chunk-Q22RHDYS.js";
5
5
  import "./chunk-DJUFS2BW.js";
6
6
  import "./chunk-BSIPI3KV.js";
7
7
  import {
8
8
  resolveRoutesConfig
9
- } from "./chunk-B76JC5B2.js";
9
+ } from "./chunk-TJGGIEF6.js";
10
10
  import "./chunk-Y6S4OVVQ.js";
11
11
  import "./chunk-RDXBMTP5.js";
12
- import "./chunk-XR4S7B2K.js";
13
- import "./chunk-AO23SZBG.js";
14
- import "./chunk-4OZFQVSR.js";
15
- import "./chunk-2XT2VUT4.js";
12
+ import "./chunk-MLMR26WQ.js";
13
+ import "./chunk-TX6PB3DY.js";
14
+ import "./chunk-ZYJ2SBF7.js";
15
+ import "./chunk-7S7A3PNP.js";
16
16
  import "./chunk-M6MHLVSO.js";
17
17
  import "./chunk-QKFMAQ7O.js";
18
18
  import "./chunk-6UACSIIY.js";
@@ -31,4 +31,4 @@ function TrueForgeUIWithRouter({
31
31
  export {
32
32
  TrueForgeUIWithRouter
33
33
  };
34
- //# sourceMappingURL=TrueForgeUIWithRouter-WD7O3TWR.js.map
34
+ //# sourceMappingURL=TrueForgeUIWithRouter-RQX5XWGI.js.map
@@ -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,23 +1,23 @@
1
1
  "use client";
2
2
  import {
3
3
  StackChatPanel
4
- } from "./chunk-IGYCJIU7.js";
5
- import "./chunk-G7BT4OKG.js";
6
- import "./chunk-AU4BJQMK.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-XR4S7B2K.js";
14
- import "./chunk-AO23SZBG.js";
13
+ } from "./chunk-MLMR26WQ.js";
15
14
  import {
16
15
  CompactLayoutProvider,
17
16
  Icon,
18
17
  auiButtonClass
19
- } from "./chunk-4OZFQVSR.js";
20
- import "./chunk-2XT2VUT4.js";
18
+ } from "./chunk-TX6PB3DY.js";
19
+ import "./chunk-ZYJ2SBF7.js";
20
+ import "./chunk-7S7A3PNP.js";
21
21
  import "./chunk-M6MHLVSO.js";
22
22
  import "./chunk-QKFMAQ7O.js";
23
23
  import {
@@ -104,4 +104,4 @@ function WidgetLayout({ className }) {
104
104
  export {
105
105
  WidgetLayout
106
106
  };
107
- //# sourceMappingURL=WidgetLayout-KQZTQNE7.js.map
107
+ //# sourceMappingURL=WidgetLayout-WIPKUIL4.js.map
@@ -56,7 +56,7 @@ function useOptionalRefreshServerCapabilities() {
56
56
  function useCatalogServer() {
57
57
  const server = useServer();
58
58
  if (server.catalog == null) {
59
- throw new Error("useCatalogServer requires AgentUIServer.catalog. Pass catalog to createTrueFoundryServer.");
59
+ throw new Error("useCatalogServer requires AgentUIServer.catalog. Pass catalog to createTrueForgeServer.");
60
60
  }
61
61
  return server.catalog;
62
62
  }
@@ -86,7 +86,7 @@ function useOptionalAgentMetricsServer() {
86
86
  function useScheduleServer() {
87
87
  const server = useServer();
88
88
  if (server.schedules == null) {
89
- throw new Error("useScheduleServer requires AgentUIServer.schedules. Pass schedules to createTrueFoundryServer.");
89
+ throw new Error("useScheduleServer requires AgentUIServer.schedules. Pass schedules to createTrueForgeServer.");
90
90
  }
91
91
  return server.schedules;
92
92
  }
@@ -1112,4 +1112,4 @@ export {
1112
1112
  shellIsCreateAgent,
1113
1113
  getErrorMessage
1114
1114
  };
1115
- //# sourceMappingURL=chunk-2XT2VUT4.js.map
1115
+ //# sourceMappingURL=chunk-7S7A3PNP.js.map