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

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 (115) hide show
  1. package/CHANGELOG.md +191 -0
  2. package/README.md +35 -12
  3. package/dist/AgentCodeSnippets-RJBB4DDE.js +89 -0
  4. package/dist/AgentCodeSnippets-RJBB4DDE.js.map +1 -0
  5. package/dist/AgentMetricChart-UPGSJ2WP.js +15 -0
  6. package/dist/AgentOverview-U5WIQXZN.js +169 -0
  7. package/dist/AgentOverview-U5WIQXZN.js.map +1 -0
  8. package/dist/AgentSessionEventTimeline-GRGIQTRE.js +88 -0
  9. package/dist/AgentSessionEventTimeline-GRGIQTRE.js.map +1 -0
  10. package/dist/AgentSessionEventTimelineChart-GNF4VOUT.js +591 -0
  11. package/dist/AgentSessionEventTimelineChart-GNF4VOUT.js.map +1 -0
  12. package/dist/AgentSessions-5OTF2BUW.js +323 -0
  13. package/dist/AgentSessions-5OTF2BUW.js.map +1 -0
  14. package/dist/{ConnectorSettings-FXQ5B7TN.js → ConnectorSettings-HDKGLDCY.js} +163 -125
  15. package/dist/ConnectorSettings-HDKGLDCY.js.map +1 -0
  16. package/dist/{DockLayout-LBNQJZNF.js → DockLayout-D2FPQCAL.js} +11 -10
  17. package/dist/{DockLayout-LBNQJZNF.js.map → DockLayout-D2FPQCAL.js.map} +1 -1
  18. package/dist/DrawerLayout-HUV7RAWL.js +186 -0
  19. package/dist/DrawerLayout-HUV7RAWL.js.map +1 -0
  20. package/dist/{ModelSettings-4L4LOQJA.js → ModelSettings-VNQ7HPKH.js} +23 -27
  21. package/dist/ModelSettings-VNQ7HPKH.js.map +1 -0
  22. package/dist/OpenUiFenceBlock-KPZFLUSC.js +9 -0
  23. package/dist/OpenUiFenceBlock-KPZFLUSC.js.map +1 -0
  24. package/dist/{SandboxSettings-Z4ZG6ZX4.js → SandboxSettings-ZLXGMFBF.js} +18 -20
  25. package/dist/SandboxSettings-ZLXGMFBF.js.map +1 -0
  26. package/dist/SchedulesPage-QKYI2Z3A.js +15 -0
  27. package/dist/SchedulesPage-QKYI2Z3A.js.map +1 -0
  28. package/dist/{SettingsBuilder-WF7ZWKQW.js → SettingsBuilder-RVVYXOJW.js} +27 -23
  29. package/dist/SettingsBuilder-RVVYXOJW.js.map +1 -0
  30. package/dist/ShellRouteSync-SJXFKUAJ.js +390 -0
  31. package/dist/ShellRouteSync-SJXFKUAJ.js.map +1 -0
  32. package/dist/SidebarLayout-KYA76FQ7.js +330 -0
  33. package/dist/SidebarLayout-KYA76FQ7.js.map +1 -0
  34. package/dist/{SkillSettings-3EPPC3IT.js → SkillSettings-7OHT7FPI.js} +25 -21
  35. package/dist/SkillSettings-7OHT7FPI.js.map +1 -0
  36. package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js → TrueForgeUIWithRouter-LKG4XLW6.js} +14 -10
  37. package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js.map → TrueForgeUIWithRouter-LKG4XLW6.js.map} +1 -1
  38. package/dist/{WidgetLayout-3QZ357FL.js → WidgetLayout-W2RGGOQ3.js} +17 -13
  39. package/dist/WidgetLayout-W2RGGOQ3.js.map +1 -0
  40. package/dist/chunk-2GIZY3JJ.js +1062 -0
  41. package/dist/chunk-2GIZY3JJ.js.map +1 -0
  42. package/dist/chunk-2QTH6JHX.js +217 -0
  43. package/dist/chunk-2QTH6JHX.js.map +1 -0
  44. package/dist/{chunk-FJ5RSSMA.js → chunk-3ZW74FHC.js} +118 -164
  45. package/dist/chunk-3ZW74FHC.js.map +1 -0
  46. package/dist/chunk-67ZO7Z2W.js +184 -0
  47. package/dist/chunk-67ZO7Z2W.js.map +1 -0
  48. package/dist/{chunk-CFLVPV5M.js → chunk-7AAO4UDQ.js} +8 -2
  49. package/dist/chunk-7AAO4UDQ.js.map +1 -0
  50. package/dist/{chunk-B52K63AW.js → chunk-CG75X77Q.js} +2 -2
  51. package/dist/chunk-DJUFS2BW.js +27 -0
  52. package/dist/chunk-DJUFS2BW.js.map +1 -0
  53. package/dist/chunk-DPPOEFBD.js +517 -0
  54. package/dist/chunk-DPPOEFBD.js.map +1 -0
  55. package/dist/chunk-EPAL2HD5.js +1629 -0
  56. package/dist/chunk-EPAL2HD5.js.map +1 -0
  57. package/dist/chunk-GG23N2GW.js +15018 -0
  58. package/dist/chunk-GG23N2GW.js.map +1 -0
  59. package/dist/chunk-JCL3Q7RW.js +587 -0
  60. package/dist/chunk-JCL3Q7RW.js.map +1 -0
  61. package/dist/chunk-JKEBMGLH.js +682 -0
  62. package/dist/chunk-JKEBMGLH.js.map +1 -0
  63. package/dist/chunk-KSGNKS2D.js +296 -0
  64. package/dist/chunk-KSGNKS2D.js.map +1 -0
  65. package/dist/{chunk-WREC7D54.js → chunk-PCI6VMB5.js} +268 -48
  66. package/dist/chunk-PCI6VMB5.js.map +1 -0
  67. package/dist/chunk-PQ7VWBQQ.js +121 -0
  68. package/dist/chunk-PQ7VWBQQ.js.map +1 -0
  69. package/dist/chunk-RDXBMTP5.js +32 -0
  70. package/dist/chunk-RDXBMTP5.js.map +1 -0
  71. package/dist/chunk-T6QQV5LK.js +238 -0
  72. package/dist/chunk-T6QQV5LK.js.map +1 -0
  73. package/dist/chunk-Y6S4OVVQ.js +16 -0
  74. package/dist/chunk-Y6S4OVVQ.js.map +1 -0
  75. package/dist/{createTrueFoundryServer-B72bU-J7.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +18 -4
  76. package/dist/index.d.ts +1287 -46
  77. package/dist/index.js +266 -63
  78. package/dist/index.js.map +1 -1
  79. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +590 -11
  80. package/dist/plugins/trueforge-agent-server-adapter/index.js +607 -204
  81. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  82. package/dist/styles.css +1 -1
  83. package/package.json +10 -8
  84. package/dist/ConnectorSettings-FXQ5B7TN.js.map +0 -1
  85. package/dist/DrawerLayout-Q6UK4VMI.js +0 -159
  86. package/dist/DrawerLayout-Q6UK4VMI.js.map +0 -1
  87. package/dist/ModelSettings-4L4LOQJA.js.map +0 -1
  88. package/dist/OpenUiFenceBlock-6UIIAVBX.js +0 -9
  89. package/dist/SandboxSettings-Z4ZG6ZX4.js.map +0 -1
  90. package/dist/SettingsBuilder-WF7ZWKQW.js.map +0 -1
  91. package/dist/ShellRouteSync-T4WLY57Q.js +0 -172
  92. package/dist/ShellRouteSync-T4WLY57Q.js.map +0 -1
  93. package/dist/SidebarLayout-3WZ3CVON.js +0 -256
  94. package/dist/SidebarLayout-3WZ3CVON.js.map +0 -1
  95. package/dist/SkillSettings-3EPPC3IT.js.map +0 -1
  96. package/dist/WidgetLayout-3QZ357FL.js.map +0 -1
  97. package/dist/chunk-36KOSC2J.js +0 -567
  98. package/dist/chunk-36KOSC2J.js.map +0 -1
  99. package/dist/chunk-3S6KHO7H.js +0 -2121
  100. package/dist/chunk-3S6KHO7H.js.map +0 -1
  101. package/dist/chunk-7L63OK3O.js +0 -91
  102. package/dist/chunk-7L63OK3O.js.map +0 -1
  103. package/dist/chunk-CFLVPV5M.js.map +0 -1
  104. package/dist/chunk-FJ5RSSMA.js.map +0 -1
  105. package/dist/chunk-OSV3HI5M.js +0 -6891
  106. package/dist/chunk-OSV3HI5M.js.map +0 -1
  107. package/dist/chunk-WQULF5AT.js +0 -460
  108. package/dist/chunk-WQULF5AT.js.map +0 -1
  109. package/dist/chunk-WREC7D54.js.map +0 -1
  110. package/dist/chunk-YIWUG6MC.js +0 -101
  111. package/dist/chunk-YIWUG6MC.js.map +0 -1
  112. package/dist/chunk-ZXOADNF3.js +0 -75
  113. package/dist/chunk-ZXOADNF3.js.map +0 -1
  114. /package/dist/{OpenUiFenceBlock-6UIIAVBX.js.map → AgentMetricChart-UPGSJ2WP.js.map} +0 -0
  115. /package/dist/{chunk-B52K63AW.js.map → chunk-CG75X77Q.js.map} +0 -0
@@ -0,0 +1,330 @@
1
+ "use client";
2
+ import {
3
+ AgentConfigDrawerContainer,
4
+ NamedAgentHeaderLabel,
5
+ ShellActions
6
+ } from "./chunk-KSGNKS2D.js";
7
+ import {
8
+ ThreadListContainer
9
+ } from "./chunk-DPPOEFBD.js";
10
+ import {
11
+ Thread
12
+ } from "./chunk-JKEBMGLH.js";
13
+ import "./chunk-BSIPI3KV.js";
14
+ import {
15
+ resolveBrandChrome,
16
+ useChatHeaderContentVisible,
17
+ useIsMobile,
18
+ useSlot
19
+ } from "./chunk-GG23N2GW.js";
20
+ import "./chunk-T6QQV5LK.js";
21
+ import {
22
+ Icon,
23
+ PageHeader,
24
+ Spinner,
25
+ auiButtonClass,
26
+ sidebarRailButtonClassName
27
+ } from "./chunk-3ZW74FHC.js";
28
+ import {
29
+ shellIsCreateAgent,
30
+ useOptionalShellMode
31
+ } from "./chunk-2GIZY3JJ.js";
32
+ import {
33
+ useAui
34
+ } from "./chunk-M6MHLVSO.js";
35
+ import "./chunk-CG75X77Q.js";
36
+ import {
37
+ cn,
38
+ useBrand
39
+ } from "./chunk-JCL3Q7RW.js";
40
+
41
+ // src/layouts/SidebarLayout.tsx
42
+ import {
43
+ lazy,
44
+ Suspense,
45
+ useEffect,
46
+ useRef,
47
+ useState
48
+ } from "react";
49
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
50
+ var TruefoundrySettingsBuilder = lazy(() => import("./SettingsBuilder-RVVYXOJW.js"));
51
+ var SchedulesPage = lazy(
52
+ () => import("./SchedulesPage-QKYI2Z3A.js").then((m) => ({ default: m.SchedulesPage }))
53
+ );
54
+ var brandLogoClassName = "h-5 w-5 max-w-40 shrink-0 object-contain";
55
+ var railWidthClassName = "w-20";
56
+ var railActionButtonClassName = cn(sidebarRailButtonClassName, "text-sidebar-text");
57
+ var railSelectedClassName = "bg-primary-button-bg font-medium text-primary-button-text hover:bg-primary-button-hover hover:text-primary-button-text";
58
+ function isRecentHistoryVisible({ overlayOpen, mode }) {
59
+ return !overlayOpen && mode?.status === "active" && !mode.isCreateAgent;
60
+ }
61
+ function SidebarNav() {
62
+ const aui = useAui();
63
+ const shell = useOptionalShellMode();
64
+ const AgentsLibraryButton = useSlot("AgentsLibraryButton");
65
+ const SessionsBrowserButton = useSlot("SessionsBrowserButton");
66
+ const SchedulesButton = useSlot("SchedulesButton");
67
+ const showNewActions = shell?.isNewChatEnabled !== false;
68
+ const overlayOpen = shell?.settingsOpen === true || shell?.libraryOpen === true || shell?.sessionsOpen === true || shell?.schedulesOpen === true;
69
+ const mode = shell?.mode;
70
+ const newChatSelected = !overlayOpen && mode?.status === "active" && !mode.isCreateAgent && shell?.historyAgentFilter?.intent !== "try-agent";
71
+ const newAgentSelected = !overlayOpen && mode != null && shellIsCreateAgent(mode);
72
+ const handleNewChat = () => {
73
+ shell?.setLibraryOpen(false);
74
+ shell?.setSessionsOpen(false);
75
+ if (shell?.isComposerEnabled) {
76
+ shell.openDraft();
77
+ return;
78
+ }
79
+ shell?.setSettingsOpen(false);
80
+ shell?.setSchedulesOpen(false);
81
+ void Promise.resolve(aui.threads().switchToNewThread()).catch(() => void 0);
82
+ };
83
+ const handleNewAgent = () => {
84
+ shell?.setLibraryOpen(false);
85
+ shell?.setSessionsOpen(false);
86
+ if (shell?.isComposerEnabled) {
87
+ shell.openAgentBuilder();
88
+ }
89
+ };
90
+ return /* @__PURE__ */ jsxs("nav", { className: "flex min-h-0 flex-1 flex-col items-center gap-1 p-1", "aria-label": "Sidebar", children: [
91
+ showNewActions ? /* @__PURE__ */ jsxs(
92
+ "button",
93
+ {
94
+ type: "button",
95
+ "aria-label": "Start new chat",
96
+ title: "New chat",
97
+ "aria-current": newChatSelected ? "page" : void 0,
98
+ className: auiButtonClass({
99
+ variant: "ghost",
100
+ className: cn(railActionButtonClassName, newChatSelected && railSelectedClassName)
101
+ }),
102
+ onClick: handleNewChat,
103
+ children: [
104
+ /* @__PURE__ */ jsx(Icon, { name: "square-pen", size: 14 }),
105
+ /* @__PURE__ */ jsx("span", { className: "text-center", children: "New Chat" })
106
+ ]
107
+ }
108
+ ) : null,
109
+ showNewActions && shell?.isComposerEnabled ? /* @__PURE__ */ jsxs(
110
+ "button",
111
+ {
112
+ type: "button",
113
+ "aria-label": "Start new agent",
114
+ title: "New Agent",
115
+ "aria-current": newAgentSelected ? "page" : void 0,
116
+ className: auiButtonClass({
117
+ variant: "ghost",
118
+ className: cn(railActionButtonClassName, newAgentSelected && railSelectedClassName)
119
+ }),
120
+ onClick: handleNewAgent,
121
+ children: [
122
+ /* @__PURE__ */ jsx(Icon, { name: "agent-2", size: 14 }),
123
+ /* @__PURE__ */ jsx("span", { className: "text-center whitespace-nowrap", children: "Build Agent" })
124
+ ]
125
+ }
126
+ ) : null,
127
+ /* @__PURE__ */ jsx(AgentsLibraryButton, { compact: true }),
128
+ /* @__PURE__ */ jsx(SessionsBrowserButton, { compact: true }),
129
+ /* @__PURE__ */ jsx(SchedulesButton, { compact: true })
130
+ ] });
131
+ }
132
+ function SidebarRail({
133
+ onNavigate,
134
+ className,
135
+ railRef,
136
+ ...dialogProps
137
+ }) {
138
+ const brand = useBrand();
139
+ const chrome = resolveBrandChrome(brand);
140
+ const BrandLogo = useSlot("BrandLogo");
141
+ const UserAvatar = useSlot("UserAvatar");
142
+ return /* @__PURE__ */ jsxs(
143
+ "aside",
144
+ {
145
+ ref: railRef,
146
+ className: cn(
147
+ railWidthClassName,
148
+ "flex min-h-0 shrink-0 flex-col border-r border-border bg-sidebar-bg",
149
+ className
150
+ ),
151
+ onClick: (event) => {
152
+ if (onNavigate == null) return;
153
+ const target = event.target;
154
+ if (!(target instanceof Element)) return;
155
+ if (target.closest("button") != null) onNavigate();
156
+ },
157
+ ...dialogProps,
158
+ children: [
159
+ /* @__PURE__ */ jsx("div", { className: "flex h-14 w-full shrink-0 items-center justify-center text-text-primary", children: /* @__PURE__ */ jsx(BrandLogo, { variant: chrome.collapsedVariant, className: brandLogoClassName }) }),
160
+ /* @__PURE__ */ jsx(SidebarNav, {}),
161
+ /* @__PURE__ */ jsxs("footer", { className: "flex shrink-0 flex-col items-center border-border p-2", children: [
162
+ /* @__PURE__ */ jsx(ShellActions, { labeled: true, className: "flex-col" }),
163
+ /* @__PURE__ */ jsx(UserAvatar, { labeled: true, className: "mt-1" })
164
+ ] })
165
+ ]
166
+ }
167
+ );
168
+ }
169
+ function SidebarLayout({ className }) {
170
+ const shell = useOptionalShellMode();
171
+ const isMobile = useIsMobile();
172
+ const AgentDetailsPage = useSlot("AgentDetailsPage");
173
+ const AgentsLibrary = useSlot("AgentsLibrary");
174
+ const SessionsPage = useSlot("SessionsPage");
175
+ const ClearChatButton = useSlot("ClearChatButton");
176
+ const SaveAgentButton = useSlot("SaveAgentButton");
177
+ const SelectAgentEmptyState = useSlot("SelectAgentEmptyState");
178
+ const [mobileNavOpen, setMobileNavOpen] = useState(false);
179
+ const menuBtnRef = useRef(null);
180
+ const dialogRef = useRef(null);
181
+ const mainRef = useRef(null);
182
+ const wasOpen = useRef(false);
183
+ const isIdle = shell?.mode.status === "idle";
184
+ const settingsOpen = shell?.settingsOpen === true;
185
+ const libraryOpen = shell?.libraryOpen === true;
186
+ const sessionsOpen = shell?.sessionsOpen === true;
187
+ const schedulesOpen = shell?.schedulesOpen === true;
188
+ const overlayOpen = settingsOpen || libraryOpen || sessionsOpen || schedulesOpen;
189
+ const showAgentConfig = shell != null && shellIsCreateAgent(shell.mode) && !overlayOpen && (!isMobile || shell.agentConfigOpen);
190
+ const showRecentHistory = isRecentHistoryVisible({ overlayOpen, mode: shell?.mode });
191
+ const hasChatHeaderContent = useChatHeaderContentVisible();
192
+ useEffect(() => {
193
+ if (!mobileNavOpen) return;
194
+ const onKeyDown = (event) => {
195
+ if (event.key === "Escape") setMobileNavOpen(false);
196
+ };
197
+ window.addEventListener("keydown", onKeyDown);
198
+ return () => window.removeEventListener("keydown", onKeyDown);
199
+ }, [mobileNavOpen]);
200
+ useEffect(() => {
201
+ const main = mainRef.current;
202
+ if (mobileNavOpen) {
203
+ wasOpen.current = true;
204
+ if (main) main.inert = true;
205
+ dialogRef.current?.focus();
206
+ return;
207
+ }
208
+ if (wasOpen.current) {
209
+ if (main) main.inert = false;
210
+ menuBtnRef.current?.focus();
211
+ wasOpen.current = false;
212
+ }
213
+ }, [mobileNavOpen]);
214
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative flex h-full min-h-0 w-full min-w-0", className), children: [
215
+ /* @__PURE__ */ jsx(SidebarRail, { className: "hidden md:flex" }),
216
+ showAgentConfig ? /* @__PURE__ */ jsx(
217
+ "aside",
218
+ {
219
+ role: "dialog",
220
+ "aria-label": "Agent Config",
221
+ className: "absolute inset-y-0 left-0 z-20 w-full max-w-sm border-r border-border shadow-xl md:static md:z-auto md:max-w-140 md:flex-1 md:shadow-none 2xl:max-w-150",
222
+ children: /* @__PURE__ */ jsx(AgentConfigDrawerContainer, { showClose: isMobile })
223
+ }
224
+ ) : null,
225
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col bg-primary-bg", children: [
226
+ /* @__PURE__ */ jsx(
227
+ PageHeader,
228
+ {
229
+ className: cn(
230
+ "bg-topbar-bg",
231
+ // Desktop: hide when settings/idle or the thread header has nothing to show
232
+ // (empty untitled draft). Mobile still needs the menu button.
233
+ // Builder mode keeps New Agent and its actions beside the persistent config.
234
+ (overlayOpen || isIdle || !hasChatHeaderContent) && "md:hidden"
235
+ ),
236
+ start: !overlayOpen ? /* @__PURE__ */ jsx(
237
+ "button",
238
+ {
239
+ ref: menuBtnRef,
240
+ type: "button",
241
+ "aria-label": "Navigation",
242
+ "aria-expanded": mobileNavOpen,
243
+ className: cn(auiButtonClass({ variant: "ghost", size: "icon" }), "md:hidden"),
244
+ onClick: () => setMobileNavOpen(true),
245
+ children: /* @__PURE__ */ jsx(Icon, { name: "bars" })
246
+ }
247
+ ) : null,
248
+ title: !overlayOpen ? /* @__PURE__ */ jsx(NamedAgentHeaderLabel, {}) : null,
249
+ end: !overlayOpen ? /* @__PURE__ */ jsxs(Fragment, { children: [
250
+ /* @__PURE__ */ jsx(ClearChatButton, {}),
251
+ /* @__PURE__ */ jsx(SaveAgentButton, {})
252
+ ] }) : null
253
+ }
254
+ ),
255
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 min-w-0 flex-1", children: [
256
+ showRecentHistory ? /* @__PURE__ */ jsx(
257
+ "aside",
258
+ {
259
+ "aria-label": "Recent chats",
260
+ className: "hidden min-h-0 w-64 shrink-0 border-r border-border bg-sidebar-bg md:flex",
261
+ children: /* @__PURE__ */ jsx(ThreadListContainer, { variant: "recent-history" })
262
+ }
263
+ ) : null,
264
+ /* @__PURE__ */ jsx("div", { ref: mainRef, className: "min-h-0 min-w-0 flex-1", children: settingsOpen ? /* @__PURE__ */ jsx(
265
+ Suspense,
266
+ {
267
+ fallback: /* @__PURE__ */ jsxs(
268
+ "div",
269
+ {
270
+ className: "flex h-full items-center justify-center",
271
+ role: "status",
272
+ "aria-live": "polite",
273
+ "aria-busy": "true",
274
+ children: [
275
+ /* @__PURE__ */ jsx(Spinner, { size: 28, className: "text-text-primary" }),
276
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Loading" })
277
+ ]
278
+ }
279
+ ),
280
+ children: /* @__PURE__ */ jsx(TruefoundrySettingsBuilder, {})
281
+ }
282
+ ) : sessionsOpen ? /* @__PURE__ */ jsx(SessionsPage, {}) : libraryOpen && shell?.libraryAgentId != null ? /* @__PURE__ */ jsx(AgentDetailsPage, { agentId: shell.libraryAgentId }, shell.libraryAgentId) : libraryOpen ? /* @__PURE__ */ jsx(AgentsLibrary, { onSelectAgent: () => setMobileNavOpen(false) }) : schedulesOpen ? /* @__PURE__ */ jsx(
283
+ Suspense,
284
+ {
285
+ fallback: /* @__PURE__ */ jsxs(
286
+ "div",
287
+ {
288
+ className: "flex h-full items-center justify-center",
289
+ role: "status",
290
+ "aria-live": "polite",
291
+ "aria-busy": "true",
292
+ children: [
293
+ /* @__PURE__ */ jsx(Spinner, { size: 28, className: "text-text-primary" }),
294
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Loading" })
295
+ ]
296
+ }
297
+ ),
298
+ children: /* @__PURE__ */ jsx(SchedulesPage, {})
299
+ }
300
+ ) : isIdle ? /* @__PURE__ */ jsx(SelectAgentEmptyState, {}) : /* @__PURE__ */ jsx(Thread, {}) })
301
+ ] })
302
+ ] }),
303
+ mobileNavOpen ? /* @__PURE__ */ jsxs(Fragment, { children: [
304
+ /* @__PURE__ */ jsx(
305
+ "button",
306
+ {
307
+ type: "button",
308
+ "aria-label": "Close navigation",
309
+ className: "absolute inset-0 z-[9] cursor-pointer bg-[var(--overlay)] md:hidden",
310
+ onClick: () => setMobileNavOpen(false)
311
+ }
312
+ ),
313
+ /* @__PURE__ */ jsx(
314
+ SidebarRail,
315
+ {
316
+ railRef: dialogRef,
317
+ role: "dialog",
318
+ "aria-label": "Navigation",
319
+ tabIndex: -1,
320
+ onNavigate: () => setMobileNavOpen(false),
321
+ className: "absolute inset-y-0 left-0 z-10 shadow-lg outline-none md:hidden"
322
+ }
323
+ )
324
+ ] }) : null
325
+ ] });
326
+ }
327
+ export {
328
+ SidebarLayout
329
+ };
330
+ //# sourceMappingURL=SidebarLayout-KYA76FQ7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/layouts/SidebarLayout.tsx"],"sourcesContent":["'use client';\n\nimport {\n lazy,\n Suspense,\n useEffect,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n type Ref,\n} from 'react';\n\nimport { useAui } from '../assistant-ui.js';\nimport { auiButtonClass, sidebarRailButtonClassName } from '../atoms/lib/buttonClasses.js';\nimport { cn } from '../atoms/lib/cn.js';\nimport { useIsMobile } from '../atoms/lib/useIsMobile.js';\nimport { NamedAgentHeaderLabel } from '../atoms/NamedAgentHeaderLabel.js';\nimport { PageHeader } from '../atoms/PageHeader.js';\nimport { Spinner } from '../atoms/primitives/Spinner.js';\nimport { ShellActions } from '../atoms/ShellActions.js';\nimport { AgentConfigDrawerContainer } from '../containers/AgentConfigDrawerContainer.js';\nimport { Thread } from '../containers/Thread.js';\nimport { ThreadListContainer } from '../containers/ThreadListContainer.js';\nimport { useChatHeaderContentVisible } from '../hooks/useChatChromeActionsVisible.js';\nimport { Icon } from '../icons/Icon.js';\nimport { shellIsCreateAgent, useOptionalShellMode, type ShellMode } from '../server/ShellModeContext.js';\nimport { resolveBrandChrome } from '../theme/brand.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { useBrand } from '../theme/ThemeProvider.js';\n\nconst TruefoundrySettingsBuilder = lazy(() => import('../containers/SettingsBuilder/index.js'));\nconst SchedulesPage = lazy(() =>\n import('../atoms/schedules/SchedulesPage.js').then(m => ({ default: m.SchedulesPage })),\n);\n\nconst brandLogoClassName = 'h-5 w-5 max-w-40 shrink-0 object-contain';\nconst railWidthClassName = 'w-20';\n\nconst railActionButtonClassName = cn(sidebarRailButtonClassName, 'text-sidebar-text');\n\nconst railSelectedClassName =\n 'bg-primary-button-bg font-medium text-primary-button-text hover:bg-primary-button-hover hover:text-primary-button-text';\n\nfunction isRecentHistoryVisible({ overlayOpen, mode }: { overlayOpen: boolean; mode?: ShellMode }): boolean {\n return !overlayOpen && mode?.status === 'active' && !mode.isCreateAgent;\n}\n\nfunction SidebarNav(): ReactNode {\n const aui = useAui();\n const shell = useOptionalShellMode();\n const AgentsLibraryButton = useSlot('AgentsLibraryButton');\n const SessionsBrowserButton = useSlot('SessionsBrowserButton');\n const SchedulesButton = useSlot('SchedulesButton');\n const showNewActions = shell?.isNewChatEnabled !== false;\n const overlayOpen =\n shell?.settingsOpen === true ||\n shell?.libraryOpen === true ||\n shell?.sessionsOpen === true ||\n shell?.schedulesOpen === true;\n const mode = shell?.mode;\n const newChatSelected =\n !overlayOpen &&\n mode?.status === 'active' &&\n !mode.isCreateAgent &&\n shell?.historyAgentFilter?.intent !== 'try-agent';\n const newAgentSelected = !overlayOpen && mode != null && shellIsCreateAgent(mode);\n\n const handleNewChat = () => {\n shell?.setLibraryOpen(false);\n shell?.setSessionsOpen(false);\n if (shell?.isComposerEnabled) {\n shell.openDraft();\n return;\n }\n shell?.setSettingsOpen(false);\n shell?.setSchedulesOpen(false);\n void Promise.resolve(aui.threads().switchToNewThread()).catch(() => undefined);\n };\n\n const handleNewAgent = () => {\n shell?.setLibraryOpen(false);\n shell?.setSessionsOpen(false);\n if (shell?.isComposerEnabled) {\n shell.openAgentBuilder();\n }\n };\n\n return (\n <nav className=\"flex min-h-0 flex-1 flex-col items-center gap-1 p-1\" aria-label=\"Sidebar\">\n {showNewActions ? (\n <button\n type=\"button\"\n aria-label=\"Start new chat\"\n title=\"New chat\"\n aria-current={newChatSelected ? 'page' : undefined}\n className={auiButtonClass({\n variant: 'ghost',\n className: cn(railActionButtonClassName, newChatSelected && railSelectedClassName),\n })}\n onClick={handleNewChat}\n >\n <Icon name=\"square-pen\" size={14} />\n <span className=\"text-center\">New Chat</span>\n </button>\n ) : null}\n {showNewActions && shell?.isComposerEnabled ? (\n <button\n type=\"button\"\n aria-label=\"Start new agent\"\n title=\"New Agent\"\n aria-current={newAgentSelected ? 'page' : undefined}\n className={auiButtonClass({\n variant: 'ghost',\n className: cn(railActionButtonClassName, newAgentSelected && railSelectedClassName),\n })}\n onClick={handleNewAgent}\n >\n <Icon name=\"agent-2\" size={14} />\n <span className=\"text-center whitespace-nowrap\">Build Agent</span>\n </button>\n ) : null}\n <AgentsLibraryButton compact />\n <SessionsBrowserButton compact />\n <SchedulesButton compact />\n </nav>\n );\n}\n\n/** Shared desktop + mobile icon+label rail (brand, nav, footer actions). */\nfunction SidebarRail({\n onNavigate,\n className,\n railRef,\n ...dialogProps\n}: {\n onNavigate?: () => void;\n className?: string;\n railRef?: Ref<HTMLElement>;\n} & Omit<ComponentPropsWithoutRef<'aside'>, 'children' | 'className'>): ReactNode {\n const brand = useBrand();\n const chrome = resolveBrandChrome(brand);\n const BrandLogo = useSlot('BrandLogo');\n const UserAvatar = useSlot('UserAvatar');\n\n return (\n <aside\n ref={railRef}\n className={cn(\n railWidthClassName,\n 'flex min-h-0 shrink-0 flex-col border-r border-border bg-sidebar-bg',\n className,\n )}\n onClick={event => {\n if (onNavigate == null) return;\n const target = event.target;\n if (!(target instanceof Element)) return;\n if (target.closest('button') != null) onNavigate();\n }}\n {...dialogProps}\n >\n <div className=\"flex h-14 w-full shrink-0 items-center justify-center text-text-primary\">\n <BrandLogo variant={chrome.collapsedVariant} className={brandLogoClassName} />\n </div>\n <SidebarNav />\n <footer className=\"flex shrink-0 flex-col items-center border-border p-2\">\n <ShellActions labeled className=\"flex-col\" />\n <UserAvatar labeled className=\"mt-1\" />\n </footer>\n </aside>\n );\n}\n\nexport function SidebarLayout({ className }: { className?: string }) {\n const shell = useOptionalShellMode();\n const isMobile = useIsMobile();\n const AgentDetailsPage = useSlot('AgentDetailsPage');\n const AgentsLibrary = useSlot('AgentsLibrary');\n const SessionsPage = useSlot('SessionsPage');\n const ClearChatButton = useSlot('ClearChatButton');\n const SaveAgentButton = useSlot('SaveAgentButton');\n const SelectAgentEmptyState = useSlot('SelectAgentEmptyState');\n const [mobileNavOpen, setMobileNavOpen] = useState(false);\n const menuBtnRef = useRef<HTMLButtonElement>(null);\n const dialogRef = useRef<HTMLElement>(null);\n const mainRef = useRef<HTMLDivElement>(null);\n const wasOpen = useRef(false);\n const isIdle = shell?.mode.status === 'idle';\n const settingsOpen = shell?.settingsOpen === true;\n const libraryOpen = shell?.libraryOpen === true;\n const sessionsOpen = shell?.sessionsOpen === true;\n const schedulesOpen = shell?.schedulesOpen === true;\n const overlayOpen = settingsOpen || libraryOpen || sessionsOpen || schedulesOpen;\n const showAgentConfig =\n shell != null && shellIsCreateAgent(shell.mode) && !overlayOpen && (!isMobile || shell.agentConfigOpen);\n const showRecentHistory = isRecentHistoryVisible({ overlayOpen, mode: shell?.mode });\n const hasChatHeaderContent = useChatHeaderContentVisible();\n\n useEffect(() => {\n if (!mobileNavOpen) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setMobileNavOpen(false);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [mobileNavOpen]);\n\n useEffect(() => {\n const main = mainRef.current;\n if (mobileNavOpen) {\n wasOpen.current = true;\n if (main) main.inert = true;\n dialogRef.current?.focus();\n return;\n }\n if (wasOpen.current) {\n if (main) main.inert = false;\n menuBtnRef.current?.focus();\n wasOpen.current = false;\n }\n }, [mobileNavOpen]);\n\n return (\n <div className={cn('relative flex h-full min-h-0 w-full min-w-0', className)}>\n <SidebarRail className=\"hidden md:flex\" />\n\n {showAgentConfig ? (\n <aside\n role=\"dialog\"\n aria-label=\"Agent Config\"\n className=\"absolute inset-y-0 left-0 z-20 w-full max-w-sm border-r border-border shadow-xl md:static md:z-auto md:max-w-140 md:flex-1 md:shadow-none 2xl:max-w-150\"\n >\n <AgentConfigDrawerContainer showClose={isMobile} />\n </aside>\n ) : null}\n\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col bg-primary-bg\">\n {/* Desktop keeps shell chrome in the rail footer (always mounted, including\n when visually hidden on small screens so host action-slot state persists).\n Mobile reaches theme/settings via the nav drawer rail. */}\n <PageHeader\n className={cn(\n 'bg-topbar-bg',\n // Desktop: hide when settings/idle or the thread header has nothing to show\n // (empty untitled draft). Mobile still needs the menu button.\n // Builder mode keeps New Agent and its actions beside the persistent config.\n (overlayOpen || isIdle || !hasChatHeaderContent) && 'md:hidden',\n )}\n start={\n !overlayOpen ? (\n <button\n ref={menuBtnRef}\n type=\"button\"\n aria-label=\"Navigation\"\n aria-expanded={mobileNavOpen}\n className={cn(auiButtonClass({ variant: 'ghost', size: 'icon' }), 'md:hidden')}\n onClick={() => setMobileNavOpen(true)}\n >\n <Icon name=\"bars\" />\n </button>\n ) : null\n }\n title={!overlayOpen ? <NamedAgentHeaderLabel /> : null}\n end={\n !overlayOpen ? (\n <>\n <ClearChatButton />\n <SaveAgentButton />\n </>\n ) : null\n }\n />\n\n <div className=\"flex min-h-0 min-w-0 flex-1\">\n {showRecentHistory ? (\n <aside\n aria-label=\"Recent chats\"\n className=\"hidden min-h-0 w-64 shrink-0 border-r border-border bg-sidebar-bg md:flex\"\n >\n <ThreadListContainer variant=\"recent-history\" />\n </aside>\n ) : null}\n\n <div ref={mainRef} className=\"min-h-0 min-w-0 flex-1\">\n {settingsOpen ? (\n <Suspense\n fallback={\n <div\n className=\"flex h-full items-center justify-center\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <Spinner size={28} className=\"text-text-primary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n }\n >\n <TruefoundrySettingsBuilder />\n </Suspense>\n ) : sessionsOpen ? (\n <SessionsPage />\n ) : libraryOpen && shell?.libraryAgentId != null ? (\n <AgentDetailsPage key={shell.libraryAgentId} agentId={shell.libraryAgentId} />\n ) : libraryOpen ? (\n <AgentsLibrary onSelectAgent={() => setMobileNavOpen(false)} />\n ) : schedulesOpen ? (\n <Suspense\n fallback={\n <div\n className=\"flex h-full items-center justify-center\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <Spinner size={28} className=\"text-text-primary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n }\n >\n <SchedulesPage />\n </Suspense>\n ) : isIdle ? (\n <SelectAgentEmptyState />\n ) : (\n <Thread />\n )}\n </div>\n </div>\n </div>\n\n {/* Mobile: same narrow rail as desktop */}\n {mobileNavOpen ? (\n <>\n <button\n type=\"button\"\n aria-label=\"Close navigation\"\n className=\"absolute inset-0 z-[9] cursor-pointer bg-[var(--overlay)] md:hidden\"\n onClick={() => setMobileNavOpen(false)}\n />\n <SidebarRail\n railRef={dialogRef}\n role=\"dialog\"\n aria-label=\"Navigation\"\n tabIndex={-1}\n onNavigate={() => setMobileNavOpen(false)}\n className=\"absolute inset-y-0 left-0 z-10 shadow-lg outline-none md:hidden\"\n />\n </>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAgFC,SA8KM,UAnKJ,KAXF;AA5DR,IAAM,6BAA6B,KAAK,MAAM,OAAO,+BAAwC,CAAC;AAC9F,IAAM,gBAAgB;AAAA,EAAK,MACzB,OAAO,6BAAqC,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,cAAc,EAAE;AACxF;AAEA,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAE3B,IAAM,4BAA4B,GAAG,4BAA4B,mBAAmB;AAEpF,IAAM,wBACJ;AAEF,SAAS,uBAAuB,EAAE,aAAa,KAAK,GAAwD;AAC1G,SAAO,CAAC,eAAe,MAAM,WAAW,YAAY,CAAC,KAAK;AAC5D;AAEA,SAAS,aAAwB;AAC/B,QAAM,MAAM,OAAO;AACnB,QAAM,QAAQ,qBAAqB;AACnC,QAAM,sBAAsB,QAAQ,qBAAqB;AACzD,QAAM,wBAAwB,QAAQ,uBAAuB;AAC7D,QAAM,kBAAkB,QAAQ,iBAAiB;AACjD,QAAM,iBAAiB,OAAO,qBAAqB;AACnD,QAAM,cACJ,OAAO,iBAAiB,QACxB,OAAO,gBAAgB,QACvB,OAAO,iBAAiB,QACxB,OAAO,kBAAkB;AAC3B,QAAM,OAAO,OAAO;AACpB,QAAM,kBACJ,CAAC,eACD,MAAM,WAAW,YACjB,CAAC,KAAK,iBACN,OAAO,oBAAoB,WAAW;AACxC,QAAM,mBAAmB,CAAC,eAAe,QAAQ,QAAQ,mBAAmB,IAAI;AAEhF,QAAM,gBAAgB,MAAM;AAC1B,WAAO,eAAe,KAAK;AAC3B,WAAO,gBAAgB,KAAK;AAC5B,QAAI,OAAO,mBAAmB;AAC5B,YAAM,UAAU;AAChB;AAAA,IACF;AACA,WAAO,gBAAgB,KAAK;AAC5B,WAAO,iBAAiB,KAAK;AAC7B,SAAK,QAAQ,QAAQ,IAAI,QAAQ,EAAE,kBAAkB,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAC/E;AAEA,QAAM,iBAAiB,MAAM;AAC3B,WAAO,eAAe,KAAK;AAC3B,WAAO,gBAAgB,KAAK;AAC5B,QAAI,OAAO,mBAAmB;AAC5B,YAAM,iBAAiB;AAAA,IACzB;AAAA,EACF;AAEA,SACE,qBAAC,SAAI,WAAU,uDAAsD,cAAW,WAC7E;AAAA,qBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,OAAM;AAAA,QACN,gBAAc,kBAAkB,SAAS;AAAA,QACzC,WAAW,eAAe;AAAA,UACxB,SAAS;AAAA,UACT,WAAW,GAAG,2BAA2B,mBAAmB,qBAAqB;AAAA,QACnF,CAAC;AAAA,QACD,SAAS;AAAA,QAET;AAAA,8BAAC,QAAK,MAAK,cAAa,MAAM,IAAI;AAAA,UAClC,oBAAC,UAAK,WAAU,eAAc,sBAAQ;AAAA;AAAA;AAAA,IACxC,IACE;AAAA,IACH,kBAAkB,OAAO,oBACxB;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,OAAM;AAAA,QACN,gBAAc,mBAAmB,SAAS;AAAA,QAC1C,WAAW,eAAe;AAAA,UACxB,SAAS;AAAA,UACT,WAAW,GAAG,2BAA2B,oBAAoB,qBAAqB;AAAA,QACpF,CAAC;AAAA,QACD,SAAS;AAAA,QAET;AAAA,8BAAC,QAAK,MAAK,WAAU,MAAM,IAAI;AAAA,UAC/B,oBAAC,UAAK,WAAU,iCAAgC,yBAAW;AAAA;AAAA;AAAA,IAC7D,IACE;AAAA,IACJ,oBAAC,uBAAoB,SAAO,MAAC;AAAA,IAC7B,oBAAC,yBAAsB,SAAO,MAAC;AAAA,IAC/B,oBAAC,mBAAgB,SAAO,MAAC;AAAA,KAC3B;AAEJ;AAGA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAIkF;AAChF,QAAM,QAAQ,SAAS;AACvB,QAAM,SAAS,mBAAmB,KAAK;AACvC,QAAM,YAAY,QAAQ,WAAW;AACrC,QAAM,aAAa,QAAQ,YAAY;AAEvC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,WAAS;AAChB,YAAI,cAAc,KAAM;AACxB,cAAM,SAAS,MAAM;AACrB,YAAI,EAAE,kBAAkB,SAAU;AAClC,YAAI,OAAO,QAAQ,QAAQ,KAAK,KAAM,YAAW;AAAA,MACnD;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,4BAAC,SAAI,WAAU,2EACb,8BAAC,aAAU,SAAS,OAAO,kBAAkB,WAAW,oBAAoB,GAC9E;AAAA,QACA,oBAAC,cAAW;AAAA,QACZ,qBAAC,YAAO,WAAU,yDAChB;AAAA,8BAAC,gBAAa,SAAO,MAAC,WAAU,YAAW;AAAA,UAC3C,oBAAC,cAAW,SAAO,MAAC,WAAU,QAAO;AAAA,WACvC;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,cAAc,EAAE,UAAU,GAA2B;AACnE,QAAM,QAAQ,qBAAqB;AACnC,QAAM,WAAW,YAAY;AAC7B,QAAM,mBAAmB,QAAQ,kBAAkB;AACnD,QAAM,gBAAgB,QAAQ,eAAe;AAC7C,QAAM,eAAe,QAAQ,cAAc;AAC3C,QAAM,kBAAkB,QAAQ,iBAAiB;AACjD,QAAM,kBAAkB,QAAQ,iBAAiB;AACjD,QAAM,wBAAwB,QAAQ,uBAAuB;AAC7D,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AACxD,QAAM,aAAa,OAA0B,IAAI;AACjD,QAAM,YAAY,OAAoB,IAAI;AAC1C,QAAM,UAAU,OAAuB,IAAI;AAC3C,QAAM,UAAU,OAAO,KAAK;AAC5B,QAAM,SAAS,OAAO,KAAK,WAAW;AACtC,QAAM,eAAe,OAAO,iBAAiB;AAC7C,QAAM,cAAc,OAAO,gBAAgB;AAC3C,QAAM,eAAe,OAAO,iBAAiB;AAC7C,QAAM,gBAAgB,OAAO,kBAAkB;AAC/C,QAAM,cAAc,gBAAgB,eAAe,gBAAgB;AACnE,QAAM,kBACJ,SAAS,QAAQ,mBAAmB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,YAAY,MAAM;AACzF,QAAM,oBAAoB,uBAAuB,EAAE,aAAa,MAAM,OAAO,KAAK,CAAC;AACnF,QAAM,uBAAuB,4BAA4B;AAEzD,YAAU,MAAM;AACd,QAAI,CAAC,cAAe;AACpB,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,SAAU,kBAAiB,KAAK;AAAA,IACpD;AACA,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,MAAM,OAAO,oBAAoB,WAAW,SAAS;AAAA,EAC9D,GAAG,CAAC,aAAa,CAAC;AAElB,YAAU,MAAM;AACd,UAAM,OAAO,QAAQ;AACrB,QAAI,eAAe;AACjB,cAAQ,UAAU;AAClB,UAAI,KAAM,MAAK,QAAQ;AACvB,gBAAU,SAAS,MAAM;AACzB;AAAA,IACF;AACA,QAAI,QAAQ,SAAS;AACnB,UAAI,KAAM,MAAK,QAAQ;AACvB,iBAAW,SAAS,MAAM;AAC1B,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,SACE,qBAAC,SAAI,WAAW,GAAG,+CAA+C,SAAS,GACzE;AAAA,wBAAC,eAAY,WAAU,kBAAiB;AAAA,IAEvC,kBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAU;AAAA,QAEV,8BAAC,8BAA2B,WAAW,UAAU;AAAA;AAAA,IACnD,IACE;AAAA,IAEJ,qBAAC,SAAI,WAAU,sDAIb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA;AAAA;AAAA;AAAA,aAIC,eAAe,UAAU,CAAC,yBAAyB;AAAA,UACtD;AAAA,UACA,OACE,CAAC,cACC;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,cAAW;AAAA,cACX,iBAAe;AAAA,cACf,WAAW,GAAG,eAAe,EAAE,SAAS,SAAS,MAAM,OAAO,CAAC,GAAG,WAAW;AAAA,cAC7E,SAAS,MAAM,iBAAiB,IAAI;AAAA,cAEpC,8BAAC,QAAK,MAAK,QAAO;AAAA;AAAA,UACpB,IACE;AAAA,UAEN,OAAO,CAAC,cAAc,oBAAC,yBAAsB,IAAK;AAAA,UAClD,KACE,CAAC,cACC,iCACE;AAAA,gCAAC,mBAAgB;AAAA,YACjB,oBAAC,mBAAgB;AAAA,aACnB,IACE;AAAA;AAAA,MAER;AAAA,MAEA,qBAAC,SAAI,WAAU,+BACZ;AAAA,4BACC;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,WAAU;AAAA,YAEV,8BAAC,uBAAoB,SAAQ,kBAAiB;AAAA;AAAA,QAChD,IACE;AAAA,QAEJ,oBAAC,SAAI,KAAK,SAAS,WAAU,0BAC1B,yBACC;AAAA,UAAC;AAAA;AAAA,YACC,UACE;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,aAAU;AAAA,gBACV,aAAU;AAAA,gBAEV;AAAA,sCAAC,WAAQ,MAAM,IAAI,WAAU,qBAAoB;AAAA,kBACjD,oBAAC,UAAK,WAAU,WAAU,qBAAO;AAAA;AAAA;AAAA,YACnC;AAAA,YAGF,8BAAC,8BAA2B;AAAA;AAAA,QAC9B,IACE,eACF,oBAAC,gBAAa,IACZ,eAAe,OAAO,kBAAkB,OAC1C,oBAAC,oBAA4C,SAAS,MAAM,kBAArC,MAAM,cAA+C,IAC1E,cACF,oBAAC,iBAAc,eAAe,MAAM,iBAAiB,KAAK,GAAG,IAC3D,gBACF;AAAA,UAAC;AAAA;AAAA,YACC,UACE;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,aAAU;AAAA,gBACV,aAAU;AAAA,gBAEV;AAAA,sCAAC,WAAQ,MAAM,IAAI,WAAU,qBAAoB;AAAA,kBACjD,oBAAC,UAAK,WAAU,WAAU,qBAAO;AAAA;AAAA;AAAA,YACnC;AAAA,YAGF,8BAAC,iBAAc;AAAA;AAAA,QACjB,IACE,SACF,oBAAC,yBAAsB,IAEvB,oBAAC,UAAO,GAEZ;AAAA,SACF;AAAA,OACF;AAAA,IAGC,gBACC,iCACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,WAAU;AAAA,UACV,SAAS,MAAM,iBAAiB,KAAK;AAAA;AAAA,MACvC;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,MAAK;AAAA,UACL,cAAW;AAAA,UACX,UAAU;AAAA,UACV,YAAY,MAAM,iBAAiB,KAAK;AAAA,UACxC,WAAU;AAAA;AAAA,MACZ;AAAA,OACF,IACE;AAAA,KACN;AAEJ;","names":[]}
@@ -5,16 +5,18 @@ import {
5
5
  SearchInput_default,
6
6
  auiInputClass,
7
7
  useToasterOptional
8
- } from "./chunk-OSV3HI5M.js";
8
+ } from "./chunk-GG23N2GW.js";
9
+ import "./chunk-T6QQV5LK.js";
9
10
  import {
10
- Icon,
11
- getErrorMessage
12
- } from "./chunk-FJ5RSSMA.js";
11
+ Icon
12
+ } from "./chunk-3ZW74FHC.js";
13
13
  import {
14
+ getErrorMessage,
14
15
  useCatalogServer
15
- } from "./chunk-WQULF5AT.js";
16
- import "./chunk-B52K63AW.js";
17
- import "./chunk-36KOSC2J.js";
16
+ } from "./chunk-2GIZY3JJ.js";
17
+ import "./chunk-M6MHLVSO.js";
18
+ import "./chunk-CG75X77Q.js";
19
+ import "./chunk-JCL3Q7RW.js";
18
20
 
19
21
  // src/containers/SettingsBuilder/SkillSettings.tsx
20
22
  import { useCallback, useEffect, useMemo, useState as useState2 } from "react";
@@ -153,7 +155,7 @@ var ImportGithubSkillForm = ({ open, onOpenChange, onImport, busy = false, error
153
155
  ] }),
154
156
  /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
155
157
  error ? /* @__PURE__ */ jsx("p", { className: "text-failure-bg text-sm", children: error }) : null,
156
- /* @__PURE__ */ jsx(Button, { type: "submit", disabled: !canImport, className: "w-full", children: "Import" })
158
+ /* @__PURE__ */ jsx(Button.Primary, { type: "submit", disabled: !canImport, className: "w-full", children: "Import" })
157
159
  ] })
158
160
  ] }) })
159
161
  }
@@ -165,6 +167,9 @@ var ImportGithubSkillForm_default = ImportGithubSkillForm;
165
167
  import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
166
168
  var matchesQuery = (query, name, description) => !query || name.toLowerCase().includes(query) || description.toLowerCase().includes(query);
167
169
  var isRegistrySkill = (skill) => "catalogId" in skill;
170
+ function isManagedSkillError(error) {
171
+ return typeof error === "object" && error !== null && Reflect.get(error, "statusCode") === 424;
172
+ }
168
173
  var SkillSettings = () => {
169
174
  const { skillCatalog } = useCatalogServer();
170
175
  const toaster = useToasterOptional();
@@ -175,6 +180,7 @@ var SkillSettings = () => {
175
180
  const [error, setError] = useState2(null);
176
181
  const [formError, setFormError] = useState2(null);
177
182
  const [busy, setBusy] = useState2(false);
183
+ const [managedExternally, setManagedExternally] = useState2(false);
178
184
  const [importOpen, setImportOpen] = useState2(false);
179
185
  const refresh = useCallback(async () => {
180
186
  if (!skillCatalog) return;
@@ -211,6 +217,7 @@ var SkillSettings = () => {
211
217
  await fn();
212
218
  await refresh();
213
219
  } catch (err) {
220
+ if (isManagedSkillError(err)) setManagedExternally(true);
214
221
  setMutationError(getErrorMessage(err, "Request failed"));
215
222
  throw err;
216
223
  } finally {
@@ -279,12 +286,11 @@ var SkillSettings = () => {
279
286
  /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-2 sm:flex-row", children: [
280
287
  /* @__PURE__ */ jsx2("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsx2(SearchInput_default, { query, setQuery, placeholder: "Search skills" }) }),
281
288
  /* @__PURE__ */ jsxs2(
282
- Button,
289
+ Button.Secondary,
283
290
  {
284
- variant: "secondary",
285
291
  type: "button",
286
292
  className: "shrink-0",
287
- disabled: busy,
293
+ disabled: busy || managedExternally,
288
294
  onClick: () => {
289
295
  setFormError(null);
290
296
  setImportOpen(true);
@@ -316,12 +322,11 @@ var SkillSettings = () => {
316
322
  name: skill.name,
317
323
  description: skill.description,
318
324
  action: skillCatalog.deleteSkill ? /* @__PURE__ */ jsx2(
319
- Button,
325
+ Button.Secondary,
320
326
  {
321
- variant: "outline",
322
- size: "sm",
327
+ size: "small",
323
328
  type: "button",
324
- disabled: busy,
329
+ disabled: busy || managedExternally,
325
330
  "aria-label": `Remove ${skill.name}`,
326
331
  onClick: () => {
327
332
  handleRemove(skill);
@@ -350,12 +355,11 @@ var SkillSettings = () => {
350
355
  name: entry.name,
351
356
  description: entry.description,
352
357
  action: /* @__PURE__ */ jsx2(
353
- Button,
358
+ Button.Secondary,
354
359
  {
355
- variant: "outline",
356
- size: "sm",
360
+ size: "small",
357
361
  type: "button",
358
- disabled: busy,
362
+ disabled: busy || managedExternally,
359
363
  "aria-label": `Enable ${entry.name}`,
360
364
  onClick: () => {
361
365
  handleSelect(entry);
@@ -378,7 +382,7 @@ var SkillSettings = () => {
378
382
  if (!open) setFormError(null);
379
383
  },
380
384
  onImport: handleImport,
381
- busy,
385
+ busy: busy || managedExternally,
382
386
  error: formError
383
387
  }
384
388
  )
@@ -388,4 +392,4 @@ var SkillSettings_default = SkillSettings;
388
392
  export {
389
393
  SkillSettings_default as default
390
394
  };
391
- //# sourceMappingURL=SkillSettings-3EPPC3IT.js.map
395
+ //# sourceMappingURL=SkillSettings-7OHT7FPI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/containers/SettingsBuilder/SkillSettings.tsx","../src/containers/SettingsBuilder/ImportGithubSkillForm.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useState, type ReactNode } from 'react';\n\nimport { Button } from '@/atoms/primitives/Button.js';\nimport SearchInput from '@/atoms/primitives/SearchInput.js';\nimport { Icon } from '@/icons/Icon.js';\nimport { useCatalogServer } from '../../server/ServerContext.js';\nimport type { RegistrySkill, SkillBase, SkillCatalogEntry, SkillConfigBase } from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\nimport { useToasterOptional } from '../ToasterContainer.js';\nimport ImportGithubSkillForm from './ImportGithubSkillForm.js';\n\nconst matchesQuery = (query: string, name: string, description: string) =>\n !query || name.toLowerCase().includes(query) || description.toLowerCase().includes(query);\n\nconst isRegistrySkill = (skill: SkillBase): skill is RegistrySkill => 'catalogId' in skill;\n\nfunction isManagedSkillError(error: unknown): boolean {\n return typeof error === 'object' && error !== null && Reflect.get(error, 'statusCode') === 424;\n}\n\nconst SkillSettings = () => {\n const { skillCatalog } = useCatalogServer();\n const toaster = useToasterOptional();\n\n const [query, setQuery] = useState('');\n const [skills, setSkills] = useState<SkillBase[]>([]);\n const [catalog, setCatalog] = useState<SkillCatalogEntry[]>([]);\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 const [managedExternally, setManagedExternally] = useState(false);\n const [importOpen, setImportOpen] = useState(false);\n\n const refresh = useCallback(async () => {\n if (!skillCatalog) return;\n setLoading(true);\n setError(null);\n try {\n const [defined, available] = await Promise.all([skillCatalog.listSkills(), skillCatalog.getSkillCatalog()]);\n setSkills(defined);\n setCatalog(available);\n } catch (err) {\n setError(getErrorMessage(err, 'Failed to load skills'));\n } finally {\n setLoading(false);\n }\n }, [skillCatalog]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const normalizedQuery = query.trim().toLowerCase();\n\n const selectedSkills = useMemo(\n () => skills.filter(skill => matchesQuery(normalizedQuery, skill.name, skill.description)),\n [skills, normalizedQuery],\n );\n\n const availableSkills = useMemo(() => {\n const selectedCatalogIds = new Set(skills.flatMap(skill => (isRegistrySkill(skill) ? [skill.catalogId] : [])));\n return catalog.filter(\n entry => !selectedCatalogIds.has(entry.id) && matchesQuery(normalizedQuery, entry.name, entry.description),\n );\n }, [catalog, skills, normalizedQuery]);\n\n const runMutation = async (fn: () => Promise<void>, setMutationError = setError) => {\n setBusy(true);\n setError(null);\n try {\n await fn();\n await refresh();\n } catch (err) {\n if (isManagedSkillError(err)) setManagedExternally(true);\n setMutationError(getErrorMessage(err, 'Request failed'));\n throw err;\n } finally {\n setBusy(false);\n }\n };\n\n if (!skillCatalog) {\n return <p className=\"text-sm text-text-secondary\">Skills catalog is not available.</p>;\n }\n\n const handleSelect = (entry: SkillCatalogEntry) => {\n void runMutation(async () => {\n await skillCatalog.createSkill({\n catalogId: entry.id,\n name: entry.name,\n description: entry.description,\n repoURL: entry.repoURL,\n path: entry.path,\n ref: entry.ref,\n });\n }).catch(() => {});\n };\n\n const handleRemove = (skill: SkillBase) => {\n const deleteSkill = skillCatalog.deleteSkill;\n if (!deleteSkill) return;\n void runMutation(async () => {\n await deleteSkill({ id: skill.id });\n }).catch(() => {});\n };\n\n const handleImport = async (draft: SkillConfigBase) => {\n setFormError(null);\n await runMutation(async () => {\n await skillCatalog.createSkill(draft);\n }, setFormError);\n setTimeout(() => {\n toaster?.showSuccess({ title: `${draft.name} imported` });\n }, 0);\n };\n\n const renderRow = ({\n key,\n name,\n description,\n action,\n }: {\n key: string;\n name: string;\n description: string;\n action: ReactNode;\n }) => (\n <article key={key} className=\"flex min-h-16 items-center gap-3 border-b border-border p-3 last:border-b-0\">\n <span\n className=\"flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg\"\n aria-hidden\n >\n <Icon name=\"lightbulb\" className=\"size-4.5 text-text-primary\" />\n </span>\n\n <div className=\"min-w-0 flex-1\">\n <h5 className=\"truncate text-sm font-medium text-text-primary\">{name}</h5>\n {description ? <p className=\"mt-0.5 truncate text-sm text-text-secondary\">{description}</p> : null}\n </div>\n\n {action}\n </article>\n );\n\n const hasMatches = selectedSkills.length > 0 || availableSkills.length > 0;\n\n return (\n <>\n <h3 className=\"text-xl font-semibold tracking-tight text-text-primary\">Skills</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">Use built-in skills or import custom skills from GitHub.</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 min-h-0 flex-1 flex-col gap-3\">\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <div className=\"min-w-0 flex-1\">\n <SearchInput query={query} setQuery={setQuery} placeholder=\"Search skills\" />\n </div>\n <Button.Secondary\n type=\"button\"\n className=\"shrink-0\"\n disabled={busy || managedExternally}\n onClick={() => {\n setFormError(null);\n setImportOpen(true);\n }}\n >\n <Icon name=\"github\" className=\"size-4\" />\n Import from GitHub\n </Button.Secondary>\n </div>\n\n <div className=\"flex flex-1 flex-col gap-5 overflow-y-auto pb-1\">\n {loading ? <p className=\"py-8 text-center text-sm text-text-secondary\">Loading…</p> : null}\n\n {!loading && selectedSkills.length > 0 ? (\n <section aria-labelledby=\"enabled-skills-heading\">\n <h4\n id=\"enabled-skills-heading\"\n className=\"mb-2 text-[0.8125rem] font-semibold uppercase text-text-secondary\"\n >\n Enabled · {selectedSkills.length}\n </h4>\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {selectedSkills.map(skill =>\n renderRow({\n key: skill.id,\n name: skill.name,\n description: skill.description,\n action: skillCatalog.deleteSkill ? (\n <Button.Secondary\n size=\"small\"\n type=\"button\"\n disabled={busy || managedExternally}\n aria-label={`Remove ${skill.name}`}\n onClick={() => {\n handleRemove(skill);\n }}\n >\n Remove\n </Button.Secondary>\n ) : null,\n }),\n )}\n </div>\n </section>\n ) : null}\n\n {!loading && availableSkills.length > 0 ? (\n <section aria-labelledby=\"available-skills-heading\">\n <h4\n id=\"available-skills-heading\"\n className=\"mb-2 text-[0.8125rem] font-semibold uppercase text-text-secondary\"\n >\n Available · {availableSkills.length}\n </h4>\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {availableSkills.map(entry =>\n renderRow({\n key: entry.id,\n name: entry.name,\n description: entry.description,\n action: (\n <Button.Secondary\n size=\"small\"\n type=\"button\"\n disabled={busy || managedExternally}\n aria-label={`Enable ${entry.name}`}\n onClick={() => {\n handleSelect(entry);\n }}\n >\n Enable\n </Button.Secondary>\n ),\n }),\n )}\n </div>\n </section>\n ) : null}\n\n {!loading && !hasMatches ? (\n <div className=\"flex flex-1 items-center justify-center rounded-xl border border-dashed border-border p-8 text-center text-sm text-text-secondary\">\n {normalizedQuery ? `No skills match “${query.trim()}”.` : 'No skills yet.'}\n </div>\n ) : null}\n </div>\n </div>\n\n <ImportGithubSkillForm\n open={importOpen}\n onOpenChange={open => {\n setImportOpen(open);\n if (!open) setFormError(null);\n }}\n onImport={handleImport}\n busy={busy || managedExternally}\n error={formError}\n />\n </>\n );\n};\n\nexport default SkillSettings;\n","'use client';\n\nimport { useState, type SyntheticEvent } 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';\nimport type { SkillConfigBase } from '../../server/types.js';\n\ntype ImportGithubSkillFormProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onImport: (draft: SkillConfigBase) => void | Promise<void>;\n busy?: boolean;\n error?: string | null;\n};\n\nconst ImportGithubSkillForm = ({ open, onOpenChange, onImport, busy = false, error }: ImportGithubSkillFormProps) => {\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [repoURL, setRepoURL] = useState('');\n const [path, setPath] = useState('');\n const [ref, setRef] = useState('');\n\n const reset = () => {\n setName('');\n setDescription('');\n setRepoURL('');\n setPath('');\n setRef('');\n };\n\n const close = () => {\n reset();\n onOpenChange(false);\n };\n\n const handleSubmit = async (event: SyntheticEvent<HTMLFormElement, SubmitEvent>) => {\n event.preventDefault();\n if (!name.trim() || !description.trim() || !repoURL.trim() || !path.trim() || !ref.trim() || busy) return;\n\n try {\n await onImport({\n name: name.trim(),\n description: description.trim(),\n repoURL: repoURL.trim(),\n path: path.trim(),\n ref: ref.trim(),\n });\n close();\n } catch {\n // Parent surfaces error; keep form open.\n }\n };\n\n const canImport = Boolean(name.trim() && description.trim() && repoURL.trim() && path.trim() && ref.trim()) && !busy;\n\n return (\n <CenteredModal\n open={open}\n onOpenChange={nextOpen => {\n if (!nextOpen) close();\n }}\n title=\"Import from GitHub\"\n description=\"Import a skill from a SKILL.md file in a GitHub repository.\"\n headerIcon={\n <span className=\"flex size-11 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\">\n <Icon name=\"github\" className=\"size-5\" />\n </span>\n }\n contentSized\n className=\"md:max-w-2xl\"\n >\n <form onSubmit={e => void handleSubmit(e)}>\n <div className=\"space-y-5 px-5 py-5 md:px-6\">\n <div>\n <label htmlFor=\"skill-name\" className=\"mb-2 block text-sm font-semibold text-text-primary\">\n Name\n </label>\n <input\n id=\"skill-name\"\n value={name}\n onChange={event => {\n setName(event.target.value);\n }}\n placeholder=\"release-notes\"\n autoFocus\n required\n className={auiInputClass('h-11')}\n />\n </div>\n\n <div>\n <label htmlFor=\"skill-description\" className=\"mb-2 block text-sm font-semibold text-text-primary\">\n Description\n </label>\n <textarea\n id=\"skill-description\"\n value={description}\n onChange={event => {\n setDescription(event.target.value);\n }}\n placeholder=\"Generate release notes from merged pull requests\"\n required\n rows={3}\n className={auiInputClass('resize-y py-2.5')}\n />\n </div>\n\n <div>\n <label htmlFor=\"skill-repo-url\" className=\"mb-2 block text-sm font-semibold text-text-primary\">\n Repository URL\n </label>\n <input\n id=\"skill-repo-url\"\n type=\"url\"\n value={repoURL}\n onChange={event => {\n setRepoURL(event.target.value);\n }}\n placeholder=\"https://github.com/org/repo\"\n required\n className={auiInputClass('h-11')}\n />\n </div>\n\n <div>\n <label htmlFor=\"skill-path\" className=\"mb-2 block text-sm font-semibold text-text-primary\">\n Folder containing the SKILL.md\n </label>\n <input\n id=\"skill-path\"\n value={path}\n onChange={event => {\n setPath(event.target.value);\n }}\n placeholder=\"skills/release-notes\"\n required\n className={auiInputClass('h-11')}\n />\n </div>\n\n <div>\n <label htmlFor=\"skill-ref\" className=\"mb-2 block text-sm font-semibold text-text-primary\">\n Branch\n </label>\n <input\n id=\"skill-ref\"\n value={ref}\n onChange={event => {\n setRef(event.target.value);\n }}\n placeholder=\"main\"\n required\n className={auiInputClass('h-11')}\n />\n </div>\n\n <div className=\"space-y-3\">\n {error ? <p className=\"text-failure-bg text-sm\">{error}</p> : null}\n <Button.Primary type=\"submit\" disabled={!canImport} className=\"w-full\">\n Import\n </Button.Primary>\n </div>\n </div>\n </form>\n </CenteredModal>\n );\n};\n\nexport default ImportGithubSkillForm;\n"],"mappings":"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","names":["useState","jsx","jsxs","useState"]}
@@ -1,17 +1,21 @@
1
1
  "use client";
2
- import {
3
- resolveRoutesConfig
4
- } from "./chunk-YIWUG6MC.js";
5
2
  import {
6
3
  TrueForgeUIShell
7
- } from "./chunk-WREC7D54.js";
4
+ } from "./chunk-PCI6VMB5.js";
5
+ import "./chunk-DJUFS2BW.js";
8
6
  import "./chunk-BSIPI3KV.js";
7
+ import {
8
+ resolveRoutesConfig
9
+ } from "./chunk-2QTH6JHX.js";
10
+ import "./chunk-Y6S4OVVQ.js";
11
+ import "./chunk-RDXBMTP5.js";
12
+ import "./chunk-GG23N2GW.js";
13
+ import "./chunk-T6QQV5LK.js";
14
+ import "./chunk-3ZW74FHC.js";
15
+ import "./chunk-2GIZY3JJ.js";
9
16
  import "./chunk-M6MHLVSO.js";
10
- import "./chunk-OSV3HI5M.js";
11
- import "./chunk-FJ5RSSMA.js";
12
- import "./chunk-WQULF5AT.js";
13
- import "./chunk-B52K63AW.js";
14
- import "./chunk-36KOSC2J.js";
17
+ import "./chunk-CG75X77Q.js";
18
+ import "./chunk-JCL3Q7RW.js";
15
19
 
16
20
  // src/containers/TrueForgeUIWithRouter.tsx
17
21
  import { useMemo } from "react";
@@ -27,4 +31,4 @@ function TrueForgeUIWithRouter({
27
31
  export {
28
32
  TrueForgeUIWithRouter
29
33
  };
30
- //# sourceMappingURL=TrueForgeUIWithRouter-NZ4FGPE4.js.map
34
+ //# sourceMappingURL=TrueForgeUIWithRouter-LKG4XLW6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/containers/TrueForgeUIWithRouter.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo, type ComponentProps } from 'react';\nimport { BrowserRouter } from 'react-router-dom';\n\nimport { resolveRoutesConfig } from '../routing/paths.js';\nimport { TrueForgeUIShell } from './TrueForgeUIShell.js';\n\n/**\n * `withRouter` entry point. Owns a `BrowserRouter` and hands the resolved route\n * templates to the shell, which mounts `ShellRouteSync`. This module statically\n * imports react-router and is only loaded lazily from `TrueForgeUI`.\n */\nexport function TrueForgeUIWithRouter({\n routes,\n ...rest\n}: Omit<ComponentProps<typeof TrueForgeUIShell>, 'resolvedRoutes'>) {\n const resolved = useMemo(() => resolveRoutesConfig(routes), [routes]);\n return (\n <BrowserRouter basename={resolved.basename || undefined}>\n <TrueForgeUIShell {...rest} resolvedRoutes={resolved} />\n </BrowserRouter>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAEA,SAAS,eAAoC;AAC7C,SAAS,qBAAqB;AAiBxB;AAPC,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA,GAAG;AACL,GAAoE;AAClE,QAAM,WAAW,QAAQ,MAAM,oBAAoB,MAAM,GAAG,CAAC,MAAM,CAAC;AACpE,SACE,oBAAC,iBAAc,UAAU,SAAS,YAAY,QAC5C,8BAAC,oBAAkB,GAAG,MAAM,gBAAgB,UAAU,GACxD;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/containers/TrueForgeUIWithRouter.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo, type ComponentProps } from 'react';\nimport { BrowserRouter } from 'react-router-dom';\n\nimport { resolveRoutesConfig } from '../routing/paths.js';\nimport { TrueForgeUIShell } from './TrueForgeUIShell.js';\n\n/**\n * `withRouter` entry point. Owns a `BrowserRouter` and hands the resolved route\n * templates to the shell, which mounts `ShellRouteSync`. This module statically\n * imports react-router and is only loaded lazily from `TrueForgeUI`.\n */\nexport function TrueForgeUIWithRouter({\n routes,\n ...rest\n}: Omit<ComponentProps<typeof TrueForgeUIShell>, 'resolvedRoutes'>) {\n const resolved = useMemo(() => resolveRoutesConfig(routes), [routes]);\n return (\n <BrowserRouter basename={resolved.basename || undefined}>\n <TrueForgeUIShell {...rest} resolvedRoutes={resolved} />\n </BrowserRouter>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAEA,SAAS,eAAoC;AAC7C,SAAS,qBAAqB;AAiBxB;AAPC,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA,GAAG;AACL,GAAoE;AAClE,QAAM,WAAW,QAAQ,MAAM,oBAAoB,MAAM,GAAG,CAAC,MAAM,CAAC;AACpE,SACE,oBAAC,iBAAc,UAAU,SAAS,YAAY,QAC5C,8BAAC,oBAAkB,GAAG,MAAM,gBAAgB,UAAU,GACxD;AAEJ;","names":[]}