@tangle-network/sandbox-ui 0.14.0 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/auth.d.ts +1 -74
  2. package/dist/auth.js +1 -4
  3. package/dist/chat.d.ts +1 -136
  4. package/dist/chat.js +2 -15
  5. package/dist/chunk-2BUPSB7O.js +0 -0
  6. package/dist/chunk-3J6FG3FJ.js +18 -0
  7. package/dist/chunk-76IQLPW2.js +206 -0
  8. package/dist/chunk-7ZA5SEK3.js +239 -0
  9. package/dist/chunk-AZ3AWMTM.js +8 -0
  10. package/dist/chunk-CMY7W45U.js +380 -0
  11. package/dist/chunk-EI44GEQ5.js +6 -0
  12. package/dist/chunk-ENMWGVDL.js +858 -0
  13. package/dist/{chunk-5OQ27N57.js → chunk-GPT7VKK6.js} +34 -38
  14. package/dist/chunk-HLZTKSGT.js +2652 -0
  15. package/dist/chunk-JBGKGLD7.js +16 -0
  16. package/dist/chunk-NJNME4J4.js +14 -0
  17. package/dist/chunk-QPAJR74X.js +20 -0
  18. package/dist/chunk-TK46XFLM.js +28 -0
  19. package/dist/chunk-WID73FPH.js +89 -0
  20. package/dist/chunk-YVXK4XRO.js +30 -0
  21. package/dist/dashboard.d.ts +450 -4
  22. package/dist/dashboard.js +20 -891
  23. package/dist/editor.d.ts +1 -120
  24. package/dist/editor.js +1 -5
  25. package/dist/files.d.ts +1 -129
  26. package/dist/files.js +2 -7
  27. package/dist/globals.css +2 -1265
  28. package/dist/hooks.d.ts +114 -11
  29. package/dist/hooks.js +17 -88
  30. package/dist/index.d.ts +24 -99
  31. package/dist/index.js +251 -256
  32. package/dist/markdown.d.ts +1 -29
  33. package/dist/markdown.js +2 -2
  34. package/dist/openui.d.ts +8 -115
  35. package/dist/openui.js +1 -6
  36. package/dist/pages.d.ts +13 -12
  37. package/dist/pages.js +91 -115
  38. package/dist/primitives.d.ts +14 -49
  39. package/dist/primitives.js +69 -77
  40. package/dist/run.d.ts +1 -14
  41. package/dist/run.js +2 -22
  42. package/dist/sdk-hooks.d.ts +3 -283
  43. package/dist/sdk-hooks.js +10 -14
  44. package/dist/stores.d.ts +2 -14
  45. package/dist/stores.js +11 -39
  46. package/dist/styles.css +2 -1265
  47. package/dist/template-card-DStb8boW.d.ts +183 -0
  48. package/dist/types.d.ts +11 -8
  49. package/dist/types.js +1 -0
  50. package/dist/utils.d.ts +1 -44
  51. package/dist/utils.js +6 -12
  52. package/dist/workspace.d.ts +5 -10
  53. package/dist/workspace.js +3 -19
  54. package/package.json +19 -54
  55. package/dist/active-sessions-store-CeOmXgv5.d.ts +0 -85
  56. package/dist/artifact-pane-Bh45Ssco.d.ts +0 -24
  57. package/dist/branding-DCi5VEik.d.ts +0 -13
  58. package/dist/button-CMQuQEW_.d.ts +0 -17
  59. package/dist/chat-container-f4yEs6KN.d.ts +0 -106
  60. package/dist/chunk-34A66VBG.js +0 -214
  61. package/dist/chunk-34I7UFSX.js +0 -92
  62. package/dist/chunk-36QY2W5G.js +0 -802
  63. package/dist/chunk-4CLN43XT.js +0 -45
  64. package/dist/chunk-54SQQMMM.js +0 -156
  65. package/dist/chunk-66EZOYZR.js +0 -102
  66. package/dist/chunk-BX6AQMUS.js +0 -183
  67. package/dist/chunk-DI3NZ5ZX.js +0 -192
  68. package/dist/chunk-DPGIXDAI.js +0 -220
  69. package/dist/chunk-DXMIEK4K.js +0 -1426
  70. package/dist/chunk-GSZA3TSY.js +0 -79
  71. package/dist/chunk-HB5Y37YU.js +0 -54
  72. package/dist/chunk-LQNEZDRM.js +0 -109
  73. package/dist/chunk-MA7YKRUP.js +0 -131
  74. package/dist/chunk-MKTSMWVD.js +0 -109
  75. package/dist/chunk-MQXABZTB.js +0 -1348
  76. package/dist/chunk-MT5FJ3ZT.js +0 -186
  77. package/dist/chunk-NKUPJC34.js +0 -2070
  78. package/dist/chunk-OEX7NZE3.js +0 -321
  79. package/dist/chunk-OKLQVY3Y.js +0 -139
  80. package/dist/chunk-Q56BYXQF.js +0 -61
  81. package/dist/chunk-QD4QE5P5.js +0 -40
  82. package/dist/chunk-QDH5GEGY.js +0 -630
  83. package/dist/chunk-QID2OOMG.js +0 -133
  84. package/dist/chunk-QMU2PWOU.js +0 -493
  85. package/dist/chunk-RQHJBTEU.js +0 -10
  86. package/dist/chunk-T7HMZEVO.js +0 -216
  87. package/dist/chunk-U6QTHMY6.js +0 -1290
  88. package/dist/chunk-US6JKJKH.js +0 -124
  89. package/dist/chunk-VX3XOUEB.js +0 -63
  90. package/dist/chunk-XLG757B6.js +0 -933
  91. package/dist/chunk-ZMNSRDMH.js +0 -127
  92. package/dist/chunk-ZNCEM5CD.js +0 -316
  93. package/dist/document-editor-pane-A70-EhdQ.d.ts +0 -124
  94. package/dist/document-editor-pane-TLPVRBBU.js +0 -11
  95. package/dist/expanded-tool-detail-Dh99mcbY.d.ts +0 -63
  96. package/dist/file-tabs-BLfxfmAH.d.ts +0 -51
  97. package/dist/parts-CyGkM6Fp.d.ts +0 -50
  98. package/dist/run-CtFZ6s-D.d.ts +0 -41
  99. package/dist/sidebar-drop-zone-tDBsuOH5.d.ts +0 -301
  100. package/dist/sidecar-CFU2W9j1.d.ts +0 -8
  101. package/dist/template-card-BAtvcAkU.d.ts +0 -18
  102. package/dist/tool-call-feed-Bs3MyQMT.d.ts +0 -68
  103. package/dist/tool-display-Ct9nFAzJ.d.ts +0 -32
  104. package/dist/usage-chart-CPTcNlGs.d.ts +0 -73
  105. package/dist/use-sandbox-metrics-DWc0k9Xm.d.ts +0 -153
  106. package/dist/variant-list-BrHYcBCk.d.ts +0 -540
package/dist/pages.js CHANGED
@@ -1,47 +1,20 @@
1
- import {
2
- Dialog,
3
- DialogContent,
4
- DialogDescription,
5
- DialogFooter,
6
- DialogHeader,
7
- DialogTitle
8
- } from "./chunk-US6JKJKH.js";
9
- import {
10
- Tabs,
11
- TabsContent,
12
- TabsList,
13
- TabsTrigger
14
- } from "./chunk-Q56BYXQF.js";
15
- import {
16
- EmptyState,
17
- Input
18
- } from "./chunk-MA7YKRUP.js";
19
- import {
20
- InfoPanel,
21
- TemplateCard
22
- } from "./chunk-VX3XOUEB.js";
23
1
  import {
24
2
  BillingDashboard,
3
+ InfoPanel,
4
+ ModelPicker,
25
5
  PricingPage,
26
- UsageChart
27
- } from "./chunk-QMU2PWOU.js";
28
- import {
29
- Skeleton,
30
- SkeletonCard
31
- } from "./chunk-66EZOYZR.js";
32
- import {
33
- Badge,
34
- Card
35
- } from "./chunk-ZMNSRDMH.js";
36
- import {
37
- Button
38
- } from "./chunk-MKTSMWVD.js";
6
+ TemplateCard,
7
+ UsageChart,
8
+ canonicalModelId
9
+ } from "./chunk-ENMWGVDL.js";
39
10
  import {
40
11
  cn
41
- } from "./chunk-RQHJBTEU.js";
12
+ } from "./chunk-EI44GEQ5.js";
42
13
 
43
14
  // src/pages/billing-page.tsx
44
15
  import * as React from "react";
16
+ import { Skeleton, SkeletonCard } from "@tangle-network/ui/primitives";
17
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@tangle-network/ui/primitives";
45
18
  import { jsx, jsxs } from "react/jsx-runtime";
46
19
  var defaultBillingData = {
47
20
  subscription: null,
@@ -316,10 +289,6 @@ var VALID_DRIVERS = /* @__PURE__ */ new Set([
316
289
  "firecracker",
317
290
  "tangle"
318
291
  ]);
319
- var DEFAULT_MODEL_OPTIONS = [
320
- { value: "claude-sonnet", label: "Claude Sonnet 4.6 (Highly Capable)" }
321
- ];
322
- var DEFAULT_MODEL_TIER = DEFAULT_MODEL_OPTIONS[0]?.value ?? "claude-sonnet";
323
292
  var STACK_DISPLAY = {
324
293
  universal: {
325
294
  name: "Default",
@@ -482,7 +451,7 @@ function ProvisioningWizard({
482
451
  skipToReview,
483
452
  onLoadStartupScripts,
484
453
  resourceLimits,
485
- modelOptions,
454
+ models,
486
455
  pricingRates,
487
456
  planTiers
488
457
  }) {
@@ -568,23 +537,17 @@ function ProvisioningWizard({
568
537
  (prev) => snapSliderValue(prev, STORAGE_MIN, storageMax, storageStep)
569
538
  );
570
539
  }, [cpuMax, ramMax, storageMax, cpuStep, ramStep, storageStep]);
571
- const [modelTier, setModelTier] = React2.useState(
572
- dc?.modelTier ?? DEFAULT_MODEL_TIER
573
- );
540
+ const [modelTier, setModelTier] = React2.useState(dc?.modelTier ?? "");
574
541
  const [systemPrompt, setSystemPrompt] = React2.useState(
575
542
  dc?.systemPrompt ?? ""
576
543
  );
577
544
  React2.useEffect(() => {
578
- const options = modelOptions ?? DEFAULT_MODEL_OPTIONS;
579
- if (options.length === 0) return;
580
- const currentOption = options.find((o) => o.value === modelTier);
581
- if (!currentOption || currentOption.disabled) {
582
- const firstAvailable = options.find((o) => !o.disabled);
583
- if (firstAvailable && firstAvailable.value !== modelTier) {
584
- setModelTier(firstAvailable.value);
585
- }
586
- }
587
- }, [modelOptions, modelTier]);
545
+ if (!models || models.length === 0) return;
546
+ const ids = models.map(canonicalModelId);
547
+ if (ids.includes(modelTier)) return;
548
+ const next = ids[0];
549
+ if (next && next !== modelTier) setModelTier(next);
550
+ }, [models, modelTier]);
588
551
  const [name, setName] = React2.useState(dc?.name ?? "");
589
552
  const [gitUrl, setGitUrl] = React2.useState(dc?.gitUrl ?? "");
590
553
  const [envVars, setEnvVars] = React2.useState(dc?.envVars ?? [{ key: "", value: "" }]);
@@ -784,11 +747,8 @@ function ProvisioningWizard({
784
747
  setStorageGB(
785
748
  snapSliderValue(128, STORAGE_MIN, storageMax, storageStep)
786
749
  );
787
- const resetOptions = modelOptions ?? DEFAULT_MODEL_OPTIONS;
788
- const firstAvailable = resetOptions.find(
789
- (o) => !o.disabled
790
- );
791
- setModelTier(firstAvailable?.value ?? DEFAULT_MODEL_TIER);
750
+ const first = models?.[0];
751
+ setModelTier(first ? canonicalModelId(first) : "");
792
752
  setSystemPrompt("");
793
753
  setName("");
794
754
  setGitUrl("");
@@ -983,27 +943,17 @@ function ProvisioningWizard({
983
943
  /* @__PURE__ */ jsxs2("div", { children: [
984
944
  /* @__PURE__ */ jsx2("label", { className: "block font-label text-xs font-bold uppercase tracking-widest text-muted-foreground mb-2", children: "Model Engine" }),
985
945
  /* @__PURE__ */ jsx2(
986
- "select",
946
+ ModelPicker,
987
947
  {
948
+ label: "",
988
949
  value: modelTier,
989
- onChange: (e) => setModelTier(e.target.value),
990
- disabled: modelOptions && modelOptions.filter((o) => !o.disabled).length === 0,
991
- className: "w-full bg-card border border-border rounded-xl h-12 px-4 font-bold text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent appearance-none disabled:opacity-50 disabled:cursor-not-allowed",
992
- children: (modelOptions ?? DEFAULT_MODEL_OPTIONS).map(
993
- (option) => /* @__PURE__ */ jsx2(
994
- "option",
995
- {
996
- value: option.value,
997
- disabled: option.disabled,
998
- className: "bg-gray-900",
999
- children: option.label
1000
- },
1001
- option.value
1002
- )
1003
- )
950
+ onChange: setModelTier,
951
+ models: models ?? [],
952
+ loading: !models,
953
+ disabled: !models || models.length === 0,
954
+ triggerClassName: "rounded-xl h-12 px-4 font-bold"
1004
955
  }
1005
- ),
1006
- modelOptions && modelOptions.length > 0 && modelOptions.every((o) => o.disabled) && /* @__PURE__ */ jsx2("p", { className: "text-xs text-muted-foreground mt-2", children: "All model options are currently disabled. Please upgrade your plan or contact support." })
956
+ )
1007
957
  ] }),
1008
958
  /* @__PURE__ */ jsxs2("div", { children: [
1009
959
  /* @__PURE__ */ jsx2("label", { className: "block font-label text-xs font-bold uppercase tracking-widest text-muted-foreground mb-2", children: "Core Directives (System Prompt)" }),
@@ -1363,7 +1313,7 @@ function ProvisioningWizard({
1363
1313
  {
1364
1314
  type: "button",
1365
1315
  onClick: handleDeploy,
1366
- disabled: isDeploying || !selectedEnv,
1316
+ disabled: isDeploying || !selectedEnv || !modelTier && !bare,
1367
1317
  className: "w-full h-12 bg-primary text-primary-foreground font-extrabold text-sm rounded-2xl tracking-wide shadow-md disabled:opacity-50 hover:brightness-110 active:scale-[0.98] transition-all",
1368
1318
  children: isDeploying ? /* @__PURE__ */ jsxs2("span", { className: "flex items-center justify-center gap-2", children: [
1369
1319
  /* @__PURE__ */ jsx2(Loader2, { className: "h-4 w-4 animate-spin" }),
@@ -1385,7 +1335,7 @@ function ProvisioningWizard({
1385
1335
  {
1386
1336
  type: "button",
1387
1337
  onClick: handleDeploy,
1388
- disabled: isDeploying || !selectedEnv,
1338
+ disabled: isDeploying || !selectedEnv || !modelTier && !bare,
1389
1339
  className: "w-full h-12 bg-primary text-primary-foreground font-extrabold text-sm rounded-2xl tracking-wide shadow-md disabled:opacity-50 hover:brightness-110 active:scale-[0.98] transition-all",
1390
1340
  children: isDeploying ? /* @__PURE__ */ jsxs2("span", { className: "flex items-center justify-center gap-2", children: [
1391
1341
  /* @__PURE__ */ jsx2(Loader2, { className: "h-4 w-4 animate-spin" }),
@@ -1400,6 +1350,7 @@ function ProvisioningWizard({
1400
1350
 
1401
1351
  // src/pages/pricing-page.tsx
1402
1352
  import * as React3 from "react";
1353
+ import { Skeleton as Skeleton2, SkeletonCard as SkeletonCard2 } from "@tangle-network/ui/primitives";
1403
1354
  import { ChevronDown } from "lucide-react";
1404
1355
  import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
1405
1356
  async function fetchTiersFromApi(apiBasePath) {
@@ -1493,13 +1444,13 @@ function StandalonePricingPage({
1493
1444
  ] }),
1494
1445
  state.loading ? /* @__PURE__ */ jsxs3("div", { className: "space-y-8", children: [
1495
1446
  /* @__PURE__ */ jsxs3("div", { className: "flex items-center justify-center gap-4", children: [
1496
- /* @__PURE__ */ jsx3(Skeleton, { className: "h-10 w-24" }),
1497
- /* @__PURE__ */ jsx3(Skeleton, { className: "h-10 w-24" })
1447
+ /* @__PURE__ */ jsx3(Skeleton2, { className: "h-10 w-24" }),
1448
+ /* @__PURE__ */ jsx3(Skeleton2, { className: "h-10 w-24" })
1498
1449
  ] }),
1499
1450
  /* @__PURE__ */ jsxs3("div", { className: "grid grid-cols-1 gap-6 lg:grid-cols-3", children: [
1500
- /* @__PURE__ */ jsx3(SkeletonCard, { className: "h-[500px]" }),
1501
- /* @__PURE__ */ jsx3(SkeletonCard, { className: "h-[500px]" }),
1502
- /* @__PURE__ */ jsx3(SkeletonCard, { className: "h-[500px]" })
1451
+ /* @__PURE__ */ jsx3(SkeletonCard2, { className: "h-[500px]" }),
1452
+ /* @__PURE__ */ jsx3(SkeletonCard2, { className: "h-[500px]" }),
1453
+ /* @__PURE__ */ jsx3(SkeletonCard2, { className: "h-[500px]" })
1503
1454
  ] })
1504
1455
  ] }) : state.error ? /* @__PURE__ */ jsxs3("div", { className: "flex flex-col items-center justify-center space-y-4 rounded-xl border border-destructive/20 bg-destructive/5 p-8 text-center", children: [
1505
1456
  /* @__PURE__ */ jsx3("p", { className: "text-destructive text-sm font-medium", children: state.error }),
@@ -1549,6 +1500,19 @@ import {
1549
1500
  Trash2 as Trash22
1550
1501
  } from "lucide-react";
1551
1502
  import * as React4 from "react";
1503
+ import { Button } from "@tangle-network/ui/primitives";
1504
+ import { Badge } from "@tangle-network/ui/primitives";
1505
+ import { Card } from "@tangle-network/ui/primitives";
1506
+ import {
1507
+ Dialog,
1508
+ DialogContent,
1509
+ DialogDescription,
1510
+ DialogFooter,
1511
+ DialogHeader,
1512
+ DialogTitle
1513
+ } from "@tangle-network/ui/primitives";
1514
+ import { EmptyState } from "@tangle-network/ui/primitives";
1515
+ import { Input } from "@tangle-network/ui/primitives";
1552
1516
  import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
1553
1517
  var TIER_LIMITS = {
1554
1518
  free: 3,
@@ -2177,6 +2141,14 @@ function ProfileDetailDialog({
2177
2141
  // src/pages/secrets-page.tsx
2178
2142
  import * as React5 from "react";
2179
2143
  import { Lock, Plus as Plus3, Trash2 as Trash23, Eye, EyeOff, AlertCircle as AlertCircle2, Key, Shield, CheckCircle, Users, ArrowRight } from "lucide-react";
2144
+ import {
2145
+ Dialog as Dialog2,
2146
+ DialogContent as DialogContent2,
2147
+ DialogDescription as DialogDescription2,
2148
+ DialogFooter as DialogFooter2,
2149
+ DialogHeader as DialogHeader2,
2150
+ DialogTitle as DialogTitle2
2151
+ } from "@tangle-network/ui/primitives";
2180
2152
  import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
2181
2153
  function SecretsPage({ apiClient, className, teamSecretsHint }) {
2182
2154
  const [secrets, setSecrets] = React5.useState([]);
@@ -2318,7 +2290,7 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2318
2290
  /* @__PURE__ */ jsx5(AlertCircle2, { className: "h-5 w-5 text-destructive shrink-0" }),
2319
2291
  /* @__PURE__ */ jsx5("p", { className: "text-destructive text-sm font-medium", children: error })
2320
2292
  ] }),
2321
- /* @__PURE__ */ jsx5(Dialog, { open: isCreateOpen, onOpenChange: (open) => {
2293
+ /* @__PURE__ */ jsx5(Dialog2, { open: isCreateOpen, onOpenChange: (open) => {
2322
2294
  if (!open) {
2323
2295
  setIsCreateOpen(false);
2324
2296
  setNewName("");
@@ -2326,10 +2298,10 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2326
2298
  setCreateError(null);
2327
2299
  setShowValue(false);
2328
2300
  }
2329
- }, children: /* @__PURE__ */ jsxs5(DialogContent, { className: "max-w-md", children: [
2330
- /* @__PURE__ */ jsxs5(DialogHeader, { children: [
2331
- /* @__PURE__ */ jsx5(DialogTitle, { children: "Create Secret" }),
2332
- /* @__PURE__ */ jsx5(DialogDescription, { children: "Secrets are automatically exposed as environment variables across all your new sandboxes." })
2301
+ }, children: /* @__PURE__ */ jsxs5(DialogContent2, { className: "max-w-md", children: [
2302
+ /* @__PURE__ */ jsxs5(DialogHeader2, { children: [
2303
+ /* @__PURE__ */ jsx5(DialogTitle2, { children: "Create Secret" }),
2304
+ /* @__PURE__ */ jsx5(DialogDescription2, { children: "Secrets are automatically exposed as environment variables across all your new sandboxes." })
2333
2305
  ] }),
2334
2306
  /* @__PURE__ */ jsxs5(
2335
2307
  "form",
@@ -2390,7 +2362,7 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2390
2362
  }
2391
2363
  ),
2392
2364
  createError && /* @__PURE__ */ jsx5("p", { className: "mt-3 text-sm text-destructive", children: createError }),
2393
- /* @__PURE__ */ jsxs5(DialogFooter, { children: [
2365
+ /* @__PURE__ */ jsxs5(DialogFooter2, { children: [
2394
2366
  /* @__PURE__ */ jsx5(
2395
2367
  "button",
2396
2368
  {
@@ -2417,18 +2389,18 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2417
2389
  )
2418
2390
  ] })
2419
2391
  ] }) }),
2420
- /* @__PURE__ */ jsx5(Dialog, { open: !!deleteTarget, onOpenChange: (open) => {
2392
+ /* @__PURE__ */ jsx5(Dialog2, { open: !!deleteTarget, onOpenChange: (open) => {
2421
2393
  if (!open) setDeleteTarget(null);
2422
- }, children: /* @__PURE__ */ jsxs5(DialogContent, { className: "max-w-sm", children: [
2423
- /* @__PURE__ */ jsxs5(DialogHeader, { children: [
2424
- /* @__PURE__ */ jsx5(DialogTitle, { children: "Delete Secret?" }),
2425
- /* @__PURE__ */ jsxs5(DialogDescription, { children: [
2394
+ }, children: /* @__PURE__ */ jsxs5(DialogContent2, { className: "max-w-sm", children: [
2395
+ /* @__PURE__ */ jsxs5(DialogHeader2, { children: [
2396
+ /* @__PURE__ */ jsx5(DialogTitle2, { children: "Delete Secret?" }),
2397
+ /* @__PURE__ */ jsxs5(DialogDescription2, { children: [
2426
2398
  "This will permanently delete ",
2427
2399
  /* @__PURE__ */ jsx5("span", { className: "font-mono font-bold text-foreground", children: deleteTarget }),
2428
2400
  ". Sandboxes using this secret will lose access to it."
2429
2401
  ] })
2430
2402
  ] }),
2431
- /* @__PURE__ */ jsxs5(DialogFooter, { children: [
2403
+ /* @__PURE__ */ jsxs5(DialogFooter2, { children: [
2432
2404
  /* @__PURE__ */ jsx5(
2433
2405
  "button",
2434
2406
  {
@@ -2524,6 +2496,7 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2524
2496
 
2525
2497
  // src/pages/templates-page.tsx
2526
2498
  import { Layers as Layers2 } from "lucide-react";
2499
+ import { Skeleton as Skeleton3 } from "@tangle-network/ui/primitives";
2527
2500
  import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
2528
2501
  function TemplatesPage({ templates, loading = false, onUseTemplate, className }) {
2529
2502
  return /* @__PURE__ */ jsxs6("div", { className: cn("space-y-8", className), children: [
@@ -2531,7 +2504,7 @@ function TemplatesPage({ templates, loading = false, onUseTemplate, className })
2531
2504
  /* @__PURE__ */ jsx6("h1", { className: "font-bold text-3xl text-foreground", children: "Templates" }),
2532
2505
  /* @__PURE__ */ jsx6("p", { className: "mt-1 text-muted-foreground", children: "Pre-configured environments to get started quickly" })
2533
2506
  ] }),
2534
- loading || !templates ? /* @__PURE__ */ jsx6("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3", children: Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ jsx6(Skeleton, { className: "h-56 rounded-2xl" }, i)) }) : templates.length === 0 ? /* @__PURE__ */ jsxs6("div", { className: "rounded-2xl border border-border bg-card p-16 text-center", children: [
2507
+ loading || !templates ? /* @__PURE__ */ jsx6("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3", children: Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ jsx6(Skeleton3, { className: "h-56 rounded-2xl" }, i)) }) : templates.length === 0 ? /* @__PURE__ */ jsxs6("div", { className: "rounded-2xl border border-border bg-card p-16 text-center", children: [
2535
2508
  /* @__PURE__ */ jsx6(Layers2, { className: "mx-auto mb-3 h-10 w-10 text-muted-foreground" }),
2536
2509
  /* @__PURE__ */ jsx6("p", { className: "text-sm font-medium text-foreground mb-1", children: "No templates available" }),
2537
2510
  /* @__PURE__ */ jsx6("p", { className: "text-sm text-muted-foreground", children: "Check back later for pre-configured environments." })
@@ -2567,6 +2540,14 @@ import {
2567
2540
  MemoryStick,
2568
2541
  Layers as Layers3
2569
2542
  } from "lucide-react";
2543
+ import {
2544
+ Dialog as Dialog3,
2545
+ DialogContent as DialogContent3,
2546
+ DialogDescription as DialogDescription3,
2547
+ DialogFooter as DialogFooter3,
2548
+ DialogHeader as DialogHeader3,
2549
+ DialogTitle as DialogTitle3
2550
+ } from "@tangle-network/ui/primitives";
2570
2551
  import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
2571
2552
  var SCRIPT_TYPE_META = {
2572
2553
  bash: {
@@ -2937,7 +2918,7 @@ function StartupScriptsPage({ apiClient, className }) {
2937
2918
  /* @__PURE__ */ jsx7(AlertCircle3, { className: "h-5 w-5 shrink-0 text-destructive" }),
2938
2919
  /* @__PURE__ */ jsx7("p", { className: "text-sm font-medium text-destructive", children: error })
2939
2920
  ] }),
2940
- /* @__PURE__ */ jsx7(Dialog, { open: isDialogOpen, onOpenChange: setIsDialogOpen, children: /* @__PURE__ */ jsxs7(DialogContent, { className: "max-w-2xl max-h-[90vh] overflow-y-auto", children: [
2921
+ /* @__PURE__ */ jsx7(Dialog3, { open: isDialogOpen, onOpenChange: setIsDialogOpen, children: /* @__PURE__ */ jsxs7(DialogContent3, { className: "max-w-2xl max-h-[90vh] overflow-y-auto", children: [
2941
2922
  dialogStep === "picker" && /* @__PURE__ */ jsxs7(
2942
2923
  "div",
2943
2924
  {
@@ -2946,9 +2927,9 @@ function StartupScriptsPage({ apiClient, className }) {
2946
2927
  transitionDir === "back" ? "slide-in-from-left-4" : "slide-in-from-right-4"
2947
2928
  ),
2948
2929
  children: [
2949
- /* @__PURE__ */ jsxs7(DialogHeader, { children: [
2950
- /* @__PURE__ */ jsx7(DialogTitle, { children: "New Startup Script" }),
2951
- /* @__PURE__ */ jsx7(DialogDescription, { children: "Start from a template or create a blank script." })
2930
+ /* @__PURE__ */ jsxs7(DialogHeader3, { children: [
2931
+ /* @__PURE__ */ jsx7(DialogTitle3, { children: "New Startup Script" }),
2932
+ /* @__PURE__ */ jsx7(DialogDescription3, { children: "Start from a template or create a blank script." })
2952
2933
  ] }),
2953
2934
  /* @__PURE__ */ jsxs7("div", { className: "space-y-4 py-2", children: [
2954
2935
  /* @__PURE__ */ jsxs7("div", { children: [
@@ -3002,9 +2983,9 @@ function StartupScriptsPage({ apiClient, className }) {
3002
2983
  transitionDir === "forward" ? "slide-in-from-right-4" : "slide-in-from-left-4"
3003
2984
  ),
3004
2985
  children: [
3005
- /* @__PURE__ */ jsxs7(DialogHeader, { children: [
3006
- /* @__PURE__ */ jsx7(DialogTitle, { children: editingScript ? "Edit Script" : "Create Startup Script" }),
3007
- /* @__PURE__ */ jsx7(DialogDescription, { children: editingScript ? "Modify your startup script configuration." : "Define a shell script that runs when sandboxes start. Scripts execute before the AI agent." })
2986
+ /* @__PURE__ */ jsxs7(DialogHeader3, { children: [
2987
+ /* @__PURE__ */ jsx7(DialogTitle3, { children: editingScript ? "Edit Script" : "Create Startup Script" }),
2988
+ /* @__PURE__ */ jsx7(DialogDescription3, { children: editingScript ? "Modify your startup script configuration." : "Define a shell script that runs when sandboxes start. Scripts execute before the AI agent." })
3008
2989
  ] }),
3009
2990
  /* @__PURE__ */ jsxs7("div", { className: "space-y-5 py-2", children: [
3010
2991
  /* @__PURE__ */ jsxs7("div", { children: [
@@ -3280,7 +3261,7 @@ function StartupScriptsPage({ apiClient, className }) {
3280
3261
  /* @__PURE__ */ jsx7("p", { className: "text-sm text-destructive", children: formError })
3281
3262
  ] })
3282
3263
  ] }),
3283
- /* @__PURE__ */ jsxs7(DialogFooter, { className: "flex items-center justify-between sm:justify-between", children: [
3264
+ /* @__PURE__ */ jsxs7(DialogFooter3, { className: "flex items-center justify-between sm:justify-between", children: [
3284
3265
  /* @__PURE__ */ jsx7("div", { children: !editingScript && /* @__PURE__ */ jsxs7(
3285
3266
  "button",
3286
3267
  {
@@ -3320,16 +3301,16 @@ function StartupScriptsPage({ apiClient, className }) {
3320
3301
  `form-${stepKey}`
3321
3302
  )
3322
3303
  ] }) }),
3323
- /* @__PURE__ */ jsx7(Dialog, { open: !!deleteTarget, onOpenChange: () => setDeleteTarget(null), children: /* @__PURE__ */ jsxs7(DialogContent, { className: "max-w-md", children: [
3324
- /* @__PURE__ */ jsxs7(DialogHeader, { children: [
3325
- /* @__PURE__ */ jsx7(DialogTitle, { children: "Delete Startup Script" }),
3326
- /* @__PURE__ */ jsxs7(DialogDescription, { children: [
3304
+ /* @__PURE__ */ jsx7(Dialog3, { open: !!deleteTarget, onOpenChange: () => setDeleteTarget(null), children: /* @__PURE__ */ jsxs7(DialogContent3, { className: "max-w-md", children: [
3305
+ /* @__PURE__ */ jsxs7(DialogHeader3, { children: [
3306
+ /* @__PURE__ */ jsx7(DialogTitle3, { children: "Delete Startup Script" }),
3307
+ /* @__PURE__ */ jsxs7(DialogDescription3, { children: [
3327
3308
  "Are you sure you want to delete \u201C",
3328
3309
  deleteTarget?.name,
3329
3310
  "\u201D? This action cannot be undone."
3330
3311
  ] })
3331
3312
  ] }),
3332
- /* @__PURE__ */ jsxs7(DialogFooter, { children: [
3313
+ /* @__PURE__ */ jsxs7(DialogFooter3, { children: [
3333
3314
  /* @__PURE__ */ jsx7(
3334
3315
  "button",
3335
3316
  {
@@ -3574,7 +3555,6 @@ var CATEGORY_DEFAULTS = {
3574
3555
  cpuCores: 4,
3575
3556
  ramGB: 16,
3576
3557
  storageGB: 128,
3577
- modelTier: "claude-sonnet",
3578
3558
  systemPrompt: "You are a blockchain development assistant. Help with smart contract development, testing, and deployment. Follow security best practices and suggest gas optimizations where relevant.",
3579
3559
  bare: false
3580
3560
  },
@@ -3583,7 +3563,6 @@ var CATEGORY_DEFAULTS = {
3583
3563
  cpuCores: 8,
3584
3564
  ramGB: 32,
3585
3565
  storageGB: 256,
3586
- modelTier: "claude-sonnet",
3587
3566
  systemPrompt: "You are an AI/ML development assistant. Help with model training, data processing, and experiment management. Suggest efficient approaches for the available compute resources.",
3588
3567
  bare: false
3589
3568
  },
@@ -3592,7 +3571,6 @@ var CATEGORY_DEFAULTS = {
3592
3571
  cpuCores: 2,
3593
3572
  ramGB: 4,
3594
3573
  storageGB: 50,
3595
- modelTier: "claude-sonnet",
3596
3574
  systemPrompt: "You are a frontend development assistant. Help build modern, accessible, and performant user interfaces.",
3597
3575
  bare: false
3598
3576
  },
@@ -3601,7 +3579,6 @@ var CATEGORY_DEFAULTS = {
3601
3579
  cpuCores: 4,
3602
3580
  ramGB: 16,
3603
3581
  storageGB: 128,
3604
- modelTier: "claude-sonnet",
3605
3582
  systemPrompt: "You are an infrastructure and DevOps assistant. Help with service configuration, deployment, monitoring, and operational best practices.",
3606
3583
  bare: false
3607
3584
  },
@@ -3610,7 +3587,6 @@ var CATEGORY_DEFAULTS = {
3610
3587
  cpuCores: 4,
3611
3588
  ramGB: 16,
3612
3589
  storageGB: 128,
3613
- modelTier: "claude-sonnet",
3614
3590
  systemPrompt: "",
3615
3591
  bare: false
3616
3592
  }
@@ -1,54 +1,19 @@
1
- export { B as Button, a as ButtonProps, b as buttonVariants } from './button-CMQuQEW_.js';
2
- export { A as Avatar, a as AvatarFallback, b as AvatarImage, B as Badge, c as BadgeProps, C as Card, d as CardContent, e as CardDescription, f as CardFooter, g as CardHeader, h as CardTitle, D as Dialog, i as DialogClose, j as DialogContent, k as DialogDescription, l as DialogFooter, m as DialogHeader, n as DialogOverlay, o as DialogPortal, p as DialogTitle, q as DialogTrigger, r as DropZone, s as DropZoneProps, t as DropdownMenu, u as DropdownMenuCheckboxItem, v as DropdownMenuContent, w as DropdownMenuGroup, x as DropdownMenuItem, y as DropdownMenuLabel, z as DropdownMenuPortal, E as DropdownMenuRadioGroup, F as DropdownMenuRadioItem, G as DropdownMenuSeparator, H as DropdownMenuShortcut, I as DropdownMenuSub, J as DropdownMenuSubContent, K as DropdownMenuSubTrigger, L as DropdownMenuTrigger, M as EmptyState, N as EmptyStateProps, O as Input, P as InputProps, Q as Label, R as Logo, S as LogoProps, T as Progress, U as Select, V as SelectContent, W as SelectGroup, X as SelectItem, Y as SelectLabel, Z as SelectScrollDownButton, _ as SelectScrollUpButton, $ as SelectSeparator, a0 as SelectTrigger, a1 as SelectValue, a2 as SidebarDropZone, a3 as SidebarDropZoneProps, a4 as Skeleton, a5 as SkeletonCard, a6 as SkeletonTable, a7 as StatCard, a8 as StatCardProps, a9 as Switch, aa as Table, ab as TableBody, ac as TableCaption, ad as TableCell, ae as TableFooter, af as TableHead, ag as TableHeader, ah as TableRow, ai as Tabs, aj as TabsContent, ak as TabsList, al as TabsTrigger, am as TangleKnot, an as TerminalCursor, ao as TerminalDisplay, ap as TerminalInput, aq as TerminalLine, ar as Textarea, as as TextareaProps, at as Toast, au as ToastContainer, av as ToastProvider, aw as UploadFile, ax as UploadProgress, ay as UploadProgressProps, az as badgeVariants, aA as useToast } from './sidebar-drop-zone-tDBsuOH5.js';
1
+ export { Avatar, AvatarFallback, AvatarImage, Badge, BadgeProps, Button, ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CodeBlock, CodeBlockProps, CopyButton, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropZone, DropZoneProps, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStateProps, InlineCode, InlineCodeProps, Input, InputProps, Label, Progress, SegmentedControl, SegmentedControlOption, SegmentedControlProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SidebarDropZone, SidebarDropZoneProps, Skeleton, SkeletonCard, SkeletonTable, StatCard, StatCardProps, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TerminalCursor, TerminalDisplay, TerminalInput, TerminalLine, Textarea, TextareaProps, ThemeToggle, Toast, ToastContainer, ToastProvider, UploadFile, UploadProgress, UploadProgressProps, badgeVariants, buttonVariants, useTheme, useToast } from '@tangle-network/ui/primitives';
3
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
- import * as React from 'react';
5
- import 'class-variance-authority/types';
6
- import '@radix-ui/react-dialog';
7
- import 'class-variance-authority';
8
- import '@radix-ui/react-avatar';
9
- import '@radix-ui/react-dropdown-menu';
10
- import '@radix-ui/react-select';
11
- import '@radix-ui/react-tabs';
12
- import '@radix-ui/react-progress';
13
- import '@radix-ui/react-switch';
14
- import '@radix-ui/react-label';
15
3
 
16
- /**
17
- * Visually lightweight segmented control for single-value selection.
18
- *
19
- * Uses role="radiogroup" / role="radio" because this is a value-selector
20
- * with no associated panels — not a tab interface. Arrow keys navigate
21
- * between options (with wrapping), Home/End jump to first/last.
22
- *
23
- * **Accessibility:** Provide either `aria-label` or `aria-labelledby` — the
24
- * ARIA spec requires every radiogroup to have an accessible name. A dev-mode
25
- * console warning fires when both are omitted.
26
- *
27
- * Design rules baked into the default variant:
28
- * - Only the SELECTED segment shows a surface colour + accent text.
29
- * - Unselected segments have NO background — they're plain-text labels
30
- * that darken on hover. This keeps the selected segment as the
31
- * single visual anchor instead of the whole group competing with
32
- * itself.
33
- */
34
- interface SegmentedControlOption<T extends string = string> {
35
- value: T;
36
- label: React.ReactNode;
37
- /** Rendered right of the label, typically a count or status pill. */
38
- adornment?: React.ReactNode;
4
+ interface LogoProps {
5
+ variant?: "sandbox";
6
+ size?: "sm" | "md" | "lg" | "xl";
7
+ className?: string;
8
+ iconOnly?: boolean;
39
9
  }
40
- interface SegmentedControlProps<T extends string = string> extends Pick<React.HTMLAttributes<HTMLDivElement>, "id" | "className" | "aria-label" | "aria-labelledby"> {
41
- value: T;
42
- onValueChange: (value: T) => void;
43
- options: SegmentedControlOption<T>[];
44
- /**
45
- * Layout:
46
- * - "row" — horizontal pill bar (default, fits in a header region)
47
- * - "tabs" — horizontal with a bottom border so the selected pill
48
- * reads as a classic tab (used on the Team page)
49
- */
50
- variant?: "row" | "tabs";
10
+ declare function TangleKnot({ size, className }: {
11
+ size: number;
12
+ className?: string;
13
+ }): react_jsx_runtime.JSX.Element;
14
+ declare function Logo({ variant, size, className, iconOnly }: LogoProps): react_jsx_runtime.JSX.Element;
15
+ declare namespace Logo {
16
+ var displayName: string;
51
17
  }
52
- declare function SegmentedControl<T extends string = string>({ value, onValueChange, options, variant, className, ...rest }: SegmentedControlProps<T>): react_jsx_runtime.JSX.Element;
53
18
 
54
- export { SegmentedControl, type SegmentedControlOption, type SegmentedControlProps };
19
+ export { Logo, type LogoProps, TangleKnot };