@tangle-network/sandbox-ui 0.16.2 → 0.16.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/globals.css +6 -0
- package/dist/pages.d.ts +16 -2
- package/dist/pages.js +129 -63
- package/dist/styles.css +6 -0
- package/package.json +1 -1
package/dist/globals.css
CHANGED
|
@@ -591,6 +591,9 @@
|
|
|
591
591
|
.h-\[500px\] {
|
|
592
592
|
height: 500px;
|
|
593
593
|
}
|
|
594
|
+
.h-auto {
|
|
595
|
+
height: auto;
|
|
596
|
+
}
|
|
594
597
|
.h-full {
|
|
595
598
|
height: 100%;
|
|
596
599
|
}
|
|
@@ -615,6 +618,9 @@
|
|
|
615
618
|
.min-h-0 {
|
|
616
619
|
min-height: calc(var(--spacing) * 0);
|
|
617
620
|
}
|
|
621
|
+
.min-h-24 {
|
|
622
|
+
min-height: calc(var(--spacing) * 24);
|
|
623
|
+
}
|
|
618
624
|
.min-h-\[2px\] {
|
|
619
625
|
min-height: 2px;
|
|
620
626
|
}
|
package/dist/pages.d.ts
CHANGED
|
@@ -59,6 +59,19 @@ interface PlanTierInfo {
|
|
|
59
59
|
ramMaxGB: number;
|
|
60
60
|
storageMaxGB: number;
|
|
61
61
|
}
|
|
62
|
+
interface SshKeyOption {
|
|
63
|
+
id: string;
|
|
64
|
+
name: string;
|
|
65
|
+
fingerprint: string;
|
|
66
|
+
keyType: string;
|
|
67
|
+
}
|
|
68
|
+
interface SshAccessConfig {
|
|
69
|
+
keys?: SshKeyOption[];
|
|
70
|
+
selectedKeyIds: string[];
|
|
71
|
+
inlinePublicKeys: string;
|
|
72
|
+
onSelectedKeyIdsChange: (keyIds: string[]) => void;
|
|
73
|
+
onInlinePublicKeysChange: (publicKeys: string) => void;
|
|
74
|
+
}
|
|
62
75
|
interface ProvisioningWizardProps {
|
|
63
76
|
environments?: EnvironmentOption[];
|
|
64
77
|
onLoadEnvironments?: () => Promise<EnvironmentEntry[]>;
|
|
@@ -107,6 +120,7 @@ interface ProvisioningWizardProps {
|
|
|
107
120
|
* persistence (e.g. localStorage, account settings API).
|
|
108
121
|
*/
|
|
109
122
|
onSetDefault?: (modelId: string) => void;
|
|
123
|
+
sshAccess?: SshAccessConfig;
|
|
110
124
|
/** Real pricing rates from the API for accurate cost calculation */
|
|
111
125
|
pricingRates?: PricingRates;
|
|
112
126
|
/**
|
|
@@ -141,7 +155,7 @@ interface ProvisioningConfig {
|
|
|
141
155
|
startupScriptIds?: string[];
|
|
142
156
|
}
|
|
143
157
|
declare function resolveEnvironment(env: EnvironmentEntry): EnvironmentOption;
|
|
144
|
-
declare function ProvisioningWizard({ environments: environmentsProp, onLoadEnvironments, onSubmit, onBack, className, variant, defaultEnvironment, defaultConfig, skipToReview, onLoadStartupScripts, resourceLimits, models, popular, defaultModel, onSetDefault, pricingRates, planTiers, }: ProvisioningWizardProps): react_jsx_runtime.JSX.Element;
|
|
158
|
+
declare function ProvisioningWizard({ environments: environmentsProp, onLoadEnvironments, onSubmit, onBack, className, variant, defaultEnvironment, defaultConfig, skipToReview, onLoadStartupScripts, resourceLimits, models, popular, defaultModel, onSetDefault, sshAccess, pricingRates, planTiers, }: ProvisioningWizardProps): react_jsx_runtime.JSX.Element;
|
|
145
159
|
|
|
146
160
|
type ProductVariant = "sandbox";
|
|
147
161
|
interface StandalonePricingPageProps {
|
|
@@ -307,4 +321,4 @@ type TemplateCategory = "blockchain" | "ai-ml" | "frontend" | "infrastructure" |
|
|
|
307
321
|
type TemplatePreset = Omit<ProvisioningConfig, "name" | "gitUrl" | "envVars" | "driver" | "startupScriptIds" | "modelTier">;
|
|
308
322
|
declare function getPresetForTemplate(id: string): TemplatePreset;
|
|
309
323
|
|
|
310
|
-
export { BillingPage, type BillingPageData, type BillingPageProps, type EnvironmentEntry, type EnvironmentOption, ModelInfo, type PlanTierInfo, type PricingRates, PricingTier, type ProductVariant$1 as ProductVariant, type Profile, type ProfileFormData, type ProfileMetrics, ProfilesPage, type ProfilesPageProps, type ProvisioningConfig, ProvisioningWizard, type ProvisioningWizardProps, type ResourceLimits, type ScriptType, type Secret, type SecretsApiClient, SecretsPage, type SecretsPageProps, StandalonePricingPage, type StandalonePricingPageProps, type StartupScript, type StartupScriptEntry, type StartupScriptFormData, type StartupScriptsApiClient, StartupScriptsPage, type StartupScriptsPageProps, type TemplateCategory, type TemplatePreset, TemplatesPage, type TemplatesPageProps, getPresetForTemplate, resolveEnvironment };
|
|
324
|
+
export { BillingPage, type BillingPageData, type BillingPageProps, type EnvironmentEntry, type EnvironmentOption, ModelInfo, type PlanTierInfo, type PricingRates, PricingTier, type ProductVariant$1 as ProductVariant, type Profile, type ProfileFormData, type ProfileMetrics, ProfilesPage, type ProfilesPageProps, type ProvisioningConfig, ProvisioningWizard, type ProvisioningWizardProps, type ResourceLimits, type ScriptType, type Secret, type SecretsApiClient, SecretsPage, type SecretsPageProps, type SshAccessConfig, type SshKeyOption, StandalonePricingPage, type StandalonePricingPageProps, type StartupScript, type StartupScriptEntry, type StartupScriptFormData, type StartupScriptsApiClient, StartupScriptsPage, type StartupScriptsPageProps, type TemplateCategory, type TemplatePreset, TemplatesPage, type TemplatesPageProps, getPresetForTemplate, resolveEnvironment };
|
package/dist/pages.js
CHANGED
|
@@ -7,6 +7,11 @@ import {
|
|
|
7
7
|
UsageChart,
|
|
8
8
|
canonicalModelId
|
|
9
9
|
} from "./chunk-27X3DWMO.js";
|
|
10
|
+
import {
|
|
11
|
+
Badge,
|
|
12
|
+
Button,
|
|
13
|
+
Textarea
|
|
14
|
+
} from "./chunk-7ZA5SEK3.js";
|
|
10
15
|
import {
|
|
11
16
|
cn
|
|
12
17
|
} from "./chunk-EI44GEQ5.js";
|
|
@@ -439,6 +444,59 @@ function computeHourlyCost(cpu, ram, storage, rates) {
|
|
|
439
444
|
total: Math.max(floor, lineSum)
|
|
440
445
|
};
|
|
441
446
|
}
|
|
447
|
+
function SshAccessStep({ config }) {
|
|
448
|
+
const keys = config.keys ?? [];
|
|
449
|
+
const inlineKeyCount = config.inlinePublicKeys.split(/\r?\n/).map((key) => key.trim()).filter(Boolean).length;
|
|
450
|
+
const totalKeyCount = config.selectedKeyIds.length + inlineKeyCount;
|
|
451
|
+
return /* @__PURE__ */ jsxs2("div", { className: "space-y-4", children: [
|
|
452
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-start justify-between gap-4", children: [
|
|
453
|
+
/* @__PURE__ */ jsxs2("div", { children: [
|
|
454
|
+
/* @__PURE__ */ jsx2("p", { className: "font-medium text-foreground text-sm", children: "SSH Access" }),
|
|
455
|
+
/* @__PURE__ */ jsx2("p", { className: "mt-1 text-muted-foreground text-xs", children: "Select stored keys or paste public keys for authorized_keys." })
|
|
456
|
+
] }),
|
|
457
|
+
/* @__PURE__ */ jsxs2(Badge, { variant: "outline", children: [
|
|
458
|
+
totalKeyCount,
|
|
459
|
+
" key",
|
|
460
|
+
totalKeyCount === 1 ? "" : "s"
|
|
461
|
+
] })
|
|
462
|
+
] }),
|
|
463
|
+
keys.length > 0 && /* @__PURE__ */ jsx2("div", { className: "grid gap-2 sm:grid-cols-2", children: keys.map((key) => {
|
|
464
|
+
const selected = config.selectedKeyIds.includes(key.id);
|
|
465
|
+
return /* @__PURE__ */ jsx2(
|
|
466
|
+
Button,
|
|
467
|
+
{
|
|
468
|
+
type: "button",
|
|
469
|
+
variant: selected ? "sandbox" : "outline",
|
|
470
|
+
className: "h-auto justify-start p-3 text-left",
|
|
471
|
+
"aria-pressed": selected,
|
|
472
|
+
onClick: () => {
|
|
473
|
+
config.onSelectedKeyIdsChange(
|
|
474
|
+
selected ? config.selectedKeyIds.filter((id) => id !== key.id) : [...config.selectedKeyIds, key.id]
|
|
475
|
+
);
|
|
476
|
+
},
|
|
477
|
+
children: /* @__PURE__ */ jsxs2("span", { className: "min-w-0", children: [
|
|
478
|
+
/* @__PURE__ */ jsx2("span", { className: "block font-medium text-foreground", children: key.name }),
|
|
479
|
+
/* @__PURE__ */ jsxs2("span", { className: "block truncate font-mono text-muted-foreground text-xs", children: [
|
|
480
|
+
key.keyType,
|
|
481
|
+
" \xB7 ",
|
|
482
|
+
key.fingerprint
|
|
483
|
+
] })
|
|
484
|
+
] })
|
|
485
|
+
},
|
|
486
|
+
key.id
|
|
487
|
+
);
|
|
488
|
+
}) }),
|
|
489
|
+
/* @__PURE__ */ jsx2(
|
|
490
|
+
Textarea,
|
|
491
|
+
{
|
|
492
|
+
className: "min-h-24 font-mono text-xs",
|
|
493
|
+
placeholder: "Paste one public key per line",
|
|
494
|
+
value: config.inlinePublicKeys,
|
|
495
|
+
onChange: (event) => config.onInlinePublicKeysChange(event.target.value)
|
|
496
|
+
}
|
|
497
|
+
)
|
|
498
|
+
] });
|
|
499
|
+
}
|
|
442
500
|
function ProvisioningWizard({
|
|
443
501
|
environments: environmentsProp,
|
|
444
502
|
onLoadEnvironments,
|
|
@@ -455,6 +513,7 @@ function ProvisioningWizard({
|
|
|
455
513
|
popular,
|
|
456
514
|
defaultModel,
|
|
457
515
|
onSetDefault,
|
|
516
|
+
sshAccess,
|
|
458
517
|
pricingRates,
|
|
459
518
|
planTiers
|
|
460
519
|
}) {
|
|
@@ -585,8 +644,10 @@ function ProvisioningWizard({
|
|
|
585
644
|
};
|
|
586
645
|
}, []);
|
|
587
646
|
const isMultistep = variant === "multistep";
|
|
647
|
+
const stepLabels = sshAccess ? ["Environment", "Resources", "AI Agent", "Access"] : ["Environment", "Resources", "AI Agent"];
|
|
648
|
+
const finalStep = stepLabels.length;
|
|
588
649
|
const [currentStep, setCurrentStep] = React2.useState(
|
|
589
|
-
skipToReview && dc && isMultistep ?
|
|
650
|
+
skipToReview && dc && isMultistep ? finalStep : 1
|
|
590
651
|
);
|
|
591
652
|
const [isDeploying, setIsDeploying] = React2.useState(false);
|
|
592
653
|
const [deployError, setDeployError] = React2.useState(null);
|
|
@@ -700,41 +761,40 @@ function ProvisioningWizard({
|
|
|
700
761
|
] }),
|
|
701
762
|
/* @__PURE__ */ jsxs2("div", { className: "grid grid-cols-12 gap-6 flex-1 min-h-0", children: [
|
|
702
763
|
/* @__PURE__ */ jsxs2("div", { className: "col-span-12 xl:col-span-8 flex flex-col min-h-0", children: [
|
|
703
|
-
isMultistep && /* @__PURE__ */ jsx2("div", { className: "flex items-center gap-2 mb-4 bg-card border border-border p-3 rounded-2xl mx-auto max-w-2xl justify-between shrink-0", children:
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
] }, s)) }),
|
|
764
|
+
isMultistep && /* @__PURE__ */ jsx2("div", { className: "flex items-center gap-2 mb-4 bg-card border border-border p-3 rounded-2xl mx-auto max-w-2xl justify-between shrink-0", children: stepLabels.map((label, index) => {
|
|
765
|
+
const s = index + 1;
|
|
766
|
+
return /* @__PURE__ */ jsxs2("div", { className: "flex items-center", children: [
|
|
767
|
+
/* @__PURE__ */ jsx2(
|
|
768
|
+
"div",
|
|
769
|
+
{
|
|
770
|
+
className: cn(
|
|
771
|
+
"w-7 h-7 rounded-full flex items-center justify-center font-bold text-xs shrink-0 transition-all duration-200",
|
|
772
|
+
currentStep === s ? "bg-primary text-primary-foreground ring-2 ring-primary/30 ring-offset-2 ring-offset-card shadow-sm" : currentStep > s ? "bg-primary text-primary-foreground" : "bg-muted border border-border text-muted-foreground"
|
|
773
|
+
),
|
|
774
|
+
children: currentStep > s ? /* @__PURE__ */ jsx2(Check, { className: "h-3.5 w-3.5" }) : s
|
|
775
|
+
}
|
|
776
|
+
),
|
|
777
|
+
/* @__PURE__ */ jsx2(
|
|
778
|
+
"span",
|
|
779
|
+
{
|
|
780
|
+
className: cn(
|
|
781
|
+
"ml-2 sm:ml-3 font-bold text-sm tracking-tight hidden sm:inline transition-colors duration-200",
|
|
782
|
+
currentStep === s ? "text-foreground" : currentStep > s ? "text-primary" : "text-muted-foreground"
|
|
783
|
+
),
|
|
784
|
+
children: label
|
|
785
|
+
}
|
|
786
|
+
),
|
|
787
|
+
s < finalStep && /* @__PURE__ */ jsx2(
|
|
788
|
+
"div",
|
|
789
|
+
{
|
|
790
|
+
className: cn(
|
|
791
|
+
"w-4 sm:w-8 h-0.5 mx-2 sm:mx-4 rounded-full transition-colors duration-300",
|
|
792
|
+
currentStep > s ? "bg-primary" : "bg-border"
|
|
793
|
+
)
|
|
794
|
+
}
|
|
795
|
+
)
|
|
796
|
+
] }, s);
|
|
797
|
+
}) }),
|
|
738
798
|
dc && isMultistep && /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between bg-card border border-border rounded-2xl px-4 py-3 shrink-0", children: [
|
|
739
799
|
/* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-2 text-sm", children: [
|
|
740
800
|
/* @__PURE__ */ jsx2(Info, { className: "h-4 w-4 text-primary shrink-0" }),
|
|
@@ -1206,6 +1266,13 @@ function ProvisioningWizard({
|
|
|
1206
1266
|
] })
|
|
1207
1267
|
] })
|
|
1208
1268
|
] })
|
|
1269
|
+
] }) }),
|
|
1270
|
+
sshAccess && (!isMultistep || currentStep === 4) && /* @__PURE__ */ jsx2(React2.Fragment, { children: /* @__PURE__ */ jsxs2("section", { className: "bg-card border border-border rounded-[24px] p-6 shadow-2xl relative overflow-hidden animate-in fade-in slide-in-from-bottom-4 duration-300", children: [
|
|
1271
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-3 mb-5", children: [
|
|
1272
|
+
/* @__PURE__ */ jsx2("div", { className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-xl bg-primary/10 border border-primary/20 text-primary", children: /* @__PURE__ */ jsx2(Settings, { className: "h-5 w-5" }) }),
|
|
1273
|
+
/* @__PURE__ */ jsx2("h2", { className: "text-lg font-bold text-foreground tracking-tight", children: "Access Configuration" })
|
|
1274
|
+
] }),
|
|
1275
|
+
/* @__PURE__ */ jsx2(SshAccessStep, { config: sshAccess })
|
|
1209
1276
|
] }) })
|
|
1210
1277
|
] })
|
|
1211
1278
|
] }),
|
|
@@ -1310,16 +1377,15 @@ function ProvisioningWizard({
|
|
|
1310
1377
|
/* @__PURE__ */ jsx2("p", { className: "text-sm font-medium text-destructive", children: deployError })
|
|
1311
1378
|
] }),
|
|
1312
1379
|
/* @__PURE__ */ jsx2("div", { className: "space-y-3", children: isMultistep ? /* @__PURE__ */ jsxs2(Fragment2, { children: [
|
|
1313
|
-
currentStep <
|
|
1380
|
+
currentStep < finalStep ? /* @__PURE__ */ jsxs2(
|
|
1314
1381
|
"button",
|
|
1315
1382
|
{
|
|
1316
1383
|
type: "button",
|
|
1317
1384
|
onClick: () => setCurrentStep((s) => s + 1),
|
|
1318
1385
|
className: "w-full relative overflow-hidden h-12 bg-primary text-primary-foreground font-extrabold text-sm rounded-2xl hover:brightness-110 transition-all active:scale-[0.98] shadow-md",
|
|
1319
1386
|
children: [
|
|
1320
|
-
"Continue to",
|
|
1321
|
-
|
|
1322
|
-
currentStep === 1 ? "Resources" : "Agent Config"
|
|
1387
|
+
"Continue to ",
|
|
1388
|
+
stepLabels[currentStep]
|
|
1323
1389
|
]
|
|
1324
1390
|
}
|
|
1325
1391
|
) : /* @__PURE__ */ jsx2(
|
|
@@ -1544,8 +1610,8 @@ import {
|
|
|
1544
1610
|
Trash2 as Trash22
|
|
1545
1611
|
} from "lucide-react";
|
|
1546
1612
|
import * as React4 from "react";
|
|
1547
|
-
import { Button } from "@tangle-network/ui/primitives";
|
|
1548
|
-
import { Badge } from "@tangle-network/ui/primitives";
|
|
1613
|
+
import { Button as Button2 } from "@tangle-network/ui/primitives";
|
|
1614
|
+
import { Badge as Badge2 } from "@tangle-network/ui/primitives";
|
|
1549
1615
|
import { Card } from "@tangle-network/ui/primitives";
|
|
1550
1616
|
import {
|
|
1551
1617
|
Dialog,
|
|
@@ -1618,7 +1684,7 @@ function ProfilesPage({
|
|
|
1618
1684
|
] }),
|
|
1619
1685
|
/* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-3", children: [
|
|
1620
1686
|
onCompareClick && customProfiles.length >= 2 && /* @__PURE__ */ jsx4(
|
|
1621
|
-
|
|
1687
|
+
Button2,
|
|
1622
1688
|
{
|
|
1623
1689
|
variant: "outline",
|
|
1624
1690
|
onClick: () => onCompareClick(customProfiles),
|
|
@@ -1626,7 +1692,7 @@ function ProfilesPage({
|
|
|
1626
1692
|
}
|
|
1627
1693
|
),
|
|
1628
1694
|
/* @__PURE__ */ jsxs4(
|
|
1629
|
-
|
|
1695
|
+
Button2,
|
|
1630
1696
|
{
|
|
1631
1697
|
onClick: () => setCreateDialogOpen(true),
|
|
1632
1698
|
disabled: !canCreateMore,
|
|
@@ -1661,7 +1727,7 @@ function ProfilesPage({
|
|
|
1661
1727
|
error && /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-2 rounded-lg border border-[var(--surface-danger-border)] bg-[var(--surface-danger-bg)] p-3 text-[var(--surface-danger-text)] text-sm", children: [
|
|
1662
1728
|
/* @__PURE__ */ jsx4(AlertCircle, { className: "h-4 w-4" }),
|
|
1663
1729
|
/* @__PURE__ */ jsx4("span", { children: error }),
|
|
1664
|
-
/* @__PURE__ */ jsx4(
|
|
1730
|
+
/* @__PURE__ */ jsx4(Button2, { variant: "ghost", size: "sm", onClick: loadProfiles, children: "Retry" })
|
|
1665
1731
|
] }),
|
|
1666
1732
|
loading && /* @__PURE__ */ jsx4("div", { className: "flex items-center justify-center py-12", children: /* @__PURE__ */ jsx4(Loader22, { className: "h-8 w-8 animate-spin text-muted-foreground" }) }),
|
|
1667
1733
|
!loading && /* @__PURE__ */ jsxs4("div", { className: "space-y-8", children: [
|
|
@@ -1679,7 +1745,7 @@ function ProfilesPage({
|
|
|
1679
1745
|
icon: /* @__PURE__ */ jsx4(Settings2, { className: "h-8 w-8" }),
|
|
1680
1746
|
title: "No custom profiles yet",
|
|
1681
1747
|
description: "Create a profile to customize agent behavior",
|
|
1682
|
-
action: canCreateMore ? /* @__PURE__ */ jsxs4(
|
|
1748
|
+
action: canCreateMore ? /* @__PURE__ */ jsxs4(Button2, { onClick: () => setCreateDialogOpen(true), children: [
|
|
1683
1749
|
/* @__PURE__ */ jsx4(Plus2, { className: "mr-2 h-4 w-4" }),
|
|
1684
1750
|
"Create Profile"
|
|
1685
1751
|
] }) : void 0
|
|
@@ -1781,14 +1847,14 @@ function ProfileCard({
|
|
|
1781
1847
|
/* @__PURE__ */ jsxs4("div", { className: "flex-1", children: [
|
|
1782
1848
|
/* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-2", children: [
|
|
1783
1849
|
/* @__PURE__ */ jsx4("h3", { className: "font-medium", children: profile.name }),
|
|
1784
|
-
isBuiltin && /* @__PURE__ */ jsx4(
|
|
1785
|
-
profile.is_public && !isBuiltin && /* @__PURE__ */ jsx4(
|
|
1850
|
+
isBuiltin && /* @__PURE__ */ jsx4(Badge2, { variant: "secondary", className: "border-0 text-xs", children: "Built-in" }),
|
|
1851
|
+
profile.is_public && !isBuiltin && /* @__PURE__ */ jsx4(Badge2, { className: "border border-[var(--surface-info-border)] bg-[var(--surface-info-bg)] text-[var(--surface-info-text)] text-xs", children: "Public" })
|
|
1786
1852
|
] }),
|
|
1787
1853
|
profile.description && /* @__PURE__ */ jsx4("p", { className: "mt-1 line-clamp-2 text-muted-foreground text-sm", children: profile.description })
|
|
1788
1854
|
] }),
|
|
1789
1855
|
!isBuiltin && /* @__PURE__ */ jsxs4("div", { className: "flex gap-1", onClick: (e) => e.stopPropagation(), children: [
|
|
1790
1856
|
onEdit && /* @__PURE__ */ jsx4(
|
|
1791
|
-
|
|
1857
|
+
Button2,
|
|
1792
1858
|
{
|
|
1793
1859
|
variant: "ghost",
|
|
1794
1860
|
size: "icon",
|
|
@@ -1798,7 +1864,7 @@ function ProfileCard({
|
|
|
1798
1864
|
}
|
|
1799
1865
|
),
|
|
1800
1866
|
onDelete && /* @__PURE__ */ jsx4(
|
|
1801
|
-
|
|
1867
|
+
Button2,
|
|
1802
1868
|
{
|
|
1803
1869
|
variant: "ghost",
|
|
1804
1870
|
size: "icon",
|
|
@@ -1810,11 +1876,11 @@ function ProfileCard({
|
|
|
1810
1876
|
] })
|
|
1811
1877
|
] }),
|
|
1812
1878
|
/* @__PURE__ */ jsxs4("div", { className: "mt-3 flex flex-wrap gap-2", children: [
|
|
1813
|
-
profile.extends && /* @__PURE__ */ jsxs4(
|
|
1879
|
+
profile.extends && /* @__PURE__ */ jsxs4(Badge2, { variant: "outline", className: "text-xs", children: [
|
|
1814
1880
|
"extends ",
|
|
1815
1881
|
profile.extends
|
|
1816
1882
|
] }),
|
|
1817
|
-
profile.model && /* @__PURE__ */ jsx4(
|
|
1883
|
+
profile.model && /* @__PURE__ */ jsx4(Badge2, { variant: "outline", className: "text-xs", children: profile.model.split("/").pop() })
|
|
1818
1884
|
] }),
|
|
1819
1885
|
profile.metrics && profile.metrics.total_runs > 0 && /* @__PURE__ */ jsxs4("div", { className: "mt-3 flex gap-4 border-border border-t pt-3 text-muted-foreground text-xs", children: [
|
|
1820
1886
|
/* @__PURE__ */ jsxs4("span", { children: [
|
|
@@ -2020,8 +2086,8 @@ function ProfileFormDialog({
|
|
|
2020
2086
|
/* @__PURE__ */ jsx4("label", { htmlFor: "is_public", className: "text-sm", children: "Make this profile public (visible to other users)" })
|
|
2021
2087
|
] }),
|
|
2022
2088
|
/* @__PURE__ */ jsxs4(DialogFooter, { children: [
|
|
2023
|
-
/* @__PURE__ */ jsx4(
|
|
2024
|
-
/* @__PURE__ */ jsxs4(
|
|
2089
|
+
/* @__PURE__ */ jsx4(Button2, { type: "button", variant: "outline", onClick: onClose, children: "Cancel" }),
|
|
2090
|
+
/* @__PURE__ */ jsxs4(Button2, { type: "submit", disabled: saving || !formData.name, children: [
|
|
2025
2091
|
saving && /* @__PURE__ */ jsx4(Loader22, { className: "mr-2 h-4 w-4 animate-spin" }),
|
|
2026
2092
|
isEditing ? "Save Changes" : "Create Profile"
|
|
2027
2093
|
] })
|
|
@@ -2069,9 +2135,9 @@ function DeleteProfileDialog({
|
|
|
2069
2135
|
" recorded runs. Deleting it will lose all performance metrics."
|
|
2070
2136
|
] }),
|
|
2071
2137
|
/* @__PURE__ */ jsxs4(DialogFooter, { children: [
|
|
2072
|
-
/* @__PURE__ */ jsx4(
|
|
2138
|
+
/* @__PURE__ */ jsx4(Button2, { variant: "outline", onClick: onClose, children: "Cancel" }),
|
|
2073
2139
|
/* @__PURE__ */ jsxs4(
|
|
2074
|
-
|
|
2140
|
+
Button2,
|
|
2075
2141
|
{
|
|
2076
2142
|
variant: "destructive",
|
|
2077
2143
|
onClick: handleDelete,
|
|
@@ -2096,8 +2162,8 @@ function ProfileDetailDialog({
|
|
|
2096
2162
|
/* @__PURE__ */ jsxs4(DialogHeader, { children: [
|
|
2097
2163
|
/* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-2", children: [
|
|
2098
2164
|
/* @__PURE__ */ jsx4(DialogTitle, { children: profile.name }),
|
|
2099
|
-
profile.is_builtin && /* @__PURE__ */ jsx4(
|
|
2100
|
-
profile.is_public && !profile.is_builtin && /* @__PURE__ */ jsx4(
|
|
2165
|
+
profile.is_builtin && /* @__PURE__ */ jsx4(Badge2, { variant: "secondary", className: "border-0", children: "Built-in" }),
|
|
2166
|
+
profile.is_public && !profile.is_builtin && /* @__PURE__ */ jsx4(Badge2, { className: "border border-[var(--surface-info-border)] bg-[var(--surface-info-bg)] text-[var(--surface-info-text)]", children: "Public" })
|
|
2101
2167
|
] }),
|
|
2102
2168
|
profile.description && /* @__PURE__ */ jsx4(DialogDescription, { children: profile.description })
|
|
2103
2169
|
] }),
|
|
@@ -2114,14 +2180,14 @@ function ProfileDetailDialog({
|
|
|
2114
2180
|
] }),
|
|
2115
2181
|
profile.tags && profile.tags.length > 0 && /* @__PURE__ */ jsxs4("div", { children: [
|
|
2116
2182
|
/* @__PURE__ */ jsx4("label", { className: "font-medium text-muted-foreground text-xs", children: "Tags" }),
|
|
2117
|
-
/* @__PURE__ */ jsx4("div", { className: "mt-1 flex flex-wrap gap-1", children: profile.tags.map((tag) => /* @__PURE__ */ jsx4(
|
|
2183
|
+
/* @__PURE__ */ jsx4("div", { className: "mt-1 flex flex-wrap gap-1", children: profile.tags.map((tag) => /* @__PURE__ */ jsx4(Badge2, { variant: "outline", className: "text-xs", children: tag }, tag)) })
|
|
2118
2184
|
] }),
|
|
2119
2185
|
profile.system_prompt && /* @__PURE__ */ jsxs4("div", { children: [
|
|
2120
2186
|
/* @__PURE__ */ jsx4("label", { className: "font-medium text-muted-foreground text-xs", children: "System Prompt" }),
|
|
2121
2187
|
/* @__PURE__ */ jsxs4("div", { className: "relative mt-1", children: [
|
|
2122
2188
|
/* @__PURE__ */ jsx4("pre", { className: "max-h-48 overflow-auto rounded-lg bg-muted p-3 font-mono text-sm", children: profile.system_prompt }),
|
|
2123
2189
|
/* @__PURE__ */ jsx4(
|
|
2124
|
-
|
|
2190
|
+
Button2,
|
|
2125
2191
|
{
|
|
2126
2192
|
variant: "ghost",
|
|
2127
2193
|
size: "icon",
|
|
@@ -2169,12 +2235,12 @@ function ProfileDetailDialog({
|
|
|
2169
2235
|
] })
|
|
2170
2236
|
] }),
|
|
2171
2237
|
/* @__PURE__ */ jsxs4(DialogFooter, { children: [
|
|
2172
|
-
/* @__PURE__ */ jsx4(
|
|
2173
|
-
onDuplicate && /* @__PURE__ */ jsxs4(
|
|
2238
|
+
/* @__PURE__ */ jsx4(Button2, { variant: "outline", onClick: onClose, children: "Close" }),
|
|
2239
|
+
onDuplicate && /* @__PURE__ */ jsxs4(Button2, { variant: "outline", onClick: onDuplicate, children: [
|
|
2174
2240
|
/* @__PURE__ */ jsx4(Copy, { className: "mr-2 h-4 w-4" }),
|
|
2175
2241
|
"Duplicate"
|
|
2176
2242
|
] }),
|
|
2177
|
-
onEdit && /* @__PURE__ */ jsxs4(
|
|
2243
|
+
onEdit && /* @__PURE__ */ jsxs4(Button2, { onClick: onEdit, children: [
|
|
2178
2244
|
/* @__PURE__ */ jsx4(Edit2, { className: "mr-2 h-4 w-4" }),
|
|
2179
2245
|
"Edit"
|
|
2180
2246
|
] })
|
package/dist/styles.css
CHANGED
|
@@ -591,6 +591,9 @@
|
|
|
591
591
|
.h-\[500px\] {
|
|
592
592
|
height: 500px;
|
|
593
593
|
}
|
|
594
|
+
.h-auto {
|
|
595
|
+
height: auto;
|
|
596
|
+
}
|
|
594
597
|
.h-full {
|
|
595
598
|
height: 100%;
|
|
596
599
|
}
|
|
@@ -615,6 +618,9 @@
|
|
|
615
618
|
.min-h-0 {
|
|
616
619
|
min-height: calc(var(--spacing) * 0);
|
|
617
620
|
}
|
|
621
|
+
.min-h-24 {
|
|
622
|
+
min-height: calc(var(--spacing) * 24);
|
|
623
|
+
}
|
|
618
624
|
.min-h-\[2px\] {
|
|
619
625
|
min-height: 2px;
|
|
620
626
|
}
|
package/package.json
CHANGED