@tangle-network/sandbox-ui 0.15.1 → 0.15.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-EHMKLMMU.js +861 -0
- package/dist/{chunk-AHBZCBDO.js → chunk-HLZTKSGT.js} +397 -705
- package/dist/dashboard.d.ts +2 -90
- package/dist/dashboard.js +7 -7
- package/dist/index.d.ts +2 -2
- package/dist/index.js +7 -7
- package/dist/pages.d.ts +13 -11
- package/dist/pages.js +24 -50
- package/dist/template-card-DStb8boW.d.ts +183 -0
- package/package.json +1 -1
- package/dist/chunk-DNZ4DTNA.js +0 -547
- package/dist/template-card-UhV3pmRC.d.ts +0 -88
|
@@ -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
|
|
1042
|
+
import * as React3 from "react";
|
|
1347
1043
|
import { Plus as Plus2, Bell } from "lucide-react";
|
|
1348
|
-
import { Fragment as
|
|
1044
|
+
import { Fragment as Fragment6, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1349
1045
|
function SettingsIconSmall({ className }) {
|
|
1350
|
-
return /* @__PURE__ */
|
|
1351
|
-
/* @__PURE__ */
|
|
1352
|
-
/* @__PURE__ */
|
|
1353
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1358
|
-
/* @__PURE__ */
|
|
1359
|
-
/* @__PURE__ */
|
|
1360
|
-
/* @__PURE__ */
|
|
1361
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1366
|
-
/* @__PURE__ */
|
|
1367
|
-
/* @__PURE__ */
|
|
1368
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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] =
|
|
1410
|
-
const [notificationsOpen, setNotificationsOpen] =
|
|
1411
|
-
const notifRef =
|
|
1412
|
-
|
|
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 =
|
|
1431
|
-
const sidebarUser =
|
|
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 =
|
|
1437
|
-
(showLabels) => /* @__PURE__ */
|
|
1438
|
-
/* @__PURE__ */
|
|
1439
|
-
/* @__PURE__ */
|
|
1440
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1445
|
-
showSep && /* @__PURE__ */
|
|
1446
|
-
isMode ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1467
|
-
onSettingsClick ? /* @__PURE__ */
|
|
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__ */
|
|
1470
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1485
|
-
/* @__PURE__ */
|
|
1486
|
-
/* @__PURE__ */
|
|
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 =
|
|
1510
|
-
const mobileSidebarContent =
|
|
1511
|
-
return /* @__PURE__ */
|
|
1512
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1522
|
-
/* @__PURE__ */
|
|
1523
|
-
topNavLinks && topNavLinks.length > 0 && /* @__PURE__ */
|
|
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__ */
|
|
1538
|
-
onNewSandbox && /* @__PURE__ */
|
|
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__ */
|
|
1241
|
+
/* @__PURE__ */ jsx12(Plus2, { className: "h-3.5 w-3.5" }),
|
|
1546
1242
|
"New Sandbox"
|
|
1547
1243
|
]
|
|
1548
1244
|
}
|
|
1549
1245
|
),
|
|
1550
|
-
/* @__PURE__ */
|
|
1551
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1561
|
-
(notifData?.unreadCount ?? 0) > 0 && /* @__PURE__ */
|
|
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__ */
|
|
1566
|
-
/* @__PURE__ */
|
|
1567
|
-
/* @__PURE__ */
|
|
1568
|
-
(notifData?.unreadCount ?? 0) > 0 && notifData?.onMarkAllRead && /* @__PURE__ */
|
|
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__ */
|
|
1581
|
-
/* @__PURE__ */
|
|
1582
|
-
/* @__PURE__ */
|
|
1583
|
-
/* @__PURE__ */
|
|
1584
|
-
] }) : /* @__PURE__ */
|
|
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__ */
|
|
1597
|
-
/* @__PURE__ */
|
|
1598
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1621
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1635
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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__ */
|
|
1671
|
-
label && /* @__PURE__ */
|
|
1672
|
-
/* @__PURE__ */
|
|
1673
|
-
/* @__PURE__ */
|
|
1674
|
-
/* @__PURE__ */
|
|
1675
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1678
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1685
|
-
!selectedId && /* @__PURE__ */
|
|
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__ */
|
|
1690
|
-
/* @__PURE__ */
|
|
1691
|
-
/* @__PURE__ */
|
|
1692
|
-
builtinProfiles.map((profile) => /* @__PURE__ */
|
|
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__ */
|
|
1699
|
-
/* @__PURE__ */
|
|
1700
|
-
/* @__PURE__ */
|
|
1701
|
-
profile.extends && /* @__PURE__ */
|
|
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__ */
|
|
1402
|
+
selectedId === profile.id && /* @__PURE__ */ jsx13(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
|
|
1707
1403
|
] }),
|
|
1708
|
-
profile.description && /* @__PURE__ */
|
|
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__ */
|
|
1715
|
-
/* @__PURE__ */
|
|
1716
|
-
/* @__PURE__ */
|
|
1717
|
-
customProfiles.map((profile) => /* @__PURE__ */
|
|
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__ */
|
|
1724
|
-
/* @__PURE__ */
|
|
1725
|
-
/* @__PURE__ */
|
|
1726
|
-
profile.model && /* @__PURE__ */
|
|
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__ */
|
|
1424
|
+
selectedId === profile.id && /* @__PURE__ */ jsx13(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
|
|
1729
1425
|
] }),
|
|
1730
|
-
profile.description && /* @__PURE__ */
|
|
1731
|
-
showMetrics && profile.metrics && profile.metrics.total_runs > 0 && /* @__PURE__ */
|
|
1732
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1432
|
+
/* @__PURE__ */ jsxs11("span", { children: [
|
|
1737
1433
|
profile.metrics.success_rate.toFixed(0),
|
|
1738
1434
|
"% success"
|
|
1739
1435
|
] }),
|
|
1740
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1752
|
-
/* @__PURE__ */
|
|
1753
|
-
onCreateClick && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1460
|
+
onManageClick && /* @__PURE__ */ jsxs11(
|
|
1765
1461
|
DropdownMenuItem3,
|
|
1766
1462
|
{
|
|
1767
1463
|
onClick: onManageClick,
|
|
1768
1464
|
className: "text-muted-foreground",
|
|
1769
1465
|
children: [
|
|
1770
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1797
|
-
/* @__PURE__ */
|
|
1798
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1497
|
+
return /* @__PURE__ */ jsxs11(
|
|
1802
1498
|
"div",
|
|
1803
1499
|
{
|
|
1804
1500
|
className: "flex items-center justify-between gap-4",
|
|
1805
1501
|
children: [
|
|
1806
|
-
/* @__PURE__ */
|
|
1807
|
-
/* @__PURE__ */
|
|
1808
|
-
isBestSuccess && /* @__PURE__ */
|
|
1809
|
-
isFastest && !isBestSuccess && /* @__PURE__ */
|
|
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__ */
|
|
1812
|
-
/* @__PURE__ */
|
|
1813
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1827
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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:
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1953
|
-
/* @__PURE__ */
|
|
1954
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1963
|
-
variant.sublabel && /* @__PURE__ */
|
|
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__ */
|
|
1969
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1974
|
-
variant.outcome && /* @__PURE__ */
|
|
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__ */
|
|
1982
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1690
|
+
/* @__PURE__ */ jsx14(Check3, { className: "mr-1 h-3 w-3" }),
|
|
1995
1691
|
"Accept"
|
|
1996
1692
|
]
|
|
1997
1693
|
}
|
|
1998
1694
|
),
|
|
1999
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1723
|
+
children: /* @__PURE__ */ jsx14(ExternalLink, { className: "h-3.5 w-3.5" })
|
|
2028
1724
|
}
|
|
2029
1725
|
)
|
|
2030
1726
|
] })
|
|
2031
1727
|
] }),
|
|
2032
|
-
variant.error && /* @__PURE__ */
|
|
2033
|
-
variant.summary && /* @__PURE__ */
|
|
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
|
|
2044
|
-
import { jsx as
|
|
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] =
|
|
2047
|
-
const [error, setError] =
|
|
2048
|
-
const [isFollowing, setIsFollowing] =
|
|
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__ */
|
|
2098
|
-
/* @__PURE__ */
|
|
2099
|
-
/* @__PURE__ */
|
|
2100
|
-
/* @__PURE__ */
|
|
2101
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2104
|
-
error && /* @__PURE__ */
|
|
2105
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2130
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1831
|
+
/* @__PURE__ */ jsxs13("span", { className: "text-primary/70 mr-2", children: [
|
|
2136
1832
|
"[",
|
|
2137
1833
|
log.level,
|
|
2138
1834
|
"]"
|
|
2139
1835
|
] }),
|
|
2140
|
-
/* @__PURE__ */
|
|
1836
|
+
/* @__PURE__ */ jsxs13("span", { className: "text-muted-foreground mr-2", children: [
|
|
2141
1837
|
"[",
|
|
2142
1838
|
log.scope,
|
|
2143
1839
|
"]"
|
|
2144
1840
|
] }),
|
|
2145
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
2162
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1865
|
+
icon: /* @__PURE__ */ jsx16(Clock3, { className: "h-5 w-5" })
|
|
2170
1866
|
}
|
|
2171
1867
|
),
|
|
2172
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1875
|
+
icon: /* @__PURE__ */ jsx16(Layers, { className: "h-5 w-5" })
|
|
2180
1876
|
}
|
|
2181
1877
|
),
|
|
2182
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1885
|
+
icon: /* @__PURE__ */ jsx16(MessageSquare, { className: "h-5 w-5" })
|
|
2190
1886
|
}
|
|
2191
1887
|
),
|
|
2192
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
2211
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2217
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2223
|
-
/* @__PURE__ */
|
|
2224
|
-
/* @__PURE__ */
|
|
2225
|
-
/* @__PURE__ */
|
|
2226
|
-
/* @__PURE__ */
|
|
2227
|
-
status.isDirty && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2236
|
-
status.staged.map((f) => /* @__PURE__ */
|
|
2237
|
-
/* @__PURE__ */
|
|
2238
|
-
/* @__PURE__ */
|
|
2239
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2242
|
-
/* @__PURE__ */
|
|
2243
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2246
|
-
/* @__PURE__ */
|
|
2247
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2251
|
-
/* @__PURE__ */
|
|
2252
|
-
/* @__PURE__ */
|
|
2253
|
-
/* @__PURE__ */
|
|
2254
|
-
/* @__PURE__ */
|
|
2255
|
-
/* @__PURE__ */
|
|
2256
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2261
|
-
status.ahead > 0 && /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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] =
|
|
2281
|
-
const [copiedPort, setCopiedPort] =
|
|
2282
|
-
const copyTimerRef =
|
|
2283
|
-
|
|
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__ */
|
|
2306
|
-
ports.length > 0 ? /* @__PURE__ */
|
|
2307
|
-
/* @__PURE__ */
|
|
2308
|
-
/* @__PURE__ */
|
|
2309
|
-
/* @__PURE__ */
|
|
2310
|
-
/* @__PURE__ */
|
|
2311
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2314
|
-
/* @__PURE__ */
|
|
2315
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2323
|
-
copiedPort === p.port ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2033
|
+
children: /* @__PURE__ */ jsx18(Trash23, { className: "h-3.5 w-3.5" })
|
|
2338
2034
|
}
|
|
2339
2035
|
) })
|
|
2340
2036
|
] }, p.port)) })
|
|
2341
|
-
] }) }) : /* @__PURE__ */
|
|
2342
|
-
/* @__PURE__ */
|
|
2343
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2346
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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] =
|
|
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__ */
|
|
2398
|
-
loading ? /* @__PURE__ */
|
|
2399
|
-
/* @__PURE__ */
|
|
2400
|
-
/* @__PURE__ */
|
|
2401
|
-
] }) : processes.length > 0 ? /* @__PURE__ */
|
|
2402
|
-
/* @__PURE__ */
|
|
2403
|
-
/* @__PURE__ */
|
|
2404
|
-
/* @__PURE__ */
|
|
2405
|
-
/* @__PURE__ */
|
|
2406
|
-
/* @__PURE__ */
|
|
2407
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2410
|
-
/* @__PURE__ */
|
|
2411
|
-
/* @__PURE__ */
|
|
2412
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2417
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2429
|
-
/* @__PURE__ */
|
|
2430
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2433
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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] =
|
|
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__ */
|
|
2488
|
-
/* @__PURE__ */
|
|
2489
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2493
|
-
/* @__PURE__ */
|
|
2494
|
-
/* @__PURE__ */
|
|
2495
|
-
/* @__PURE__ */
|
|
2496
|
-
/* @__PURE__ */
|
|
2497
|
-
/* @__PURE__ */
|
|
2498
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2526
|
-
/* @__PURE__ */
|
|
2527
|
-
config.allowList.length > 0 ? /* @__PURE__ */
|
|
2528
|
-
/* @__PURE__ */
|
|
2529
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2231
|
+
children: /* @__PURE__ */ jsx20(Trash24, { className: "h-3 w-3" })
|
|
2536
2232
|
}
|
|
2537
2233
|
)
|
|
2538
|
-
] }, cidr)) }) : /* @__PURE__ */
|
|
2539
|
-
/* @__PURE__ */
|
|
2540
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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] =
|
|
2583
|
-
const [mcpName, setMcpName] =
|
|
2584
|
-
const [mcpCommand, setMcpCommand] =
|
|
2585
|
-
const [mcpArgs, setMcpArgs] =
|
|
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__ */
|
|
2603
|
-
/* @__PURE__ */
|
|
2604
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2608
|
-
/* @__PURE__ */
|
|
2609
|
-
/* @__PURE__ */
|
|
2610
|
-
/* @__PURE__ */
|
|
2611
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2314
|
+
/* @__PURE__ */ jsx21(RefreshCw2, { className: "h-3 w-3" }),
|
|
2619
2315
|
"Restart"
|
|
2620
2316
|
]
|
|
2621
2317
|
}
|
|
2622
2318
|
)
|
|
2623
2319
|
] }),
|
|
2624
|
-
/* @__PURE__ */
|
|
2625
|
-
/* @__PURE__ */
|
|
2626
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2631
|
-
/* @__PURE__ */
|
|
2632
|
-
status.provider && /* @__PURE__ */
|
|
2633
|
-
/* @__PURE__ */
|
|
2634
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2639
|
-
/* @__PURE__ */
|
|
2640
|
-
/* @__PURE__ */
|
|
2641
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2658
|
-
/* @__PURE__ */
|
|
2659
|
-
/* @__PURE__ */
|
|
2660
|
-
/* @__PURE__ */
|
|
2661
|
-
/* @__PURE__ */
|
|
2662
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2670
|
-
s.status && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2376
|
+
children: /* @__PURE__ */ jsx21(Trash25, { className: "h-3.5 w-3.5" })
|
|
2681
2377
|
}
|
|
2682
2378
|
)
|
|
2683
2379
|
] })
|
|
2684
|
-
] }, s.name)) }) : /* @__PURE__ */
|
|
2685
|
-
showAddMcp && /* @__PURE__ */
|
|
2686
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2717
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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] =
|
|
2761
|
-
const [tags, setTags] =
|
|
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__ */
|
|
2769
|
-
/* @__PURE__ */
|
|
2770
|
-
/* @__PURE__ */
|
|
2771
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2785
|
-
/* @__PURE__ */
|
|
2786
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2798
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2822
|
-
/* @__PURE__ */
|
|
2823
|
-
/* @__PURE__ */
|
|
2824
|
-
] }) : snapshots.length > 0 ? /* @__PURE__ */
|
|
2825
|
-
/* @__PURE__ */
|
|
2826
|
-
/* @__PURE__ */
|
|
2827
|
-
/* @__PURE__ */
|
|
2828
|
-
/* @__PURE__ */
|
|
2829
|
-
/* @__PURE__ */
|
|
2830
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2833
|
-
/* @__PURE__ */
|
|
2834
|
-
/* @__PURE__ */
|
|
2835
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2839
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2843
|
-
/* @__PURE__ */
|
|
2844
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2548
|
+
/* @__PURE__ */ jsx22(RotateCcw, { className: "h-3 w-3" }),
|
|
2853
2549
|
"Restore"
|
|
2854
2550
|
]
|
|
2855
2551
|
}
|
|
2856
2552
|
),
|
|
2857
|
-
onSaveAsTemplate && /* @__PURE__ */
|
|
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__ */
|
|
2870
|
-
/* @__PURE__ */
|
|
2871
|
-
/* @__PURE__ */
|
|
2872
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
2589
|
+
const buttonContent = /* @__PURE__ */ jsxs21(Fragment10, { children: [
|
|
2894
2590
|
buttonLabel,
|
|
2895
|
-
/* @__PURE__ */
|
|
2896
|
-
/* @__PURE__ */
|
|
2897
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2901
|
-
/* @__PURE__ */
|
|
2902
|
-
/* @__PURE__ */
|
|
2903
|
-
/* @__PURE__ */
|
|
2904
|
-
href && !disabled ? /* @__PURE__ */
|
|
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__ */
|
|
2907
|
-
/* @__PURE__ */
|
|
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,
|