@tangle-network/sandbox-ui 2.0.11 → 2.0.13

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.
Files changed (35) hide show
  1. package/dist/{node-ui-D8dbX86X.js → AgentGraph-CqLe8WCH.js} +43 -123
  2. package/dist/AgentGraph-P7l-jZwo.d.ts +4 -0
  3. package/dist/{WorkflowGraph-BtJnA5iY.js → WorkflowGraph-s3RZ-ANZ.js} +6 -7
  4. package/dist/{dashboard-FMrtIe9S.js → dashboard-D3JhmRhe.js} +4 -4
  5. package/dist/dashboard.js +1 -1
  6. package/dist/globals.css +1550 -87
  7. package/dist/{index-BK8KKLNY.d.ts → index-CEtc2U5v.d.ts} +2 -2
  8. package/dist/{index-BKchjsHk.d.ts → index-q-I_XQu4.d.ts} +6 -16
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.js +6 -7
  11. package/dist/motion-2Ine0j_s.js +1 -0
  12. package/dist/primitives-znfPK9NP.js +23 -0
  13. package/dist/primitives.d.ts +1 -1
  14. package/dist/primitives.js +1 -1
  15. package/dist/{record-D-evY-c_.js → record-Dt9gqJee.js} +67 -24
  16. package/dist/run/record.js +1 -1
  17. package/dist/{run-CJyFiBG9.js → run-DBTbnQrC.js} +7 -6
  18. package/dist/run.d.ts +1 -1
  19. package/dist/run.js +2 -3
  20. package/dist/styles.css +1550 -87
  21. package/dist/tailwind.css +1800 -79
  22. package/dist/{workbench-BVnZNhP2.js → workbench-D9Bm4vMq.js} +1 -1
  23. package/dist/workbench.js +1 -1
  24. package/dist/workflows.d.ts +4 -59
  25. package/dist/workflows.js +62 -2
  26. package/dist/{workspace-CdcRUl-H.js → workspace-CJnBqCqj.js} +7 -7
  27. package/dist/workspace.js +1 -1
  28. package/package.json +5 -6
  29. package/dist/AgentGraph-CFlI9qta.js +0 -1380
  30. package/dist/AgentGraph-DzdpPFEI.d.ts +0 -132
  31. package/dist/AgentGraphCanvas-CmxReSqa.js +0 -1403
  32. package/dist/canvas-theme-aqWjGbfu.js +0 -55
  33. package/dist/latest-events-v_vXRyd7.js +0 -169
  34. package/dist/motion-Bn7ESHrj.js +0 -6
  35. package/dist/primitives-CCdx5Hh_.js +0 -23
@@ -1,9 +1,10 @@
1
1
  import { i as modelBrandFor, t as ModelBrandStack } from "./model-brand-bTcMjQtB.js";
2
2
  import { t as ProviderIcon } from "./provider-logo-CPKRPHcS.js";
3
- import { r as clampPreview } from "./AgentGraph-CFlI9qta.js";
4
3
  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";
4
+ import { AlertTriangle, Bell, Bot, Box, Cable, Camera, Circle, Clock, Code, GitBranch, Repeat, ScanSearch, Sparkles, UserCheck, Webhook, Wrench, Zap } from "lucide-react";
5
+ import { RESTING_BORDER, RESTING_BORDER as RESTING_BORDER$1, RESTING_SHADOW, RESTING_SHADOW as RESTING_SHADOW$1, actionPathLabel, clampPreview, edgeColor, fmtCost, fmtDuration, fmtTokens, humanizeIdentifier, parseActionPath, shortModel } from "@tangle-network/charts/react/agent-graph/presentation";
6
6
  import { RunStatusIcon, statusMeta } from "@tangle-network/ui/run";
7
+ import { AgentGraph } from "@tangle-network/charts/react/agent-graph";
7
8
  import { parse } from "yaml";
8
9
  // src/workflows/cron.ts
9
10
  /**
@@ -125,121 +126,6 @@ function describeCron(expression) {
125
126
  if (day !== null && day >= 1 && day <= 31) return `Monthly on the ${ordinal(day)} at ${time}`;
126
127
  return raw;
127
128
  }
128
- // src/workflows/naming.ts
129
- /**
130
- * Human-facing naming for workflow nodes. A definition addresses things by
131
- * machine identifier — an action kind (`agent.run`), a hub action path
132
- * (`github.pulls.reviews.create`), a profile slug (`pr-reviewer`) — and showing
133
- * those verbatim on a node makes the graph read like a config file. These turn
134
- * an identifier into the label a person would say out loud.
135
- *
136
- * Pure and dependency-free so the naming rules are unit-testable without the
137
- * YAML parser or a render.
138
- */
139
- /** Identifier fragments that read as an initialism, so they are upper-cased
140
- * whole rather than sentence-cased into "Pr" / "Api". */
141
- const ACRONYMS = /* @__PURE__ */ new Set([
142
- "ai",
143
- "api",
144
- "cd",
145
- "ci",
146
- "cli",
147
- "cpu",
148
- "css",
149
- "csv",
150
- "db",
151
- "dns",
152
- "gpu",
153
- "html",
154
- "http",
155
- "https",
156
- "id",
157
- "io",
158
- "ip",
159
- "json",
160
- "llm",
161
- "mcp",
162
- "ml",
163
- "pr",
164
- "qa",
165
- "sdk",
166
- "sla",
167
- "sql",
168
- "ssh",
169
- "ui",
170
- "url",
171
- "uuid",
172
- "vm",
173
- "yaml"
174
- ]);
175
- /** Split a machine identifier into its words, on separators and camelCase humps. */
176
- function words(id) {
177
- return id.replace(/[._\-/]+/g, " ").replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2").trim().split(/\s+/).filter(Boolean);
178
- }
179
- /**
180
- * Humanize a machine identifier: `pr-reviewer` → "PR reviewer", `sandbox.spawn`
181
- * → "Sandbox spawn", `postMessage` → "Post message". Known initialisms are
182
- * upper-cased wherever they appear; `lead` picks the case of the rest.
183
- *
184
- * - `sentence` (default): "Create issue comment" — a label or a title.
185
- * - `lower`: "create issue comment" — a fragment that sits INSIDE a phrase
186
- * ("On pull request"), where a capital would read as a new sentence. An
187
- * initialism still wins: `ci_run_completed` → "CI run completed", never
188
- * "cI run completed".
189
- * - `title`: "Google Sheets" — a brand/proper name.
190
- *
191
- * An identifier that carries no word characters is returned verbatim rather than
192
- * blanked.
193
- */
194
- function humanizeIdentifier(id, lead = "sentence") {
195
- const parts = words(id);
196
- if (parts.length === 0) return id;
197
- return parts.map((word, i) => {
198
- const lower = word.toLowerCase();
199
- if (ACRONYMS.has(lower)) return lower.toUpperCase();
200
- const capitalized = lower.charAt(0).toUpperCase() + lower.slice(1);
201
- if (lead === "title") return capitalized;
202
- if (i > 0) return lower;
203
- return lead === "lower" ? lower : capitalized;
204
- }).join(" ");
205
- }
206
- /** A model slug without its provider prefix (`anthropic/claude-sonnet-5` →
207
- * `claude-sonnet-5`) — the vendor is noise on a card whose width is the scarce
208
- * resource, and the full slug stays in the node's config for the detail view. */
209
- function shortModel(model) {
210
- const slash = model.lastIndexOf("/");
211
- return slash === -1 ? model : model.slice(slash + 1);
212
- }
213
- /** The charset a hub action path is made of (mirrors the server's path schema:
214
- * `<provider>.<action…>`, letters/digits/`_`/`-` per segment). A value that
215
- * isn't one — most importantly a `${…}` mapping expression, which also contains
216
- * dots — must not be split into a bogus provider (whose brand logo we'd then go
217
- * and fetch). */
218
- const ACTION_PATH = /^[a-z0-9_-]+(\.[a-z0-9_-]+)+$/i;
219
- /** Split a hub action path into provider / resource / operation. Null when the
220
- * value isn't a dotted path (a `${…}` expression, or a bare word), so callers
221
- * fall back to showing it verbatim instead of inventing structure. */
222
- function parseActionPath(path) {
223
- if (!ACTION_PATH.test(path.trim())) return null;
224
- const [provider, ...rest] = path.trim().split(".");
225
- return {
226
- provider,
227
- operation: rest[rest.length - 1],
228
- resource: rest.length > 1 ? rest.slice(0, -1).join(".") : void 0
229
- };
230
- }
231
- /**
232
- * The operation label for an action path, in n8n's `operation: resource` shape:
233
- * `github.pulls.reviews.create` → "create: pulls.reviews", `slack.postMessage`
234
- * → "post message". The provider names the node itself (its title + logo), so
235
- * it is deliberately absent here. A path we can't split is shown verbatim.
236
- */
237
- function actionPathLabel(path) {
238
- const parts = parseActionPath(path);
239
- if (!parts) return path;
240
- const operation = humanizeIdentifier(parts.operation, "lower");
241
- return parts.resource ? `${operation}: ${parts.resource}` : operation;
242
- }
243
129
  // src/workflows/provider-label.ts
244
130
  /**
245
131
  * Display label for a connector slug ("github" → "GitHub"). Separate from
@@ -1288,10 +1174,8 @@ function kindAccent(tone, kind) {
1288
1174
  return (kind !== void 0 ? KIND_ACCENT[kind] : void 0) ?? TONE_ACCENT[tone];
1289
1175
  }
1290
1176
  /** Brand shadow channels stay black in dark mode. */
1291
- const RESTING_SHADOW = "inset 0 1px 0 hsl(var(--foreground) / 0.06), 0 1px 3px hsl(var(--shadow-color) / 0.08)";
1292
1177
  /** The resting card border: visible against the canvas in BOTH themes —
1293
1178
  * `--border` vanished on dark. */
1294
- const RESTING_BORDER = "hsl(var(--foreground) / 0.14)";
1295
1179
  /** Workflow waiting means human approval; peer waiting remains neutral in agent views. */
1296
1180
  const workflowStatus = (status) => status === "waiting" ? "needs-you" : status === "skipped" ? "stopped" : status;
1297
1181
  const workflowMeta = (status) => statusMeta(workflowStatus(status));
@@ -1312,9 +1196,6 @@ const STATUS_PILL = Object.fromEntries(workflowStatuses.map((status) => [status,
1312
1196
  background: "transparent",
1313
1197
  borderColor: "hsl(var(--border))"
1314
1198
  }]));
1315
- function edgeColor(status) {
1316
- return status === "failed" || status === "waiting" ? STATUS_COLOR[status] : "color-mix(in srgb, hsl(var(--muted-foreground)) 80%, transparent)";
1317
- }
1318
1199
  function statusBorder(status) {
1319
1200
  return {
1320
1201
  borderColor: status === "failed" || status === "waiting" ? STATUS_COLOR[status] : RESTING_BORDER,
@@ -1583,4 +1464,43 @@ function NodeMark({ kind, provider, model, accent, tile }) {
1583
1464
  })
1584
1465
  });
1585
1466
  }
1586
- export { worstSeverity as A, actionNodeId as C, triggerNodeId as D, isStructuralKind as E, humanizeIdentifier as M, parseActionPath as N, triggerNodeIndex as O, shortModel as P, TRIGGER_NODE_ID as S, buildWorkflowGraph as T, problemBorder as _, ProblemMessages as a, statusBorder as b, STATUS_COLOR as c, STATUS_TONE as d, StatusFooter as f, kindAccent as g, emptySlotLabel as h, ProblemMarker as i, actionPathLabel as j, wfEdgeId as k, STATUS_LABEL as l, edgeColor as m, KIND_ICON as n, RESTING_BORDER as o, StatusPill as p, NodeMark as r, RESTING_SHADOW as s, KIND_ACCENT as t, STATUS_PILL as u, problemSurface as v, branchNodeId as w, COMPACT_NODE_SIZE as x, problemTitle as y };
1467
+ // src/workflows/AgentGraph.tsx
1468
+ /** Sandbox identity around the canonical Charts multi-agent topology. */
1469
+ function agentMark(agent, layout, size) {
1470
+ if (layout === "tree") return /* @__PURE__ */ jsx(NodeMark, {
1471
+ kind: "agent.run",
1472
+ model: agent.model ?? void 0,
1473
+ accent: KIND_ACCENT["agent.run"],
1474
+ tile: size
1475
+ });
1476
+ const brand = agent.model ? modelBrandFor(agent.model) : null;
1477
+ return brand ? /* @__PURE__ */ jsx("span", {
1478
+ className: "ag-model-mark",
1479
+ children: /* @__PURE__ */ jsx(ModelBrandStack, {
1480
+ identity: brand,
1481
+ size: "sm"
1482
+ })
1483
+ }) : /* @__PURE__ */ jsx(Bot, {
1484
+ size: 16,
1485
+ "aria-hidden": true
1486
+ });
1487
+ }
1488
+ function toolMark(tool, label, size) {
1489
+ return tool?.provider ? /* @__PURE__ */ jsx(ProviderIcon, {
1490
+ id: tool.provider,
1491
+ displayName: label,
1492
+ size: Math.round(size * .46),
1493
+ className: "ag-model-mark"
1494
+ }) : /* @__PURE__ */ jsx(Wrench, {
1495
+ size: size * .4,
1496
+ "aria-hidden": true
1497
+ });
1498
+ }
1499
+ function AgentGraph$1(props) {
1500
+ return /* @__PURE__ */ jsx(AgentGraph, {
1501
+ renderAgentMark: agentMark,
1502
+ renderToolMark: toolMark,
1503
+ ...props
1504
+ });
1505
+ }
1506
+ 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 _, ProblemMessages as a, statusBorder as b, STATUS_COLOR as c, STATUS_TONE as d, StatusFooter as f, kindAccent as g, emptySlotLabel as h, ProblemMarker as i, actionPathLabel as j, wfEdgeId as k, STATUS_LABEL as l, edgeColor as m, KIND_ICON as n, RESTING_BORDER$1 as o, StatusPill as p, NodeMark as r, RESTING_SHADOW$1 as s, AgentGraph$1 as t, STATUS_PILL as u, problemSurface as v, branchNodeId as w, COMPACT_NODE_SIZE as x, problemTitle as y };
@@ -0,0 +1,4 @@
1
+ import { AgentGraphActivity, AgentGraphCall, AgentGraphCallKind, AgentGraphDirection, AgentGraphEdge, AgentGraphEdgeKind, AgentGraphEvent, AgentGraphNode, AgentGraphProps, AgentGraphStatus, AgentGraphTool } from "@tangle-network/charts/react/agent-graph";
2
+ interface AgentGraphProps$1 extends AgentGraphProps {}
3
+ declare function AgentGraph$1(props: AgentGraphProps$1): import("react").JSX.Element;
4
+ export { AgentGraphDirection as a, AgentGraphEvent as c, AgentGraphStatus as d, AgentGraphTool as f, AgentGraphCallKind as i, AgentGraphNode as l, AgentGraphActivity as n, AgentGraphEdge as o, AgentGraphCall as r, AgentGraphEdgeKind as s, AgentGraph$1 as t, AgentGraphProps$1 as u };
@@ -1,10 +1,9 @@
1
- import { a as fmtDuration, c as fmtTokens, i as fmtCost, r as clampPreview } from "./AgentGraph-CFlI9qta.js";
2
- import { A as worstSeverity, E as isStructuralKind, O as triggerNodeIndex, P as shortModel, T as buildWorkflowGraph, _ as problemBorder, a as ProblemMessages, b as statusBorder, c as STATUS_COLOR, f as StatusFooter, g as kindAccent, h as emptySlotLabel, i as ProblemMarker, k as wfEdgeId, l as STATUS_LABEL, m as edgeColor, o as RESTING_BORDER, p as StatusPill, r as NodeMark, s as RESTING_SHADOW, v as problemSurface, x as COMPACT_NODE_SIZE, y as problemTitle } from "./node-ui-D8dbX86X.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 ProblemMessages, b as statusBorder, c as STATUS_COLOR, f as StatusFooter, g as kindAccent, h as emptySlotLabel, i as ProblemMarker, k as wfEdgeId, l as STATUS_LABEL, m as edgeColor, o as RESTING_BORDER$1, p as StatusPill, r as NodeMark, s as RESTING_SHADOW$1, v as problemSurface, x as COMPACT_NODE_SIZE, y as problemTitle } from "./AgentGraph-CqLe8WCH.js";
3
2
  import { n as classifyOutput, t as NodeOutputBody } from "./node-output-DlySTwxr.js";
4
- import { i as loadElk, n as motionAllowed, r as useColorMode, t as SELECTION_OUTLINE } from "./canvas-theme-aqWjGbfu.js";
5
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
4
  import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
7
5
  import { Expand, Maximize2, Minimize2, Plus, Shrink, X } from "lucide-react";
6
+ import { SELECTION_OUTLINE, loadElk, motionAllowed, useColorMode } from "@tangle-network/charts/react/agent-graph/presentation";
8
7
  import { Background, BaseEdge, Controls, EdgeLabelRenderer, Handle, MarkerType, MiniMap, Panel, Position, ReactFlow, ViewportPortal, getSmoothStepPath, getViewportForBounds, useEdgesState, useNodesState, useStore } from "@xyflow/react";
9
8
  import "@xyflow/react/dist/style.css";
10
9
  // src/workflows/flow-graph.ts
@@ -1190,8 +1189,8 @@ function WorkflowNode({ id, data, sourcePosition, targetPosition }) {
1190
1189
  width: 76,
1191
1190
  height: 76,
1192
1191
  ...state ? statusBorder(state.status) : problemSeverity ? problemBorder(problemSeverity) : {
1193
- borderColor: RESTING_BORDER,
1194
- boxShadow: RESTING_SHADOW
1192
+ borderColor: RESTING_BORDER$1,
1193
+ boxShadow: RESTING_SHADOW$1
1195
1194
  },
1196
1195
  ...selected ? SELECTION_OUTLINE : {}
1197
1196
  },
@@ -1260,8 +1259,8 @@ function WorkflowNode({ id, data, sourcePosition, targetPosition }) {
1260
1259
  className: "relative flex h-full w-full flex-col overflow-hidden rounded-xl border bg-card shadow-sm transition-colors",
1261
1260
  style: {
1262
1261
  ...runStatus ? statusBorder(runStatus) : problemSeverity ? problemBorder(problemSeverity) : {
1263
- borderColor: RESTING_BORDER,
1264
- boxShadow: RESTING_SHADOW
1262
+ borderColor: RESTING_BORDER$1,
1263
+ boxShadow: RESTING_SHADOW$1
1265
1264
  },
1266
1265
  ...selected ? SELECTION_OUTLINE : {}
1267
1266
  },
@@ -1,7 +1,7 @@
1
- import { D as Button$1, zr as Logo } from "./primitives-CCdx5Hh_.js";
1
+ import { D as Button$1, zr as Logo } from "./primitives-znfPK9NP.js";
2
2
  import { t as cn$1 } from "./utils-BER_bdgE.js";
3
3
  import { r as ShellHeader } from "./shell-header-CwqDzC4I.js";
4
- import { n as MOTION_SURFACE, t as MOTION_CONTROL } from "./motion-Bn7ESHrj.js";
4
+ import { n as MOTION_SURFACE, t as MOTION_CONTROL } from "./motion-2Ine0j_s.js";
5
5
  import { a as moonshot_default } from "./model-brand-bTcMjQtB.js";
6
6
  import "./page-layout-CuOpvZys.js";
7
7
  import { Avatar, AvatarFallback, AvatarImage, Dialog, DialogClose, DialogContent, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Sheet, SheetClose, SheetContent, SheetTitle, SheetTrigger, Skeleton, StatCard, StatusPill } from "@tangle-network/ui/primitives";
@@ -555,7 +555,7 @@ function RailFlyout({ icon: Icon, label, description, isActive, showLabel, title
555
555
  className: "text-sm font-medium",
556
556
  children: label
557
557
  }),
558
- showLabel && /* @__PURE__ */ jsx(ChevronRightIcon, { className: cn$1("ml-auto h-4 w-4 shrink-0 text-muted-foreground/60 transition-transform", "[transition:color_var(--motion-control),background-color_var(--motion-control),border-color_var(--motion-control),box-shadow_var(--motion-control),transform_var(--motion-control),scale_var(--motion-control),opacity_var(--motion-control)] motion-reduce:transition-none", open && "rotate-180") })
558
+ showLabel && /* @__PURE__ */ jsx(ChevronRightIcon, { className: cn$1("ml-auto h-4 w-4 shrink-0 text-muted-foreground/60 transition-transform", MOTION_CONTROL, open && "rotate-180") })
559
559
  ]
560
560
  })
561
561
  }), open && /* @__PURE__ */ jsxs("div", {
@@ -3039,7 +3039,7 @@ function SidebarLayoutInner({ children, navItems, activeId, panel, logo, logoHre
3039
3039
  "aria-expanded": mobileNavOpen,
3040
3040
  "aria-controls": "sidebar-mobile-nav",
3041
3041
  "aria-haspopup": "dialog",
3042
- className: cn$1("flex size-10 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-[var(--accent-surface-soft)] hover:text-foreground", "[transition:color_var(--motion-control),background-color_var(--motion-control),border-color_var(--motion-control),box-shadow_var(--motion-control),transform_var(--motion-control),scale_var(--motion-control),opacity_var(--motion-control)] motion-reduce:transition-none"),
3042
+ className: cn$1("flex size-10 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-[var(--accent-surface-soft)] hover:text-foreground", MOTION_CONTROL),
3043
3043
  children: /* @__PURE__ */ jsx(MenuIcon, { className: "size-5" })
3044
3044
  })
3045
3045
  }),
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-FMrtIe9S.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-D3JhmRhe.js";
2
2
  import { i as modelBrandFor, n as ProviderMark, r as canonicalModelId, t as ModelBrandStack } from "./model-brand-bTcMjQtB.js";
3
3
  import { a as formatPrice, i as PricingPage, n as SandboxPageShell, o as BillingDashboard, r as UsageChart, t as DashboardPageHeader } from "./page-layout-CuOpvZys.js";
4
4
  export { ActivityFeed, BackendSelector, BillingDashboard, DashboardLayout, DashboardPageHeader, GitPanel, HARNESS_BRAND, HARNESS_OPTIONS, HarnessLogo, HarnessPicker, INSUFFICIENT_BALANCE_CODE, MetricAreaChart, ModelBrandStack, NewSandboxCard, OutOfCreditsModal, PortsList, PricingPage, ProcessList, ProfileAvatar, PromoBanner, ProviderMark, RailButton, RailExpandable, RailFlyout, RailHeader, RailModeButton, RailSeparator, RailTooltip, ResourceMeter, ResourceSnapshot, SANDBOX_STATUS, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_LABELED_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, SandboxPageShell, SandboxStatusPill, SandboxTable, Sidebar, SidebarContent, SidebarLayout, SidebarPanel, SidebarPanelContent, SidebarPanelHeader, SidebarProvider, SidebarRail, SidebarRailFooter, SidebarRailNav, SnapshotList, SystemLogsViewer, TemplateCard, UsageChart, UsageSummary, canAdminSandbox, canonicalModelId, chatCapableHarnesses, formatPrice, modelBrandFor, parseInsufficientBalance, sandboxStatus, useSidebar };