@tangle-network/sandbox-ui 0.113.7 → 0.114.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 (106) hide show
  1. package/dist/WorkflowGraph-B-NsdYz_.js +1961 -0
  2. package/dist/assets.d.ts +214 -206
  3. package/dist/assets.js +1057 -908
  4. package/dist/auth-CWe17Hly.js +37 -0
  5. package/dist/auth.d.ts +2 -30
  6. package/dist/auth.js +2 -15
  7. package/dist/chat-BOvFAe6p.js +903 -0
  8. package/dist/chat.d.ts +2 -230
  9. package/dist/chat.js +2 -34
  10. package/dist/connectors.d.ts +52 -49
  11. package/dist/connectors.js +595 -643
  12. package/dist/dashboard-CZ3VgNPR.js +4969 -0
  13. package/dist/dashboard.d.ts +4 -1297
  14. package/dist/dashboard.js +4 -152
  15. package/dist/editor.d.ts +2 -1
  16. package/dist/editor.js +2 -31
  17. package/dist/files.d.ts +2 -6
  18. package/dist/files.js +2 -33
  19. package/dist/globals.css +63 -3
  20. package/dist/hooks.d.ts +146 -148
  21. package/dist/hooks.js +222 -55
  22. package/dist/index-CKRaj1pM.d.ts +776 -0
  23. package/dist/index-CXX5IpH2.d.ts +2 -0
  24. package/dist/index-DPePq7c8.d.ts +1340 -0
  25. package/dist/index-DiyLLZuJ.d.ts +230 -0
  26. package/dist/index-DvmZLMT1.d.ts +30 -0
  27. package/dist/index-I8ZLVtHd.d.ts +330 -0
  28. package/dist/index-PRM636Ex.d.ts +86 -0
  29. package/dist/index.d.ts +21 -33
  30. package/dist/index.js +21 -701
  31. package/dist/info-panel-C9cqDzOL.js +594 -0
  32. package/dist/integrations.d.ts +133 -141
  33. package/dist/integrations.js +491 -673
  34. package/dist/markdown.d.ts +2 -1
  35. package/dist/markdown.js +2 -13
  36. package/dist/model-I-NIxeM-.js +1250 -0
  37. package/dist/model-brand-B9A4H9pJ.d.ts +98 -0
  38. package/dist/model-brand-hMyDTUqB.js +624 -0
  39. package/dist/motion-DkyBRJb9.js +37 -0
  40. package/dist/openui.d.ts +2 -1
  41. package/dist/openui.js +2 -7
  42. package/dist/pages.d.ts +307 -300
  43. package/dist/pages.js +4404 -4181
  44. package/dist/primitives-Dh1vG6J3.js +113 -0
  45. package/dist/primitives.d.ts +2 -74
  46. package/dist/primitives.js +2 -204
  47. package/dist/provider-logo-DjqmConF.js +311 -0
  48. package/dist/run.d.ts +2 -1
  49. package/dist/run.js +2 -23
  50. package/dist/sdk-hooks.d.ts +3 -4
  51. package/dist/sdk-hooks.js +3 -31
  52. package/dist/sidecar-DgH_vQ6m.d.ts +9 -0
  53. package/dist/stores.d.ts +14 -15
  54. package/dist/stores.js +13 -81
  55. package/dist/styles.css +63 -3
  56. package/dist/template-card-L-4gmjx2.d.ts +90 -0
  57. package/dist/terminal-CN9ZgHRt.js +197 -0
  58. package/dist/terminal.d.ts +60 -60
  59. package/dist/terminal.js +2 -10
  60. package/dist/tokens.css +51 -0
  61. package/dist/types.d.ts +4 -11
  62. package/dist/types.js +0 -1
  63. package/dist/use-pty-session-C8cE0adT.js +669 -0
  64. package/dist/use-sidecar-auth-CCTJcrq7.d.ts +145 -0
  65. package/dist/use-sidecar-auth-DkdcufOz.js +742 -0
  66. package/dist/utils-DzWbktWG.js +2 -0
  67. package/dist/utils.d.ts +2 -1
  68. package/dist/utils.js +2 -37
  69. package/dist/workbench-BCaCKl-J.js +8347 -0
  70. package/dist/workbench.d.ts +2 -310
  71. package/dist/workbench.js +2 -44
  72. package/dist/workflows.d.ts +341 -339
  73. package/dist/workflows.js +74 -109
  74. package/dist/workspace-B6AtI6ld.js +2510 -0
  75. package/dist/workspace.d.ts +2 -761
  76. package/dist/workspace.js +2 -51
  77. package/package.json +46 -40
  78. package/dist/WorkflowGraph-2QOORYIR.js +0 -1722
  79. package/dist/chunk-2BUPSB7O.js +0 -0
  80. package/dist/chunk-3KBNPQQF.js +0 -2697
  81. package/dist/chunk-3LIXVEEE.js +0 -279
  82. package/dist/chunk-72UF2H5H.js +0 -707
  83. package/dist/chunk-AI25G5MX.js +0 -944
  84. package/dist/chunk-ANSC5AFC.js +0 -314
  85. package/dist/chunk-AZ3AWMTM.js +0 -8
  86. package/dist/chunk-BGVEHENC.js +0 -10
  87. package/dist/chunk-CZ7CSFO4.js +0 -39
  88. package/dist/chunk-DYXXYGS4.js +0 -4700
  89. package/dist/chunk-EI44GEQ5.js +0 -6
  90. package/dist/chunk-IACRDXER.js +0 -219
  91. package/dist/chunk-IOB2PW5Z.js +0 -55
  92. package/dist/chunk-M4K7ZGR2.js +0 -24
  93. package/dist/chunk-MYZAW4RX.js +0 -665
  94. package/dist/chunk-OMUIPJQZ.js +0 -555
  95. package/dist/chunk-RQZRXKMR.js +0 -398
  96. package/dist/chunk-SOKKTB7W.js +0 -230
  97. package/dist/chunk-TADGS4Q7.js +0 -1010
  98. package/dist/chunk-UCQNOUN3.js +0 -7964
  99. package/dist/chunk-ULPLRBMF.js +0 -34
  100. package/dist/chunk-WID73FPH.js +0 -89
  101. package/dist/chunk-X3YXP7FG.js +0 -38
  102. package/dist/logo-DiAjq759.d.ts +0 -15
  103. package/dist/model-brand-BNnaUKKZ.d.ts +0 -99
  104. package/dist/ports-list-CDIvTNnX.d.ts +0 -17
  105. package/dist/sdk-hooks-Djkjq4cp.d.ts +0 -145
  106. package/dist/template-card-Bn-Bw5xC.d.ts +0 -87
@@ -0,0 +1,1340 @@
1
+ import "./model-brand-B9A4H9pJ.js";
2
+ import "./template-card-L-4gmjx2.js";
3
+ import * as React$1 from "react";
4
+ import React, { ReactNode } from "react";
5
+ import { Clock } from "lucide-react";
6
+ import { HarnessType as HarnessType$1 } from "@tangle-network/agent-interface";
7
+ //#region src/dashboard/app-sidebar.d.ts
8
+ interface SidebarUser {
9
+ email: string;
10
+ name?: string;
11
+ tier?: string;
12
+ avatarUrl?: string;
13
+ }
14
+ /** Theme modes offered by the account menu's Appearance section. */
15
+ type ThemeMode = "light" | "dark" | "system";
16
+ /**
17
+ * Host-supplied controller for the account-menu Appearance section. The rail is
18
+ * theme-engine-agnostic: each app wires this to its own theme hook (gtm-agent
19
+ * uses the shared `useTheme`; the sandbox app uses its `vault`-aware
20
+ * `useThemeMode`). Provide it to {@link ProfileAvatar} to render Light/Dark/System.
21
+ */
22
+ interface AppearanceController {
23
+ value: ThemeMode;
24
+ onChange: (mode: ThemeMode) => void;
25
+ /** Which modes to offer, in order. Defaults to all three. */
26
+ modes?: ThemeMode[];
27
+ }
28
+ /**
29
+ * Compact light/dark switch driven by the shared `useTheme` hook.
30
+ *
31
+ * @deprecated The redesigned rail no longer renders a standalone theme toggle —
32
+ * theme lives in the account menu as a Light/Dark/System control via the
33
+ * `appearance` controller on {@link ProfileAvatar} (and both layouts). Kept for
34
+ * backward compatibility; not used by `SidebarLayout`/`DashboardLayout`.
35
+ */
36
+ declare function RailThemeToggle({ className }: {
37
+ className?: string;
38
+ }): React$1.JSX.Element;
39
+ interface RailCollapseToggleProps {
40
+ /** Whether the rail is currently collapsed (icon-only). */
41
+ collapsed: boolean;
42
+ /** Render with a label beside the chevron (expanded/labeled rail) vs. icon-only. */
43
+ showLabel?: boolean;
44
+ onToggle: () => void;
45
+ className?: string;
46
+ }
47
+ declare function RailCollapseToggle({ collapsed, showLabel, onToggle, className }: RailCollapseToggleProps): React$1.JSX.Element;
48
+ interface RailHeaderProps {
49
+ /** Brand mark shown on the left, e.g. `<Logo iconOnly />`. */
50
+ brand?: React$1.ReactNode;
51
+ /** Destination for the brand link. When set with `LinkComponent`, the brand is a link. */
52
+ brandHref?: string;
53
+ /**
54
+ * Optional middle content (e.g. a project/workspace switcher).
55
+ *
56
+ * When `brand` is set, this is expanded-only — the collapsed rail has room
57
+ * for the mark alone. When `brand` is NOT set this content owns the rail top
58
+ * in BOTH states, so it is also rendered collapsed; read `useSidebar()` to
59
+ * swap in a compact mark there.
60
+ */
61
+ children?: React$1.ReactNode;
62
+ /** Whether the rail is collapsed (icon-only). */
63
+ collapsed: boolean;
64
+ /** Collapse/expand the rail. */
65
+ onToggle: () => void;
66
+ /**
67
+ * Whether the rail can collapse/expand. When `false`, no panel toggle is
68
+ * rendered and the collapsed header shows the brand without the hover-morph.
69
+ * Defaults to `true`.
70
+ */
71
+ collapsible?: boolean;
72
+ LinkComponent?: React$1.ComponentType<any>;
73
+ className?: string;
74
+ }
75
+ declare function RailHeader({ brand, brandHref, children, collapsed, onToggle, collapsible, LinkComponent, className }: RailHeaderProps): React$1.JSX.Element;
76
+ interface SidebarProps {
77
+ children: React$1.ReactNode;
78
+ className?: string;
79
+ style?: React$1.CSSProperties;
80
+ }
81
+ declare function Sidebar({ children, className, style }: SidebarProps): React$1.JSX.Element;
82
+ interface SidebarRailProps {
83
+ children: React$1.ReactNode;
84
+ className?: string;
85
+ /**
86
+ * Render the rail at the wider mobile-drawer width so labels fit
87
+ * beside the icons. Defaults to the 64px icon-only rail used on
88
+ * desktop.
89
+ */
90
+ wide?: boolean;
91
+ }
92
+ declare function SidebarRail({ children, className, wide }: SidebarRailProps): React$1.JSX.Element;
93
+ interface SidebarRailHeaderProps {
94
+ children: React$1.ReactNode;
95
+ className?: string;
96
+ }
97
+ /**
98
+ * @deprecated Superseded by {@link RailHeader}, the three-slot header
99
+ * (brand · middle · panel toggle) used by both shells. Kept for backward
100
+ * compatibility; no longer rendered by `SidebarLayout`/`DashboardLayout`.
101
+ */
102
+ declare function SidebarRailHeader({ children, className }: SidebarRailHeaderProps): React$1.JSX.Element;
103
+ interface SidebarRailNavProps {
104
+ children: React$1.ReactNode;
105
+ className?: string;
106
+ /**
107
+ * Click handler on the `<nav>` itself. Layouts use it (with a
108
+ * `target === currentTarget` guard) so clicking the empty body of a collapsed
109
+ * rail expands it, without intercepting clicks on the nav items.
110
+ */
111
+ onClick?: React$1.MouseEventHandler<HTMLElement>;
112
+ }
113
+ declare function SidebarRailNav({ children, className, onClick }: SidebarRailNavProps): React$1.JSX.Element;
114
+ interface SidebarRailFooterProps {
115
+ children: React$1.ReactNode;
116
+ className?: string;
117
+ }
118
+ declare function SidebarRailFooter({ children, className }: SidebarRailFooterProps): React$1.JSX.Element;
119
+ interface RailSeparatorProps {
120
+ className?: string;
121
+ }
122
+ declare function RailSeparator({ className }: RailSeparatorProps): React$1.JSX.Element;
123
+ interface RailButtonProps {
124
+ icon: React$1.ComponentType<{
125
+ className?: string;
126
+ }>;
127
+ label: string;
128
+ isActive?: boolean;
129
+ badge?: number;
130
+ onClick?: () => void;
131
+ className?: string;
132
+ /** Show label text next to icon (for mobile drawer) */
133
+ showLabel?: boolean;
134
+ /**
135
+ * Render the rail-button styling onto a single child element (e.g. a router
136
+ * `<Link>`) instead of an inner `<button>`. The child receives the button
137
+ * classes, `title`, and the icon/label/badge as its content — so navigation
138
+ * items stay real anchors (keyboard, cmd-click, prefetch) without copying the
139
+ * class recipe or nesting `<a><button>`.
140
+ */
141
+ asChild?: boolean;
142
+ children?: React$1.ReactNode;
143
+ /**
144
+ * `"primary"` gives the item a distinct emphasized pill (accent fill + accent
145
+ * border) so it stands out from the rest of the nav, e.g. a "New" action.
146
+ * Defaults to `"normal"`.
147
+ */
148
+ variant?: "normal" | "primary";
149
+ /**
150
+ * Inline style for the rendered row. Layouts use it to set `--stagger-index`
151
+ * so a rail of nav items arrives as a sequence rather than a flash; the
152
+ * variable has to land on the animated element itself, which is this one.
153
+ */
154
+ style?: React$1.CSSProperties;
155
+ }
156
+ declare function RailButton({ icon: Icon, label, isActive, badge, onClick, className, showLabel, asChild, children, variant, style }: RailButtonProps): React$1.JSX.Element;
157
+ interface RailFlyoutProps {
158
+ icon: React$1.ComponentType<{
159
+ className?: string;
160
+ }>;
161
+ label: string;
162
+ /** Highlight the trigger (e.g. when a child route is active). */
163
+ isActive?: boolean;
164
+ /** Show the label text beside the icon (labeled rail) vs. icon-only. */
165
+ showLabel?: boolean;
166
+ /** Heading rendered at the top of the open flyout. Defaults to `label`. */
167
+ title?: string;
168
+ /** Flyout body — the sub-surfaces revealed when the item is opened. */
169
+ children: React$1.ReactNode;
170
+ className?: string;
171
+ /** @see {@link RailButtonProps.style} — carries `--stagger-index` in a rail. */
172
+ style?: React$1.CSSProperties;
173
+ }
174
+ /**
175
+ * A rail entry that reveals its sub-surfaces in a small panel anchored to the
176
+ * RIGHT of the rail item, rather than pushing the rail open with an inline
177
+ * accordion. Opens on click, closes on outside-click, Escape, or selecting an
178
+ * item inside it. Use for a single "door" (e.g. Studio) that fronts several
179
+ * related destinations without permanently spending rail height on them.
180
+ */
181
+ declare function RailFlyout({ icon: Icon, label, isActive, showLabel, title, children, className, style }: RailFlyoutProps): React$1.JSX.Element;
182
+ /** A single entry in a sub-item's hover actions menu (kebab). */
183
+ interface RailSubItemAction {
184
+ id: string;
185
+ label: string;
186
+ icon?: React$1.ComponentType<{
187
+ className?: string;
188
+ }>;
189
+ /** Style the item as a destructive action (e.g. delete). */
190
+ destructive?: boolean;
191
+ onSelect: () => void;
192
+ }
193
+ /** A sub-destination revealed by a {@link RailExpandable} item. */
194
+ interface RailExpandableSubItem {
195
+ id: string;
196
+ label: string;
197
+ icon?: React$1.ComponentType<{
198
+ className?: string;
199
+ }>;
200
+ href: string;
201
+ prefetch?: "none" | "intent" | "render" | "viewport";
202
+ /** Show a live working indicator on the row while the item is busy. */
203
+ isLoading?: boolean;
204
+ /** Render the row emphasized (bold + accent) so it stands out — e.g. a
205
+ * trailing "view all" action below a capped list. */
206
+ emphasis?: boolean;
207
+ /** Mark the row as unread — bold label + a leading dot. Suppressed while
208
+ * `isLoading` so a responding row shows only the working indicator. */
209
+ unread?: boolean;
210
+ /** Hover-revealed kebab actions (e.g. rename/delete). Rendered on the
211
+ * labeled rail only; ignored in the collapsed-rail flyout. */
212
+ actions?: RailSubItemAction[];
213
+ }
214
+ interface RailExpandableProps {
215
+ icon: React$1.ComponentType<{
216
+ className?: string;
217
+ }>;
218
+ label: string;
219
+ /** Destination for the row itself. Clicking the label navigates here. */
220
+ href?: string;
221
+ /** Highlight the row (e.g. its own route or a child route is active). */
222
+ isActive?: boolean;
223
+ /** Labeled (expanded) rail vs. icon-only (collapsed) rail. */
224
+ showLabel?: boolean;
225
+ /** Fixed sub-items. Mutually exclusive with `loadSubItems`. */
226
+ subItems?: RailExpandableSubItem[];
227
+ /** Lazy sub-items — called once on first open; the result is cached. */
228
+ loadSubItems?: () => Promise<RailExpandableSubItem[]>;
229
+ /** Start expanded on mount (labeled rail). Defaults to collapsed. */
230
+ defaultOpen?: boolean;
231
+ /** Ids of sub-items whose route is active (drives sub-item highlight). */
232
+ activeSubIds?: string[];
233
+ /** Shown when the resolved sub-item list is empty. */
234
+ emptyLabel?: string;
235
+ /** Called when the row or a sub-item navigates (e.g. to close a mobile drawer). */
236
+ onNavigate?: () => void;
237
+ LinkComponent?: React$1.ComponentType<any>;
238
+ className?: string;
239
+ /** @see {@link RailButtonProps.style} — carries `--stagger-index` in a rail. */
240
+ style?: React$1.CSSProperties;
241
+ }
242
+ /**
243
+ * A nav item that reveals sub-items. On the labeled rail it expands inline as an
244
+ * accordion: the leading icon morphs into a chevron on hover, clicking the
245
+ * chevron toggles the list, and clicking the label navigates (`href`). On the
246
+ * icon-only rail it shows the sub-items in a right-anchored flyout on hover.
247
+ * Sub-items can be fixed (`subItems`) or lazy (`loadSubItems`, with a loading
248
+ * skeleton). Used for e.g. a "History" entry fronting recent sessions.
249
+ */
250
+ declare function RailExpandable({ icon: Icon, label, href, isActive, showLabel, subItems, loadSubItems, activeSubIds, emptyLabel, defaultOpen, onNavigate, LinkComponent, className, style }: RailExpandableProps): React$1.JSX.Element;
251
+ interface RailModeButtonProps {
252
+ mode: string;
253
+ icon: React$1.ComponentType<{
254
+ className?: string;
255
+ }>;
256
+ label: string;
257
+ badge?: number;
258
+ className?: string;
259
+ /** Show label text next to icon (for mobile drawer) */
260
+ showLabel?: boolean;
261
+ /** @see {@link RailButtonProps.style} — carries `--stagger-index` in a rail. */
262
+ style?: React$1.CSSProperties;
263
+ }
264
+ declare function RailModeButton({ mode, icon, label, badge, className, showLabel, style }: RailModeButtonProps): React$1.JSX.Element;
265
+ interface SidebarPanelProps {
266
+ children: React$1.ReactNode;
267
+ className?: string;
268
+ }
269
+ declare function SidebarPanel({ children, className }: SidebarPanelProps): React$1.JSX.Element;
270
+ interface SidebarPanelHeaderProps {
271
+ children?: React$1.ReactNode;
272
+ title?: string;
273
+ className?: string;
274
+ }
275
+ declare function SidebarPanelHeader({ children, title, className }: SidebarPanelHeaderProps): React$1.JSX.Element;
276
+ interface SidebarPanelContentProps {
277
+ children: React$1.ReactNode;
278
+ className?: string;
279
+ }
280
+ declare function SidebarPanelContent({ children, className }: SidebarPanelContentProps): React$1.JSX.Element;
281
+ interface SidebarContentProps {
282
+ children: React$1.ReactNode;
283
+ className?: string;
284
+ }
285
+ declare function SidebarContent({ children, className }: SidebarContentProps): React$1.JSX.Element;
286
+ interface ProfileAvatarProps {
287
+ user?: SidebarUser | null;
288
+ isLoading?: boolean;
289
+ onLogout?: () => void;
290
+ onSettingsClick?: () => void;
291
+ settingsHref?: string;
292
+ /** Extra dropdown items rendered before settings/logout */
293
+ children?: React$1.ReactNode;
294
+ className?: string;
295
+ /** Show name/email beside the avatar (for a labeled rail) instead of an icon-only avatar button. */
296
+ showDetails?: boolean;
297
+ /**
298
+ * When provided, the menu renders an Appearance section (Light/Dark/System)
299
+ * driven by this host-supplied controller. Omit to hide it.
300
+ */
301
+ appearance?: AppearanceController;
302
+ LinkComponent?: React$1.ComponentType<any>;
303
+ }
304
+ declare function ProfileAvatar({ user, isLoading, onLogout, onSettingsClick, settingsHref, children, className, showDetails, appearance, LinkComponent }: ProfileAvatarProps): React$1.JSX.Element;
305
+ //#endregion
306
+ //#region src/dashboard/rail-tooltip.d.ts
307
+ interface RailTooltipProps {
308
+ /** Tooltip text shown to the right of the trigger. */
309
+ label: string;
310
+ /** The trigger element (icon button / link). */
311
+ children: React$1.ReactNode;
312
+ /** Disable the tooltip (e.g. when the rail is expanded and the label is inline). */
313
+ disabled?: boolean;
314
+ className?: string;
315
+ }
316
+ /**
317
+ * Quiet styled tooltip for the icon-only rail, rendered in a portal anchored to
318
+ * the RIGHT of the trigger. The portal is essential: the rail's nav is a
319
+ * vertical scroll container (`overflow-y-auto`), which the CSS spec forces to
320
+ * also clip horizontally — an in-flow tooltip would be cut off at the rail's
321
+ * edge. Positioned via `getBoundingClientRect` on hover/focus, shown after a
322
+ * short delay, and `pointer-events-none` so it never interferes with the
323
+ * trigger. Hidden from the a11y tree (`aria-hidden`) since the trigger already
324
+ * carries an accessible name.
325
+ *
326
+ * `disabled` suppresses the tooltip but NOT the wrapper. Returning a fragment
327
+ * instead changes the rendered element type, and React reconciles by type: the
328
+ * trigger inside would be torn down and rebuilt every time the rail toggles
329
+ * between icon-only and labeled. A rebuilt element replays its CSS entrance, so
330
+ * the whole nav would re-stagger on a collapse that moved nothing off screen.
331
+ * One element type, both states.
332
+ */
333
+ declare function RailTooltip({ label, children, disabled, className }: RailTooltipProps): React$1.JSX.Element;
334
+ //#endregion
335
+ //#region src/dashboard/sidebar-context.d.ts
336
+ /** Width constants (px) — Tangle Quiet density (ChatGPT-minimal) */
337
+ declare const SIDEBAR_RAIL_WIDTH = 56;
338
+ declare const SIDEBAR_PANEL_WIDTH = 268;
339
+ declare const SIDEBAR_TOTAL_WIDTH: number;
340
+ /**
341
+ * Width of the mobile drawer when the rail is rendered with labels
342
+ * (`showLabel` on {@link RailButton}). The standard 64px rail is only
343
+ * wide enough for icons; labels need a wider container to avoid truncation.
344
+ */
345
+ declare const SIDEBAR_MOBILE_WIDTH = 256;
346
+ /**
347
+ * Rail width when labels are shown beside icons on desktop. The default rail is
348
+ * icon-only at {@link SIDEBAR_RAIL_WIDTH}; a labeled rail needs room for the
349
+ * longest nav label plus its badge.
350
+ */
351
+ declare const SIDEBAR_RAIL_LABELED_WIDTH = 248;
352
+ interface SidebarContextValue {
353
+ /** Whether the content panel beside the rail is open */
354
+ panelOpen: boolean;
355
+ setPanelOpen: (open: boolean) => void;
356
+ togglePanel: () => void;
357
+ /** Current panel mode (app-defined, e.g. "projects", "batches") */
358
+ mode: string;
359
+ setMode: (mode: string) => void;
360
+ /** Switch mode — opens panel if closed, closes if same mode clicked */
361
+ switchMode: (mode: string) => void;
362
+ /** Whether entire sidebar (rail + panel) is hidden (focus mode) */
363
+ hidden: boolean;
364
+ setHidden: (hidden: boolean) => void;
365
+ /** Computed content margin in px */
366
+ contentMargin: number;
367
+ /** Whether there are panels at all */
368
+ hasPanels: boolean;
369
+ /**
370
+ * Whether the labeled nav rail is collapsed to the icon-only width. Independent
371
+ * of {@link panelOpen} (the slide-out content panel) — two separate collapses.
372
+ * Only meaningful when the rail is label-capable; an icon-only rail stays
373
+ * icon-only regardless.
374
+ */
375
+ railCollapsed: boolean;
376
+ setRailCollapsed: (collapsed: boolean) => void;
377
+ toggleRail: () => void;
378
+ /**
379
+ * Rail width in px — derived from {@link railCollapsed}: the icon-only width
380
+ * when collapsed (or when the rail is not label-capable), the labeled width
381
+ * when expanded.
382
+ */
383
+ railWidth: number;
384
+ }
385
+ interface SidebarProviderProps {
386
+ defaultPanelOpen?: boolean;
387
+ defaultMode?: string;
388
+ hasPanels?: boolean;
389
+ /**
390
+ * Whether the rail can show labels beside icons. When `true`, the expanded
391
+ * rail renders at {@link SIDEBAR_RAIL_LABELED_WIDTH} and the user can collapse
392
+ * it to the icon-only {@link SIDEBAR_RAIL_WIDTH} via {@link toggleRail}. When
393
+ * `false` (default) the rail is permanently icon-only and `railCollapsed` has
394
+ * no width effect.
395
+ */
396
+ labeledRail?: boolean;
397
+ /**
398
+ * Controlled panel-open state. When provided, the provider treats panel
399
+ * visibility as controlled: it never reads or writes localStorage and
400
+ * reports changes through {@link onPanelOpenChange} instead. Use this in
401
+ * server-rendered apps — seed it from a value the server also has (e.g. a
402
+ * cookie) so the SSR markup matches the first client render. The localStorage
403
+ * read in the uncontrolled path is what diverges from SSR and breaks hydration.
404
+ */
405
+ panelOpen?: boolean;
406
+ onPanelOpenChange?: (open: boolean) => void;
407
+ /**
408
+ * Controlled rail-collapsed state. Parallels {@link panelOpen}: when provided
409
+ * the provider never touches localStorage for the rail and reports changes
410
+ * through {@link onRailCollapsedChange}. Seed it from a cookie in SSR apps so
411
+ * the rail width survives reload without a hydration mismatch.
412
+ */
413
+ railCollapsed?: boolean;
414
+ onRailCollapsedChange?: (collapsed: boolean) => void;
415
+ /** Initial rail-collapsed state for the uncontrolled path. Default: expanded. */
416
+ defaultRailCollapsed?: boolean;
417
+ children: React$1.ReactNode;
418
+ }
419
+ declare function SidebarProvider({ defaultPanelOpen, defaultMode, hasPanels, labeledRail, panelOpen: controlledPanelOpen, onPanelOpenChange, railCollapsed: controlledRailCollapsed, onRailCollapsedChange, defaultRailCollapsed, children }: SidebarProviderProps): React$1.JSX.Element;
420
+ declare function useSidebar(): SidebarContextValue;
421
+ //#endregion
422
+ //#region src/dashboard/credit-balance.d.ts
423
+ interface CreditBalanceProps {
424
+ amount: number;
425
+ description?: string;
426
+ onTopUp?: (amount: number) => void;
427
+ quickAmounts?: number[];
428
+ className?: string;
429
+ }
430
+ declare function CreditBalance({ amount, description, onTopUp, quickAmounts, className }: CreditBalanceProps): React$1.JSX.Element;
431
+ //#endregion
432
+ //#region src/dashboard/out-of-credits.d.ts
433
+ /**
434
+ * Canonical "out of credits" UX, shared across every Tangle product.
435
+ *
436
+ * Backends emit a 402 with `{ error, code: "insufficient_balance", manageUrl,
437
+ * plan?, remainingBalanceUsd? }` when a billable action can't be funded. The
438
+ * frontend catches it, calls {@link parseInsufficientBalance} to extract the
439
+ * shape, and renders {@link OutOfCreditsModal} — a single "add credits /
440
+ * subscribe" CTA that links to the platform billing page (`manageUrl`).
441
+ *
442
+ * This replaces the per-app bespoke handling (silent failures, raw errors,
443
+ * un-clickable text) with one component so the funnel is uniform + testable.
444
+ */
445
+ declare const INSUFFICIENT_BALANCE_CODE = "insufficient_balance";
446
+ interface InsufficientBalance {
447
+ /** Platform billing URL to add credits / subscribe / connect a card. */
448
+ manageUrl: string;
449
+ /** Current plan, when the backend includes it. */
450
+ plan?: string;
451
+ /** Remaining balance (USD), when included. */
452
+ remainingBalanceUsd?: number;
453
+ /** Backend-supplied human message, when included. */
454
+ message?: string;
455
+ }
456
+ /**
457
+ * Detect + parse an insufficient-balance 402 from a parsed JSON body. Returns
458
+ * the typed shape when the body is an insufficient-balance error, else `null`.
459
+ * Falls back to the platform default billing URL when the backend omits
460
+ * `manageUrl` so the CTA is never dead.
461
+ */
462
+ declare function parseInsufficientBalance(payload: unknown, opts?: {
463
+ defaultManageUrl?: string;
464
+ }): InsufficientBalance | null;
465
+ interface OutOfCreditsModalProps {
466
+ /** Parsed insufficient-balance details (from {@link parseInsufficientBalance}). */
467
+ balance: InsufficientBalance | null;
468
+ /** Dismiss handler. When omitted the modal cannot be closed (hard paywall). */
469
+ onClose?: () => void;
470
+ /** Override the primary CTA label. Default "Add credits". */
471
+ ctaLabel?: string;
472
+ className?: string;
473
+ }
474
+ /**
475
+ * Modal shown when a user runs out of credits. Renders nothing when
476
+ * `balance` is null. The primary CTA opens the platform billing page where
477
+ * the user can add credits, subscribe, or connect a card for pay-per-use.
478
+ */
479
+ declare function OutOfCreditsModal({ balance, onClose, ctaLabel, className }: OutOfCreditsModalProps): React$1.JSX.Element | null;
480
+ //#endregion
481
+ //#region src/dashboard/cluster-status-bar.d.ts
482
+ interface ClusterStatusItem {
483
+ icon?: React$1.ReactNode;
484
+ label: string;
485
+ value: React$1.ReactNode;
486
+ valueClass?: string;
487
+ }
488
+ interface ClusterStatusBarProps {
489
+ items: ClusterStatusItem[];
490
+ latency?: string;
491
+ className?: string;
492
+ }
493
+ declare function ClusterStatusBar({ items, latency, className }: ClusterStatusBarProps): React$1.JSX.Element | null;
494
+ //#endregion
495
+ //#region src/dashboard/resource-meter.d.ts
496
+ interface ResourceMeterProps {
497
+ label: string;
498
+ value: number;
499
+ max?: number;
500
+ unit?: string;
501
+ icon?: React$1.ReactNode;
502
+ /**
503
+ * Overrides the right-hand readout. Use for values the raw
504
+ * `value{unit}/max{unit}` template can't express, e.g. byte sizes
505
+ * ("1.2 GB / 4 GB"). The bar fill still derives from value/max.
506
+ */
507
+ valueLabel?: string;
508
+ className?: string;
509
+ }
510
+ declare function ResourceMeter({ label, value, max, unit, valueLabel, icon, className }: ResourceMeterProps): React$1.JSX.Element;
511
+ //#endregion
512
+ //#region src/dashboard/resource-snapshot.d.ts
513
+ interface ResourceSnapshotItem {
514
+ /** Stable React key; falls back to `label` plus row index when omitted. */
515
+ id?: string;
516
+ label: string;
517
+ /** Current value, in the same unit as `max`. */
518
+ value: number;
519
+ /** Full-scale value. Omit to treat `value` as a 0-100 percent. */
520
+ max?: number;
521
+ /** Unit suffix for the default `value{unit}/max{unit}` readout. */
522
+ unit?: string;
523
+ /** Right-hand readout override (e.g. "1.2 GB / 4 GB"). */
524
+ valueLabel?: string;
525
+ icon?: React$1.ReactNode;
526
+ }
527
+ interface ResourceSnapshotProps {
528
+ title?: string;
529
+ /** Right-aligned header slot, e.g. a "View metrics" link. */
530
+ action?: React$1.ReactNode;
531
+ items: ResourceSnapshotItem[];
532
+ loading?: boolean;
533
+ /** When set, replaces the meters with an error line. */
534
+ error?: string | null;
535
+ className?: string;
536
+ }
537
+ /**
538
+ * Compact at-a-glance resource panel: a stack of {@link ResourceMeter}
539
+ * rows for an instantaneous CPU / memory / disk read. Time-series detail
540
+ * belongs in a dedicated metrics view; this is the snapshot.
541
+ */
542
+ declare function ResourceSnapshot({ title, action, items, loading, error, className }: ResourceSnapshotProps): React$1.JSX.Element;
543
+ //#endregion
544
+ //#region src/dashboard/activity-feed.d.ts
545
+ interface ActivityItem {
546
+ /** Stable key. */
547
+ id: string;
548
+ icon?: React$1.ReactNode;
549
+ title: string;
550
+ detail?: string;
551
+ /** Wall-clock ms. Drives ordering and the relative timestamp. */
552
+ timestamp?: number;
553
+ }
554
+ interface ActivityFeedProps {
555
+ title?: string;
556
+ action?: React$1.ReactNode;
557
+ items: ActivityItem[];
558
+ loading?: boolean;
559
+ /** Caps the rendered rows after sorting newest-first. Default 6. */
560
+ maxItems?: number;
561
+ emptyLabel?: string;
562
+ className?: string;
563
+ }
564
+ /**
565
+ * Newest-first list of recent sandbox activity (commits, snapshots,
566
+ * lifecycle events). Items are sorted by `timestamp` descending here so
567
+ * callers can merge heterogeneous sources without pre-sorting.
568
+ */
569
+ declare function ActivityFeed({ title, action, items, loading, maxItems, emptyLabel, className }: ActivityFeedProps): React$1.JSX.Element;
570
+ //#endregion
571
+ //#region src/dashboard/sandbox-card.d.ts
572
+ type SandboxStatus = "running" | "hibernating" | "provisioning" | "stopped" | "failed" | "archived" | "creating";
573
+ type TeamRole = "owner" | "admin" | "member" | "viewer";
574
+ interface SandboxCardData {
575
+ id: string;
576
+ name: string;
577
+ nodeId?: string;
578
+ status: SandboxStatus;
579
+ /**
580
+ * A user-customized container image (e.g. `ghcr.io/acme/api:sha-1a2b`).
581
+ * Surfaced only when set — sandboxes run a managed agent runtime image by
582
+ * default, which is not operator-relevant and is intentionally not shown.
583
+ */
584
+ customImage?: string;
585
+ /** @deprecated The product has no user-selectable environment. Use `customImage`. */
586
+ image?: string;
587
+ /** @deprecated No longer rendered; the card derives its glyph from status. */
588
+ imageIcon?: React$1.ReactNode;
589
+ /** Allocated vCPU count. */
590
+ vcpu?: number;
591
+ /** Live CPU utilization, 0–100. */
592
+ cpuPercent?: number;
593
+ /** Live RAM in use (GB). */
594
+ ramUsed?: number;
595
+ /** Allocated RAM (GB). */
596
+ ramTotal?: number;
597
+ /** Disk in use (GB). */
598
+ diskUsed?: number;
599
+ /** Allocated disk (GB). */
600
+ diskTotal?: number;
601
+ /** Human-readable uptime since last start, e.g. "3d 4h" or "12m". */
602
+ uptime?: string;
603
+ provisioningMessage?: string;
604
+ provisioningPercent?: number;
605
+ archivedAt?: string;
606
+ /**
607
+ * Populated when the sandbox is shared with a team. Drives a small
608
+ * "shared with X" badge in the card header so a user can see at a
609
+ * glance which of their sandboxes are personal vs. collaborative.
610
+ */
611
+ team?: {
612
+ id: string;
613
+ name?: string;
614
+ /** Caller's role in the team — the card uses this to gate the Delete action. */
615
+ role: TeamRole;
616
+ };
617
+ }
618
+ interface SandboxCardProps {
619
+ sandbox: SandboxCardData;
620
+ onOpenIDE?: (id: string) => void;
621
+ onOpenTerminal?: (id: string) => void;
622
+ /** Preferred start handler; drives the footer + dropdown Resume action. */
623
+ onResume?: (id: string) => void;
624
+ /**
625
+ * @deprecated Use `onResume`. Retained for back-compat: only a
626
+ * `hibernating` card falls back to `onWake` when `onResume` is absent.
627
+ */
628
+ onWake?: (id: string) => void;
629
+ onRestore?: (id: string) => void;
630
+ onDelete?: (id: string) => void;
631
+ onStop?: (id: string) => void;
632
+ onFork?: (id: string) => void;
633
+ onKeepAlive?: (id: string) => void;
634
+ onUsage?: (id: string) => void;
635
+ onHealth?: (id: string) => void;
636
+ className?: string;
637
+ }
638
+ declare function canAdminSandbox(sandbox: SandboxCardData): boolean;
639
+ declare function SandboxCard({ sandbox, onOpenIDE, onOpenTerminal, onWake, onRestore, onDelete, onStop, onResume, onFork, onKeepAlive, onUsage, onHealth, className }: SandboxCardProps): React$1.JSX.Element;
640
+ interface NewSandboxCardProps {
641
+ onClick?: () => void;
642
+ className?: string;
643
+ }
644
+ declare function NewSandboxCard({ onClick, className }: NewSandboxCardProps): React$1.JSX.Element;
645
+ //#endregion
646
+ //#region src/dashboard/sandbox-table.d.ts
647
+ interface SandboxTableProps {
648
+ sandboxes: SandboxCardData[];
649
+ page?: number;
650
+ pageSize?: number;
651
+ total?: number;
652
+ onPageChange?: (page: number) => void;
653
+ onOpenIDE?: (id: string) => void;
654
+ onOpenTerminal?: (id: string) => void;
655
+ onSSH?: (id: string) => void;
656
+ /**
657
+ * Resume a stopped / failed / archived sandbox, or wake a hibernating
658
+ * one. Surfaces an explicit "Resume" (or "Wake Up" for `hibernating`)
659
+ * button in the actions cell and makes the row body clickable for any
660
+ * status this prop covers. Preferred over `onWake` for new code — the
661
+ * two are kept as separate props only so existing consumers that
662
+ * wired up `onWake` for hibernating continue to work.
663
+ */
664
+ onResume?: (id: string) => void;
665
+ /**
666
+ * @deprecated Use `onResume` instead. Retained for back-compat:
667
+ * when `onResume` is not provided but `onWake` is, hibernating rows
668
+ * will still surface a Wake action. New consumers should pass
669
+ * `onResume` so stopped / failed / archived rows also get a start
670
+ * affordance.
671
+ */
672
+ onWake?: (id: string) => void;
673
+ onMore?: (id: string) => void;
674
+ /** Fired on the user's first click; the caller owns the confirmation step. */
675
+ onDelete?: (id: string) => void;
676
+ onStop?: (id: string) => void;
677
+ onKeepAlive?: (id: string) => void;
678
+ onUsage?: (id: string) => void;
679
+ onHealth?: (id: string) => void;
680
+ onFork?: (id: string) => void;
681
+ className?: string;
682
+ }
683
+ declare function SandboxTable({ sandboxes, page, pageSize, total, onPageChange, onOpenIDE, onOpenTerminal, onSSH, onResume, onWake, onMore, onDelete, onStop, onKeepAlive, onUsage, onHealth, onFork, className }: SandboxTableProps): React$1.JSX.Element;
684
+ //#endregion
685
+ //#region src/dashboard/invoice-table.d.ts
686
+ interface Invoice {
687
+ id: string;
688
+ date: string;
689
+ amount: number;
690
+ status: "paid" | "pending" | "failed";
691
+ }
692
+ interface InvoiceTableProps {
693
+ invoices: Invoice[];
694
+ onExportAll?: () => void;
695
+ onLoadMore?: () => void;
696
+ onViewInvoice?: (id: string) => void;
697
+ hasMore?: boolean;
698
+ className?: string;
699
+ }
700
+ declare function InvoiceTable({ invoices, onExportAll, onLoadMore, onViewInvoice, hasMore, className }: InvoiceTableProps): React$1.JSX.Element;
701
+ //#endregion
702
+ //#region src/dashboard/plan-cards.d.ts
703
+ interface PlanFeature {
704
+ text: string;
705
+ }
706
+ interface PlanCardData {
707
+ id: string;
708
+ name: string;
709
+ price: number;
710
+ period?: string;
711
+ features: PlanFeature[];
712
+ popular?: boolean;
713
+ current?: boolean;
714
+ ctaLabel?: string;
715
+ onSelect?: (id: string) => void;
716
+ }
717
+ interface PlanCardsProps {
718
+ plans: PlanCardData[];
719
+ className?: string;
720
+ }
721
+ declare function PlanCards({ plans, className }: PlanCardsProps): React$1.JSX.Element;
722
+ //#endregion
723
+ //#region src/dashboard/backend-selector.d.ts
724
+ interface Backend {
725
+ type: string;
726
+ label: string;
727
+ description?: string;
728
+ /** Optional leading brand glyph (e.g. a HarnessLogo) shown in the trigger and rows. */
729
+ icon?: ReactNode;
730
+ }
731
+ type BackendSelectorVariant = "field" | "pill";
732
+ interface BackendSelectorProps {
733
+ backends: Backend[];
734
+ selected: string;
735
+ onChange: (selected: string) => void;
736
+ /**
737
+ * Trigger appearance. "pill" (default) = compact inline pill — logo + short
738
+ * label only. "field" = full-width form field with a label above. Either
739
+ * way the long descriptor lives only as subtext inside the open dropdown,
740
+ * never on the closed trigger.
741
+ */
742
+ variant?: BackendSelectorVariant;
743
+ label?: string;
744
+ placeholder?: string;
745
+ className?: string;
746
+ /** Extra classes merged onto the trigger itself (after the built-in defaults). */
747
+ triggerClassName?: string;
748
+ }
749
+ declare function BackendSelector({ backends, selected, onChange, variant, label, placeholder, className, triggerClassName }: BackendSelectorProps): import("react").JSX.Element;
750
+ //#endregion
751
+ //#region src/dashboard/harness-picker.d.ts
752
+ interface HarnessOption extends Backend {
753
+ type: HarnessType$1;
754
+ /**
755
+ * Whether this harness can drive an interactive chat session. `false` for
756
+ * shell-only backends (`cli-base`) that have no conversational agent — the
757
+ * chat composer filters these out (see {@link chatCapableHarnesses}) while
758
+ * scheduled/non-chat surfaces keep them.
759
+ */
760
+ chatCapable: boolean;
761
+ }
762
+ /**
763
+ * Default option list with human-readable copy. Order is curated so the
764
+ * recommended choice (`opencode`) appears first; `cli-base` (no agent) last.
765
+ *
766
+ * Descriptions name what the AGENT is, in one short line that fits the menu row
767
+ * without wrapping. They deliberately do NOT mention credentials: which keys a
768
+ * deployment supplies is a product decision, not a property of the harness, and
769
+ * an env-var name (`ANTHROPIC_API_KEY`) is developer text that has no place in a
770
+ * customer-facing menu. A product whose deployment really does require a
771
+ * user-supplied key says so through `optionsOverride`.
772
+ */
773
+ declare const HARNESS_OPTIONS: readonly HarnessOption[];
774
+ /** Harness types that can drive an interactive chat session. */
775
+ declare const chatCapableHarnesses: ReadonlyArray<HarnessType$1>;
776
+ interface HarnessPickerProps extends Omit<BackendSelectorProps, "backends" | "selected" | "onChange"> {
777
+ value: HarnessType$1;
778
+ onChange: (next: HarnessType$1) => void;
779
+ /** Filter the available harnesses (e.g. by plan tier). Defaults to all. */
780
+ available?: ReadonlyArray<HarnessType$1>;
781
+ /** Override or extend the option metadata. Keys are HarnessType. */
782
+ optionsOverride?: Partial<Record<HarnessType$1, Partial<Omit<HarnessOption, "type">>>>;
783
+ }
784
+ /**
785
+ * Type-safe harness/backend selector for sandbox-backed agent products.
786
+ *
787
+ * Wraps the generic {@link BackendSelector} with the canonical harness list
788
+ * baked in, so consumers don't have to re-declare it (or risk drifting from
789
+ * the SDK enum).
790
+ */
791
+ declare function HarnessPicker({ value, onChange, available, optionsOverride, label, ...rest }: HarnessPickerProps): import("react").JSX.Element;
792
+ //#endregion
793
+ //#region src/dashboard/harness-logo.d.ts
794
+ /**
795
+ * Per-harness brand glyph. `logoUrl` is a bundled lobehub data-url rendered
796
+ * as a CSS mask filled with the foreground token (single-color brand mark,
797
+ * theme-safe). `icon` is an honest lucide fallback for harnesses that have
798
+ * no published brand mark — never an invented logo.
799
+ */
800
+ interface HarnessBrand {
801
+ label: string;
802
+ logoUrl?: string;
803
+ icon?: React$1.ComponentType<{
804
+ className?: string;
805
+ }>;
806
+ }
807
+ declare const HARNESS_BRAND: Partial<Record<HarnessType$1, HarnessBrand>>;
808
+ interface HarnessLogoProps {
809
+ type: HarnessType$1;
810
+ /** Chip edge length in px. Default 16 (matches the model pill glyph). */
811
+ size?: number;
812
+ className?: string;
813
+ }
814
+ /**
815
+ * Brand chip for a harness, matching `BrandLogo`'s render contract in
816
+ * `lib/model-brand`: a rounded `bg-background ring-1 ring-border` chip wrapping
817
+ * either a foreground-filled CSS-mask of the brand SVG or a lucide fallback
818
+ * glyph. Keeps harness pills visually consistent with model pills.
819
+ */
820
+ declare function HarnessLogo({ type, size, className }: HarnessLogoProps): React$1.JSX.Element;
821
+ //#endregion
822
+ //#region src/dashboard/dashboard-layout.d.ts
823
+ type ProductVariant = "sandbox";
824
+ interface NavItem {
825
+ id: string;
826
+ label: string;
827
+ href?: string;
828
+ icon: React$1.ComponentType<{
829
+ className?: string;
830
+ }>;
831
+ badge?: number;
832
+ }
833
+ interface DashboardUser {
834
+ email: string;
835
+ name?: string;
836
+ tier?: string;
837
+ avatarUrl?: string;
838
+ }
839
+ interface TopNavLink {
840
+ label: string;
841
+ href: string;
842
+ }
843
+ interface PanelConfig {
844
+ mode: string;
845
+ title: string;
846
+ content: React$1.ReactNode;
847
+ }
848
+ interface DashboardLayoutProps {
849
+ children: React$1.ReactNode;
850
+ variant?: ProductVariant;
851
+ /** Navigation items for the rail */
852
+ navItems: NavItem[];
853
+ /** Nav item IDs that act as panel mode switchers (others are direct links) */
854
+ modeItems?: string[];
855
+ /** Panel content per mode */
856
+ panels?: PanelConfig[];
857
+ activeNavId?: string;
858
+ user?: DashboardUser | null;
859
+ isLoading?: boolean;
860
+ onLogout?: () => void;
861
+ onSettingsClick?: () => void;
862
+ settingsHref?: string;
863
+ onNewSandbox?: () => void;
864
+ className?: string;
865
+ sidebarClassName?: string;
866
+ contentClassName?: string;
867
+ topNavLinks?: TopNavLink[];
868
+ activeTopNavHref?: string;
869
+ /** Arbitrary content rendered at the leading (left) edge of the top bar —
870
+ * e.g. a workspace/team switcher — so consumers don't need a second bar. */
871
+ topBarLeading?: React$1.ReactNode;
872
+ LinkComponent?: React$1.ComponentType<any>;
873
+ /**
874
+ * Where the in-app logo links. Defaults to "/" (backward compatible);
875
+ * pass an in-app path (e.g. "/dashboard") so the logo never bounces an
876
+ * authenticated user back out to the public marketing homepage.
877
+ */
878
+ logoHref?: string;
879
+ /**
880
+ * @deprecated No longer wired. The redesigned {@link RailHeader} renders the
881
+ * brand mark plus a dedicated panel-toggle button; the logo is no longer the
882
+ * collapse control. Kept for back-compat; has no effect.
883
+ */
884
+ onLogoClick?: () => void;
885
+ /**
886
+ * @deprecated No longer wired (see {@link onLogoClick}). Has no effect.
887
+ */
888
+ logoAriaLabel?: string;
889
+ /**
890
+ * Let the icon rail expand to a labeled rail. When true, the rail logo
891
+ * toggles between icon-only and labeled instead of navigating.
892
+ */
893
+ labeledRail?: boolean;
894
+ /**
895
+ * Initial rail-collapsed state when `labeledRail` is set and the rail is
896
+ * uncontrolled. Defaults to expanded (`false`). Pass `true` to start on the
897
+ * compact icon rail — the user's choice then persists to localStorage.
898
+ */
899
+ defaultRailCollapsed?: boolean;
900
+ footer?: React$1.ReactNode;
901
+ defaultPanelOpen?: boolean;
902
+ defaultMode?: string;
903
+ /** Extra content in the rail footer (above profile avatar) */
904
+ railFooter?: React$1.ReactNode;
905
+ /** Extra dropdown items in the profile menu */
906
+ profileMenuItems?: React$1.ReactNode;
907
+ /**
908
+ * When provided, the profile menu shows an Appearance section
909
+ * (Light/Dark/System) driven by this host-supplied controller. Replaces the
910
+ * old standalone rail theme toggle.
911
+ */
912
+ appearance?: AppearanceController;
913
+ /** Notification data for the bell dropdown */
914
+ notifications?: {
915
+ items: {
916
+ id: string;
917
+ title: string;
918
+ message: string;
919
+ read: boolean;
920
+ createdAt: string;
921
+ }[];
922
+ unreadCount: number;
923
+ onMarkRead?: (id: string) => void;
924
+ onMarkAllRead?: () => void;
925
+ };
926
+ }
927
+ declare function DashboardLayout({ defaultPanelOpen, defaultMode, labeledRail, defaultRailCollapsed, ...props }: DashboardLayoutProps): React$1.JSX.Element;
928
+ //#endregion
929
+ //#region src/dashboard/sidebar-layout.d.ts
930
+ /** A sub-destination revealed inside a nav item's right-flyout. */
931
+ interface SidebarLayoutFlyoutItem {
932
+ id: string;
933
+ label: string;
934
+ icon: React$1.ComponentType<{
935
+ className?: string;
936
+ }>;
937
+ href: string;
938
+ prefetch?: "none" | "intent" | "render" | "viewport";
939
+ }
940
+ interface SidebarLayoutNavItem {
941
+ id: string;
942
+ label: string;
943
+ icon: React$1.ComponentType<{
944
+ className?: string;
945
+ }>;
946
+ /** Destination for link items. Omit when `togglesPanel` or `flyoutItems` is set. */
947
+ href?: string;
948
+ /** Render this item as the panel toggle instead of a link. */
949
+ togglesPanel?: boolean;
950
+ /**
951
+ * Render this item as a right-flyout "door" fronting these sub-destinations
952
+ * instead of a link. The flyout opens to the right of the rail item. Takes
953
+ * precedence over `href`/`togglesPanel`.
954
+ */
955
+ flyoutItems?: SidebarLayoutFlyoutItem[];
956
+ /** Ids of `flyoutItems` whose route is currently active (drives the door highlight). */
957
+ flyoutActiveIds?: string[];
958
+ /**
959
+ * Give the item an emphasized "primary" pill so it stands out (e.g. a "New"
960
+ * action). Ignored for `togglesPanel`/`flyoutItems`/`expandable` items.
961
+ */
962
+ variant?: "normal" | "primary";
963
+ /**
964
+ * Render as an expandable item: an inline accordion on the labeled rail, a
965
+ * hover flyout on the icon-only rail. `href` (if set) navigates; the
966
+ * disclosure reveals `subItems` (fixed) or `loadSubItems()` (lazy). Takes
967
+ * precedence over `href`/`togglesPanel`/`flyoutItems`.
968
+ */
969
+ expandable?: boolean;
970
+ /** Fixed sub-items for an `expandable` item (icon optional). */
971
+ subItems?: RailExpandableSubItem[];
972
+ /** Lazy sub-items for an `expandable` item — loaded once on first open. */
973
+ loadSubItems?: () => Promise<RailExpandableSubItem[]>;
974
+ /** Ids of an `expandable` item's sub-items whose route is active. */
975
+ subActiveIds?: string[];
976
+ /** Empty-state text for an `expandable` item that resolves to no sub-items. */
977
+ emptyLabel?: string;
978
+ /** Start an `expandable` item expanded on mount (labeled rail). */
979
+ defaultOpen?: boolean;
980
+ badge?: number;
981
+ /**
982
+ * React Router prefetch behavior for this link, forwarded to the underlying
983
+ * `<Link prefetch>`. Omit to preserve the router's default (no prefetch).
984
+ * Ignored for panel-toggle items and for `LinkComponent`s that don't support it.
985
+ */
986
+ prefetch?: "none" | "intent" | "render" | "viewport";
987
+ }
988
+ interface SidebarLayoutProps {
989
+ children: React$1.ReactNode;
990
+ /** Rail navigation, in display order. Each item is a link or the panel toggle. */
991
+ navItems: SidebarLayoutNavItem[];
992
+ /** Id of the active link item (drives the highlighted state). */
993
+ activeId?: string;
994
+ /** Content rendered inside the slide-out panel (e.g. a SessionSidebar). */
995
+ panel?: React$1.ReactNode;
996
+ /** Logo element rendered in the rail header. */
997
+ logo?: React$1.ReactNode;
998
+ /** Destination for the logo link. */
999
+ logoHref?: string;
1000
+ /**
1001
+ * Content rendered in the rail header in place of the logo link — e.g. a
1002
+ * project/workspace switcher. Spans the header so the app's primary
1003
+ * orientation control sits at the top of the rail. When set, `logo`/`logoHref`
1004
+ * are ignored. The header keeps its `h-14` height for cross-view alignment.
1005
+ */
1006
+ railHeaderContent?: React$1.ReactNode;
1007
+ user?: SidebarUser | null;
1008
+ isLoading?: boolean;
1009
+ onLogout?: () => void;
1010
+ onSettingsClick?: () => void;
1011
+ settingsHref?: string;
1012
+ /** Extra items rendered before settings/logout in the profile menu. */
1013
+ profileMenuItems?: React$1.ReactNode;
1014
+ /**
1015
+ * When provided, the profile menu shows an Appearance section
1016
+ * (Light/Dark/System) driven by this host-supplied controller. The host wires
1017
+ * it to its own theme engine. Replaces the old standalone rail theme toggle.
1018
+ */
1019
+ appearance?: AppearanceController;
1020
+ /**
1021
+ * @deprecated No-op. The standalone rail theme toggle was replaced by the
1022
+ * account-menu `appearance` control. Accepted (and ignored) for backward
1023
+ * compatibility; will be removed in a future major.
1024
+ */
1025
+ showThemeToggle?: boolean;
1026
+ /**
1027
+ * @deprecated No-op. The collapse/expand control now always lives in the
1028
+ * header (`RailHeader`). Accepted (and ignored) for backward compatibility;
1029
+ * will be removed in a future major.
1030
+ */
1031
+ railCollapseToggle?: "header" | "footer";
1032
+ /** Extra content in the rail footer, above the profile avatar. */
1033
+ railFooter?: React$1.ReactNode;
1034
+ LinkComponent?: React$1.ComponentType<any>;
1035
+ /**
1036
+ * Controlled panel-open state. Provide it (seeded from a server-readable
1037
+ * source such as a cookie) in SSR apps so the panel survives reload without a
1038
+ * hydration mismatch. Omit to let the panel persist to localStorage.
1039
+ */
1040
+ panelOpen?: boolean;
1041
+ onPanelOpenChange?: (open: boolean) => void;
1042
+ defaultPanelOpen?: boolean;
1043
+ /** Hide the whole sidebar below this breakpoint (content spans full width). */
1044
+ hideBelow?: "md" | "lg";
1045
+ /**
1046
+ * Make the rail label-capable: it renders labels beside the icons on a wider
1047
+ * rail and gains a collapse/expand control that toggles between the labeled
1048
+ * width and the icon-only rail (icons + hover tooltips). When omitted the rail
1049
+ * is permanently icon-only with no collapse control.
1050
+ */
1051
+ railLabels?: boolean;
1052
+ /**
1053
+ * Controlled rail-collapsed state. Provide it (seeded from a server-readable
1054
+ * source such as a cookie) in SSR apps so the collapsed/expanded rail survives
1055
+ * reload without a hydration mismatch. Omit to let the rail persist to
1056
+ * localStorage. Independent of `panelOpen` — the nav rail and the slide-out
1057
+ * panel collapse separately. Only meaningful with `railLabels`.
1058
+ */
1059
+ railCollapsed?: boolean;
1060
+ onRailCollapsedChange?: (collapsed: boolean) => void;
1061
+ /** Initial rail-collapsed state when uncontrolled (default: expanded). */
1062
+ defaultRailCollapsed?: boolean;
1063
+ /**
1064
+ * Close the panel when a link nav item is clicked. Useful when the panel is
1065
+ * contextual to one section (e.g. a chat thread list) rather than a global
1066
+ * dock. Selecting items inside the panel itself does not trigger this.
1067
+ */
1068
+ closePanelOnNavigate?: boolean;
1069
+ className?: string;
1070
+ sidebarClassName?: string;
1071
+ /** Class for the `<main>` content region (e.g. `flex h-screen ... overflow-hidden`). */
1072
+ contentClassName?: string;
1073
+ }
1074
+ /**
1075
+ * App shell built on the sidebar rail + slide-out panel, without a top nav bar.
1076
+ * Apps supply nav items, an optional panel, and profile/branding props; the
1077
+ * standard look, panel docking, content-margin coordination, and responsive
1078
+ * hide all live here. Pair `panelOpen`/`onPanelOpenChange` with a cookie for
1079
+ * SSR-safe persistence.
1080
+ */
1081
+ declare function SidebarLayout({ panelOpen, onPanelOpenChange, defaultPanelOpen, railCollapsed, onRailCollapsedChange, defaultRailCollapsed, ...props }: SidebarLayoutProps): React$1.JSX.Element;
1082
+ //#endregion
1083
+ //#region src/dashboard/profile-selector.d.ts
1084
+ interface Profile {
1085
+ id: string;
1086
+ name: string;
1087
+ description?: string;
1088
+ is_builtin?: boolean;
1089
+ extends?: string;
1090
+ model?: string;
1091
+ metrics?: {
1092
+ total_runs: number;
1093
+ success_rate: number;
1094
+ avg_duration_ms: number;
1095
+ };
1096
+ }
1097
+ interface ProfileSelectorProps {
1098
+ profiles: Profile[];
1099
+ selectedId?: string | null;
1100
+ onSelect: (profile: Profile | null) => void;
1101
+ onCreateClick?: () => void;
1102
+ onManageClick?: () => void;
1103
+ label?: string;
1104
+ placeholder?: string;
1105
+ showMetrics?: boolean;
1106
+ className?: string;
1107
+ }
1108
+ declare function ProfileSelector({ profiles, selectedId, onSelect, onCreateClick, onManageClick, label, placeholder, showMetrics, className }: ProfileSelectorProps): import("react").JSX.Element;
1109
+ /**
1110
+ * Profile performance comparison card.
1111
+ * Shows metrics from multiple profiles side by side.
1112
+ */
1113
+ interface ProfileComparisonProps {
1114
+ profiles: Profile[];
1115
+ className?: string;
1116
+ }
1117
+ declare function ProfileComparison({ profiles, className }: ProfileComparisonProps): import("react").JSX.Element | null;
1118
+ //#endregion
1119
+ //#region src/dashboard/metric-area-chart.d.ts
1120
+ interface MetricChartPoint {
1121
+ /** Wall-clock ms. */
1122
+ at: number;
1123
+ /** Null renders a gap in the series, never a zero. */
1124
+ value: number | null;
1125
+ }
1126
+ type MetricChartTone = "primary" | "success" | "warning" | "danger";
1127
+ interface MetricAreaChartProps {
1128
+ points: MetricChartPoint[];
1129
+ label: string;
1130
+ /** Formats the current value and y-axis bounds (e.g. percent, bytes). */
1131
+ formatValue: (value: number) => string;
1132
+ /**
1133
+ * Fixed y-axis maximum (100 for percents, memory total for bytes).
1134
+ * Omitted = auto-scale to the observed maximum with 10% headroom.
1135
+ */
1136
+ maxValue?: number;
1137
+ /** Secondary line under the current value (e.g. "of 8 GiB"). */
1138
+ detail?: React$1.ReactNode;
1139
+ tone?: MetricChartTone;
1140
+ /** Plot height in px. Defaults to 96. */
1141
+ height?: number;
1142
+ /** Shown instead of the plot while no point has a value yet. */
1143
+ emptyState?: React$1.ReactNode;
1144
+ className?: string;
1145
+ }
1146
+ /**
1147
+ * Lightweight live time-series panel (Prometheus/Grafana idiom): big
1148
+ * current value, area chart of the rolling window, dashed gridlines.
1149
+ * Pure SVG — no chart dependency. Null samples render as gaps.
1150
+ */
1151
+ declare function MetricAreaChart({ points, label, formatValue, maxValue, detail, tone, height, emptyState, className }: MetricAreaChartProps): React$1.JSX.Element;
1152
+ //#endregion
1153
+ //#region src/dashboard/variant-list.d.ts
1154
+ type VariantStatus = "pending" | "running" | "completed" | "failed" | "cancelled";
1155
+ type VariantOutcome = "pending_review" | "accepted" | "rejected" | "merged_with_conflicts" | "expired";
1156
+ interface Variant {
1157
+ id: string;
1158
+ label: string;
1159
+ sublabel?: string;
1160
+ status: VariantStatus;
1161
+ outcome?: VariantOutcome;
1162
+ durationMs?: number;
1163
+ error?: string;
1164
+ summary?: string;
1165
+ /** Link to view variant details (e.g., chat UI) */
1166
+ detailsUrl?: string;
1167
+ }
1168
+ interface VariantListProps {
1169
+ variants: Variant[];
1170
+ selectedId?: string | null;
1171
+ onSelect?: (id: string) => void;
1172
+ onAccept?: (id: string) => void;
1173
+ onReject?: (id: string) => void;
1174
+ isActioning?: string | null;
1175
+ className?: string;
1176
+ }
1177
+ declare function VariantList({ variants, selectedId, onSelect, onAccept, onReject, isActioning, className }: VariantListProps): import("react").JSX.Element;
1178
+ //#endregion
1179
+ //#region src/dashboard/system-logs.d.ts
1180
+ interface SystemLogsViewerProps {
1181
+ apiUrl: string;
1182
+ token: string;
1183
+ className?: string;
1184
+ }
1185
+ declare function SystemLogsViewer({ apiUrl, token, className }: SystemLogsViewerProps): React.JSX.Element;
1186
+ //#endregion
1187
+ //#region src/dashboard/usage-summary.d.ts
1188
+ interface UsageSummaryData {
1189
+ computeHours: number;
1190
+ activeSessions: number;
1191
+ messagesSent: number;
1192
+ estimatedCost: number;
1193
+ }
1194
+ interface UsageSummaryProps {
1195
+ data: UsageSummaryData | null;
1196
+ loading?: boolean;
1197
+ className?: string;
1198
+ }
1199
+ declare function UsageSummary({ data, loading, className }: UsageSummaryProps): React$1.JSX.Element;
1200
+ //#endregion
1201
+ //#region src/dashboard/git-panel.d.ts
1202
+ interface GitStatusData {
1203
+ branch: string;
1204
+ isDirty: boolean;
1205
+ ahead: number;
1206
+ behind: number;
1207
+ staged: string[];
1208
+ modified: string[];
1209
+ untracked: string[];
1210
+ }
1211
+ interface GitCommitData {
1212
+ shortSha: string;
1213
+ message: string;
1214
+ author: string;
1215
+ date: string;
1216
+ }
1217
+ interface GitPanelProps {
1218
+ status: GitStatusData | null;
1219
+ log: GitCommitData[];
1220
+ loading?: boolean;
1221
+ onRefresh?: () => void;
1222
+ className?: string;
1223
+ }
1224
+ declare function GitPanel({ status, log, loading, onRefresh, className }: GitPanelProps): React$1.JSX.Element;
1225
+ //#endregion
1226
+ //#region src/dashboard/ports-list.d.ts
1227
+ interface ExposedPort {
1228
+ port: number;
1229
+ url: string;
1230
+ status: "active" | "pending";
1231
+ }
1232
+ interface PortsListProps {
1233
+ ports: ExposedPort[];
1234
+ onExposePort: (port: number) => void;
1235
+ onRemovePort?: (port: number) => void;
1236
+ isExposing?: boolean;
1237
+ className?: string;
1238
+ }
1239
+ declare function PortsList({ ports, onExposePort, onRemovePort, isExposing, className }: PortsListProps): React$1.JSX.Element;
1240
+ //#endregion
1241
+ //#region src/dashboard/process-list.d.ts
1242
+ interface ProcessInfo {
1243
+ pid: number;
1244
+ command: string;
1245
+ running: boolean;
1246
+ exitCode?: number;
1247
+ startedAt?: string;
1248
+ cwd?: string;
1249
+ }
1250
+ interface ProcessListProps {
1251
+ processes: ProcessInfo[];
1252
+ onSpawn: (command: string) => void;
1253
+ onKill: (pid: number) => void;
1254
+ loading?: boolean;
1255
+ className?: string;
1256
+ }
1257
+ declare function ProcessList({ processes, onSpawn, onKill, loading, className }: ProcessListProps): React$1.JSX.Element;
1258
+ //#endregion
1259
+ //#region src/dashboard/network-config.d.ts
1260
+ interface NetworkConfigData {
1261
+ blockOutbound: boolean;
1262
+ allowList: string[];
1263
+ }
1264
+ interface NetworkConfigProps {
1265
+ config: NetworkConfigData | null;
1266
+ onUpdate: (config: Partial<NetworkConfigData>) => void;
1267
+ loading?: boolean;
1268
+ className?: string;
1269
+ }
1270
+ declare function NetworkConfig({ config, onUpdate, loading, className }: NetworkConfigProps): React$1.JSX.Element;
1271
+ //#endregion
1272
+ //#region src/dashboard/backend-config.d.ts
1273
+ interface BackendStatusData {
1274
+ running: boolean;
1275
+ model?: string;
1276
+ provider?: string;
1277
+ uptime?: number;
1278
+ }
1279
+ interface McpServer {
1280
+ name: string;
1281
+ command: string;
1282
+ args?: string[];
1283
+ status?: "running" | "stopped" | "error";
1284
+ }
1285
+ interface BackendConfigProps {
1286
+ status: BackendStatusData | null;
1287
+ mcpServers: McpServer[];
1288
+ onAddMcp: (server: {
1289
+ name: string;
1290
+ command: string;
1291
+ args?: string[];
1292
+ }) => void;
1293
+ onRemoveMcp: (name: string) => void;
1294
+ /** Render a restart action only when the host has a real restart operation. */
1295
+ onRestart?: () => void;
1296
+ loading?: boolean;
1297
+ className?: string;
1298
+ }
1299
+ declare function BackendConfig({ status, mcpServers, onAddMcp, onRemoveMcp, onRestart, loading, className }: BackendConfigProps): React$1.JSX.Element;
1300
+ //#endregion
1301
+ //#region src/dashboard/snapshot-list.d.ts
1302
+ interface SnapshotInfo {
1303
+ id: string;
1304
+ createdAt: string;
1305
+ sizeBytes?: number;
1306
+ tags?: string[];
1307
+ }
1308
+ interface SnapshotListProps {
1309
+ snapshots: SnapshotInfo[];
1310
+ onCreate: (tags?: string[]) => void;
1311
+ onRestore: (snapshotId: string) => void;
1312
+ onSaveAsTemplate?: (snapshotId: string) => void;
1313
+ loading?: boolean;
1314
+ className?: string;
1315
+ }
1316
+ declare function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loading, className }: SnapshotListProps): React$1.JSX.Element;
1317
+ //#endregion
1318
+ //#region src/dashboard/promo-banner.d.ts
1319
+ interface PromoBannerProps {
1320
+ title: string;
1321
+ description: string;
1322
+ buttonLabel: string;
1323
+ href?: string;
1324
+ onClick?: () => void;
1325
+ icon?: React$1.ReactNode;
1326
+ disabled?: boolean;
1327
+ className?: string;
1328
+ }
1329
+ declare function PromoBanner({ title, description, buttonLabel, href, onClick, icon, disabled, className }: PromoBannerProps): React$1.JSX.Element;
1330
+ //#endregion
1331
+ //#region src/dashboard/info-panel.d.ts
1332
+ interface InfoPanelProps {
1333
+ label: string;
1334
+ title: string;
1335
+ description: string;
1336
+ className?: string;
1337
+ }
1338
+ declare function InfoPanel({ label, title, description, className }: InfoPanelProps): React$1.JSX.Element;
1339
+ //#endregion
1340
+ export { HARNESS_BRAND as $, useSidebar as $t, Variant as A, SidebarProps as An, ActivityItem as At, ProfileComparison as B, ThemeMode as Bn, InsufficientBalance as Bt, GitPanelProps as C, SidebarContentProps as Cn, SandboxCardData as Ct, UsageSummaryProps as D, SidebarPanelHeader as Dn, canAdminSandbox as Dt, UsageSummaryData as E, SidebarPanelContentProps as En, TeamRole as Et, MetricAreaChart as F, SidebarRailHeaderProps as Fn, ResourceMeterProps as Ft, SidebarLayoutFlyoutItem as G, CreditBalanceProps as Gt, ProfileSelector as H, OutOfCreditsModalProps as Ht, MetricAreaChartProps as I, SidebarRailNav as In, ClusterStatusBar as It, DashboardLayout as J, SIDEBAR_RAIL_LABELED_WIDTH as Jt, SidebarLayoutNavItem as K, SIDEBAR_MOBILE_WIDTH as Kt, MetricChartPoint as L, SidebarRailNavProps as Ln, ClusterStatusBarProps as Lt, VariantListProps as M, SidebarRailFooter as Mn, ResourceSnapshotItem as Mt, VariantOutcome as N, SidebarRailFooterProps as Nn, ResourceSnapshotProps as Nt, SystemLogsViewer as O, SidebarPanelHeaderProps as On, ActivityFeed as Ot, VariantStatus as P, SidebarRailHeader as Pn, ResourceMeter as Pt, ProductVariant as Q, SidebarProviderProps as Qt, MetricChartTone as R, SidebarRailProps as Rn, ClusterStatusItem as Rt, GitPanel as S, SidebarContent as Sn, SandboxCard as St, UsageSummary as T, SidebarPanelContent as Tn, SandboxStatus as Tt, ProfileSelectorProps as U, parseInsufficientBalance as Ut, ProfileComparisonProps as V, OutOfCreditsModal as Vt, SidebarLayout as W, CreditBalance as Wt, DashboardUser as X, SIDEBAR_TOTAL_WIDTH as Xt, DashboardLayoutProps as Y, SIDEBAR_RAIL_WIDTH as Yt, NavItem as Z, SidebarProvider as Zt, ProcessListProps as _, RailModeButtonProps as _n, InvoiceTableProps as _t, SnapshotInfo as a, RailButton as an, HarnessPickerProps as at, PortsListProps as b, RailThemeToggle as bn, NewSandboxCard as bt, BackendConfig as c, RailCollapseToggleProps as cn, Backend as ct, McpServer as d, RailExpandableSubItem as dn, PlanCardData as dt, RailTooltip as en, HarnessBrand as et, NetworkConfig as f, RailFlyout as fn, PlanCards as ft, ProcessList as g, RailModeButton as gn, InvoiceTable as gt, ProcessInfo as h, RailHeaderProps as hn, Invoice as ht, PromoBannerProps as i, ProfileAvatarProps as in, HarnessPicker as it, VariantList as j, SidebarRail as jn, ResourceSnapshot as jt, SystemLogsViewerProps as k, SidebarPanelProps as kn, ActivityFeedProps as kt, BackendConfigProps as l, RailExpandable as ln, BackendSelector as lt, NetworkConfigProps as m, RailHeader as mn, PlanFeature as mt, InfoPanelProps as n, AppearanceController as nn, HarnessLogoProps as nt, SnapshotList as o, RailButtonProps as on, HarnessType$1 as ot, NetworkConfigData as p, RailFlyoutProps as pn, PlanCardsProps as pt, SidebarLayoutProps as q, SIDEBAR_PANEL_WIDTH as qt, PromoBanner as r, ProfileAvatar as rn, HARNESS_OPTIONS as rt, SnapshotListProps as s, RailCollapseToggle as sn, chatCapableHarnesses as st, InfoPanel as t, RailTooltipProps as tn, HarnessLogo as tt, BackendStatusData as u, RailExpandableProps as un, BackendSelectorProps as ut, ExposedPort as v, RailSeparator as vn, SandboxTable as vt, GitStatusData as w, SidebarPanel as wn, SandboxCardProps as wt, GitCommitData as x, Sidebar as xn, NewSandboxCardProps as xt, PortsList as y, RailSeparatorProps as yn, SandboxTableProps as yt, Profile as z, SidebarUser as zn, INSUFFICIENT_BALANCE_CODE as zt };