@tangle-network/sandbox-ui 0.23.1 → 0.23.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- export { B as Backend, a as BackendSelector, b as BackendSelectorProps, H as HARNESS_OPTIONS, c as HarnessPicker, d as HarnessPickerProps, e as HarnessType } from './harness-picker-C1W3rTeb.js';
3
+ import { e as HarnessType } from './harness-picker-ppDe7ap-.js';
4
+ export { B as Backend, a as BackendSelector, b as BackendSelectorProps, H as HARNESS_OPTIONS, c as HarnessPicker, d as HarnessPickerProps } from './harness-picker-ppDe7ap-.js';
4
5
  export { M as ModelInfo, a as ModelPicker, b as ModelPickerProps, c as ModelPickerVariant, d as canonicalModelId, f as formatContext, e as formatPricing } from './model-picker-DUfMTQo5.js';
5
6
  export { B as BillingBalance, a as BillingDashboard, b as BillingDashboardProps, c as BillingSubscription, d as BillingUsage, P as PricingPage, e as PricingPageProps, f as PricingTier, T as TemplateCard, g as TemplateCardData, h as TemplateCardProps, U as UsageChart, i as UsageChartProps, j as UsageDataPoint, k as formatPrice } from './template-card-UhV3pmRC.js';
6
7
 
@@ -434,6 +435,34 @@ interface PlanCardsProps {
434
435
  }
435
436
  declare function PlanCards({ plans, className }: PlanCardsProps): react_jsx_runtime.JSX.Element;
436
437
 
438
+ /**
439
+ * Per-harness brand glyph. `logoUrl` is a bundled lobehub data-url rendered
440
+ * as a CSS mask filled with the foreground token (single-color brand mark,
441
+ * theme-safe). `icon` is an honest lucide fallback for harnesses that have
442
+ * no published brand mark — never an invented logo.
443
+ */
444
+ interface HarnessBrand {
445
+ label: string;
446
+ logoUrl?: string;
447
+ icon?: React.ComponentType<{
448
+ className?: string;
449
+ }>;
450
+ }
451
+ declare const HARNESS_BRAND: Record<HarnessType, HarnessBrand>;
452
+ interface HarnessLogoProps {
453
+ type: HarnessType;
454
+ /** Chip edge length in px. Default 16 (matches the model pill glyph). */
455
+ size?: number;
456
+ className?: string;
457
+ }
458
+ /**
459
+ * Brand chip for a harness, matching {@link BrandLogo}'s render contract in
460
+ * model-picker: a rounded `bg-background ring-1 ring-border` chip wrapping
461
+ * either a foreground-filled CSS-mask of the brand SVG or a lucide fallback
462
+ * glyph. Keeps harness pills visually consistent with model pills.
463
+ */
464
+ declare function HarnessLogo({ type, size, className }: HarnessLogoProps): react_jsx_runtime.JSX.Element;
465
+
437
466
  type ProductVariant = "sandbox";
438
467
  interface NavItem {
439
468
  id: string;
@@ -535,6 +564,8 @@ interface SidebarLayoutProps {
535
564
  settingsHref?: string;
536
565
  /** Extra items rendered before settings/logout in the profile menu. */
537
566
  profileMenuItems?: React.ReactNode;
567
+ /** Render a light/dark theme switch in the profile menu (uses the shared `useTheme`). */
568
+ showThemeToggle?: boolean;
538
569
  /** Extra content in the rail footer, above the profile avatar. */
539
570
  railFooter?: React.ReactNode;
540
571
  LinkComponent?: React.ComponentType<any>;
@@ -813,4 +844,4 @@ interface InfoPanelProps {
813
844
  }
814
845
  declare function InfoPanel({ label, title, description, className }: InfoPanelProps): react_jsx_runtime.JSX.Element;
815
846
 
816
- export { ActivityFeed, type ActivityFeedProps, type ActivityItem, BackendConfig, type BackendConfigProps, type BackendStatusData, ClusterStatusBar, type ClusterStatusBarProps, type ClusterStatusItem, CreditBalance, type CreditBalanceProps, DashboardLayout, type DashboardLayoutProps, type Profile as DashboardProfile, type SnapshotInfo as DashboardSnapshotInfo, type DashboardUser, type ExposedPort, type GitCommitData, GitPanel, type GitPanelProps, type GitStatusData, INSUFFICIENT_BALANCE_CODE, InfoPanel, type InfoPanelProps, type InsufficientBalance, type Invoice, InvoiceTable, type InvoiceTableProps, type McpServer, MetricAreaChart, type MetricAreaChartProps, type MetricChartPoint, type MetricChartTone, type NavItem, NetworkConfig, type NetworkConfigData, type NetworkConfigProps, NewSandboxCard, type NewSandboxCardProps, OutOfCreditsModal, type OutOfCreditsModalProps, type PlanCardData, PlanCards, type PlanCardsProps, type PlanFeature, PortsList, type PortsListProps, type ProcessInfo, ProcessList, type ProcessListProps, type ProductVariant, ProfileAvatar, type ProfileAvatarProps, ProfileComparison, type ProfileComparisonProps, ProfileSelector, type ProfileSelectorProps, PromoBanner, type PromoBannerProps, RailButton, type RailButtonProps, RailModeButton, type RailModeButtonProps, RailSeparator, type RailSeparatorProps, ResourceMeter, type ResourceMeterProps, ResourceSnapshot, type ResourceSnapshotItem, type ResourceSnapshotProps, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, type SandboxCardData, type SandboxCardProps, type SandboxStatus, SandboxTable, type SandboxTableProps, Sidebar, SidebarContent, type SidebarContentProps, SidebarLayout, type SidebarLayoutNavItem, type SidebarLayoutProps, SidebarPanel, SidebarPanelContent, type SidebarPanelContentProps, SidebarPanelHeader, type SidebarPanelHeaderProps, type SidebarPanelProps, type SidebarProps, SidebarProvider, type SidebarProviderProps, SidebarRail, SidebarRailFooter, type SidebarRailFooterProps, SidebarRailHeader, type SidebarRailHeaderProps, SidebarRailNav, type SidebarRailNavProps, type SidebarRailProps, type SidebarUser, SnapshotList, type SnapshotListProps, SystemLogsViewer, type SystemLogsViewerProps, type TeamRole, UsageSummary, type UsageSummaryData, type UsageSummaryProps, type Variant, VariantList, type VariantListProps, type VariantOutcome, type VariantStatus, canAdminSandbox, parseInsufficientBalance, useSidebar };
847
+ export { ActivityFeed, type ActivityFeedProps, type ActivityItem, BackendConfig, type BackendConfigProps, type BackendStatusData, ClusterStatusBar, type ClusterStatusBarProps, type ClusterStatusItem, CreditBalance, type CreditBalanceProps, DashboardLayout, type DashboardLayoutProps, type Profile as DashboardProfile, type SnapshotInfo as DashboardSnapshotInfo, type DashboardUser, type ExposedPort, type GitCommitData, GitPanel, type GitPanelProps, type GitStatusData, HARNESS_BRAND, type HarnessBrand, HarnessLogo, type HarnessLogoProps, HarnessType, INSUFFICIENT_BALANCE_CODE, InfoPanel, type InfoPanelProps, type InsufficientBalance, type Invoice, InvoiceTable, type InvoiceTableProps, type McpServer, MetricAreaChart, type MetricAreaChartProps, type MetricChartPoint, type MetricChartTone, type NavItem, NetworkConfig, type NetworkConfigData, type NetworkConfigProps, NewSandboxCard, type NewSandboxCardProps, OutOfCreditsModal, type OutOfCreditsModalProps, type PlanCardData, PlanCards, type PlanCardsProps, type PlanFeature, PortsList, type PortsListProps, type ProcessInfo, ProcessList, type ProcessListProps, type ProductVariant, ProfileAvatar, type ProfileAvatarProps, ProfileComparison, type ProfileComparisonProps, ProfileSelector, type ProfileSelectorProps, PromoBanner, type PromoBannerProps, RailButton, type RailButtonProps, RailModeButton, type RailModeButtonProps, RailSeparator, type RailSeparatorProps, ResourceMeter, type ResourceMeterProps, ResourceSnapshot, type ResourceSnapshotItem, type ResourceSnapshotProps, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, type SandboxCardData, type SandboxCardProps, type SandboxStatus, SandboxTable, type SandboxTableProps, Sidebar, SidebarContent, type SidebarContentProps, SidebarLayout, type SidebarLayoutNavItem, type SidebarLayoutProps, SidebarPanel, SidebarPanelContent, type SidebarPanelContentProps, SidebarPanelHeader, type SidebarPanelHeaderProps, type SidebarPanelProps, type SidebarProps, SidebarProvider, type SidebarProviderProps, SidebarRail, SidebarRailFooter, type SidebarRailFooterProps, SidebarRailHeader, type SidebarRailHeaderProps, SidebarRailNav, type SidebarRailNavProps, type SidebarRailProps, type SidebarUser, SnapshotList, type SnapshotListProps, SystemLogsViewer, type SystemLogsViewerProps, type TeamRole, UsageSummary, type UsageSummaryData, type UsageSummaryProps, type Variant, VariantList, type VariantListProps, type VariantOutcome, type VariantStatus, canAdminSandbox, parseInsufficientBalance, useSidebar };
package/dist/dashboard.js CHANGED
@@ -47,7 +47,7 @@ import {
47
47
  canAdminSandbox,
48
48
  parseInsufficientBalance,
49
49
  useSidebar
50
- } from "./chunk-CB3KBKYN.js";
50
+ } from "./chunk-76TCOY2R.js";
51
51
  import {
52
52
  BillingDashboard,
53
53
  InfoPanel,
@@ -59,15 +59,17 @@ import {
59
59
  import "./chunk-7ZA5SEK3.js";
60
60
  import {
61
61
  BackendSelector,
62
+ HARNESS_BRAND,
62
63
  HARNESS_OPTIONS,
64
+ HarnessLogo,
63
65
  HarnessPicker
64
- } from "./chunk-ESRYVGHF.js";
66
+ } from "./chunk-HXIYUQN2.js";
65
67
  import {
66
68
  ModelPicker,
67
69
  canonicalModelId,
68
70
  formatContext,
69
71
  formatPricing
70
- } from "./chunk-4KAPMTPU.js";
72
+ } from "./chunk-JDMX4HHN.js";
71
73
  import "./chunk-EI44GEQ5.js";
72
74
  export {
73
75
  ActivityFeed,
@@ -78,7 +80,9 @@ export {
78
80
  CreditBalance,
79
81
  DashboardLayout,
80
82
  GitPanel,
83
+ HARNESS_BRAND,
81
84
  HARNESS_OPTIONS,
85
+ HarnessLogo,
82
86
  HarnessPicker,
83
87
  INSUFFICIENT_BALANCE_CODE,
84
88
  InfoPanel,
package/dist/globals.css CHANGED
@@ -1508,6 +1508,9 @@
1508
1508
  .rounded-2xl {
1509
1509
  border-radius: var(--radius-2xl);
1510
1510
  }
1511
+ .rounded-\[1px\] {
1512
+ border-radius: 1px;
1513
+ }
1511
1514
  .rounded-\[2px\] {
1512
1515
  border-radius: 2px;
1513
1516
  }
@@ -1,9 +1,12 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
2
3
 
3
4
  interface Backend {
4
5
  type: string;
5
6
  label: string;
6
7
  description?: string;
8
+ /** Optional leading brand glyph (e.g. a HarnessLogo) shown in the trigger and rows. */
9
+ icon?: ReactNode;
7
10
  }
8
11
  interface BackendSelectorProps {
9
12
  backends: Backend[];
@@ -18,9 +21,11 @@ declare function BackendSelector({ backends, selected, onChange, label, placehol
18
21
  /**
19
22
  * Sandbox agent harness types — mirrors `BackendType` from
20
23
  * `@tangle-network/sandbox` SDK. Kept in lockstep with that enum:
21
- * if the SDK adds a backend, add it here too.
24
+ * if the SDK adds a backend, add it here too. The SDK's `pi`, `forge`,
25
+ * `acp`, and `cursor` backends are deliberately deferred (not yet
26
+ * surfaced in the picker) until their copy and compat policies land.
22
27
  */
23
- type HarnessType = "opencode" | "claude-code" | "codex" | "amp" | "factory-droids" | "cli-base";
28
+ type HarnessType = "opencode" | "claude-code" | "codex" | "amp" | "factory-droids" | "cli-base" | "kimi-code" | "openclaw" | "nanoclaw" | "hermes";
24
29
  interface HarnessOption extends Backend {
25
30
  type: HarnessType;
26
31
  }
package/dist/index.d.ts CHANGED
@@ -8,8 +8,8 @@ export { AgentSessionControls, AgentSessionControlsProps, AgentSessionHarnessCon
8
8
  export { ExpandedToolDetail, ExpandedToolDetailProps, InlineThinkingItem, InlineThinkingItemProps, InlineToolItem, InlineToolItemProps, LiveDuration, RunGroup, RunGroupProps } from '@tangle-network/ui/run';
9
9
  export { CommandPreview, DiffPreview, GlobResultsPreview, GrepResultsPreview, QuestionPreview, WebSearchPreview, WriteFilePreview } from '@tangle-network/ui/tool-previews';
10
10
  export { FileArtifactPane, FileArtifactPaneProps, FileNode, FilePreview, FilePreviewProps, FileTabData, FileTabs, FileTabsProps, FileTree, FileTreeProps, FileTreeVisibilityOptions, RichFileTree, RichFileTreeGitEntry, RichFileTreeGitStatus, RichFileTreeProps, RichFileTreeThemeVars, filterFileTree } from '@tangle-network/ui/files';
11
- export { ActivityFeed, ActivityFeedProps, ActivityItem, BackendConfig, BackendConfigProps, BackendStatusData, ClusterStatusBar, ClusterStatusBarProps, ClusterStatusItem, CreditBalance, CreditBalanceProps, DashboardLayout, DashboardLayoutProps, DashboardProfile, DashboardSnapshotInfo, DashboardUser, ExposedPort, GitCommitData, GitPanel, GitPanelProps, GitStatusData, INSUFFICIENT_BALANCE_CODE, InfoPanel, InfoPanelProps, InsufficientBalance, Invoice, InvoiceTable, InvoiceTableProps, McpServer, MetricAreaChart, MetricAreaChartProps, MetricChartPoint, MetricChartTone, NavItem, NetworkConfig, NetworkConfigData, NetworkConfigProps, NewSandboxCard, NewSandboxCardProps, OutOfCreditsModal, OutOfCreditsModalProps, PlanCardData, PlanCards, PlanCardsProps, PlanFeature, PortsList, PortsListProps, ProcessInfo, ProcessList, ProcessListProps, ProductVariant, ProfileAvatar, ProfileAvatarProps, ProfileComparison, ProfileComparisonProps, ProfileSelector, ProfileSelectorProps, PromoBanner, PromoBannerProps, RailButton, RailButtonProps, RailModeButton, RailModeButtonProps, RailSeparator, RailSeparatorProps, ResourceMeter, ResourceMeterProps, ResourceSnapshot, ResourceSnapshotItem, ResourceSnapshotProps, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, SandboxCardData, SandboxCardProps, SandboxStatus, SandboxTable, SandboxTableProps, Sidebar, SidebarContent, SidebarContentProps, SidebarLayout, SidebarLayoutNavItem, SidebarLayoutProps, SidebarPanel, SidebarPanelContent, SidebarPanelContentProps, SidebarPanelHeader, SidebarPanelHeaderProps, SidebarPanelProps, SidebarProps, SidebarProvider, SidebarProviderProps, SidebarRail, SidebarRailFooter, SidebarRailFooterProps, SidebarRailHeader, SidebarRailHeaderProps, SidebarRailNav, SidebarRailNavProps, SidebarRailProps, SidebarUser, SnapshotList, SnapshotListProps, SystemLogsViewer, SystemLogsViewerProps, TeamRole, UsageSummary, UsageSummaryData, UsageSummaryProps, Variant, VariantList, VariantListProps, VariantOutcome, VariantStatus, canAdminSandbox, parseInsufficientBalance, useSidebar } from './dashboard.js';
12
- export { B as Backend, a as BackendSelector, b as BackendSelectorProps, H as HARNESS_OPTIONS, c as HarnessPicker, d as HarnessPickerProps, e as HarnessType } from './harness-picker-C1W3rTeb.js';
11
+ export { ActivityFeed, ActivityFeedProps, ActivityItem, BackendConfig, BackendConfigProps, BackendStatusData, ClusterStatusBar, ClusterStatusBarProps, ClusterStatusItem, CreditBalance, CreditBalanceProps, DashboardLayout, DashboardLayoutProps, DashboardProfile, DashboardSnapshotInfo, DashboardUser, ExposedPort, GitCommitData, GitPanel, GitPanelProps, GitStatusData, HARNESS_BRAND, HarnessBrand, HarnessLogo, HarnessLogoProps, INSUFFICIENT_BALANCE_CODE, InfoPanel, InfoPanelProps, InsufficientBalance, Invoice, InvoiceTable, InvoiceTableProps, McpServer, MetricAreaChart, MetricAreaChartProps, MetricChartPoint, MetricChartTone, NavItem, NetworkConfig, NetworkConfigData, NetworkConfigProps, NewSandboxCard, NewSandboxCardProps, OutOfCreditsModal, OutOfCreditsModalProps, PlanCardData, PlanCards, PlanCardsProps, PlanFeature, PortsList, PortsListProps, ProcessInfo, ProcessList, ProcessListProps, ProductVariant, ProfileAvatar, ProfileAvatarProps, ProfileComparison, ProfileComparisonProps, ProfileSelector, ProfileSelectorProps, PromoBanner, PromoBannerProps, RailButton, RailButtonProps, RailModeButton, RailModeButtonProps, RailSeparator, RailSeparatorProps, ResourceMeter, ResourceMeterProps, ResourceSnapshot, ResourceSnapshotItem, ResourceSnapshotProps, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, SandboxCardData, SandboxCardProps, SandboxStatus, SandboxTable, SandboxTableProps, Sidebar, SidebarContent, SidebarContentProps, SidebarLayout, SidebarLayoutNavItem, SidebarLayoutProps, SidebarPanel, SidebarPanelContent, SidebarPanelContentProps, SidebarPanelHeader, SidebarPanelHeaderProps, SidebarPanelProps, SidebarProps, SidebarProvider, SidebarProviderProps, SidebarRail, SidebarRailFooter, SidebarRailFooterProps, SidebarRailHeader, SidebarRailHeaderProps, SidebarRailNav, SidebarRailNavProps, SidebarRailProps, SidebarUser, SnapshotList, SnapshotListProps, SystemLogsViewer, SystemLogsViewerProps, TeamRole, UsageSummary, UsageSummaryData, UsageSummaryProps, Variant, VariantList, VariantListProps, VariantOutcome, VariantStatus, canAdminSandbox, parseInsufficientBalance, useSidebar } from './dashboard.js';
12
+ export { B as Backend, a as BackendSelector, b as BackendSelectorProps, H as HARNESS_OPTIONS, c as HarnessPicker, d as HarnessPickerProps, e as HarnessType } from './harness-picker-ppDe7ap-.js';
13
13
  export { M as ModelInfo, a as ModelPicker, b as ModelPickerProps, c as ModelPickerVariant, d as canonicalModelId, f as formatContext, e as formatPricing } from './model-picker-DUfMTQo5.js';
14
14
  export { B as BillingBalance, a as BillingDashboard, b as BillingDashboardProps, c as BillingSubscription, d as BillingUsage, P as PricingPage, e as PricingPageProps, f as PricingTier, T as TemplateCard, g as TemplateCardData, h as TemplateCardProps, U as UsageChart, i as UsageChartProps, j as UsageDataPoint, k as formatPrice } from './template-card-UhV3pmRC.js';
15
15
  export { AuthHeader, AuthHeaderProps, GitHubLoginButton, GitHubLoginButtonProps, LoginLayout, LoginLayoutProps, SessionUser, UserMenu, UserMenuProps } from '@tangle-network/ui/auth';
package/dist/index.js CHANGED
@@ -104,7 +104,7 @@ import {
104
104
  modelProvider,
105
105
  snapHarnessToModel,
106
106
  snapModelToHarness
107
- } from "./chunk-TAAYDQGM.js";
107
+ } from "./chunk-H5PBSY62.js";
108
108
  import {
109
109
  ExpandedToolDetail,
110
110
  InlineThinkingItem,
@@ -189,7 +189,7 @@ import {
189
189
  canAdminSandbox,
190
190
  parseInsufficientBalance,
191
191
  useSidebar
192
- } from "./chunk-CB3KBKYN.js";
192
+ } from "./chunk-76TCOY2R.js";
193
193
  import {
194
194
  BillingDashboard,
195
195
  InfoPanel,
@@ -287,15 +287,17 @@ import {
287
287
  } from "./chunk-7ZA5SEK3.js";
288
288
  import {
289
289
  BackendSelector,
290
+ HARNESS_BRAND,
290
291
  HARNESS_OPTIONS,
292
+ HarnessLogo,
291
293
  HarnessPicker
292
- } from "./chunk-ESRYVGHF.js";
294
+ } from "./chunk-HXIYUQN2.js";
293
295
  import {
294
296
  ModelPicker,
295
297
  canonicalModelId,
296
298
  formatContext,
297
299
  formatPricing
298
- } from "./chunk-4KAPMTPU.js";
300
+ } from "./chunk-JDMX4HHN.js";
299
301
  import "./chunk-EI44GEQ5.js";
300
302
 
301
303
  // src/index.ts
@@ -389,8 +391,10 @@ export {
389
391
  GitPanel,
390
392
  GlobResultsPreview,
391
393
  GrepResultsPreview,
394
+ HARNESS_BRAND,
392
395
  HARNESS_MODEL_POLICIES,
393
396
  HARNESS_OPTIONS,
397
+ HarnessLogo,
394
398
  HarnessPicker,
395
399
  INSUFFICIENT_BALANCE_CODE,
396
400
  InfoPanel,
package/dist/pages.js CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  Switch,
13
13
  Textarea
14
14
  } from "./chunk-7ZA5SEK3.js";
15
- import "./chunk-4KAPMTPU.js";
15
+ import "./chunk-JDMX4HHN.js";
16
16
  import {
17
17
  cn
18
18
  } from "./chunk-EI44GEQ5.js";
package/dist/styles.css CHANGED
@@ -1508,6 +1508,9 @@
1508
1508
  .rounded-2xl {
1509
1509
  border-radius: var(--radius-2xl);
1510
1510
  }
1511
+ .rounded-\[1px\] {
1512
+ border-radius: 1px;
1513
+ }
1511
1514
  .rounded-\[2px\] {
1512
1515
  border-radius: 2px;
1513
1516
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "0.23.1",
3
+ "version": "0.23.3",
4
4
  "description": "Unified UI component library for Tangle Sandbox — primitives, chat, dashboard, terminal, editor, and workspace components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,147 +0,0 @@
1
- import {
2
- cn
3
- } from "./chunk-EI44GEQ5.js";
4
-
5
- // src/dashboard/backend-selector.tsx
6
- import { ChevronDown } from "lucide-react";
7
- import * as Select from "@radix-ui/react-select";
8
- import { jsx, jsxs } from "react/jsx-runtime";
9
- function BackendSelector({
10
- backends,
11
- selected,
12
- onChange,
13
- label = "Model",
14
- placeholder = "Select a model",
15
- className
16
- }) {
17
- const current = backends.find((b) => b.type === selected);
18
- return /* @__PURE__ */ jsxs("div", { className: cn("space-y-1.5", className), children: [
19
- label && /* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-muted-foreground uppercase tracking-[0.06em]", children: label }),
20
- /* @__PURE__ */ jsxs(Select.Root, { value: selected, onValueChange: onChange, children: [
21
- /* @__PURE__ */ jsxs(
22
- Select.Trigger,
23
- {
24
- className: cn(
25
- "flex w-full items-center justify-between gap-2 rounded-[var(--radius-md)]",
26
- "border border-border bg-card",
27
- "px-3 py-2.5 text-sm text-left",
28
- "transition-colors duration-[var(--transition-fast)]",
29
- "hover:border-primary/20 hover:bg-accent/30",
30
- "focus:outline-none focus:border-primary/30",
31
- "data-[state=open]:border-primary/30 data-[state=open]:bg-accent/30"
32
- ),
33
- children: [
34
- /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: current ? /* @__PURE__ */ jsxs("div", { children: [
35
- /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: current.label }),
36
- current.description && /* @__PURE__ */ jsx("span", { className: "ml-2 text-xs text-muted-foreground", children: current.description })
37
- ] }) : /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: placeholder }) }),
38
- /* @__PURE__ */ jsx(Select.Icon, { asChild: true, children: /* @__PURE__ */ jsx(ChevronDown, { className: "h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-[var(--transition-fast)] data-[state=open]:rotate-180" }) })
39
- ]
40
- }
41
- ),
42
- /* @__PURE__ */ jsx(Select.Portal, { children: /* @__PURE__ */ jsx(
43
- Select.Content,
44
- {
45
- position: "popper",
46
- sideOffset: 4,
47
- className: cn(
48
- "z-50 w-[var(--radix-select-trigger-width)] overflow-hidden",
49
- "rounded-[var(--radius-md)] border border-border",
50
- "bg-card shadow-[var(--shadow-dropdown)]",
51
- "data-[state=open]:animate-in data-[state=closed]:animate-out",
52
- "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
53
- "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
54
- "data-[side=bottom]:slide-in-from-top-1"
55
- ),
56
- children: /* @__PURE__ */ jsx(Select.Viewport, { className: "p-1", children: backends.map((backend) => /* @__PURE__ */ jsxs(
57
- Select.Item,
58
- {
59
- value: backend.type,
60
- className: cn(
61
- "relative flex cursor-pointer select-none flex-col rounded-[var(--radius-sm)]",
62
- "px-3 py-2.5 text-sm outline-none",
63
- "transition-colors duration-[var(--transition-fast)]",
64
- "hover:bg-accent/50 focus:bg-accent/50",
65
- "data-[state=checked]:bg-[var(--accent-surface-soft)] data-[state=checked]:text-[var(--brand-primary)]"
66
- ),
67
- children: [
68
- /* @__PURE__ */ jsx(Select.ItemText, { children: /* @__PURE__ */ jsx("span", { className: "font-medium", children: backend.label }) }),
69
- backend.description && /* @__PURE__ */ jsx("span", { className: "mt-0.5 text-xs text-muted-foreground data-[state=checked]:text-[var(--accent-text)]", children: backend.description })
70
- ]
71
- },
72
- backend.type
73
- )) })
74
- }
75
- ) })
76
- ] })
77
- ] });
78
- }
79
-
80
- // src/dashboard/harness-picker.tsx
81
- import { jsx as jsx2 } from "react/jsx-runtime";
82
- var HARNESS_OPTIONS = [
83
- {
84
- type: "opencode",
85
- label: "OpenCode",
86
- description: "Default agent \u2014 broad model support, deterministic streaming"
87
- },
88
- {
89
- type: "claude-code",
90
- label: "Claude Code",
91
- description: "Native Claude skills and tools (requires ANTHROPIC_API_KEY)"
92
- },
93
- {
94
- type: "codex",
95
- label: "Codex",
96
- description: "OpenAI Codex CLI (requires OPENAI_API_KEY)"
97
- },
98
- {
99
- type: "amp",
100
- label: "AMP",
101
- description: "Sourcegraph AMP agent"
102
- },
103
- {
104
- type: "factory-droids",
105
- label: "Factory Droids",
106
- description: "Factory Droid agent"
107
- },
108
- {
109
- type: "cli-base",
110
- label: "CLI base (no agent)",
111
- description: "Shell tools only \u2014 for non-AI scheduled tasks"
112
- }
113
- ];
114
- function HarnessPicker({
115
- value,
116
- onChange,
117
- available,
118
- optionsOverride,
119
- label = "Agent harness",
120
- ...rest
121
- }) {
122
- const allowed = new Set(available ?? HARNESS_OPTIONS.map((h) => h.type));
123
- const backends = HARNESS_OPTIONS.filter((h) => allowed.has(h.type)).map((h) => {
124
- const override = optionsOverride?.[h.type];
125
- return {
126
- type: h.type,
127
- label: override?.label ?? h.label,
128
- description: override?.description ?? h.description
129
- };
130
- });
131
- return /* @__PURE__ */ jsx2(
132
- BackendSelector,
133
- {
134
- backends,
135
- selected: value,
136
- onChange: (next) => onChange(next),
137
- label,
138
- ...rest
139
- }
140
- );
141
- }
142
-
143
- export {
144
- BackendSelector,
145
- HARNESS_OPTIONS,
146
- HarnessPicker
147
- };