@tangle-network/sandbox-ui 7.0.1 → 7.0.3

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.
@@ -9,7 +9,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
9
  import * as React$1 from "react";
10
10
  import { useEffect, useId, useRef, useState } from "react";
11
11
  import { createPortal } from "react-dom";
12
- import { Activity, ArrowRight, BarChart2, Bell, Bot, Box, Camera, Check, ChevronDown, ChevronLeft, ChevronRight, Clock, Code2, Copy, Cpu, DollarSign, ExternalLink, File, FileEdit, FilePlus, GitBranch, GitCommit, Globe, HardDrive, Key, Layers, MemoryStick, MessageSquare, Monitor, MoreHorizontal, MoreVertical, Network, PanelLeft, Play, Plug, Plus, Power, PowerOff, RotateCcw, Skull, Terminal, Trash2, User, Users } from "lucide-react";
12
+ import { Activity, ArrowRight, BarChart2, Bell, Bot, Box, Camera, Check, ChevronDown, ChevronLeft, ChevronRight, Clock, Code2, Copy, Cpu, DollarSign, ExternalLink, File, FileEdit, FilePlus, GitBranch, GitCommit, Globe, HardDrive, Key, Layers, LogOut, MemoryStick, MessageSquare, Monitor, Moon, MoreHorizontal, MoreVertical, Network, PanelLeft, Play, Plug, Plus, Power, PowerOff, RotateCcw, Settings, Skull, Sun, Terminal, Trash2, User, Users } from "lucide-react";
13
13
  import { focusField, focusRing, focusRingInset, timeAgo } from "@tangle-network/ui/utils";
14
14
  import * as Select$1 from "@radix-ui/react-select";
15
15
  // src/dashboard/sidebar-context.tsx
@@ -242,117 +242,6 @@ function getInitials(name, email) {
242
242
  if (email) return email[0].toUpperCase();
243
243
  return "?";
244
244
  }
245
- function SettingsIcon({ className }) {
246
- return /* @__PURE__ */ jsxs("svg", {
247
- xmlns: "http://www.w3.org/2000/svg",
248
- viewBox: "0 0 24 24",
249
- fill: "none",
250
- stroke: "currentColor",
251
- strokeWidth: "2",
252
- strokeLinecap: "round",
253
- strokeLinejoin: "round",
254
- className,
255
- children: [
256
- /* @__PURE__ */ jsx("title", { children: "Settings icon" }),
257
- /* @__PURE__ */ jsx("path", { d: "M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z" }),
258
- /* @__PURE__ */ jsx("circle", {
259
- cx: "12",
260
- cy: "12",
261
- r: "3"
262
- })
263
- ]
264
- });
265
- }
266
- function LogOutIcon({ className }) {
267
- return /* @__PURE__ */ jsxs("svg", {
268
- xmlns: "http://www.w3.org/2000/svg",
269
- viewBox: "0 0 24 24",
270
- fill: "none",
271
- stroke: "currentColor",
272
- strokeWidth: "2",
273
- strokeLinecap: "round",
274
- strokeLinejoin: "round",
275
- className,
276
- children: [
277
- /* @__PURE__ */ jsx("title", { children: "Log out icon" }),
278
- /* @__PURE__ */ jsx("path", { d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" }),
279
- /* @__PURE__ */ jsx("polyline", { points: "16,17 21,12 16,7" }),
280
- /* @__PURE__ */ jsx("line", {
281
- x1: "21",
282
- x2: "9",
283
- y1: "12",
284
- y2: "12"
285
- })
286
- ]
287
- });
288
- }
289
- function SunIcon({ className }) {
290
- return /* @__PURE__ */ jsxs("svg", {
291
- xmlns: "http://www.w3.org/2000/svg",
292
- viewBox: "0 0 24 24",
293
- fill: "none",
294
- stroke: "currentColor",
295
- strokeWidth: "2",
296
- strokeLinecap: "round",
297
- strokeLinejoin: "round",
298
- className,
299
- children: [
300
- /* @__PURE__ */ jsx("title", { children: "Light mode icon" }),
301
- /* @__PURE__ */ jsx("circle", {
302
- cx: "12",
303
- cy: "12",
304
- r: "4"
305
- }),
306
- /* @__PURE__ */ jsx("path", { d: "M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41" })
307
- ]
308
- });
309
- }
310
- function MoonIcon({ className }) {
311
- return /* @__PURE__ */ jsxs("svg", {
312
- xmlns: "http://www.w3.org/2000/svg",
313
- viewBox: "0 0 24 24",
314
- fill: "none",
315
- stroke: "currentColor",
316
- strokeWidth: "2",
317
- strokeLinecap: "round",
318
- strokeLinejoin: "round",
319
- className,
320
- children: [/* @__PURE__ */ jsx("title", { children: "Dark mode icon" }), /* @__PURE__ */ jsx("path", { d: "M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z" })]
321
- });
322
- }
323
- function PanelToggleButton({ collapsed, onToggle, className }) {
324
- const label = collapsed ? "Expand sidebar" : "Collapse sidebar";
325
- return /* @__PURE__ */ jsx("button", {
326
- type: "button",
327
- onClick: onToggle,
328
- "aria-label": label,
329
- "aria-pressed": collapsed,
330
- title: label,
331
- className: cn$1("flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors", MOTION_CONTROL, "hover:bg-[var(--accent-surface-soft)] hover:text-foreground", focusRing, className),
332
- children: /* @__PURE__ */ jsx(PanelLeft, { className: "h-[18px] w-[18px] shrink-0" })
333
- });
334
- }
335
- /**
336
- * The redesigned rail header. Expanded: brand (left) · optional middle · panel
337
- * toggle (right). Collapsed: only the brand mark, which morphs into the
338
- * expand button on hover (brand fades out, panel glyph fades in over the same
339
- * box) so the collapse affordance is discoverable without spending rail width.
340
- * With no `brand` but `children`, the collapsed rail falls back to `children` —
341
- * the consumer's header content is then the only mark it has.
342
- * Renders a bordered `ShellHeader` row, so its divider is the line every main-pane
343
- * header meets — drop it in at the top of {@link SidebarRail}.
344
- */
345
- /**
346
- * React renders nothing for `null`, `undefined`, booleans, empty (or
347
- * all-empty) arrays and fragments whose children are all of those, so a
348
- * caller's `logo={cond && <Logo />}`, `logo={maybeLogo}`, `logo={items.map(...)}`
349
- * or `logo={<>{cond && <Logo />}</>}` can arrive here as a node that paints
350
- * nothing. Those must count as "no brand": a strict `undefined` check would
351
- * drop `railHeaderContent` from the collapsed rail for exactly them.
352
- * `Children.toArray` applies React's own rule (drops the empties, flattens
353
- * nested arrays) but keeps a fragment as one opaque child, so fragments are
354
- * recursed into by hand to stay aligned with what actually renders.
355
- */
356
245
  function isRenderable(node) {
357
246
  return React$1.Children.toArray(node).some((child) => React$1.isValidElement(child) && child.type === React$1.Fragment ? isRenderable(child.props.children) : true);
358
247
  }
@@ -360,6 +249,8 @@ function RailHeader({ brand, brandHref, children, collapsed, onToggle, collapsib
360
249
  const Link = LinkComponent ?? DefaultLink$2;
361
250
  const hasBrand = isRenderable(brand);
362
251
  const hasChildren = isRenderable(children);
252
+ const overlay = collapsed && !hasBrand && hasChildren;
253
+ const label = collapsed ? "Expand sidebar" : "Collapse sidebar";
363
254
  const brandNode = brandHref !== void 0 ? /* @__PURE__ */ jsx(Link, {
364
255
  href: brandHref,
365
256
  to: brandHref,
@@ -370,43 +261,35 @@ function RailHeader({ brand, brandHref, children, collapsed, onToggle, collapsib
370
261
  className: "flex items-center justify-center p-1",
371
262
  children: brand
372
263
  });
373
- return /* @__PURE__ */ jsx(ShellHeader, {
264
+ return /* @__PURE__ */ jsxs(ShellHeader, {
374
265
  divider: false,
375
266
  className: cn$1("border-b border-[var(--md3-outline-variant)] bg-transparent", collapsed ? "justify-center px-2" : "gap-2 px-3", className),
376
- children: collapsed ? !hasBrand && hasChildren ? /* @__PURE__ */ jsxs("div", {
377
- className: "relative flex min-w-0 items-center justify-center",
378
- children: [children, collapsible && /* @__PURE__ */ jsx(PanelToggleButton, {
379
- collapsed,
380
- onToggle,
381
- className: "pointer-events-none absolute inset-0 m-auto bg-background opacity-0 focus-visible:pointer-events-auto focus-visible:opacity-100"
382
- })]
383
- }) : collapsible ? /* @__PURE__ */ jsx(RailTooltip, {
384
- label: "Expand sidebar",
385
- children: /* @__PURE__ */ jsxs("button", {
386
- type: "button",
387
- onClick: onToggle,
388
- "aria-label": "Expand sidebar",
389
- "aria-pressed": true,
390
- className: cn$1("group/brand relative flex h-9 w-9 items-center justify-center rounded-md transition-colors hover:bg-[var(--accent-surface-soft)]", focusRing, MOTION_CONTROL),
391
- children: [/* @__PURE__ */ jsx("span", {
392
- className: cn$1("flex items-center justify-center transition-opacity group-hover/brand:opacity-0", MOTION_CONTROL),
393
- children: brand
394
- }), /* @__PURE__ */ jsx("span", {
395
- className: cn$1("pointer-events-none absolute inset-0 flex items-center justify-center text-foreground opacity-0 transition-opacity group-hover/brand:opacity-100", MOTION_CONTROL),
396
- children: /* @__PURE__ */ jsx(PanelLeft, { className: "h-[18px] w-[18px]" })
397
- })]
398
- })
399
- }) : brandNode : /* @__PURE__ */ jsxs(Fragment, { children: [
400
- hasBrand && brandNode,
401
- /* @__PURE__ */ jsx("div", {
402
- className: "min-w-0 flex-1",
267
+ children: [hasBrand && !collapsed && brandNode, /* @__PURE__ */ jsxs("div", {
268
+ className: collapsed ? "relative flex min-w-0 items-center justify-center" : "contents",
269
+ children: [(!collapsed || !hasBrand) && /* @__PURE__ */ jsx("div", {
270
+ className: collapsed ? void 0 : "min-w-0 flex-1",
403
271
  children
404
- }),
405
- collapsible && /* @__PURE__ */ jsx(PanelToggleButton, {
406
- collapsed,
407
- onToggle
408
- })
409
- ] })
272
+ }), collapsible ? /* @__PURE__ */ jsx(RailTooltip, {
273
+ label,
274
+ disabled: !collapsed || overlay,
275
+ className: overlay ? "pointer-events-none absolute inset-0 m-auto items-center justify-center" : void 0,
276
+ children: /* @__PURE__ */ jsxs("button", {
277
+ type: "button",
278
+ onClick: onToggle,
279
+ "aria-label": label,
280
+ "aria-pressed": collapsed,
281
+ title: collapsed ? void 0 : label,
282
+ className: cn$1("flex shrink-0 items-center justify-center rounded-md transition-colors hover:bg-[var(--accent-surface-soft)]", MOTION_CONTROL, focusRing, collapsed && hasBrand ? "group/brand relative h-9 w-9" : "h-8 w-8 text-muted-foreground hover:text-foreground", overlay && "pointer-events-none bg-background opacity-0 focus-visible:pointer-events-auto focus-visible:opacity-100"),
283
+ children: [collapsed && hasBrand && /* @__PURE__ */ jsx("span", {
284
+ className: cn$1("flex items-center justify-center transition-opacity group-hover/brand:opacity-0 group-focus-visible/brand:opacity-0", MOTION_CONTROL),
285
+ children: brand
286
+ }), /* @__PURE__ */ jsx("span", {
287
+ className: collapsed && hasBrand ? cn$1("pointer-events-none absolute inset-0 flex items-center justify-center text-foreground opacity-0 transition-opacity group-hover/brand:opacity-100 group-focus-visible/brand:opacity-100", MOTION_CONTROL) : void 0,
288
+ children: /* @__PURE__ */ jsx(PanelLeft, { className: "h-[18px] w-[18px] shrink-0" })
289
+ })]
290
+ })
291
+ }) : collapsed && hasBrand ? brandNode : null]
292
+ })]
410
293
  });
411
294
  }
412
295
  function Sidebar({ children, className, style }) {
@@ -470,9 +353,18 @@ function RailButton({ icon: Icon, label, isActive, badge, badgeLabel = defaultBa
470
353
  className: "text-sm font-medium",
471
354
  children: label
472
355
  })] });
356
+ let trigger = /* @__PURE__ */ jsx("button", {
357
+ type: "button",
358
+ onClick,
359
+ "aria-label": label,
360
+ "aria-description": accessibleDescription,
361
+ className: classes,
362
+ style,
363
+ children: content
364
+ });
473
365
  if (asChild && React$1.isValidElement(children)) {
474
366
  const child = children;
475
- const merged = React$1.cloneElement(child, {
367
+ trigger = React$1.cloneElement(child, {
476
368
  className: cn$1(classes, child.props.className),
477
369
  "aria-label": child.props["aria-label"] ?? label,
478
370
  "aria-description": child.props["aria-description"] ?? accessibleDescription,
@@ -482,37 +374,15 @@ function RailButton({ icon: Icon, label, isActive, badge, badgeLabel = defaultBa
482
374
  ...style
483
375
  }
484
376
  }, content);
485
- return /* @__PURE__ */ jsx(RailTooltip, {
486
- label: tooltipLabel,
487
- description,
488
- disabled: tooltipDisabled,
489
- className: showLabel ? "w-full" : void 0,
490
- children: merged
491
- });
492
377
  }
493
378
  return /* @__PURE__ */ jsx(RailTooltip, {
494
379
  label: tooltipLabel,
495
380
  description,
496
381
  disabled: tooltipDisabled,
497
382
  className: showLabel ? "w-full" : void 0,
498
- children: /* @__PURE__ */ jsx("button", {
499
- type: "button",
500
- onClick,
501
- "aria-label": label,
502
- "aria-description": accessibleDescription,
503
- className: classes,
504
- style,
505
- children: content
506
- })
383
+ children: trigger
507
384
  });
508
385
  }
509
- /**
510
- * A rail entry that reveals its sub-surfaces in a small panel anchored to the
511
- * RIGHT of the rail item, rather than pushing the rail open with an inline
512
- * accordion. Opens on click, closes on outside-click, Escape, or selecting an
513
- * item inside it. Use for a single "door" (e.g. Studio) that fronts several
514
- * related destinations without permanently spending rail height on them.
515
- */
516
386
  function RailFlyout({ icon: Icon, label, description, isActive, showLabel, title, children, className, style }) {
517
387
  const [open, setOpen] = React$1.useState(false);
518
388
  const ref = React$1.useRef(null);
@@ -555,7 +425,7 @@ function RailFlyout({ icon: Icon, label, description, isActive, showLabel, title
555
425
  className: "text-sm font-medium",
556
426
  children: label
557
427
  }),
558
- showLabel && /* @__PURE__ */ jsx(ChevronRightIcon, { className: cn$1("ml-auto h-4 w-4 shrink-0 text-muted-foreground/60 transition-transform", MOTION_CONTROL, open && "rotate-180") })
428
+ showLabel && /* @__PURE__ */ jsx(ChevronRight, { className: cn$1("ml-auto h-4 w-4 shrink-0 text-muted-foreground/60 transition-transform", MOTION_CONTROL, open && "rotate-180") })
559
429
  ]
560
430
  })
561
431
  }), open && /* @__PURE__ */ jsxs("div", {
@@ -578,19 +448,6 @@ function RailFlyout({ icon: Icon, label, description, isActive, showLabel, title
578
448
  })]
579
449
  });
580
450
  }
581
- function ChevronRightIcon({ className }) {
582
- return /* @__PURE__ */ jsxs("svg", {
583
- xmlns: "http://www.w3.org/2000/svg",
584
- viewBox: "0 0 24 24",
585
- fill: "none",
586
- stroke: "currentColor",
587
- strokeWidth: "2",
588
- strokeLinecap: "round",
589
- strokeLinejoin: "round",
590
- className,
591
- children: [/* @__PURE__ */ jsx("title", { children: "Expand" }), /* @__PURE__ */ jsx("path", { d: "m9 18 6-6-6-6" })]
592
- });
593
- }
594
451
  function useExpandableItems(subItems, loadSubItems) {
595
452
  const [items, setItems] = React$1.useState(subItems ?? null);
596
453
  const [loading, setLoading] = React$1.useState(false);
@@ -630,14 +487,6 @@ function SubItemsSkeleton() {
630
487
  ].map((w, i) => /* @__PURE__ */ jsx(Skeleton, { className: cn$1("h-4", w) }, i))
631
488
  });
632
489
  }
633
- /**
634
- * A nav item that reveals sub-items. On the labeled rail it expands inline as an
635
- * accordion: the leading icon and chevron remain visible, their shared button
636
- * toggles the list, and clicking the label navigates (`href`). On the
637
- * icon-only rail it shows the sub-items in a right-anchored flyout on hover.
638
- * Sub-items can be fixed (`subItems`) or lazy (`loadSubItems`, with a loading
639
- * skeleton). Used for e.g. a "History" entry fronting recent sessions.
640
- */
641
490
  function RailExpandable({ icon: Icon, label, description, href, isActive, showLabel, subItems, loadSubItems, activeSubIds, emptyLabel = "Nothing here yet", defaultOpen, onNavigate, LinkComponent, className, style }) {
642
491
  const Link = LinkComponent ?? DefaultLink$2;
643
492
  const [open, setOpen] = React$1.useState(defaultOpen ?? false);
@@ -846,31 +695,26 @@ function RailExpandable({ icon: Icon, label, description, href, isActive, showLa
846
695
  children: [/* @__PURE__ */ jsx(Icon, {
847
696
  className: "h-[17px] w-[17px] shrink-0",
848
697
  "aria-hidden": true
849
- }), /* @__PURE__ */ jsx(ChevronRightIcon, {
698
+ }), /* @__PURE__ */ jsx(ChevronRight, {
850
699
  className: cn$1("h-3.5 w-3.5 shrink-0 transition-transform", MOTION_CONTROL, open && "rotate-90"),
851
700
  "aria-hidden": true
852
701
  })]
853
- }), href ? /* @__PURE__ */ jsx(Link, {
854
- href,
855
- to: href,
856
- onClick: onNavigate,
857
- "aria-current": rowCurrent,
858
- "aria-description": description,
859
- className: "flex h-9 min-w-0 flex-1 items-center pr-2.5 text-sm font-medium",
860
- children: /* @__PURE__ */ jsx("span", {
861
- className: "truncate",
862
- children: label
863
- })
864
- }) : /* @__PURE__ */ jsx("button", {
865
- type: "button",
866
- onClick: toggle,
702
+ }), React$1.createElement(href ? Link : "button", {
703
+ ...href ? {
704
+ href,
705
+ to: href,
706
+ onClick: onNavigate,
707
+ "aria-current": rowCurrent
708
+ } : {
709
+ type: "button",
710
+ onClick: toggle
711
+ },
867
712
  "aria-description": description,
868
- className: "flex h-9 min-w-0 flex-1 items-center pr-2.5 text-left text-sm font-medium",
869
- children: /* @__PURE__ */ jsx("span", {
870
- className: "truncate",
871
- children: label
872
- })
873
- })]
713
+ className: cn$1("flex h-9 min-w-0 flex-1 items-center pr-2.5 text-sm font-medium", !href && "text-left")
714
+ }, /* @__PURE__ */ jsx("span", {
715
+ className: "truncate",
716
+ children: label
717
+ }))]
874
718
  })
875
719
  }), /* @__PURE__ */ jsx("div", {
876
720
  ref: discloseRef,
@@ -939,11 +783,11 @@ function SidebarContent({ children, className }) {
939
783
  const APPEARANCE_META = {
940
784
  light: {
941
785
  label: "Light",
942
- Icon: SunIcon
786
+ Icon: Sun
943
787
  },
944
788
  dark: {
945
789
  label: "Dark",
946
- Icon: MoonIcon
790
+ Icon: Moon
947
791
  },
948
792
  system: {
949
793
  label: "System",
@@ -966,7 +810,7 @@ function AppearanceMenuSection({ appearance, divider = true }) {
966
810
  return () => mq.removeEventListener("change", onChange);
967
811
  }, []);
968
812
  const resolved = appearance.value === "system" ? systemDark ? "dark" : "light" : appearance.value;
969
- const TriggerIcon = resolved === "dark" ? MoonIcon : SunIcon;
813
+ const TriggerIcon = resolved === "dark" ? Moon : Sun;
970
814
  const caption = appearance.value === "system" ? `System (${resolved === "dark" ? "Dark" : "Light"})` : APPEARANCE_META[appearance.value].label;
971
815
  return /* @__PURE__ */ jsxs(Fragment, { children: [divider && /* @__PURE__ */ jsx(DropdownMenuSeparator, {}), /* @__PURE__ */ jsxs(DropdownMenuSub, { children: [/* @__PURE__ */ jsxs(DropdownMenuSubTrigger, { children: [/* @__PURE__ */ jsx("span", {
972
816
  "aria-hidden": "true",
@@ -1081,7 +925,7 @@ function ProfileAvatar({ user, isLoading = false, onLogout, onSettingsClick, set
1081
925
  }),
1082
926
  onSettingsClick ? /* @__PURE__ */ jsxs(DropdownMenuItem, {
1083
927
  onClick: onSettingsClick,
1084
- children: [/* @__PURE__ */ jsx(SettingsIcon, {
928
+ children: [/* @__PURE__ */ jsx(Settings, {
1085
929
  className: "mr-2 h-4 w-4",
1086
930
  "aria-hidden": "true"
1087
931
  }), "Settings"]
@@ -1091,7 +935,7 @@ function ProfileAvatar({ user, isLoading = false, onLogout, onSettingsClick, set
1091
935
  href: settingsHref,
1092
936
  to: settingsHref,
1093
937
  className: "flex items-center",
1094
- children: [/* @__PURE__ */ jsx(SettingsIcon, {
938
+ children: [/* @__PURE__ */ jsx(Settings, {
1095
939
  className: "mr-2 h-4 w-4",
1096
940
  "aria-hidden": "true"
1097
941
  }), "Settings"]
@@ -1100,7 +944,7 @@ function ProfileAvatar({ user, isLoading = false, onLogout, onSettingsClick, set
1100
944
  onLogout && /* @__PURE__ */ jsxs(Fragment, { children: [(children || appearance || onSettingsClick || settingsHref !== null) && /* @__PURE__ */ jsx(DropdownMenuSeparator, {}), /* @__PURE__ */ jsxs(DropdownMenuItem, {
1101
945
  className: "text-[var(--surface-danger-text)]",
1102
946
  onClick: onLogout,
1103
- children: [/* @__PURE__ */ jsx(LogOutIcon, {
947
+ children: [/* @__PURE__ */ jsx(LogOut, {
1104
948
  className: "mr-2 h-4 w-4",
1105
949
  "aria-hidden": "true"
1106
950
  }), "Sign Out"]
@@ -1,4 +1,4 @@
1
- import { $ as SandboxTable, $t as Sidebar, A as MetricChartPoint, At as SIDEBAR_TOTAL_WIDTH, B as ProductVariant, Bt as RailButton, C as UsageSummary, Ct as OutOfCreditsModal, D as SystemLogsViewerProps, Dt as SIDEBAR_PANEL_WIDTH, E as SystemLogsViewer, Et as SIDEBAR_MOBILE_WIDTH, F as SidebarLayoutProps, Ft as RailTooltipProps, G as HARNESS_OPTIONS, Gt as RailFlyout, H as HarnessBrand, Ht as RailExpandable, I as DashboardLayout, It as McpServer, J as HarnessType, Jt as RailHeaderProps, K as HarnessPicker, Kt as RailFlyoutProps, L as DashboardLayoutProps, Lt as AppearanceController, M as SidebarLayout, Mt as SidebarProviderProps, N as SidebarLayoutFlyoutItem, Nt as useSidebar, O as MetricAreaChart, Ot as SIDEBAR_RAIL_LABELED_WIDTH, P as SidebarLayoutNavItem, Pt as RailTooltip, Q as BackendSelectorProps, Qt as RailSeparatorProps, R as DashboardUser, Rt as ProfileAvatar, S as GitStatusData, St as InsufficientBalance, T as UsageSummaryProps, Tt as parseInsufficientBalance, U as HarnessLogo, Ut as RailExpandableProps, V as HARNESS_BRAND, Vt as RailButtonProps, W as HarnessLogoProps, Wt as RailExpandableSubItem, X as Backend, Xt as RailModeButtonProps, Y as chatCapableHarnesses, Yt as RailModeButton, Z as BackendSelector, Zt as RailSeparator, _ as PortsList, _t as ResourceSnapshotItem, a as PromoBanner, an as SidebarPanelHeader, at as NewSandboxCard, b as GitPanel, bt as ResourceMeterProps, c as SnapshotList, cn as SidebarProps, ct as SandboxCardData, d as ProcessList, dn as SidebarRailFooterProps, dt as TeamRole, en as SidebarContent, et as SandboxTableProps, f as ProcessListProps, fn as SidebarRailNav, ft as canAdminSandbox, g as ExposedPort, gn as ThemeMode, gt as ResourceSnapshot, h as TemplateCardProps, hn as SidebarUser, ht as ActivityItem, i as SandboxPageShellProps, in as SidebarPanelContentProps, it as sandboxStatus, j as MetricChartTone, jt as SidebarProvider, k as MetricAreaChartProps, kt as SIDEBAR_RAIL_WIDTH, l as SnapshotListProps, ln as SidebarRail, lt as SandboxCardProps, m as TemplateCardData, mn as SidebarRailProps, mt as ActivityFeedProps, n as DashboardPageHeaderProps, nn as SidebarPanel, nt as SandboxStatusPill, o as PromoBannerProps, on as SidebarPanelHeaderProps, ot as NewSandboxCardProps, p as TemplateCard, pn as SidebarRailNavProps, pt as ActivityFeed, q as HarnessPickerProps, qt as RailHeader, r as SandboxPageShell, rn as SidebarPanelContent, rt as SandboxStatusPillProps, s as SnapshotInfo, sn as SidebarPanelProps, st as SandboxCard, t as DashboardPageHeader, tn as SidebarContentProps, tt as SANDBOX_STATUS, u as ProcessInfo, un as SidebarRailFooter, ut as SandboxStatus, v as PortsListProps, vt as ResourceSnapshotProps, w as UsageSummaryData, wt as OutOfCreditsModalProps, x as GitPanelProps, xt as INSUFFICIENT_BALANCE_CODE, y as GitCommitData, yt as ResourceMeter, z as NavItem, zt as ProfileAvatarProps } from "./index-CZGOlm0p.js";
1
+ import { $ as SandboxTable, $t as Sidebar, A as MetricChartPoint, At as SIDEBAR_TOTAL_WIDTH, B as ProductVariant, Bt as RailButton, C as UsageSummary, Ct as OutOfCreditsModal, D as SystemLogsViewerProps, Dt as SIDEBAR_PANEL_WIDTH, E as SystemLogsViewer, Et as SIDEBAR_MOBILE_WIDTH, F as SidebarLayoutProps, Ft as RailTooltipProps, G as HARNESS_OPTIONS, Gt as RailFlyout, H as HarnessBrand, Ht as RailExpandable, I as DashboardLayout, It as McpServer, J as HarnessType, Jt as RailHeaderProps, K as HarnessPicker, Kt as RailFlyoutProps, L as DashboardLayoutProps, Lt as AppearanceController, M as SidebarLayout, Mt as SidebarProviderProps, N as SidebarLayoutFlyoutItem, Nt as useSidebar, O as MetricAreaChart, Ot as SIDEBAR_RAIL_LABELED_WIDTH, P as SidebarLayoutNavItem, Pt as RailTooltip, Q as BackendSelectorProps, Qt as RailSeparatorProps, R as DashboardUser, Rt as ProfileAvatar, S as GitStatusData, St as InsufficientBalance, T as UsageSummaryProps, Tt as parseInsufficientBalance, U as HarnessLogo, Ut as RailExpandableProps, V as HARNESS_BRAND, Vt as RailButtonProps, W as HarnessLogoProps, Wt as RailExpandableSubItem, X as Backend, Xt as RailModeButtonProps, Y as chatCapableHarnesses, Yt as RailModeButton, Z as BackendSelector, Zt as RailSeparator, _ as PortsList, _t as ResourceSnapshotItem, a as PromoBanner, an as SidebarPanelHeader, at as NewSandboxCard, b as GitPanel, bt as ResourceMeterProps, c as SnapshotList, cn as SidebarProps, ct as SandboxCardData, d as ProcessList, dn as SidebarRailFooterProps, dt as TeamRole, en as SidebarContent, et as SandboxTableProps, f as ProcessListProps, fn as SidebarRailNav, ft as canAdminSandbox, g as ExposedPort, gn as ThemeMode, gt as ResourceSnapshot, h as TemplateCardProps, hn as SidebarUser, ht as ActivityItem, i as SandboxPageShellProps, in as SidebarPanelContentProps, it as sandboxStatus, j as MetricChartTone, jt as SidebarProvider, k as MetricAreaChartProps, kt as SIDEBAR_RAIL_WIDTH, l as SnapshotListProps, ln as SidebarRail, lt as SandboxCardProps, m as TemplateCardData, mn as SidebarRailProps, mt as ActivityFeedProps, n as DashboardPageHeaderProps, nn as SidebarPanel, nt as SandboxStatusPill, o as PromoBannerProps, on as SidebarPanelHeaderProps, ot as NewSandboxCardProps, p as TemplateCard, pn as SidebarRailNavProps, pt as ActivityFeed, q as HarnessPickerProps, qt as RailHeader, r as SandboxPageShell, rn as SidebarPanelContent, rt as SandboxStatusPillProps, s as SnapshotInfo, sn as SidebarPanelProps, st as SandboxCard, t as DashboardPageHeader, tn as SidebarContentProps, tt as SANDBOX_STATUS, u as ProcessInfo, un as SidebarRailFooter, ut as SandboxStatus, v as PortsListProps, vt as ResourceSnapshotProps, w as UsageSummaryData, wt as OutOfCreditsModalProps, x as GitPanelProps, xt as INSUFFICIENT_BALANCE_CODE, y as GitCommitData, yt as ResourceMeter, z as NavItem, zt as ProfileAvatarProps } from "./index-CPzJzKOZ.js";
2
2
  import { a as canonicalModelId, i as ProviderMark, n as ModelBrandStack, o as modelBrandFor, r as ModelInfo, t as ModelBrandIdentity } from "./model-brand-ZwVS49Fq.js";
3
3
  import { a as PricingPageProps, c as BillingBalance, d as BillingSubscription, f as BillingUsage, i as PricingPage, l as BillingDashboard, n as UsageChartProps, o as PricingTier, r as UsageDataPoint, s as formatPrice, t as UsageChart, u as BillingDashboardProps } from "./usage-chart-BFpdkqNq.js";
4
4
  export { ActivityFeed, type ActivityFeedProps, type ActivityItem, type AppearanceController, type Backend, BackendSelector, type BackendSelectorProps, type BillingBalance, BillingDashboard, type BillingDashboardProps, type BillingSubscription, type BillingUsage, DashboardLayout, type DashboardLayoutProps, DashboardPageHeader, type DashboardPageHeaderProps, type SnapshotInfo as DashboardSnapshotInfo, type DashboardUser, type ExposedPort, type GitCommitData, GitPanel, type GitPanelProps, type GitStatusData, HARNESS_BRAND, HARNESS_OPTIONS, type HarnessBrand, HarnessLogo, type HarnessLogoProps, HarnessPicker, type HarnessPickerProps, type HarnessType, INSUFFICIENT_BALANCE_CODE, type InsufficientBalance, type McpServer, MetricAreaChart, type MetricAreaChartProps, type MetricChartPoint, type MetricChartTone, type ModelBrandIdentity, ModelBrandStack, type ModelInfo, type NavItem, NewSandboxCard, type NewSandboxCardProps, OutOfCreditsModal, type OutOfCreditsModalProps, PortsList, type PortsListProps, PricingPage, type PricingPageProps, type PricingTier, type ProcessInfo, ProcessList, type ProcessListProps, type ProductVariant, ProfileAvatar, type ProfileAvatarProps, PromoBanner, type PromoBannerProps, ProviderMark, RailButton, type RailButtonProps, RailExpandable, type RailExpandableProps, type RailExpandableSubItem, RailFlyout, type RailFlyoutProps, RailHeader, type RailHeaderProps, RailModeButton, type RailModeButtonProps, RailSeparator, type RailSeparatorProps, RailTooltip, type RailTooltipProps, ResourceMeter, type ResourceMeterProps, ResourceSnapshot, type ResourceSnapshotItem, type ResourceSnapshotProps, SANDBOX_STATUS, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_LABELED_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, type SandboxCardData, type SandboxCardProps, SandboxPageShell, type SandboxPageShellProps, type SandboxStatus, SandboxStatusPill, type SandboxStatusPillProps, SandboxTable, type SandboxTableProps, Sidebar, SidebarContent, type SidebarContentProps, SidebarLayout, type SidebarLayoutFlyoutItem, type SidebarLayoutNavItem, type SidebarLayoutProps, SidebarPanel, SidebarPanelContent, type SidebarPanelContentProps, SidebarPanelHeader, type SidebarPanelHeaderProps, type SidebarPanelProps, type SidebarProps, SidebarProvider, type SidebarProviderProps, SidebarRail, SidebarRailFooter, type SidebarRailFooterProps, SidebarRailNav, type SidebarRailNavProps, type SidebarRailProps, type SidebarUser, SnapshotList, type SnapshotListProps, SystemLogsViewer, type SystemLogsViewerProps, type TeamRole, TemplateCard, type TemplateCardData, type TemplateCardProps, type ThemeMode, UsageChart, type UsageChartProps, type UsageDataPoint, UsageSummary, type UsageSummaryData, type UsageSummaryProps, canAdminSandbox, canonicalModelId, chatCapableHarnesses, formatPrice, modelBrandFor, parseInsufficientBalance, sandboxStatus, useSidebar };
package/dist/dashboard.js CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as useSidebar, A as parseInsufficientBalance, B as SidebarPanel, C as SandboxStatusPill, D as ResourceMeter, E as ResourceSnapshot, F as RailHeader, G as SidebarRailNav, H as SidebarPanelHeader, I as RailModeButton, J as SIDEBAR_PANEL_WIDTH, K as RailTooltip, L as RailSeparator, M as RailButton, N as RailExpandable, O as INSUFFICIENT_BALANCE_CODE, P as RailFlyout, Q as SidebarProvider, R as Sidebar, S as SANDBOX_STATUS, T as ActivityFeed, U as SidebarRail, V as SidebarPanelContent, W as SidebarRailFooter, X as SIDEBAR_RAIL_WIDTH, Y as SIDEBAR_RAIL_LABELED_WIDTH, Z as SIDEBAR_TOTAL_WIDTH, _ as BackendSelector, a as PortsList, b as SandboxCard, c as SystemLogsViewer, d as DashboardLayout, f as HARNESS_OPTIONS, g as HarnessLogo, h as HARNESS_BRAND, i as TemplateCard, j as ProfileAvatar, k as OutOfCreditsModal, l as MetricAreaChart, m as chatCapableHarnesses, n as SnapshotList, o as GitPanel, p as HarnessPicker, q as SIDEBAR_MOBILE_WIDTH, r as ProcessList, s as UsageSummary, t as PromoBanner, u as SidebarLayout, v as SandboxTable, w as sandboxStatus, x as canAdminSandbox, y as NewSandboxCard, z as SidebarContent } from "./dashboard-exTS8tta.js";
1
+ import { $ as useSidebar, A as parseInsufficientBalance, B as SidebarPanel, C as SandboxStatusPill, D as ResourceMeter, E as ResourceSnapshot, F as RailHeader, G as SidebarRailNav, H as SidebarPanelHeader, I as RailModeButton, J as SIDEBAR_PANEL_WIDTH, K as RailTooltip, L as RailSeparator, M as RailButton, N as RailExpandable, O as INSUFFICIENT_BALANCE_CODE, P as RailFlyout, Q as SidebarProvider, R as Sidebar, S as SANDBOX_STATUS, T as ActivityFeed, U as SidebarRail, V as SidebarPanelContent, W as SidebarRailFooter, X as SIDEBAR_RAIL_WIDTH, Y as SIDEBAR_RAIL_LABELED_WIDTH, Z as SIDEBAR_TOTAL_WIDTH, _ as BackendSelector, a as PortsList, b as SandboxCard, c as SystemLogsViewer, d as DashboardLayout, f as HARNESS_OPTIONS, g as HarnessLogo, h as HARNESS_BRAND, i as TemplateCard, j as ProfileAvatar, k as OutOfCreditsModal, l as MetricAreaChart, m as chatCapableHarnesses, n as SnapshotList, o as GitPanel, p as HarnessPicker, q as SIDEBAR_MOBILE_WIDTH, r as ProcessList, s as UsageSummary, t as PromoBanner, u as SidebarLayout, v as SandboxTable, w as sandboxStatus, x as canAdminSandbox, y as NewSandboxCard, z as SidebarContent } from "./dashboard-CYWLMJEA.js";
2
2
  import { i as modelBrandFor, n as ProviderMark, r as canonicalModelId, t as ModelBrandStack } from "./model-brand-BQlarCIo.js";
3
3
  import { a as formatPrice, i as PricingPage, n as SandboxPageShell, o as BillingDashboard, r as UsageChart, t as DashboardPageHeader } from "./page-layout-CuOpvZys.js";
4
4
  export { ActivityFeed, BackendSelector, BillingDashboard, DashboardLayout, DashboardPageHeader, GitPanel, HARNESS_BRAND, HARNESS_OPTIONS, HarnessLogo, HarnessPicker, INSUFFICIENT_BALANCE_CODE, MetricAreaChart, ModelBrandStack, NewSandboxCard, OutOfCreditsModal, PortsList, PricingPage, ProcessList, ProfileAvatar, PromoBanner, ProviderMark, RailButton, RailExpandable, RailFlyout, RailHeader, RailModeButton, RailSeparator, RailTooltip, ResourceMeter, ResourceSnapshot, SANDBOX_STATUS, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_LABELED_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, SandboxPageShell, SandboxStatusPill, SandboxTable, Sidebar, SidebarContent, SidebarLayout, SidebarPanel, SidebarPanelContent, SidebarPanelHeader, SidebarProvider, SidebarRail, SidebarRailFooter, SidebarRailNav, SnapshotList, SystemLogsViewer, TemplateCard, UsageChart, UsageSummary, canAdminSandbox, canonicalModelId, chatCapableHarnesses, formatPrice, modelBrandFor, parseInsufficientBalance, sandboxStatus, useSidebar };
package/dist/globals.css CHANGED
@@ -4688,6 +4688,12 @@
4688
4688
  .group-focus-visible\:bg-ring:is(:where(.group):focus-visible *) {
4689
4689
  background-color: hsl(var(--ring));
4690
4690
  }
4691
+ .group-focus-visible\/brand\:opacity-0:is(:where(.group\/brand):focus-visible *) {
4692
+ opacity: 0%;
4693
+ }
4694
+ .group-focus-visible\/brand\:opacity-100:is(:where(.group\/brand):focus-visible *) {
4695
+ opacity: 100%;
4696
+ }
4691
4697
  .group-data-\[state\=indeterminate\]\/checkbox\:block:is(:where(.group\/checkbox)[data-state="indeterminate"] *) {
4692
4698
  display: block;
4693
4699
  }
@@ -10,43 +10,18 @@ interface SidebarUser {
10
10
  tier?: string;
11
11
  avatarUrl?: string;
12
12
  }
13
- /** Theme modes offered by the account menu's Appearance section. */
14
13
  type ThemeMode = "light" | "dark" | "system";
15
- /**
16
- * Host-supplied controller for the account-menu Appearance section. The rail is
17
- * theme-engine-agnostic: each app wires this to its own theme hook (gtm-agent
18
- * uses the shared `useTheme`; the sandbox app uses its `vault`-aware
19
- * `useThemeMode`). Provide it to {@link ProfileAvatar} to render Light/Dark/System.
20
- */
21
14
  interface AppearanceController {
22
15
  value: ThemeMode;
23
16
  onChange: (mode: ThemeMode) => void;
24
- /** Which modes to offer, in order. Defaults to all three. */
25
17
  modes?: ThemeMode[];
26
18
  }
27
19
  interface RailHeaderProps {
28
- /** Brand mark shown on the left, e.g. `<Logo iconOnly />`. */
29
20
  brand?: React$1.ReactNode;
30
- /** Destination for the brand link. When set with `LinkComponent`, the brand is a link. */
31
21
  brandHref?: string;
32
- /**
33
- * Optional middle content (e.g. a project/workspace switcher).
34
- *
35
- * When `brand` is set, this is expanded-only — the collapsed rail has room
36
- * for the mark alone. When `brand` is NOT set this content owns the rail top
37
- * in BOTH states, so it is also rendered collapsed; read `useSidebar()` to
38
- * swap in a compact mark there.
39
- */
40
22
  children?: React$1.ReactNode;
41
- /** Whether the rail is collapsed (icon-only). */
42
23
  collapsed: boolean;
43
- /** Collapse/expand the rail. */
44
24
  onToggle: () => void;
45
- /**
46
- * Whether the rail can collapse/expand. When `false`, no panel toggle is
47
- * rendered and the collapsed header shows the brand without the hover-morph.
48
- * Defaults to `true`.
49
- */
50
25
  collapsible?: boolean;
51
26
  LinkComponent?: React$1.ComponentType<any>;
52
27
  className?: string;
@@ -61,22 +36,12 @@ declare function Sidebar({ children, className, style }: SidebarProps): React$1.
61
36
  interface SidebarRailProps {
62
37
  children: React$1.ReactNode;
63
38
  className?: string;
64
- /**
65
- * Render the rail at the wider mobile-drawer width so labels fit
66
- * beside the icons. Defaults to the 64px icon-only rail used on
67
- * desktop.
68
- */
69
39
  wide?: boolean;
70
40
  }
71
41
  declare function SidebarRail({ children, className, wide }: SidebarRailProps): React$1.JSX.Element;
72
42
  interface SidebarRailNavProps {
73
43
  children: React$1.ReactNode;
74
44
  className?: string;
75
- /**
76
- * Click handler on the `<nav>` itself. Layouts use it (with a
77
- * `target === currentTarget` guard) so clicking the empty body of a collapsed
78
- * rail expands it, without intercepting clicks on the nav items.
79
- */
80
45
  onClick?: React$1.MouseEventHandler<HTMLElement>;
81
46
  }
82
47
  declare function SidebarRailNav({ children, className, onClick }: SidebarRailNavProps): React$1.JSX.Element;
@@ -96,42 +61,14 @@ interface RailButtonProps {
96
61
  label: string;
97
62
  isActive?: boolean;
98
63
  badge?: number;
99
- /**
100
- * Describes the badge count to assistive tech and in the icon-only rail's
101
- * tooltip, e.g. `(n) => \`${n} running\``. Defaults to `"<n> new"`.
102
- */
103
64
  badgeLabel?: (count: number) => string;
104
65
  onClick?: () => void;
105
66
  className?: string;
106
- /** Show label text next to icon (for mobile drawer) */
107
67
  showLabel?: boolean;
108
- /**
109
- * One line saying what the destination is for, e.g. "Every past agent run".
110
- * Shown in the hover tooltip under the label (the labeled rail shows the
111
- * tooltip only when a description exists) and announced as the link's
112
- * accessible description, so an unfamiliar nav item explains itself.
113
- */
114
68
  description?: string;
115
- /**
116
- * Render the rail-button styling onto a single child element (e.g. a router
117
- * `<Link>`) instead of an inner `<button>`. The child receives the button
118
- * classes, `title`, and the icon/label/badge as its content — so navigation
119
- * items stay real anchors (keyboard, cmd-click, prefetch) without copying the
120
- * class recipe or nesting `<a><button>`.
121
- */
122
69
  asChild?: boolean;
123
70
  children?: React$1.ReactNode;
124
- /**
125
- * `"primary"` gives the item a distinct emphasized pill (accent fill + accent
126
- * border) so it stands out from the rest of the nav, e.g. a "New" action.
127
- * Defaults to `"normal"`.
128
- */
129
71
  variant?: "normal" | "primary";
130
- /**
131
- * Inline style for the rendered row. Layouts use it to set `--stagger-index`
132
- * so a rail of nav items arrives as a sequence rather than a flash; the
133
- * variable has to land on the animated element itself, which is this one.
134
- */
135
72
  style?: React$1.CSSProperties;
136
73
  }
137
74
  declare function RailButton({ icon: Icon, label, isActive, badge, badgeLabel, onClick, className, showLabel, description, asChild, children, variant, style }: RailButtonProps): React$1.JSX.Element;
@@ -140,40 +77,24 @@ interface RailFlyoutProps {
140
77
  className?: string;
141
78
  }>;
142
79
  label: string;
143
- /** Explains this destination in accessible text and its tooltip or open flyout. */
144
80
  description?: string;
145
- /** Highlight the trigger (e.g. when a child route is active). */
146
81
  isActive?: boolean;
147
- /** Show the label text beside the icon (labeled rail) vs. icon-only. */
148
82
  showLabel?: boolean;
149
- /** Heading rendered at the top of the open flyout. Defaults to `label`. */
150
83
  title?: string;
151
- /** Flyout body — the sub-surfaces revealed when the item is opened. */
152
84
  children: React$1.ReactNode;
153
85
  className?: string;
154
- /** @see {@link RailButtonProps.style} — carries `--stagger-index` in a rail. */
155
86
  style?: React$1.CSSProperties;
156
87
  }
157
- /**
158
- * A rail entry that reveals its sub-surfaces in a small panel anchored to the
159
- * RIGHT of the rail item, rather than pushing the rail open with an inline
160
- * accordion. Opens on click, closes on outside-click, Escape, or selecting an
161
- * item inside it. Use for a single "door" (e.g. Studio) that fronts several
162
- * related destinations without permanently spending rail height on them.
163
- */
164
88
  declare function RailFlyout({ icon: Icon, label, description, isActive, showLabel, title, children, className, style }: RailFlyoutProps): React$1.JSX.Element;
165
- /** A single entry in a sub-item's hover actions menu (kebab). */
166
89
  interface RailSubItemAction {
167
90
  id: string;
168
91
  label: string;
169
92
  icon?: React$1.ComponentType<{
170
93
  className?: string;
171
94
  }>;
172
- /** Style the item as a destructive action (e.g. delete). */
173
95
  destructive?: boolean;
174
96
  onSelect: () => void;
175
97
  }
176
- /** A sub-destination revealed by a {@link RailExpandable} item. */
177
98
  interface RailExpandableSubItem {
178
99
  id: string;
179
100
  label: string;
@@ -182,16 +103,9 @@ interface RailExpandableSubItem {
182
103
  }>;
183
104
  href: string;
184
105
  prefetch?: "none" | "intent" | "render" | "viewport";
185
- /** Show a live working indicator on the row while the item is busy. */
186
106
  isLoading?: boolean;
187
- /** Render the row emphasized (bold + accent) so it stands out — e.g. a
188
- * trailing "view all" action below a capped list. */
189
107
  emphasis?: boolean;
190
- /** Mark the row as unread — bold label + a leading dot. Suppressed while
191
- * `isLoading` so a responding row shows only the working indicator. */
192
108
  unread?: boolean;
193
- /** Hover-revealed kebab actions (e.g. rename/delete). Rendered on the
194
- * labeled rail only; ignored in the collapsed-rail flyout. */
195
109
  actions?: RailSubItemAction[];
196
110
  }
197
111
  interface RailExpandableProps {
@@ -199,39 +113,20 @@ interface RailExpandableProps {
199
113
  className?: string;
200
114
  }>;
201
115
  label: string;
202
- /** Explains this destination in accessible text and its tooltip or open flyout. */
203
116
  description?: string;
204
- /** Destination for the row itself. Clicking the label navigates here. */
205
117
  href?: string;
206
- /** Highlight the row (e.g. its own route or a child route is active). */
207
118
  isActive?: boolean;
208
- /** Labeled (expanded) rail vs. icon-only (collapsed) rail. */
209
119
  showLabel?: boolean;
210
- /** Fixed sub-items. Mutually exclusive with `loadSubItems`. */
211
120
  subItems?: RailExpandableSubItem[];
212
- /** Lazy sub-items — called once on first open; the result is cached. */
213
121
  loadSubItems?: () => Promise<RailExpandableSubItem[]>;
214
- /** Start expanded on mount (labeled rail). Defaults to collapsed. */
215
122
  defaultOpen?: boolean;
216
- /** Ids of sub-items whose route is active (drives sub-item highlight). */
217
123
  activeSubIds?: string[];
218
- /** Shown when the resolved sub-item list is empty. */
219
124
  emptyLabel?: string;
220
- /** Called when the row or a sub-item navigates (e.g. to close a mobile drawer). */
221
125
  onNavigate?: () => void;
222
126
  LinkComponent?: React$1.ComponentType<any>;
223
127
  className?: string;
224
- /** @see {@link RailButtonProps.style} — carries `--stagger-index` in a rail. */
225
128
  style?: React$1.CSSProperties;
226
129
  }
227
- /**
228
- * A nav item that reveals sub-items. On the labeled rail it expands inline as an
229
- * accordion: the leading icon and chevron remain visible, their shared button
230
- * toggles the list, and clicking the label navigates (`href`). On the
231
- * icon-only rail it shows the sub-items in a right-anchored flyout on hover.
232
- * Sub-items can be fixed (`subItems`) or lazy (`loadSubItems`, with a loading
233
- * skeleton). Used for e.g. a "History" entry fronting recent sessions.
234
- */
235
130
  declare function RailExpandable({ icon: Icon, label, description, href, isActive, showLabel, subItems, loadSubItems, activeSubIds, emptyLabel, defaultOpen, onNavigate, LinkComponent, className, style }: RailExpandableProps): React$1.JSX.Element;
236
131
  interface RailModeButtonProps {
237
132
  mode: string;
@@ -240,12 +135,9 @@ interface RailModeButtonProps {
240
135
  }>;
241
136
  label: string;
242
137
  badge?: number;
243
- /** @see {@link RailButtonProps.badgeLabel} */
244
138
  badgeLabel?: (count: number) => string;
245
139
  className?: string;
246
- /** Show label text next to icon (for mobile drawer) */
247
140
  showLabel?: boolean;
248
- /** @see {@link RailButtonProps.style} — carries `--stagger-index` in a rail. */
249
141
  style?: React$1.CSSProperties;
250
142
  }
251
143
  declare function RailModeButton({ mode, icon, label, badge, badgeLabel, className, showLabel, style }: RailModeButtonProps): React$1.JSX.Element;
@@ -275,17 +167,10 @@ interface ProfileAvatarProps {
275
167
  isLoading?: boolean;
276
168
  onLogout?: () => void;
277
169
  onSettingsClick?: () => void;
278
- /** Pass null when the host has no settings destination. */
279
170
  settingsHref?: string | null;
280
- /** Extra dropdown items rendered before settings/logout */
281
171
  children?: React$1.ReactNode;
282
172
  className?: string;
283
- /** Show name/email beside the avatar (for a labeled rail) instead of an icon-only avatar button. */
284
173
  showDetails?: boolean;
285
- /**
286
- * When provided, the menu renders an Appearance section (Light/Dark/System)
287
- * driven by this host-supplied controller. Omit to hide it.
288
- */
289
174
  appearance?: AppearanceController;
290
175
  LinkComponent?: React$1.ComponentType<any>;
291
176
  }
@@ -1,4 +1,4 @@
1
- import { g as ExposedPort } from "./index-CZGOlm0p.js";
1
+ import { g as ExposedPort } from "./index-CPzJzKOZ.js";
2
2
  import { D as RichFileTreeGitStatus, E as RichFileTreeGitEntry } from "./index-BZJKLu3k.js";
3
3
  import "./diff-view-DDHWtR6X.js";
4
4
  import { a as PreviewReadiness, i as PreviewAccess } from "./embedded-app-view-Ta5GI4hx.js";
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { a as LoginLayout, c as UserMenu, d as TangleLoginButtonProps, i as GitHubLoginButtonProps, l as UserMenuProps, n as AuthHeaderProps, o as LoginLayoutProps, r as GitHubLoginButton, s as SessionUser, t as AuthHeader, u as TangleLoginButton } from "./index-BbfWVtZq.js";
2
2
  import { $ as AgentProfilePicker, A as SpeakerSection, B as partitionBySpeaker, C as MessageList, D as SpeakerHeader, E as Speaker, F as UserMessage, G as ArtifactDockStreamEvent, H as ArtifactAgentDockProps, I as UserMessageProps, J as modelProvider, K as ArtifactKind, L as agentTimelineStepKind, M as TRANSCRIPT_TEXT, N as ThinkingIndicator, O as SpeakerHeaderProps, P as ThinkingIndicatorProps, Q as AgentProfileOption, R as foldSummary, S as MessageAuthorProps, T as MessageRole, U as ArtifactAgentDockTransport, V as ArtifactAgentDock, W as ArtifactDockMessage, X as AgentProfileCapability, Y as snapHarnessToModel, Z as AgentProfileDraft, _ as ChatContainer, a as AgentTimelineFoldItem, at as ReasoningLevelPicker, b as ChatMessageProps, c as AgentTimelineProps, d as AgentTimelineStepKind, et as AgentProfilePickerProps, f as AgentTimelineStepProps, g as ChatAuthor, h as AgentTimelineToolItem, i as AgentTimelineCustomItem, it as ReasoningLevelOption, j as SpeakerState, k as SpeakerPart, l as AgentTimelineStatusItem, m as AgentTimelineToolGroupItem, n as AgentTimelineArtifactItem, nt as HARNESS_REASONING_OPTIONS, o as AgentTimelineItem, ot as ReasoningLevelPickerProps, p as AgentTimelineTone, q as ArtifactScope, r as AgentTimelineColumn, rt as ReasoningLevel, s as AgentTimelineMessageItem, t as AgentTimeline, tt as DEFAULT_REASONING_LEVEL_OPTIONS, u as AgentTimelineStep, v as ChatContainerProps, w as MessageListProps, x as MessageAuthor, y as ChatMessage, z as isViewerMessage } from "./index-1Q4Jtlic.js";
3
- import { $ as SandboxTable, $t as Sidebar, A as MetricChartPoint, At as SIDEBAR_TOTAL_WIDTH, B as ProductVariant, Bt as RailButton, C as UsageSummary, Ct as OutOfCreditsModal, D as SystemLogsViewerProps, Dt as SIDEBAR_PANEL_WIDTH, E as SystemLogsViewer, Et as SIDEBAR_MOBILE_WIDTH, F as SidebarLayoutProps, Ft as RailTooltipProps, G as HARNESS_OPTIONS, Gt as RailFlyout, H as HarnessBrand, Ht as RailExpandable, I as DashboardLayout, It as McpServer, J as HarnessType, Jt as RailHeaderProps, K as HarnessPicker, Kt as RailFlyoutProps, L as DashboardLayoutProps, Lt as AppearanceController, M as SidebarLayout, Mt as SidebarProviderProps, N as SidebarLayoutFlyoutItem, Nt as useSidebar, O as MetricAreaChart, Ot as SIDEBAR_RAIL_LABELED_WIDTH, P as SidebarLayoutNavItem, Pt as RailTooltip, Q as BackendSelectorProps, Qt as RailSeparatorProps, R as DashboardUser, Rt as ProfileAvatar, S as GitStatusData, St as InsufficientBalance, T as UsageSummaryProps, Tt as parseInsufficientBalance, U as HarnessLogo, Ut as RailExpandableProps, V as HARNESS_BRAND, Vt as RailButtonProps, W as HarnessLogoProps, Wt as RailExpandableSubItem, X as Backend, Xt as RailModeButtonProps, Y as chatCapableHarnesses, Yt as RailModeButton, Z as BackendSelector, Zt as RailSeparator, _ as PortsList, _t as ResourceSnapshotItem, a as PromoBanner, an as SidebarPanelHeader, at as NewSandboxCard, b as GitPanel, bt as ResourceMeterProps, c as SnapshotList, cn as SidebarProps, ct as SandboxCardData, d as ProcessList, dn as SidebarRailFooterProps, dt as TeamRole, en as SidebarContent, et as SandboxTableProps, f as ProcessListProps, fn as SidebarRailNav, ft as canAdminSandbox, g as ExposedPort, gn as ThemeMode, gt as ResourceSnapshot, h as TemplateCardProps, hn as SidebarUser, ht as ActivityItem, i as SandboxPageShellProps, in as SidebarPanelContentProps, it as sandboxStatus, j as MetricChartTone, jt as SidebarProvider, k as MetricAreaChartProps, kt as SIDEBAR_RAIL_WIDTH, l as SnapshotListProps, ln as SidebarRail, lt as SandboxCardProps, m as TemplateCardData, mn as SidebarRailProps, mt as ActivityFeedProps, n as DashboardPageHeaderProps, nn as SidebarPanel, nt as SandboxStatusPill, o as PromoBannerProps, on as SidebarPanelHeaderProps, ot as NewSandboxCardProps, p as TemplateCard, pn as SidebarRailNavProps, pt as ActivityFeed, q as HarnessPickerProps, qt as RailHeader, r as SandboxPageShell, rn as SidebarPanelContent, rt as SandboxStatusPillProps, s as SnapshotInfo, sn as SidebarPanelProps, st as SandboxCard, t as DashboardPageHeader, tn as SidebarContentProps, tt as SANDBOX_STATUS, u as ProcessInfo, un as SidebarRailFooter, ut as SandboxStatus, v as PortsListProps, vt as ResourceSnapshotProps, w as UsageSummaryData, wt as OutOfCreditsModalProps, x as GitPanelProps, xt as INSUFFICIENT_BALANCE_CODE, y as GitCommitData, yt as ResourceMeter, z as NavItem, zt as ProfileAvatarProps } from "./index-CZGOlm0p.js";
3
+ import { $ as SandboxTable, $t as Sidebar, A as MetricChartPoint, At as SIDEBAR_TOTAL_WIDTH, B as ProductVariant, Bt as RailButton, C as UsageSummary, Ct as OutOfCreditsModal, D as SystemLogsViewerProps, Dt as SIDEBAR_PANEL_WIDTH, E as SystemLogsViewer, Et as SIDEBAR_MOBILE_WIDTH, F as SidebarLayoutProps, Ft as RailTooltipProps, G as HARNESS_OPTIONS, Gt as RailFlyout, H as HarnessBrand, Ht as RailExpandable, I as DashboardLayout, It as McpServer, J as HarnessType, Jt as RailHeaderProps, K as HarnessPicker, Kt as RailFlyoutProps, L as DashboardLayoutProps, Lt as AppearanceController, M as SidebarLayout, Mt as SidebarProviderProps, N as SidebarLayoutFlyoutItem, Nt as useSidebar, O as MetricAreaChart, Ot as SIDEBAR_RAIL_LABELED_WIDTH, P as SidebarLayoutNavItem, Pt as RailTooltip, Q as BackendSelectorProps, Qt as RailSeparatorProps, R as DashboardUser, Rt as ProfileAvatar, S as GitStatusData, St as InsufficientBalance, T as UsageSummaryProps, Tt as parseInsufficientBalance, U as HarnessLogo, Ut as RailExpandableProps, V as HARNESS_BRAND, Vt as RailButtonProps, W as HarnessLogoProps, Wt as RailExpandableSubItem, X as Backend, Xt as RailModeButtonProps, Y as chatCapableHarnesses, Yt as RailModeButton, Z as BackendSelector, Zt as RailSeparator, _ as PortsList, _t as ResourceSnapshotItem, a as PromoBanner, an as SidebarPanelHeader, at as NewSandboxCard, b as GitPanel, bt as ResourceMeterProps, c as SnapshotList, cn as SidebarProps, ct as SandboxCardData, d as ProcessList, dn as SidebarRailFooterProps, dt as TeamRole, en as SidebarContent, et as SandboxTableProps, f as ProcessListProps, fn as SidebarRailNav, ft as canAdminSandbox, g as ExposedPort, gn as ThemeMode, gt as ResourceSnapshot, h as TemplateCardProps, hn as SidebarUser, ht as ActivityItem, i as SandboxPageShellProps, in as SidebarPanelContentProps, it as sandboxStatus, j as MetricChartTone, jt as SidebarProvider, k as MetricAreaChartProps, kt as SIDEBAR_RAIL_WIDTH, l as SnapshotListProps, ln as SidebarRail, lt as SandboxCardProps, m as TemplateCardData, mn as SidebarRailProps, mt as ActivityFeedProps, n as DashboardPageHeaderProps, nn as SidebarPanel, nt as SandboxStatusPill, o as PromoBannerProps, on as SidebarPanelHeaderProps, ot as NewSandboxCardProps, p as TemplateCard, pn as SidebarRailNavProps, pt as ActivityFeed, q as HarnessPickerProps, qt as RailHeader, r as SandboxPageShell, rn as SidebarPanelContent, rt as SandboxStatusPillProps, s as SnapshotInfo, sn as SidebarPanelProps, st as SandboxCard, t as DashboardPageHeader, tn as SidebarContentProps, tt as SANDBOX_STATUS, u as ProcessInfo, un as SidebarRailFooter, ut as SandboxStatus, v as PortsListProps, vt as ResourceSnapshotProps, w as UsageSummaryData, wt as OutOfCreditsModalProps, x as GitPanelProps, xt as INSUFFICIENT_BALANCE_CODE, y as GitCommitData, yt as ResourceMeter, z as NavItem, zt as ProfileAvatarProps } from "./index-CPzJzKOZ.js";
4
4
  import { a as canonicalModelId, i as ProviderMark, n as ModelBrandStack, o as modelBrandFor, r as ModelInfo, t as ModelBrandIdentity } from "./model-brand-ZwVS49Fq.js";
5
5
  import { a as PricingPageProps, c as BillingBalance, d as BillingSubscription, f as BillingUsage, i as PricingPage, l as BillingDashboard, n as UsageChartProps, o as PricingTier, r as UsageDataPoint, s as formatPrice, t as UsageChart, u as BillingDashboardProps } from "./usage-chart-BFpdkqNq.js";
6
6
  import { A as configurePdfViewer, C as PdfViewerConfig, D as RichFileTreeGitStatus, E as RichFileTreeGitEntry, F as getFormatLabel, I as getSyntaxLanguage, L as parseCsv, M as fileExtension, N as filterFileTree, O as RichFileTreeProps, P as getCodeLanguage, R as resolveFilePreviewKind, S as PdfViewer, T as RichFileTree, _ as FileTabsProps, a as FileCardProps, b as FileTreeVisibilityOptions, c as FileList, d as FileNode, f as FilePreview, g as FileTabs, h as FileTabData, i as FileCard, j as detectFileFormat, k as RichFileTreeThemeVars, l as FileListItem, m as FilePreviewProps, n as FileArtifactPane, o as FileDetails, p as FilePreviewKind, r as FileArtifactPaneProps, s as FileFormat, t as CSV_PREVIEW_ROW_LIMIT, u as FileListProps, v as FileTree, w as PdfViewerProps, x as FileUploader, y as FileTreeProps } from "./index-BZJKLu3k.js";
@@ -11,7 +11,7 @@ import { AgentStreamEvent, AppendUserMessageOptions, ApplySdkEventOptions, AuthU
11
11
  import { $ as CollapsibleContent, $i as Logo, $n as Separator, $r as TabsContent, $t as FieldProps, A as BreadcrumbPage, Ai as WizardProps, An as PaginationProps, Ar as SidebarDropZone, At as DialogPortal, B as CardDescription, Bi as parseCalendarDate, Bn as SegmentedControl, Br as StatusTone, Bt as DropdownMenuLabel, C as Badge, Ci as TooltipContent, Cn as MetricStrip, Cr as SheetDescription, Ct as Dialog, D as BreadcrumbItem, Di as UploadProgress, Dn as PageShell, Dr as SheetPortal, Dt as DialogFooter, E as BreadcrumbEllipsis, Ei as UploadFile, En as PageHeaderProps, Er as SheetOverlay, Et as DialogDescription, F as Calendar, Fi as fieldMessageId, Fn as PopoverContent, Fr as Slider, Ft as DropdownMenu, G as CategoryTone, Gi as seriesMean, Gn as SelectGroup, Gr as TableCaption, Gt as DropdownMenuShortcut, H as CardHeader, Hi as seriesAreaPath, Hn as SegmentedControlProps, Hr as TONE_CLASSES, Ht as DropdownMenuRadioGroup, I as CalendarDate, Ii as formatCalendarDate, In as PopoverTrigger, Ir as StatCard, It as DropdownMenuCheckboxItem, J as Chip, Ji as useTheme, Jn as SelectScrollDownButton, Jr as TableHead, Jt as DropdownMenuSubTrigger, K as ChartReferenceLine, Ki as seriesScale, Kn as SelectItem, Kr as TableCell, Kt as DropdownMenuSub, L as CalendarProps, Li as initialsOf, Ln as Progress, Lr as StatCardProps, Lt as DropdownMenuContent, M as Button, Mi as WizardStepProps, Mn as Popover, Mr as Skeleton, Mt as DialogTrigger, N as ButtonProps, Ni as badgeVariants, Nn as PopoverAnchor, Nr as SkeletonCard, Nt as DropZone, O as BreadcrumbLink, Oi as UploadProgressProps, On as PageShellProps, Or as SheetTitle, Ot as DialogHeader, P as CATEGORY_TONES, Pi as buttonVariants, Pn as PopoverClose, Pr as SkeletonTable, Pt as DropZoneProps, Q as Collapsible, Qi as SectionTitleProps, Qn as SelectValue, Qr as Tabs, Qt as Field, R as Card, Ri as localToday, Rn as RadioGroup, Rr as StatusPill, Rt as DropdownMenuGroup, S as AvatarProps, Si as Tooltip, Sn as MetricProps, Sr as SheetContent, St as DatePickerProps, T as Breadcrumb, Ti as TooltipTrigger, Tn as PageHeader, Tr as SheetHeader, Tt as DialogContent, U as CardTitle, Ui as seriesExtent, Un as Select, Ur as Table, Ut as DropdownMenuRadioItem, V as CardFooter, Vi as periodDelta, Vn as SegmentedControlOption, Vr as Switch, Vt as DropdownMenuPortal, W as CardTitleProps, Wi as seriesLinePath, Wn as SelectContent, Wr as TableBody, Wt as DropdownMenuSeparator, X as CodeBlock, Xi as HeadingProps, Xn as SelectSeparator, Xr as TableProps, Xt as EmptyState, Y as ChipProps, Yi as useToast, Yn as SelectScrollUpButton, Yr as TableHeader, Yt as DropdownMenuTrigger, Z as CodeBlockProps, Zi as SectionTitle, Zn as SelectTrigger, Zr as TableRow, Zt as EmptyStateProps, _ as ArtifactPane, _i as ToastProvider, _n as InputProps, _r as SettingsRowProps, _t as ContextMenuSubContent, a as AlertDialogCancel, ai as TerminalDisplay, an as HelpTextProps, ar as SeriesSparklineProps, at as ContextMenu, b as AvatarFallback, bi as Toolbar, bn as MetricChart, br as Sheet, bt as CopyButton, c as AlertDialogFooter, ci as TextShimmer, cn as HoverCardDescription, cr as SettingsListColumns, ct as ContextMenuGroup, d as AlertDialogPortal, di as TextareaProps, dn as HoverCardTrigger, dr as SettingsListMenuItem, dt as ContextMenuPortal, ea as LogoProps, ei as TabsList, en as FilterField, er as SeriesExtent, et as CollapsibleTrigger, f as AlertDialogTitle, fi as ThemeToggle, fn as IconTile, fr as SettingsListProps, ft as ContextMenuRadioGroup, g as AlertTone, gi as ToastContainer, gn as Input, gr as SettingsRowLayout, gt as ContextMenuSub, h as AlertTitle, hi as Toast, hn as InlineCodeProps, hr as SettingsRow, ht as ContextMenuShortcut, i as AlertDialogAction, ii as TerminalCursor, in as HelpText, ir as SeriesSparkline, it as ComplianceStatus, j as BreadcrumbSeparator, ji as WizardStep, jn as PeriodDelta, jr as SidebarDropZoneProps, jt as DialogTitle, k as BreadcrumbList, ki as Wizard, kn as Pagination, kr as SheetTrigger, kt as DialogOverlay, l as AlertDialogHeader, li as TextShimmerProps, ln as HoverCardHeader, lr as SettingsListItem, lt as ContextMenuItem, m as AlertProps, mi as TimeSelectProps, mn as InlineCode, mr as SettingsNoteProps, mt as ContextMenuSeparator, n as AlertDescription, ni as Tag, nn as Heading, nr as SeriesPointInput, nt as ComplianceBadgeProps, o as AlertDialogContent, oi as TerminalInput, on as HoverCard, or as SettingsList, ot as ContextMenuCheckboxItem, p as AlertDialogTrigger, pi as TimeSelect, pn as IconTileProps, pr as SettingsNote, pt as ContextMenuRadioItem, q as Checkbox, qi as toneFor, qn as SelectLabel, qr as TableFooter, qt as DropdownMenuSubContent, r as AlertDialog, ri as TagProps, rn as HeadingVariant, rr as SeriesScale, rt as ComplianceProduct, s as AlertDialogDescription, sn as HoverCardContent, sr as SettingsListAction, st as ContextMenuContent, t as Alert, ta as TangleKnot, ti as TabsTrigger, tn as FilterFieldProps, tr as SeriesPoint, tt as ComplianceBadge, u as AlertDialogOverlay, ui as Textarea, un as HoverCardTitle, ur as SettingsListItemProps, ut as ContextMenuLabel, v as ArtifactPaneProps, vi as Tone, vn as Label, vr as SettingsSection, vt as ContextMenuSubTrigger, w as BadgeProps, wi as TooltipProvider, wn as MetricStripProps, wr as SheetFooter, wt as DialogClose, x as AvatarImage, xi as ToolbarProps, xn as MetricChartProps, xr as SheetClose, xt as DatePicker, y as Avatar, yi as ToneClasses, yn as Metric, yr as SettingsSectionProps, yt as ContextMenuTrigger, z as CardContent, zi as normalizeSeries, zn as RadioGroupItem, zr as StatusPillProps, zt as DropdownMenuItem } from "./index-CEtc2U5v.js";
12
12
  import { $ as StatusBar, A as createShellShouldRevalidate, B as SessionSidebarVariant, C as SandboxWorkbenchLayoutOptions, D as SandboxWorkbenchSessionProps, E as SandboxWorkbenchProps, F as SessionSidebarFilter, G as dispatchSessionCreated, H as SessionCreatedDetail, I as SessionSidebarGroupBy, J as RuntimePaneProps, K as useOptimisticSessionItems, L as SessionSidebarItem, M as formatRelativeAge, N as SessionSidebar, O as ShellShouldRevalidateArgs, P as SessionSidebarBadge, Q as ContextBadge, R as SessionSidebarLink, S as SandboxWorkbenchFileArtifact, T as SandboxWorkbenchOpenUIArtifact, U as SessionOptimisticController, V as SESSION_CREATED_EVENT, W as UseOptimisticSessionItemsOptions, X as TerminalPanel, Y as TerminalLine, Z as TerminalProps, _ as TaskBoardItem, _t as WorkspaceSurfaceTitle, a as WorkspaceFilesPane, at as DirectoryPaneProps, b as SandboxWorkbenchArtifact, bt as WorkspaceLayoutProps, c as ApprovalConfidenceStat, ct as ShellHeader, d as ApprovalQueueProps, dt as WorkspacePaneHeaderProps, et as StatusBarProps, f as CalendarEvent, ft as WorkspaceSurface, g as TaskBoardColumn, gt as WorkspaceSurfaceProps, h as TaskBoard, ht as WorkspaceSurfaceHeadingLevel, i as WorkspaceArtifactViewProps, it as DirectoryPane, j as shellShouldRevalidate, k as ShellShouldRevalidateOptions, l as ApprovalItem, lt as ShellHeaderProps, m as CalendarViewProps, mt as WorkspaceSurfaceFrameProps, nt as StatusBanner, o as WorkspaceFilesPaneProps, ot as SHELL_HEADER_HEIGHT, p as CalendarView, pt as WorkspaceSurfaceFrame, q as RuntimePane, r as WorkspaceArtifactView, rt as StatusBannerProps, s as WorkspaceFilesPreview, st as SHELL_INSET_GUTTER, tt as BannerType, u as ApprovalQueue, ut as WorkspacePaneHeader, v as TaskBoardProps, vt as WorkspaceSurfaceTitleProps, w as SandboxWorkbenchMarkdownArtifact, x as SandboxWorkbenchCustomArtifact, y as SandboxWorkbench, yt as WorkspaceLayout, z as SessionSidebarProps } from "./index-DpzFSqjG.js";
13
13
  import { i as VaultTreeProps, n as VAULT_TREE_CHILD_PAGE, r as VaultTree, t as FileChange } from "./vault-tree-CBS8qGT-.js";
14
- import { C as SandboxArtifactPane, D as SandboxArtifact, E as ChangesPaneProps, O as SandboxArtifactPaneProps, S as ChangesPane, T as ChangedFile, _ as buildUnifiedPatch, a as PreviewViewProps, b as PillTabs, c as CodeView, d as FileBreadcrumbProps, f as DiffStatsBadge, g as DiffStats, h as PanelHeaderProps, i as PreviewView, k as SandboxArtifactTerminal, l as CodeViewProps, m as PanelHeader, n as CodeSurface, o as JsonView, p as GitStatusBadge, r as CodeSurfaceProps, s as JsonViewProps, t as CODE_THEME, u as FileBreadcrumb, v as computeDiffStats, w as ArtifactView, x as PillTabsProps, y as PillTabItem } from "./index-Z6RCpkmT.js";
14
+ import { C as SandboxArtifactPane, D as SandboxArtifact, E as ChangesPaneProps, O as SandboxArtifactPaneProps, S as ChangesPane, T as ChangedFile, _ as buildUnifiedPatch, a as PreviewViewProps, b as PillTabs, c as CodeView, d as FileBreadcrumbProps, f as DiffStatsBadge, g as DiffStats, h as PanelHeaderProps, i as PreviewView, k as SandboxArtifactTerminal, l as CodeViewProps, m as PanelHeader, n as CodeSurface, o as JsonView, p as GitStatusBadge, r as CodeSurfaceProps, s as JsonViewProps, t as CODE_THEME, u as FileBreadcrumb, v as computeDiffStats, w as ArtifactView, x as PillTabsProps, y as PillTabItem } from "./index-lDG84P5L.js";
15
15
  import { n as DiffViewProps, t as DiffView } from "./diff-view-DDHWtR6X.js";
16
16
  import { a as PreviewReadiness, i as PreviewAccess, n as EmbeddedAppView, r as EmbeddedAppViewProps, t as EmbeddedApp } from "./embedded-app-view-Ta5GI4hx.js";
17
17
  import { OPENUI_NODE_JSON_SCHEMA, OPENUI_NODE_TYPES, OpenUIAction, OpenUIActionsNode, OpenUIArtifactRenderer, OpenUIArtifactRendererProps, OpenUIBadgeNode, OpenUICardNode, OpenUICodeNode, OpenUIComponentNode, OpenUIGridNode, OpenUIHeadingNode, OpenUIKeyValueNode, OpenUIMarkdownNode, OpenUIPrimitive, OpenUISchemaIssue, OpenUISchemaValidation, OpenUISeparatorNode, OpenUIStackNode, OpenUIStatNode, OpenUITableNode, OpenUITextNode, findUnsupportedOpenUINode, validateOpenUIJsonArtifact, validateOpenUIJsonNode } from "./openui.js";
package/dist/index.js CHANGED
@@ -4,20 +4,20 @@ import { S as WorkspaceSurfaceTitle, _ as StatusBanner, a as SandboxWorkbench, b
4
4
  import { t as VirtualList } from "./VirtualList-DcSGbEtA.js";
5
5
  import { i as VaultTree, n as filterFileNodes, r as VAULT_TREE_CHILD_PAGE, t as fileTreeFromPaths } from "./tree-data-rg5voiY8.js";
6
6
  import { t as WorkspaceFilesPane } from "./workspace-files-pane-D24G7H_Z.js";
7
- import { $ as useSidebar, A as parseInsufficientBalance, B as SidebarPanel, C as SandboxStatusPill, D as ResourceMeter, E as ResourceSnapshot, F as RailHeader, G as SidebarRailNav, H as SidebarPanelHeader, I as RailModeButton, J as SIDEBAR_PANEL_WIDTH, K as RailTooltip, L as RailSeparator, M as RailButton, N as RailExpandable, O as INSUFFICIENT_BALANCE_CODE, P as RailFlyout, Q as SidebarProvider, R as Sidebar, S as SANDBOX_STATUS, T as ActivityFeed, U as SidebarRail, V as SidebarPanelContent, W as SidebarRailFooter, X as SIDEBAR_RAIL_WIDTH, Y as SIDEBAR_RAIL_LABELED_WIDTH, Z as SIDEBAR_TOTAL_WIDTH, _ as BackendSelector, a as PortsList, b as SandboxCard, c as SystemLogsViewer, d as DashboardLayout, f as HARNESS_OPTIONS, g as HarnessLogo, h as HARNESS_BRAND, i as TemplateCard, j as ProfileAvatar, k as OutOfCreditsModal, l as MetricAreaChart, m as chatCapableHarnesses, n as SnapshotList, o as GitPanel, p as HarnessPicker, q as SIDEBAR_MOBILE_WIDTH, r as ProcessList, s as UsageSummary, t as PromoBanner, u as SidebarLayout, v as SandboxTable, w as sandboxStatus, x as canAdminSandbox, y as NewSandboxCard, z as SidebarContent } from "./dashboard-exTS8tta.js";
7
+ import { $ as useSidebar, A as parseInsufficientBalance, B as SidebarPanel, C as SandboxStatusPill, D as ResourceMeter, E as ResourceSnapshot, F as RailHeader, G as SidebarRailNav, H as SidebarPanelHeader, I as RailModeButton, J as SIDEBAR_PANEL_WIDTH, K as RailTooltip, L as RailSeparator, M as RailButton, N as RailExpandable, O as INSUFFICIENT_BALANCE_CODE, P as RailFlyout, Q as SidebarProvider, R as Sidebar, S as SANDBOX_STATUS, T as ActivityFeed, U as SidebarRail, V as SidebarPanelContent, W as SidebarRailFooter, X as SIDEBAR_RAIL_WIDTH, Y as SIDEBAR_RAIL_LABELED_WIDTH, Z as SIDEBAR_TOTAL_WIDTH, _ as BackendSelector, a as PortsList, b as SandboxCard, c as SystemLogsViewer, d as DashboardLayout, f as HARNESS_OPTIONS, g as HarnessLogo, h as HARNESS_BRAND, i as TemplateCard, j as ProfileAvatar, k as OutOfCreditsModal, l as MetricAreaChart, m as chatCapableHarnesses, n as SnapshotList, o as GitPanel, p as HarnessPicker, q as SIDEBAR_MOBILE_WIDTH, r as ProcessList, s as UsageSummary, t as PromoBanner, u as SidebarLayout, v as SandboxTable, w as sandboxStatus, x as canAdminSandbox, y as NewSandboxCard, z as SidebarContent } from "./dashboard-CYWLMJEA.js";
8
8
  import { i as modelBrandFor, n as ProviderMark, r as canonicalModelId, t as ModelBrandStack } from "./model-brand-BQlarCIo.js";
9
9
  import { a as formatPrice, i as PricingPage, n as SandboxPageShell, o as BillingDashboard, r as UsageChart, t as DashboardPageHeader } from "./page-layout-CuOpvZys.js";
10
10
  import { t as usePtySession } from "./use-pty-session-BHVQlSs-.js";
11
- import { a as GitStatusBadge, i as DiffStatsBadge, n as ChangesPane, o as PanelHeader, r as SandboxArtifactPane, s as PillTabs, t as JsonView } from "./workbench-DWQ0pm9w.js";
11
+ import { a as GitStatusBadge, i as DiffStatsBadge, n as ChangesPane, o as PanelHeader, r as SandboxArtifactPane, s as PillTabs, t as JsonView } from "./workbench-LcgsEw_H.js";
12
12
  import { CSV_PREVIEW_ROW_LIMIT, FileArtifactPane, FileCard, FileList, FilePreview, FileTabs, FileTree, PdfViewer, RichFileTree, configurePdfViewer, detectFileFormat, fileExtension, filterFileTree, getCodeLanguage, getFormatLabel, getSyntaxLanguage, parseCsv, resolveFilePreviewKind } from "./files.js";
13
13
  import { a as CodeSurface, i as CODE_THEME, n as buildUnifiedPatch, r as computeDiffStats, t as DiffView } from "./diff-view-B9mNeTLF.js";
14
14
  import { n as FileBreadcrumb, t as CodeView } from "./code-view-BlhCS1SD.js";
15
15
  import { n as PreviewView, t as EmbeddedAppView } from "./embedded-app-view-DXsoPale.js";
16
16
  import { OPENUI_NODE_JSON_SCHEMA, OPENUI_NODE_TYPES, OpenUIArtifactRenderer, findUnsupportedOpenUINode, validateOpenUIJsonArtifact, validateOpenUIJsonNode } from "./openui.js";
17
17
  import { S as ReasoningLevelPicker, _ as modelProvider, a as ChatMessage, b as DEFAULT_REASONING_LEVEL_OPTIONS, c as SpeakerHeader, d as UserMessage, f as agentTimelineStepKind, g as ArtifactAgentDock, h as partitionBySpeaker, i as ChatContainer, l as TRANSCRIPT_TEXT, m as isViewerMessage, n as AgentTimelineColumn, o as MessageAuthor, p as foldSummary, r as AgentTimelineStep, s as MessageList, t as AgentTimeline, u as ThinkingIndicator, v as snapHarnessToModel, x as HARNESS_REASONING_OPTIONS, y as AgentProfilePicker } from "./chat-B_5Lwevm.js";
18
- import { a as TraceWaterfall, i as useEventStream, n as foldAgentRows, o as traceSpanMark, r as useAgentStream, t as TraceWorkspace } from "./trace-workspace-B7Ht17Nh.js";
18
+ import { a as TraceWaterfall, i as useEventStream, n as foldAgentRows, o as traceSpanMark, r as useAgentStream, t as TraceWorkspace } from "./trace-workspace-EArXc0uP.js";
19
19
  import { S as model_exports, i as ToolStep, r as PromptMore, s as timelineItems, w as recordFlowTrace, y as indexRecord } from "./use-follow-tail-Df965WQi.js";
20
- import { _ as showsTaskPriority, a as InlineToolItem, b as taskStatus, c as RunPhaseList, d as RunStatusIcon, f as TaskList, g as runStatus, h as parseToolEvent, i as InlineThinkingItem, l as RunRowShell, m as isOpen, n as ApprovalDiffSummary, o as LiveDuration, p as ToolCallFeed, r as ExpandedToolDetail, s as RunGroup, t as ApprovalCard, u as RunRowStatusDot, v as statusMeta, x as LatestEvents, y as taskProgress } from "./run-DBHKEnV_.js";
20
+ import { _ as showsTaskPriority, a as InlineToolItem, b as taskStatus, c as RunPhaseList, d as RunStatusIcon, f as TaskList, g as runStatus, h as parseToolEvent, i as InlineThinkingItem, l as RunRowShell, m as isOpen, n as ApprovalDiffSummary, o as LiveDuration, p as ToolCallFeed, r as ExpandedToolDetail, s as RunGroup, t as ApprovalCard, u as RunRowStatusDot, v as statusMeta, x as LatestEvents, y as taskProgress } from "./run-CpJ_COuz.js";
21
21
  import { n as Conversation, t as AgentTree } from "./AgentTree-Dzy6lrfP.js";
22
22
  import { t as withPrompts } from "./record-Cc_WNtG8.js";
23
23
  import "./vault-tree.js";
package/dist/run/live.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { t as WorkspaceFilesPane } from "../workspace-files-pane-D24G7H_Z.js";
2
2
  import { t as DiffView } from "../diff-view-B9mNeTLF.js";
3
3
  import { t as CodeView } from "../code-view-BlhCS1SD.js";
4
- import { i as useEventStream, t as TraceWorkspace } from "../trace-workspace-B7Ht17Nh.js";
4
+ import { i as useEventStream, t as TraceWorkspace } from "../trace-workspace-EArXc0uP.js";
5
5
  import { useDocument } from "../hooks/use-document.js";
6
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
7
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -1,4 +1,4 @@
1
- import "./trace-workspace-B7Ht17Nh.js";
1
+ import "./trace-workspace-EArXc0uP.js";
2
2
  import "./record-Cc_WNtG8.js";
3
3
  import { ApprovalCard, ApprovalDiffSummary, ExpandedToolDetail, InlineThinkingItem, InlineToolItem, LiveDuration, RunGroup, RunPhaseList, RunRowShell, RunRowStatusDot, RunStatusIcon as RunStatusIcon$1, TaskList, ToolCallFeed, isOpen, parseToolEvent, runStatus as runStatus$1, showsTaskPriority, statusMeta as statusMeta$1, taskProgress, taskStatus } from "@tangle-network/ui/run";
4
4
  import { LatestEvents } from "@tangle-network/charts/react/agent-graph";
package/dist/run.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { t as VirtualList } from "./VirtualList-DcSGbEtA.js";
2
- import { a as TraceWaterfall, i as useEventStream, n as foldAgentRows, o as traceSpanMark, r as useAgentStream, t as TraceWorkspace } from "./trace-workspace-B7Ht17Nh.js";
2
+ import { a as TraceWaterfall, i as useEventStream, n as foldAgentRows, o as traceSpanMark, r as useAgentStream, t as TraceWorkspace } from "./trace-workspace-EArXc0uP.js";
3
3
  import { S as model_exports, i as ToolStep, r as PromptMore, s as timelineItems, w as recordFlowTrace, y as indexRecord } from "./use-follow-tail-Df965WQi.js";
4
- import { _ as showsTaskPriority, a as InlineToolItem, b as taskStatus, c as RunPhaseList, d as RunStatusIcon, f as TaskList, g as runStatus, h as parseToolEvent, i as InlineThinkingItem, l as RunRowShell, m as isOpen, n as ApprovalDiffSummary, o as LiveDuration, p as ToolCallFeed, r as ExpandedToolDetail, s as RunGroup, t as ApprovalCard, u as RunRowStatusDot, v as statusMeta, x as LatestEvents, y as taskProgress } from "./run-DBHKEnV_.js";
4
+ import { _ as showsTaskPriority, a as InlineToolItem, b as taskStatus, c as RunPhaseList, d as RunStatusIcon, f as TaskList, g as runStatus, h as parseToolEvent, i as InlineThinkingItem, l as RunRowShell, m as isOpen, n as ApprovalDiffSummary, o as LiveDuration, p as ToolCallFeed, r as ExpandedToolDetail, s as RunGroup, t as ApprovalCard, u as RunRowStatusDot, v as statusMeta, x as LatestEvents, y as taskProgress } from "./run-CpJ_COuz.js";
5
5
  import { n as Conversation, t as AgentTree } from "./AgentTree-Dzy6lrfP.js";
6
6
  import { t as withPrompts } from "./record-Cc_WNtG8.js";
7
7
  export { AgentTree, ApprovalCard, ApprovalDiffSummary, Conversation, ExpandedToolDetail, InlineThinkingItem, InlineToolItem, LatestEvents, LiveDuration, PromptMore, RunGroup, RunPhaseList, RunRowShell, RunRowStatusDot, RunStatusIcon, TaskList, ToolCallFeed, ToolStep, TraceWaterfall, TraceWorkspace, VirtualList, foldAgentRows, indexRecord, isOpen, parseToolEvent, recordFlowTrace, model_exports as recordModel, runStatus, showsTaskPriority, statusMeta, taskProgress, taskStatus, timelineItems, traceSpanMark, useAgentStream, useEventStream, withPrompts };
package/dist/styles.css CHANGED
@@ -4688,6 +4688,12 @@
4688
4688
  .group-focus-visible\:bg-ring:is(:where(.group):focus-visible *) {
4689
4689
  background-color: hsl(var(--ring));
4690
4690
  }
4691
+ .group-focus-visible\/brand\:opacity-0:is(:where(.group\/brand):focus-visible *) {
4692
+ opacity: 0%;
4693
+ }
4694
+ .group-focus-visible\/brand\:opacity-100:is(:where(.group\/brand):focus-visible *) {
4695
+ opacity: 100%;
4696
+ }
4691
4697
  .group-data-\[state\=indeterminate\]\/checkbox\:block:is(:where(.group\/checkbox)[data-state="indeterminate"] *) {
4692
4698
  display: block;
4693
4699
  }
@@ -23,7 +23,7 @@ function traceSpanMark(span) {
23
23
  size: "sm"
24
24
  }) : void 0;
25
25
  }
26
- const provider = span.icon ?? (span.kind === "tool" ? span.detail : void 0);
26
+ const provider = span.icon;
27
27
  return provider ? /* @__PURE__ */ jsx(ProviderIcon, {
28
28
  id: provider,
29
29
  displayName: provider,
@@ -932,6 +932,7 @@ function TraceWorkspace({ trace, streamUrl, openEventSource, events, onTimeChang
932
932
  },
933
933
  graph: /* @__PURE__ */ jsxs("section", {
934
934
  className: "relative flex min-h-[320px] flex-1 flex-col",
935
+ style: typeof waterfall.maxHeight === "number" ? { height: waterfall.maxHeight } : void 0,
935
936
  "aria-label": "Agent graph",
936
937
  children: [/* @__PURE__ */ jsx(SegmentedControl, {
937
938
  "aria-label": "Graph layout",
@@ -1,7 +1,7 @@
1
1
  import { t as cn$1 } from "./utils-BER_bdgE.js";
2
2
  import { t as revealInScroller } from "./reveal-in-scroller-CzKwuqCG.js";
3
3
  import { t as VirtualList } from "./VirtualList-DcSGbEtA.js";
4
- import { a as PortsList } from "./dashboard-exTS8tta.js";
4
+ import { a as PortsList } from "./dashboard-CYWLMJEA.js";
5
5
  import { n as TerminalView } from "./terminal-nUCznZRj.js";
6
6
  import { n as buildUnifiedPatch, r as computeDiffStats, t as DiffView } from "./diff-view-B9mNeTLF.js";
7
7
  import { t as CodeView } from "./code-view-BlhCS1SD.js";
@@ -1,4 +1,4 @@
1
- import { C as SandboxArtifactPane, D as SandboxArtifact, E as ChangesPaneProps, O as SandboxArtifactPaneProps, S as ChangesPane, T as ChangedFile, _ as buildUnifiedPatch, a as PreviewViewProps, b as PillTabs, c as CodeView, d as FileBreadcrumbProps, f as DiffStatsBadge, g as DiffStats, h as PanelHeaderProps, i as PreviewView, k as SandboxArtifactTerminal, l as CodeViewProps, m as PanelHeader, n as CodeSurface, o as JsonView, p as GitStatusBadge, r as CodeSurfaceProps, s as JsonViewProps, t as CODE_THEME, u as FileBreadcrumb, v as computeDiffStats, w as ArtifactView, x as PillTabsProps, y as PillTabItem } from "./index-Z6RCpkmT.js";
1
+ import { C as SandboxArtifactPane, D as SandboxArtifact, E as ChangesPaneProps, O as SandboxArtifactPaneProps, S as ChangesPane, T as ChangedFile, _ as buildUnifiedPatch, a as PreviewViewProps, b as PillTabs, c as CodeView, d as FileBreadcrumbProps, f as DiffStatsBadge, g as DiffStats, h as PanelHeaderProps, i as PreviewView, k as SandboxArtifactTerminal, l as CodeViewProps, m as PanelHeader, n as CodeSurface, o as JsonView, p as GitStatusBadge, r as CodeSurfaceProps, s as JsonViewProps, t as CODE_THEME, u as FileBreadcrumb, v as computeDiffStats, w as ArtifactView, x as PillTabsProps, y as PillTabItem } from "./index-lDG84P5L.js";
2
2
  import { n as DiffViewProps, t as DiffView } from "./diff-view-DDHWtR6X.js";
3
3
  import { a as PreviewReadiness, i as PreviewAccess, n as EmbeddedAppView, r as EmbeddedAppViewProps, t as EmbeddedApp } from "./embedded-app-view-Ta5GI4hx.js";
4
4
  export { type ArtifactView, CODE_THEME, type ChangedFile, ChangesPane, type ChangesPaneProps, CodeSurface, type CodeSurfaceProps, CodeView, type CodeViewProps, type DiffStats, DiffStatsBadge, DiffView, type DiffViewProps, type EmbeddedApp, EmbeddedAppView, type EmbeddedAppViewProps, FileBreadcrumb, type FileBreadcrumbProps, GitStatusBadge, JsonView, type JsonViewProps, PanelHeader, type PanelHeaderProps, type PillTabItem, PillTabs, type PillTabsProps, type PreviewAccess, type PreviewReadiness, PreviewView, type PreviewViewProps, type SandboxArtifact, SandboxArtifactPane, type SandboxArtifactPaneProps, type SandboxArtifactTerminal, buildUnifiedPatch, computeDiffStats };
package/dist/workbench.js CHANGED
@@ -1,4 +1,4 @@
1
- import { a as GitStatusBadge, i as DiffStatsBadge, n as ChangesPane, o as PanelHeader, r as SandboxArtifactPane, s as PillTabs, t as JsonView } from "./workbench-DWQ0pm9w.js";
1
+ import { a as GitStatusBadge, i as DiffStatsBadge, n as ChangesPane, o as PanelHeader, r as SandboxArtifactPane, s as PillTabs, t as JsonView } from "./workbench-LcgsEw_H.js";
2
2
  import { a as CodeSurface, i as CODE_THEME, n as buildUnifiedPatch, r as computeDiffStats, t as DiffView } from "./diff-view-B9mNeTLF.js";
3
3
  import { n as FileBreadcrumb, t as CodeView } from "./code-view-BlhCS1SD.js";
4
4
  import { n as PreviewView, t as EmbeddedAppView } from "./embedded-app-view-DXsoPale.js";
@@ -41337,7 +41337,7 @@ function kB(e, t) {
41337
41337
  r
41338
41338
  ]);
41339
41339
  }
41340
- // dist/trace-workspace-B7Ht17Nh.js
41340
+ // dist/trace-workspace-EArXc0uP.js
41341
41341
  function AB(e) {
41342
41342
  if (e.kind === "pipeline" || e.kind === "model") {
41343
41343
  let t = e.detail ? AP(e.detail) : null;
@@ -41346,7 +41346,7 @@ function AB(e) {
41346
41346
  size: "sm"
41347
41347
  }) : void 0;
41348
41348
  }
41349
- let t = e.icon ?? (e.kind === "tool" ? e.detail : void 0);
41349
+ let t = e.icon;
41350
41350
  return t ? /* @__PURE__ */ (0, W.jsx)($P, {
41351
41351
  id: t,
41352
41352
  displayName: t,
@@ -42106,6 +42106,7 @@ function iV({ trace: e, streamUrl: t, openEventSource: n, events: r, onTimeChang
42106
42106
  },
42107
42107
  graph: /* @__PURE__ */ (0, W.jsxs)("section", {
42108
42108
  className: "relative flex min-h-[320px] flex-1 flex-col",
42109
+ style: typeof v.maxHeight == "number" ? { height: v.maxHeight } : void 0,
42109
42110
  "aria-label": "Agent graph",
42110
42111
  children: [/* @__PURE__ */ (0, W.jsx)(ca, {
42111
42112
  "aria-label": "Graph layout",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "7.0.1",
3
+ "version": "7.0.3",
4
4
  "license": "MIT",
5
5
  "description": "Unified UI component library for Tangle Sandbox — primitives, chat, dashboard, terminal, editor, and workspace components",
6
6
  "repository": {