@tangle-network/sandbox-ui 0.132.0 → 0.132.2

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.
@@ -1,4 +1,4 @@
1
- import { A as wfEdgeId, D as isStructuralKind, E as buildWorkflowGraph, F as shortModel, I as clampPreview, L as fmtCost, R as fmtDuration, S as COMPACT_NODE_SIZE, _ as kindAccent, a as NodeMark, b as problemTitle, c as RESTING_SHADOW, g as emptySlotLabel, h as edgeColor, j as worstSeverity, k as triggerNodeIndex, l as STATUS_COLOR, m as StatusPill, n as classifyOutput, o as ProblemMarker, p as StatusFooter, s as ProblemMessages, t as NodeOutputBody, u as STATUS_LABEL, v as problemBorder, x as statusBorder, y as problemSurface, z as fmtTokens } from "./node-output-BdfG5lt4.js";
1
+ import { A as triggerNodeIndex, B as fmtTokens, C as COMPACT_NODE_SIZE, D as buildWorkflowGraph, I as shortModel, L as clampPreview, M as worstSeverity, O as isStructuralKind, R as fmtCost, S as statusBorder, _ as emptySlotLabel, a as NodeMark, b as problemSurface, c as RESTING_BORDER, d as STATUS_LABEL, g as edgeColor, h as StatusPill, j as wfEdgeId, l as RESTING_SHADOW, m as StatusFooter, n as classifyOutput, o as ProblemMarker, s as ProblemMessages, t as NodeOutputBody, u as STATUS_COLOR, v as kindAccent, x as problemTitle, y as problemBorder, z as fmtDuration } from "./node-output-BC5ZQ8R6.js";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
4
4
  import { Maximize2, Minimize2, Plus, X } from "lucide-react";
@@ -668,7 +668,7 @@ function WorkflowNode({ id, data, sourcePosition, targetPosition }) {
668
668
  width: 76,
669
669
  height: 76,
670
670
  ...state ? statusBorder(state.status) : problemSeverity ? problemBorder(problemSeverity) : {
671
- borderColor: `color-mix(in srgb, ${accent} 45%, hsl(var(--border)))`,
671
+ borderColor: RESTING_BORDER,
672
672
  boxShadow: RESTING_SHADOW
673
673
  },
674
674
  ...selected ? SELECTION_OUTLINE : {}
@@ -733,12 +733,20 @@ function WorkflowNode({ id, data, sourcePosition, targetPosition }) {
733
733
  className: "relative flex h-full w-full flex-col overflow-hidden rounded-xl border bg-card shadow-sm transition-colors",
734
734
  style: {
735
735
  ...runStatus ? statusBorder(runStatus) : problemSeverity ? problemBorder(problemSeverity) : {
736
- borderColor: `color-mix(in srgb, ${accent} 45%, hsl(var(--border)))`,
736
+ borderColor: RESTING_BORDER,
737
737
  boxShadow: RESTING_SHADOW
738
738
  },
739
739
  ...selected ? SELECTION_OUTLINE : {}
740
740
  },
741
- children: [handles, children]
741
+ children: [
742
+ handles,
743
+ /* @__PURE__ */ jsx("span", {
744
+ "aria-hidden": true,
745
+ className: "pointer-events-none absolute inset-x-0 top-0 h-0.5",
746
+ style: { background: `color-mix(in srgb, ${accent} 70%, transparent)` }
747
+ }),
748
+ children
749
+ ]
742
750
  });
743
751
  const identityRow = /* @__PURE__ */ jsxs("div", {
744
752
  className: "flex shrink-0 items-center gap-2.5",
@@ -539,7 +539,7 @@ function RailFlyout({ icon: Icon, label, isActive, showLabel, title, children, c
539
539
  },
540
540
  className: cn$1("absolute left-full top-0 z-50 ml-2 min-w-[12rem] p-1.5", "agent-pop-in", "rounded-md border border-[var(--md3-outline-variant)] bg-surface-container-highest shadow-[0_8px_30px_rgba(0,0,0,0.45)] ring-1 ring-[#ffffff14]"),
541
541
  children: [/* @__PURE__ */ jsx("p", {
542
- className: "px-2 pb-1 pt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground/70 select-none",
542
+ className: "px-2 pb-1 pt-1 text-sm font-semibold uppercase tracking-wider text-muted-foreground/70 select-none",
543
543
  children: title ?? label
544
544
  }), children]
545
545
  })]
@@ -677,7 +677,7 @@ function RailExpandable({ icon: Icon, label, href, isActive, showLabel, subItems
677
677
  }, item.id);
678
678
  };
679
679
  const list = loading ? /* @__PURE__ */ jsx(SubItemsSkeleton, {}) : items && items.length > 0 ? items.map(subLink) : /* @__PURE__ */ jsx("p", {
680
- className: "px-2.5 py-1.5 text-xs text-muted-foreground",
680
+ className: "px-2.5 py-1.5 text-sm text-muted-foreground",
681
681
  children: emptyLabel
682
682
  });
683
683
  if (!showLabel) {
@@ -757,7 +757,7 @@ function RailExpandable({ icon: Icon, label, href, isActive, showLabel, subItems
757
757
  },
758
758
  className: cn$1("agent-pop-in z-[70] flex w-60 flex-col overflow-hidden p-1.5", "rounded-md border border-[var(--md3-outline-variant)] bg-surface-container-highest shadow-[0_8px_30px_rgba(0,0,0,0.45)] ring-1 ring-[#ffffff14]"),
759
759
  children: [/* @__PURE__ */ jsx("p", {
760
- className: "shrink-0 px-2 pb-1 pt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground/70 select-none",
760
+ className: "shrink-0 px-2 pb-1 pt-1 text-sm font-semibold uppercase tracking-wider text-muted-foreground/70 select-none",
761
761
  children: label
762
762
  }), /* @__PURE__ */ jsx("div", {
763
763
  className: "flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto",
@@ -911,7 +911,7 @@ function AppearanceMenuSection({ appearance, divider = true }) {
911
911
  }), /* @__PURE__ */ jsxs("div", {
912
912
  className: "flex min-w-0 flex-col leading-tight",
913
913
  children: [/* @__PURE__ */ jsx("span", { children: "Appearance" }), /* @__PURE__ */ jsx("span", {
914
- className: "text-xs text-muted-foreground",
914
+ className: "text-sm text-muted-foreground",
915
915
  children: caption
916
916
  })]
917
917
  })] }), /* @__PURE__ */ jsx(DropdownMenuSubContent, {
@@ -960,7 +960,7 @@ function ProfileAvatar({ user, isLoading = false, onLogout, onSettingsClick, set
960
960
  src: user.avatarUrl,
961
961
  alt: ""
962
962
  }), /* @__PURE__ */ jsx(AvatarFallback, {
963
- className: "text-xs font-medium bg-[var(--accent-surface-strong)] text-[var(--accent-text)]",
963
+ className: "text-sm font-medium bg-[var(--accent-surface-strong)] text-[var(--accent-text)]",
964
964
  children: getInitials(user?.name, user?.email)
965
965
  })]
966
966
  }), showDetails && /* @__PURE__ */ jsx("div", {
@@ -998,11 +998,11 @@ function ProfileAvatar({ user, isLoading = false, onLogout, onSettingsClick, set
998
998
  children: user?.name ?? user?.email ?? "Not logged in"
999
999
  }),
1000
1000
  user?.email && user?.name && /* @__PURE__ */ jsx("p", {
1001
- className: "text-xs text-muted-foreground truncate",
1001
+ className: "text-sm text-muted-foreground truncate",
1002
1002
  children: user.email
1003
1003
  }),
1004
1004
  user?.tier && /* @__PURE__ */ jsxs("p", {
1005
- className: "text-xs text-muted-foreground capitalize",
1005
+ className: "text-sm text-muted-foreground capitalize",
1006
1006
  children: [user.tier, " Plan"]
1007
1007
  })
1008
1008
  ] })
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-BQDUxrn5.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-De9PJUjT.js";
2
2
  import { n as canonicalModelId, r as modelBrandFor, t as ModelBrandStack } from "./model-brand-hMyDTUqB.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-2IRtfx51.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, 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
@@ -731,6 +731,10 @@
731
731
  width: calc(var(--spacing) * 2);
732
732
  height: calc(var(--spacing) * 2);
733
733
  }
734
+ .size-2\.5 {
735
+ width: calc(var(--spacing) * 2.5);
736
+ height: calc(var(--spacing) * 2.5);
737
+ }
734
738
  .size-3 {
735
739
  width: calc(var(--spacing) * 3);
736
740
  height: calc(var(--spacing) * 3);
@@ -797,6 +801,9 @@
797
801
  .\!h-2\.5 {
798
802
  height: calc(var(--spacing) * 2.5) !important;
799
803
  }
804
+ .h-0\.5 {
805
+ height: calc(var(--spacing) * 0.5);
806
+ }
800
807
  .h-1 {
801
808
  height: var(--spacing);
802
809
  }
@@ -788,6 +788,13 @@ type WorkspaceFilesPaneProps = WorkspaceFilesSource & {
788
788
  label?: string;
789
789
  /** Controls rendered in the files surface header. */
790
790
  headerActions?: ReactNode;
791
+ /**
792
+ * `card` (default) sets the tree in its own raised surface under a visible
793
+ * heading. `plain` is for a pane that already names the files, such as a
794
+ * companion tab: the tree sits on the pane's own surface, and the heading is
795
+ * kept for assistive technology only.
796
+ */
797
+ surface?: "card" | "plain";
791
798
  className?: string;
792
799
  style?: CSSProperties;
793
800
  };
@@ -796,7 +803,7 @@ type WorkspaceFilesPaneProps = WorkspaceFilesSource & {
796
803
  * The tree sits in its own surface: folders start collapsed, expansion is
797
804
  * remembered under `expansionKey`, and a preview replaces the tree until Back.
798
805
  */
799
- declare function WorkspaceFilesPane({ root, paths, selectedPath, onSelect, preview, onBack, emptyState, expansionKey, search, label, headerActions, className, style }: WorkspaceFilesPaneProps): import("react").JSX.Element;
806
+ declare function WorkspaceFilesPane({ root, paths, selectedPath, onSelect, preview, onBack, emptyState, expansionKey, search, label, headerActions, surface, className, style }: WorkspaceFilesPaneProps): import("react").JSX.Element;
800
807
  //#endregion
801
808
  //#region src/workspace/workspace-artifact-view.d.ts
802
809
  interface WorkspaceArtifactViewProps {
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ import { t as Session } from "./sidecar-DgH_vQ6m.js";
10
10
  import { d as useSessionStream, l as UseSessionStreamOptions, n as UseSidecarAuthOptions, o as SessionDegradation, r as useSidecarAuth, s as SessionInfo, t as SidecarAuth, u as UseSessionStreamResult } from "./use-sidecar-auth-CCTJcrq7.js";
11
11
  import { AgentStreamEvent, AppendUserMessageOptions, ApplySdkEventOptions, AuthUser, AutomationStreamEvent, BeginAssistantMessageOptions, BotStreamEvent, CompleteAssistantMessageOptions, RealtimeSessionOptions, RealtimeSessionRegistry, RealtimeSessionRegistryProps, RealtimeSessionState, RealtimeSessionTarget, SSEEvent, SandboxMetrics, SdkSessionAttachment, SdkSessionEvent, SdkSessionSeed, SidecarMetricsPayload, TaskStreamEvent, TerminalStreamEvent, UseAuthOptions, UseAuthResult, UseRunGroupsOptions, UseSSEStreamOptions, UseSSEStreamResult, UseSandboxMetricsOptions, UseSandboxMetricsResult, UseSdkSessionOptions, UseSdkSessionReturn, UseToolCallStreamReturn, createAuthFetcher, useApiKey, useAuth, useAutoScroll, useCreateSession, useDeleteSession, useDropdownMenu, useLiveTime, useRealtimeSession, useRenameSession, useRunCollapseState, useRunGroups, useSSEStream, useSandboxMetrics, useSdkSession, useSessions, useToolCallStream } from "./hooks.js";
12
12
  import { $ as ContextMenuRadioGroup, $n as Table, $r as TangleKnot, $t as MetricProps, A as Card, An as Sheet, Ar as Toolbar, At as DropdownMenuRadioItem, B as ChipProps, Bn as SidebarDropZone, Br as buttonVariants, Bt as FilterFieldProps, C as BadgeProps, Cn as SelectLabel, Cr as TimeSelect, Ct as DropdownMenuCheckboxItem, D as Calendar, Dn as SelectTrigger, Dr as ToastProvider, Dt as DropdownMenuLabel, E as CATEGORY_TONES, En as SelectSeparator, Er as ToastContainer, Et as DropdownMenuItem, F as CardTitle, Fn as SheetHeader, Fr as TooltipTrigger, Ft as DropdownMenuSubTrigger, G as CollapsibleTrigger, Gn as Slider, Gr as toneFor, Gt as IconTile, H as CodeBlockProps, Hn as Skeleton, Hr as initialsOf, Ht as HeadingVariant, I as CardTitleProps, In as SheetOverlay, Ir as UploadFile, It as DropdownMenuTrigger, J as ContextMenuContent, Jn as StatusPill, Jr as HeadingProps, Jt as InlineCodeProps, K as ContextMenu, Kn as StatCard, Kr as useTheme, Kt as IconTileProps, L as CategoryTone, Ln as SheetPortal, Lr as UploadProgress, Lt as EmptyState, M as CardDescription, Mn as SheetContent, Mr as Tooltip, Mt as DropdownMenuShortcut, N as CardFooter, Nn as SheetDescription, Nr as TooltipContent, Nt as DropdownMenuSub, O as CalendarDate, On as SelectValue, Or as Tone, Ot as DropdownMenuPortal, P as CardHeader, Pn as SheetFooter, Pr as TooltipProvider, Pt as DropdownMenuSubContent, Q as ContextMenuPortal, Qn as TONE_CLASSES, Qr as LogoProps, Qt as Metric, R as Checkbox, Rn as SheetTitle, Rr as UploadProgressProps, Rt as EmptyStateProps, S as Badge, Sn as SelectItem, Sr as ThemeToggle, St as DropdownMenu, T as ButtonProps, Tn as SelectScrollUpButton, Tr as Toast, Tt as DropdownMenuGroup, U as Collapsible, Un as SkeletonCard, Ur as localToday, Ut as HelpText, V as CodeBlock, Vn as SidebarDropZoneProps, Vr as formatCalendarDate, Vt as Heading, W as CollapsibleContent, Wn as SkeletonTable, Wr as parseCalendarDate, Wt as HelpTextProps, X as ContextMenuItem, Xn as StatusTone, Xr as SectionTitleProps, Xt as InputProps, Y as ContextMenuGroup, Yn as StatusPillProps, Yr as SectionTitle, Yt as Input, Z as ContextMenuLabel, Zn as Switch, Zr as Logo, Zt as Label, _n as SegmentedControlOption, _t as DialogPortal, a as AlertDialogCancel, an as PageShellProps, ar as TableHeader, at as ContextMenuSubTrigger, b as AvatarFallback, bn as SelectContent, br as Textarea, bt as DropZone, c as AlertDialogFooter, cn as Popover, cr as Tabs, ct as DatePicker, d as AlertDialogPortal, dn as PopoverContent, dr as TabsTrigger, dt as DialogClose, en as MetricStrip, er as TableBody, et as ContextMenuRadioItem, f as AlertDialogTitle, fn as PopoverTrigger, fr as Tag, ft as DialogContent, g as AlertTone, gn as SegmentedControl, gt as DialogOverlay, h as AlertTitle, hn as RadioGroupItem, hr as TerminalDisplay, ht as DialogHeader, i as AlertDialogAction, in as PageShell, ir as TableHead, it as ContextMenuSubContent, j as CardContent, jn as SheetClose, jr as ToolbarProps, jt as DropdownMenuSeparator, k as CalendarProps, kn as Separator, kr as ToneClasses, kt as DropdownMenuRadioGroup, l as AlertDialogHeader, ln as PopoverAnchor, lr as TabsContent, lt as DatePickerProps, m as AlertProps, mn as RadioGroup, mt as DialogFooter, n as AlertDescription, nn as PageHeader, nr as TableCell, nt as ContextMenuShortcut, o as AlertDialogContent, on as Pagination, or as TableProps, ot as ContextMenuTrigger, p as AlertDialogTrigger, pn as Progress, pr as TagProps, pt as DialogDescription, q as ContextMenuCheckboxItem, qn as StatCardProps, qr as useToast, qt as InlineCode, r as AlertDialog, rn as PageHeaderProps, rr as TableFooter, rt as ContextMenuSub, s as AlertDialogDescription, sn as PaginationProps, sr as TableRow, st as CopyButton, t as Alert, tn as MetricStripProps, tr as TableCaption, tt as ContextMenuSeparator, u as AlertDialogOverlay, un as PopoverClose, ur as TabsList, ut as Dialog, vn as SegmentedControlProps, vr as TextShimmer, vt as DialogTitle, w as Button, wn as SelectScrollDownButton, wr as TimeSelectProps, wt as DropdownMenuContent, x as AvatarImage, xn as SelectGroup, xr as TextareaProps, xt as DropZoneProps, y as Avatar, yn as Select, yr as TextShimmerProps, yt as DialogTrigger, z as Chip, zn as SheetTrigger, zr as badgeVariants, zt as FilterField } from "./index-N-Ha2lRZ.js";
13
- 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, a as WorkspaceFilesPane, at as DirectoryPaneProps, b as SandboxWorkbenchArtifact, c as ApprovalConfidenceStat, ct as WorkspaceLayout, d as ApprovalQueueProps, et as StatusBarProps, f as CalendarEvent, g as TaskBoardColumn, h as TaskBoard, i as WorkspaceArtifactViewProps, it as DirectoryPane, j as shellShouldRevalidate, k as ShellShouldRevalidateOptions, l as ApprovalItem, lt as WorkspaceLayoutProps, m as CalendarViewProps, n as ArtifactPaneProps, nt as StatusBanner, o as WorkspaceFilesPaneProps, ot as WorkspacePaneHeader, p as CalendarView, q as RuntimePane, r as WorkspaceArtifactView, rt as StatusBannerProps, s as WorkspaceFilesPreview, st as WorkspacePaneHeaderProps, t as ArtifactPane, tt as BannerType, u as ApprovalQueue, v as TaskBoardProps, w as SandboxWorkbenchMarkdownArtifact, x as SandboxWorkbenchCustomArtifact, y as SandboxWorkbench, z as SessionSidebarProps } from "./index-BYFbmk6A.js";
13
+ 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, a as WorkspaceFilesPane, at as DirectoryPaneProps, b as SandboxWorkbenchArtifact, c as ApprovalConfidenceStat, ct as WorkspaceLayout, d as ApprovalQueueProps, et as StatusBarProps, f as CalendarEvent, g as TaskBoardColumn, h as TaskBoard, i as WorkspaceArtifactViewProps, it as DirectoryPane, j as shellShouldRevalidate, k as ShellShouldRevalidateOptions, l as ApprovalItem, lt as WorkspaceLayoutProps, m as CalendarViewProps, n as ArtifactPaneProps, nt as StatusBanner, o as WorkspaceFilesPaneProps, ot as WorkspacePaneHeader, p as CalendarView, q as RuntimePane, r as WorkspaceArtifactView, rt as StatusBannerProps, s as WorkspaceFilesPreview, st as WorkspacePaneHeaderProps, t as ArtifactPane, tt as BannerType, u as ApprovalQueue, v as TaskBoardProps, w as SandboxWorkbenchMarkdownArtifact, x as SandboxWorkbenchCustomArtifact, y as SandboxWorkbench, z as SessionSidebarProps } from "./index-D7zJLs_I.js";
14
14
  import { A as SandboxArtifactTerminal, C as ChangesPane, D as ChangesPaneProps, E as ChangedFile, O as SandboxArtifact, S as PillTabsProps, T as ArtifactView, _ as DiffStats, a as PreviewView, b as PillTabItem, c as DiffViewProps, d as FileBreadcrumb, f as FileBreadcrumbProps, g as PanelHeaderProps, h as PanelHeader, i as resolveLanguage, k as SandboxArtifactPaneProps, l as CodeView, m as GitStatusBadge, n as CodeSurface, o as PreviewViewProps, p as DiffStatsBadge, r as CodeSurfaceProps, s as DiffView, t as BRAND_PRISM_THEME, u as CodeViewProps, v as buildUnifiedPatch, w as SandboxArtifactPane, x as PillTabs, y as computeDiffStats } from "./index-DNClXEEe.js";
15
15
  import { a as PreviewReadiness, i as PreviewAccess, n as EmbeddedAppView, r as EmbeddedAppViewProps, t as EmbeddedApp } from "./embedded-app-view-B_vMTtJn.js";
16
16
  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
@@ -1,9 +1,9 @@
1
- import { a as computeDiffStats, c as BRAND_PRISM_THEME, d as DiffStatsBadge, f as GitStatusBadge, i as buildUnifiedPatch, l as CodeSurface, m as PillTabs, n as SandboxArtifactPane, o as CodeView, p as PanelHeader, r as DiffView, s as FileBreadcrumb, t as ChangesPane, u as resolveLanguage } from "./workbench-Bk52r7Th.js";
1
+ import { a as computeDiffStats, c as BRAND_PRISM_THEME, d as DiffStatsBadge, f as GitStatusBadge, i as buildUnifiedPatch, l as CodeSurface, m as PillTabs, n as SandboxArtifactPane, o as CodeView, p as PanelHeader, r as DiffView, s as FileBreadcrumb, t as ChangesPane, u as resolveLanguage } from "./workbench-Bi-EUtkt.js";
2
2
  import { $ as DialogClose, $n as formatCalendarDate, $t as SelectSeparator, A as Chip, An as Tabs, At as Input, B as ContextMenuLabel, Bn as Textarea, Bt as PopoverContent, C as Card, Cn as TableBody, Ct as DropdownMenuTrigger, D as CardHeader, Dn as TableHead, Dt as HelpText, E as CardFooter, En as TableFooter, Et as Heading, F as ContextMenu, Ft as PageShell, G as ContextMenuShortcut, Gn as Toolbar, Gt as SegmentedControl, H as ContextMenuRadioGroup, Hn as TimeSelect, Ht as Progress, I as ContextMenuCheckboxItem, In as TerminalDisplay, It as Pagination, J as ContextMenuSubTrigger, Jn as TooltipProvider, Jt as SelectGroup, K as ContextMenuSub, Kn as Tooltip, Kt as Select, L as ContextMenuContent, Lt as Popover, M as Collapsible, Mn as TabsList, Mt as Metric, N as CollapsibleContent, Nn as TabsTrigger, Nt as MetricStrip, O as CardTitle, On as TableHeader, Ot as IconTile, P as CollapsibleTrigger, Pn as Tag, Pt as PageHeader, Q as Dialog, Qn as buttonVariants, Qt as SelectScrollUpButton, R as ContextMenuGroup, Rt as PopoverAnchor, S as Calendar, Sn as Table, St as DropdownMenuSubTrigger, T as CardDescription, Tn as TableCell, Tt as FilterField, U as ContextMenuRadioItem, Un as ToastContainer, Ut as RadioGroup, V as ContextMenuPortal, Vn as ThemeToggle, Vt as PopoverTrigger, W as ContextMenuSeparator, Wn as ToastProvider, Wt as RadioGroupItem, X as CopyButton, Xn as UploadProgress, Xt as SelectLabel, Y as ContextMenuTrigger, Yn as TooltipTrigger, Yt as SelectItem, Z as DatePicker, Zn as badgeVariants, Zt as SelectScrollDownButton, _ as AvatarFallback, _n as Slider, _t as DropdownMenuRadioItem, a as AlertDialogCancel, an as SheetContent, ar as useToast, at as DialogPortal, b as Button, bn as Switch, bt as DropdownMenuSub, c as AlertDialogFooter, cn as SheetHeader, cr as TangleKnot, ct as DropZone, d as AlertDialogPortal, dn as SheetTitle, dt as DropdownMenuContent, en as SelectTrigger, er as initialsOf, et as DialogContent, f as AlertDialogTitle, fn as SheetTrigger, ft as DropdownMenuGroup, g as Avatar, gn as SkeletonTable, gt as DropdownMenuRadioGroup, hn as SkeletonCard, ht as DropdownMenuPortal, i as AlertDialogAction, in as SheetClose, ir as useTheme, it as DialogOverlay, j as CodeBlock, jn as TabsContent, jt as Label, k as Checkbox, kn as TableRow, kt as InlineCode, l as AlertDialogHeader, ln as SheetOverlay, lt as DropdownMenu, m as AlertTitle, mn as Skeleton, mt as DropdownMenuLabel, n as AlertDescription, nn as Separator, nr as parseCalendarDate, nt as DialogFooter, o as AlertDialogContent, on as SheetDescription, or as SectionTitle, ot as DialogTitle, p as AlertDialogTrigger, pn as SidebarDropZone, pt as DropdownMenuItem, q as ContextMenuSubContent, qn as TooltipContent, qt as SelectContent, r as AlertDialog, rn as Sheet, rr as toneFor, rt as DialogHeader, s as AlertDialogDescription, sn as SheetFooter, sr as Logo, st as DialogTrigger, t as Alert, tn as SelectValue, tr as localToday, tt as DialogDescription, u as AlertDialogOverlay, un as SheetPortal, ut as DropdownMenuCheckboxItem, v as AvatarImage, vn as StatCard, vt as DropdownMenuSeparator, w as CardContent, wn as TableCaption, wt as EmptyState, x as CATEGORY_TONES, xn as TONE_CLASSES, xt as DropdownMenuSubContent, y as Badge, yn as StatusPill, yt as DropdownMenuShortcut, z as ContextMenuItem, zn as TextShimmer, zt as PopoverClose } from "./primitives-KFAPbGBD.js";
3
3
  import { t as WorkspacePaneHeader } from "./workspace-pane-header-Bg1cCcHX.js";
4
- import { _ as StatusBar, a as TaskBoard, b as WorkspaceLayout, c as createShellShouldRevalidate, d as SESSION_CREATED_EVENT, f as dispatchSessionCreated, g as TerminalPanel, h as RuntimePane, i as CalendarView, l as shellShouldRevalidate, m as formatRelativeAge, n as WorkspaceFilesPane, o as SandboxWorkbench, p as useOptimisticSessionItems, r as ApprovalQueue, s as WorkspaceArtifactView, t as ArtifactPane, u as SessionSidebar, v as StatusBanner, y as DirectoryPane } from "./workspace-BeGvmYS6.js";
4
+ import { _ as StatusBar, a as TaskBoard, b as WorkspaceLayout, c as createShellShouldRevalidate, d as SESSION_CREATED_EVENT, f as dispatchSessionCreated, g as TerminalPanel, h as RuntimePane, i as CalendarView, l as shellShouldRevalidate, m as formatRelativeAge, n as WorkspaceFilesPane, o as SandboxWorkbench, p as useOptimisticSessionItems, r as ApprovalQueue, s as WorkspaceArtifactView, t as ArtifactPane, u as SessionSidebar, v as StatusBanner, y as DirectoryPane } from "./workspace-DLlilck6.js";
5
5
  import { i as VaultTree, n as filterFileNodes, r as VAULT_TREE_CHILD_PAGE, t as fileTreeFromPaths } from "./tree-data-DtoCNNBJ.js";
6
- 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-BQDUxrn5.js";
6
+ 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-De9PJUjT.js";
7
7
  import { n as canonicalModelId, r as modelBrandFor, t as ModelBrandStack } from "./model-brand-hMyDTUqB.js";
8
8
  import { a as formatPrice, i as PricingPage, n as SandboxPageShell, o as BillingDashboard, r as UsageChart, t as DashboardPageHeader } from "./page-layout-2IRtfx51.js";
9
9
  import { t as usePtySession } from "./use-pty-session-Bf4hBLXJ.js";
@@ -2,7 +2,7 @@ import { r as modelBrandFor, t as ModelBrandStack } from "./model-brand-hMyDTUqB
2
2
  import { t as ProviderIcon } from "./provider-logo-X9PkbMIX.js";
3
3
  import { StatusPill } from "@tangle-network/ui/primitives";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
- import { AlertTriangle, Bell, Box, Cable, Camera, Circle, Clock, Code, GitBranch, Repeat, ScanSearch, Sparkles, UserCheck, Webhook, Zap } from "lucide-react";
5
+ import { AlertTriangle, Bell, Box, Cable, Camera, Check, Circle, Clock, Code, GitBranch, Repeat, ScanSearch, Sparkles, UserCheck, Webhook, Zap } from "lucide-react";
6
6
  import { parse } from "yaml";
7
7
  //#region src/workflows/cron.ts
8
8
  /**
@@ -1275,53 +1275,71 @@ function buildWorkflowGraph(yaml, options) {
1275
1275
  */
1276
1276
  /** Track color behind a progress bar — a faint wash of the muted token. */
1277
1277
  const MUTED_TRACK = "color-mix(in srgb, hsl(var(--muted-foreground)) 22%, transparent)";
1278
- const TONE_ACCENT = {
1279
- trigger: "hsl(var(--primary))",
1280
- structural: "var(--surface-warning-text)",
1281
- action: "hsl(var(--muted-foreground))"
1282
- };
1283
- /** Per-KIND resting accents. A tone is layout vocabulary; a kind is identity:
1284
- * without this map every action node rests in the same neutral gray, and a
1285
- * pipeline of agent steps reads as one flat field against the canvas. Each
1286
- * accent is a semantic token (theme-reactive, defined by the host app), never
1287
- * a palette literal:
1288
- * agent.run primary indigo — the workhorse carries the brand
1289
- * script.run info — code/compute
1290
- * sandbox.* success — provisioned infrastructure
1291
- * integration/notify info — the outside world
1292
- * Run state still wins when a run is live: statusBorder recolors the border
1293
- * and the glow, so the resting identity never competes with the run's front. */
1278
+ /** Per-KIND accents — the QUIET identity channel. The 2026-10-09 canvas
1279
+ * critique's first blocker: kind and state shared the same channel and hue
1280
+ * family (sandbox-kind was green like DONE; structural-kind amber like
1281
+ * WAITING; agent-kind indigo like RUNNING). The split:
1282
+ * KIND = the glyph-tile tint + a 2px top rule. Hues chosen to NEVER
1283
+ * collide with the state family (green/amber/red are reserved
1284
+ * for state alone).
1285
+ * STATE = the border, ring, glow and fill (see statusBorder).
1286
+ * Kind hue duplicates are deliberate: shape + glyph carry identity; the
1287
+ * tint is a hint, not the signal. */
1294
1288
  const KIND_ACCENT = {
1295
1289
  "agent.run": "hsl(var(--primary))",
1296
1290
  "script.run": "var(--surface-info-text)",
1297
- "sandbox.spawn": "var(--surface-success-text)",
1298
- "sandbox.snapshot": "var(--surface-success-text)",
1291
+ "sandbox.spawn": "hsl(var(--muted-foreground))",
1292
+ "sandbox.snapshot": "hsl(var(--muted-foreground))",
1299
1293
  "integration.invoke": "var(--surface-info-text)",
1300
1294
  "line.send": "var(--surface-info-text)",
1301
1295
  notify: "var(--surface-info-text)"
1302
1296
  };
1297
+ /** Structural kinds (parallel/foreach/decision) rest SLATE — amber is
1298
+ * reserved for `waiting`, full stop. */
1299
+ const TONE_ACCENT = {
1300
+ trigger: "hsl(var(--primary))",
1301
+ structural: "hsl(var(--muted-foreground))",
1302
+ action: "hsl(var(--muted-foreground))"
1303
+ };
1303
1304
  /** The accent a node presents at rest: its kind's identity when it has one,
1304
1305
  * its tone otherwise (trigger/structural keep their tone-driven accents). */
1305
1306
  function kindAccent(tone, kind) {
1306
1307
  return (kind !== void 0 ? KIND_ACCENT[kind] : void 0) ?? TONE_ACCENT[tone];
1307
1308
  }
1308
- /** Resting elevation: the quiet card still sits ON the canvas rather than in
1309
- * it. Foreground-token shadows so both themes get depth without a dark-mode
1310
- * black box. */
1311
- const RESTING_SHADOW = "0 1px 2px hsl(var(--foreground) / 0.08), 0 10px 28px -16px hsl(var(--foreground) / 0.28)";
1309
+ /** Resting elevation — the 2026-10-09 critique's depth finding: the card
1310
+ * sat FLAT on the canvas (three near-identical greys, borders invisible).
1311
+ * The card must sit ON the canvas, not in it: a real two-layer shadow plus a
1312
+ * 1px inner top highlight, foreground-token based so both themes get depth
1313
+ * without a dark-mode black box. */
1314
+ const RESTING_SHADOW = "inset 0 1px 0 hsl(var(--foreground) / 0.07), 0 1px 2px hsl(var(--foreground) / 0.10), 0 12px 32px -14px hsl(var(--foreground) / 0.40)";
1315
+ /** The resting card border: visible against the canvas in BOTH themes —
1316
+ * `--border` vanished on dark. */
1317
+ const RESTING_BORDER = "hsl(var(--foreground) / 0.14)";
1312
1318
  const STATUS_QUEUED = "hsl(var(--muted-foreground))";
1319
+ const STATUS_DONE = "var(--surface-success-text)";
1320
+ const STATUS_FAILED = "var(--surface-danger-text)";
1321
+ const STATUS_RUNNING = "hsl(var(--primary))";
1322
+ /** A run blocked on a human borrows the warning surface — the same amber the
1323
+ * design system uses for "needs attention". It must never read as the primary
1324
+ * "running" accent: the workflow is not working, it is waiting on the viewer. */
1325
+ const STATUS_WAITING = "var(--surface-warning-text)";
1313
1326
  const STATUS_COLOR = {
1314
1327
  queued: STATUS_QUEUED,
1315
- running: "hsl(var(--primary))",
1316
- waiting: "var(--surface-warning-text)",
1317
- succeeded: "var(--surface-success-text)",
1318
- failed: "var(--surface-danger-text)"
1328
+ running: STATUS_RUNNING,
1329
+ waiting: STATUS_WAITING,
1330
+ succeeded: STATUS_DONE,
1331
+ failed: STATUS_FAILED
1319
1332
  };
1320
- /** An edge is colored by the status of the node it points AT, so the run's
1321
- * "front" lights up. Neutral for a not-yet-reached (queued) target or the
1322
- * static definition view (`undefined`). */
1333
+ /** An edge reads by the status of the node it points AT — with the 2026-10-09
1334
+ * fix: SETTLED edges go quiet. A succeeded run used to paint every edge green
1335
+ * ("the green wall"); now only the live front carries color: running keeps
1336
+ * primary, waiting amber, failed danger, and succeeded/queued sit at a quiet
1337
+ * neutral so the eye finds the front, not the history. */
1323
1338
  function edgeColor(status) {
1324
- return status ? STATUS_COLOR[status] : STATUS_QUEUED;
1339
+ if (status === "running") return STATUS_RUNNING;
1340
+ if (status === "waiting") return STATUS_WAITING;
1341
+ if (status === "failed") return STATUS_FAILED;
1342
+ return "color-mix(in srgb, hsl(var(--muted-foreground)) 38%, transparent)";
1325
1343
  }
1326
1344
  const STATUS_LABEL = {
1327
1345
  queued: "Queued",
@@ -1362,21 +1380,32 @@ const STATUS_PILL = {
1362
1380
  borderColor: "var(--surface-danger-border)"
1363
1381
  }
1364
1382
  };
1365
- /** The card's border + ring once a node has live run state, so the running node
1366
- * and the terminal ones read at a glance. Returned as inline style (not classes)
1367
- * because the status colors are semantic tokens, not palette shades. */
1383
+ /** The card's border + ring once a node has live run state. The emphasis
1384
+ * law (the critique's second blocker, inverted): the EXCEPTION is the
1385
+ * loudest thing on the canvas —
1386
+ * failed saturated danger + a halo wider than running's
1387
+ * waiting amber + glow (the node the viewer must act on)
1388
+ * running primary + glow (the live front)
1389
+ * succeeded QUIET: a neutral border, no ring, no glow — done is the
1390
+ * resting state of a healthy run and must not shout */
1368
1391
  function statusBorder(status) {
1369
- const color = STATUS_COLOR[status];
1370
1392
  switch (status) {
1371
- case "running":
1372
- case "waiting": return {
1373
- borderColor: color,
1374
- boxShadow: `0 0 0 1px color-mix(in srgb, ${color} 45%, transparent), 0 0 24px -6px ${color}`
1393
+ case "failed": return {
1394
+ borderColor: STATUS_FAILED,
1395
+ boxShadow: `0 0 0 2px color-mix(in srgb, ${STATUS_FAILED} 55%, transparent), 0 0 32px -4px color-mix(in srgb, ${STATUS_FAILED} 70%, transparent), inset 0 1px 0 hsl(var(--foreground) / 0.07), 0 1px 2px hsl(var(--foreground) / 0.10), 0 12px 32px -14px hsl(var(--foreground) / 0.40)`
1375
1396
  };
1397
+ case "running":
1398
+ case "waiting": {
1399
+ const color = STATUS_COLOR[status];
1400
+ return {
1401
+ borderColor: color,
1402
+ boxShadow: `0 0 0 1px color-mix(in srgb, ${color} 45%, transparent), 0 0 24px -6px ${color}`
1403
+ };
1404
+ }
1376
1405
  case "queued": return { borderColor: "hsl(var(--border))" };
1377
- default: return {
1378
- borderColor: color,
1379
- boxShadow: `0 0 0 1px color-mix(in srgb, ${color} 35%, transparent)`
1406
+ case "succeeded": return {
1407
+ borderColor: RESTING_BORDER,
1408
+ boxShadow: RESTING_SHADOW
1380
1409
  };
1381
1410
  }
1382
1411
  }
@@ -1530,7 +1559,7 @@ const STATUS_TONE = {
1530
1559
  queued: "neutral",
1531
1560
  running: "running",
1532
1561
  waiting: "warning",
1533
- succeeded: "success",
1562
+ succeeded: "neutral",
1534
1563
  failed: "danger"
1535
1564
  };
1536
1565
  /** The status pill in a card's header — the one place the run state is spelled
@@ -1539,6 +1568,19 @@ const STATUS_TONE = {
1539
1568
  * longest label is two words ("Waiting on you") and the pill is often nested a
1540
1569
  * level below the flex row it sits in. */
1541
1570
  function StatusPill$1({ status }) {
1571
+ if (status === "succeeded") return /* @__PURE__ */ jsxs("span", {
1572
+ className: "inline-flex shrink-0 items-center gap-1 rounded-full border px-2 py-0.5 text-[10px] font-medium leading-4",
1573
+ style: {
1574
+ background: "color-mix(in srgb, hsl(var(--muted-foreground)) 10%, transparent)",
1575
+ color: "hsl(var(--muted-foreground))",
1576
+ borderColor: "color-mix(in srgb, hsl(var(--muted-foreground)) 26%, transparent)"
1577
+ },
1578
+ children: [/* @__PURE__ */ jsx(Check, {
1579
+ className: "size-2.5",
1580
+ strokeWidth: 3,
1581
+ "aria-hidden": true
1582
+ }), STATUS_LABEL[status]]
1583
+ });
1542
1584
  return /* @__PURE__ */ jsx(StatusPill, {
1543
1585
  tone: STATUS_TONE[status],
1544
1586
  className: "shrink-0",
@@ -1572,7 +1614,7 @@ function StatusFooter({ status, rounds, cost, tokens, elapsed }) {
1572
1614
  ...status === "running" ? { "data-motion": "essential" } : {},
1573
1615
  style: {
1574
1616
  width: progressFill(status),
1575
- background: STATUS_COLOR[status]
1617
+ background: status === "succeeded" ? "color-mix(in srgb, hsl(var(--muted-foreground)) 26%, transparent)" : STATUS_COLOR[status]
1576
1618
  }
1577
1619
  })
1578
1620
  }), /* @__PURE__ */ jsxs("div", {
@@ -1815,4 +1857,4 @@ function NodeOutputBody({ shape, rows = 2, tone = "default" }) {
1815
1857
  });
1816
1858
  }
1817
1859
  //#endregion
1818
- export { wfEdgeId as A, TRIGGER_NODE_ID as C, isStructuralKind as D, buildWorkflowGraph as E, shortModel as F, clampPreview as I, fmtCost as L, actionPathLabel as M, humanizeIdentifier as N, triggerNodeId as O, parseActionPath as P, fmtDuration as R, COMPACT_NODE_SIZE as S, branchNodeId as T, kindAccent as _, NodeMark as a, problemTitle as b, RESTING_SHADOW as c, STATUS_PILL as d, STATUS_TONE as f, emptySlotLabel as g, edgeColor as h, KIND_ICON as i, worstSeverity as j, triggerNodeIndex as k, STATUS_COLOR as l, StatusPill$1 as m, classifyOutput as n, ProblemMarker as o, StatusFooter as p, condenseText as r, ProblemMessages as s, NodeOutputBody as t, STATUS_LABEL as u, problemBorder as v, actionNodeId as w, statusBorder as x, problemSurface as y, fmtTokens as z };
1860
+ export { triggerNodeIndex as A, fmtTokens as B, COMPACT_NODE_SIZE as C, buildWorkflowGraph as D, branchNodeId as E, parseActionPath as F, shortModel as I, clampPreview as L, worstSeverity as M, actionPathLabel as N, isStructuralKind as O, humanizeIdentifier as P, fmtCost as R, statusBorder as S, actionNodeId as T, emptySlotLabel as _, NodeMark as a, problemSurface as b, RESTING_BORDER as c, STATUS_LABEL as d, STATUS_PILL as f, edgeColor as g, StatusPill$1 as h, KIND_ICON as i, wfEdgeId as j, triggerNodeId as k, RESTING_SHADOW as l, StatusFooter as m, classifyOutput as n, ProblemMarker as o, STATUS_TONE as p, condenseText as r, ProblemMessages as s, NodeOutputBody as t, STATUS_COLOR as u, kindAccent as v, TRIGGER_NODE_ID as w, problemTitle as x, problemBorder as y, fmtDuration as z };
package/dist/styles.css CHANGED
@@ -731,6 +731,10 @@
731
731
  width: calc(var(--spacing) * 2);
732
732
  height: calc(var(--spacing) * 2);
733
733
  }
734
+ .size-2\.5 {
735
+ width: calc(var(--spacing) * 2.5);
736
+ height: calc(var(--spacing) * 2.5);
737
+ }
734
738
  .size-3 {
735
739
  width: calc(var(--spacing) * 3);
736
740
  height: calc(var(--spacing) * 3);
@@ -797,6 +801,9 @@
797
801
  .\!h-2\.5 {
798
802
  height: calc(var(--spacing) * 2.5) !important;
799
803
  }
804
+ .h-0\.5 {
805
+ height: calc(var(--spacing) * 0.5);
806
+ }
800
807
  .h-1 {
801
808
  height: var(--spacing);
802
809
  }
@@ -1,5 +1,5 @@
1
1
  import { t as cn$1 } from "./utils-DzWbktWG.js";
2
- import { a as PortsList } from "./dashboard-BQDUxrn5.js";
2
+ import { a as PortsList } from "./dashboard-De9PJUjT.js";
3
3
  import { n as TerminalView } from "./terminal-DmSUfGha.js";
4
4
  import { RichFileTree } from "./files.js";
5
5
  import { n as PreviewView } from "./embedded-app-view-CMRPEvon.js";
package/dist/workbench.js CHANGED
@@ -1,3 +1,3 @@
1
- import { a as computeDiffStats, c as BRAND_PRISM_THEME, d as DiffStatsBadge, f as GitStatusBadge, i as buildUnifiedPatch, l as CodeSurface, m as PillTabs, n as SandboxArtifactPane, o as CodeView, p as PanelHeader, r as DiffView, s as FileBreadcrumb, t as ChangesPane, u as resolveLanguage } from "./workbench-Bk52r7Th.js";
1
+ import { a as computeDiffStats, c as BRAND_PRISM_THEME, d as DiffStatsBadge, f as GitStatusBadge, i as buildUnifiedPatch, l as CodeSurface, m as PillTabs, n as SandboxArtifactPane, o as CodeView, p as PanelHeader, r as DiffView, s as FileBreadcrumb, t as ChangesPane, u as resolveLanguage } from "./workbench-Bi-EUtkt.js";
2
2
  import { n as PreviewView, t as EmbeddedAppView } from "./embedded-app-view-CMRPEvon.js";
3
3
  export { BRAND_PRISM_THEME, ChangesPane, CodeSurface, CodeView, DiffStatsBadge, DiffView, EmbeddedAppView, FileBreadcrumb, GitStatusBadge, PanelHeader, PillTabs, PreviewView, SandboxArtifactPane, buildUnifiedPatch, computeDiffStats, resolveLanguage };
package/dist/workflows.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { r as modelBrandFor, t as ModelBrandStack } from "./model-brand-hMyDTUqB.js";
2
- import { C as TRIGGER_NODE_ID, E as buildWorkflowGraph, F as shortModel, M as actionPathLabel, N as humanizeIdentifier, O as triggerNodeId, P as parseActionPath, T as branchNodeId, a as NodeMark, d as STATUS_PILL, f as STATUS_TONE, i as KIND_ICON, k as triggerNodeIndex, l as STATUS_COLOR, m as StatusPill, n as classifyOutput, r as condenseText, t as NodeOutputBody, u as STATUS_LABEL, w as actionNodeId } from "./node-output-BdfG5lt4.js";
2
+ import { A as triggerNodeIndex, D as buildWorkflowGraph, E as branchNodeId, F as parseActionPath, I as shortModel, N as actionPathLabel, P as humanizeIdentifier, T as actionNodeId, a as NodeMark, d as STATUS_LABEL, f as STATUS_PILL, h as StatusPill, i as KIND_ICON, k as triggerNodeId, n as classifyOutput, p as STATUS_TONE, r as condenseText, t as NodeOutputBody, u as STATUS_COLOR, w as TRIGGER_NODE_ID } from "./node-output-BC5ZQ8R6.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { Component, Suspense, lazy, useMemo, useState } from "react";
5
5
  //#region src/workflows/WorkflowGraphLazy.tsx
@@ -30,7 +30,7 @@ function retryImport(factory, retries = 2, delayMs = 350) {
30
30
  });
31
31
  }
32
32
  function lazyWorkflowGraph() {
33
- return lazy(() => retryImport(() => import("./WorkflowGraph-Cx6SkrNJ.js").then((m) => ({ default: m.WorkflowGraph }))));
33
+ return lazy(() => retryImport(() => import("./WorkflowGraph-m2uy9TDl.js").then((m) => ({ default: m.WorkflowGraph }))));
34
34
  }
35
35
  var GraphErrorBoundary = class extends Component {
36
36
  state = { hasError: false };
@@ -2479,7 +2479,8 @@ function activeElementWithin(element) {
2479
2479
  * The tree sits in its own surface: folders start collapsed, expansion is
2480
2480
  * remembered under `expansionKey`, and a preview replaces the tree until Back.
2481
2481
  */
2482
- function WorkspaceFilesPane({ root, paths, selectedPath, onSelect, preview, onBack, emptyState, expansionKey, search = true, label = "Files", headerActions, className, style }) {
2482
+ function WorkspaceFilesPane({ root, paths, selectedPath, onSelect, preview, onBack, emptyState, expansionKey, search = true, label = "Files", headerActions, surface = "card", className, style }) {
2483
+ const plain = surface === "plain";
2483
2484
  const nodes = useMemo(() => root ? root.path ? [root] : root.children ?? [] : fileTreeFromPaths(paths ?? []), [root, paths]);
2484
2485
  const index = useMemo(() => indexNodes(nodes), [nodes]);
2485
2486
  const [query, setQuery] = useState("");
@@ -2516,13 +2517,20 @@ function WorkspaceFilesPane({ root, paths, selectedPath, onSelect, preview, onBa
2516
2517
  tabIndex: -1,
2517
2518
  role: "region",
2518
2519
  "aria-label": "Workspace files",
2519
- className: cn$1("flex min-h-0 flex-1 flex-col p-2", hasPreview && "hidden"),
2520
+ className: cn$1("flex min-h-0 flex-1 flex-col", !plain && "p-2", hasPreview && "hidden"),
2520
2521
  children: /* @__PURE__ */ jsxs("section", {
2521
2522
  "aria-labelledby": headingId,
2522
- "data-workspace-files-surface": true,
2523
- className: "flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-border bg-card text-card-foreground shadow-sm",
2523
+ "data-workspace-files-surface": surface,
2524
+ className: cn$1("flex min-h-0 flex-1 flex-col overflow-hidden", !plain && "rounded-xl border border-border bg-card text-card-foreground shadow-sm"),
2524
2525
  children: [
2525
- /* @__PURE__ */ jsxs("div", {
2526
+ plain ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("h2", {
2527
+ id: headingId,
2528
+ className: "sr-only",
2529
+ children: label
2530
+ }), headerActions && /* @__PURE__ */ jsx("div", {
2531
+ className: "flex shrink-0 items-center justify-end gap-1 px-3 pt-3",
2532
+ children: headerActions
2533
+ })] }) : /* @__PURE__ */ jsxs("div", {
2526
2534
  className: "flex shrink-0 items-center gap-2 px-3 pb-2 pt-3",
2527
2535
  children: [/* @__PURE__ */ jsx("h2", {
2528
2536
  id: headingId,
@@ -2534,7 +2542,7 @@ function WorkspaceFilesPane({ root, paths, selectedPath, onSelect, preview, onBa
2534
2542
  })]
2535
2543
  }),
2536
2544
  search && !isEmpty && /* @__PURE__ */ jsx("div", {
2537
- className: "shrink-0 px-3 pb-2",
2545
+ className: cn$1("shrink-0 px-3 pb-2", plain && "pt-3"),
2538
2546
  children: /* @__PURE__ */ jsx(Input, {
2539
2547
  type: "search",
2540
2548
  size: "sm",
@@ -2545,7 +2553,7 @@ function WorkspaceFilesPane({ root, paths, selectedPath, onSelect, preview, onBa
2545
2553
  })
2546
2554
  }),
2547
2555
  /* @__PURE__ */ jsx("div", {
2548
- className: "min-h-0 flex-1 overflow-y-auto border-t border-border px-1.5 py-1.5",
2556
+ className: cn$1("min-h-0 flex-1 overflow-y-auto px-1.5 py-1.5", (!plain || search && !isEmpty) && "border-t border-border"),
2549
2557
  children: isEmpty ? emptyState !== void 0 ? emptyState : /* @__PURE__ */ jsx(EmptyState, {
2550
2558
  icon: /* @__PURE__ */ jsx(FolderOpen, { className: "h-6 w-6" }),
2551
2559
  title: "No files yet"
@@ -1,2 +1,2 @@
1
- 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, a as WorkspaceFilesPane, at as DirectoryPaneProps, b as SandboxWorkbenchArtifact, c as ApprovalConfidenceStat, ct as WorkspaceLayout, d as ApprovalQueueProps, et as StatusBarProps, f as CalendarEvent, g as TaskBoardColumn, h as TaskBoard, i as WorkspaceArtifactViewProps, it as DirectoryPane, j as shellShouldRevalidate, k as ShellShouldRevalidateOptions, l as ApprovalItem, lt as WorkspaceLayoutProps, m as CalendarViewProps, n as ArtifactPaneProps, nt as StatusBanner, o as WorkspaceFilesPaneProps, ot as WorkspacePaneHeader, p as CalendarView, q as RuntimePane, r as WorkspaceArtifactView, rt as StatusBannerProps, s as WorkspaceFilesPreview, st as WorkspacePaneHeaderProps, t as ArtifactPane, tt as BannerType, u as ApprovalQueue, v as TaskBoardProps, w as SandboxWorkbenchMarkdownArtifact, x as SandboxWorkbenchCustomArtifact, y as SandboxWorkbench, z as SessionSidebarProps } from "./index-BYFbmk6A.js";
1
+ 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, a as WorkspaceFilesPane, at as DirectoryPaneProps, b as SandboxWorkbenchArtifact, c as ApprovalConfidenceStat, ct as WorkspaceLayout, d as ApprovalQueueProps, et as StatusBarProps, f as CalendarEvent, g as TaskBoardColumn, h as TaskBoard, i as WorkspaceArtifactViewProps, it as DirectoryPane, j as shellShouldRevalidate, k as ShellShouldRevalidateOptions, l as ApprovalItem, lt as WorkspaceLayoutProps, m as CalendarViewProps, n as ArtifactPaneProps, nt as StatusBanner, o as WorkspaceFilesPaneProps, ot as WorkspacePaneHeader, p as CalendarView, q as RuntimePane, r as WorkspaceArtifactView, rt as StatusBannerProps, s as WorkspaceFilesPreview, st as WorkspacePaneHeaderProps, t as ArtifactPane, tt as BannerType, u as ApprovalQueue, v as TaskBoardProps, w as SandboxWorkbenchMarkdownArtifact, x as SandboxWorkbenchCustomArtifact, y as SandboxWorkbench, z as SessionSidebarProps } from "./index-D7zJLs_I.js";
2
2
  export { type ApprovalConfidenceStat, type ApprovalItem, ApprovalQueue, type ApprovalQueueProps, ArtifactPane, type ArtifactPaneProps, type BannerType, type CalendarEvent, CalendarView, type CalendarViewProps, type ContextBadge, DirectoryPane, type DirectoryPaneProps, RuntimePane, type RuntimePaneProps, SESSION_CREATED_EVENT, SandboxWorkbench, type SandboxWorkbenchArtifact, type SandboxWorkbenchCustomArtifact, type SandboxWorkbenchFileArtifact, type SandboxWorkbenchLayoutOptions, type SandboxWorkbenchMarkdownArtifact, type SandboxWorkbenchOpenUIArtifact, type SandboxWorkbenchProps, type SandboxWorkbenchSessionProps, type SessionCreatedDetail, type SessionOptimisticController, SessionSidebar, type SessionSidebarBadge, type SessionSidebarFilter, type SessionSidebarGroupBy, type SessionSidebarItem, type SessionSidebarLink, type SessionSidebarProps, type SessionSidebarVariant, type ShellShouldRevalidateArgs, type ShellShouldRevalidateOptions, StatusBanner, type StatusBannerProps, StatusBar, type StatusBarProps, TaskBoard, type TaskBoardColumn, type TaskBoardItem, type TaskBoardProps, type TerminalLine, TerminalPanel, type TerminalProps, type UseOptimisticSessionItemsOptions, WorkspaceArtifactView, type WorkspaceArtifactViewProps, WorkspaceFilesPane, type WorkspaceFilesPaneProps, type WorkspaceFilesPreview, WorkspaceLayout, type WorkspaceLayoutProps, WorkspacePaneHeader, type WorkspacePaneHeaderProps, createShellShouldRevalidate, dispatchSessionCreated, formatRelativeAge, shellShouldRevalidate, useOptimisticSessionItems };
package/dist/workspace.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import { t as WorkspacePaneHeader } from "./workspace-pane-header-Bg1cCcHX.js";
2
- import { _ as StatusBar, a as TaskBoard, b as WorkspaceLayout, c as createShellShouldRevalidate, d as SESSION_CREATED_EVENT, f as dispatchSessionCreated, g as TerminalPanel, h as RuntimePane, i as CalendarView, l as shellShouldRevalidate, m as formatRelativeAge, n as WorkspaceFilesPane, o as SandboxWorkbench, p as useOptimisticSessionItems, r as ApprovalQueue, s as WorkspaceArtifactView, t as ArtifactPane, u as SessionSidebar, v as StatusBanner, y as DirectoryPane } from "./workspace-BeGvmYS6.js";
2
+ import { _ as StatusBar, a as TaskBoard, b as WorkspaceLayout, c as createShellShouldRevalidate, d as SESSION_CREATED_EVENT, f as dispatchSessionCreated, g as TerminalPanel, h as RuntimePane, i as CalendarView, l as shellShouldRevalidate, m as formatRelativeAge, n as WorkspaceFilesPane, o as SandboxWorkbench, p as useOptimisticSessionItems, r as ApprovalQueue, s as WorkspaceArtifactView, t as ArtifactPane, u as SessionSidebar, v as StatusBanner, y as DirectoryPane } from "./workspace-DLlilck6.js";
3
3
  export { ApprovalQueue, ArtifactPane, CalendarView, DirectoryPane, RuntimePane, SESSION_CREATED_EVENT, SandboxWorkbench, SessionSidebar, StatusBanner, StatusBar, TaskBoard, TerminalPanel, WorkspaceArtifactView, WorkspaceFilesPane, WorkspaceLayout, WorkspacePaneHeader, createShellShouldRevalidate, dispatchSessionCreated, formatRelativeAge, shellShouldRevalidate, useOptimisticSessionItems };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "0.132.0",
3
+ "version": "0.132.2",
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": {