@tangle-network/sandbox-ui 0.15.1 → 0.15.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.
@@ -1038,334 +1038,30 @@ function HarnessPicker({
1038
1038
  );
1039
1039
  }
1040
1040
 
1041
- // src/dashboard/model-picker.tsx
1042
- import * as React3 from "react";
1043
- import { ChevronDown as ChevronDown2, Search, Sparkles, Zap, Brain, Star, Loader2 } from "lucide-react";
1044
- import * as Popover from "@radix-ui/react-dropdown-menu";
1045
- import { Fragment as Fragment5, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
1046
- function canonicalModelId(model) {
1047
- const id = model.id;
1048
- if (id.includes("/")) return id;
1049
- const provider = model._provider ?? model.provider;
1050
- return provider ? `${provider}/${id}` : id;
1051
- }
1052
- function formatPricing(pricing) {
1053
- const prompt = Number(pricing?.prompt ?? 0);
1054
- const completion = Number(pricing?.completion ?? 0);
1055
- if (!prompt && !completion) return null;
1056
- const fmt = (n) => {
1057
- const perM = n * 1e6;
1058
- if (perM === 0) return "0";
1059
- if (perM >= 1) return `$${perM.toFixed(2)}`;
1060
- return `$${perM.toFixed(2)}`;
1061
- };
1062
- return `${fmt(prompt)} / ${fmt(completion)} per 1M`;
1063
- }
1064
- function formatContext(ctx) {
1065
- if (!ctx) return null;
1066
- if (ctx >= 1e6) return `${(ctx / 1e6).toFixed(1)}M ctx`;
1067
- if (ctx >= 1e3) return `${Math.round(ctx / 1e3)}k ctx`;
1068
- return `${ctx} ctx`;
1069
- }
1070
- var DEFAULT_PRESETS = [
1071
- {
1072
- id: "fast",
1073
- label: "Fast",
1074
- hint: "Cheapest, lowest latency",
1075
- icon: Zap,
1076
- match: (models) => {
1077
- const ids = models.map(canonicalModelId);
1078
- return ids.find((m) => /gpt-5\.\d+-mini$/.test(m)) ?? ids.find((m) => /gpt-5-mini$/.test(m)) ?? ids.find((m) => m.endsWith("/claude-haiku-4.5")) ?? ids.find((m) => /haiku/.test(m));
1079
- }
1080
- },
1081
- {
1082
- id: "balanced",
1083
- label: "Balanced",
1084
- hint: "Best value for most chat",
1085
- icon: Sparkles,
1086
- match: (models) => {
1087
- const ids = models.map(canonicalModelId);
1088
- return ids.find((m) => /^openai\/gpt-5\.\d+$/.test(m)) ?? ids.find((m) => /^openai\/gpt-5$/.test(m)) ?? ids.find((m) => m.endsWith("/claude-sonnet-4-6")) ?? ids.find((m) => /sonnet/.test(m));
1089
- }
1090
- },
1091
- {
1092
- id: "best",
1093
- label: "Best",
1094
- hint: "Hardest reasoning, highest quality",
1095
- icon: Brain,
1096
- match: (models) => {
1097
- const ids = models.map(canonicalModelId);
1098
- return ids.find((m) => /^openai\/gpt-5\.\d+-pro$/.test(m)) ?? ids.find((m) => /^openai\/o3$/.test(m)) ?? ids.find((m) => m.endsWith("/claude-opus-4-7")) ?? ids.find((m) => /opus/.test(m));
1099
- }
1100
- }
1101
- ];
1102
- function ModelPicker({
1103
- value,
1104
- onChange,
1105
- models,
1106
- loading = false,
1107
- recents,
1108
- presets = DEFAULT_PRESETS,
1109
- excludeProviders,
1110
- modalities,
1111
- variant = "field",
1112
- label = "Model",
1113
- placeholder = "Choose a model",
1114
- className,
1115
- disabled
1116
- }) {
1117
- const [query, setQuery] = React3.useState("");
1118
- const [open, setOpen] = React3.useState(false);
1119
- const filtered = React3.useMemo(() => {
1120
- const excluded = new Set((excludeProviders ?? []).map((p) => p.toLowerCase()));
1121
- const allowedModalities = modalities ? new Set(modalities) : null;
1122
- const q = query.trim().toLowerCase();
1123
- return models.filter((m) => {
1124
- const provider = (m._provider ?? m.provider ?? "").toLowerCase();
1125
- if (excluded.has(provider)) return false;
1126
- if (allowedModalities && m.architecture?.modality && !allowedModalities.has(m.architecture.modality)) return false;
1127
- if (!q) return true;
1128
- const id = canonicalModelId(m).toLowerCase();
1129
- const name = (m.name ?? "").toLowerCase();
1130
- return id.includes(q) || name.includes(q) || provider.includes(q);
1131
- });
1132
- }, [models, query, modalities, excludeProviders]);
1133
- const grouped = React3.useMemo(() => {
1134
- const groups = /* @__PURE__ */ new Map();
1135
- for (const m of filtered) {
1136
- const provider = m._provider ?? m.provider ?? "other";
1137
- const list = groups.get(provider);
1138
- if (list) list.push(m);
1139
- else groups.set(provider, [m]);
1140
- }
1141
- return Array.from(groups.entries()).sort(([a], [b]) => a.localeCompare(b));
1142
- }, [filtered]);
1143
- const current = React3.useMemo(
1144
- () => models.find((m) => canonicalModelId(m) === value),
1145
- [models, value]
1146
- );
1147
- const currentLabel = current?.name ?? current?.id ?? value;
1148
- const recentIds = React3.useMemo(() => {
1149
- if (!recents?.length) return [];
1150
- const lookup = new Map(models.map((m) => [canonicalModelId(m), m]));
1151
- return recents.map((id) => lookup.get(id)).filter((m) => Boolean(m)).slice(0, 4);
1152
- }, [recents, models]);
1153
- const handleSelect = (id) => {
1154
- onChange(id);
1155
- setOpen(false);
1156
- setQuery("");
1157
- };
1158
- const trigger = variant === "pill" ? /* @__PURE__ */ jsxs10(
1159
- "button",
1160
- {
1161
- type: "button",
1162
- disabled,
1163
- className: cn(
1164
- "inline-flex items-center gap-1.5 rounded-full border border-border bg-card",
1165
- "px-2.5 py-1 text-xs font-medium text-foreground",
1166
- "transition-colors duration-[var(--transition-fast)]",
1167
- "hover:border-primary/30 hover:bg-accent/30",
1168
- "focus:outline-none focus:border-primary/40",
1169
- "data-[state=open]:border-primary/40 data-[state=open]:bg-accent/30",
1170
- "disabled:opacity-50 disabled:cursor-not-allowed",
1171
- className
1172
- ),
1173
- children: [
1174
- /* @__PURE__ */ jsx12(Sparkles, { className: "h-3 w-3 text-muted-foreground" }),
1175
- /* @__PURE__ */ jsx12("span", { className: "truncate max-w-[160px]", children: currentLabel || placeholder }),
1176
- /* @__PURE__ */ jsx12(ChevronDown2, { className: "h-3 w-3 text-muted-foreground transition-transform data-[state=open]:rotate-180" })
1177
- ]
1178
- }
1179
- ) : /* @__PURE__ */ jsxs10(
1180
- "button",
1181
- {
1182
- type: "button",
1183
- disabled,
1184
- className: cn(
1185
- "flex w-full items-center justify-between gap-2 rounded-[var(--radius-md)]",
1186
- "border border-border bg-card px-3 py-2.5 text-sm text-left",
1187
- "transition-colors duration-[var(--transition-fast)]",
1188
- "hover:border-primary/20 hover:bg-accent/30",
1189
- "focus:outline-none focus:border-primary/30",
1190
- "data-[state=open]:border-primary/30 data-[state=open]:bg-accent/30",
1191
- "disabled:opacity-50 disabled:cursor-not-allowed",
1192
- className
1193
- ),
1194
- children: [
1195
- /* @__PURE__ */ jsx12("span", { className: cn("truncate", current ? "text-foreground font-medium" : "text-muted-foreground"), children: currentLabel || placeholder }),
1196
- /* @__PURE__ */ jsx12(ChevronDown2, { className: "h-4 w-4 shrink-0 text-muted-foreground transition-transform data-[state=open]:rotate-180" })
1197
- ]
1198
- }
1199
- );
1200
- return /* @__PURE__ */ jsxs10("div", { className: cn(variant === "field" ? "space-y-1.5" : "inline-flex", variant === "field" ? className : void 0), children: [
1201
- variant === "field" && label && /* @__PURE__ */ jsx12("label", { className: "block text-xs font-medium text-muted-foreground uppercase tracking-[0.06em]", children: label }),
1202
- /* @__PURE__ */ jsxs10(Popover.Root, { open, onOpenChange: setOpen, children: [
1203
- /* @__PURE__ */ jsx12(Popover.Trigger, { asChild: true, children: trigger }),
1204
- /* @__PURE__ */ jsx12(Popover.Portal, { children: /* @__PURE__ */ jsxs10(
1205
- Popover.Content,
1206
- {
1207
- sideOffset: 4,
1208
- align: variant === "pill" ? "start" : "start",
1209
- className: cn(
1210
- "z-50 w-[var(--radix-dropdown-menu-trigger-width)] min-w-[320px] max-w-[460px]",
1211
- "max-h-[440px] overflow-hidden flex flex-col",
1212
- "rounded-[var(--radius-md)] border border-border bg-card shadow-[var(--shadow-dropdown)]",
1213
- "data-[state=open]:animate-in data-[state=closed]:animate-out",
1214
- "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
1215
- "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95"
1216
- ),
1217
- children: [
1218
- /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2 border-b border-border px-3 py-2", children: [
1219
- /* @__PURE__ */ jsx12(Search, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }),
1220
- /* @__PURE__ */ jsx12(
1221
- "input",
1222
- {
1223
- type: "text",
1224
- value: query,
1225
- onChange: (e) => setQuery(e.target.value),
1226
- placeholder: "Search models...",
1227
- autoFocus: true,
1228
- className: "flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground"
1229
- }
1230
- ),
1231
- loading && /* @__PURE__ */ jsx12(Loader2, { className: "h-3.5 w-3.5 animate-spin text-muted-foreground" })
1232
- ] }),
1233
- /* @__PURE__ */ jsxs10("div", { className: "flex-1 overflow-y-auto", children: [
1234
- !query && presets.length > 0 && /* @__PURE__ */ jsx12(Section, { label: "Presets", children: presets.map((preset) => {
1235
- const Icon2 = preset.icon ?? Star;
1236
- const matchedId = preset.match(models);
1237
- if (!matchedId) return null;
1238
- const matched = models.find((m) => canonicalModelId(m) === matchedId);
1239
- const isCurrent = matchedId === value;
1240
- return /* @__PURE__ */ jsxs10(
1241
- PickerItem,
1242
- {
1243
- onSelect: () => handleSelect(matchedId),
1244
- active: isCurrent,
1245
- children: [
1246
- /* @__PURE__ */ jsx12(Icon2, { className: "h-3.5 w-3.5 shrink-0 text-[var(--accent-text)]" }),
1247
- /* @__PURE__ */ jsxs10("div", { className: "min-w-0 flex-1", children: [
1248
- /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-1.5", children: [
1249
- /* @__PURE__ */ jsx12("span", { className: "text-sm font-medium", children: preset.label }),
1250
- /* @__PURE__ */ jsxs10("span", { className: "text-[10px] text-muted-foreground truncate", children: [
1251
- "\u2192 ",
1252
- matched?.name ?? matchedId
1253
- ] })
1254
- ] }),
1255
- /* @__PURE__ */ jsx12("span", { className: "text-xs text-muted-foreground", children: preset.hint })
1256
- ] })
1257
- ]
1258
- },
1259
- preset.id
1260
- );
1261
- }) }),
1262
- !query && recentIds.length > 0 && /* @__PURE__ */ jsx12(Section, { label: "Recent", children: recentIds.map((m) => /* @__PURE__ */ jsx12(
1263
- ModelRow,
1264
- {
1265
- model: m,
1266
- active: canonicalModelId(m) === value,
1267
- onSelect: handleSelect
1268
- },
1269
- `recent-${canonicalModelId(m)}`
1270
- )) }),
1271
- grouped.length === 0 ? /* @__PURE__ */ jsx12("div", { className: "px-3 py-8 text-center text-xs text-muted-foreground", children: loading ? "Loading models..." : query ? "No models match." : "No models available." }) : grouped.map(([provider, list]) => /* @__PURE__ */ jsx12(Section, { label: provider, children: list.map((m) => /* @__PURE__ */ jsx12(
1272
- ModelRow,
1273
- {
1274
- model: m,
1275
- active: canonicalModelId(m) === value,
1276
- onSelect: handleSelect
1277
- },
1278
- canonicalModelId(m)
1279
- )) }, provider))
1280
- ] }),
1281
- /* @__PURE__ */ jsxs10("div", { className: "border-t border-border px-3 py-1.5 text-[10px] text-muted-foreground", children: [
1282
- filtered.length,
1283
- " of ",
1284
- models.length,
1285
- " model",
1286
- models.length === 1 ? "" : "s"
1287
- ] })
1288
- ]
1289
- }
1290
- ) })
1291
- ] })
1292
- ] });
1293
- }
1294
- function Section({ label, children }) {
1295
- return /* @__PURE__ */ jsxs10("div", { className: "py-1", children: [
1296
- /* @__PURE__ */ jsx12("div", { className: "px-3 pt-1.5 pb-0.5 text-[10px] font-mono uppercase tracking-widest text-muted-foreground", children: label }),
1297
- /* @__PURE__ */ jsx12("div", { children })
1298
- ] });
1299
- }
1300
- function PickerItem({
1301
- onSelect,
1302
- active,
1303
- children
1304
- }) {
1305
- return /* @__PURE__ */ jsx12(
1306
- Popover.Item,
1307
- {
1308
- onSelect: (e) => {
1309
- e.preventDefault();
1310
- onSelect();
1311
- },
1312
- className: cn(
1313
- "flex cursor-pointer items-start gap-2 px-3 py-2 outline-none",
1314
- "transition-colors duration-[var(--transition-fast)]",
1315
- "hover:bg-accent/40 focus:bg-accent/40",
1316
- active && "bg-[var(--accent-surface-soft)] text-[var(--accent-text)]"
1317
- ),
1318
- children
1319
- }
1320
- );
1321
- }
1322
- function ModelRow({
1323
- model,
1324
- active,
1325
- onSelect
1326
- }) {
1327
- const id = canonicalModelId(model);
1328
- const pricing = formatPricing(model.pricing);
1329
- const ctx = formatContext(model.context_length);
1330
- return /* @__PURE__ */ jsx12(PickerItem, { onSelect: () => onSelect(id), active, children: /* @__PURE__ */ jsxs10("div", { className: "min-w-0 flex-1", children: [
1331
- /* @__PURE__ */ jsxs10("div", { className: "flex items-baseline justify-between gap-2", children: [
1332
- /* @__PURE__ */ jsx12("span", { className: "text-sm font-medium truncate", children: model.name ?? model.id }),
1333
- ctx && /* @__PURE__ */ jsx12("span", { className: "shrink-0 text-[10px] text-muted-foreground", children: ctx })
1334
- ] }),
1335
- /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2 text-[11px] text-muted-foreground", children: [
1336
- /* @__PURE__ */ jsx12("span", { className: "truncate", children: id }),
1337
- pricing && /* @__PURE__ */ jsxs10(Fragment5, { children: [
1338
- /* @__PURE__ */ jsx12("span", { className: "shrink-0", children: "\xB7" }),
1339
- /* @__PURE__ */ jsx12("span", { className: "shrink-0 font-mono", children: pricing })
1340
- ] })
1341
- ] })
1342
- ] }) });
1343
- }
1344
-
1345
1041
  // src/dashboard/dashboard-layout.tsx
1346
- import * as React4 from "react";
1042
+ import * as React3 from "react";
1347
1043
  import { Plus as Plus2, Bell } from "lucide-react";
1348
- import { Fragment as Fragment7, jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1044
+ import { Fragment as Fragment6, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
1349
1045
  function SettingsIconSmall({ className }) {
1350
- return /* @__PURE__ */ jsxs11("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
1351
- /* @__PURE__ */ jsx13("title", { children: "Settings" }),
1352
- /* @__PURE__ */ jsx13("path", { d: "M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z" }),
1353
- /* @__PURE__ */ jsx13("circle", { cx: "12", cy: "12", r: "3" })
1046
+ return /* @__PURE__ */ jsxs10("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
1047
+ /* @__PURE__ */ jsx12("title", { children: "Settings" }),
1048
+ /* @__PURE__ */ jsx12("path", { d: "M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z" }),
1049
+ /* @__PURE__ */ jsx12("circle", { cx: "12", cy: "12", r: "3" })
1354
1050
  ] });
1355
1051
  }
1356
1052
  function MenuIcon({ className }) {
1357
- return /* @__PURE__ */ jsxs11("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
1358
- /* @__PURE__ */ jsx13("title", { children: "Menu icon" }),
1359
- /* @__PURE__ */ jsx13("line", { x1: "4", x2: "20", y1: "12", y2: "12" }),
1360
- /* @__PURE__ */ jsx13("line", { x1: "4", x2: "20", y1: "6", y2: "6" }),
1361
- /* @__PURE__ */ jsx13("line", { x1: "4", x2: "20", y1: "18", y2: "18" })
1053
+ return /* @__PURE__ */ jsxs10("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
1054
+ /* @__PURE__ */ jsx12("title", { children: "Menu icon" }),
1055
+ /* @__PURE__ */ jsx12("line", { x1: "4", x2: "20", y1: "12", y2: "12" }),
1056
+ /* @__PURE__ */ jsx12("line", { x1: "4", x2: "20", y1: "6", y2: "6" }),
1057
+ /* @__PURE__ */ jsx12("line", { x1: "4", x2: "20", y1: "18", y2: "18" })
1362
1058
  ] });
1363
1059
  }
1364
1060
  function XIcon({ className }) {
1365
- return /* @__PURE__ */ jsxs11("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
1366
- /* @__PURE__ */ jsx13("title", { children: "Close icon" }),
1367
- /* @__PURE__ */ jsx13("path", { d: "M18 6 6 18" }),
1368
- /* @__PURE__ */ jsx13("path", { d: "m6 6 12 12" })
1061
+ return /* @__PURE__ */ jsxs10("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
1062
+ /* @__PURE__ */ jsx12("title", { children: "Close icon" }),
1063
+ /* @__PURE__ */ jsx12("path", { d: "M18 6 6 18" }),
1064
+ /* @__PURE__ */ jsx12("path", { d: "m6 6 12 12" })
1369
1065
  ] });
1370
1066
  }
1371
1067
  function formatNotifDate(raw) {
@@ -1379,7 +1075,7 @@ function DefaultLink2({
1379
1075
  children,
1380
1076
  ...rest
1381
1077
  }) {
1382
- return /* @__PURE__ */ jsx13("a", { href: href ?? to, className, ...rest, children });
1078
+ return /* @__PURE__ */ jsx12("a", { href: href ?? to, className, ...rest, children });
1383
1079
  }
1384
1080
  function DashboardLayoutInner({
1385
1081
  children,
@@ -1406,10 +1102,10 @@ function DashboardLayoutInner({
1406
1102
  notifications: notifData
1407
1103
  }) {
1408
1104
  const Link = LinkComponent;
1409
- const [mobileMenuOpen, setMobileMenuOpen] = React4.useState(false);
1410
- const [notificationsOpen, setNotificationsOpen] = React4.useState(false);
1411
- const notifRef = React4.useRef(null);
1412
- React4.useEffect(() => {
1105
+ const [mobileMenuOpen, setMobileMenuOpen] = React3.useState(false);
1106
+ const [notificationsOpen, setNotificationsOpen] = React3.useState(false);
1107
+ const notifRef = React3.useRef(null);
1108
+ React3.useEffect(() => {
1413
1109
  if (!notificationsOpen) return;
1414
1110
  const handler = (e) => {
1415
1111
  if (notifRef.current && !notifRef.current.contains(e.target)) {
@@ -1427,23 +1123,23 @@ function DashboardLayoutInner({
1427
1123
  };
1428
1124
  }, [notificationsOpen]);
1429
1125
  const { contentMargin, hidden, mode, hasPanels, panelOpen } = useSidebar();
1430
- const modeSet = React4.useMemo(() => new Set(modeItems), [modeItems]);
1431
- const sidebarUser = React4.useMemo(
1126
+ const modeSet = React3.useMemo(() => new Set(modeItems), [modeItems]);
1127
+ const sidebarUser = React3.useMemo(
1432
1128
  () => user ? { email: user.email, name: user.name, tier: user.tier, avatarUrl: user.avatarUrl } : void 0,
1433
1129
  [user?.email, user?.name, user?.tier, user?.avatarUrl]
1434
1130
  );
1435
1131
  const activePanel = panels.find((p) => p.mode === mode);
1436
- const buildSidebarContent = React4.useCallback(
1437
- (showLabels) => /* @__PURE__ */ jsxs11(Fragment7, { children: [
1438
- /* @__PURE__ */ jsxs11(SidebarRail, { wide: showLabels, children: [
1439
- /* @__PURE__ */ jsx13(SidebarRailHeader, { children: /* @__PURE__ */ jsx13(Link, { href: "/", to: "/", className: "p-1 rounded-md transition-colors hover:bg-muted/50", children: /* @__PURE__ */ jsx13(Logo, { variant, size: "sm", iconOnly: true }) }) }),
1440
- /* @__PURE__ */ jsx13(SidebarRailNav, { children: navItems.map((item, i) => {
1132
+ const buildSidebarContent = React3.useCallback(
1133
+ (showLabels) => /* @__PURE__ */ jsxs10(Fragment6, { children: [
1134
+ /* @__PURE__ */ jsxs10(SidebarRail, { wide: showLabels, children: [
1135
+ /* @__PURE__ */ jsx12(SidebarRailHeader, { children: /* @__PURE__ */ jsx12(Link, { href: "/", to: "/", className: "p-1 rounded-md transition-colors hover:bg-muted/50", children: /* @__PURE__ */ jsx12(Logo, { variant, size: "sm", iconOnly: true }) }) }),
1136
+ /* @__PURE__ */ jsx12(SidebarRailNav, { children: navItems.map((item, i) => {
1441
1137
  const isMode = modeSet.has(item.id);
1442
1138
  const prevIsMode = i > 0 && modeSet.has(navItems[i - 1].id);
1443
1139
  const showSep = i > 0 && isMode && !prevIsMode;
1444
- return /* @__PURE__ */ jsxs11(React4.Fragment, { children: [
1445
- showSep && /* @__PURE__ */ jsx13(RailSeparator, {}),
1446
- isMode ? /* @__PURE__ */ jsx13(
1140
+ return /* @__PURE__ */ jsxs10(React3.Fragment, { children: [
1141
+ showSep && /* @__PURE__ */ jsx12(RailSeparator, {}),
1142
+ isMode ? /* @__PURE__ */ jsx12(
1447
1143
  RailModeButton,
1448
1144
  {
1449
1145
  mode: item.id,
@@ -1452,7 +1148,7 @@ function DashboardLayoutInner({
1452
1148
  badge: item.badge,
1453
1149
  showLabel: showLabels
1454
1150
  }
1455
- ) : /* @__PURE__ */ jsx13(Link, { href: item.href, to: item.href, children: /* @__PURE__ */ jsx13(
1151
+ ) : /* @__PURE__ */ jsx12(Link, { href: item.href, to: item.href, children: /* @__PURE__ */ jsx12(
1456
1152
  RailButton,
1457
1153
  {
1458
1154
  icon: item.icon,
@@ -1463,11 +1159,11 @@ function DashboardLayoutInner({
1463
1159
  ) })
1464
1160
  ] }, item.id);
1465
1161
  }) }),
1466
- /* @__PURE__ */ jsxs11(SidebarRailFooter, { children: [
1467
- onSettingsClick ? /* @__PURE__ */ jsx13(RailButton, { icon: SettingsIconSmall, label: "Settings", onClick: onSettingsClick, showLabel: showLabels }) : /* @__PURE__ */ jsx13(Link, { href: settingsHref, to: settingsHref, children: /* @__PURE__ */ jsx13(RailButton, { icon: SettingsIconSmall, label: "Settings", showLabel: showLabels }) }),
1162
+ /* @__PURE__ */ jsxs10(SidebarRailFooter, { children: [
1163
+ onSettingsClick ? /* @__PURE__ */ jsx12(RailButton, { icon: SettingsIconSmall, label: "Settings", onClick: onSettingsClick, showLabel: showLabels }) : /* @__PURE__ */ jsx12(Link, { href: settingsHref, to: settingsHref, children: /* @__PURE__ */ jsx12(RailButton, { icon: SettingsIconSmall, label: "Settings", showLabel: showLabels }) }),
1468
1164
  railFooter,
1469
- /* @__PURE__ */ jsx13(RailSeparator, {}),
1470
- /* @__PURE__ */ jsx13(
1165
+ /* @__PURE__ */ jsx12(RailSeparator, {}),
1166
+ /* @__PURE__ */ jsx12(
1471
1167
  ProfileAvatar,
1472
1168
  {
1473
1169
  user: sidebarUser,
@@ -1481,9 +1177,9 @@ function DashboardLayoutInner({
1481
1177
  )
1482
1178
  ] })
1483
1179
  ] }),
1484
- panels.length > 0 && /* @__PURE__ */ jsxs11(SidebarPanel, { children: [
1485
- /* @__PURE__ */ jsx13(SidebarPanelHeader, { title: activePanel?.title ?? mode }),
1486
- /* @__PURE__ */ jsx13(SidebarPanelContent, { children: activePanel?.content })
1180
+ panels.length > 0 && /* @__PURE__ */ jsxs10(SidebarPanel, { children: [
1181
+ /* @__PURE__ */ jsx12(SidebarPanelHeader, { title: activePanel?.title ?? mode }),
1182
+ /* @__PURE__ */ jsx12(SidebarPanelContent, { children: activePanel?.content })
1487
1183
  ] })
1488
1184
  ] }),
1489
1185
  // biome-ignore lint/correctness/useExhaustiveDependencies: intentional — only the inputs that actually affect the sidebar tree
@@ -1506,10 +1202,10 @@ function DashboardLayoutInner({
1506
1202
  mode
1507
1203
  ]
1508
1204
  );
1509
- const sidebarContent = React4.useMemo(() => buildSidebarContent(false), [buildSidebarContent]);
1510
- const mobileSidebarContent = React4.useMemo(() => buildSidebarContent(true), [buildSidebarContent]);
1511
- return /* @__PURE__ */ jsxs11("div", { className: cn("min-h-screen bg-background text-foreground", className), children: [
1512
- /* @__PURE__ */ jsxs11(
1205
+ const sidebarContent = React3.useMemo(() => buildSidebarContent(false), [buildSidebarContent]);
1206
+ const mobileSidebarContent = React3.useMemo(() => buildSidebarContent(true), [buildSidebarContent]);
1207
+ return /* @__PURE__ */ jsxs10("div", { className: cn("min-h-screen bg-background text-foreground", className), children: [
1208
+ /* @__PURE__ */ jsxs10(
1513
1209
  "nav",
1514
1210
  {
1515
1211
  className: "fixed top-0 z-50 bg-card border-b border-border flex justify-between items-center px-8 h-14 font-sans text-[13px] tracking-tight transition-[left,width] duration-200 ease-in-out",
@@ -1518,9 +1214,9 @@ function DashboardLayoutInner({
1518
1214
  width: hidden ? "100%" : `calc(100% - ${contentMargin}px)`
1519
1215
  },
1520
1216
  children: [
1521
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-8", children: [
1522
- /* @__PURE__ */ jsx13(Link, { href: "/", to: "/", className: "lg:hidden flex items-center p-1 rounded-md hover:bg-muted/50 transition-colors", children: /* @__PURE__ */ jsx13(Logo, { variant, size: "sm", iconOnly: true }) }),
1523
- topNavLinks && topNavLinks.length > 0 && /* @__PURE__ */ jsx13("div", { className: "hidden md:flex gap-6", children: topNavLinks.map((link) => /* @__PURE__ */ jsx13(
1217
+ /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-8", children: [
1218
+ /* @__PURE__ */ jsx12(Link, { href: "/", to: "/", className: "lg:hidden flex items-center p-1 rounded-md hover:bg-muted/50 transition-colors", children: /* @__PURE__ */ jsx12(Logo, { variant, size: "sm", iconOnly: true }) }),
1219
+ topNavLinks && topNavLinks.length > 0 && /* @__PURE__ */ jsx12("div", { className: "hidden md:flex gap-6", children: topNavLinks.map((link) => /* @__PURE__ */ jsx12(
1524
1220
  Link,
1525
1221
  {
1526
1222
  href: link.href,
@@ -1534,21 +1230,21 @@ function DashboardLayoutInner({
1534
1230
  link.href
1535
1231
  )) })
1536
1232
  ] }),
1537
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-4", children: [
1538
- onNewSandbox && /* @__PURE__ */ jsxs11(
1233
+ /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-4", children: [
1234
+ onNewSandbox && /* @__PURE__ */ jsxs10(
1539
1235
  "button",
1540
1236
  {
1541
1237
  type: "button",
1542
1238
  onClick: onNewSandbox,
1543
1239
  className: "hidden md:flex items-center gap-2 bg-[var(--btn-primary-bg)] border border-[var(--border-accent)] text-[var(--btn-primary-text)] px-4 py-2 rounded-lg font-bold hover:bg-[var(--btn-primary-hover)] transition-all active:scale-95 text-xs",
1544
1240
  children: [
1545
- /* @__PURE__ */ jsx13(Plus2, { className: "h-3.5 w-3.5" }),
1241
+ /* @__PURE__ */ jsx12(Plus2, { className: "h-3.5 w-3.5" }),
1546
1242
  "New Sandbox"
1547
1243
  ]
1548
1244
  }
1549
1245
  ),
1550
- /* @__PURE__ */ jsxs11("div", { className: "relative", ref: notifRef, children: [
1551
- /* @__PURE__ */ jsxs11(
1246
+ /* @__PURE__ */ jsxs10("div", { className: "relative", ref: notifRef, children: [
1247
+ /* @__PURE__ */ jsxs10(
1552
1248
  "button",
1553
1249
  {
1554
1250
  type: "button",
@@ -1557,15 +1253,15 @@ function DashboardLayoutInner({
1557
1253
  "aria-label": "Notifications",
1558
1254
  "aria-expanded": notificationsOpen,
1559
1255
  children: [
1560
- /* @__PURE__ */ jsx13(Bell, { className: "h-4 w-4" }),
1561
- (notifData?.unreadCount ?? 0) > 0 && /* @__PURE__ */ jsx13("span", { className: "absolute top-1 right-1 h-2 w-2 rounded-full bg-destructive" })
1256
+ /* @__PURE__ */ jsx12(Bell, { className: "h-4 w-4" }),
1257
+ (notifData?.unreadCount ?? 0) > 0 && /* @__PURE__ */ jsx12("span", { className: "absolute top-1 right-1 h-2 w-2 rounded-full bg-destructive" })
1562
1258
  ]
1563
1259
  }
1564
1260
  ),
1565
- notificationsOpen && /* @__PURE__ */ jsxs11("div", { className: "absolute right-0 top-full mt-2 w-80 rounded-lg border border-border bg-card shadow-lg z-50", children: [
1566
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center justify-between border-b border-border px-4 py-3", children: [
1567
- /* @__PURE__ */ jsx13("p", { className: "font-bold text-foreground text-sm", children: "Notifications" }),
1568
- (notifData?.unreadCount ?? 0) > 0 && notifData?.onMarkAllRead && /* @__PURE__ */ jsx13(
1261
+ notificationsOpen && /* @__PURE__ */ jsxs10("div", { className: "absolute right-0 top-full mt-2 w-80 rounded-lg border border-border bg-card shadow-lg z-50", children: [
1262
+ /* @__PURE__ */ jsxs10("div", { className: "flex items-center justify-between border-b border-border px-4 py-3", children: [
1263
+ /* @__PURE__ */ jsx12("p", { className: "font-bold text-foreground text-sm", children: "Notifications" }),
1264
+ (notifData?.unreadCount ?? 0) > 0 && notifData?.onMarkAllRead && /* @__PURE__ */ jsx12(
1569
1265
  "button",
1570
1266
  {
1571
1267
  type: "button",
@@ -1577,11 +1273,11 @@ function DashboardLayoutInner({
1577
1273
  }
1578
1274
  )
1579
1275
  ] }),
1580
- !notifData?.items || notifData.items.length === 0 ? /* @__PURE__ */ jsxs11("div", { className: "flex flex-col items-center justify-center px-4 py-8 text-center", children: [
1581
- /* @__PURE__ */ jsx13(Bell, { className: "h-8 w-8 text-muted-foreground/40 mb-2" }),
1582
- /* @__PURE__ */ jsx13("p", { className: "text-muted-foreground text-sm", children: "No notifications yet" }),
1583
- /* @__PURE__ */ jsx13("p", { className: "text-muted-foreground/60 text-xs mt-1", children: "We'll notify you about important updates" })
1584
- ] }) : /* @__PURE__ */ jsx13("div", { className: "max-h-80 overflow-y-auto", children: notifData.items.map((n) => /* @__PURE__ */ jsxs11(
1276
+ !notifData?.items || notifData.items.length === 0 ? /* @__PURE__ */ jsxs10("div", { className: "flex flex-col items-center justify-center px-4 py-8 text-center", children: [
1277
+ /* @__PURE__ */ jsx12(Bell, { className: "h-8 w-8 text-muted-foreground/40 mb-2" }),
1278
+ /* @__PURE__ */ jsx12("p", { className: "text-muted-foreground text-sm", children: "No notifications yet" }),
1279
+ /* @__PURE__ */ jsx12("p", { className: "text-muted-foreground/60 text-xs mt-1", children: "We'll notify you about important updates" })
1280
+ ] }) : /* @__PURE__ */ jsx12("div", { className: "max-h-80 overflow-y-auto", children: notifData.items.map((n) => /* @__PURE__ */ jsxs10(
1585
1281
  "button",
1586
1282
  {
1587
1283
  type: "button",
@@ -1593,9 +1289,9 @@ function DashboardLayoutInner({
1593
1289
  if (!n.read) notifData.onMarkRead?.(n.id);
1594
1290
  },
1595
1291
  children: [
1596
- /* @__PURE__ */ jsx13("p", { className: cn("text-sm", !n.read ? "font-semibold text-foreground" : "text-muted-foreground"), children: n.title }),
1597
- /* @__PURE__ */ jsx13("p", { className: "text-xs text-muted-foreground mt-0.5 line-clamp-2", children: n.message }),
1598
- /* @__PURE__ */ jsx13("p", { className: "text-[10px] text-muted-foreground/50 mt-1", children: formatNotifDate(n.createdAt) })
1292
+ /* @__PURE__ */ jsx12("p", { className: cn("text-sm", !n.read ? "font-semibold text-foreground" : "text-muted-foreground"), children: n.title }),
1293
+ /* @__PURE__ */ jsx12("p", { className: "text-xs text-muted-foreground mt-0.5 line-clamp-2", children: n.message }),
1294
+ /* @__PURE__ */ jsx12("p", { className: "text-[10px] text-muted-foreground/50 mt-1", children: formatNotifDate(n.createdAt) })
1599
1295
  ]
1600
1296
  },
1601
1297
  n.id
@@ -1603,7 +1299,7 @@ function DashboardLayoutInner({
1603
1299
  ] })
1604
1300
  ] })
1605
1301
  ] }),
1606
- /* @__PURE__ */ jsx13(
1302
+ /* @__PURE__ */ jsx12(
1607
1303
  "button",
1608
1304
  {
1609
1305
  type: "button",
@@ -1611,14 +1307,14 @@ function DashboardLayoutInner({
1611
1307
  className: "rounded-md p-2 hover:bg-muted/50 lg:hidden",
1612
1308
  "aria-label": mobileMenuOpen ? "Close menu" : "Open menu",
1613
1309
  "aria-expanded": mobileMenuOpen,
1614
- children: mobileMenuOpen ? /* @__PURE__ */ jsx13(XIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx13(MenuIcon, { className: "h-6 w-6" })
1310
+ children: mobileMenuOpen ? /* @__PURE__ */ jsx12(XIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx12(MenuIcon, { className: "h-6 w-6" })
1615
1311
  }
1616
1312
  )
1617
1313
  ]
1618
1314
  }
1619
1315
  ),
1620
- mobileMenuOpen && /* @__PURE__ */ jsx13("div", { className: "fixed inset-0 z-30 bg-black/50 lg:hidden", onClick: () => setMobileMenuOpen(false), "aria-hidden": "true" }),
1621
- /* @__PURE__ */ jsx13(
1316
+ mobileMenuOpen && /* @__PURE__ */ jsx12("div", { className: "fixed inset-0 z-30 bg-black/50 lg:hidden", onClick: () => setMobileMenuOpen(false), "aria-hidden": "true" }),
1317
+ /* @__PURE__ */ jsx12(
1622
1318
  "aside",
1623
1319
  {
1624
1320
  className: cn(
@@ -1631,17 +1327,17 @@ function DashboardLayoutInner({
1631
1327
  children: mobileSidebarContent
1632
1328
  }
1633
1329
  ),
1634
- /* @__PURE__ */ jsx13(Sidebar, { className: cn("hidden lg:flex", sidebarClassName), children: sidebarContent }),
1635
- /* @__PURE__ */ jsx13(SidebarContent, { className: cn("pt-16 px-6 pb-8 lg:px-8 bg-background", contentClassName), children }),
1330
+ /* @__PURE__ */ jsx12(Sidebar, { className: cn("hidden lg:flex", sidebarClassName), children: sidebarContent }),
1331
+ /* @__PURE__ */ jsx12(SidebarContent, { className: cn("pt-16 px-6 pb-8 lg:px-8 bg-background", contentClassName), children }),
1636
1332
  footer
1637
1333
  ] });
1638
1334
  }
1639
1335
  function DashboardLayout({ defaultPanelOpen, defaultMode, ...props }) {
1640
- return /* @__PURE__ */ jsx13(SidebarProvider, { defaultPanelOpen, defaultMode, hasPanels: (props.panels?.length ?? 0) > 0, children: /* @__PURE__ */ jsx13(DashboardLayoutInner, { defaultPanelOpen, defaultMode, ...props }) });
1336
+ return /* @__PURE__ */ jsx12(SidebarProvider, { defaultPanelOpen, defaultMode, hasPanels: (props.panels?.length ?? 0) > 0, children: /* @__PURE__ */ jsx12(DashboardLayoutInner, { defaultPanelOpen, defaultMode, ...props }) });
1641
1337
  }
1642
1338
 
1643
1339
  // src/dashboard/profile-selector.tsx
1644
- import { Check as Check2, ChevronDown as ChevronDown3, Plus as Plus3, Settings } from "lucide-react";
1340
+ import { Check as Check2, ChevronDown as ChevronDown2, Plus as Plus3, Settings } from "lucide-react";
1645
1341
  import { Button } from "@tangle-network/ui/primitives";
1646
1342
  import { Badge } from "@tangle-network/ui/primitives";
1647
1343
  import {
@@ -1652,7 +1348,7 @@ import {
1652
1348
  DropdownMenuSeparator as DropdownMenuSeparator3,
1653
1349
  DropdownMenuTrigger as DropdownMenuTrigger3
1654
1350
  } from "@tangle-network/ui/primitives";
1655
- import { Fragment as Fragment8, jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1351
+ import { Fragment as Fragment7, jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1656
1352
  function ProfileSelector({
1657
1353
  profiles,
1658
1354
  selectedId,
@@ -1667,77 +1363,77 @@ function ProfileSelector({
1667
1363
  const selected = profiles.find((p) => p.id === selectedId);
1668
1364
  const builtinProfiles = profiles.filter((p) => p.is_builtin);
1669
1365
  const customProfiles = profiles.filter((p) => !p.is_builtin);
1670
- return /* @__PURE__ */ jsxs12("div", { className, children: [
1671
- label && /* @__PURE__ */ jsx14("label", { className: "mb-2 block font-medium text-sm", children: label }),
1672
- /* @__PURE__ */ jsxs12(DropdownMenu3, { children: [
1673
- /* @__PURE__ */ jsx14(DropdownMenuTrigger3, { asChild: true, children: /* @__PURE__ */ jsxs12(Button, { variant: "outline", className: "w-full justify-between", children: [
1674
- /* @__PURE__ */ jsx14("span", { className: "truncate", children: selected ? selected.name : placeholder }),
1675
- /* @__PURE__ */ jsx14(ChevronDown3, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })
1366
+ return /* @__PURE__ */ jsxs11("div", { className, children: [
1367
+ label && /* @__PURE__ */ jsx13("label", { className: "mb-2 block font-medium text-sm", children: label }),
1368
+ /* @__PURE__ */ jsxs11(DropdownMenu3, { children: [
1369
+ /* @__PURE__ */ jsx13(DropdownMenuTrigger3, { asChild: true, children: /* @__PURE__ */ jsxs11(Button, { variant: "outline", className: "w-full justify-between", children: [
1370
+ /* @__PURE__ */ jsx13("span", { className: "truncate", children: selected ? selected.name : placeholder }),
1371
+ /* @__PURE__ */ jsx13(ChevronDown2, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })
1676
1372
  ] }) }),
1677
- /* @__PURE__ */ jsxs12(DropdownMenuContent3, { className: "w-[300px]", align: "start", children: [
1678
- /* @__PURE__ */ jsxs12(
1373
+ /* @__PURE__ */ jsxs11(DropdownMenuContent3, { className: "w-[300px]", align: "start", children: [
1374
+ /* @__PURE__ */ jsxs11(
1679
1375
  DropdownMenuItem3,
1680
1376
  {
1681
1377
  onClick: () => onSelect(null),
1682
1378
  className: "flex items-center justify-between",
1683
1379
  children: [
1684
- /* @__PURE__ */ jsx14("span", { children: placeholder }),
1685
- !selectedId && /* @__PURE__ */ jsx14(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1380
+ /* @__PURE__ */ jsx13("span", { children: placeholder }),
1381
+ !selectedId && /* @__PURE__ */ jsx13(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1686
1382
  ]
1687
1383
  }
1688
1384
  ),
1689
- builtinProfiles.length > 0 && /* @__PURE__ */ jsxs12(Fragment8, { children: [
1690
- /* @__PURE__ */ jsx14(DropdownMenuSeparator3, {}),
1691
- /* @__PURE__ */ jsx14(DropdownMenuLabel2, { children: "Built-in Profiles" }),
1692
- builtinProfiles.map((profile) => /* @__PURE__ */ jsxs12(
1385
+ builtinProfiles.length > 0 && /* @__PURE__ */ jsxs11(Fragment7, { children: [
1386
+ /* @__PURE__ */ jsx13(DropdownMenuSeparator3, {}),
1387
+ /* @__PURE__ */ jsx13(DropdownMenuLabel2, { children: "Built-in Profiles" }),
1388
+ builtinProfiles.map((profile) => /* @__PURE__ */ jsxs11(
1693
1389
  DropdownMenuItem3,
1694
1390
  {
1695
1391
  onClick: () => onSelect(profile),
1696
1392
  className: "flex flex-col items-start gap-1",
1697
1393
  children: [
1698
- /* @__PURE__ */ jsxs12("div", { className: "flex w-full items-center justify-between", children: [
1699
- /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2", children: [
1700
- /* @__PURE__ */ jsx14("span", { className: "font-medium", children: profile.name }),
1701
- profile.extends && /* @__PURE__ */ jsxs12(Badge, { variant: "secondary", className: "border-0 text-xs", children: [
1394
+ /* @__PURE__ */ jsxs11("div", { className: "flex w-full items-center justify-between", children: [
1395
+ /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2", children: [
1396
+ /* @__PURE__ */ jsx13("span", { className: "font-medium", children: profile.name }),
1397
+ profile.extends && /* @__PURE__ */ jsxs11(Badge, { variant: "secondary", className: "border-0 text-xs", children: [
1702
1398
  "extends ",
1703
1399
  profile.extends
1704
1400
  ] })
1705
1401
  ] }),
1706
- selectedId === profile.id && /* @__PURE__ */ jsx14(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1402
+ selectedId === profile.id && /* @__PURE__ */ jsx13(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1707
1403
  ] }),
1708
- profile.description && /* @__PURE__ */ jsx14("span", { className: "line-clamp-1 text-muted-foreground text-xs", children: profile.description })
1404
+ profile.description && /* @__PURE__ */ jsx13("span", { className: "line-clamp-1 text-muted-foreground text-xs", children: profile.description })
1709
1405
  ]
1710
1406
  },
1711
1407
  profile.id
1712
1408
  ))
1713
1409
  ] }),
1714
- customProfiles.length > 0 && /* @__PURE__ */ jsxs12(Fragment8, { children: [
1715
- /* @__PURE__ */ jsx14(DropdownMenuSeparator3, {}),
1716
- /* @__PURE__ */ jsx14(DropdownMenuLabel2, { children: "Custom Profiles" }),
1717
- customProfiles.map((profile) => /* @__PURE__ */ jsxs12(
1410
+ customProfiles.length > 0 && /* @__PURE__ */ jsxs11(Fragment7, { children: [
1411
+ /* @__PURE__ */ jsx13(DropdownMenuSeparator3, {}),
1412
+ /* @__PURE__ */ jsx13(DropdownMenuLabel2, { children: "Custom Profiles" }),
1413
+ customProfiles.map((profile) => /* @__PURE__ */ jsxs11(
1718
1414
  DropdownMenuItem3,
1719
1415
  {
1720
1416
  onClick: () => onSelect(profile),
1721
1417
  className: "flex flex-col items-start gap-1",
1722
1418
  children: [
1723
- /* @__PURE__ */ jsxs12("div", { className: "flex w-full items-center justify-between", children: [
1724
- /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2", children: [
1725
- /* @__PURE__ */ jsx14("span", { className: "font-medium", children: profile.name }),
1726
- profile.model && /* @__PURE__ */ jsx14(Badge, { variant: "secondary", className: "border-0 text-xs", children: profile.model.split("/").pop() })
1419
+ /* @__PURE__ */ jsxs11("div", { className: "flex w-full items-center justify-between", children: [
1420
+ /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2", children: [
1421
+ /* @__PURE__ */ jsx13("span", { className: "font-medium", children: profile.name }),
1422
+ profile.model && /* @__PURE__ */ jsx13(Badge, { variant: "secondary", className: "border-0 text-xs", children: profile.model.split("/").pop() })
1727
1423
  ] }),
1728
- selectedId === profile.id && /* @__PURE__ */ jsx14(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1424
+ selectedId === profile.id && /* @__PURE__ */ jsx13(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1729
1425
  ] }),
1730
- profile.description && /* @__PURE__ */ jsx14("span", { className: "line-clamp-1 text-muted-foreground text-xs", children: profile.description }),
1731
- showMetrics && profile.metrics && profile.metrics.total_runs > 0 && /* @__PURE__ */ jsxs12("div", { className: "flex gap-3 text-muted-foreground text-xs", children: [
1732
- /* @__PURE__ */ jsxs12("span", { children: [
1426
+ profile.description && /* @__PURE__ */ jsx13("span", { className: "line-clamp-1 text-muted-foreground text-xs", children: profile.description }),
1427
+ showMetrics && profile.metrics && profile.metrics.total_runs > 0 && /* @__PURE__ */ jsxs11("div", { className: "flex gap-3 text-muted-foreground text-xs", children: [
1428
+ /* @__PURE__ */ jsxs11("span", { children: [
1733
1429
  profile.metrics.total_runs,
1734
1430
  " runs"
1735
1431
  ] }),
1736
- /* @__PURE__ */ jsxs12("span", { children: [
1432
+ /* @__PURE__ */ jsxs11("span", { children: [
1737
1433
  profile.metrics.success_rate.toFixed(0),
1738
1434
  "% success"
1739
1435
  ] }),
1740
- /* @__PURE__ */ jsxs12("span", { children: [
1436
+ /* @__PURE__ */ jsxs11("span", { children: [
1741
1437
  "~",
1742
1438
  (profile.metrics.avg_duration_ms / 1e3).toFixed(1),
1743
1439
  "s avg"
@@ -1748,26 +1444,26 @@ function ProfileSelector({
1748
1444
  profile.id
1749
1445
  ))
1750
1446
  ] }),
1751
- (onCreateClick || onManageClick) && /* @__PURE__ */ jsxs12(Fragment8, { children: [
1752
- /* @__PURE__ */ jsx14(DropdownMenuSeparator3, {}),
1753
- onCreateClick && /* @__PURE__ */ jsxs12(
1447
+ (onCreateClick || onManageClick) && /* @__PURE__ */ jsxs11(Fragment7, { children: [
1448
+ /* @__PURE__ */ jsx13(DropdownMenuSeparator3, {}),
1449
+ onCreateClick && /* @__PURE__ */ jsxs11(
1754
1450
  DropdownMenuItem3,
1755
1451
  {
1756
1452
  onClick: onCreateClick,
1757
1453
  className: "text-[var(--surface-info-text)]",
1758
1454
  children: [
1759
- /* @__PURE__ */ jsx14(Plus3, { className: "mr-2 h-4 w-4" }),
1455
+ /* @__PURE__ */ jsx13(Plus3, { className: "mr-2 h-4 w-4" }),
1760
1456
  "Create New Profile"
1761
1457
  ]
1762
1458
  }
1763
1459
  ),
1764
- onManageClick && /* @__PURE__ */ jsxs12(
1460
+ onManageClick && /* @__PURE__ */ jsxs11(
1765
1461
  DropdownMenuItem3,
1766
1462
  {
1767
1463
  onClick: onManageClick,
1768
1464
  className: "text-muted-foreground",
1769
1465
  children: [
1770
- /* @__PURE__ */ jsx14(Settings, { className: "mr-2 h-4 w-4" }),
1466
+ /* @__PURE__ */ jsx13(Settings, { className: "mr-2 h-4 w-4" }),
1771
1467
  "Manage Profiles"
1772
1468
  ]
1773
1469
  }
@@ -1793,26 +1489,26 @@ function ProfileComparison({
1793
1489
  const fastestProfile = profilesWithMetrics.reduce(
1794
1490
  (best, p) => (p.metrics?.avg_duration_ms ?? Number.POSITIVE_INFINITY) < (best.metrics?.avg_duration_ms ?? Number.POSITIVE_INFINITY) ? p : best
1795
1491
  );
1796
- return /* @__PURE__ */ jsxs12("div", { className: `rounded-lg border border-border p-4 ${className ?? ""}`, children: [
1797
- /* @__PURE__ */ jsx14("h4", { className: "mb-3 font-medium text-sm", children: "Profile Performance" }),
1798
- /* @__PURE__ */ jsx14("div", { className: "space-y-3", children: profilesWithMetrics.map((profile) => {
1492
+ return /* @__PURE__ */ jsxs11("div", { className: `rounded-lg border border-border p-4 ${className ?? ""}`, children: [
1493
+ /* @__PURE__ */ jsx13("h4", { className: "mb-3 font-medium text-sm", children: "Profile Performance" }),
1494
+ /* @__PURE__ */ jsx13("div", { className: "space-y-3", children: profilesWithMetrics.map((profile) => {
1799
1495
  const isBestSuccess = profile.id === bestSuccess.id;
1800
1496
  const isFastest = profile.id === fastestProfile.id;
1801
- return /* @__PURE__ */ jsxs12(
1497
+ return /* @__PURE__ */ jsxs11(
1802
1498
  "div",
1803
1499
  {
1804
1500
  className: "flex items-center justify-between gap-4",
1805
1501
  children: [
1806
- /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2", children: [
1807
- /* @__PURE__ */ jsx14("span", { className: "font-medium", children: profile.name }),
1808
- isBestSuccess && /* @__PURE__ */ jsx14(Badge, { className: "border border-[var(--surface-success-border)] bg-[var(--surface-success-bg)] text-[var(--surface-success-text)] text-xs", children: "Best Success" }),
1809
- isFastest && !isBestSuccess && /* @__PURE__ */ jsx14(Badge, { className: "border border-[var(--surface-info-border)] bg-[var(--surface-info-bg)] text-[var(--surface-info-text)] text-xs", children: "Fastest" })
1502
+ /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2", children: [
1503
+ /* @__PURE__ */ jsx13("span", { className: "font-medium", children: profile.name }),
1504
+ isBestSuccess && /* @__PURE__ */ jsx13(Badge, { className: "border border-[var(--surface-success-border)] bg-[var(--surface-success-bg)] text-[var(--surface-success-text)] text-xs", children: "Best Success" }),
1505
+ isFastest && !isBestSuccess && /* @__PURE__ */ jsx13(Badge, { className: "border border-[var(--surface-info-border)] bg-[var(--surface-info-bg)] text-[var(--surface-info-text)] text-xs", children: "Fastest" })
1810
1506
  ] }),
1811
- /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-4 text-sm", children: [
1812
- /* @__PURE__ */ jsxs12("span", { children: [
1813
- /* @__PURE__ */ jsx14("span", { className: "text-muted-foreground", children: "Success:" }),
1507
+ /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-4 text-sm", children: [
1508
+ /* @__PURE__ */ jsxs11("span", { children: [
1509
+ /* @__PURE__ */ jsx13("span", { className: "text-muted-foreground", children: "Success:" }),
1814
1510
  " ",
1815
- /* @__PURE__ */ jsxs12(
1511
+ /* @__PURE__ */ jsxs11(
1816
1512
  "span",
1817
1513
  {
1818
1514
  className: (profile.metrics?.success_rate ?? 0) >= 80 ? "text-[var(--surface-success-text)]" : (profile.metrics?.success_rate ?? 0) >= 50 ? "text-[var(--surface-warning-text)]" : "text-[var(--surface-danger-text)]",
@@ -1823,13 +1519,13 @@ function ProfileComparison({
1823
1519
  }
1824
1520
  )
1825
1521
  ] }),
1826
- /* @__PURE__ */ jsxs12("span", { children: [
1827
- /* @__PURE__ */ jsx14("span", { className: "text-muted-foreground", children: "Avg:" }),
1522
+ /* @__PURE__ */ jsxs11("span", { children: [
1523
+ /* @__PURE__ */ jsx13("span", { className: "text-muted-foreground", children: "Avg:" }),
1828
1524
  " ",
1829
1525
  ((profile.metrics?.avg_duration_ms ?? 0) / 1e3).toFixed(1),
1830
1526
  "s"
1831
1527
  ] }),
1832
- /* @__PURE__ */ jsxs12("span", { className: "text-muted-foreground", children: [
1528
+ /* @__PURE__ */ jsxs11("span", { className: "text-muted-foreground", children: [
1833
1529
  profile.metrics?.total_runs,
1834
1530
  " runs"
1835
1531
  ] })
@@ -1848,14 +1544,14 @@ import {
1848
1544
  CheckCircle2,
1849
1545
  Clock as Clock2,
1850
1546
  ExternalLink,
1851
- Loader2 as Loader22,
1547
+ Loader2,
1852
1548
  Timer,
1853
1549
  X,
1854
1550
  XCircle
1855
1551
  } from "lucide-react";
1856
1552
  import { Button as Button2 } from "@tangle-network/ui/primitives";
1857
1553
  import { Badge as Badge2 } from "@tangle-network/ui/primitives";
1858
- import { Fragment as Fragment9, jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1554
+ import { Fragment as Fragment8, jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1859
1555
  var statusConfig = {
1860
1556
  pending: {
1861
1557
  icon: Clock2,
@@ -1866,7 +1562,7 @@ var statusConfig = {
1866
1562
  animate: false
1867
1563
  },
1868
1564
  running: {
1869
- icon: Loader22,
1565
+ icon: Loader2,
1870
1566
  color: "text-primary",
1871
1567
  bg: "bg-[var(--accent-surface-soft)]",
1872
1568
  border: "border-border",
@@ -1939,19 +1635,19 @@ function VariantList({
1939
1635
  isActioning,
1940
1636
  className
1941
1637
  }) {
1942
- return /* @__PURE__ */ jsx15("div", { className: `space-y-2 ${className || ""}`, children: variants.map((variant) => {
1638
+ return /* @__PURE__ */ jsx14("div", { className: `space-y-2 ${className || ""}`, children: variants.map((variant) => {
1943
1639
  const status = statusConfig[variant.status];
1944
1640
  const StatusIcon = status.icon;
1945
1641
  const isSelected = variant.id === selectedId;
1946
- return /* @__PURE__ */ jsxs13(
1642
+ return /* @__PURE__ */ jsxs12(
1947
1643
  "div",
1948
1644
  {
1949
1645
  className: `cursor-pointer rounded-lg border px-3 py-2.5 transition-colors ${isSelected ? "border-primary/30 bg-[var(--accent-surface-soft)]" : "border-border bg-card hover:border-primary/20 hover:bg-muted/50"}`,
1950
1646
  onClick: () => onSelect?.(variant.id),
1951
1647
  children: [
1952
- /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-2", children: [
1953
- /* @__PURE__ */ jsxs13(Badge2, { className: `shrink-0 ${status.bg} ${status.border} ${status.color}`, children: [
1954
- /* @__PURE__ */ jsx15(
1648
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2", children: [
1649
+ /* @__PURE__ */ jsxs12(Badge2, { className: `shrink-0 ${status.bg} ${status.border} ${status.color}`, children: [
1650
+ /* @__PURE__ */ jsx14(
1955
1651
  StatusIcon,
1956
1652
  {
1957
1653
  className: `mr-1 h-3 w-3 ${status.animate ? "animate-spin" : ""}`
@@ -1959,27 +1655,27 @@ function VariantList({
1959
1655
  ),
1960
1656
  status.label
1961
1657
  ] }),
1962
- /* @__PURE__ */ jsx15("span", { className: "truncate text-sm font-medium text-foreground", children: variant.label }),
1963
- variant.sublabel && /* @__PURE__ */ jsxs13("span", { className: "shrink-0 text-xs text-muted-foreground", children: [
1658
+ /* @__PURE__ */ jsx14("span", { className: "truncate text-sm font-medium text-foreground", children: variant.label }),
1659
+ variant.sublabel && /* @__PURE__ */ jsxs12("span", { className: "shrink-0 text-xs text-muted-foreground", children: [
1964
1660
  "(",
1965
1661
  variant.sublabel,
1966
1662
  ")"
1967
1663
  ] }),
1968
- variant.durationMs && /* @__PURE__ */ jsxs13("span", { className: "flex shrink-0 items-center gap-1 text-xs text-muted-foreground", children: [
1969
- /* @__PURE__ */ jsx15(Timer, { className: "h-3 w-3" }),
1664
+ variant.durationMs && /* @__PURE__ */ jsxs12("span", { className: "flex shrink-0 items-center gap-1 text-xs text-muted-foreground", children: [
1665
+ /* @__PURE__ */ jsx14(Timer, { className: "h-3 w-3" }),
1970
1666
  (variant.durationMs / 1e3).toFixed(1),
1971
1667
  "s"
1972
1668
  ] }),
1973
- /* @__PURE__ */ jsxs13("div", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [
1974
- variant.outcome && /* @__PURE__ */ jsx15(
1669
+ /* @__PURE__ */ jsxs12("div", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [
1670
+ variant.outcome && /* @__PURE__ */ jsx14(
1975
1671
  Badge2,
1976
1672
  {
1977
1673
  className: `${outcomeConfig[variant.outcome].bg} ${outcomeConfig[variant.outcome].border} ${outcomeConfig[variant.outcome].color}`,
1978
1674
  children: outcomeConfig[variant.outcome].label
1979
1675
  }
1980
1676
  ),
1981
- variant.status === "completed" && variant.outcome === "pending_review" && onAccept && onReject && /* @__PURE__ */ jsxs13(Fragment9, { children: [
1982
- /* @__PURE__ */ jsxs13(
1677
+ variant.status === "completed" && variant.outcome === "pending_review" && onAccept && onReject && /* @__PURE__ */ jsxs12(Fragment8, { children: [
1678
+ /* @__PURE__ */ jsxs12(
1983
1679
  Button2,
1984
1680
  {
1985
1681
  variant: "outline",
@@ -1991,12 +1687,12 @@ function VariantList({
1991
1687
  },
1992
1688
  disabled: isActioning === variant.id,
1993
1689
  children: [
1994
- /* @__PURE__ */ jsx15(Check3, { className: "mr-1 h-3 w-3" }),
1690
+ /* @__PURE__ */ jsx14(Check3, { className: "mr-1 h-3 w-3" }),
1995
1691
  "Accept"
1996
1692
  ]
1997
1693
  }
1998
1694
  ),
1999
- /* @__PURE__ */ jsxs13(
1695
+ /* @__PURE__ */ jsxs12(
2000
1696
  Button2,
2001
1697
  {
2002
1698
  variant: "outline",
@@ -2008,13 +1704,13 @@ function VariantList({
2008
1704
  },
2009
1705
  disabled: isActioning === variant.id,
2010
1706
  children: [
2011
- /* @__PURE__ */ jsx15(X, { className: "mr-1 h-3 w-3" }),
1707
+ /* @__PURE__ */ jsx14(X, { className: "mr-1 h-3 w-3" }),
2012
1708
  "Reject"
2013
1709
  ]
2014
1710
  }
2015
1711
  )
2016
1712
  ] }),
2017
- variant.detailsUrl && /* @__PURE__ */ jsx15(
1713
+ variant.detailsUrl && /* @__PURE__ */ jsx14(
2018
1714
  Button2,
2019
1715
  {
2020
1716
  variant: "ghost",
@@ -2024,13 +1720,13 @@ function VariantList({
2024
1720
  e.stopPropagation();
2025
1721
  window.open(variant.detailsUrl, "_blank");
2026
1722
  },
2027
- children: /* @__PURE__ */ jsx15(ExternalLink, { className: "h-3.5 w-3.5" })
1723
+ children: /* @__PURE__ */ jsx14(ExternalLink, { className: "h-3.5 w-3.5" })
2028
1724
  }
2029
1725
  )
2030
1726
  ] })
2031
1727
  ] }),
2032
- variant.error && /* @__PURE__ */ jsx15("p", { className: "mt-1.5 text-xs text-[var(--surface-danger-text)]", children: variant.error }),
2033
- variant.summary && /* @__PURE__ */ jsx15("p", { className: "mt-1.5 line-clamp-2 text-xs text-muted-foreground", children: variant.summary })
1728
+ variant.error && /* @__PURE__ */ jsx14("p", { className: "mt-1.5 text-xs text-[var(--surface-danger-text)]", children: variant.error }),
1729
+ variant.summary && /* @__PURE__ */ jsx14("p", { className: "mt-1.5 line-clamp-2 text-xs text-muted-foreground", children: variant.summary })
2034
1730
  ]
2035
1731
  },
2036
1732
  variant.id
@@ -2040,12 +1736,12 @@ function VariantList({
2040
1736
 
2041
1737
  // src/dashboard/system-logs.tsx
2042
1738
  import { Terminal as Terminal3 } from "lucide-react";
2043
- import { useEffect as useEffect2, useRef as useRef2, useState as useState5 } from "react";
2044
- import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
1739
+ import { useEffect as useEffect2, useRef as useRef2, useState as useState4 } from "react";
1740
+ import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
2045
1741
  function SystemLogsViewer({ apiUrl, token, className }) {
2046
- const [logs, setLogs] = useState5([]);
2047
- const [error, setError] = useState5(null);
2048
- const [isFollowing, setIsFollowing] = useState5(true);
1742
+ const [logs, setLogs] = useState4([]);
1743
+ const [error, setError] = useState4(null);
1744
+ const [isFollowing, setIsFollowing] = useState4(true);
2049
1745
  const scrollRef = useRef2(null);
2050
1746
  useEffect2(() => {
2051
1747
  let timeoutId;
@@ -2094,18 +1790,18 @@ function SystemLogsViewer({ apiUrl, token, className }) {
2094
1790
  const isAtBottom = scrollHeight - scrollTop - clientHeight < 20;
2095
1791
  setIsFollowing((prev) => prev === isAtBottom ? prev : isAtBottom);
2096
1792
  };
2097
- return /* @__PURE__ */ jsxs14("div", { className: cn("flex flex-col h-full bg-background text-foreground font-mono text-sm leading-relaxed overflow-hidden rounded-lg border border-border", className), children: [
2098
- /* @__PURE__ */ jsxs14("div", { className: "flex-none flex items-center justify-between border-b border-border bg-muted/50 backdrop-blur-md px-4 py-2", children: [
2099
- /* @__PURE__ */ jsxs14("div", { className: "flex items-center gap-2", children: [
2100
- /* @__PURE__ */ jsx16(Terminal3, { className: "h-4 w-4 text-primary animate-pulse" }),
2101
- /* @__PURE__ */ jsx16("span", { className: "font-bold text-xs uppercase tracking-widest text-muted-foreground", children: "System Traces" })
1793
+ return /* @__PURE__ */ jsxs13("div", { className: cn("flex flex-col h-full bg-background text-foreground font-mono text-sm leading-relaxed overflow-hidden rounded-lg border border-border", className), children: [
1794
+ /* @__PURE__ */ jsxs13("div", { className: "flex-none flex items-center justify-between border-b border-border bg-muted/50 backdrop-blur-md px-4 py-2", children: [
1795
+ /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-2", children: [
1796
+ /* @__PURE__ */ jsx15(Terminal3, { className: "h-4 w-4 text-primary animate-pulse" }),
1797
+ /* @__PURE__ */ jsx15("span", { className: "font-bold text-xs uppercase tracking-widest text-muted-foreground", children: "System Traces" })
2102
1798
  ] }),
2103
- /* @__PURE__ */ jsxs14("div", { className: "flex items-center gap-3", children: [
2104
- error && /* @__PURE__ */ jsxs14("span", { className: "text-destructive text-xs flex items-center gap-1", children: [
2105
- /* @__PURE__ */ jsx16("span", { className: "w-2 h-2 rounded-full bg-destructive animate-ping" }),
1799
+ /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-3", children: [
1800
+ error && /* @__PURE__ */ jsxs13("span", { className: "text-destructive text-xs flex items-center gap-1", children: [
1801
+ /* @__PURE__ */ jsx15("span", { className: "w-2 h-2 rounded-full bg-destructive animate-ping" }),
2106
1802
  " Error fetching logs"
2107
1803
  ] }),
2108
- /* @__PURE__ */ jsx16(
1804
+ /* @__PURE__ */ jsx15(
2109
1805
  "button",
2110
1806
  {
2111
1807
  onClick: () => {
@@ -2120,29 +1816,29 @@ function SystemLogsViewer({ apiUrl, token, className }) {
2120
1816
  )
2121
1817
  ] })
2122
1818
  ] }),
2123
- /* @__PURE__ */ jsx16(
1819
+ /* @__PURE__ */ jsx15(
2124
1820
  "div",
2125
1821
  {
2126
1822
  ref: scrollRef,
2127
1823
  onScroll: handleScroll,
2128
1824
  className: "flex-1 overflow-y-auto p-4 space-y-1",
2129
- children: logs.length === 0 && !error ? /* @__PURE__ */ jsx16("div", { className: "flex h-full items-center justify-center text-muted-foreground italic", children: "Waiting for orchestrator logs..." }) : logs.map((log, i) => /* @__PURE__ */ jsxs14("div", { className: "break-words", children: [
2130
- /* @__PURE__ */ jsxs14("span", { className: "text-muted-foreground mr-3 select-none", children: [
1825
+ children: logs.length === 0 && !error ? /* @__PURE__ */ jsx15("div", { className: "flex h-full items-center justify-center text-muted-foreground italic", children: "Waiting for orchestrator logs..." }) : logs.map((log, i) => /* @__PURE__ */ jsxs13("div", { className: "break-words", children: [
1826
+ /* @__PURE__ */ jsxs13("span", { className: "text-muted-foreground mr-3 select-none", children: [
2131
1827
  "[",
2132
1828
  log.timestamp || i.toString().padStart(4, "0"),
2133
1829
  "]"
2134
1830
  ] }),
2135
- /* @__PURE__ */ jsxs14("span", { className: "text-primary/70 mr-2", children: [
1831
+ /* @__PURE__ */ jsxs13("span", { className: "text-primary/70 mr-2", children: [
2136
1832
  "[",
2137
1833
  log.level,
2138
1834
  "]"
2139
1835
  ] }),
2140
- /* @__PURE__ */ jsxs14("span", { className: "text-muted-foreground mr-2", children: [
1836
+ /* @__PURE__ */ jsxs13("span", { className: "text-muted-foreground mr-2", children: [
2141
1837
  "[",
2142
1838
  log.scope,
2143
1839
  "]"
2144
1840
  ] }),
2145
- /* @__PURE__ */ jsx16("span", { className: log.level.toUpperCase() === "ERROR" || log.message.toLowerCase().includes("failed") ? "text-destructive" : log.level.toUpperCase() === "WARN" ? "text-warning" : "text-foreground", children: log.message })
1841
+ /* @__PURE__ */ jsx15("span", { className: log.level.toUpperCase() === "ERROR" || log.message.toLowerCase().includes("failed") ? "text-destructive" : log.level.toUpperCase() === "WARN" ? "text-warning" : "text-foreground", children: log.message })
2146
1842
  ] }, `${log.timestamp}-${log.scope}-${i}`))
2147
1843
  }
2148
1844
  )
@@ -2153,50 +1849,50 @@ function SystemLogsViewer({ apiUrl, token, className }) {
2153
1849
  import { Clock as Clock3, Layers, MessageSquare, DollarSign } from "lucide-react";
2154
1850
  import { StatCard } from "@tangle-network/ui/primitives";
2155
1851
  import { Skeleton as Skeleton2 } from "@tangle-network/ui/primitives";
2156
- import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
1852
+ import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
2157
1853
  function UsageSummary({ data, loading = false, className }) {
2158
1854
  if (loading || !data) {
2159
- return /* @__PURE__ */ jsx17("div", { className: cn("grid grid-cols-2 gap-4 lg:grid-cols-4", className), children: Array.from({ length: 4 }).map((_, i) => /* @__PURE__ */ jsx17(Skeleton2, { className: "h-28 rounded-xl" }, i)) });
1855
+ return /* @__PURE__ */ jsx16("div", { className: cn("grid grid-cols-2 gap-4 lg:grid-cols-4", className), children: Array.from({ length: 4 }).map((_, i) => /* @__PURE__ */ jsx16(Skeleton2, { className: "h-28 rounded-xl" }, i)) });
2160
1856
  }
2161
- return /* @__PURE__ */ jsxs15("div", { className: cn("grid grid-cols-2 gap-4 lg:grid-cols-4", className), children: [
2162
- /* @__PURE__ */ jsx17(
1857
+ return /* @__PURE__ */ jsxs14("div", { className: cn("grid grid-cols-2 gap-4 lg:grid-cols-4", className), children: [
1858
+ /* @__PURE__ */ jsx16(
2163
1859
  StatCard,
2164
1860
  {
2165
1861
  variant: "sandbox",
2166
1862
  title: "Compute Hours",
2167
1863
  value: data.computeHours.toFixed(1),
2168
1864
  subtitle: "This billing period",
2169
- icon: /* @__PURE__ */ jsx17(Clock3, { className: "h-5 w-5" })
1865
+ icon: /* @__PURE__ */ jsx16(Clock3, { className: "h-5 w-5" })
2170
1866
  }
2171
1867
  ),
2172
- /* @__PURE__ */ jsx17(
1868
+ /* @__PURE__ */ jsx16(
2173
1869
  StatCard,
2174
1870
  {
2175
1871
  variant: "sandbox",
2176
1872
  title: "Active Sessions",
2177
1873
  value: data.activeSessions,
2178
1874
  subtitle: "Currently running",
2179
- icon: /* @__PURE__ */ jsx17(Layers, { className: "h-5 w-5" })
1875
+ icon: /* @__PURE__ */ jsx16(Layers, { className: "h-5 w-5" })
2180
1876
  }
2181
1877
  ),
2182
- /* @__PURE__ */ jsx17(
1878
+ /* @__PURE__ */ jsx16(
2183
1879
  StatCard,
2184
1880
  {
2185
1881
  variant: "sandbox",
2186
1882
  title: "Messages Sent",
2187
1883
  value: data.messagesSent.toLocaleString(),
2188
1884
  subtitle: "Agent interactions",
2189
- icon: /* @__PURE__ */ jsx17(MessageSquare, { className: "h-5 w-5" })
1885
+ icon: /* @__PURE__ */ jsx16(MessageSquare, { className: "h-5 w-5" })
2190
1886
  }
2191
1887
  ),
2192
- /* @__PURE__ */ jsx17(
1888
+ /* @__PURE__ */ jsx16(
2193
1889
  StatCard,
2194
1890
  {
2195
1891
  variant: "sandbox",
2196
1892
  title: "Estimated Cost",
2197
1893
  value: `$${data.estimatedCost.toFixed(2)}`,
2198
1894
  subtitle: "This billing period",
2199
- icon: /* @__PURE__ */ jsx17(DollarSign, { className: "h-5 w-5" })
1895
+ icon: /* @__PURE__ */ jsx16(DollarSign, { className: "h-5 w-5" })
2200
1896
  }
2201
1897
  )
2202
1898
  ] });
@@ -2204,66 +1900,66 @@ function UsageSummary({ data, loading = false, className }) {
2204
1900
 
2205
1901
  // src/dashboard/git-panel.tsx
2206
1902
  import { GitBranch, GitCommit, FileEdit, FilePlus, File } from "lucide-react";
2207
- import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
1903
+ import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
2208
1904
  function GitPanel({ status, log, loading = false, onRefresh, className }) {
2209
1905
  if (loading) {
2210
- return /* @__PURE__ */ jsx18("div", { className: cn("rounded-lg border border-border bg-card p-5", className), children: /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
2211
- /* @__PURE__ */ jsx18("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-primary border-t-transparent" }),
1906
+ return /* @__PURE__ */ jsx17("div", { className: cn("rounded-lg border border-border bg-card p-5", className), children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
1907
+ /* @__PURE__ */ jsx17("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-primary border-t-transparent" }),
2212
1908
  "Loading git info..."
2213
1909
  ] }) });
2214
1910
  }
2215
1911
  if (!status) {
2216
- return /* @__PURE__ */ jsx18("div", { className: cn("rounded-lg border border-border bg-card p-5", className), children: /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
2217
- /* @__PURE__ */ jsx18(GitBranch, { className: "h-4 w-4" }),
1912
+ return /* @__PURE__ */ jsx17("div", { className: cn("rounded-lg border border-border bg-card p-5", className), children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
1913
+ /* @__PURE__ */ jsx17(GitBranch, { className: "h-4 w-4" }),
2218
1914
  "No git repository detected"
2219
1915
  ] }) });
2220
1916
  }
2221
1917
  const changedCount = status.staged.length + status.modified.length + status.untracked.length;
2222
- return /* @__PURE__ */ jsxs16("div", { className: cn("rounded-lg border border-border bg-card overflow-hidden", className), children: [
2223
- /* @__PURE__ */ jsxs16("div", { className: "flex items-center justify-between border-b border-border bg-muted/30 px-4 py-3", children: [
2224
- /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2", children: [
2225
- /* @__PURE__ */ jsx18(GitBranch, { className: "h-4 w-4 text-primary" }),
2226
- /* @__PURE__ */ jsx18("span", { className: "text-sm font-bold text-foreground", children: status.branch }),
2227
- status.isDirty && /* @__PURE__ */ jsxs16("span", { className: "rounded-full bg-[var(--surface-warning-bg)] px-1.5 py-0.5 text-[10px] font-bold text-[var(--surface-warning-text)]", children: [
1918
+ return /* @__PURE__ */ jsxs15("div", { className: cn("rounded-lg border border-border bg-card overflow-hidden", className), children: [
1919
+ /* @__PURE__ */ jsxs15("div", { className: "flex items-center justify-between border-b border-border bg-muted/30 px-4 py-3", children: [
1920
+ /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
1921
+ /* @__PURE__ */ jsx17(GitBranch, { className: "h-4 w-4 text-primary" }),
1922
+ /* @__PURE__ */ jsx17("span", { className: "text-sm font-bold text-foreground", children: status.branch }),
1923
+ status.isDirty && /* @__PURE__ */ jsxs15("span", { className: "rounded-full bg-[var(--surface-warning-bg)] px-1.5 py-0.5 text-[10px] font-bold text-[var(--surface-warning-text)]", children: [
2228
1924
  changedCount,
2229
1925
  " change",
2230
1926
  changedCount !== 1 ? "s" : ""
2231
1927
  ] })
2232
1928
  ] }),
2233
- onRefresh && /* @__PURE__ */ jsx18("button", { type: "button", onClick: onRefresh, className: "text-xs text-muted-foreground hover:text-foreground transition-colors", children: "Refresh" })
1929
+ onRefresh && /* @__PURE__ */ jsx17("button", { type: "button", onClick: onRefresh, className: "text-xs text-muted-foreground hover:text-foreground transition-colors", children: "Refresh" })
2234
1930
  ] }),
2235
- changedCount > 0 && /* @__PURE__ */ jsx18("div", { className: "border-b border-border px-4 py-3", children: /* @__PURE__ */ jsxs16("div", { className: "space-y-1.5", children: [
2236
- status.staged.map((f) => /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 text-xs", children: [
2237
- /* @__PURE__ */ jsx18(FilePlus, { className: "h-3 w-3 text-[var(--surface-success-text)]" }),
2238
- /* @__PURE__ */ jsx18("span", { className: "font-mono text-foreground truncate", children: f }),
2239
- /* @__PURE__ */ jsx18("span", { className: "text-[var(--surface-success-text)] text-[10px] font-bold ml-auto", children: "STAGED" })
1931
+ changedCount > 0 && /* @__PURE__ */ jsx17("div", { className: "border-b border-border px-4 py-3", children: /* @__PURE__ */ jsxs15("div", { className: "space-y-1.5", children: [
1932
+ status.staged.map((f) => /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 text-xs", children: [
1933
+ /* @__PURE__ */ jsx17(FilePlus, { className: "h-3 w-3 text-[var(--surface-success-text)]" }),
1934
+ /* @__PURE__ */ jsx17("span", { className: "font-mono text-foreground truncate", children: f }),
1935
+ /* @__PURE__ */ jsx17("span", { className: "text-[var(--surface-success-text)] text-[10px] font-bold ml-auto", children: "STAGED" })
2240
1936
  ] }, `s-${f}`)),
2241
- status.modified.map((f) => /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 text-xs", children: [
2242
- /* @__PURE__ */ jsx18(FileEdit, { className: "h-3 w-3 text-[var(--surface-warning-text)]" }),
2243
- /* @__PURE__ */ jsx18("span", { className: "font-mono text-foreground truncate", children: f })
1937
+ status.modified.map((f) => /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 text-xs", children: [
1938
+ /* @__PURE__ */ jsx17(FileEdit, { className: "h-3 w-3 text-[var(--surface-warning-text)]" }),
1939
+ /* @__PURE__ */ jsx17("span", { className: "font-mono text-foreground truncate", children: f })
2244
1940
  ] }, `m-${f}`)),
2245
- status.untracked.map((f) => /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 text-xs", children: [
2246
- /* @__PURE__ */ jsx18(File, { className: "h-3 w-3 text-muted-foreground" }),
2247
- /* @__PURE__ */ jsx18("span", { className: "font-mono text-muted-foreground truncate", children: f })
1941
+ status.untracked.map((f) => /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 text-xs", children: [
1942
+ /* @__PURE__ */ jsx17(File, { className: "h-3 w-3 text-muted-foreground" }),
1943
+ /* @__PURE__ */ jsx17("span", { className: "font-mono text-muted-foreground truncate", children: f })
2248
1944
  ] }, `u-${f}`))
2249
1945
  ] }) }),
2250
- log.length > 0 && /* @__PURE__ */ jsxs16("div", { className: "px-4 py-3", children: [
2251
- /* @__PURE__ */ jsx18("div", { className: "mb-2 text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: "Recent Commits" }),
2252
- /* @__PURE__ */ jsx18("div", { className: "space-y-2", children: log.slice(0, 5).map((commit) => /* @__PURE__ */ jsxs16("div", { className: "flex items-start gap-2 text-xs", children: [
2253
- /* @__PURE__ */ jsx18(GitCommit, { className: "h-3 w-3 text-muted-foreground mt-0.5 shrink-0" }),
2254
- /* @__PURE__ */ jsxs16("div", { className: "min-w-0", children: [
2255
- /* @__PURE__ */ jsx18("span", { className: "font-mono text-primary mr-1.5", children: commit.shortSha }),
2256
- /* @__PURE__ */ jsx18("span", { className: "text-foreground", children: commit.message })
1946
+ log.length > 0 && /* @__PURE__ */ jsxs15("div", { className: "px-4 py-3", children: [
1947
+ /* @__PURE__ */ jsx17("div", { className: "mb-2 text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: "Recent Commits" }),
1948
+ /* @__PURE__ */ jsx17("div", { className: "space-y-2", children: log.slice(0, 5).map((commit) => /* @__PURE__ */ jsxs15("div", { className: "flex items-start gap-2 text-xs", children: [
1949
+ /* @__PURE__ */ jsx17(GitCommit, { className: "h-3 w-3 text-muted-foreground mt-0.5 shrink-0" }),
1950
+ /* @__PURE__ */ jsxs15("div", { className: "min-w-0", children: [
1951
+ /* @__PURE__ */ jsx17("span", { className: "font-mono text-primary mr-1.5", children: commit.shortSha }),
1952
+ /* @__PURE__ */ jsx17("span", { className: "text-foreground", children: commit.message })
2257
1953
  ] })
2258
1954
  ] }, commit.shortSha)) })
2259
1955
  ] }),
2260
- (status.ahead > 0 || status.behind > 0) && /* @__PURE__ */ jsxs16("div", { className: "border-t border-border px-4 py-2 flex items-center gap-3 text-xs text-muted-foreground", children: [
2261
- status.ahead > 0 && /* @__PURE__ */ jsxs16("span", { children: [
1956
+ (status.ahead > 0 || status.behind > 0) && /* @__PURE__ */ jsxs15("div", { className: "border-t border-border px-4 py-2 flex items-center gap-3 text-xs text-muted-foreground", children: [
1957
+ status.ahead > 0 && /* @__PURE__ */ jsxs15("span", { children: [
2262
1958
  "\u2191 ",
2263
1959
  status.ahead,
2264
1960
  " ahead"
2265
1961
  ] }),
2266
- status.behind > 0 && /* @__PURE__ */ jsxs16("span", { children: [
1962
+ status.behind > 0 && /* @__PURE__ */ jsxs15("span", { children: [
2267
1963
  "\u2193 ",
2268
1964
  status.behind,
2269
1965
  " behind"
@@ -2273,14 +1969,14 @@ function GitPanel({ status, log, loading = false, onRefresh, className }) {
2273
1969
  }
2274
1970
 
2275
1971
  // src/dashboard/ports-list.tsx
2276
- import * as React6 from "react";
1972
+ import * as React5 from "react";
2277
1973
  import { Copy as Copy2, Check as Check4, Globe, Plus as Plus4, Trash2 as Trash23 } from "lucide-react";
2278
- import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
1974
+ import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
2279
1975
  function PortsList({ ports, onExposePort, onRemovePort, isExposing = false, className }) {
2280
- const [newPort, setNewPort] = React6.useState("");
2281
- const [copiedPort, setCopiedPort] = React6.useState(null);
2282
- const copyTimerRef = React6.useRef(null);
2283
- React6.useEffect(() => {
1976
+ const [newPort, setNewPort] = React5.useState("");
1977
+ const [copiedPort, setCopiedPort] = React5.useState(null);
1978
+ const copyTimerRef = React5.useRef(null);
1979
+ React5.useEffect(() => {
2284
1980
  return () => {
2285
1981
  if (copyTimerRef.current) clearTimeout(copyTimerRef.current);
2286
1982
  };
@@ -2302,48 +1998,48 @@ function PortsList({ ports, onExposePort, onRemovePort, isExposing = false, clas
2302
1998
  setNewPort("");
2303
1999
  }
2304
2000
  };
2305
- return /* @__PURE__ */ jsxs17("div", { className: cn("space-y-4", className), children: [
2306
- ports.length > 0 ? /* @__PURE__ */ jsx19("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs17("table", { className: "w-full text-sm", children: [
2307
- /* @__PURE__ */ jsx19("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs17("tr", { children: [
2308
- /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Port" }),
2309
- /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Public URL" }),
2310
- /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Status" }),
2311
- /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-20" })
2001
+ return /* @__PURE__ */ jsxs16("div", { className: cn("space-y-4", className), children: [
2002
+ ports.length > 0 ? /* @__PURE__ */ jsx18("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs16("table", { className: "w-full text-sm", children: [
2003
+ /* @__PURE__ */ jsx18("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs16("tr", { children: [
2004
+ /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Port" }),
2005
+ /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Public URL" }),
2006
+ /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Status" }),
2007
+ /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-20" })
2312
2008
  ] }) }),
2313
- /* @__PURE__ */ jsx19("tbody", { className: "divide-y divide-border", children: ports.map((p) => /* @__PURE__ */ jsxs17("tr", { children: [
2314
- /* @__PURE__ */ jsx19("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: p.port }),
2315
- /* @__PURE__ */ jsx19("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxs17(
2009
+ /* @__PURE__ */ jsx18("tbody", { className: "divide-y divide-border", children: ports.map((p) => /* @__PURE__ */ jsxs16("tr", { children: [
2010
+ /* @__PURE__ */ jsx18("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: p.port }),
2011
+ /* @__PURE__ */ jsx18("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxs16(
2316
2012
  "button",
2317
2013
  {
2318
2014
  type: "button",
2319
2015
  onClick: () => handleCopy(p.url, p.port),
2320
2016
  className: "flex items-center gap-2 font-mono text-xs text-primary hover:underline cursor-pointer group",
2321
2017
  children: [
2322
- /* @__PURE__ */ jsx19("span", { className: "truncate max-w-[300px]", children: p.url }),
2323
- copiedPort === p.port ? /* @__PURE__ */ jsx19(Check4, { className: "h-3 w-3 text-[var(--surface-success-text)] shrink-0" }) : /* @__PURE__ */ jsx19(Copy2, { className: "h-3 w-3 opacity-0 group-hover:opacity-100 transition-opacity shrink-0" })
2018
+ /* @__PURE__ */ jsx18("span", { className: "truncate max-w-[300px]", children: p.url }),
2019
+ copiedPort === p.port ? /* @__PURE__ */ jsx18(Check4, { className: "h-3 w-3 text-[var(--surface-success-text)] shrink-0" }) : /* @__PURE__ */ jsx18(Copy2, { className: "h-3 w-3 opacity-0 group-hover:opacity-100 transition-opacity shrink-0" })
2324
2020
  ]
2325
2021
  }
2326
2022
  ) }),
2327
- /* @__PURE__ */ jsx19("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx19("span", { className: cn(
2023
+ /* @__PURE__ */ jsx18("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx18("span", { className: cn(
2328
2024
  "inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-[10px] font-bold uppercase tracking-wider",
2329
2025
  p.status === "active" ? "bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]" : "bg-[var(--surface-warning-bg)] text-[var(--surface-warning-text)]"
2330
2026
  ), children: p.status }) }),
2331
- /* @__PURE__ */ jsx19("td", { className: "px-4 py-3 text-right", children: onRemovePort && /* @__PURE__ */ jsx19(
2027
+ /* @__PURE__ */ jsx18("td", { className: "px-4 py-3 text-right", children: onRemovePort && /* @__PURE__ */ jsx18(
2332
2028
  "button",
2333
2029
  {
2334
2030
  type: "button",
2335
2031
  onClick: () => onRemovePort(p.port),
2336
2032
  className: "p-1 text-muted-foreground hover:text-destructive transition-colors rounded",
2337
- children: /* @__PURE__ */ jsx19(Trash23, { className: "h-3.5 w-3.5" })
2033
+ children: /* @__PURE__ */ jsx18(Trash23, { className: "h-3.5 w-3.5" })
2338
2034
  }
2339
2035
  ) })
2340
2036
  ] }, p.port)) })
2341
- ] }) }) : /* @__PURE__ */ jsxs17("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2342
- /* @__PURE__ */ jsx19(Globe, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2343
- /* @__PURE__ */ jsx19("p", { className: "text-sm text-muted-foreground", children: "No ports exposed yet" })
2037
+ ] }) }) : /* @__PURE__ */ jsxs16("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2038
+ /* @__PURE__ */ jsx18(Globe, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2039
+ /* @__PURE__ */ jsx18("p", { className: "text-sm text-muted-foreground", children: "No ports exposed yet" })
2344
2040
  ] }),
2345
- /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-3", children: [
2346
- /* @__PURE__ */ jsx19(
2041
+ /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-3", children: [
2042
+ /* @__PURE__ */ jsx18(
2347
2043
  "input",
2348
2044
  {
2349
2045
  type: "number",
@@ -2356,7 +2052,7 @@ function PortsList({ ports, onExposePort, onRemovePort, isExposing = false, clas
2356
2052
  className: "flex-1 rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2357
2053
  }
2358
2054
  ),
2359
- /* @__PURE__ */ jsxs17(
2055
+ /* @__PURE__ */ jsxs16(
2360
2056
  "button",
2361
2057
  {
2362
2058
  type: "button",
@@ -2364,7 +2060,7 @@ function PortsList({ ports, onExposePort, onRemovePort, isExposing = false, clas
2364
2060
  disabled: !newPort || isExposing,
2365
2061
  className: "inline-flex items-center gap-2 rounded-lg bg-primary/20 border border-primary/30 px-4 py-2 text-sm font-medium text-primary hover:bg-primary hover:text-primary-foreground transition-colors disabled:opacity-50",
2366
2062
  children: [
2367
- /* @__PURE__ */ jsx19(Plus4, { className: "h-4 w-4" }),
2063
+ /* @__PURE__ */ jsx18(Plus4, { className: "h-4 w-4" }),
2368
2064
  "Expose"
2369
2065
  ]
2370
2066
  }
@@ -2374,9 +2070,9 @@ function PortsList({ ports, onExposePort, onRemovePort, isExposing = false, clas
2374
2070
  }
2375
2071
 
2376
2072
  // src/dashboard/process-list.tsx
2377
- import * as React7 from "react";
2073
+ import * as React6 from "react";
2378
2074
  import { Activity as Activity2, Plus as Plus5, Skull, Terminal as Terminal4 } from "lucide-react";
2379
- import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
2075
+ import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
2380
2076
  function formatUptime(startedAt) {
2381
2077
  if (!startedAt) return "-";
2382
2078
  const ms = Date.now() - new Date(startedAt).getTime();
@@ -2386,7 +2082,7 @@ function formatUptime(startedAt) {
2386
2082
  return `${Math.floor(ms / 36e5)}h ${Math.floor(ms % 36e5 / 6e4)}m`;
2387
2083
  }
2388
2084
  function ProcessList({ processes, onSpawn, onKill, loading = false, className }) {
2389
- const [newCommand, setNewCommand] = React7.useState("");
2085
+ const [newCommand, setNewCommand] = React6.useState("");
2390
2086
  const handleSpawn = () => {
2391
2087
  const cmd = newCommand.trim();
2392
2088
  if (cmd) {
@@ -2394,43 +2090,43 @@ function ProcessList({ processes, onSpawn, onKill, loading = false, className })
2394
2090
  setNewCommand("");
2395
2091
  }
2396
2092
  };
2397
- return /* @__PURE__ */ jsxs18("div", { className: cn("space-y-4", className), children: [
2398
- loading ? /* @__PURE__ */ jsxs18("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2399
- /* @__PURE__ */ jsx20(Activity2, { className: "mx-auto h-6 w-6 text-muted-foreground animate-spin mb-2" }),
2400
- /* @__PURE__ */ jsx20("p", { className: "text-sm text-muted-foreground", children: "Loading processes..." })
2401
- ] }) : processes.length > 0 ? /* @__PURE__ */ jsx20("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs18("table", { className: "w-full text-sm", children: [
2402
- /* @__PURE__ */ jsx20("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs18("tr", { children: [
2403
- /* @__PURE__ */ jsx20("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "PID" }),
2404
- /* @__PURE__ */ jsx20("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Command" }),
2405
- /* @__PURE__ */ jsx20("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Status" }),
2406
- /* @__PURE__ */ jsx20("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Uptime" }),
2407
- /* @__PURE__ */ jsx20("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-20" })
2093
+ return /* @__PURE__ */ jsxs17("div", { className: cn("space-y-4", className), children: [
2094
+ loading ? /* @__PURE__ */ jsxs17("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2095
+ /* @__PURE__ */ jsx19(Activity2, { className: "mx-auto h-6 w-6 text-muted-foreground animate-spin mb-2" }),
2096
+ /* @__PURE__ */ jsx19("p", { className: "text-sm text-muted-foreground", children: "Loading processes..." })
2097
+ ] }) : processes.length > 0 ? /* @__PURE__ */ jsx19("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs17("table", { className: "w-full text-sm", children: [
2098
+ /* @__PURE__ */ jsx19("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs17("tr", { children: [
2099
+ /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "PID" }),
2100
+ /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Command" }),
2101
+ /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Status" }),
2102
+ /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Uptime" }),
2103
+ /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-20" })
2408
2104
  ] }) }),
2409
- /* @__PURE__ */ jsx20("tbody", { className: "divide-y divide-border", children: processes.map((p) => /* @__PURE__ */ jsxs18("tr", { children: [
2410
- /* @__PURE__ */ jsx20("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: p.pid }),
2411
- /* @__PURE__ */ jsx20("td", { className: "px-4 py-3 font-mono text-xs text-foreground truncate max-w-[250px]", children: p.command }),
2412
- /* @__PURE__ */ jsx20("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx20("span", { className: cn(
2105
+ /* @__PURE__ */ jsx19("tbody", { className: "divide-y divide-border", children: processes.map((p) => /* @__PURE__ */ jsxs17("tr", { children: [
2106
+ /* @__PURE__ */ jsx19("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: p.pid }),
2107
+ /* @__PURE__ */ jsx19("td", { className: "px-4 py-3 font-mono text-xs text-foreground truncate max-w-[250px]", children: p.command }),
2108
+ /* @__PURE__ */ jsx19("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx19("span", { className: cn(
2413
2109
  "inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-[10px] font-bold uppercase tracking-wider",
2414
2110
  p.running ? "bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]" : "bg-muted text-muted-foreground"
2415
2111
  ), children: p.running ? "running" : `exited (${p.exitCode ?? "?"})` }) }),
2416
- /* @__PURE__ */ jsx20("td", { className: "px-4 py-3 font-mono text-xs text-muted-foreground", children: formatUptime(p.startedAt) }),
2417
- /* @__PURE__ */ jsx20("td", { className: "px-4 py-3 text-right", children: p.running && /* @__PURE__ */ jsx20(
2112
+ /* @__PURE__ */ jsx19("td", { className: "px-4 py-3 font-mono text-xs text-muted-foreground", children: formatUptime(p.startedAt) }),
2113
+ /* @__PURE__ */ jsx19("td", { className: "px-4 py-3 text-right", children: p.running && /* @__PURE__ */ jsx19(
2418
2114
  "button",
2419
2115
  {
2420
2116
  type: "button",
2421
2117
  onClick: () => onKill(p.pid),
2422
2118
  className: "p-1 text-muted-foreground hover:text-destructive transition-colors rounded",
2423
2119
  title: "Kill process",
2424
- children: /* @__PURE__ */ jsx20(Skull, { className: "h-3.5 w-3.5" })
2120
+ children: /* @__PURE__ */ jsx19(Skull, { className: "h-3.5 w-3.5" })
2425
2121
  }
2426
2122
  ) })
2427
2123
  ] }, `${p.pid}-${p.startedAt ?? p.command}`)) })
2428
- ] }) }) : /* @__PURE__ */ jsxs18("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2429
- /* @__PURE__ */ jsx20(Terminal4, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2430
- /* @__PURE__ */ jsx20("p", { className: "text-sm text-muted-foreground", children: "No processes running" })
2124
+ ] }) }) : /* @__PURE__ */ jsxs17("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2125
+ /* @__PURE__ */ jsx19(Terminal4, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2126
+ /* @__PURE__ */ jsx19("p", { className: "text-sm text-muted-foreground", children: "No processes running" })
2431
2127
  ] }),
2432
- /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-3", children: [
2433
- /* @__PURE__ */ jsx20(
2128
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-3", children: [
2129
+ /* @__PURE__ */ jsx19(
2434
2130
  "input",
2435
2131
  {
2436
2132
  type: "text",
@@ -2441,7 +2137,7 @@ function ProcessList({ processes, onSpawn, onKill, loading = false, className })
2441
2137
  className: "flex-1 rounded-lg border border-border bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2442
2138
  }
2443
2139
  ),
2444
- /* @__PURE__ */ jsxs18(
2140
+ /* @__PURE__ */ jsxs17(
2445
2141
  "button",
2446
2142
  {
2447
2143
  type: "button",
@@ -2449,7 +2145,7 @@ function ProcessList({ processes, onSpawn, onKill, loading = false, className })
2449
2145
  disabled: !newCommand.trim(),
2450
2146
  className: "inline-flex items-center gap-2 rounded-lg bg-primary/20 border border-primary/30 px-4 py-2 text-sm font-medium text-primary hover:bg-primary hover:text-primary-foreground transition-colors disabled:opacity-50",
2451
2147
  children: [
2452
- /* @__PURE__ */ jsx20(Plus5, { className: "h-4 w-4" }),
2148
+ /* @__PURE__ */ jsx19(Plus5, { className: "h-4 w-4" }),
2453
2149
  "Spawn"
2454
2150
  ]
2455
2151
  }
@@ -2459,11 +2155,11 @@ function ProcessList({ processes, onSpawn, onKill, loading = false, className })
2459
2155
  }
2460
2156
 
2461
2157
  // src/dashboard/network-config.tsx
2462
- import * as React8 from "react";
2158
+ import * as React7 from "react";
2463
2159
  import { Network as Network2, Plus as Plus6, Trash2 as Trash24, ShieldAlert } from "lucide-react";
2464
- import { jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
2160
+ import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
2465
2161
  function NetworkConfig({ config, onUpdate, loading = false, className }) {
2466
- const [newCidr, setNewCidr] = React8.useState("");
2162
+ const [newCidr, setNewCidr] = React7.useState("");
2467
2163
  const isValidCidr = (value) => {
2468
2164
  const match = value.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\/(\d{1,2})$/);
2469
2165
  if (!match) return false;
@@ -2484,21 +2180,21 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2484
2180
  }
2485
2181
  };
2486
2182
  if (loading || !config) {
2487
- return /* @__PURE__ */ jsxs19("div", { className: cn("rounded-lg border border-border bg-muted/20 p-6 text-center", className), children: [
2488
- /* @__PURE__ */ jsx21(Network2, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2489
- /* @__PURE__ */ jsx21("p", { className: "text-sm text-muted-foreground", children: "Loading network configuration..." })
2183
+ return /* @__PURE__ */ jsxs18("div", { className: cn("rounded-lg border border-border bg-muted/20 p-6 text-center", className), children: [
2184
+ /* @__PURE__ */ jsx20(Network2, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2185
+ /* @__PURE__ */ jsx20("p", { className: "text-sm text-muted-foreground", children: "Loading network configuration..." })
2490
2186
  ] });
2491
2187
  }
2492
- return /* @__PURE__ */ jsxs19("div", { className: cn("space-y-4", className), children: [
2493
- /* @__PURE__ */ jsxs19("div", { className: "flex items-center justify-between rounded-lg border border-border bg-card px-4 py-3", children: [
2494
- /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-3", children: [
2495
- /* @__PURE__ */ jsx21(ShieldAlert, { className: "h-4 w-4 text-muted-foreground" }),
2496
- /* @__PURE__ */ jsxs19("div", { children: [
2497
- /* @__PURE__ */ jsx21("p", { className: "text-sm font-medium text-foreground", children: "Block Outbound Traffic" }),
2498
- /* @__PURE__ */ jsx21("p", { className: "text-xs text-muted-foreground", children: "Prevent the sandbox from making external network requests" })
2188
+ return /* @__PURE__ */ jsxs18("div", { className: cn("space-y-4", className), children: [
2189
+ /* @__PURE__ */ jsxs18("div", { className: "flex items-center justify-between rounded-lg border border-border bg-card px-4 py-3", children: [
2190
+ /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-3", children: [
2191
+ /* @__PURE__ */ jsx20(ShieldAlert, { className: "h-4 w-4 text-muted-foreground" }),
2192
+ /* @__PURE__ */ jsxs18("div", { children: [
2193
+ /* @__PURE__ */ jsx20("p", { className: "text-sm font-medium text-foreground", children: "Block Outbound Traffic" }),
2194
+ /* @__PURE__ */ jsx20("p", { className: "text-xs text-muted-foreground", children: "Prevent the sandbox from making external network requests" })
2499
2195
  ] })
2500
2196
  ] }),
2501
- /* @__PURE__ */ jsx21(
2197
+ /* @__PURE__ */ jsx20(
2502
2198
  "button",
2503
2199
  {
2504
2200
  type: "button",
@@ -2510,7 +2206,7 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2510
2206
  "relative inline-flex h-6 w-11 items-center rounded-full transition-colors",
2511
2207
  config.blockOutbound ? "bg-destructive" : "bg-muted"
2512
2208
  ),
2513
- children: /* @__PURE__ */ jsx21(
2209
+ children: /* @__PURE__ */ jsx20(
2514
2210
  "span",
2515
2211
  {
2516
2212
  className: cn(
@@ -2522,22 +2218,22 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2522
2218
  }
2523
2219
  )
2524
2220
  ] }),
2525
- /* @__PURE__ */ jsxs19("div", { children: [
2526
- /* @__PURE__ */ jsx21("h4", { className: "text-xs font-medium text-muted-foreground mb-2 uppercase tracking-wider", children: "Allowlist (CIDR)" }),
2527
- config.allowList.length > 0 ? /* @__PURE__ */ jsx21("div", { className: "space-y-1.5 mb-3", children: config.allowList.map((cidr) => /* @__PURE__ */ jsxs19("div", { className: "flex items-center justify-between rounded border border-border bg-muted/20 px-3 py-2", children: [
2528
- /* @__PURE__ */ jsx21("span", { className: "font-mono text-xs text-foreground", children: cidr }),
2529
- /* @__PURE__ */ jsx21(
2221
+ /* @__PURE__ */ jsxs18("div", { children: [
2222
+ /* @__PURE__ */ jsx20("h4", { className: "text-xs font-medium text-muted-foreground mb-2 uppercase tracking-wider", children: "Allowlist (CIDR)" }),
2223
+ config.allowList.length > 0 ? /* @__PURE__ */ jsx20("div", { className: "space-y-1.5 mb-3", children: config.allowList.map((cidr) => /* @__PURE__ */ jsxs18("div", { className: "flex items-center justify-between rounded border border-border bg-muted/20 px-3 py-2", children: [
2224
+ /* @__PURE__ */ jsx20("span", { className: "font-mono text-xs text-foreground", children: cidr }),
2225
+ /* @__PURE__ */ jsx20(
2530
2226
  "button",
2531
2227
  {
2532
2228
  type: "button",
2533
2229
  onClick: () => handleRemoveCidr(cidr),
2534
2230
  className: "p-1 text-muted-foreground hover:text-destructive transition-colors rounded",
2535
- children: /* @__PURE__ */ jsx21(Trash24, { className: "h-3 w-3" })
2231
+ children: /* @__PURE__ */ jsx20(Trash24, { className: "h-3 w-3" })
2536
2232
  }
2537
2233
  )
2538
- ] }, cidr)) }) : /* @__PURE__ */ jsx21("p", { className: "text-xs text-muted-foreground mb-3", children: "No CIDR rules configured. All traffic is allowed." }),
2539
- /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-3", children: [
2540
- /* @__PURE__ */ jsx21(
2234
+ ] }, cidr)) }) : /* @__PURE__ */ jsx20("p", { className: "text-xs text-muted-foreground mb-3", children: "No CIDR rules configured. All traffic is allowed." }),
2235
+ /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-3", children: [
2236
+ /* @__PURE__ */ jsx20(
2541
2237
  "input",
2542
2238
  {
2543
2239
  type: "text",
@@ -2548,7 +2244,7 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2548
2244
  className: "flex-1 rounded-lg border border-border bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2549
2245
  }
2550
2246
  ),
2551
- /* @__PURE__ */ jsxs19(
2247
+ /* @__PURE__ */ jsxs18(
2552
2248
  "button",
2553
2249
  {
2554
2250
  type: "button",
@@ -2556,7 +2252,7 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2556
2252
  disabled: !newCidr.trim(),
2557
2253
  className: "inline-flex items-center gap-2 rounded-lg bg-primary/20 border border-primary/30 px-4 py-2 text-sm font-medium text-primary hover:bg-primary hover:text-primary-foreground transition-colors disabled:opacity-50",
2558
2254
  children: [
2559
- /* @__PURE__ */ jsx21(Plus6, { className: "h-4 w-4" }),
2255
+ /* @__PURE__ */ jsx20(Plus6, { className: "h-4 w-4" }),
2560
2256
  "Add"
2561
2257
  ]
2562
2258
  }
@@ -2567,9 +2263,9 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2567
2263
  }
2568
2264
 
2569
2265
  // src/dashboard/backend-config.tsx
2570
- import * as React9 from "react";
2266
+ import * as React8 from "react";
2571
2267
  import { Bot, Plus as Plus7, RefreshCw as RefreshCw2, Trash2 as Trash25, Server, Wrench } from "lucide-react";
2572
- import { Fragment as Fragment10, jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
2268
+ import { Fragment as Fragment9, jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
2573
2269
  function BackendConfig({
2574
2270
  status,
2575
2271
  mcpServers,
@@ -2579,10 +2275,10 @@ function BackendConfig({
2579
2275
  loading = false,
2580
2276
  className
2581
2277
  }) {
2582
- const [showAddMcp, setShowAddMcp] = React9.useState(false);
2583
- const [mcpName, setMcpName] = React9.useState("");
2584
- const [mcpCommand, setMcpCommand] = React9.useState("");
2585
- const [mcpArgs, setMcpArgs] = React9.useState("");
2278
+ const [showAddMcp, setShowAddMcp] = React8.useState(false);
2279
+ const [mcpName, setMcpName] = React8.useState("");
2280
+ const [mcpCommand, setMcpCommand] = React8.useState("");
2281
+ const [mcpArgs, setMcpArgs] = React8.useState("");
2586
2282
  const handleAddMcp = () => {
2587
2283
  const name = mcpName.trim();
2588
2284
  const command = mcpCommand.trim();
@@ -2599,91 +2295,91 @@ function BackendConfig({
2599
2295
  }
2600
2296
  };
2601
2297
  if (loading || !status) {
2602
- return /* @__PURE__ */ jsxs20("div", { className: cn("rounded-lg border border-border bg-muted/20 p-6 text-center", className), children: [
2603
- /* @__PURE__ */ jsx22(Bot, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2604
- /* @__PURE__ */ jsx22("p", { className: "text-sm text-muted-foreground", children: "Loading backend status..." })
2298
+ return /* @__PURE__ */ jsxs19("div", { className: cn("rounded-lg border border-border bg-muted/20 p-6 text-center", className), children: [
2299
+ /* @__PURE__ */ jsx21(Bot, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2300
+ /* @__PURE__ */ jsx21("p", { className: "text-sm text-muted-foreground", children: "Loading backend status..." })
2605
2301
  ] });
2606
2302
  }
2607
- return /* @__PURE__ */ jsxs20("div", { className: cn("space-y-4", className), children: [
2608
- /* @__PURE__ */ jsxs20("div", { className: "rounded-lg border border-border bg-card overflow-hidden", children: [
2609
- /* @__PURE__ */ jsxs20("div", { className: "px-4 py-3 border-b border-border bg-muted/30 flex items-center justify-between", children: [
2610
- /* @__PURE__ */ jsx22("h4", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider", children: "Agent Status" }),
2611
- /* @__PURE__ */ jsxs20(
2303
+ return /* @__PURE__ */ jsxs19("div", { className: cn("space-y-4", className), children: [
2304
+ /* @__PURE__ */ jsxs19("div", { className: "rounded-lg border border-border bg-card overflow-hidden", children: [
2305
+ /* @__PURE__ */ jsxs19("div", { className: "px-4 py-3 border-b border-border bg-muted/30 flex items-center justify-between", children: [
2306
+ /* @__PURE__ */ jsx21("h4", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider", children: "Agent Status" }),
2307
+ /* @__PURE__ */ jsxs19(
2612
2308
  "button",
2613
2309
  {
2614
2310
  type: "button",
2615
2311
  onClick: onRestart,
2616
2312
  className: "inline-flex items-center gap-1.5 rounded-md bg-muted px-2.5 py-1 text-xs font-medium text-foreground hover:bg-muted/80 transition-colors border border-border",
2617
2313
  children: [
2618
- /* @__PURE__ */ jsx22(RefreshCw2, { className: "h-3 w-3" }),
2314
+ /* @__PURE__ */ jsx21(RefreshCw2, { className: "h-3 w-3" }),
2619
2315
  "Restart"
2620
2316
  ]
2621
2317
  }
2622
2318
  )
2623
2319
  ] }),
2624
- /* @__PURE__ */ jsx22("div", { className: "p-4", children: /* @__PURE__ */ jsxs20("dl", { className: "grid grid-cols-[100px_1fr] gap-y-3 text-sm", children: [
2625
- /* @__PURE__ */ jsx22("dt", { className: "text-muted-foreground", children: "Status" }),
2626
- /* @__PURE__ */ jsx22("dd", { children: /* @__PURE__ */ jsx22("span", { className: cn(
2320
+ /* @__PURE__ */ jsx21("div", { className: "p-4", children: /* @__PURE__ */ jsxs19("dl", { className: "grid grid-cols-[100px_1fr] gap-y-3 text-sm", children: [
2321
+ /* @__PURE__ */ jsx21("dt", { className: "text-muted-foreground", children: "Status" }),
2322
+ /* @__PURE__ */ jsx21("dd", { children: /* @__PURE__ */ jsx21("span", { className: cn(
2627
2323
  "inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-[10px] font-bold uppercase tracking-wider",
2628
2324
  status.running ? "bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]" : "bg-destructive/10 text-destructive"
2629
2325
  ), children: status.running ? "Running" : "Stopped" }) }),
2630
- /* @__PURE__ */ jsx22("dt", { className: "text-muted-foreground", children: "Model" }),
2631
- /* @__PURE__ */ jsx22("dd", { className: "font-mono text-xs", children: status.model ?? "Default" }),
2632
- status.provider && /* @__PURE__ */ jsxs20(Fragment10, { children: [
2633
- /* @__PURE__ */ jsx22("dt", { className: "text-muted-foreground", children: "Provider" }),
2634
- /* @__PURE__ */ jsx22("dd", { className: "font-mono text-xs", children: status.provider })
2326
+ /* @__PURE__ */ jsx21("dt", { className: "text-muted-foreground", children: "Model" }),
2327
+ /* @__PURE__ */ jsx21("dd", { className: "font-mono text-xs", children: status.model ?? "Default" }),
2328
+ status.provider && /* @__PURE__ */ jsxs19(Fragment9, { children: [
2329
+ /* @__PURE__ */ jsx21("dt", { className: "text-muted-foreground", children: "Provider" }),
2330
+ /* @__PURE__ */ jsx21("dd", { className: "font-mono text-xs", children: status.provider })
2635
2331
  ] })
2636
2332
  ] }) })
2637
2333
  ] }),
2638
- /* @__PURE__ */ jsxs20("div", { className: "rounded-lg border border-border bg-card overflow-hidden", children: [
2639
- /* @__PURE__ */ jsxs20("div", { className: "px-4 py-3 border-b border-border bg-muted/30 flex items-center justify-between", children: [
2640
- /* @__PURE__ */ jsxs20("h4", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider flex items-center gap-2", children: [
2641
- /* @__PURE__ */ jsx22(Wrench, { className: "h-3.5 w-3.5" }),
2334
+ /* @__PURE__ */ jsxs19("div", { className: "rounded-lg border border-border bg-card overflow-hidden", children: [
2335
+ /* @__PURE__ */ jsxs19("div", { className: "px-4 py-3 border-b border-border bg-muted/30 flex items-center justify-between", children: [
2336
+ /* @__PURE__ */ jsxs19("h4", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider flex items-center gap-2", children: [
2337
+ /* @__PURE__ */ jsx21(Wrench, { className: "h-3.5 w-3.5" }),
2642
2338
  "MCP Servers"
2643
2339
  ] }),
2644
- /* @__PURE__ */ jsxs20(
2340
+ /* @__PURE__ */ jsxs19(
2645
2341
  "button",
2646
2342
  {
2647
2343
  type: "button",
2648
2344
  onClick: () => setShowAddMcp(!showAddMcp),
2649
2345
  className: "inline-flex items-center gap-1.5 rounded-md bg-primary/20 border border-primary/30 px-2.5 py-1 text-xs font-medium text-primary hover:bg-primary hover:text-primary-foreground transition-colors",
2650
2346
  children: [
2651
- /* @__PURE__ */ jsx22(Plus7, { className: "h-3 w-3" }),
2347
+ /* @__PURE__ */ jsx21(Plus7, { className: "h-3 w-3" }),
2652
2348
  "Add"
2653
2349
  ]
2654
2350
  }
2655
2351
  )
2656
2352
  ] }),
2657
- mcpServers.length > 0 ? /* @__PURE__ */ jsx22("div", { className: "divide-y divide-border", children: mcpServers.map((s) => /* @__PURE__ */ jsxs20("div", { className: "flex items-center justify-between px-4 py-3", children: [
2658
- /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-3 min-w-0", children: [
2659
- /* @__PURE__ */ jsx22(Server, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" }),
2660
- /* @__PURE__ */ jsxs20("div", { className: "min-w-0", children: [
2661
- /* @__PURE__ */ jsx22("p", { className: "text-sm font-medium text-foreground truncate", children: s.name }),
2662
- /* @__PURE__ */ jsxs20("p", { className: "text-xs font-mono text-muted-foreground truncate", children: [
2353
+ mcpServers.length > 0 ? /* @__PURE__ */ jsx21("div", { className: "divide-y divide-border", children: mcpServers.map((s) => /* @__PURE__ */ jsxs19("div", { className: "flex items-center justify-between px-4 py-3", children: [
2354
+ /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-3 min-w-0", children: [
2355
+ /* @__PURE__ */ jsx21(Server, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" }),
2356
+ /* @__PURE__ */ jsxs19("div", { className: "min-w-0", children: [
2357
+ /* @__PURE__ */ jsx21("p", { className: "text-sm font-medium text-foreground truncate", children: s.name }),
2358
+ /* @__PURE__ */ jsxs19("p", { className: "text-xs font-mono text-muted-foreground truncate", children: [
2663
2359
  s.command,
2664
2360
  " ",
2665
2361
  s.args?.join(" ") ?? ""
2666
2362
  ] })
2667
2363
  ] })
2668
2364
  ] }),
2669
- /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-2 shrink-0", children: [
2670
- s.status && /* @__PURE__ */ jsx22("span", { className: cn(
2365
+ /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-2 shrink-0", children: [
2366
+ s.status && /* @__PURE__ */ jsx21("span", { className: cn(
2671
2367
  "inline-flex items-center rounded-full px-1.5 py-0.5 text-[9px] font-bold uppercase",
2672
2368
  s.status === "running" ? "bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]" : s.status === "error" ? "bg-destructive/10 text-destructive" : "bg-muted text-muted-foreground"
2673
2369
  ), children: s.status }),
2674
- /* @__PURE__ */ jsx22(
2370
+ /* @__PURE__ */ jsx21(
2675
2371
  "button",
2676
2372
  {
2677
2373
  type: "button",
2678
2374
  onClick: () => onRemoveMcp(s.name),
2679
2375
  className: "p-1 text-muted-foreground hover:text-destructive transition-colors rounded",
2680
- children: /* @__PURE__ */ jsx22(Trash25, { className: "h-3.5 w-3.5" })
2376
+ children: /* @__PURE__ */ jsx21(Trash25, { className: "h-3.5 w-3.5" })
2681
2377
  }
2682
2378
  )
2683
2379
  ] })
2684
- ] }, s.name)) }) : /* @__PURE__ */ jsx22("div", { className: "p-4 text-center", children: /* @__PURE__ */ jsx22("p", { className: "text-xs text-muted-foreground", children: "No MCP servers configured" }) }),
2685
- showAddMcp && /* @__PURE__ */ jsxs20("div", { className: "p-4 border-t border-border bg-muted/10 space-y-2", children: [
2686
- /* @__PURE__ */ jsx22(
2380
+ ] }, s.name)) }) : /* @__PURE__ */ jsx21("div", { className: "p-4 text-center", children: /* @__PURE__ */ jsx21("p", { className: "text-xs text-muted-foreground", children: "No MCP servers configured" }) }),
2381
+ showAddMcp && /* @__PURE__ */ jsxs19("div", { className: "p-4 border-t border-border bg-muted/10 space-y-2", children: [
2382
+ /* @__PURE__ */ jsx21(
2687
2383
  "input",
2688
2384
  {
2689
2385
  type: "text",
@@ -2693,7 +2389,7 @@ function BackendConfig({
2693
2389
  className: "w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2694
2390
  }
2695
2391
  ),
2696
- /* @__PURE__ */ jsx22(
2392
+ /* @__PURE__ */ jsx21(
2697
2393
  "input",
2698
2394
  {
2699
2395
  type: "text",
@@ -2703,7 +2399,7 @@ function BackendConfig({
2703
2399
  className: "w-full rounded-lg border border-border bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2704
2400
  }
2705
2401
  ),
2706
- /* @__PURE__ */ jsx22(
2402
+ /* @__PURE__ */ jsx21(
2707
2403
  "input",
2708
2404
  {
2709
2405
  type: "text",
@@ -2713,8 +2409,8 @@ function BackendConfig({
2713
2409
  className: "w-full rounded-lg border border-border bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2714
2410
  }
2715
2411
  ),
2716
- /* @__PURE__ */ jsxs20("div", { className: "flex justify-end gap-2 pt-1", children: [
2717
- /* @__PURE__ */ jsx22(
2412
+ /* @__PURE__ */ jsxs19("div", { className: "flex justify-end gap-2 pt-1", children: [
2413
+ /* @__PURE__ */ jsx21(
2718
2414
  "button",
2719
2415
  {
2720
2416
  type: "button",
@@ -2723,7 +2419,7 @@ function BackendConfig({
2723
2419
  children: "Cancel"
2724
2420
  }
2725
2421
  ),
2726
- /* @__PURE__ */ jsx22(
2422
+ /* @__PURE__ */ jsx21(
2727
2423
  "button",
2728
2424
  {
2729
2425
  type: "button",
@@ -2740,9 +2436,9 @@ function BackendConfig({
2740
2436
  }
2741
2437
 
2742
2438
  // src/dashboard/snapshot-list.tsx
2743
- import * as React10 from "react";
2439
+ import * as React9 from "react";
2744
2440
  import { Camera, Clock as Clock4, HardDrive, Plus as Plus8, RotateCcw } from "lucide-react";
2745
- import { jsx as jsx23, jsxs as jsxs21 } from "react/jsx-runtime";
2441
+ import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
2746
2442
  function formatBytes(bytes) {
2747
2443
  if (bytes == null || bytes < 0) return "-";
2748
2444
  if (bytes === 0) return "0 B";
@@ -2757,33 +2453,33 @@ function formatDate(dateStr) {
2757
2453
  return d.toLocaleDateString(void 0, { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" });
2758
2454
  }
2759
2455
  function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loading = false, className }) {
2760
- const [showCreate, setShowCreate] = React10.useState(false);
2761
- const [tags, setTags] = React10.useState("");
2456
+ const [showCreate, setShowCreate] = React9.useState(false);
2457
+ const [tags, setTags] = React9.useState("");
2762
2458
  const handleCreate = () => {
2763
2459
  const tagList = tags.trim() ? tags.trim().split(",").map((t) => t.trim()).filter(Boolean) : void 0;
2764
2460
  onCreate(tagList);
2765
2461
  setTags("");
2766
2462
  setShowCreate(false);
2767
2463
  };
2768
- return /* @__PURE__ */ jsxs21("div", { className: cn("space-y-4", className), children: [
2769
- /* @__PURE__ */ jsxs21("div", { className: "flex items-center justify-between", children: [
2770
- /* @__PURE__ */ jsx23("h3", { className: "text-sm font-bold text-foreground", children: "Snapshots" }),
2771
- /* @__PURE__ */ jsxs21(
2464
+ return /* @__PURE__ */ jsxs20("div", { className: cn("space-y-4", className), children: [
2465
+ /* @__PURE__ */ jsxs20("div", { className: "flex items-center justify-between", children: [
2466
+ /* @__PURE__ */ jsx22("h3", { className: "text-sm font-bold text-foreground", children: "Snapshots" }),
2467
+ /* @__PURE__ */ jsxs20(
2772
2468
  "button",
2773
2469
  {
2774
2470
  type: "button",
2775
2471
  onClick: () => setShowCreate(!showCreate),
2776
2472
  className: "inline-flex items-center gap-1.5 rounded-lg bg-primary/20 border border-primary/30 px-3 py-1.5 text-xs font-medium text-primary hover:bg-primary hover:text-primary-foreground transition-colors",
2777
2473
  children: [
2778
- /* @__PURE__ */ jsx23(Plus8, { className: "h-3.5 w-3.5" }),
2474
+ /* @__PURE__ */ jsx22(Plus8, { className: "h-3.5 w-3.5" }),
2779
2475
  "Create Snapshot"
2780
2476
  ]
2781
2477
  }
2782
2478
  )
2783
2479
  ] }),
2784
- showCreate && /* @__PURE__ */ jsxs21("div", { className: "rounded-lg border border-primary/20 bg-primary/5 p-4 space-y-3", children: [
2785
- /* @__PURE__ */ jsx23("p", { className: "text-sm text-foreground font-medium", children: "Create a new snapshot of the current sandbox state." }),
2786
- /* @__PURE__ */ jsx23(
2480
+ showCreate && /* @__PURE__ */ jsxs20("div", { className: "rounded-lg border border-primary/20 bg-primary/5 p-4 space-y-3", children: [
2481
+ /* @__PURE__ */ jsx22("p", { className: "text-sm text-foreground font-medium", children: "Create a new snapshot of the current sandbox state." }),
2482
+ /* @__PURE__ */ jsx22(
2787
2483
  "input",
2788
2484
  {
2789
2485
  type: "text",
@@ -2794,8 +2490,8 @@ function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loadin
2794
2490
  className: "w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2795
2491
  }
2796
2492
  ),
2797
- /* @__PURE__ */ jsxs21("div", { className: "flex justify-end gap-2", children: [
2798
- /* @__PURE__ */ jsx23(
2493
+ /* @__PURE__ */ jsxs20("div", { className: "flex justify-end gap-2", children: [
2494
+ /* @__PURE__ */ jsx22(
2799
2495
  "button",
2800
2496
  {
2801
2497
  type: "button",
@@ -2804,44 +2500,44 @@ function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loadin
2804
2500
  children: "Cancel"
2805
2501
  }
2806
2502
  ),
2807
- /* @__PURE__ */ jsxs21(
2503
+ /* @__PURE__ */ jsxs20(
2808
2504
  "button",
2809
2505
  {
2810
2506
  type: "button",
2811
2507
  onClick: handleCreate,
2812
2508
  className: "rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 transition-colors",
2813
2509
  children: [
2814
- /* @__PURE__ */ jsx23(Camera, { className: "h-3 w-3 mr-1.5 inline" }),
2510
+ /* @__PURE__ */ jsx22(Camera, { className: "h-3 w-3 mr-1.5 inline" }),
2815
2511
  "Create"
2816
2512
  ]
2817
2513
  }
2818
2514
  )
2819
2515
  ] })
2820
2516
  ] }),
2821
- loading ? /* @__PURE__ */ jsxs21("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2822
- /* @__PURE__ */ jsx23(Camera, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2823
- /* @__PURE__ */ jsx23("p", { className: "text-sm text-muted-foreground", children: "Loading snapshots..." })
2824
- ] }) : snapshots.length > 0 ? /* @__PURE__ */ jsx23("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs21("table", { className: "w-full text-sm", children: [
2825
- /* @__PURE__ */ jsx23("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs21("tr", { children: [
2826
- /* @__PURE__ */ jsx23("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "ID" }),
2827
- /* @__PURE__ */ jsx23("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Created" }),
2828
- /* @__PURE__ */ jsx23("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Size" }),
2829
- /* @__PURE__ */ jsx23("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Tags" }),
2830
- /* @__PURE__ */ jsx23("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-24" })
2517
+ loading ? /* @__PURE__ */ jsxs20("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2518
+ /* @__PURE__ */ jsx22(Camera, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2519
+ /* @__PURE__ */ jsx22("p", { className: "text-sm text-muted-foreground", children: "Loading snapshots..." })
2520
+ ] }) : snapshots.length > 0 ? /* @__PURE__ */ jsx22("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs20("table", { className: "w-full text-sm", children: [
2521
+ /* @__PURE__ */ jsx22("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs20("tr", { children: [
2522
+ /* @__PURE__ */ jsx22("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "ID" }),
2523
+ /* @__PURE__ */ jsx22("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Created" }),
2524
+ /* @__PURE__ */ jsx22("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Size" }),
2525
+ /* @__PURE__ */ jsx22("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Tags" }),
2526
+ /* @__PURE__ */ jsx22("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-24" })
2831
2527
  ] }) }),
2832
- /* @__PURE__ */ jsx23("tbody", { className: "divide-y divide-border", children: snapshots.map((s) => /* @__PURE__ */ jsxs21("tr", { children: [
2833
- /* @__PURE__ */ jsx23("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: s.id.slice(0, 12) }),
2834
- /* @__PURE__ */ jsx23("td", { className: "px-4 py-3 text-xs text-muted-foreground", children: /* @__PURE__ */ jsxs21("span", { className: "inline-flex items-center gap-1.5", children: [
2835
- /* @__PURE__ */ jsx23(Clock4, { className: "h-3 w-3" }),
2528
+ /* @__PURE__ */ jsx22("tbody", { className: "divide-y divide-border", children: snapshots.map((s) => /* @__PURE__ */ jsxs20("tr", { children: [
2529
+ /* @__PURE__ */ jsx22("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: s.id.slice(0, 12) }),
2530
+ /* @__PURE__ */ jsx22("td", { className: "px-4 py-3 text-xs text-muted-foreground", children: /* @__PURE__ */ jsxs20("span", { className: "inline-flex items-center gap-1.5", children: [
2531
+ /* @__PURE__ */ jsx22(Clock4, { className: "h-3 w-3" }),
2836
2532
  formatDate(s.createdAt)
2837
2533
  ] }) }),
2838
- /* @__PURE__ */ jsx23("td", { className: "px-4 py-3 text-xs text-muted-foreground", children: /* @__PURE__ */ jsxs21("span", { className: "inline-flex items-center gap-1.5", children: [
2839
- /* @__PURE__ */ jsx23(HardDrive, { className: "h-3 w-3" }),
2534
+ /* @__PURE__ */ jsx22("td", { className: "px-4 py-3 text-xs text-muted-foreground", children: /* @__PURE__ */ jsxs20("span", { className: "inline-flex items-center gap-1.5", children: [
2535
+ /* @__PURE__ */ jsx22(HardDrive, { className: "h-3 w-3" }),
2840
2536
  formatBytes(s.sizeBytes)
2841
2537
  ] }) }),
2842
- /* @__PURE__ */ jsx23("td", { className: "px-4 py-3", children: s.tags?.length ? /* @__PURE__ */ jsx23("div", { className: "flex items-center gap-1 flex-wrap", children: s.tags.map((tag) => /* @__PURE__ */ jsx23("span", { className: "rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground border border-border", children: tag }, tag)) }) : /* @__PURE__ */ jsx23("span", { className: "text-xs text-muted-foreground", children: "-" }) }),
2843
- /* @__PURE__ */ jsx23("td", { className: "px-4 py-3 text-right", children: /* @__PURE__ */ jsxs21("div", { className: "flex items-center justify-end gap-2", children: [
2844
- /* @__PURE__ */ jsxs21(
2538
+ /* @__PURE__ */ jsx22("td", { className: "px-4 py-3", children: s.tags?.length ? /* @__PURE__ */ jsx22("div", { className: "flex items-center gap-1 flex-wrap", children: s.tags.map((tag) => /* @__PURE__ */ jsx22("span", { className: "rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground border border-border", children: tag }, tag)) }) : /* @__PURE__ */ jsx22("span", { className: "text-xs text-muted-foreground", children: "-" }) }),
2539
+ /* @__PURE__ */ jsx22("td", { className: "px-4 py-3 text-right", children: /* @__PURE__ */ jsxs20("div", { className: "flex items-center justify-end gap-2", children: [
2540
+ /* @__PURE__ */ jsxs20(
2845
2541
  "button",
2846
2542
  {
2847
2543
  type: "button",
@@ -2849,12 +2545,12 @@ function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loadin
2849
2545
  className: "inline-flex items-center gap-1.5 rounded-md bg-muted px-2.5 py-1 text-xs font-medium text-foreground hover:bg-muted/80 transition-colors border border-border",
2850
2546
  title: "Restore to new sandbox",
2851
2547
  children: [
2852
- /* @__PURE__ */ jsx23(RotateCcw, { className: "h-3 w-3" }),
2548
+ /* @__PURE__ */ jsx22(RotateCcw, { className: "h-3 w-3" }),
2853
2549
  "Restore"
2854
2550
  ]
2855
2551
  }
2856
2552
  ),
2857
- onSaveAsTemplate && /* @__PURE__ */ jsx23(
2553
+ onSaveAsTemplate && /* @__PURE__ */ jsx22(
2858
2554
  "button",
2859
2555
  {
2860
2556
  type: "button",
@@ -2866,16 +2562,16 @@ function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loadin
2866
2562
  )
2867
2563
  ] }) })
2868
2564
  ] }, s.id)) })
2869
- ] }) }) : /* @__PURE__ */ jsxs21("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2870
- /* @__PURE__ */ jsx23(Camera, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2871
- /* @__PURE__ */ jsx23("p", { className: "text-sm text-muted-foreground", children: "No snapshots yet" }),
2872
- /* @__PURE__ */ jsx23("p", { className: "text-xs text-muted-foreground mt-1", children: "Create a snapshot to save the current state of your sandbox." })
2565
+ ] }) }) : /* @__PURE__ */ jsxs20("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2566
+ /* @__PURE__ */ jsx22(Camera, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2567
+ /* @__PURE__ */ jsx22("p", { className: "text-sm text-muted-foreground", children: "No snapshots yet" }),
2568
+ /* @__PURE__ */ jsx22("p", { className: "text-xs text-muted-foreground mt-1", children: "Create a snapshot to save the current state of your sandbox." })
2873
2569
  ] })
2874
2570
  ] });
2875
2571
  }
2876
2572
 
2877
2573
  // src/dashboard/promo-banner.tsx
2878
- import { Fragment as Fragment11, jsx as jsx24, jsxs as jsxs22 } from "react/jsx-runtime";
2574
+ import { Fragment as Fragment10, jsx as jsx23, jsxs as jsxs21 } from "react/jsx-runtime";
2879
2575
  function PromoBanner({
2880
2576
  title,
2881
2577
  description,
@@ -2890,21 +2586,21 @@ function PromoBanner({
2890
2586
  "mt-6 inline-flex items-center gap-2 rounded-md border border-white/20 bg-[var(--btn-primary-bg)] px-4 py-2 text-sm font-medium text-[var(--btn-primary-text)] transition-colors",
2891
2587
  disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-[var(--btn-primary-hover)]"
2892
2588
  );
2893
- const buttonContent = /* @__PURE__ */ jsxs22(Fragment11, { children: [
2589
+ const buttonContent = /* @__PURE__ */ jsxs21(Fragment10, { children: [
2894
2590
  buttonLabel,
2895
- /* @__PURE__ */ jsxs22("svg", { "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "h-4 w-4", children: [
2896
- /* @__PURE__ */ jsx24("path", { d: "M5 12h14" }),
2897
- /* @__PURE__ */ jsx24("path", { d: "m12 5 7 7-7 7" })
2591
+ /* @__PURE__ */ jsxs21("svg", { "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "h-4 w-4", children: [
2592
+ /* @__PURE__ */ jsx23("path", { d: "M5 12h14" }),
2593
+ /* @__PURE__ */ jsx23("path", { d: "m12 5 7 7-7 7" })
2898
2594
  ] })
2899
2595
  ] });
2900
- return /* @__PURE__ */ jsxs22("div", { className: cn("relative overflow-hidden rounded-xl bg-[var(--brand-strong)] p-8 md:flex md:items-center md:justify-between", className), children: [
2901
- /* @__PURE__ */ jsxs22("div", { className: "relative z-10", children: [
2902
- /* @__PURE__ */ jsx24("h3", { className: "text-xl font-bold text-[var(--brand-strong-text)]", children: title }),
2903
- /* @__PURE__ */ jsx24("p", { className: "mt-2 max-w-md text-sm text-[var(--brand-strong-text-muted)]", children: description }),
2904
- href && !disabled ? /* @__PURE__ */ jsx24("a", { href, target: "_blank", rel: "noopener noreferrer", onClick, className: buttonClasses, children: buttonContent }) : /* @__PURE__ */ jsx24("button", { type: "button", onClick, disabled, className: buttonClasses, children: buttonContent })
2596
+ return /* @__PURE__ */ jsxs21("div", { className: cn("relative overflow-hidden rounded-xl bg-[var(--brand-strong)] p-8 md:flex md:items-center md:justify-between", className), children: [
2597
+ /* @__PURE__ */ jsxs21("div", { className: "relative z-10", children: [
2598
+ /* @__PURE__ */ jsx23("h3", { className: "text-xl font-bold text-[var(--brand-strong-text)]", children: title }),
2599
+ /* @__PURE__ */ jsx23("p", { className: "mt-2 max-w-md text-sm text-[var(--brand-strong-text-muted)]", children: description }),
2600
+ href && !disabled ? /* @__PURE__ */ jsx23("a", { href, target: "_blank", rel: "noopener noreferrer", onClick, className: buttonClasses, children: buttonContent }) : /* @__PURE__ */ jsx23("button", { type: "button", onClick, disabled, className: buttonClasses, children: buttonContent })
2905
2601
  ] }),
2906
- icon && /* @__PURE__ */ jsx24("div", { className: "relative z-10 mt-6 flex items-center md:mt-0", children: /* @__PURE__ */ jsx24("div", { className: "flex h-16 w-16 items-center justify-center rounded-2xl border border-white/10 bg-white/10", children: icon }) }),
2907
- /* @__PURE__ */ jsx24("div", { className: "pointer-events-none absolute inset-y-0 right-0 w-1/3 bg-gradient-to-l from-white/5 to-transparent" })
2602
+ icon && /* @__PURE__ */ jsx23("div", { className: "relative z-10 mt-6 flex items-center md:mt-0", children: /* @__PURE__ */ jsx23("div", { className: "flex h-16 w-16 items-center justify-center rounded-2xl border border-white/10 bg-white/10", children: icon }) }),
2603
+ /* @__PURE__ */ jsx23("div", { className: "pointer-events-none absolute inset-y-0 right-0 w-1/3 bg-gradient-to-l from-white/5 to-transparent" })
2908
2604
  ] });
2909
2605
  }
2910
2606
 
@@ -2940,10 +2636,6 @@ export {
2940
2636
  BackendSelector,
2941
2637
  HARNESS_OPTIONS,
2942
2638
  HarnessPicker,
2943
- canonicalModelId,
2944
- formatPricing,
2945
- formatContext,
2946
- ModelPicker,
2947
2639
  DashboardLayout,
2948
2640
  ProfileSelector,
2949
2641
  ProfileComparison,