@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.
- package/dist/WorkflowGraph-B-NsdYz_.js +1961 -0
- package/dist/assets.d.ts +214 -206
- package/dist/assets.js +1057 -908
- package/dist/auth-CWe17Hly.js +37 -0
- package/dist/auth.d.ts +2 -30
- package/dist/auth.js +2 -15
- package/dist/chat-BOvFAe6p.js +903 -0
- package/dist/chat.d.ts +2 -230
- package/dist/chat.js +2 -34
- package/dist/connectors.d.ts +52 -49
- package/dist/connectors.js +595 -643
- package/dist/dashboard-CZ3VgNPR.js +4969 -0
- package/dist/dashboard.d.ts +4 -1297
- package/dist/dashboard.js +4 -152
- package/dist/editor.d.ts +2 -1
- package/dist/editor.js +2 -31
- package/dist/files.d.ts +2 -6
- package/dist/files.js +2 -33
- package/dist/globals.css +63 -3
- package/dist/hooks.d.ts +146 -148
- package/dist/hooks.js +222 -55
- package/dist/index-CKRaj1pM.d.ts +776 -0
- package/dist/index-CXX5IpH2.d.ts +2 -0
- package/dist/index-DPePq7c8.d.ts +1340 -0
- package/dist/index-DiyLLZuJ.d.ts +230 -0
- package/dist/index-DvmZLMT1.d.ts +30 -0
- package/dist/index-I8ZLVtHd.d.ts +330 -0
- package/dist/index-PRM636Ex.d.ts +86 -0
- package/dist/index.d.ts +21 -33
- package/dist/index.js +21 -701
- package/dist/info-panel-C9cqDzOL.js +594 -0
- package/dist/integrations.d.ts +133 -141
- package/dist/integrations.js +491 -673
- package/dist/markdown.d.ts +2 -1
- package/dist/markdown.js +2 -13
- package/dist/model-I-NIxeM-.js +1250 -0
- package/dist/model-brand-B9A4H9pJ.d.ts +98 -0
- package/dist/model-brand-hMyDTUqB.js +624 -0
- package/dist/motion-DkyBRJb9.js +37 -0
- package/dist/openui.d.ts +2 -1
- package/dist/openui.js +2 -7
- package/dist/pages.d.ts +307 -300
- package/dist/pages.js +4404 -4181
- package/dist/primitives-Dh1vG6J3.js +113 -0
- package/dist/primitives.d.ts +2 -74
- package/dist/primitives.js +2 -204
- package/dist/provider-logo-DjqmConF.js +311 -0
- package/dist/run.d.ts +2 -1
- package/dist/run.js +2 -23
- package/dist/sdk-hooks.d.ts +3 -4
- package/dist/sdk-hooks.js +3 -31
- package/dist/sidecar-DgH_vQ6m.d.ts +9 -0
- package/dist/stores.d.ts +14 -15
- package/dist/stores.js +13 -81
- package/dist/styles.css +63 -3
- package/dist/template-card-L-4gmjx2.d.ts +90 -0
- package/dist/terminal-CN9ZgHRt.js +197 -0
- package/dist/terminal.d.ts +60 -60
- package/dist/terminal.js +2 -10
- package/dist/tokens.css +51 -0
- package/dist/types.d.ts +4 -11
- package/dist/types.js +0 -1
- package/dist/use-pty-session-C8cE0adT.js +669 -0
- package/dist/use-sidecar-auth-CCTJcrq7.d.ts +145 -0
- package/dist/use-sidecar-auth-DkdcufOz.js +742 -0
- package/dist/utils-DzWbktWG.js +2 -0
- package/dist/utils.d.ts +2 -1
- package/dist/utils.js +2 -37
- package/dist/workbench-BCaCKl-J.js +8347 -0
- package/dist/workbench.d.ts +2 -310
- package/dist/workbench.js +2 -44
- package/dist/workflows.d.ts +341 -339
- package/dist/workflows.js +74 -109
- package/dist/workspace-B6AtI6ld.js +2510 -0
- package/dist/workspace.d.ts +2 -761
- package/dist/workspace.js +2 -51
- package/package.json +46 -40
- package/dist/WorkflowGraph-2QOORYIR.js +0 -1722
- package/dist/chunk-2BUPSB7O.js +0 -0
- package/dist/chunk-3KBNPQQF.js +0 -2697
- package/dist/chunk-3LIXVEEE.js +0 -279
- package/dist/chunk-72UF2H5H.js +0 -707
- package/dist/chunk-AI25G5MX.js +0 -944
- package/dist/chunk-ANSC5AFC.js +0 -314
- package/dist/chunk-AZ3AWMTM.js +0 -8
- package/dist/chunk-BGVEHENC.js +0 -10
- package/dist/chunk-CZ7CSFO4.js +0 -39
- package/dist/chunk-DYXXYGS4.js +0 -4700
- package/dist/chunk-EI44GEQ5.js +0 -6
- package/dist/chunk-IACRDXER.js +0 -219
- package/dist/chunk-IOB2PW5Z.js +0 -55
- package/dist/chunk-M4K7ZGR2.js +0 -24
- package/dist/chunk-MYZAW4RX.js +0 -665
- package/dist/chunk-OMUIPJQZ.js +0 -555
- package/dist/chunk-RQZRXKMR.js +0 -398
- package/dist/chunk-SOKKTB7W.js +0 -230
- package/dist/chunk-TADGS4Q7.js +0 -1010
- package/dist/chunk-UCQNOUN3.js +0 -7964
- package/dist/chunk-ULPLRBMF.js +0 -34
- package/dist/chunk-WID73FPH.js +0 -89
- package/dist/chunk-X3YXP7FG.js +0 -38
- package/dist/logo-DiAjq759.d.ts +0 -15
- package/dist/model-brand-BNnaUKKZ.d.ts +0 -99
- package/dist/ports-list-CDIvTNnX.d.ts +0 -17
- package/dist/sdk-hooks-Djkjq4cp.d.ts +0 -145
- 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 };
|