@tangle-network/sandbox-ui 0.34.0 → 0.36.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.
@@ -147,9 +147,97 @@ function Logo({ variant = "sandbox", size = "md", className, iconOnly = false })
147
147
  }
148
148
  Logo.displayName = "Logo";
149
149
 
150
+ // src/primitives/heading.tsx
151
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
152
+ var ROLE_CLASS = {
153
+ display: "font-display font-bold text-foreground text-[length:var(--font-size-display,3rem)] leading-[var(--line-height-display,1.05)] tracking-[var(--tracking-tight,-0.02em)]",
154
+ hero: "font-display font-bold text-foreground text-[length:var(--font-size-hero,2.5rem)] leading-[1.1] tracking-[var(--tracking-tight,-0.02em)]",
155
+ page: "font-display font-semibold text-foreground text-[length:var(--font-size-3xl,1.875rem)] leading-[var(--line-height-heading,1.15)] tracking-[var(--tracking-tight,-0.02em)]",
156
+ section: "font-display font-semibold text-foreground text-[length:var(--font-size-xl,1.25rem)] leading-[1.3] tracking-[var(--tracking-snug,-0.01em)]",
157
+ subsection: "font-semibold text-foreground text-[length:var(--font-size-lg,1rem)] leading-[1.4]",
158
+ eyebrow: "font-semibold uppercase text-muted-foreground text-[length:var(--font-size-sm,0.75rem)] leading-none tracking-[var(--tracking-wide,0.08em)]"
159
+ };
160
+ var DEFAULT_TAG = {
161
+ display: "h1",
162
+ hero: "h2",
163
+ page: "h1",
164
+ section: "h2",
165
+ subsection: "h3",
166
+ eyebrow: "p"
167
+ };
168
+ function Heading({ role, as, className, children, ...rest }) {
169
+ const Tag = as ?? DEFAULT_TAG[role];
170
+ return /* @__PURE__ */ jsx2(Tag, { className: cn(ROLE_CLASS[role], className), ...rest, children });
171
+ }
172
+ function PageHeader({
173
+ title,
174
+ description,
175
+ eyebrow,
176
+ action,
177
+ className,
178
+ titleAs
179
+ }) {
180
+ return /* @__PURE__ */ jsxs2(
181
+ "div",
182
+ {
183
+ className: cn(
184
+ "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
185
+ className
186
+ ),
187
+ children: [
188
+ /* @__PURE__ */ jsxs2("div", { className: "space-y-1.5", children: [
189
+ eyebrow ? /* @__PURE__ */ jsx2(Heading, { role: "eyebrow", children: eyebrow }) : null,
190
+ /* @__PURE__ */ jsx2(Heading, { role: "page", as: titleAs, children: title }),
191
+ description ? /* @__PURE__ */ jsx2("p", { className: "max-w-2xl text-[length:var(--font-size-base,0.9375rem)] text-muted-foreground leading-relaxed", children: description }) : null
192
+ ] }),
193
+ action ? /* @__PURE__ */ jsx2("div", { className: "flex shrink-0 items-center gap-2", children: action }) : null
194
+ ]
195
+ }
196
+ );
197
+ }
198
+ function SectionTitle({
199
+ title,
200
+ description,
201
+ action,
202
+ className
203
+ }) {
204
+ return /* @__PURE__ */ jsxs2(
205
+ "div",
206
+ {
207
+ className: cn(
208
+ "flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between",
209
+ className
210
+ ),
211
+ children: [
212
+ /* @__PURE__ */ jsxs2("div", { className: "space-y-1", children: [
213
+ /* @__PURE__ */ jsx2(Heading, { role: "section", children: title }),
214
+ description ? /* @__PURE__ */ jsx2("p", { className: "max-w-xl text-[length:var(--font-size-sm,0.75rem)] text-muted-foreground", children: description }) : null
215
+ ] }),
216
+ action ? /* @__PURE__ */ jsx2("div", { className: "shrink-0", children: action }) : null
217
+ ]
218
+ }
219
+ );
220
+ }
221
+ function PageShell({ children, className }) {
222
+ return /* @__PURE__ */ jsx2(
223
+ "div",
224
+ {
225
+ className: cn(
226
+ "mx-auto w-full max-w-6xl space-y-8 px-6 py-8 lg:px-8",
227
+ className
228
+ ),
229
+ children
230
+ }
231
+ );
232
+ }
233
+
150
234
  export {
151
235
  TangleKnot,
152
236
  Logo,
237
+ Heading,
238
+ PageHeader,
239
+ SectionTitle,
240
+ PageShell,
153
241
  Avatar,
154
242
  AvatarFallback,
155
243
  AvatarImage,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Button,
3
3
  Logo
4
- } from "./chunk-7ZA5SEK3.js";
4
+ } from "./chunk-QHIA75U3.js";
5
5
  import {
6
6
  cn
7
7
  } from "./chunk-EI44GEQ5.js";
@@ -1496,6 +1496,9 @@ function DashboardLayoutInner({
1496
1496
  topNavLinks,
1497
1497
  activeTopNavHref,
1498
1498
  LinkComponent = DefaultLink2,
1499
+ logoHref = "/",
1500
+ onLogoClick,
1501
+ labeledRail = false,
1499
1502
  footer,
1500
1503
  railFooter,
1501
1504
  profileMenuItems,
@@ -1522,7 +1525,7 @@ function DashboardLayoutInner({
1522
1525
  document.removeEventListener("keydown", keyHandler);
1523
1526
  };
1524
1527
  }, [notificationsOpen]);
1525
- const { contentMargin, hidden, mode, hasPanels, panelOpen } = useSidebar();
1528
+ const { contentMargin, hidden, mode, hasPanels, panelOpen, toggleRail, railCollapsed } = useSidebar();
1526
1529
  const modeSet = React6.useMemo(() => new Set(modeItems), [modeItems]);
1527
1530
  const sidebarUser = React6.useMemo(
1528
1531
  () => user ? { email: user.email, name: user.name, tier: user.tier, avatarUrl: user.avatarUrl } : void 0,
@@ -1532,7 +1535,34 @@ function DashboardLayoutInner({
1532
1535
  const buildSidebarContent = React6.useCallback(
1533
1536
  (showLabels) => /* @__PURE__ */ jsxs13(Fragment8, { children: [
1534
1537
  /* @__PURE__ */ jsxs13(SidebarRail, { wide: showLabels, children: [
1535
- /* @__PURE__ */ jsx14(SidebarRailHeader, { children: /* @__PURE__ */ jsx14(Link, { href: "/", to: "/", className: "p-1 rounded-md transition-colors hover:bg-muted/50", children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true }) }) }),
1538
+ /* @__PURE__ */ jsx14(SidebarRailHeader, { children: onLogoClick ? /* @__PURE__ */ jsx14(
1539
+ "button",
1540
+ {
1541
+ type: "button",
1542
+ onClick: onLogoClick,
1543
+ "aria-label": "Toggle navigation",
1544
+ className: "p-1 rounded-md transition-colors hover:bg-muted/50",
1545
+ children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true })
1546
+ }
1547
+ ) : labeledRail ? /* @__PURE__ */ jsx14(
1548
+ "button",
1549
+ {
1550
+ type: "button",
1551
+ onClick: toggleRail,
1552
+ "aria-label": railCollapsed ? "Expand navigation" : "Collapse navigation",
1553
+ "aria-expanded": !railCollapsed,
1554
+ className: "p-1 rounded-md transition-colors hover:bg-muted/50",
1555
+ children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true })
1556
+ }
1557
+ ) : /* @__PURE__ */ jsx14(
1558
+ Link,
1559
+ {
1560
+ href: logoHref,
1561
+ to: logoHref,
1562
+ className: "p-1 rounded-md transition-colors hover:bg-muted/50",
1563
+ children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true })
1564
+ }
1565
+ ) }),
1536
1566
  /* @__PURE__ */ jsx14(SidebarRailNav, { children: navItems.map((item, i) => {
1537
1567
  const isMode = modeSet.has(item.id);
1538
1568
  const prevIsMode = i > 0 && modeSet.has(navItems[i - 1].id);
@@ -1586,6 +1616,11 @@ function DashboardLayoutInner({
1586
1616
  [
1587
1617
  Link,
1588
1618
  variant,
1619
+ onLogoClick,
1620
+ logoHref,
1621
+ labeledRail,
1622
+ toggleRail,
1623
+ railCollapsed,
1589
1624
  navItems,
1590
1625
  modeSet,
1591
1626
  activeNavId,
@@ -1602,7 +1637,10 @@ function DashboardLayoutInner({
1602
1637
  mode
1603
1638
  ]
1604
1639
  );
1605
- const sidebarContent = React6.useMemo(() => buildSidebarContent(false), [buildSidebarContent]);
1640
+ const sidebarContent = React6.useMemo(
1641
+ () => buildSidebarContent(labeledRail && !railCollapsed),
1642
+ [buildSidebarContent, labeledRail, railCollapsed]
1643
+ );
1606
1644
  const mobileSidebarContent = React6.useMemo(() => buildSidebarContent(true), [buildSidebarContent]);
1607
1645
  return /* @__PURE__ */ jsxs13("div", { className: cn("min-h-screen bg-background text-foreground", className), children: [
1608
1646
  /* @__PURE__ */ jsxs13(
@@ -1615,7 +1653,7 @@ function DashboardLayoutInner({
1615
1653
  },
1616
1654
  children: [
1617
1655
  /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-8", children: [
1618
- /* @__PURE__ */ jsx14(Link, { href: "/", to: "/", className: "lg:hidden flex items-center p-1 rounded-md hover:bg-muted/50 transition-colors", children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true }) }),
1656
+ /* @__PURE__ */ jsx14(Link, { href: logoHref, to: logoHref, className: "lg:hidden flex items-center p-1 rounded-md hover:bg-muted/50 transition-colors", children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true }) }),
1619
1657
  topNavLinks && topNavLinks.length > 0 && /* @__PURE__ */ jsx14("div", { className: "hidden md:flex gap-6", children: topNavLinks.map((link) => /* @__PURE__ */ jsx14(
1620
1658
  Link,
1621
1659
  {
@@ -1732,8 +1770,8 @@ function DashboardLayoutInner({
1732
1770
  footer
1733
1771
  ] });
1734
1772
  }
1735
- function DashboardLayout({ defaultPanelOpen, defaultMode, ...props }) {
1736
- return /* @__PURE__ */ jsx14(SidebarProvider, { defaultPanelOpen, defaultMode, hasPanels: (props.panels?.length ?? 0) > 0, children: /* @__PURE__ */ jsx14(DashboardLayoutInner, { defaultPanelOpen, defaultMode, ...props }) });
1773
+ function DashboardLayout({ defaultPanelOpen, defaultMode, labeledRail, ...props }) {
1774
+ return /* @__PURE__ */ jsx14(SidebarProvider, { defaultPanelOpen, defaultMode, labeledRail, hasPanels: (props.panels?.length ?? 0) > 0, children: /* @__PURE__ */ jsx14(DashboardLayoutInner, { defaultPanelOpen, defaultMode, labeledRail, ...props }) });
1737
1775
  }
1738
1776
 
1739
1777
  // src/dashboard/sidebar-layout.tsx
@@ -654,6 +654,22 @@ interface DashboardLayoutProps {
654
654
  topNavLinks?: TopNavLink[];
655
655
  activeTopNavHref?: string;
656
656
  LinkComponent?: React.ComponentType<any>;
657
+ /**
658
+ * Where the in-app logo links. Defaults to "/" (backward compatible);
659
+ * pass an in-app path (e.g. "/dashboard") so the logo never bounces an
660
+ * authenticated user back out to the public marketing homepage.
661
+ */
662
+ logoHref?: string;
663
+ /**
664
+ * If provided, the rail logo becomes a button calling this instead of
665
+ * navigating — e.g. to toggle the sidebar. Takes precedence over logoHref.
666
+ */
667
+ onLogoClick?: () => void;
668
+ /**
669
+ * Let the icon rail expand to a labeled rail. When true, the rail logo
670
+ * toggles between icon-only and labeled instead of navigating.
671
+ */
672
+ labeledRail?: boolean;
657
673
  footer?: React.ReactNode;
658
674
  defaultPanelOpen?: boolean;
659
675
  defaultMode?: string;
@@ -675,7 +691,7 @@ interface DashboardLayoutProps {
675
691
  onMarkAllRead?: () => void;
676
692
  };
677
693
  }
678
- declare function DashboardLayout({ defaultPanelOpen, defaultMode, ...props }: DashboardLayoutProps): react_jsx_runtime.JSX.Element;
694
+ declare function DashboardLayout({ defaultPanelOpen, defaultMode, labeledRail, ...props }: DashboardLayoutProps): react_jsx_runtime.JSX.Element;
679
695
 
680
696
  /** A sub-destination revealed inside a nav item's right-flyout. */
681
697
  interface SidebarLayoutFlyoutItem {
package/dist/dashboard.js CHANGED
@@ -52,7 +52,7 @@ import {
52
52
  canAdminSandbox,
53
53
  parseInsufficientBalance,
54
54
  useSidebar
55
- } from "./chunk-75Z5H43I.js";
55
+ } from "./chunk-Y2G5LHYJ.js";
56
56
  import {
57
57
  BillingDashboard,
58
58
  InfoPanel,
@@ -61,7 +61,7 @@ import {
61
61
  UsageChart,
62
62
  formatPrice
63
63
  } from "./chunk-2XNT74ZX.js";
64
- import "./chunk-7ZA5SEK3.js";
64
+ import "./chunk-QHIA75U3.js";
65
65
  import {
66
66
  BackendSelector,
67
67
  HARNESS_BRAND,
package/dist/globals.css CHANGED
@@ -39,12 +39,12 @@
39
39
  --container-sm: 24rem;
40
40
  --container-md: 28rem;
41
41
  --container-lg: 32rem;
42
+ --container-xl: 36rem;
42
43
  --container-2xl: 42rem;
43
44
  --container-3xl: 48rem;
44
45
  --container-4xl: 56rem;
45
46
  --container-5xl: 64rem;
46
47
  --container-6xl: 72rem;
47
- --container-7xl: 80rem;
48
48
  --text-xs: 0.75rem;
49
49
  --text-xs--line-height: calc(1 / 0.75);
50
50
  --text-sm: 0.875rem;
@@ -1033,9 +1033,6 @@
1033
1033
  .max-w-6xl {
1034
1034
  max-width: var(--container-6xl);
1035
1035
  }
1036
- .max-w-7xl {
1037
- max-width: var(--container-7xl);
1038
- }
1039
1036
  .max-w-\[14rem\] {
1040
1037
  max-width: 14rem;
1041
1038
  }
@@ -1093,6 +1090,9 @@
1093
1090
  .max-w-sm {
1094
1091
  max-width: var(--container-sm);
1095
1092
  }
1093
+ .max-w-xl {
1094
+ max-width: var(--container-xl);
1095
+ }
1096
1096
  .min-w-0 {
1097
1097
  min-width: calc(var(--spacing) * 0);
1098
1098
  }
@@ -2475,6 +2475,27 @@
2475
2475
  .text-\[calc\(var\(--font-size-xs\)-1px\)\] {
2476
2476
  font-size: calc(var(--font-size-xs) - 1px);
2477
2477
  }
2478
+ .text-\[length\:var\(--font-size-3xl\,1\.875rem\)\] {
2479
+ font-size: var(--font-size-3xl,1.875rem);
2480
+ }
2481
+ .text-\[length\:var\(--font-size-base\,0\.9375rem\)\] {
2482
+ font-size: var(--font-size-base,0.9375rem);
2483
+ }
2484
+ .text-\[length\:var\(--font-size-display\,3rem\)\] {
2485
+ font-size: var(--font-size-display,3rem);
2486
+ }
2487
+ .text-\[length\:var\(--font-size-hero\,2\.5rem\)\] {
2488
+ font-size: var(--font-size-hero,2.5rem);
2489
+ }
2490
+ .text-\[length\:var\(--font-size-lg\,1rem\)\] {
2491
+ font-size: var(--font-size-lg,1rem);
2492
+ }
2493
+ .text-\[length\:var\(--font-size-sm\,0\.75rem\)\] {
2494
+ font-size: var(--font-size-sm,0.75rem);
2495
+ }
2496
+ .text-\[length\:var\(--font-size-xl\,1\.25rem\)\] {
2497
+ font-size: var(--font-size-xl,1.25rem);
2498
+ }
2478
2499
  .leading-6 {
2479
2500
  --tw-leading: calc(var(--spacing) * 6);
2480
2501
  line-height: calc(var(--spacing) * 6);
@@ -2487,6 +2508,18 @@
2487
2508
  --tw-leading: calc(var(--spacing) * 7);
2488
2509
  line-height: calc(var(--spacing) * 7);
2489
2510
  }
2511
+ .leading-\[1\.1\] {
2512
+ --tw-leading: 1.1;
2513
+ line-height: 1.1;
2514
+ }
2515
+ .leading-\[1\.3\] {
2516
+ --tw-leading: 1.3;
2517
+ line-height: 1.3;
2518
+ }
2519
+ .leading-\[1\.4\] {
2520
+ --tw-leading: 1.4;
2521
+ line-height: 1.4;
2522
+ }
2490
2523
  .leading-\[1\.6\] {
2491
2524
  --tw-leading: 1.6;
2492
2525
  line-height: 1.6;
@@ -2499,6 +2532,14 @@
2499
2532
  --tw-leading: var(--line-height-base);
2500
2533
  line-height: var(--line-height-base);
2501
2534
  }
2535
+ .leading-\[var\(--line-height-display\,1\.05\)\] {
2536
+ --tw-leading: var(--line-height-display,1.05);
2537
+ line-height: var(--line-height-display,1.05);
2538
+ }
2539
+ .leading-\[var\(--line-height-heading\,1\.15\)\] {
2540
+ --tw-leading: var(--line-height-heading,1.15);
2541
+ line-height: var(--line-height-heading,1.15);
2542
+ }
2502
2543
  .leading-none {
2503
2544
  --tw-leading: 1;
2504
2545
  line-height: 1;
@@ -2583,6 +2624,18 @@
2583
2624
  --tw-tracking: var(--chat-label-tracking,0.16em);
2584
2625
  letter-spacing: var(--chat-label-tracking,0.16em);
2585
2626
  }
2627
+ .tracking-\[var\(--tracking-snug\,-0\.01em\)\] {
2628
+ --tw-tracking: var(--tracking-snug,-0.01em);
2629
+ letter-spacing: var(--tracking-snug,-0.01em);
2630
+ }
2631
+ .tracking-\[var\(--tracking-tight\,-0\.02em\)\] {
2632
+ --tw-tracking: var(--tracking-tight,-0.02em);
2633
+ letter-spacing: var(--tracking-tight,-0.02em);
2634
+ }
2635
+ .tracking-\[var\(--tracking-wide\,0\.08em\)\] {
2636
+ --tw-tracking: var(--tracking-wide,0.08em);
2637
+ letter-spacing: var(--tracking-wide,0.08em);
2638
+ }
2586
2639
  .tracking-normal {
2587
2640
  --tw-tracking: var(--tracking-normal);
2588
2641
  letter-spacing: var(--tracking-normal);
@@ -3762,6 +3815,11 @@
3762
3815
  align-items: center;
3763
3816
  }
3764
3817
  }
3818
+ .sm\:items-start {
3819
+ @media (width >= 40rem) {
3820
+ align-items: flex-start;
3821
+ }
3822
+ }
3765
3823
  .sm\:justify-between {
3766
3824
  @media (width >= 40rem) {
3767
3825
  justify-content: space-between;
@@ -3863,11 +3921,6 @@
3863
3921
  align-items: center;
3864
3922
  }
3865
3923
  }
3866
- .md\:items-end {
3867
- @media (width >= 48rem) {
3868
- align-items: flex-end;
3869
- }
3870
- }
3871
3924
  .md\:justify-between {
3872
3925
  @media (width >= 48rem) {
3873
3926
  justify-content: space-between;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { ArtifactPane, ArtifactPaneProps, Avatar, AvatarFallback, AvatarImage, Badge, BadgeProps, Button, ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CodeBlock, CodeBlockProps, CopyButton, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropZone, DropZoneProps, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStateProps, InlineCode, InlineCodeProps, Input, InputProps, Label, Progress, SegmentedControl, SegmentedControlOption, SegmentedControlProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SidebarDropZone, SidebarDropZoneProps, Skeleton, SkeletonCard, SkeletonTable, StatCard, StatCardProps, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TerminalDisplay, TerminalCursor as TerminalDisplayCursor, TerminalInput as TerminalDisplayInput, TerminalLine as TerminalDisplayLine, Textarea, TextareaProps, ThemeToggle, Toast, ToastContainer, ToastProvider, UploadFile, UploadProgress, UploadProgressProps, badgeVariants, buttonVariants, useTheme, useToast } from '@tangle-network/ui/primitives';
2
- export { Logo, LogoProps, TangleKnot } from './primitives.js';
2
+ export { L as Logo, a as LogoProps, T as TangleKnot } from './logo-CZ6moVvw.js';
3
3
  export { CodeBlock as CodeBlockDisplay, Markdown, MarkdownProps } from '@tangle-network/ui/markdown';
4
4
  export { AgentWorkbench, ApprovalConfidenceStat, ApprovalItem, ApprovalQueue, ApprovalQueueProps, AuditCheck, AuditResults, AuditResultsProps, BannerType, CalendarEvent, CalendarView, CalendarViewProps, ContextBadge, DirectoryPane, DirectoryPaneProps, FormAudit, RuntimePane, RuntimePaneProps, SESSION_CREATED_EVENT, SandboxWorkbench, SandboxWorkbenchArtifact, SandboxWorkbenchCustomArtifact, SandboxWorkbenchFileArtifact, SandboxWorkbenchLayoutOptions, SandboxWorkbenchMarkdownArtifact, SandboxWorkbenchOpenUIArtifact, SandboxWorkbenchProps, SandboxWorkbenchSessionProps, SessionActivityMonitor, SessionActivityMonitorProps, SessionCreatedDetail, SessionOptimisticController, SessionSidebar, SessionSidebarBadge, SessionSidebarFilter, SessionSidebarItem, SessionSidebarLink, SessionSidebarProps, ShellShouldRevalidateArgs, ShellShouldRevalidateOptions, StatusBanner, StatusBannerProps, StatusBar, StatusBarProps, TaskBoard, TaskBoardColumn, TaskBoardItem, TaskBoardProps, TerminalLine, TerminalPanel, TerminalProps, UseOptimisticSessionItemsOptions, WorkspaceLayout, WorkspaceLayoutProps, createShellShouldRevalidate, dispatchSessionCreated, shellShouldRevalidate, useOptimisticSessionItems } from './workspace.js';
5
5
  export { OpenUIAction, OpenUIActionsNode, OpenUIArtifactRenderer, OpenUIArtifactRendererProps, OpenUIBadgeNode, OpenUICardNode, OpenUICodeNode, OpenUIComponentNode, OpenUIGridNode, OpenUIHeadingNode, OpenUIKeyValueNode, OpenUIMarkdownNode, OpenUIPrimitive, OpenUISeparatorNode, OpenUIStackNode, OpenUIStatNode, OpenUITableNode, OpenUITextNode } from '@tangle-network/ui/openui';
package/dist/index.js CHANGED
@@ -199,7 +199,7 @@ import {
199
199
  canAdminSandbox,
200
200
  parseInsufficientBalance,
201
201
  useSidebar
202
- } from "./chunk-75Z5H43I.js";
202
+ } from "./chunk-Y2G5LHYJ.js";
203
203
  import {
204
204
  BillingDashboard,
205
205
  InfoPanel,
@@ -294,7 +294,7 @@ import {
294
294
  buttonVariants,
295
295
  useTheme,
296
296
  useToast
297
- } from "./chunk-7ZA5SEK3.js";
297
+ } from "./chunk-QHIA75U3.js";
298
298
  import {
299
299
  BackendSelector,
300
300
  HARNESS_BRAND,
@@ -0,0 +1,18 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface LogoProps {
4
+ variant?: "sandbox";
5
+ size?: "sm" | "md" | "lg" | "xl";
6
+ className?: string;
7
+ iconOnly?: boolean;
8
+ }
9
+ declare function TangleKnot({ size, className }: {
10
+ size: number;
11
+ className?: string;
12
+ }): react_jsx_runtime.JSX.Element;
13
+ declare function Logo({ variant, size, className, iconOnly }: LogoProps): react_jsx_runtime.JSX.Element;
14
+ declare namespace Logo {
15
+ var displayName: string;
16
+ }
17
+
18
+ export { Logo as L, TangleKnot as T, type LogoProps as a };
package/dist/pages.js CHANGED
@@ -15,6 +15,7 @@ import {
15
15
  DialogHeader,
16
16
  DialogTitle,
17
17
  Input,
18
+ PageHeader,
18
19
  Select,
19
20
  SelectContent,
20
21
  SelectItem,
@@ -22,7 +23,7 @@ import {
22
23
  SelectValue,
23
24
  Switch,
24
25
  Textarea
25
- } from "./chunk-7ZA5SEK3.js";
26
+ } from "./chunk-QHIA75U3.js";
26
27
  import "./chunk-NMR2CTGP.js";
27
28
  import {
28
29
  cn
@@ -2547,7 +2548,7 @@ function parseEnvText(text) {
2547
2548
  }
2548
2549
 
2549
2550
  // src/pages/secrets-page.tsx
2550
- import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
2551
+ import { Fragment as Fragment2, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
2551
2552
  var MAX_IMPORT_FILE_BYTES = 256 * 1024;
2552
2553
  function SecretsPage({ apiClient, className, teamSecretsHint }) {
2553
2554
  const [secrets, setSecrets] = React6.useState([]);
@@ -2724,39 +2725,40 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2724
2725
  return dateStr;
2725
2726
  }
2726
2727
  };
2727
- return /* @__PURE__ */ jsxs7("div", { className: cn("mx-auto w-full max-w-7xl space-y-8", className), children: [
2728
- /* @__PURE__ */ jsxs7("div", { className: "flex flex-col gap-4 md:flex-row md:items-end md:justify-between", children: [
2729
- /* @__PURE__ */ jsxs7("div", { children: [
2730
- /* @__PURE__ */ jsx7("h1", { className: "font-display text-3xl font-extrabold tracking-tight text-foreground", children: "Environment Secrets" }),
2731
- /* @__PURE__ */ jsx7("p", { className: "mt-1 text-sm text-muted-foreground", children: "Secrets are securely stored and automatically exposed as environment variables across all your sandboxes." })
2732
- ] }),
2733
- /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-3", children: [
2734
- /* @__PURE__ */ jsxs7(
2735
- "button",
2736
- {
2737
- type: "button",
2738
- onClick: () => setIsImportOpen(true),
2739
- className: "inline-flex items-center gap-2 rounded-lg border border-border bg-card px-4 py-2.5 text-sm font-semibold text-foreground hover:bg-muted transition-colors active:scale-[0.97]",
2740
- children: [
2741
- /* @__PURE__ */ jsx7(Upload, { className: "h-4 w-4" }),
2742
- "Import .env"
2743
- ]
2744
- }
2745
- ),
2746
- /* @__PURE__ */ jsxs7(
2747
- "button",
2748
- {
2749
- type: "button",
2750
- onClick: () => setIsCreateOpen(true),
2751
- className: "inline-flex items-center gap-2 rounded-lg bg-[var(--btn-primary-bg)] border border-[var(--border-accent,transparent)] px-5 py-2.5 text-sm font-semibold text-[var(--btn-primary-text)] hover:bg-[var(--btn-primary-hover)] transition-colors active:scale-[0.97]",
2752
- children: [
2753
- /* @__PURE__ */ jsx7(Plus3, { className: "h-4 w-4" }),
2754
- "New Secret"
2755
- ]
2756
- }
2757
- )
2758
- ] })
2759
- ] }),
2728
+ return /* @__PURE__ */ jsxs7("div", { className: cn("mx-auto w-full max-w-6xl space-y-8", className), children: [
2729
+ /* @__PURE__ */ jsx7(
2730
+ PageHeader,
2731
+ {
2732
+ title: "Environment Secrets",
2733
+ description: "Secrets are securely stored and automatically exposed as environment variables across all your sandboxes.",
2734
+ action: /* @__PURE__ */ jsxs7(Fragment2, { children: [
2735
+ /* @__PURE__ */ jsxs7(
2736
+ "button",
2737
+ {
2738
+ type: "button",
2739
+ onClick: () => setIsImportOpen(true),
2740
+ className: "inline-flex items-center gap-2 rounded-lg border border-border bg-card px-4 py-2.5 text-sm font-semibold text-foreground hover:bg-muted transition-colors active:scale-[0.97]",
2741
+ children: [
2742
+ /* @__PURE__ */ jsx7(Upload, { className: "h-4 w-4" }),
2743
+ "Import .env"
2744
+ ]
2745
+ }
2746
+ ),
2747
+ /* @__PURE__ */ jsxs7(
2748
+ "button",
2749
+ {
2750
+ type: "button",
2751
+ onClick: () => setIsCreateOpen(true),
2752
+ className: "inline-flex items-center gap-2 rounded-lg bg-[var(--btn-primary-bg)] border border-[var(--border-accent,transparent)] px-5 py-2.5 text-sm font-semibold text-[var(--btn-primary-text)] hover:bg-[var(--btn-primary-hover)] transition-colors active:scale-[0.97]",
2753
+ children: [
2754
+ /* @__PURE__ */ jsx7(Plus3, { className: "h-4 w-4" }),
2755
+ "New Secret"
2756
+ ]
2757
+ }
2758
+ )
2759
+ ] })
2760
+ }
2761
+ ),
2760
2762
  teamSecretsHint && /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-3 rounded-lg border border-border bg-[var(--accent-surface-soft)]/40 px-4 py-3", children: [
2761
2763
  /* @__PURE__ */ jsx7(Users, { className: "h-5 w-5 shrink-0 text-[var(--accent-text)]", "aria-hidden": "true" }),
2762
2764
  /* @__PURE__ */ jsxs7("div", { className: "flex-1 text-sm", children: [
@@ -3571,25 +3573,26 @@ function StartupScriptsPage({ apiClient, className }) {
3571
3573
  }));
3572
3574
  };
3573
3575
  const activeCount = scripts.filter((s) => s.enabled).length;
3574
- return /* @__PURE__ */ jsxs9("div", { className: cn("mx-auto w-full max-w-7xl space-y-6", className), children: [
3575
- /* @__PURE__ */ jsxs9("div", { className: "flex flex-col gap-4 md:flex-row md:items-end md:justify-between", children: [
3576
- /* @__PURE__ */ jsxs9("div", { children: [
3577
- /* @__PURE__ */ jsx9("h1", { className: "font-display text-3xl font-extrabold tracking-tight text-foreground", children: "Startup Scripts" }),
3578
- /* @__PURE__ */ jsx9("p", { className: "mt-1 text-sm text-muted-foreground", children: "Define scripts that run automatically when your sandboxes start. Scripts can access your encrypted secrets." })
3579
- ] }),
3580
- /* @__PURE__ */ jsxs9(
3581
- "button",
3582
- {
3583
- type: "button",
3584
- onClick: openCreate,
3585
- className: "inline-flex items-center gap-2 rounded-lg bg-[var(--btn-primary-bg)] px-4 py-2.5 text-sm font-bold text-[var(--btn-primary-text)] shadow-sm transition-colors hover:bg-[var(--btn-primary-hover)]",
3586
- children: [
3587
- /* @__PURE__ */ jsx9(Plus4, { className: "h-4 w-4" }),
3588
- "New Script"
3589
- ]
3590
- }
3591
- )
3592
- ] }),
3576
+ return /* @__PURE__ */ jsxs9("div", { className: cn("mx-auto w-full max-w-6xl space-y-8", className), children: [
3577
+ /* @__PURE__ */ jsx9(
3578
+ PageHeader,
3579
+ {
3580
+ title: "Startup Scripts",
3581
+ description: "Define scripts that run automatically when your sandboxes start. Scripts can access your encrypted secrets.",
3582
+ action: /* @__PURE__ */ jsxs9(
3583
+ "button",
3584
+ {
3585
+ type: "button",
3586
+ onClick: openCreate,
3587
+ className: "inline-flex items-center gap-2 rounded-lg bg-[var(--btn-primary-bg)] px-4 py-2.5 text-sm font-bold text-[var(--btn-primary-text)] shadow-sm transition-colors hover:bg-[var(--btn-primary-hover)]",
3588
+ children: [
3589
+ /* @__PURE__ */ jsx9(Plus4, { className: "h-4 w-4" }),
3590
+ "New Script"
3591
+ ]
3592
+ }
3593
+ )
3594
+ }
3595
+ ),
3593
3596
  /* @__PURE__ */ jsxs9("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-4", children: [
3594
3597
  /* @__PURE__ */ jsxs9("div", { className: "rounded-lg border border-border bg-card p-5 shadow-[var(--shadow-card)]", children: [
3595
3598
  /* @__PURE__ */ jsx9("p", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: "Total Scripts" }),
@@ -1,19 +1,61 @@
1
1
  export { Avatar, AvatarFallback, AvatarImage, Badge, BadgeProps, Button, ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CodeBlock, CodeBlockProps, CopyButton, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropZone, DropZoneProps, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStateProps, InlineCode, InlineCodeProps, Input, InputProps, Label, Progress, SegmentedControl, SegmentedControlOption, SegmentedControlProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SidebarDropZone, SidebarDropZoneProps, Skeleton, SkeletonCard, SkeletonTable, StatCard, StatCardProps, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TerminalCursor, TerminalDisplay, TerminalInput, TerminalLine, Textarea, TextareaProps, ThemeToggle, Toast, ToastContainer, ToastProvider, UploadFile, UploadProgress, UploadProgressProps, badgeVariants, buttonVariants, useTheme, useToast } from '@tangle-network/ui/primitives';
2
+ export { L as Logo, a as LogoProps, T as TangleKnot } from './logo-CZ6moVvw.js';
2
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ import { ElementType, ReactNode } from 'react';
3
5
 
4
- interface LogoProps {
5
- variant?: "sandbox";
6
- size?: "sm" | "md" | "lg" | "xl";
6
+ /**
7
+ * Canonical type roles for the Tangle design system. Every title in every
8
+ * product app should be a Heading (or a PageHeader / SectionTitle composite
9
+ * built on it) so size, weight, tracking, and leading stay identical across
10
+ * surfaces. Sizes/leadings/tracking resolve from @tangle-network/brand tokens
11
+ * (with literal fallbacks so the component still renders if brand styles are
12
+ * absent, e.g. in isolation tests or Storybook).
13
+ *
14
+ * Weights are deliberately quiet (Tangle Quiet): heroes at 700, titles at 600
15
+ * — never extrabold.
16
+ */
17
+ type HeadingRole = "display" | "hero" | "page" | "section" | "subsection" | "eyebrow";
18
+ interface HeadingProps {
19
+ role: HeadingRole;
20
+ /** Override the rendered element (defaults to the semantic tag for the role). */
21
+ as?: ElementType;
7
22
  className?: string;
8
- iconOnly?: boolean;
23
+ children: ReactNode;
24
+ id?: string;
9
25
  }
10
- declare function TangleKnot({ size, className }: {
11
- size: number;
26
+ declare function Heading({ role, as, className, children, ...rest }: HeadingProps): react_jsx_runtime.JSX.Element;
27
+ interface PageHeaderProps {
28
+ title: ReactNode;
29
+ description?: ReactNode;
30
+ /** Uppercase label rendered above the title. */
31
+ eyebrow?: ReactNode;
32
+ /** Primary action(s), right-aligned on wide viewports. */
33
+ action?: ReactNode;
12
34
  className?: string;
13
- }): react_jsx_runtime.JSX.Element;
14
- declare function Logo({ variant, size, className, iconOnly }: LogoProps): react_jsx_runtime.JSX.Element;
15
- declare namespace Logo {
16
- var displayName: string;
35
+ /** Override the title element (default h1). */
36
+ titleAs?: ElementType;
17
37
  }
38
+ /**
39
+ * Standard page header: one title size, one description style, one action
40
+ * slot — used by every page so titles never drift between surfaces.
41
+ */
42
+ declare function PageHeader({ title, description, eyebrow, action, className, titleAs, }: PageHeaderProps): react_jsx_runtime.JSX.Element;
43
+ interface SectionTitleProps {
44
+ title: ReactNode;
45
+ description?: ReactNode;
46
+ action?: ReactNode;
47
+ className?: string;
48
+ }
49
+ /** Section heading inside a page — smaller than PageHeader, same rhythm. */
50
+ declare function SectionTitle({ title, description, action, className, }: SectionTitleProps): react_jsx_runtime.JSX.Element;
51
+ interface PageShellProps {
52
+ children: ReactNode;
53
+ className?: string;
54
+ }
55
+ /**
56
+ * Canonical page container — one max-width, one gutter, one vertical rhythm
57
+ * so every page sits on the same grid. Gutter widens on large viewports.
58
+ */
59
+ declare function PageShell({ children, className }: PageShellProps): react_jsx_runtime.JSX.Element;
18
60
 
19
- export { Logo, type LogoProps, TangleKnot };
61
+ export { Heading, type HeadingProps, type HeadingRole, PageHeader, type PageHeaderProps, PageShell, type PageShellProps, SectionTitle, type SectionTitleProps };
@@ -39,11 +39,15 @@ import {
39
39
  DropdownMenuSubTrigger,
40
40
  DropdownMenuTrigger,
41
41
  EmptyState,
42
+ Heading,
42
43
  InlineCode,
43
44
  Input,
44
45
  Label,
45
46
  Logo,
47
+ PageHeader,
48
+ PageShell,
46
49
  Progress,
50
+ SectionTitle,
47
51
  SegmentedControl,
48
52
  Select,
49
53
  SelectContent,
@@ -87,7 +91,7 @@ import {
87
91
  buttonVariants,
88
92
  useTheme,
89
93
  useToast
90
- } from "./chunk-7ZA5SEK3.js";
94
+ } from "./chunk-QHIA75U3.js";
91
95
  import "./chunk-EI44GEQ5.js";
92
96
  export {
93
97
  Avatar,
@@ -130,11 +134,15 @@ export {
130
134
  DropdownMenuSubTrigger,
131
135
  DropdownMenuTrigger,
132
136
  EmptyState,
137
+ Heading,
133
138
  InlineCode,
134
139
  Input,
135
140
  Label,
136
141
  Logo,
142
+ PageHeader,
143
+ PageShell,
137
144
  Progress,
145
+ SectionTitle,
138
146
  SegmentedControl,
139
147
  Select,
140
148
  SelectContent,
package/dist/styles.css CHANGED
@@ -39,12 +39,12 @@
39
39
  --container-sm: 24rem;
40
40
  --container-md: 28rem;
41
41
  --container-lg: 32rem;
42
+ --container-xl: 36rem;
42
43
  --container-2xl: 42rem;
43
44
  --container-3xl: 48rem;
44
45
  --container-4xl: 56rem;
45
46
  --container-5xl: 64rem;
46
47
  --container-6xl: 72rem;
47
- --container-7xl: 80rem;
48
48
  --text-xs: 0.75rem;
49
49
  --text-xs--line-height: calc(1 / 0.75);
50
50
  --text-sm: 0.875rem;
@@ -1033,9 +1033,6 @@
1033
1033
  .max-w-6xl {
1034
1034
  max-width: var(--container-6xl);
1035
1035
  }
1036
- .max-w-7xl {
1037
- max-width: var(--container-7xl);
1038
- }
1039
1036
  .max-w-\[14rem\] {
1040
1037
  max-width: 14rem;
1041
1038
  }
@@ -1093,6 +1090,9 @@
1093
1090
  .max-w-sm {
1094
1091
  max-width: var(--container-sm);
1095
1092
  }
1093
+ .max-w-xl {
1094
+ max-width: var(--container-xl);
1095
+ }
1096
1096
  .min-w-0 {
1097
1097
  min-width: calc(var(--spacing) * 0);
1098
1098
  }
@@ -2475,6 +2475,27 @@
2475
2475
  .text-\[calc\(var\(--font-size-xs\)-1px\)\] {
2476
2476
  font-size: calc(var(--font-size-xs) - 1px);
2477
2477
  }
2478
+ .text-\[length\:var\(--font-size-3xl\,1\.875rem\)\] {
2479
+ font-size: var(--font-size-3xl,1.875rem);
2480
+ }
2481
+ .text-\[length\:var\(--font-size-base\,0\.9375rem\)\] {
2482
+ font-size: var(--font-size-base,0.9375rem);
2483
+ }
2484
+ .text-\[length\:var\(--font-size-display\,3rem\)\] {
2485
+ font-size: var(--font-size-display,3rem);
2486
+ }
2487
+ .text-\[length\:var\(--font-size-hero\,2\.5rem\)\] {
2488
+ font-size: var(--font-size-hero,2.5rem);
2489
+ }
2490
+ .text-\[length\:var\(--font-size-lg\,1rem\)\] {
2491
+ font-size: var(--font-size-lg,1rem);
2492
+ }
2493
+ .text-\[length\:var\(--font-size-sm\,0\.75rem\)\] {
2494
+ font-size: var(--font-size-sm,0.75rem);
2495
+ }
2496
+ .text-\[length\:var\(--font-size-xl\,1\.25rem\)\] {
2497
+ font-size: var(--font-size-xl,1.25rem);
2498
+ }
2478
2499
  .leading-6 {
2479
2500
  --tw-leading: calc(var(--spacing) * 6);
2480
2501
  line-height: calc(var(--spacing) * 6);
@@ -2487,6 +2508,18 @@
2487
2508
  --tw-leading: calc(var(--spacing) * 7);
2488
2509
  line-height: calc(var(--spacing) * 7);
2489
2510
  }
2511
+ .leading-\[1\.1\] {
2512
+ --tw-leading: 1.1;
2513
+ line-height: 1.1;
2514
+ }
2515
+ .leading-\[1\.3\] {
2516
+ --tw-leading: 1.3;
2517
+ line-height: 1.3;
2518
+ }
2519
+ .leading-\[1\.4\] {
2520
+ --tw-leading: 1.4;
2521
+ line-height: 1.4;
2522
+ }
2490
2523
  .leading-\[1\.6\] {
2491
2524
  --tw-leading: 1.6;
2492
2525
  line-height: 1.6;
@@ -2499,6 +2532,14 @@
2499
2532
  --tw-leading: var(--line-height-base);
2500
2533
  line-height: var(--line-height-base);
2501
2534
  }
2535
+ .leading-\[var\(--line-height-display\,1\.05\)\] {
2536
+ --tw-leading: var(--line-height-display,1.05);
2537
+ line-height: var(--line-height-display,1.05);
2538
+ }
2539
+ .leading-\[var\(--line-height-heading\,1\.15\)\] {
2540
+ --tw-leading: var(--line-height-heading,1.15);
2541
+ line-height: var(--line-height-heading,1.15);
2542
+ }
2502
2543
  .leading-none {
2503
2544
  --tw-leading: 1;
2504
2545
  line-height: 1;
@@ -2583,6 +2624,18 @@
2583
2624
  --tw-tracking: var(--chat-label-tracking,0.16em);
2584
2625
  letter-spacing: var(--chat-label-tracking,0.16em);
2585
2626
  }
2627
+ .tracking-\[var\(--tracking-snug\,-0\.01em\)\] {
2628
+ --tw-tracking: var(--tracking-snug,-0.01em);
2629
+ letter-spacing: var(--tracking-snug,-0.01em);
2630
+ }
2631
+ .tracking-\[var\(--tracking-tight\,-0\.02em\)\] {
2632
+ --tw-tracking: var(--tracking-tight,-0.02em);
2633
+ letter-spacing: var(--tracking-tight,-0.02em);
2634
+ }
2635
+ .tracking-\[var\(--tracking-wide\,0\.08em\)\] {
2636
+ --tw-tracking: var(--tracking-wide,0.08em);
2637
+ letter-spacing: var(--tracking-wide,0.08em);
2638
+ }
2586
2639
  .tracking-normal {
2587
2640
  --tw-tracking: var(--tracking-normal);
2588
2641
  letter-spacing: var(--tracking-normal);
@@ -3762,6 +3815,11 @@
3762
3815
  align-items: center;
3763
3816
  }
3764
3817
  }
3818
+ .sm\:items-start {
3819
+ @media (width >= 40rem) {
3820
+ align-items: flex-start;
3821
+ }
3822
+ }
3765
3823
  .sm\:justify-between {
3766
3824
  @media (width >= 40rem) {
3767
3825
  justify-content: space-between;
@@ -3863,11 +3921,6 @@
3863
3921
  align-items: center;
3864
3922
  }
3865
3923
  }
3866
- .md\:items-end {
3867
- @media (width >= 48rem) {
3868
- align-items: flex-end;
3869
- }
3870
- }
3871
3924
  .md\:justify-between {
3872
3925
  @media (width >= 48rem) {
3873
3926
  justify-content: space-between;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "0.34.0",
3
+ "version": "0.36.0",
4
4
  "description": "Unified UI component library for Tangle Sandbox — primitives, chat, dashboard, terminal, editor, and workspace components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -118,7 +118,7 @@
118
118
  "@tangle-network/ui": "^1.0.1",
119
119
  "react": "^18 || ^19",
120
120
  "react-dom": "^18 || ^19",
121
- "@tangle-network/agent-interface": "^0.9.0"
121
+ "@tangle-network/agent-interface": ">=0.10.0 <1.0.0"
122
122
  },
123
123
  "peerDependenciesMeta": {
124
124
  "@xterm/xterm": {
@@ -199,6 +199,6 @@
199
199
  "vite": "^8.0.5",
200
200
  "vitest": "^4.1.3",
201
201
  "yjs": "^13.6.30",
202
- "@tangle-network/agent-interface": "^0.9.0"
202
+ "@tangle-network/agent-interface": ">=0.10.0 <1.0.0"
203
203
  }
204
204
  }