@tangle-network/sandbox-ui 0.10.9 → 0.12.0

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.
@@ -1274,9 +1274,376 @@ function BackendSelector({
1274
1274
  ] });
1275
1275
  }
1276
1276
 
1277
+ // src/dashboard/harness-picker.tsx
1278
+ import { jsx as jsx12 } from "react/jsx-runtime";
1279
+ var HARNESS_OPTIONS = [
1280
+ {
1281
+ type: "opencode",
1282
+ label: "OpenCode",
1283
+ description: "Default agent \u2014 broad model support, deterministic streaming"
1284
+ },
1285
+ {
1286
+ type: "claude-code",
1287
+ label: "Claude Code",
1288
+ description: "Native Claude skills and tools (requires ANTHROPIC_API_KEY)"
1289
+ },
1290
+ {
1291
+ type: "codex",
1292
+ label: "Codex",
1293
+ description: "OpenAI Codex CLI (requires OPENAI_API_KEY)"
1294
+ },
1295
+ {
1296
+ type: "amp",
1297
+ label: "AMP",
1298
+ description: "Sourcegraph AMP agent"
1299
+ },
1300
+ {
1301
+ type: "factory-droids",
1302
+ label: "Factory Droids",
1303
+ description: "Factory Droid agent"
1304
+ },
1305
+ {
1306
+ type: "cli-base",
1307
+ label: "CLI base (no agent)",
1308
+ description: "Shell tools only \u2014 for non-AI scheduled tasks"
1309
+ }
1310
+ ];
1311
+ function HarnessPicker({
1312
+ value,
1313
+ onChange,
1314
+ available,
1315
+ optionsOverride,
1316
+ label = "Agent harness",
1317
+ ...rest
1318
+ }) {
1319
+ const allowed = new Set(available ?? HARNESS_OPTIONS.map((h) => h.type));
1320
+ const backends = HARNESS_OPTIONS.filter((h) => allowed.has(h.type)).map((h) => {
1321
+ const override = optionsOverride?.[h.type];
1322
+ return {
1323
+ type: h.type,
1324
+ label: override?.label ?? h.label,
1325
+ description: override?.description ?? h.description
1326
+ };
1327
+ });
1328
+ return /* @__PURE__ */ jsx12(
1329
+ BackendSelector,
1330
+ {
1331
+ backends,
1332
+ selected: value,
1333
+ onChange: (next) => onChange(next),
1334
+ label,
1335
+ ...rest
1336
+ }
1337
+ );
1338
+ }
1339
+
1340
+ // src/dashboard/model-picker.tsx
1341
+ import * as React4 from "react";
1342
+ import { ChevronDown as ChevronDown2, Search, Sparkles, Zap, Brain, Star, Loader2 } from "lucide-react";
1343
+ import * as Popover from "@radix-ui/react-dropdown-menu";
1344
+ import { Fragment as Fragment7, jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1345
+ function canonicalModelId(model) {
1346
+ const id = model.id;
1347
+ if (id.includes("/")) return id;
1348
+ const provider = model._provider ?? model.provider;
1349
+ return provider ? `${provider}/${id}` : id;
1350
+ }
1351
+ function formatPricing(pricing) {
1352
+ const prompt = Number(pricing?.prompt ?? 0);
1353
+ const completion = Number(pricing?.completion ?? 0);
1354
+ if (!prompt && !completion) return null;
1355
+ const fmt = (n) => {
1356
+ const perM = n * 1e6;
1357
+ if (perM === 0) return "0";
1358
+ if (perM >= 1) return `$${perM.toFixed(2)}`;
1359
+ return `$${perM.toFixed(2)}`;
1360
+ };
1361
+ return `${fmt(prompt)} / ${fmt(completion)} per 1M`;
1362
+ }
1363
+ function formatContext(ctx) {
1364
+ if (!ctx) return null;
1365
+ if (ctx >= 1e6) return `${(ctx / 1e6).toFixed(1)}M ctx`;
1366
+ if (ctx >= 1e3) return `${Math.round(ctx / 1e3)}k ctx`;
1367
+ return `${ctx} ctx`;
1368
+ }
1369
+ var DEFAULT_PRESETS = [
1370
+ {
1371
+ id: "fast",
1372
+ label: "Fast",
1373
+ hint: "Cheapest, lowest latency",
1374
+ icon: Zap,
1375
+ match: (models) => {
1376
+ const ids = models.map(canonicalModelId);
1377
+ 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));
1378
+ }
1379
+ },
1380
+ {
1381
+ id: "balanced",
1382
+ label: "Balanced",
1383
+ hint: "Best value for most chat",
1384
+ icon: Sparkles,
1385
+ match: (models) => {
1386
+ const ids = models.map(canonicalModelId);
1387
+ 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));
1388
+ }
1389
+ },
1390
+ {
1391
+ id: "best",
1392
+ label: "Best",
1393
+ hint: "Hardest reasoning, highest quality",
1394
+ icon: Brain,
1395
+ match: (models) => {
1396
+ const ids = models.map(canonicalModelId);
1397
+ 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));
1398
+ }
1399
+ }
1400
+ ];
1401
+ function ModelPicker({
1402
+ value,
1403
+ onChange,
1404
+ models,
1405
+ loading = false,
1406
+ recents,
1407
+ presets = DEFAULT_PRESETS,
1408
+ excludeProviders,
1409
+ modalities,
1410
+ variant = "field",
1411
+ label = "Model",
1412
+ placeholder = "Choose a model",
1413
+ className,
1414
+ disabled
1415
+ }) {
1416
+ const [query, setQuery] = React4.useState("");
1417
+ const [open, setOpen] = React4.useState(false);
1418
+ const filtered = React4.useMemo(() => {
1419
+ const excluded = new Set((excludeProviders ?? []).map((p) => p.toLowerCase()));
1420
+ const allowedModalities = modalities ? new Set(modalities) : null;
1421
+ const q = query.trim().toLowerCase();
1422
+ return models.filter((m) => {
1423
+ const provider = (m._provider ?? m.provider ?? "").toLowerCase();
1424
+ if (excluded.has(provider)) return false;
1425
+ if (allowedModalities && m.architecture?.modality && !allowedModalities.has(m.architecture.modality)) return false;
1426
+ if (!q) return true;
1427
+ const id = canonicalModelId(m).toLowerCase();
1428
+ const name = (m.name ?? "").toLowerCase();
1429
+ return id.includes(q) || name.includes(q) || provider.includes(q);
1430
+ });
1431
+ }, [models, query, modalities, excludeProviders]);
1432
+ const grouped = React4.useMemo(() => {
1433
+ const groups = /* @__PURE__ */ new Map();
1434
+ for (const m of filtered) {
1435
+ const provider = m._provider ?? m.provider ?? "other";
1436
+ const list = groups.get(provider);
1437
+ if (list) list.push(m);
1438
+ else groups.set(provider, [m]);
1439
+ }
1440
+ return Array.from(groups.entries()).sort(([a], [b]) => a.localeCompare(b));
1441
+ }, [filtered]);
1442
+ const current = React4.useMemo(
1443
+ () => models.find((m) => canonicalModelId(m) === value),
1444
+ [models, value]
1445
+ );
1446
+ const currentLabel = current?.name ?? current?.id ?? value;
1447
+ const recentIds = React4.useMemo(() => {
1448
+ if (!recents?.length) return [];
1449
+ const lookup = new Map(models.map((m) => [canonicalModelId(m), m]));
1450
+ return recents.map((id) => lookup.get(id)).filter((m) => Boolean(m)).slice(0, 4);
1451
+ }, [recents, models]);
1452
+ const handleSelect = (id) => {
1453
+ onChange(id);
1454
+ setOpen(false);
1455
+ setQuery("");
1456
+ };
1457
+ const trigger = variant === "pill" ? /* @__PURE__ */ jsxs11(
1458
+ "button",
1459
+ {
1460
+ type: "button",
1461
+ disabled,
1462
+ className: cn(
1463
+ "inline-flex items-center gap-1.5 rounded-full border border-border bg-card",
1464
+ "px-2.5 py-1 text-xs font-medium text-foreground",
1465
+ "transition-colors duration-[var(--transition-fast)]",
1466
+ "hover:border-primary/30 hover:bg-accent/30",
1467
+ "focus:outline-none focus:border-primary/40",
1468
+ "data-[state=open]:border-primary/40 data-[state=open]:bg-accent/30",
1469
+ "disabled:opacity-50 disabled:cursor-not-allowed",
1470
+ className
1471
+ ),
1472
+ children: [
1473
+ /* @__PURE__ */ jsx13(Sparkles, { className: "h-3 w-3 text-muted-foreground" }),
1474
+ /* @__PURE__ */ jsx13("span", { className: "truncate max-w-[160px]", children: currentLabel || placeholder }),
1475
+ /* @__PURE__ */ jsx13(ChevronDown2, { className: "h-3 w-3 text-muted-foreground transition-transform data-[state=open]:rotate-180" })
1476
+ ]
1477
+ }
1478
+ ) : /* @__PURE__ */ jsxs11(
1479
+ "button",
1480
+ {
1481
+ type: "button",
1482
+ disabled,
1483
+ className: cn(
1484
+ "flex w-full items-center justify-between gap-2 rounded-[var(--radius-md)]",
1485
+ "border border-border bg-card px-3 py-2.5 text-sm text-left",
1486
+ "transition-colors duration-[var(--transition-fast)]",
1487
+ "hover:border-primary/20 hover:bg-accent/30",
1488
+ "focus:outline-none focus:border-primary/30",
1489
+ "data-[state=open]:border-primary/30 data-[state=open]:bg-accent/30",
1490
+ "disabled:opacity-50 disabled:cursor-not-allowed",
1491
+ className
1492
+ ),
1493
+ children: [
1494
+ /* @__PURE__ */ jsx13("span", { className: cn("truncate", current ? "text-foreground font-medium" : "text-muted-foreground"), children: currentLabel || placeholder }),
1495
+ /* @__PURE__ */ jsx13(ChevronDown2, { className: "h-4 w-4 shrink-0 text-muted-foreground transition-transform data-[state=open]:rotate-180" })
1496
+ ]
1497
+ }
1498
+ );
1499
+ return /* @__PURE__ */ jsxs11("div", { className: cn(variant === "field" ? "space-y-1.5" : "inline-flex", variant === "field" ? className : void 0), children: [
1500
+ variant === "field" && label && /* @__PURE__ */ jsx13("label", { className: "block text-xs font-medium text-muted-foreground uppercase tracking-[0.06em]", children: label }),
1501
+ /* @__PURE__ */ jsxs11(Popover.Root, { open, onOpenChange: setOpen, children: [
1502
+ /* @__PURE__ */ jsx13(Popover.Trigger, { asChild: true, children: trigger }),
1503
+ /* @__PURE__ */ jsx13(Popover.Portal, { children: /* @__PURE__ */ jsxs11(
1504
+ Popover.Content,
1505
+ {
1506
+ sideOffset: 4,
1507
+ align: variant === "pill" ? "start" : "start",
1508
+ className: cn(
1509
+ "z-50 w-[var(--radix-dropdown-menu-trigger-width)] min-w-[320px] max-w-[460px]",
1510
+ "max-h-[440px] overflow-hidden flex flex-col",
1511
+ "rounded-[var(--radius-md)] border border-border bg-card shadow-[var(--shadow-dropdown)]",
1512
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
1513
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
1514
+ "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95"
1515
+ ),
1516
+ children: [
1517
+ /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2 border-b border-border px-3 py-2", children: [
1518
+ /* @__PURE__ */ jsx13(Search, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }),
1519
+ /* @__PURE__ */ jsx13(
1520
+ "input",
1521
+ {
1522
+ type: "text",
1523
+ value: query,
1524
+ onChange: (e) => setQuery(e.target.value),
1525
+ placeholder: "Search models...",
1526
+ autoFocus: true,
1527
+ className: "flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground"
1528
+ }
1529
+ ),
1530
+ loading && /* @__PURE__ */ jsx13(Loader2, { className: "h-3.5 w-3.5 animate-spin text-muted-foreground" })
1531
+ ] }),
1532
+ /* @__PURE__ */ jsxs11("div", { className: "flex-1 overflow-y-auto", children: [
1533
+ !query && presets.length > 0 && /* @__PURE__ */ jsx13(Section, { label: "Presets", children: presets.map((preset) => {
1534
+ const Icon2 = preset.icon ?? Star;
1535
+ const matchedId = preset.match(models);
1536
+ if (!matchedId) return null;
1537
+ const matched = models.find((m) => canonicalModelId(m) === matchedId);
1538
+ const isCurrent = matchedId === value;
1539
+ return /* @__PURE__ */ jsxs11(
1540
+ PickerItem,
1541
+ {
1542
+ onSelect: () => handleSelect(matchedId),
1543
+ active: isCurrent,
1544
+ children: [
1545
+ /* @__PURE__ */ jsx13(Icon2, { className: "h-3.5 w-3.5 shrink-0 text-[var(--accent-text)]" }),
1546
+ /* @__PURE__ */ jsxs11("div", { className: "min-w-0 flex-1", children: [
1547
+ /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-1.5", children: [
1548
+ /* @__PURE__ */ jsx13("span", { className: "text-sm font-medium", children: preset.label }),
1549
+ /* @__PURE__ */ jsxs11("span", { className: "text-[10px] text-muted-foreground truncate", children: [
1550
+ "\u2192 ",
1551
+ matched?.name ?? matchedId
1552
+ ] })
1553
+ ] }),
1554
+ /* @__PURE__ */ jsx13("span", { className: "text-xs text-muted-foreground", children: preset.hint })
1555
+ ] })
1556
+ ]
1557
+ },
1558
+ preset.id
1559
+ );
1560
+ }) }),
1561
+ !query && recentIds.length > 0 && /* @__PURE__ */ jsx13(Section, { label: "Recent", children: recentIds.map((m) => /* @__PURE__ */ jsx13(
1562
+ ModelRow,
1563
+ {
1564
+ model: m,
1565
+ active: canonicalModelId(m) === value,
1566
+ onSelect: handleSelect
1567
+ },
1568
+ `recent-${canonicalModelId(m)}`
1569
+ )) }),
1570
+ grouped.length === 0 ? /* @__PURE__ */ jsx13("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__ */ jsx13(Section, { label: provider, children: list.map((m) => /* @__PURE__ */ jsx13(
1571
+ ModelRow,
1572
+ {
1573
+ model: m,
1574
+ active: canonicalModelId(m) === value,
1575
+ onSelect: handleSelect
1576
+ },
1577
+ canonicalModelId(m)
1578
+ )) }, provider))
1579
+ ] }),
1580
+ /* @__PURE__ */ jsxs11("div", { className: "border-t border-border px-3 py-1.5 text-[10px] text-muted-foreground", children: [
1581
+ filtered.length,
1582
+ " of ",
1583
+ models.length,
1584
+ " model",
1585
+ models.length === 1 ? "" : "s"
1586
+ ] })
1587
+ ]
1588
+ }
1589
+ ) })
1590
+ ] })
1591
+ ] });
1592
+ }
1593
+ function Section({ label, children }) {
1594
+ return /* @__PURE__ */ jsxs11("div", { className: "py-1", children: [
1595
+ /* @__PURE__ */ jsx13("div", { className: "px-3 pt-1.5 pb-0.5 text-[10px] font-mono uppercase tracking-widest text-muted-foreground", children: label }),
1596
+ /* @__PURE__ */ jsx13("div", { children })
1597
+ ] });
1598
+ }
1599
+ function PickerItem({
1600
+ onSelect,
1601
+ active,
1602
+ children
1603
+ }) {
1604
+ return /* @__PURE__ */ jsx13(
1605
+ Popover.Item,
1606
+ {
1607
+ onSelect: (e) => {
1608
+ e.preventDefault();
1609
+ onSelect();
1610
+ },
1611
+ className: cn(
1612
+ "flex cursor-pointer items-start gap-2 px-3 py-2 outline-none",
1613
+ "transition-colors duration-[var(--transition-fast)]",
1614
+ "hover:bg-accent/40 focus:bg-accent/40",
1615
+ active && "bg-[var(--accent-surface-soft)] text-[var(--accent-text)]"
1616
+ ),
1617
+ children
1618
+ }
1619
+ );
1620
+ }
1621
+ function ModelRow({
1622
+ model,
1623
+ active,
1624
+ onSelect
1625
+ }) {
1626
+ const id = canonicalModelId(model);
1627
+ const pricing = formatPricing(model.pricing);
1628
+ const ctx = formatContext(model.context_length);
1629
+ return /* @__PURE__ */ jsx13(PickerItem, { onSelect: () => onSelect(id), active, children: /* @__PURE__ */ jsxs11("div", { className: "min-w-0 flex-1", children: [
1630
+ /* @__PURE__ */ jsxs11("div", { className: "flex items-baseline justify-between gap-2", children: [
1631
+ /* @__PURE__ */ jsx13("span", { className: "text-sm font-medium truncate", children: model.name ?? model.id }),
1632
+ ctx && /* @__PURE__ */ jsx13("span", { className: "shrink-0 text-[10px] text-muted-foreground", children: ctx })
1633
+ ] }),
1634
+ /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2 text-[11px] text-muted-foreground", children: [
1635
+ /* @__PURE__ */ jsx13("span", { className: "truncate", children: id }),
1636
+ pricing && /* @__PURE__ */ jsxs11(Fragment7, { children: [
1637
+ /* @__PURE__ */ jsx13("span", { className: "shrink-0", children: "\xB7" }),
1638
+ /* @__PURE__ */ jsx13("span", { className: "shrink-0 font-mono", children: pricing })
1639
+ ] })
1640
+ ] })
1641
+ ] }) });
1642
+ }
1643
+
1277
1644
  // src/dashboard/profile-selector.tsx
1278
- import { Check as Check2, ChevronDown as ChevronDown2, Plus as Plus3, Settings } from "lucide-react";
1279
- import { Fragment as Fragment7, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
1645
+ import { Check as Check2, ChevronDown as ChevronDown3, Plus as Plus3, Settings } from "lucide-react";
1646
+ import { Fragment as Fragment8, jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1280
1647
  function ProfileSelector({
1281
1648
  profiles,
1282
1649
  selectedId,
@@ -1291,77 +1658,77 @@ function ProfileSelector({
1291
1658
  const selected = profiles.find((p) => p.id === selectedId);
1292
1659
  const builtinProfiles = profiles.filter((p) => p.is_builtin);
1293
1660
  const customProfiles = profiles.filter((p) => !p.is_builtin);
1294
- return /* @__PURE__ */ jsxs11("div", { className, children: [
1295
- label && /* @__PURE__ */ jsx12("label", { className: "mb-2 block font-medium text-sm", children: label }),
1296
- /* @__PURE__ */ jsxs11(DropdownMenu, { children: [
1297
- /* @__PURE__ */ jsx12(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs11(Button, { variant: "outline", className: "w-full justify-between", children: [
1298
- /* @__PURE__ */ jsx12("span", { className: "truncate", children: selected ? selected.name : placeholder }),
1299
- /* @__PURE__ */ jsx12(ChevronDown2, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })
1661
+ return /* @__PURE__ */ jsxs12("div", { className, children: [
1662
+ label && /* @__PURE__ */ jsx14("label", { className: "mb-2 block font-medium text-sm", children: label }),
1663
+ /* @__PURE__ */ jsxs12(DropdownMenu, { children: [
1664
+ /* @__PURE__ */ jsx14(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs12(Button, { variant: "outline", className: "w-full justify-between", children: [
1665
+ /* @__PURE__ */ jsx14("span", { className: "truncate", children: selected ? selected.name : placeholder }),
1666
+ /* @__PURE__ */ jsx14(ChevronDown3, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })
1300
1667
  ] }) }),
1301
- /* @__PURE__ */ jsxs11(DropdownMenuContent, { className: "w-[300px]", align: "start", children: [
1302
- /* @__PURE__ */ jsxs11(
1668
+ /* @__PURE__ */ jsxs12(DropdownMenuContent, { className: "w-[300px]", align: "start", children: [
1669
+ /* @__PURE__ */ jsxs12(
1303
1670
  DropdownMenuItem,
1304
1671
  {
1305
1672
  onClick: () => onSelect(null),
1306
1673
  className: "flex items-center justify-between",
1307
1674
  children: [
1308
- /* @__PURE__ */ jsx12("span", { children: placeholder }),
1309
- !selectedId && /* @__PURE__ */ jsx12(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1675
+ /* @__PURE__ */ jsx14("span", { children: placeholder }),
1676
+ !selectedId && /* @__PURE__ */ jsx14(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1310
1677
  ]
1311
1678
  }
1312
1679
  ),
1313
- builtinProfiles.length > 0 && /* @__PURE__ */ jsxs11(Fragment7, { children: [
1314
- /* @__PURE__ */ jsx12(DropdownMenuSeparator, {}),
1315
- /* @__PURE__ */ jsx12(DropdownMenuLabel, { children: "Built-in Profiles" }),
1316
- builtinProfiles.map((profile) => /* @__PURE__ */ jsxs11(
1680
+ builtinProfiles.length > 0 && /* @__PURE__ */ jsxs12(Fragment8, { children: [
1681
+ /* @__PURE__ */ jsx14(DropdownMenuSeparator, {}),
1682
+ /* @__PURE__ */ jsx14(DropdownMenuLabel, { children: "Built-in Profiles" }),
1683
+ builtinProfiles.map((profile) => /* @__PURE__ */ jsxs12(
1317
1684
  DropdownMenuItem,
1318
1685
  {
1319
1686
  onClick: () => onSelect(profile),
1320
1687
  className: "flex flex-col items-start gap-1",
1321
1688
  children: [
1322
- /* @__PURE__ */ jsxs11("div", { className: "flex w-full items-center justify-between", children: [
1323
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2", children: [
1324
- /* @__PURE__ */ jsx12("span", { className: "font-medium", children: profile.name }),
1325
- profile.extends && /* @__PURE__ */ jsxs11(Badge, { variant: "secondary", className: "border-0 text-xs", children: [
1689
+ /* @__PURE__ */ jsxs12("div", { className: "flex w-full items-center justify-between", children: [
1690
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2", children: [
1691
+ /* @__PURE__ */ jsx14("span", { className: "font-medium", children: profile.name }),
1692
+ profile.extends && /* @__PURE__ */ jsxs12(Badge, { variant: "secondary", className: "border-0 text-xs", children: [
1326
1693
  "extends ",
1327
1694
  profile.extends
1328
1695
  ] })
1329
1696
  ] }),
1330
- selectedId === profile.id && /* @__PURE__ */ jsx12(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1697
+ selectedId === profile.id && /* @__PURE__ */ jsx14(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1331
1698
  ] }),
1332
- profile.description && /* @__PURE__ */ jsx12("span", { className: "line-clamp-1 text-muted-foreground text-xs", children: profile.description })
1699
+ profile.description && /* @__PURE__ */ jsx14("span", { className: "line-clamp-1 text-muted-foreground text-xs", children: profile.description })
1333
1700
  ]
1334
1701
  },
1335
1702
  profile.id
1336
1703
  ))
1337
1704
  ] }),
1338
- customProfiles.length > 0 && /* @__PURE__ */ jsxs11(Fragment7, { children: [
1339
- /* @__PURE__ */ jsx12(DropdownMenuSeparator, {}),
1340
- /* @__PURE__ */ jsx12(DropdownMenuLabel, { children: "Custom Profiles" }),
1341
- customProfiles.map((profile) => /* @__PURE__ */ jsxs11(
1705
+ customProfiles.length > 0 && /* @__PURE__ */ jsxs12(Fragment8, { children: [
1706
+ /* @__PURE__ */ jsx14(DropdownMenuSeparator, {}),
1707
+ /* @__PURE__ */ jsx14(DropdownMenuLabel, { children: "Custom Profiles" }),
1708
+ customProfiles.map((profile) => /* @__PURE__ */ jsxs12(
1342
1709
  DropdownMenuItem,
1343
1710
  {
1344
1711
  onClick: () => onSelect(profile),
1345
1712
  className: "flex flex-col items-start gap-1",
1346
1713
  children: [
1347
- /* @__PURE__ */ jsxs11("div", { className: "flex w-full items-center justify-between", children: [
1348
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2", children: [
1349
- /* @__PURE__ */ jsx12("span", { className: "font-medium", children: profile.name }),
1350
- profile.model && /* @__PURE__ */ jsx12(Badge, { variant: "secondary", className: "border-0 text-xs", children: profile.model.split("/").pop() })
1714
+ /* @__PURE__ */ jsxs12("div", { className: "flex w-full items-center justify-between", children: [
1715
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2", children: [
1716
+ /* @__PURE__ */ jsx14("span", { className: "font-medium", children: profile.name }),
1717
+ profile.model && /* @__PURE__ */ jsx14(Badge, { variant: "secondary", className: "border-0 text-xs", children: profile.model.split("/").pop() })
1351
1718
  ] }),
1352
- selectedId === profile.id && /* @__PURE__ */ jsx12(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1719
+ selectedId === profile.id && /* @__PURE__ */ jsx14(Check2, { className: "h-4 w-4 text-[var(--surface-success-text)]" })
1353
1720
  ] }),
1354
- profile.description && /* @__PURE__ */ jsx12("span", { className: "line-clamp-1 text-muted-foreground text-xs", children: profile.description }),
1355
- showMetrics && profile.metrics && profile.metrics.total_runs > 0 && /* @__PURE__ */ jsxs11("div", { className: "flex gap-3 text-muted-foreground text-xs", children: [
1356
- /* @__PURE__ */ jsxs11("span", { children: [
1721
+ profile.description && /* @__PURE__ */ jsx14("span", { className: "line-clamp-1 text-muted-foreground text-xs", children: profile.description }),
1722
+ showMetrics && profile.metrics && profile.metrics.total_runs > 0 && /* @__PURE__ */ jsxs12("div", { className: "flex gap-3 text-muted-foreground text-xs", children: [
1723
+ /* @__PURE__ */ jsxs12("span", { children: [
1357
1724
  profile.metrics.total_runs,
1358
1725
  " runs"
1359
1726
  ] }),
1360
- /* @__PURE__ */ jsxs11("span", { children: [
1727
+ /* @__PURE__ */ jsxs12("span", { children: [
1361
1728
  profile.metrics.success_rate.toFixed(0),
1362
1729
  "% success"
1363
1730
  ] }),
1364
- /* @__PURE__ */ jsxs11("span", { children: [
1731
+ /* @__PURE__ */ jsxs12("span", { children: [
1365
1732
  "~",
1366
1733
  (profile.metrics.avg_duration_ms / 1e3).toFixed(1),
1367
1734
  "s avg"
@@ -1372,26 +1739,26 @@ function ProfileSelector({
1372
1739
  profile.id
1373
1740
  ))
1374
1741
  ] }),
1375
- (onCreateClick || onManageClick) && /* @__PURE__ */ jsxs11(Fragment7, { children: [
1376
- /* @__PURE__ */ jsx12(DropdownMenuSeparator, {}),
1377
- onCreateClick && /* @__PURE__ */ jsxs11(
1742
+ (onCreateClick || onManageClick) && /* @__PURE__ */ jsxs12(Fragment8, { children: [
1743
+ /* @__PURE__ */ jsx14(DropdownMenuSeparator, {}),
1744
+ onCreateClick && /* @__PURE__ */ jsxs12(
1378
1745
  DropdownMenuItem,
1379
1746
  {
1380
1747
  onClick: onCreateClick,
1381
1748
  className: "text-[var(--surface-info-text)]",
1382
1749
  children: [
1383
- /* @__PURE__ */ jsx12(Plus3, { className: "mr-2 h-4 w-4" }),
1750
+ /* @__PURE__ */ jsx14(Plus3, { className: "mr-2 h-4 w-4" }),
1384
1751
  "Create New Profile"
1385
1752
  ]
1386
1753
  }
1387
1754
  ),
1388
- onManageClick && /* @__PURE__ */ jsxs11(
1755
+ onManageClick && /* @__PURE__ */ jsxs12(
1389
1756
  DropdownMenuItem,
1390
1757
  {
1391
1758
  onClick: onManageClick,
1392
1759
  className: "text-muted-foreground",
1393
1760
  children: [
1394
- /* @__PURE__ */ jsx12(Settings, { className: "mr-2 h-4 w-4" }),
1761
+ /* @__PURE__ */ jsx14(Settings, { className: "mr-2 h-4 w-4" }),
1395
1762
  "Manage Profiles"
1396
1763
  ]
1397
1764
  }
@@ -1417,26 +1784,26 @@ function ProfileComparison({
1417
1784
  const fastestProfile = profilesWithMetrics.reduce(
1418
1785
  (best, p) => (p.metrics?.avg_duration_ms ?? Number.POSITIVE_INFINITY) < (best.metrics?.avg_duration_ms ?? Number.POSITIVE_INFINITY) ? p : best
1419
1786
  );
1420
- return /* @__PURE__ */ jsxs11("div", { className: `rounded-lg border border-border p-4 ${className ?? ""}`, children: [
1421
- /* @__PURE__ */ jsx12("h4", { className: "mb-3 font-medium text-sm", children: "Profile Performance" }),
1422
- /* @__PURE__ */ jsx12("div", { className: "space-y-3", children: profilesWithMetrics.map((profile) => {
1787
+ return /* @__PURE__ */ jsxs12("div", { className: `rounded-lg border border-border p-4 ${className ?? ""}`, children: [
1788
+ /* @__PURE__ */ jsx14("h4", { className: "mb-3 font-medium text-sm", children: "Profile Performance" }),
1789
+ /* @__PURE__ */ jsx14("div", { className: "space-y-3", children: profilesWithMetrics.map((profile) => {
1423
1790
  const isBestSuccess = profile.id === bestSuccess.id;
1424
1791
  const isFastest = profile.id === fastestProfile.id;
1425
- return /* @__PURE__ */ jsxs11(
1792
+ return /* @__PURE__ */ jsxs12(
1426
1793
  "div",
1427
1794
  {
1428
1795
  className: "flex items-center justify-between gap-4",
1429
1796
  children: [
1430
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2", children: [
1431
- /* @__PURE__ */ jsx12("span", { className: "font-medium", children: profile.name }),
1432
- isBestSuccess && /* @__PURE__ */ jsx12(Badge, { className: "border border-[var(--surface-success-border)] bg-[var(--surface-success-bg)] text-[var(--surface-success-text)] text-xs", children: "Best Success" }),
1433
- isFastest && !isBestSuccess && /* @__PURE__ */ jsx12(Badge, { className: "border border-[var(--surface-info-border)] bg-[var(--surface-info-bg)] text-[var(--surface-info-text)] text-xs", children: "Fastest" })
1797
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2", children: [
1798
+ /* @__PURE__ */ jsx14("span", { className: "font-medium", children: profile.name }),
1799
+ isBestSuccess && /* @__PURE__ */ jsx14(Badge, { className: "border border-[var(--surface-success-border)] bg-[var(--surface-success-bg)] text-[var(--surface-success-text)] text-xs", children: "Best Success" }),
1800
+ isFastest && !isBestSuccess && /* @__PURE__ */ jsx14(Badge, { className: "border border-[var(--surface-info-border)] bg-[var(--surface-info-bg)] text-[var(--surface-info-text)] text-xs", children: "Fastest" })
1434
1801
  ] }),
1435
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-4 text-sm", children: [
1436
- /* @__PURE__ */ jsxs11("span", { children: [
1437
- /* @__PURE__ */ jsx12("span", { className: "text-muted-foreground", children: "Success:" }),
1802
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-4 text-sm", children: [
1803
+ /* @__PURE__ */ jsxs12("span", { children: [
1804
+ /* @__PURE__ */ jsx14("span", { className: "text-muted-foreground", children: "Success:" }),
1438
1805
  " ",
1439
- /* @__PURE__ */ jsxs11(
1806
+ /* @__PURE__ */ jsxs12(
1440
1807
  "span",
1441
1808
  {
1442
1809
  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)]",
@@ -1447,13 +1814,13 @@ function ProfileComparison({
1447
1814
  }
1448
1815
  )
1449
1816
  ] }),
1450
- /* @__PURE__ */ jsxs11("span", { children: [
1451
- /* @__PURE__ */ jsx12("span", { className: "text-muted-foreground", children: "Avg:" }),
1817
+ /* @__PURE__ */ jsxs12("span", { children: [
1818
+ /* @__PURE__ */ jsx14("span", { className: "text-muted-foreground", children: "Avg:" }),
1452
1819
  " ",
1453
1820
  ((profile.metrics?.avg_duration_ms ?? 0) / 1e3).toFixed(1),
1454
1821
  "s"
1455
1822
  ] }),
1456
- /* @__PURE__ */ jsxs11("span", { className: "text-muted-foreground", children: [
1823
+ /* @__PURE__ */ jsxs12("span", { className: "text-muted-foreground", children: [
1457
1824
  profile.metrics?.total_runs,
1458
1825
  " runs"
1459
1826
  ] })
@@ -1472,12 +1839,12 @@ import {
1472
1839
  CheckCircle2,
1473
1840
  Clock as Clock2,
1474
1841
  ExternalLink,
1475
- Loader2,
1842
+ Loader2 as Loader22,
1476
1843
  Timer,
1477
1844
  X,
1478
1845
  XCircle
1479
1846
  } from "lucide-react";
1480
- import { Fragment as Fragment8, jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
1847
+ import { Fragment as Fragment9, jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1481
1848
  var statusConfig = {
1482
1849
  pending: {
1483
1850
  icon: Clock2,
@@ -1488,7 +1855,7 @@ var statusConfig = {
1488
1855
  animate: false
1489
1856
  },
1490
1857
  running: {
1491
- icon: Loader2,
1858
+ icon: Loader22,
1492
1859
  color: "text-primary",
1493
1860
  bg: "bg-[var(--accent-surface-soft)]",
1494
1861
  border: "border-border",
@@ -1561,19 +1928,19 @@ function VariantList({
1561
1928
  isActioning,
1562
1929
  className
1563
1930
  }) {
1564
- return /* @__PURE__ */ jsx13("div", { className: `space-y-2 ${className || ""}`, children: variants.map((variant) => {
1931
+ return /* @__PURE__ */ jsx15("div", { className: `space-y-2 ${className || ""}`, children: variants.map((variant) => {
1565
1932
  const status = statusConfig[variant.status];
1566
1933
  const StatusIcon = status.icon;
1567
1934
  const isSelected = variant.id === selectedId;
1568
- return /* @__PURE__ */ jsxs12(
1935
+ return /* @__PURE__ */ jsxs13(
1569
1936
  "div",
1570
1937
  {
1571
1938
  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"}`,
1572
1939
  onClick: () => onSelect?.(variant.id),
1573
1940
  children: [
1574
- /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2", children: [
1575
- /* @__PURE__ */ jsxs12(Badge, { className: `shrink-0 ${status.bg} ${status.border} ${status.color}`, children: [
1576
- /* @__PURE__ */ jsx13(
1941
+ /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-2", children: [
1942
+ /* @__PURE__ */ jsxs13(Badge, { className: `shrink-0 ${status.bg} ${status.border} ${status.color}`, children: [
1943
+ /* @__PURE__ */ jsx15(
1577
1944
  StatusIcon,
1578
1945
  {
1579
1946
  className: `mr-1 h-3 w-3 ${status.animate ? "animate-spin" : ""}`
@@ -1581,27 +1948,27 @@ function VariantList({
1581
1948
  ),
1582
1949
  status.label
1583
1950
  ] }),
1584
- /* @__PURE__ */ jsx13("span", { className: "truncate text-sm font-medium text-foreground", children: variant.label }),
1585
- variant.sublabel && /* @__PURE__ */ jsxs12("span", { className: "shrink-0 text-xs text-muted-foreground", children: [
1951
+ /* @__PURE__ */ jsx15("span", { className: "truncate text-sm font-medium text-foreground", children: variant.label }),
1952
+ variant.sublabel && /* @__PURE__ */ jsxs13("span", { className: "shrink-0 text-xs text-muted-foreground", children: [
1586
1953
  "(",
1587
1954
  variant.sublabel,
1588
1955
  ")"
1589
1956
  ] }),
1590
- variant.durationMs && /* @__PURE__ */ jsxs12("span", { className: "flex shrink-0 items-center gap-1 text-xs text-muted-foreground", children: [
1591
- /* @__PURE__ */ jsx13(Timer, { className: "h-3 w-3" }),
1957
+ variant.durationMs && /* @__PURE__ */ jsxs13("span", { className: "flex shrink-0 items-center gap-1 text-xs text-muted-foreground", children: [
1958
+ /* @__PURE__ */ jsx15(Timer, { className: "h-3 w-3" }),
1592
1959
  (variant.durationMs / 1e3).toFixed(1),
1593
1960
  "s"
1594
1961
  ] }),
1595
- /* @__PURE__ */ jsxs12("div", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [
1596
- variant.outcome && /* @__PURE__ */ jsx13(
1962
+ /* @__PURE__ */ jsxs13("div", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [
1963
+ variant.outcome && /* @__PURE__ */ jsx15(
1597
1964
  Badge,
1598
1965
  {
1599
1966
  className: `${outcomeConfig[variant.outcome].bg} ${outcomeConfig[variant.outcome].border} ${outcomeConfig[variant.outcome].color}`,
1600
1967
  children: outcomeConfig[variant.outcome].label
1601
1968
  }
1602
1969
  ),
1603
- variant.status === "completed" && variant.outcome === "pending_review" && onAccept && onReject && /* @__PURE__ */ jsxs12(Fragment8, { children: [
1604
- /* @__PURE__ */ jsxs12(
1970
+ variant.status === "completed" && variant.outcome === "pending_review" && onAccept && onReject && /* @__PURE__ */ jsxs13(Fragment9, { children: [
1971
+ /* @__PURE__ */ jsxs13(
1605
1972
  Button,
1606
1973
  {
1607
1974
  variant: "outline",
@@ -1613,12 +1980,12 @@ function VariantList({
1613
1980
  },
1614
1981
  disabled: isActioning === variant.id,
1615
1982
  children: [
1616
- /* @__PURE__ */ jsx13(Check3, { className: "mr-1 h-3 w-3" }),
1983
+ /* @__PURE__ */ jsx15(Check3, { className: "mr-1 h-3 w-3" }),
1617
1984
  "Accept"
1618
1985
  ]
1619
1986
  }
1620
1987
  ),
1621
- /* @__PURE__ */ jsxs12(
1988
+ /* @__PURE__ */ jsxs13(
1622
1989
  Button,
1623
1990
  {
1624
1991
  variant: "outline",
@@ -1630,13 +1997,13 @@ function VariantList({
1630
1997
  },
1631
1998
  disabled: isActioning === variant.id,
1632
1999
  children: [
1633
- /* @__PURE__ */ jsx13(X, { className: "mr-1 h-3 w-3" }),
2000
+ /* @__PURE__ */ jsx15(X, { className: "mr-1 h-3 w-3" }),
1634
2001
  "Reject"
1635
2002
  ]
1636
2003
  }
1637
2004
  )
1638
2005
  ] }),
1639
- variant.detailsUrl && /* @__PURE__ */ jsx13(
2006
+ variant.detailsUrl && /* @__PURE__ */ jsx15(
1640
2007
  Button,
1641
2008
  {
1642
2009
  variant: "ghost",
@@ -1646,13 +2013,13 @@ function VariantList({
1646
2013
  e.stopPropagation();
1647
2014
  window.open(variant.detailsUrl, "_blank");
1648
2015
  },
1649
- children: /* @__PURE__ */ jsx13(ExternalLink, { className: "h-3.5 w-3.5" })
2016
+ children: /* @__PURE__ */ jsx15(ExternalLink, { className: "h-3.5 w-3.5" })
1650
2017
  }
1651
2018
  )
1652
2019
  ] })
1653
2020
  ] }),
1654
- variant.error && /* @__PURE__ */ jsx13("p", { className: "mt-1.5 text-xs text-[var(--surface-danger-text)]", children: variant.error }),
1655
- variant.summary && /* @__PURE__ */ jsx13("p", { className: "mt-1.5 line-clamp-2 text-xs text-muted-foreground", children: variant.summary })
2021
+ variant.error && /* @__PURE__ */ jsx15("p", { className: "mt-1.5 text-xs text-[var(--surface-danger-text)]", children: variant.error }),
2022
+ variant.summary && /* @__PURE__ */ jsx15("p", { className: "mt-1.5 line-clamp-2 text-xs text-muted-foreground", children: variant.summary })
1656
2023
  ]
1657
2024
  },
1658
2025
  variant.id
@@ -1691,6 +2058,12 @@ export {
1691
2058
  NewSandboxCard,
1692
2059
  SandboxTable,
1693
2060
  BackendSelector,
2061
+ HARNESS_OPTIONS,
2062
+ HarnessPicker,
2063
+ canonicalModelId,
2064
+ formatPricing,
2065
+ formatContext,
2066
+ ModelPicker,
1694
2067
  ProfileSelector,
1695
2068
  ProfileComparison,
1696
2069
  VariantList