@tangle-network/sandbox-ui 0.123.2 → 0.123.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { D as triggerNodeIndex, F as fmtCost, I as fmtDuration, L as fmtTokens, N as shortModel, O as wfEdgeId, P as clampPreview, T as isStructuralKind, _ as problemSurface, a as NodeMark, b as COMPACT_NODE_SIZE, c as STATUS_COLOR, d as StatusFooter, f as StatusPill, g as problemBorder, h as emptySlotLabel, k as worstSeverity, l as STATUS_LABEL, m as edgeColor, n as classifyOutput, o as ProblemMarker, p as TONE_ACCENT, s as ProblemMessages, t as NodeOutputBody, v as problemTitle, w as buildWorkflowGraph, y as statusBorder } from "./node-output-D-fYilAu.js";
1
+ import { A as worstSeverity, E as isStructuralKind, F as clampPreview, I as fmtCost, L as fmtDuration, O as triggerNodeIndex, P as shortModel, R as fmtTokens, T as buildWorkflowGraph, _ as problemBorder, a as NodeMark, b as statusBorder, c as RESTING_SHADOW, f as StatusFooter, g as kindAccent, h as emptySlotLabel, k as wfEdgeId, l as STATUS_COLOR, m as edgeColor, n as classifyOutput, o as ProblemMarker, p as StatusPill, s as ProblemMessages, t as NodeOutputBody, u as STATUS_LABEL, v as problemSurface, x as COMPACT_NODE_SIZE, y as problemTitle } from "./node-output-D_m-vmHB.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";
@@ -591,7 +591,7 @@ function WorkflowNode({ id, data, sourcePosition, targetPosition }) {
591
591
  const isLR = direction === "LR";
592
592
  const targetPos = targetPosition ?? (isLR ? Position.Left : Position.Top);
593
593
  const sourcePos = sourcePosition ?? (isLR ? Position.Right : Position.Bottom);
594
- const accent = TONE_ACCENT[d.tone];
594
+ const accent = kindAccent(d.tone, d.kind);
595
595
  const isAgent = d.kind === "agent.run";
596
596
  const subtitle = isAgent && state?.model ? shortModel(state.model) : d.subtitle;
597
597
  const markModel = isAgent && state?.model ? state.model : d.model;
@@ -667,7 +667,10 @@ function WorkflowNode({ id, data, sourcePosition, targetPosition }) {
667
667
  style: {
668
668
  width: 76,
669
669
  height: 76,
670
- ...state ? statusBorder(state.status) : problemSeverity ? problemBorder(problemSeverity) : { borderColor: `color-mix(in srgb, ${accent} 40%, hsl(var(--border)))` },
670
+ ...state ? statusBorder(state.status) : problemSeverity ? problemBorder(problemSeverity) : {
671
+ borderColor: `color-mix(in srgb, ${accent} 45%, hsl(var(--border)))`,
672
+ boxShadow: RESTING_SHADOW
673
+ },
671
674
  ...selected ? SELECTION_OUTLINE : {}
672
675
  },
673
676
  children: [
@@ -729,7 +732,10 @@ function WorkflowNode({ id, data, sourcePosition, targetPosition }) {
729
732
  "data-testid": "wf-node-card",
730
733
  className: "relative flex h-full w-full flex-col overflow-hidden rounded-xl border bg-card shadow-sm transition-colors",
731
734
  style: {
732
- ...runStatus ? statusBorder(runStatus) : problemSeverity ? problemBorder(problemSeverity) : { borderColor: `color-mix(in srgb, ${accent} 40%, hsl(var(--border)))` },
735
+ ...runStatus ? statusBorder(runStatus) : problemSeverity ? problemBorder(problemSeverity) : {
736
+ borderColor: `color-mix(in srgb, ${accent} 45%, hsl(var(--border)))`,
737
+ boxShadow: RESTING_SHADOW
738
+ },
733
739
  ...selected ? SELECTION_OUTLINE : {}
734
740
  },
735
741
  children: [handles, children]
@@ -1407,7 +1413,11 @@ function WorkflowGraph({ yaml, variant = "full", direction = "LR", defaultCompac
1407
1413
  preventScrolling: false,
1408
1414
  minZoom: .2,
1409
1415
  maxZoom: 1.5,
1410
- children: [/* @__PURE__ */ jsx(Background, { gap: 18 }), !isPreview && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Controls, {
1416
+ children: [/* @__PURE__ */ jsx(Background, {
1417
+ gap: 18,
1418
+ size: 1.4,
1419
+ color: "hsl(var(--muted-foreground) / 0.38)"
1420
+ }), !isPreview && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Controls, {
1411
1421
  showInteractive: false,
1412
1422
  position: "bottom-right",
1413
1423
  fitViewOptions: { padding: FIT_VIEW.padding }
@@ -2632,6 +2632,13 @@ function HarnessPicker({ value, onChange, available, optionsOverride, label = "A
2632
2632
  * control flipped it — so apps no longer each reimplement this sync. Observing
2633
2633
  * the `class` attribute (rather than reading `useTheme`) catches every writer,
2634
2634
  * including an app's pre-React no-flash script.
2635
+ *
2636
+ * A Brand NAMED theme (`data-theme="aubergine"`, `"intelligence"`,
2637
+ * `"tangle-light"`, …) belongs to the app that selected it. The hook still
2638
+ * mirrors `.light`, but it never rewrites a named `data-theme` to plain
2639
+ * `dark`/`light`: doing so drops the named scope's tokens and renders the app in
2640
+ * the default palette. It writes `data-theme` only when the attribute is absent
2641
+ * or already `dark`/`light`.
2635
2642
  */
2636
2643
  function useBrandThemeSync() {
2637
2644
  React$1.useEffect(() => {
@@ -2640,8 +2647,10 @@ function useBrandThemeSync() {
2640
2647
  const sync = () => {
2641
2648
  const dark = el.classList.contains("dark");
2642
2649
  el.classList.toggle("light", !dark);
2650
+ const current = el.getAttribute("data-theme");
2651
+ if (!isPlainTheme(current)) return;
2643
2652
  const next = dark ? "dark" : "light";
2644
- if (el.getAttribute("data-theme") !== next) el.setAttribute("data-theme", next);
2653
+ if (current !== next) el.setAttribute("data-theme", next);
2645
2654
  };
2646
2655
  sync();
2647
2656
  const observer = new MutationObserver(sync);
@@ -2652,6 +2661,9 @@ function useBrandThemeSync() {
2652
2661
  return () => observer.disconnect();
2653
2662
  }, []);
2654
2663
  }
2664
+ function isPlainTheme(value) {
2665
+ return value === null || value === "" || value === "dark" || value === "light";
2666
+ }
2655
2667
  //#endregion
2656
2668
  //#region src/dashboard/dashboard-layout.tsx
2657
2669
  function MenuIcon$1({ className }) {
package/dist/dashboard.js CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as SidebarRailHeader, A as ResourceSnapshot, B as RailExpandable, C as PlanCards, D as SandboxCard, E as NewSandboxCard, F as parseInsufficientBalance, G as RailThemeToggle, H as RailHeader, I as CreditBalance, J as SidebarPanel, K as Sidebar, L as ProfileAvatar, M as ClusterStatusBar, N as INSUFFICIENT_BALANCE_CODE, O as canAdminSandbox, P as OutOfCreditsModal, Q as SidebarRailFooter, R as RailButton, S as BackendSelector, T as SandboxTable, U as RailModeButton, V as RailFlyout, W as RailSeparator, X as SidebarPanelHeader, Y as SidebarPanelContent, Z as SidebarRail, _ as HARNESS_OPTIONS, a as NetworkConfig, at as SIDEBAR_RAIL_WIDTH, b as HARNESS_BRAND, c as GitPanel, ct as useSidebar, d as VariantList, et as SidebarRailNav, f as MetricAreaChart, g as DashboardLayout, h as SidebarLayout, i as BackendConfig, it as SIDEBAR_RAIL_LABELED_WIDTH, j as ResourceMeter, k as ActivityFeed, l as UsageSummary, m as ProfileSelector, n as PromoBanner, nt as SIDEBAR_MOBILE_WIDTH, o as ProcessList, ot as SIDEBAR_TOTAL_WIDTH, p as ProfileComparison, q as SidebarContent, r as SnapshotList, rt as SIDEBAR_PANEL_WIDTH, s as PortsList, st as SidebarProvider, t as InfoPanel, tt as RailTooltip, u as SystemLogsViewer, v as HarnessPicker, w as InvoiceTable, x as HarnessLogo, y as chatCapableHarnesses, z as RailCollapseToggle } from "./dashboard-C2VXLIQC.js";
1
+ import { $ as SidebarRailHeader, A as ResourceSnapshot, B as RailExpandable, C as PlanCards, D as SandboxCard, E as NewSandboxCard, F as parseInsufficientBalance, G as RailThemeToggle, H as RailHeader, I as CreditBalance, J as SidebarPanel, K as Sidebar, L as ProfileAvatar, M as ClusterStatusBar, N as INSUFFICIENT_BALANCE_CODE, O as canAdminSandbox, P as OutOfCreditsModal, Q as SidebarRailFooter, R as RailButton, S as BackendSelector, T as SandboxTable, U as RailModeButton, V as RailFlyout, W as RailSeparator, X as SidebarPanelHeader, Y as SidebarPanelContent, Z as SidebarRail, _ as HARNESS_OPTIONS, a as NetworkConfig, at as SIDEBAR_RAIL_WIDTH, b as HARNESS_BRAND, c as GitPanel, ct as useSidebar, d as VariantList, et as SidebarRailNav, f as MetricAreaChart, g as DashboardLayout, h as SidebarLayout, i as BackendConfig, it as SIDEBAR_RAIL_LABELED_WIDTH, j as ResourceMeter, k as ActivityFeed, l as UsageSummary, m as ProfileSelector, n as PromoBanner, nt as SIDEBAR_MOBILE_WIDTH, o as ProcessList, ot as SIDEBAR_TOTAL_WIDTH, p as ProfileComparison, q as SidebarContent, r as SnapshotList, rt as SIDEBAR_PANEL_WIDTH, s as PortsList, st as SidebarProvider, t as InfoPanel, tt as RailTooltip, u as SystemLogsViewer, v as HarnessPicker, w as InvoiceTable, x as HarnessLogo, y as chatCapableHarnesses, z as RailCollapseToggle } from "./dashboard-2z8THYrD.js";
2
2
  import { n as canonicalModelId, r as modelBrandFor, t as ModelBrandStack } from "./model-brand-hMyDTUqB.js";
3
3
  import { a as PricingPage, i as UsageChart, n as SandboxPageShell, o as formatPrice, r as TemplateCard, s as BillingDashboard, t as DashboardPageHeader } from "./page-layout-DJV7cbxx.js";
4
4
  export { ActivityFeed, BackendConfig, BackendSelector, BillingDashboard, ClusterStatusBar, CreditBalance, DashboardLayout, DashboardPageHeader, GitPanel, HARNESS_BRAND, HARNESS_OPTIONS, HarnessLogo, HarnessPicker, INSUFFICIENT_BALANCE_CODE, InfoPanel, InvoiceTable, MetricAreaChart, ModelBrandStack, NetworkConfig, NewSandboxCard, OutOfCreditsModal, PlanCards, PortsList, PricingPage, ProcessList, ProfileAvatar, ProfileComparison, ProfileSelector, PromoBanner, RailButton, RailCollapseToggle, RailExpandable, RailFlyout, RailHeader, RailModeButton, RailSeparator, RailThemeToggle, RailTooltip, ResourceMeter, ResourceSnapshot, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_LABELED_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, SandboxPageShell, SandboxTable, Sidebar, SidebarContent, SidebarLayout, SidebarPanel, SidebarPanelContent, SidebarPanelHeader, SidebarProvider, SidebarRail, SidebarRailFooter, SidebarRailHeader, SidebarRailNav, SnapshotList, SystemLogsViewer, TemplateCard, UsageChart, UsageSummary, VariantList, canAdminSandbox, canonicalModelId, chatCapableHarnesses, formatPrice, modelBrandFor, parseInsufficientBalance, useSidebar };
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
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-BAPaCOCB.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-HbWxUqrR.js";
2
2
  import { $ as Select, A as DropdownMenuItem, B as DropdownMenuTrigger, Bt as buttonVariants, C as DialogTitle, Ct as TableRow, D as DropdownMenuCheckboxItem, Dt as TabsTrigger, E as DropdownMenu, Et as TabsList, F as DropdownMenuSeparator, Ft as ToastContainer, G as Input, Gt as TangleKnot, H as FilterField, Ht as useToast, I as DropdownMenuShortcut, It as ToastProvider, J as MetricStrip, K as Label, L as DropdownMenuSub, Lt as Toolbar, M as DropdownMenuPortal, Mt as TextShimmer, N as DropdownMenuRadioGroup, Nt as Textarea, O as DropdownMenuContent, P as DropdownMenuRadioItem, Pt as ThemeToggle, Q as SegmentedControl, R as DropdownMenuSubContent, Rt as UploadProgress, S as DialogPortal, St as TableHeader, T as DropZone, Tt as TabsContent, U as Heading, Ut as SectionTitle, V as EmptyState, Vt as useTheme, W as InlineCode, Wt as Logo, X as PageShell, Y as PageHeader, Z as Progress, _ as DialogContent, _t as TableBody, a as Badge, at as SelectScrollUpButton, b as DialogHeader, bt as TableFooter, c as CardContent, ct as SelectValue, d as CardHeader, dt as SkeletonCard, et as SelectContent, f as CardTitle, ft as SkeletonTable, g as DialogClose, gt as Table, h as Dialog, ht as Switch, i as AvatarImage, it as SelectScrollDownButton, j as DropdownMenuLabel, k as DropdownMenuGroup, kt as TerminalDisplay, l as CardDescription, lt as SidebarDropZone, m as CopyButton, mt as StatusPill, n as Avatar, nt as SelectItem, o as Button, ot as SelectSeparator, p as CodeBlock, pt as StatCard, q as Metric, r as AvatarFallback, rt as SelectLabel, s as Card, st as SelectTrigger, tt as SelectGroup, u as CardFooter, ut as Skeleton, v as DialogDescription, vt as TableCaption, w as DialogTrigger, wt as Tabs, x as DialogOverlay, xt as TableHead, y as DialogFooter, yt as TableCell, z as DropdownMenuSubTrigger, zt as badgeVariants } from "./primitives-Db_ASpuT.js";
3
3
  import { t as WorkspacePaneHeader } from "./workspace-pane-header-Bg1cCcHX.js";
4
4
  import { C as WorkspaceLayout, S as DirectoryPane, _ as formatRelativeAge, a as TaskBoard, b as StatusBar, c as SandboxWorkbench, d as createShellShouldRevalidate, f as shellShouldRevalidate, g as useOptimisticSessionItems, h as dispatchSessionCreated, i as CalendarView, l as WorkspaceArtifactView, m as SESSION_CREATED_EVENT, n as WorkspaceFilesPane, o as AuditResults, p as SessionSidebar, r as ApprovalQueue, s as AgentWorkbench, t as ArtifactPane, u as SessionActivityMonitor, v as RuntimePane, x as StatusBanner, y as TerminalPanel } from "./workspace-CjeZTLPQ.js";
5
- import { $ as SidebarRailHeader, A as ResourceSnapshot, B as RailExpandable, C as PlanCards, D as SandboxCard, E as NewSandboxCard, F as parseInsufficientBalance, G as RailThemeToggle, H as RailHeader, I as CreditBalance, J as SidebarPanel, K as Sidebar, L as ProfileAvatar, M as ClusterStatusBar, N as INSUFFICIENT_BALANCE_CODE, O as canAdminSandbox, P as OutOfCreditsModal, Q as SidebarRailFooter, R as RailButton, S as BackendSelector, T as SandboxTable, U as RailModeButton, V as RailFlyout, W as RailSeparator, X as SidebarPanelHeader, Y as SidebarPanelContent, Z as SidebarRail, _ as HARNESS_OPTIONS, a as NetworkConfig, at as SIDEBAR_RAIL_WIDTH, b as HARNESS_BRAND, c as GitPanel, ct as useSidebar, d as VariantList, et as SidebarRailNav, f as MetricAreaChart, g as DashboardLayout, h as SidebarLayout, i as BackendConfig, it as SIDEBAR_RAIL_LABELED_WIDTH, j as ResourceMeter, k as ActivityFeed, l as UsageSummary, m as ProfileSelector, n as PromoBanner, nt as SIDEBAR_MOBILE_WIDTH, o as ProcessList, ot as SIDEBAR_TOTAL_WIDTH, p as ProfileComparison, q as SidebarContent, r as SnapshotList, rt as SIDEBAR_PANEL_WIDTH, s as PortsList, st as SidebarProvider, t as InfoPanel, tt as RailTooltip, u as SystemLogsViewer, v as HarnessPicker, w as InvoiceTable, x as HarnessLogo, y as chatCapableHarnesses, z as RailCollapseToggle } from "./dashboard-C2VXLIQC.js";
5
+ import { $ as SidebarRailHeader, A as ResourceSnapshot, B as RailExpandable, C as PlanCards, D as SandboxCard, E as NewSandboxCard, F as parseInsufficientBalance, G as RailThemeToggle, H as RailHeader, I as CreditBalance, J as SidebarPanel, K as Sidebar, L as ProfileAvatar, M as ClusterStatusBar, N as INSUFFICIENT_BALANCE_CODE, O as canAdminSandbox, P as OutOfCreditsModal, Q as SidebarRailFooter, R as RailButton, S as BackendSelector, T as SandboxTable, U as RailModeButton, V as RailFlyout, W as RailSeparator, X as SidebarPanelHeader, Y as SidebarPanelContent, Z as SidebarRail, _ as HARNESS_OPTIONS, a as NetworkConfig, at as SIDEBAR_RAIL_WIDTH, b as HARNESS_BRAND, c as GitPanel, ct as useSidebar, d as VariantList, et as SidebarRailNav, f as MetricAreaChart, g as DashboardLayout, h as SidebarLayout, i as BackendConfig, it as SIDEBAR_RAIL_LABELED_WIDTH, j as ResourceMeter, k as ActivityFeed, l as UsageSummary, m as ProfileSelector, n as PromoBanner, nt as SIDEBAR_MOBILE_WIDTH, o as ProcessList, ot as SIDEBAR_TOTAL_WIDTH, p as ProfileComparison, q as SidebarContent, r as SnapshotList, rt as SIDEBAR_PANEL_WIDTH, s as PortsList, st as SidebarProvider, t as InfoPanel, tt as RailTooltip, u as SystemLogsViewer, v as HarnessPicker, w as InvoiceTable, x as HarnessLogo, y as chatCapableHarnesses, z as RailCollapseToggle } from "./dashboard-2z8THYrD.js";
6
6
  import { n as canonicalModelId, r as modelBrandFor, t as ModelBrandStack } from "./model-brand-hMyDTUqB.js";
7
7
  import { a as PricingPage, i as UsageChart, n as SandboxPageShell, o as formatPrice, r as TemplateCard, s as BillingDashboard, t as DashboardPageHeader } from "./page-layout-DJV7cbxx.js";
8
8
  import { t as usePtySession } from "./use-pty-session-Bf4hBLXJ.js";
@@ -1279,6 +1279,35 @@ const TONE_ACCENT = {
1279
1279
  structural: "var(--surface-warning-text)",
1280
1280
  action: "hsl(var(--muted-foreground))"
1281
1281
  };
1282
+ /** Per-KIND resting accents. A tone is layout vocabulary; a kind is identity:
1283
+ * without this map every action node rests in the same neutral gray, and a
1284
+ * pipeline of agent steps reads as one flat field against the canvas. Each
1285
+ * accent is a semantic token (theme-reactive, defined by the host app), never
1286
+ * a palette literal:
1287
+ * agent.run primary indigo — the workhorse carries the brand
1288
+ * script.run info — code/compute
1289
+ * sandbox.* success — provisioned infrastructure
1290
+ * integration/notify info — the outside world
1291
+ * Run state still wins when a run is live: statusBorder recolors the border
1292
+ * and the glow, so the resting identity never competes with the run's front. */
1293
+ const KIND_ACCENT = {
1294
+ "agent.run": "hsl(var(--primary))",
1295
+ "script.run": "var(--surface-info-text)",
1296
+ "sandbox.spawn": "var(--surface-success-text)",
1297
+ "sandbox.snapshot": "var(--surface-success-text)",
1298
+ "integration.invoke": "var(--surface-info-text)",
1299
+ "line.send": "var(--surface-info-text)",
1300
+ notify: "var(--surface-info-text)"
1301
+ };
1302
+ /** The accent a node presents at rest: its kind's identity when it has one,
1303
+ * its tone otherwise (trigger/structural keep their tone-driven accents). */
1304
+ function kindAccent(tone, kind) {
1305
+ return (kind !== void 0 ? KIND_ACCENT[kind] : void 0) ?? TONE_ACCENT[tone];
1306
+ }
1307
+ /** Resting elevation: the quiet card still sits ON the canvas rather than in
1308
+ * it. Foreground-token shadows so both themes get depth without a dark-mode
1309
+ * black box. */
1310
+ const RESTING_SHADOW = "0 1px 2px hsl(var(--foreground) / 0.08), 0 10px 28px -16px hsl(var(--foreground) / 0.28)";
1282
1311
  const STATUS_QUEUED = "hsl(var(--muted-foreground))";
1283
1312
  const STATUS_COLOR = {
1284
1313
  queued: STATUS_QUEUED,
@@ -1577,7 +1606,7 @@ function NodeMark({ kind, provider, model, accent, tile }) {
1577
1606
  style: {
1578
1607
  width: tile,
1579
1608
  height: tile,
1580
- background: `color-mix(in srgb, ${accent} 10%, hsl(var(--card)))`
1609
+ background: `color-mix(in srgb, ${accent} 14%, hsl(var(--card)))`
1581
1610
  },
1582
1611
  children: provider ? /* @__PURE__ */ jsx(ProviderIcon, {
1583
1612
  id: provider,
@@ -1772,4 +1801,4 @@ function NodeOutputBody({ shape, rows = 2, tone = "default" }) {
1772
1801
  });
1773
1802
  }
1774
1803
  //#endregion
1775
- export { actionPathLabel as A, branchNodeId as C, triggerNodeIndex as D, triggerNodeId as E, fmtCost as F, fmtDuration as I, fmtTokens as L, parseActionPath as M, shortModel as N, wfEdgeId as O, clampPreview as P, actionNodeId as S, isStructuralKind as T, problemSurface as _, NodeMark as a, COMPACT_NODE_SIZE as b, STATUS_COLOR as c, StatusFooter as d, StatusPill as f, problemBorder as g, emptySlotLabel as h, KIND_ICON as i, humanizeIdentifier as j, worstSeverity as k, STATUS_LABEL as l, edgeColor as m, classifyOutput as n, ProblemMarker as o, TONE_ACCENT as p, condenseText as r, ProblemMessages as s, NodeOutputBody as t, STATUS_PILL as u, problemTitle as v, buildWorkflowGraph as w, TRIGGER_NODE_ID as x, statusBorder as y };
1804
+ export { worstSeverity as A, actionNodeId as C, triggerNodeId as D, isStructuralKind as E, clampPreview as F, fmtCost as I, fmtDuration as L, humanizeIdentifier as M, parseActionPath as N, triggerNodeIndex as O, shortModel as P, fmtTokens as R, TRIGGER_NODE_ID as S, buildWorkflowGraph as T, problemBorder as _, NodeMark as a, statusBorder as b, RESTING_SHADOW as c, STATUS_PILL as d, StatusFooter as f, kindAccent as g, emptySlotLabel as h, KIND_ICON as i, actionPathLabel as j, wfEdgeId as k, STATUS_COLOR as l, edgeColor as m, classifyOutput as n, ProblemMarker as o, StatusPill as p, condenseText as r, ProblemMessages as s, NodeOutputBody as t, STATUS_LABEL as u, problemSurface as v, branchNodeId as w, COMPACT_NODE_SIZE as x, problemTitle as y };
@@ -1,5 +1,5 @@
1
1
  import { t as cn$1 } from "./utils-DzWbktWG.js";
2
- import { s as PortsList } from "./dashboard-C2VXLIQC.js";
2
+ import { s as PortsList } from "./dashboard-2z8THYrD.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-BAPaCOCB.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-HbWxUqrR.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 { A as actionPathLabel, C as branchNodeId, D as triggerNodeIndex, E as triggerNodeId, M as parseActionPath, N as shortModel, S as actionNodeId, a as NodeMark, c as STATUS_COLOR, f as StatusPill, i as KIND_ICON, j as humanizeIdentifier, l as STATUS_LABEL, n as classifyOutput, r as condenseText, t as NodeOutputBody, u as STATUS_PILL, w as buildWorkflowGraph, x as TRIGGER_NODE_ID } from "./node-output-D-fYilAu.js";
2
+ import { C as actionNodeId, D as triggerNodeId, M as humanizeIdentifier, N as parseActionPath, O as triggerNodeIndex, P as shortModel, S as TRIGGER_NODE_ID, T as buildWorkflowGraph, a as NodeMark, d as STATUS_PILL, i as KIND_ICON, j as actionPathLabel, l as STATUS_COLOR, n as classifyOutput, p as StatusPill, r as condenseText, t as NodeOutputBody, u as STATUS_LABEL, w as branchNodeId } from "./node-output-D_m-vmHB.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-B4mkYGe3.js").then((m) => ({ default: m.WorkflowGraph }))));
33
+ return lazy(() => retryImport(() => import("./WorkflowGraph-i6XZ90Ae.js").then((m) => ({ default: m.WorkflowGraph }))));
34
34
  }
35
35
  var GraphErrorBoundary = class extends Component {
36
36
  state = { hasError: false };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "0.123.2",
3
+ "version": "0.123.3",
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",