@tangle-network/agent-app 0.45.47 → 0.45.49

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 (94) hide show
  1. package/dist/{DesignCanvas-P2ZVK6FM.js → DesignCanvas-JRBCAWHW.js} +2 -2
  2. package/dist/{DesignCanvasEditor-DGNCA54P.js → DesignCanvasEditor-J2OLS22G.js} +4 -4
  3. package/dist/{IntakeInterview-3ZIQMZS6.js → IntakeInterview-OKT6DCBN.js} +2 -2
  4. package/dist/InvitationsPanel-OFCYVSAE.js +9 -0
  5. package/dist/InviteAcceptPage-BDOO4JSE.js +7 -0
  6. package/dist/MembersPanel-3ZK2GCMC.js +9 -0
  7. package/dist/{TimelineEditor-OTNPJ3SN.js → TimelineEditor-52YEPDX5.js} +2 -2
  8. package/dist/VaultPane-IGJKB6CX.js +7 -0
  9. package/dist/assistant/index.d.ts +36 -11
  10. package/dist/assistant/index.js +235 -90
  11. package/dist/assistant/index.js.map +1 -1
  12. package/dist/{billing-BibxgALe.d.ts → billing-BuNlaKlE.d.ts} +15 -23
  13. package/dist/chat-react/index.js +2 -1
  14. package/dist/chat-react/index.js.map +1 -1
  15. package/dist/{chunk-TL37E5YY.js → chunk-33BN7P57.js} +6 -6
  16. package/dist/chunk-33BN7P57.js.map +1 -0
  17. package/dist/{chunk-IUSO2XRE.js → chunk-5MI2SKQH.js} +14 -15
  18. package/dist/chunk-5MI2SKQH.js.map +1 -0
  19. package/dist/{chunk-65OZT566.js → chunk-7LJYCHXK.js} +29 -27
  20. package/dist/chunk-7LJYCHXK.js.map +1 -0
  21. package/dist/chunk-AULM4X7U.js +77 -0
  22. package/dist/chunk-AULM4X7U.js.map +1 -0
  23. package/dist/{chunk-GNPN6ED4.js → chunk-CJHIAZKK.js} +128 -166
  24. package/dist/chunk-CJHIAZKK.js.map +1 -0
  25. package/dist/{chunk-54FYYXAX.js → chunk-ENLRJYVW.js} +21 -18
  26. package/dist/chunk-ENLRJYVW.js.map +1 -0
  27. package/dist/{chunk-F4XLTVQ3.js → chunk-GRDLGQ6A.js} +19 -18
  28. package/dist/chunk-GRDLGQ6A.js.map +1 -0
  29. package/dist/{chunk-BT4QFCTB.js → chunk-HSBJB46C.js} +13 -1
  30. package/dist/chunk-HSBJB46C.js.map +1 -0
  31. package/dist/{chunk-VOJB7MVG.js → chunk-I2CA5N7V.js} +70 -28
  32. package/dist/chunk-I2CA5N7V.js.map +1 -0
  33. package/dist/chunk-MLG6XKPV.js +44 -0
  34. package/dist/chunk-MLG6XKPV.js.map +1 -0
  35. package/dist/{chunk-IN6LNZ7O.js → chunk-Q2QKEV6J.js} +7 -7
  36. package/dist/{chunk-IN6LNZ7O.js.map → chunk-Q2QKEV6J.js.map} +1 -1
  37. package/dist/{chunk-B62EZF52.js → chunk-UMV45ZDF.js} +3 -3
  38. package/dist/{chunk-JJJEO4ND.js → chunk-VWTODXRW.js} +2 -2
  39. package/dist/{chunk-JJJEO4ND.js.map → chunk-VWTODXRW.js.map} +1 -1
  40. package/dist/{chunk-VCPZ3HTN.js → chunk-W7P5KV6O.js} +51 -27
  41. package/dist/chunk-W7P5KV6O.js.map +1 -0
  42. package/dist/{chunk-ZX5UT4HF.js → chunk-ZAKKG6WI.js} +354 -273
  43. package/dist/chunk-ZAKKG6WI.js.map +1 -0
  44. package/dist/{chunk-PE67O2LH.js → chunk-ZGY6QB4F.js} +21 -16
  45. package/dist/chunk-ZGY6QB4F.js.map +1 -0
  46. package/dist/design-canvas-react/index.js +18 -16
  47. package/dist/design-canvas-react/index.js.map +1 -1
  48. package/dist/design-canvas-react/lazy.js +1 -1
  49. package/dist/intakes-react/index.js +1 -1
  50. package/dist/intakes-react/lazy.js +1 -1
  51. package/dist/platform/index.d.ts +1 -1
  52. package/dist/platform/index.js +16 -16
  53. package/dist/platform/index.js.map +1 -1
  54. package/dist/sequences-react/index.js +2 -2
  55. package/dist/studio/index.d.ts +13 -1
  56. package/dist/studio/index.js +13 -1
  57. package/dist/studio-react/index.js +115 -78
  58. package/dist/studio-react/index.js.map +1 -1
  59. package/dist/studio-react/studio.css +0 -56
  60. package/dist/teams-react/index.js +4 -3
  61. package/dist/teams-react/lazy.js +3 -3
  62. package/dist/theme/index.js +1 -1
  63. package/dist/theme/tokens.css +15 -13
  64. package/dist/vault/index.js +1 -1
  65. package/dist/vault/lazy.js +1 -1
  66. package/dist/web-react/index.d.ts +16 -12
  67. package/dist/web-react/index.js +6 -4
  68. package/dist/work-product-react/index.js +9 -27
  69. package/dist/work-product-react/index.js.map +1 -1
  70. package/package.json +3 -3
  71. package/dist/InvitationsPanel-F56UOQXA.js +0 -8
  72. package/dist/InviteAcceptPage-P3QJC3C6.js +0 -7
  73. package/dist/MembersPanel-XNLF3SA4.js +0 -8
  74. package/dist/VaultPane-MUWGYVJ7.js +0 -7
  75. package/dist/chunk-54FYYXAX.js.map +0 -1
  76. package/dist/chunk-65OZT566.js.map +0 -1
  77. package/dist/chunk-BT4QFCTB.js.map +0 -1
  78. package/dist/chunk-F4XLTVQ3.js.map +0 -1
  79. package/dist/chunk-GNPN6ED4.js.map +0 -1
  80. package/dist/chunk-IUSO2XRE.js.map +0 -1
  81. package/dist/chunk-PE67O2LH.js.map +0 -1
  82. package/dist/chunk-TL37E5YY.js.map +0 -1
  83. package/dist/chunk-VCPZ3HTN.js.map +0 -1
  84. package/dist/chunk-VOJB7MVG.js.map +0 -1
  85. package/dist/chunk-ZX5UT4HF.js.map +0 -1
  86. /package/dist/{DesignCanvas-P2ZVK6FM.js.map → DesignCanvas-JRBCAWHW.js.map} +0 -0
  87. /package/dist/{DesignCanvasEditor-DGNCA54P.js.map → DesignCanvasEditor-J2OLS22G.js.map} +0 -0
  88. /package/dist/{IntakeInterview-3ZIQMZS6.js.map → IntakeInterview-OKT6DCBN.js.map} +0 -0
  89. /package/dist/{InvitationsPanel-F56UOQXA.js.map → InvitationsPanel-OFCYVSAE.js.map} +0 -0
  90. /package/dist/{InviteAcceptPage-P3QJC3C6.js.map → InviteAcceptPage-BDOO4JSE.js.map} +0 -0
  91. /package/dist/{MembersPanel-XNLF3SA4.js.map → MembersPanel-3ZK2GCMC.js.map} +0 -0
  92. /package/dist/{TimelineEditor-OTNPJ3SN.js.map → TimelineEditor-52YEPDX5.js.map} +0 -0
  93. /package/dist/{VaultPane-MUWGYVJ7.js.map → VaultPane-IGJKB6CX.js.map} +0 -0
  94. /package/dist/{chunk-B62EZF52.js.map → chunk-UMV45ZDF.js.map} +0 -0
@@ -52,7 +52,7 @@ import {
52
52
  trimClipCommand,
53
53
  trimEndDrag,
54
54
  trimStartDrag
55
- } from "../chunk-PE67O2LH.js";
55
+ } from "../chunk-ZGY6QB4F.js";
56
56
  import "../chunk-BVKQKGRK.js";
57
57
 
58
58
  // src/sequences-react/media/transcription.ts
@@ -187,7 +187,7 @@ function createWhisperTranscriptionProvider(opts) {
187
187
 
188
188
  // src/sequences-react/lazy.tsx
189
189
  import React from "react";
190
- var SequenceTimelineEditorLazy = React.lazy(() => import("../TimelineEditor-OTNPJ3SN.js"));
190
+ var SequenceTimelineEditorLazy = React.lazy(() => import("../TimelineEditor-52YEPDX5.js"));
191
191
  export {
192
192
  BrandMark,
193
193
  COMMAND_HISTORY_LIMIT,
@@ -64,6 +64,18 @@ declare function isGenerationType(value: string): value is GenerationType;
64
64
  declare const DESTINATIONS: PublishDestination[];
65
65
  /** Provide an array of predefined cadence options for scheduling or approval processes */
66
66
  declare const CADENCES: string[];
67
+ /** Provide the valid image quality values for generation requests */
68
+ declare const IMAGE_QUALITIES: readonly ["low", "medium", "high", "auto"];
69
+ /** Provide a placeholder hint listing the accepted image size values */
70
+ declare const IMAGE_SIZE_HINT = "1024x1024, 1536x1024, 1024x1536, or auto";
71
+ /** Provide a validation pattern for the free-form image size field (WxH or auto) */
72
+ declare const IMAGE_SIZE_PATTERN: string;
73
+ /** Provide the valid video duration values (seconds) for generation requests */
74
+ declare const VIDEO_DURATIONS: readonly ["4", "6", "8", "10", "12"];
75
+ /** Provide the valid video resolution values for generation requests */
76
+ declare const VIDEO_RESOLUTIONS: readonly ["720p", "1080p"];
77
+ /** Provide the valid video aspect ratio values for generation requests */
78
+ declare const VIDEO_ASPECT_RATIOS: readonly ["16:9", "9:16", "1:1"];
67
79
  /** Define the minimum number of images required for processing or validation */
68
80
  declare const MIN_IMAGE_COUNT = 1;
69
81
  /** Define the maximum number of images allowed for upload or display */
@@ -166,4 +178,4 @@ declare function failedOptimisticGeneration(generation: Generation): Generation;
166
178
  /** Normalize a value to a finite integer within the allowed image count range */
167
179
  declare function normalizeImageCount(value: unknown): number;
168
180
 
169
- export { CADENCES, DESTINATIONS, GENERATION_TYPES, type Generation, type GenerationRequestFields, type GenerationStatus, type GenerationType, MAX_IMAGE_COUNT, MIN_IMAGE_COUNT, type MediaModelCatalogResponse, type MediaModelOption, type MediaModelStatus, type PublishDestination, type PublishPackage, type StudioIntegrationConnection, buildGenerationRequestBody, buildPublishPackage, failedOptimisticGeneration, generationError, generationMergeKey, generationStatus, generationVaultPath, isDestinationConnected, isGenerationType, isLocalGeneration, isPublishPackage, latestBatchOf, mergeLiveGeneration, mergeLoaderAndLive, modelMessage, normalizeImageCount, optimisticGeneration, outputPathFor, preferredModelId, relativeTime, selectedModelsWithDefaults, userSafeGenerationMessage };
181
+ export { CADENCES, DESTINATIONS, GENERATION_TYPES, type Generation, type GenerationRequestFields, type GenerationStatus, type GenerationType, IMAGE_QUALITIES, IMAGE_SIZE_HINT, IMAGE_SIZE_PATTERN, MAX_IMAGE_COUNT, MIN_IMAGE_COUNT, type MediaModelCatalogResponse, type MediaModelOption, type MediaModelStatus, type PublishDestination, type PublishPackage, type StudioIntegrationConnection, VIDEO_ASPECT_RATIOS, VIDEO_DURATIONS, VIDEO_RESOLUTIONS, buildGenerationRequestBody, buildPublishPackage, failedOptimisticGeneration, generationError, generationMergeKey, generationStatus, generationVaultPath, isDestinationConnected, isGenerationType, isLocalGeneration, isPublishPackage, latestBatchOf, mergeLiveGeneration, mergeLoaderAndLive, modelMessage, normalizeImageCount, optimisticGeneration, outputPathFor, preferredModelId, relativeTime, selectedModelsWithDefaults, userSafeGenerationMessage };
@@ -2,8 +2,14 @@ import {
2
2
  CADENCES,
3
3
  DESTINATIONS,
4
4
  GENERATION_TYPES,
5
+ IMAGE_QUALITIES,
6
+ IMAGE_SIZE_HINT,
7
+ IMAGE_SIZE_PATTERN,
5
8
  MAX_IMAGE_COUNT,
6
9
  MIN_IMAGE_COUNT,
10
+ VIDEO_ASPECT_RATIOS,
11
+ VIDEO_DURATIONS,
12
+ VIDEO_RESOLUTIONS,
7
13
  buildGenerationRequestBody,
8
14
  buildPublishPackage,
9
15
  failedOptimisticGeneration,
@@ -26,13 +32,19 @@ import {
26
32
  relativeTime,
27
33
  selectedModelsWithDefaults,
28
34
  userSafeGenerationMessage
29
- } from "../chunk-BT4QFCTB.js";
35
+ } from "../chunk-HSBJB46C.js";
30
36
  export {
31
37
  CADENCES,
32
38
  DESTINATIONS,
33
39
  GENERATION_TYPES,
40
+ IMAGE_QUALITIES,
41
+ IMAGE_SIZE_HINT,
42
+ IMAGE_SIZE_PATTERN,
34
43
  MAX_IMAGE_COUNT,
35
44
  MIN_IMAGE_COUNT,
45
+ VIDEO_ASPECT_RATIOS,
46
+ VIDEO_DURATIONS,
47
+ VIDEO_RESOLUTIONS,
36
48
  buildGenerationRequestBody,
37
49
  buildPublishPackage,
38
50
  failedOptimisticGeneration,
@@ -1,8 +1,14 @@
1
1
  import {
2
2
  CADENCES,
3
3
  DESTINATIONS,
4
+ IMAGE_QUALITIES,
5
+ IMAGE_SIZE_HINT,
6
+ IMAGE_SIZE_PATTERN,
4
7
  MAX_IMAGE_COUNT,
5
8
  MIN_IMAGE_COUNT,
9
+ VIDEO_ASPECT_RATIOS,
10
+ VIDEO_DURATIONS,
11
+ VIDEO_RESOLUTIONS,
6
12
  buildGenerationRequestBody,
7
13
  buildPublishPackage,
8
14
  failedOptimisticGeneration,
@@ -24,7 +30,10 @@ import {
24
30
  relativeTime,
25
31
  selectedModelsWithDefaults,
26
32
  userSafeGenerationMessage
27
- } from "../chunk-BT4QFCTB.js";
33
+ } from "../chunk-HSBJB46C.js";
34
+ import {
35
+ ProviderLogo
36
+ } from "../chunk-MLG6XKPV.js";
28
37
 
29
38
  // src/studio-react/studio-workspace.tsx
30
39
  import { useRef as useRef3, useState as useState3 } from "react";
@@ -106,14 +115,15 @@ import { useIntegrations } from "@tangle-network/sandbox-ui/integrations";
106
115
  import { Sparkles } from "lucide-react";
107
116
 
108
117
  // src/studio-react/type-config.ts
109
- import { Film, FileText, Image, Mic, Video } from "lucide-react";
110
- var IMAGE = { label: "Image", icon: Image, color: "bg-[color-mix(in_srgb,#3b82f6_10%,hsl(var(--card)))] text-blue-600 border-blue-500/30" };
118
+ import { FileText, Image, Mic, User, Video } from "lucide-react";
119
+ var MEDIA_SCRIM = "bg-black/60 text-white border-white/10";
120
+ var IMAGE = { label: "Image", icon: Image, color: MEDIA_SCRIM };
111
121
  var TYPE_CONFIG = {
112
122
  image: IMAGE,
113
- video: { label: "Video", icon: Video, color: "bg-[color-mix(in_srgb,#ef4444_10%,hsl(var(--card)))] text-red-600 border-red-500/30" },
114
- avatar: { label: "Avatar", icon: Film, color: "bg-[color-mix(in_srgb,#a855f7_10%,hsl(var(--card)))] text-purple-600 border-purple-500/30" },
115
- speech: { label: "Audio", icon: Mic, color: "bg-[color-mix(in_srgb,#f97316_10%,hsl(var(--card)))] text-orange-600 border-orange-500/30" },
116
- transcription: { label: "Transcript", icon: FileText, color: "bg-[color-mix(in_srgb,#10b981_10%,hsl(var(--card)))] text-emerald-600 border-emerald-500/30" }
123
+ video: { label: "Video", icon: Video, color: MEDIA_SCRIM },
124
+ avatar: { label: "Avatar", icon: User, color: MEDIA_SCRIM },
125
+ speech: { label: "Audio", icon: Mic, color: MEDIA_SCRIM },
126
+ transcription: { label: "Transcript", icon: FileText, color: MEDIA_SCRIM }
117
127
  };
118
128
  function typeConfigFor(type) {
119
129
  return TYPE_CONFIG[type] ?? IMAGE;
@@ -134,7 +144,7 @@ function Field({
134
144
  Label,
135
145
  {
136
146
  htmlFor,
137
- className: "text-[11px] font-semibold uppercase tracking-[0.05em] text-muted-foreground",
147
+ className: "text-xs font-semibold uppercase tracking-[0.05em] text-muted-foreground",
138
148
  children: label
139
149
  }
140
150
  ),
@@ -183,7 +193,7 @@ function ComposerDisclosure({ summary, children }) {
183
193
  ] });
184
194
  }
185
195
  function NativeSelect(props) {
186
- return /* @__PURE__ */ jsx("select", { ...props, className: "h-9 w-full rounded-md border border-input bg-[var(--md3-surface-container-low)] px-3 text-sm" });
196
+ return /* @__PURE__ */ jsx("select", { ...props, className: "h-9 w-full rounded-md border border-input bg-background px-3 text-sm" });
187
197
  }
188
198
 
189
199
  // src/studio-react/image-composer.tsx
@@ -199,8 +209,17 @@ function ImageComposer({
199
209
  }) {
200
210
  return /* @__PURE__ */ jsxs2("div", { className: "space-y-3", children: [
201
211
  /* @__PURE__ */ jsxs2("div", { className: "grid grid-cols-2 gap-3", children: [
202
- /* @__PURE__ */ jsx2(Field, { label: "Size", children: /* @__PURE__ */ jsx2(Input, { value: size, onChange: (event) => onSizeChange(event.target.value), className: "bg-background" }) }),
203
- /* @__PURE__ */ jsx2(Field, { label: "Quality", children: /* @__PURE__ */ jsx2(Input, { value: quality, onChange: (event) => onQualityChange(event.target.value), className: "bg-background" }) })
212
+ /* @__PURE__ */ jsx2(Field, { label: "Size", children: /* @__PURE__ */ jsx2(
213
+ Input,
214
+ {
215
+ value: size,
216
+ onChange: (event) => onSizeChange(event.target.value),
217
+ pattern: IMAGE_SIZE_PATTERN,
218
+ placeholder: IMAGE_SIZE_HINT,
219
+ className: "bg-background"
220
+ }
221
+ ) }),
222
+ /* @__PURE__ */ jsx2(Field, { label: "Quality", children: /* @__PURE__ */ jsx2(NativeSelect, { value: quality, onChange: (event) => onQualityChange(event.target.value), children: IMAGE_QUALITIES.map((option) => /* @__PURE__ */ jsx2("option", { value: option, children: option.charAt(0).toUpperCase() + option.slice(1) }, option)) }) })
204
223
  ] }),
205
224
  /* @__PURE__ */ jsx2(Field, { label: "Images", children: /* @__PURE__ */ jsx2(
206
225
  Stepper,
@@ -228,9 +247,9 @@ function VideoComposer({
228
247
  onReferenceImageUrlChange
229
248
  }) {
230
249
  return /* @__PURE__ */ jsxs3("div", { className: "grid grid-cols-2 gap-3", children: [
231
- /* @__PURE__ */ jsx3(Field, { label: "Duration (s)", children: /* @__PURE__ */ jsx3(Input2, { value: duration, onChange: (event) => onDurationChange(event.target.value), className: "bg-background" }) }),
232
- /* @__PURE__ */ jsx3(Field, { label: "Resolution", children: /* @__PURE__ */ jsx3(Input2, { value: resolution, onChange: (event) => onResolutionChange(event.target.value), className: "bg-background" }) }),
233
- /* @__PURE__ */ jsx3(Field, { label: "Aspect ratio", children: /* @__PURE__ */ jsx3(Input2, { value: aspectRatio, onChange: (event) => onAspectRatioChange(event.target.value), className: "bg-background" }) }),
250
+ /* @__PURE__ */ jsx3(Field, { label: "Duration (s)", children: /* @__PURE__ */ jsx3(NativeSelect, { value: duration, onChange: (event) => onDurationChange(event.target.value), children: VIDEO_DURATIONS.map((option) => /* @__PURE__ */ jsx3("option", { value: option, children: option }, option)) }) }),
251
+ /* @__PURE__ */ jsx3(Field, { label: "Resolution", children: /* @__PURE__ */ jsx3(NativeSelect, { value: resolution, onChange: (event) => onResolutionChange(event.target.value), children: VIDEO_RESOLUTIONS.map((option) => /* @__PURE__ */ jsx3("option", { value: option, children: option }, option)) }) }),
252
+ /* @__PURE__ */ jsx3(Field, { label: "Aspect ratio", children: /* @__PURE__ */ jsx3(NativeSelect, { value: aspectRatio, onChange: (event) => onAspectRatioChange(event.target.value), children: VIDEO_ASPECT_RATIOS.map((option) => /* @__PURE__ */ jsx3("option", { value: option, children: option }, option)) }) }),
234
253
  /* @__PURE__ */ jsx3(Field, { label: "Reference image URL", children: /* @__PURE__ */ jsx3(Input2, { value: referenceImageUrl, onChange: (event) => onReferenceImageUrlChange(event.target.value), className: "bg-background" }) })
235
254
  ] });
236
255
  }
@@ -336,14 +355,15 @@ function TranscriptionOptions({
336
355
  /* @__PURE__ */ jsx6("option", { value: "verbose_json", children: "Verbose JSON" }),
337
356
  /* @__PURE__ */ jsx6("option", { value: "vtt", children: "VTT" })
338
357
  ] }) }),
339
- /* @__PURE__ */ jsx6(Field, { label: "Temperature", children: /* @__PURE__ */ jsx6(Input5, { type: "number", min: "0", max: "1", step: "0.1", value: temperature, onChange: (event) => onTemperatureChange(event.target.value), className: "bg-[var(--md3-surface-container-low)]" }) })
358
+ /* @__PURE__ */ jsx6(Field, { label: "Temperature", children: /* @__PURE__ */ jsx6(Input5, { type: "number", min: "0", max: "1", step: "0.1", value: temperature, onChange: (event) => onTemperatureChange(event.target.value), className: "bg-background" }) })
340
359
  ] });
341
360
  }
342
361
 
343
362
  // src/studio-react/publish-package-composer.tsx
344
363
  import { Link } from "react-router";
345
364
  import { Badge, Button, Input as Input6, Textarea } from "@tangle-network/sandbox-ui/primitives";
346
- import { AlertTriangle, CalendarClock, Check } from "lucide-react";
365
+ import { ProviderIcon } from "@tangle-network/sandbox-ui/integrations";
366
+ import { AlertTriangle, Check } from "lucide-react";
347
367
  import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
348
368
  function PublishPackageComposer({
349
369
  caption,
@@ -367,7 +387,7 @@ function PublishPackageComposer({
367
387
  connectionError ? /* @__PURE__ */ jsxs6("div", { className: "flex items-center gap-2 rounded-md border border-warning/25 bg-warning/10 px-2.5 py-1.5 text-xs text-warning", children: [
368
388
  /* @__PURE__ */ jsx7(AlertTriangle, { className: "h-3.5 w-3.5 shrink-0" }),
369
389
  "Couldn't load connected apps. Check Integrations."
370
- ] }) : /* @__PURE__ */ jsx7("p", { className: "text-xs text-muted-foreground", children: connectionsLoading ? "Checking connected apps\u2026" : "Stage captions, destinations, cadence. Saved with the generated asset." }),
390
+ ] }) : /* @__PURE__ */ jsx7("p", { className: "text-xs text-muted-foreground", children: connectionsLoading ? "Checking connected apps\u2026" : "Saved with the generated asset." }),
371
391
  integrationsHref && canManageIntegrations && /* @__PURE__ */ jsx7(Link, { to: integrationsHref, prefetch: "intent", className: "shrink-0", children: /* @__PURE__ */ jsx7(Button, { variant: "outline", size: "sm", children: "Connect" }) })
372
392
  ] }),
373
393
  /* @__PURE__ */ jsx7("div", { className: "grid gap-2", children: DESTINATIONS.map((destination) => {
@@ -380,11 +400,12 @@ function PublishPackageComposer({
380
400
  disabled: !connected,
381
401
  "aria-pressed": active,
382
402
  onClick: () => onDestinationToggle(destination.id),
383
- className: `rounded-md border p-2 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-60 ${active ? "border-primary bg-primary/10 ring-1 ring-primary/20" : "border-border bg-[var(--md3-surface-container-low)] hover:bg-accent"}`,
403
+ className: `rounded-md border p-2 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-60 ${active ? "border-primary bg-primary/10 ring-1 ring-primary/20" : "border-border bg-background hover:bg-accent"}`,
384
404
  children: [
385
405
  /* @__PURE__ */ jsxs6("div", { className: "flex items-center justify-between gap-2", children: [
386
406
  /* @__PURE__ */ jsxs6("span", { className: "flex items-center gap-1.5 text-xs font-medium text-foreground", children: [
387
407
  active && /* @__PURE__ */ jsx7(Check, { className: "h-3.5 w-3.5 text-primary" }),
408
+ /* @__PURE__ */ jsx7(ProviderIcon, { id: destination.providerIds[0] ?? destination.id, displayName: destination.label, size: 16, className: "rounded" }),
388
409
  destination.label
389
410
  ] }),
390
411
  /* @__PURE__ */ jsx7(Badge, { variant: active || connected ? "default" : "outline", children: active ? "Selected" : connected ? "Ready" : "Not connected" })
@@ -395,15 +416,11 @@ function PublishPackageComposer({
395
416
  destination.id
396
417
  );
397
418
  }) }),
398
- /* @__PURE__ */ jsx7(Field, { label: "Caption", className: "space-y-2", children: /* @__PURE__ */ jsx7(Textarea, { value: caption, onChange: (event) => onCaptionChange(event.target.value), rows: 3, placeholder: "Write or generate the caption for selected destinations...", className: "bg-[var(--md3-surface-container-low)]" }) }),
399
- /* @__PURE__ */ jsx7(Field, { label: "Description / CTA", className: "space-y-2", children: /* @__PURE__ */ jsx7(Textarea, { value: postDescription, onChange: (event) => onDescriptionChange(event.target.value), rows: 2, placeholder: "Release note, product context, link, or approval instruction...", className: "bg-[var(--md3-surface-container-low)]" }) }),
419
+ /* @__PURE__ */ jsx7(Field, { label: "Caption", className: "space-y-2", children: /* @__PURE__ */ jsx7(Textarea, { value: caption, onChange: (event) => onCaptionChange(event.target.value), rows: 3, placeholder: "Write or generate the caption for selected destinations...", className: "bg-background" }) }),
420
+ /* @__PURE__ */ jsx7(Field, { label: "Description / CTA", className: "space-y-2", children: /* @__PURE__ */ jsx7(Textarea, { value: postDescription, onChange: (event) => onDescriptionChange(event.target.value), rows: 2, placeholder: "Release note, product context, link, or approval instruction...", className: "bg-background" }) }),
400
421
  /* @__PURE__ */ jsxs6("div", { className: "grid grid-cols-2 gap-3", children: [
401
- /* @__PURE__ */ jsx7(Field, { label: "Mentions", className: "space-y-2", children: /* @__PURE__ */ jsx7(Input6, { value: mentions, onChange: (event) => onMentionsChange(event.target.value), placeholder: "@creator, @partner", className: "bg-[var(--md3-surface-container-low)]" }) }),
422
+ /* @__PURE__ */ jsx7(Field, { label: "Mentions", className: "space-y-2", children: /* @__PURE__ */ jsx7(Input6, { value: mentions, onChange: (event) => onMentionsChange(event.target.value), placeholder: "@creator, @partner", className: "bg-background" }) }),
402
423
  /* @__PURE__ */ jsx7(Field, { label: "Cadence", className: "space-y-2", children: /* @__PURE__ */ jsx7(NativeSelect, { value: cadence, onChange: (event) => onCadenceChange(event.target.value), children: CADENCES.map((option) => /* @__PURE__ */ jsx7("option", { value: option, children: option }, option)) }) })
403
- ] }),
404
- /* @__PURE__ */ jsxs6("div", { className: "flex items-center gap-2 rounded-md bg-secondary p-2 text-xs text-muted-foreground", children: [
405
- /* @__PURE__ */ jsx7(CalendarClock, { className: "h-3.5 w-3.5" }),
406
- "Publish packages stay attached to generated media and can run through connected GTM apps."
407
424
  ] })
408
425
  ] });
409
426
  }
@@ -496,10 +513,10 @@ function ComposerHero({
496
513
  if (cancelled) return;
497
514
  setMediaModels(data);
498
515
  setSelectedModels((current) => selectedModelsWithDefaults(current, data));
499
- }).catch((err) => {
516
+ }).catch(() => {
500
517
  if (cancelled) return;
501
518
  setMediaModels(null);
502
- setMediaModelsError(err instanceof Error ? err.message : "Could not load media models");
519
+ setMediaModelsError("Could not load media models");
503
520
  }).finally(() => {
504
521
  if (!cancelled) setMediaModelsLoading(false);
505
522
  });
@@ -605,7 +622,7 @@ function ComposerHero({
605
622
  const mediaTypes = Object.entries(TYPE_CONFIG);
606
623
  return /* @__PURE__ */ jsxs7("section", { className: `rounded-2xl border border-border p-5 shadow-sm ${surfaceClassName}`, children: [
607
624
  /* @__PURE__ */ jsx8("div", { className: `mb-5 ${align === "center" ? "text-center" : "text-left"}`, children: /* @__PURE__ */ jsx8(
608
- "h1",
625
+ "h2",
609
626
  {
610
627
  className: `font-semibold tracking-tight text-foreground transition-all duration-300 ${align === "center" ? "text-xl" : "text-base"}`,
611
628
  children: "Media Generation"
@@ -621,7 +638,7 @@ function ComposerHero({
621
638
  role: "tab",
622
639
  "aria-selected": active,
623
640
  onClick: () => changeType(key),
624
- className: `flex flex-col items-center gap-1.5 rounded-lg border px-1 pb-2 pt-2.5 text-[11px] transition-all ${active ? "border-primary/30 bg-primary/10 font-semibold text-primary" : "border-border bg-background font-medium text-muted-foreground hover:border-foreground/20 hover:text-foreground"}`,
641
+ className: `flex flex-col items-center gap-1.5 rounded-lg border px-1 pb-2 pt-2.5 text-xs transition-all ${active ? "border-primary/30 bg-primary/10 font-semibold text-primary" : "border-border bg-background font-medium text-muted-foreground hover:border-foreground/20 hover:text-foreground"}`,
625
642
  children: [
626
643
  /* @__PURE__ */ jsx8(Icon, { className: "h-[17px] w-[17px] shrink-0" }),
627
644
  /* @__PURE__ */ jsx8("span", { className: "truncate", children: cfg.label })
@@ -635,7 +652,7 @@ function ComposerHero({
635
652
  Label2,
636
653
  {
637
654
  htmlFor: "studio-prompt",
638
- className: "mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.05em] text-muted-foreground",
655
+ className: "mb-1.5 block text-xs font-semibold uppercase tracking-[0.05em] text-muted-foreground",
639
656
  children: "Prompt"
640
657
  }
641
658
  ),
@@ -665,13 +682,13 @@ function ComposerHero({
665
682
  setPrompt(suggestion.prompt);
666
683
  changeType(suggestion.type);
667
684
  },
668
- className: "rounded-full border border-border bg-background px-2.5 py-1 text-[11px] font-medium text-muted-foreground transition-colors hover:border-primary/30 hover:text-primary",
685
+ className: "rounded-full border border-border bg-background px-2.5 py-1 text-xs font-medium text-muted-foreground transition-colors hover:border-primary/30 hover:text-primary",
669
686
  children: suggestion.label
670
687
  },
671
688
  suggestion.label
672
689
  )) })
673
690
  ] }),
674
- type === "transcription" && /* @__PURE__ */ jsx8("p", { className: "mt-2 text-xs text-muted-foreground", children: "Optional \u2014 biases the transcript's spelling, vocabulary, and speaker names. It isn't an instruction for the model to follow." })
691
+ type === "transcription" && /* @__PURE__ */ jsx8("p", { className: "mt-2 text-xs text-muted-foreground", children: "Optional \u2014 biases spelling, vocabulary, and speaker names (not an instruction)." })
675
692
  ] }),
676
693
  type === "avatar" && /* @__PURE__ */ jsx8(
677
694
  AvatarComposer,
@@ -703,19 +720,23 @@ function ComposerHero({
703
720
  disabled: mediaModelsLoading || Boolean(mediaModelsError) || modelsForType.length === 0,
704
721
  children: [
705
722
  /* @__PURE__ */ jsx8(SelectTrigger, { id: "studio-media-model", className: "h-9 w-full bg-background", children: selectedModelOption ? /* @__PURE__ */ jsxs7("span", { className: "flex min-w-0 items-center gap-2", children: [
723
+ selectedModelOption.provider && /* @__PURE__ */ jsx8(ProviderLogo, { provider: selectedModelOption.provider, size: 14 }),
706
724
  /* @__PURE__ */ jsx8("span", { className: "truncate", children: selectedModelOption.name || selectedModelOption.id }),
707
725
  selectedModelOption.provider && /* @__PURE__ */ jsxs7("span", { className: "shrink-0 text-muted-foreground", children: [
708
726
  "\xB7 ",
709
727
  selectedModelOption.provider
710
728
  ] }),
711
- selectedModelOption.status !== "available" && /* @__PURE__ */ jsx8("span", { className: "shrink-0 rounded-full bg-warning/10 px-1.5 py-0.5 text-[11px] font-semibold uppercase tracking-[0.05em] text-warning", children: selectedModelOption.status })
729
+ selectedModelOption.status !== "available" && /* @__PURE__ */ jsx8("span", { className: "shrink-0 rounded-full bg-warning/10 px-1.5 py-0.5 text-xs font-semibold uppercase tracking-[0.05em] text-warning", children: selectedModelOption.status })
712
730
  ] }) : /* @__PURE__ */ jsx8(SelectValue, { placeholder: mediaModelsLoading ? "Loading models\u2026" : "Select a model" }) }),
713
731
  /* @__PURE__ */ jsx8(SelectContent, { className: "bg-background", children: modelsForType.map((model) => /* @__PURE__ */ jsx8(SelectItem, { value: model.id, disabled: model.status === "unavailable", children: /* @__PURE__ */ jsxs7("span", { className: "flex w-full items-center justify-between gap-3", children: [
714
- /* @__PURE__ */ jsxs7("span", { className: "truncate", children: [
715
- model.name || model.id,
716
- model.provider ? ` \xB7 ${model.provider}` : ""
732
+ /* @__PURE__ */ jsxs7("span", { className: "flex min-w-0 items-center gap-2", children: [
733
+ model.provider && /* @__PURE__ */ jsx8(ProviderLogo, { provider: model.provider, size: 14 }),
734
+ /* @__PURE__ */ jsxs7("span", { className: "truncate", children: [
735
+ model.name || model.id,
736
+ model.provider ? ` \xB7 ${model.provider}` : ""
737
+ ] })
717
738
  ] }),
718
- model.status !== "available" && /* @__PURE__ */ jsx8("span", { className: "shrink-0 text-[11px] capitalize text-muted-foreground", children: model.status })
739
+ model.status !== "available" && /* @__PURE__ */ jsx8("span", { className: "shrink-0 text-xs capitalize text-muted-foreground", children: model.status })
719
740
  ] }) }, model.id)) })
720
741
  ]
721
742
  }
@@ -757,10 +778,10 @@ function ComposerHero({
757
778
  onChange: (event) => setNegativePrompt(event.target.value),
758
779
  rows: 2,
759
780
  placeholder: "Avoid artifacts, off-style composition...",
760
- className: "bg-[var(--md3-surface-container-low)]"
781
+ className: "bg-background"
761
782
  }
762
783
  ) }),
763
- /* @__PURE__ */ jsx8(Field, { label: "Save to", children: /* @__PURE__ */ jsx8(Input7, { value: outputPath, onChange: (event) => setOutputPath(event.target.value), className: "bg-[var(--md3-surface-container-low)]" }) }),
784
+ /* @__PURE__ */ jsx8(Field, { label: "Save to", children: /* @__PURE__ */ jsx8(Input7, { value: outputPath, onChange: (event) => setOutputPath(event.target.value), className: "bg-background" }) }),
764
785
  type === "transcription" && /* @__PURE__ */ jsx8(
765
786
  TranscriptionOptions,
766
787
  {
@@ -776,7 +797,7 @@ function ComposerHero({
776
797
  {
777
798
  summary: /* @__PURE__ */ jsxs7(Fragment2, { children: [
778
799
  "Schedule a post",
779
- selectedConnectedDestinations.length > 0 && /* @__PURE__ */ jsx8(Badge2, { variant: "outline", className: "ml-1 text-[11px]", children: selectedConnectedDestinations.length })
800
+ selectedConnectedDestinations.length > 0 && /* @__PURE__ */ jsx8(Badge2, { variant: "outline", className: "ml-1 text-xs", children: selectedConnectedDestinations.length })
780
801
  ] }),
781
802
  children: /* @__PURE__ */ jsx8(
782
803
  PublishPackageComposer,
@@ -806,11 +827,20 @@ function ComposerHero({
806
827
  )
807
828
  ] }),
808
829
  error && /* @__PURE__ */ jsx8("div", { className: "mt-4 rounded-md border border-destructive/20 bg-destructive/10 p-3 text-sm text-destructive", children: error }),
809
- /* @__PURE__ */ jsxs7(Button2, { onClick: generate, disabled: !canSubmit, size: "lg", className: "mt-5 w-full", children: [
810
- /* @__PURE__ */ jsx8(Sparkles, { className: "mr-2 h-4 w-4" }),
811
- "Generate",
812
- /* @__PURE__ */ jsx8("span", { className: "ml-2 text-[11px] opacity-60", children: "\u2318\u21B5" })
813
- ] })
830
+ /* @__PURE__ */ jsxs7(
831
+ Button2,
832
+ {
833
+ onClick: generate,
834
+ disabled: !canSubmit,
835
+ size: "lg",
836
+ className: "mt-5 w-full disabled:bg-muted disabled:text-muted-foreground disabled:opacity-100",
837
+ children: [
838
+ /* @__PURE__ */ jsx8(Sparkles, { className: "mr-2 h-4 w-4" }),
839
+ "Generate",
840
+ /* @__PURE__ */ jsx8("span", { className: "ml-2 text-xs opacity-60", children: "\u2318\u21B5" })
841
+ ]
842
+ }
843
+ )
814
844
  ] });
815
845
  }
816
846
 
@@ -826,12 +856,12 @@ function StudioHeader({
826
856
  return /* @__PURE__ */ jsx9("header", { className: "sticky top-0 z-20 border-b border-border bg-card", children: /* @__PURE__ */ jsxs8("div", { className: "mx-auto flex w-full max-w-3xl items-center justify-between gap-3 px-4 py-3 sm:px-6", children: [
827
857
  /* @__PURE__ */ jsxs8("div", { className: "min-w-0", children: [
828
858
  /* @__PURE__ */ jsx9("h1", { className: "text-lg font-semibold tracking-tight text-foreground", children: "Studio" }),
829
- /* @__PURE__ */ jsx9("p", { className: "truncate text-xs text-muted-foreground", children: canGenerate ? "Generate images, video, voice, avatars, and transcripts." : "Browse images, video, voice, avatars, and transcripts your team has created." })
859
+ /* @__PURE__ */ jsx9("p", { className: "truncate text-xs text-muted-foreground", children: canGenerate ? "Generate images, video, voice, avatars, and transcripts." : "Browse your team's generations." })
830
860
  ] }),
831
861
  /* @__PURE__ */ jsxs8(Button3, { size: "sm", variant: "outline", onClick: onOpenLibrary, className: "shrink-0", children: [
832
862
  /* @__PURE__ */ jsx9(Images, { className: "mr-1.5 h-4 w-4" }),
833
863
  "Library",
834
- count > 0 && /* @__PURE__ */ jsx9("span", { className: "ml-2 inline-flex h-5 min-w-5 items-center justify-center rounded-full bg-primary/15 px-1.5 text-[11px] font-semibold text-primary", children: count })
864
+ count > 0 && /* @__PURE__ */ jsx9("span", { className: "ml-2 inline-flex h-5 min-w-5 items-center justify-center rounded-full bg-primary/15 px-1.5 text-xs font-semibold text-primary", children: count })
835
865
  ] })
836
866
  ] }) });
837
867
  }
@@ -850,17 +880,21 @@ function ResultCanvas({
850
880
  return /* @__PURE__ */ jsxs9("section", { className: `${cardClass} flex min-h-[180px] flex-col items-center justify-center gap-2 p-8 text-center`, children: [
851
881
  /* @__PURE__ */ jsx10("div", { className: "flex h-12 w-12 items-center justify-center rounded-full bg-muted", children: /* @__PURE__ */ jsx10(Sparkles2, { className: "h-6 w-6 text-muted-foreground/40" }) }),
852
882
  /* @__PURE__ */ jsx10("p", { className: "text-sm font-medium text-foreground", children: "Your creations appear here" }),
853
- /* @__PURE__ */ jsx10("p", { className: "max-w-xs text-xs text-muted-foreground", children: "Write a prompt above and hit Generate \u2014 your latest result blooms here, and everything lives in your library." })
883
+ /* @__PURE__ */ jsx10("p", { className: "max-w-xs text-xs text-muted-foreground", children: "Generate above \u2014 results appear here and are saved to your library." })
854
884
  ] });
855
885
  }
856
886
  const cfg = typeConfigFor(batch[0]?.type ?? "image");
887
+ const Icon = cfg.icon;
857
888
  const statuses = batch.map(generationStatus);
858
889
  const runLabel = statuses.some((s) => s === "pending" || s === "running") ? "Generating\u2026" : statuses.every((s) => s === "failed") ? "Last run failed" : "Latest creation";
859
890
  const isWorking = statuses.some((s) => s === "pending" || s === "running");
860
891
  return /* @__PURE__ */ jsxs9("section", { className: `${cardClass} p-5`, children: [
861
892
  /* @__PURE__ */ jsxs9("div", { className: "mb-3 flex items-center justify-between gap-3", children: [
862
893
  /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2", children: [
863
- /* @__PURE__ */ jsx10(Badge3, { variant: "outline", className: `${cfg.color} text-[11px]`, children: cfg.label }),
894
+ /* @__PURE__ */ jsxs9(Badge3, { variant: "outline", className: `${cfg.color} gap-1 text-xs`, children: [
895
+ /* @__PURE__ */ jsx10(Icon, { className: "h-3 w-3" }),
896
+ cfg.label
897
+ ] }),
864
898
  /* @__PURE__ */ jsx10("span", { className: "text-sm font-medium text-foreground", children: runLabel }),
865
899
  isWorking && /* @__PURE__ */ jsx10("span", { className: "h-2 w-2 animate-pulse rounded-full bg-primary" })
866
900
  ] }),
@@ -887,7 +921,7 @@ function ResultCanvas({
887
921
  },
888
922
  generation.id
889
923
  )) }),
890
- batch.length > 1 && /* @__PURE__ */ jsxs9("p", { className: "mt-2 text-xs text-muted-foreground", children: [
924
+ batch.length > 1 && !isWorking && /* @__PURE__ */ jsxs9("p", { className: "mt-2 text-xs text-muted-foreground", children: [
891
925
  batch.length,
892
926
  " results from this run"
893
927
  ] })
@@ -959,7 +993,7 @@ function StudioSheet({
959
993
 
960
994
  // src/studio-react/generation-grid.tsx
961
995
  import { EmptyState } from "@tangle-network/sandbox-ui/primitives";
962
- import { Film as Film2, Sparkles as Sparkles3 } from "lucide-react";
996
+ import { Film, Sparkles as Sparkles3 } from "lucide-react";
963
997
 
964
998
  // src/studio-react/generation-card.tsx
965
999
  import { Card, CardContent, Badge as Badge4 } from "@tangle-network/sandbox-ui/primitives";
@@ -975,32 +1009,32 @@ function GenerationCard({
975
1009
  const publishPackage = generation.metadata?.publishPackage;
976
1010
  return /* @__PURE__ */ jsx12("button", { type: "button", onClick: () => onSelect(generation), className: "group text-left animate-row-in", children: /* @__PURE__ */ jsxs11(Card, { className: "overflow-hidden transition-all group-hover:border-primary/50 group-hover:shadow-md", children: [
977
1011
  /* @__PURE__ */ jsxs11("div", { className: "relative aspect-video bg-secondary", children: [
978
- generation.type === "image" && generation.result ? /* @__PURE__ */ jsx12("img", { src: generation.result, alt: generation.prompt, className: "h-full w-full object-cover" }) : (generation.type === "video" || generation.type === "avatar") && generation.result ? /* @__PURE__ */ jsx12("video", { src: generation.result, className: "h-full w-full object-cover", muted: true }) : generation.type === "speech" && generation.result ? /* @__PURE__ */ jsx12("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2", children: [
979
- /* @__PURE__ */ jsx12(Icon, { className: "h-6 w-6 text-muted-foreground/40" }),
980
- /* @__PURE__ */ jsx12("span", { className: "text-xs text-muted-foreground", children: "Audio" })
981
- ] }) }) : generation.type === "transcription" && generation.result ? /* @__PURE__ */ jsx12("div", { className: "flex h-full items-center justify-center p-4", children: /* @__PURE__ */ jsx12("p", { className: "line-clamp-5 text-xs text-muted-foreground", children: generation.result }) }) : status === "pending" || status === "running" ? /* @__PURE__ */ jsx12("div", { className: "shimmer h-full w-full" }) : /* @__PURE__ */ jsx12("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsx12(Icon, { className: "h-8 w-8 text-muted-foreground/20" }) }),
982
- /* @__PURE__ */ jsx12("div", { className: "absolute left-2 top-2", children: /* @__PURE__ */ jsx12(Badge4, { variant: "outline", className: `${cfg.color} text-[11px]`, children: cfg.label }) }),
1012
+ generation.type === "image" && generation.result ? /* @__PURE__ */ jsx12("img", { src: generation.result, alt: generation.prompt, className: "h-full w-full object-cover" }) : (generation.type === "video" || generation.type === "avatar") && generation.result ? /* @__PURE__ */ jsx12("video", { src: generation.result, className: "h-full w-full object-cover", muted: true }) : generation.type === "speech" && generation.result ? /* @__PURE__ */ jsx12("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsx12(Icon, { className: "h-6 w-6 text-muted-foreground/40" }) }) : generation.type === "transcription" && generation.result ? /* @__PURE__ */ jsx12("div", { className: "flex h-full items-center justify-center p-4", children: /* @__PURE__ */ jsx12("p", { className: "line-clamp-5 text-xs text-muted-foreground", children: generation.result }) }) : status === "pending" || status === "running" ? /* @__PURE__ */ jsx12("div", { className: "shimmer h-full w-full" }) : /* @__PURE__ */ jsx12("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsx12(Icon, { className: "h-8 w-8 text-muted-foreground/20" }) }),
1013
+ /* @__PURE__ */ jsx12("div", { className: "absolute left-2 top-2", children: /* @__PURE__ */ jsxs11(Badge4, { variant: "outline", className: `${cfg.color} gap-1 text-xs`, children: [
1014
+ /* @__PURE__ */ jsx12(Icon, { className: "h-3 w-3" }),
1015
+ cfg.label
1016
+ ] }) }),
983
1017
  /* @__PURE__ */ jsx12(GenerationStatusBadge, { generation })
984
1018
  ] }),
985
1019
  /* @__PURE__ */ jsxs11(CardContent, { className: "p-3", children: [
986
- /* @__PURE__ */ jsx12("p", { className: "mb-2 line-clamp-2 text-xs text-foreground", children: generation.prompt }),
987
- status === "failed" && /* @__PURE__ */ jsx12("p", { className: "mb-2 line-clamp-2 text-[11px] text-destructive", children: generationError(generation) }),
1020
+ /* @__PURE__ */ jsx12("p", { className: "mb-2 line-clamp-2 text-sm font-medium text-foreground", children: generation.prompt }),
1021
+ status === "failed" && /* @__PURE__ */ jsx12("p", { className: "mb-2 line-clamp-2 text-xs text-destructive", children: generationError(generation) }),
988
1022
  /* @__PURE__ */ jsxs11("div", { className: "flex items-center justify-between", children: [
989
- generation.model && /* @__PURE__ */ jsx12("span", { className: "truncate text-[11px] text-muted-foreground", children: generation.model }),
1023
+ generation.model && /* @__PURE__ */ jsx12("span", { className: "truncate text-xs text-muted-foreground", children: generation.model }),
990
1024
  /* @__PURE__ */ jsxs11("div", { className: "flex shrink-0 items-center gap-2", children: [
991
- generation.cost != null && /* @__PURE__ */ jsxs11("span", { className: "text-[11px] text-muted-foreground", children: [
1025
+ generation.cost != null && /* @__PURE__ */ jsxs11("span", { className: "text-xs text-muted-foreground", children: [
992
1026
  "$",
993
1027
  generation.cost.toFixed(3)
994
1028
  ] }),
995
- /* @__PURE__ */ jsx12("span", { className: "text-[11px] text-muted-foreground", children: relativeTime(generation.createdAt) })
1029
+ /* @__PURE__ */ jsx12("span", { className: "text-xs text-muted-foreground", children: relativeTime(generation.createdAt) })
996
1030
  ] })
997
1031
  ] }),
998
1032
  isPublishPackage(publishPackage) && /* @__PURE__ */ jsxs11("div", { className: "mt-3 rounded-md border border-border bg-secondary p-2", children: [
999
- /* @__PURE__ */ jsxs11("div", { className: "mb-1 flex items-center gap-1.5 text-[11px] font-medium text-foreground", children: [
1033
+ /* @__PURE__ */ jsxs11("div", { className: "mb-1 flex items-center gap-1.5 text-xs font-medium text-foreground", children: [
1000
1034
  /* @__PURE__ */ jsx12(Send, { className: "h-3 w-3" }),
1001
- (publishPackage.destinations ?? []).join(", ") || "Publish package"
1035
+ (publishPackage.destinations ?? []).map((id) => DESTINATIONS.find((destination) => destination.id === id)?.label ?? id).join(", ") || "Publish package"
1002
1036
  ] }),
1003
- /* @__PURE__ */ jsx12("p", { className: "line-clamp-2 text-[11px] text-muted-foreground", children: publishPackage.caption || "Caption pending" })
1037
+ /* @__PURE__ */ jsx12("p", { className: "line-clamp-2 text-xs text-muted-foreground", children: publishPackage.caption || "Caption pending" })
1004
1038
  ] })
1005
1039
  ] })
1006
1040
  ] }) });
@@ -1013,7 +1047,7 @@ function GenerationStatusBadge({
1013
1047
  if (status === "succeeded") return null;
1014
1048
  const label = status === "failed" ? "Failed" : status === "running" ? "Running" : "Pending";
1015
1049
  const className = status === "failed" ? "border-destructive/30 bg-[color-mix(in_srgb,hsl(var(--destructive))_10%,hsl(var(--card)))] text-destructive" : "border-warning/30 bg-[color-mix(in_srgb,hsl(var(--warning))_10%,hsl(var(--card)))] text-warning";
1016
- return /* @__PURE__ */ jsx12("div", { className: inline ? "" : "absolute bottom-2 left-2", children: /* @__PURE__ */ jsx12(Badge4, { variant: "outline", className: `${className} text-[11px]`, children: label }) });
1050
+ return /* @__PURE__ */ jsx12("div", { className: inline ? "" : "absolute bottom-2 left-2", children: /* @__PURE__ */ jsx12(Badge4, { variant: "outline", className: `${className} text-xs`, children: label }) });
1017
1051
  }
1018
1052
 
1019
1053
  // src/studio-react/generation-grid.tsx
@@ -1031,7 +1065,7 @@ function GenerationGrid({
1031
1065
  return /* @__PURE__ */ jsx13(
1032
1066
  EmptyState,
1033
1067
  {
1034
- icon: typeFilter ? /* @__PURE__ */ jsx13(Film2, { className: "h-8 w-8 text-muted-foreground/30" }) : /* @__PURE__ */ jsx13(Sparkles3, { className: "h-10 w-10 text-muted-foreground/30" }),
1068
+ icon: typeFilter ? /* @__PURE__ */ jsx13(Film, { className: "h-8 w-8 text-muted-foreground/30" }) : /* @__PURE__ */ jsx13(Sparkles3, { className: "h-10 w-10 text-muted-foreground/30" }),
1035
1069
  title: typeFilter ? `No ${TYPE_CONFIG[typeFilter]?.label ?? typeFilter} generations` : "No generations yet",
1036
1070
  description: typeFilter ? "Try a different filter or change the type in the composer." : "Everything you and the agent create lives here.",
1037
1071
  className: "py-16"
@@ -1058,34 +1092,37 @@ function GenerationDetail({
1058
1092
  return /* @__PURE__ */ jsxs12("div", { className: "space-y-4", children: [
1059
1093
  /* @__PURE__ */ jsx14("div", { className: "overflow-hidden rounded-lg bg-secondary", children: generation.type === "image" && generation.result ? /* @__PURE__ */ jsx14("img", { src: generation.result, alt: generation.prompt, className: "max-h-[420px] w-full object-contain" }) : (generation.type === "video" || generation.type === "avatar") && generation.result ? /* @__PURE__ */ jsx14("video", { src: generation.result, controls: true, className: "max-h-[420px] w-full" }) : generation.type === "speech" && generation.result ? /* @__PURE__ */ jsx14("div", { className: "p-6", children: /* @__PURE__ */ jsx14("audio", { src: generation.result, controls: true, className: "w-full" }) }) : /* @__PURE__ */ jsx14("div", { className: "flex h-32 items-center justify-center", children: /* @__PURE__ */ jsx14(Icon, { className: "h-8 w-8 text-muted-foreground/20" }) }) }),
1060
1094
  /* @__PURE__ */ jsxs12("div", { className: "flex flex-wrap items-center gap-2", children: [
1061
- /* @__PURE__ */ jsx14(Badge5, { variant: "outline", className: cfg.color, children: cfg.label }),
1095
+ /* @__PURE__ */ jsxs12(Badge5, { variant: "outline", className: `${cfg.color} gap-1`, children: [
1096
+ /* @__PURE__ */ jsx14(Icon, { className: "h-3 w-3" }),
1097
+ cfg.label
1098
+ ] }),
1062
1099
  /* @__PURE__ */ jsx14(GenerationStatusBadge, { generation, inline: true }),
1063
1100
  generationError(generation) && /* @__PURE__ */ jsx14("span", { className: "text-xs text-destructive", children: generationError(generation) })
1064
1101
  ] }),
1065
1102
  /* @__PURE__ */ jsxs12("div", { children: [
1066
- /* @__PURE__ */ jsx14("span", { className: "mb-1 block text-xs font-medium text-muted-foreground", children: "Prompt" }),
1103
+ /* @__PURE__ */ jsx14("span", { className: "mb-1 block text-xs font-semibold uppercase tracking-[0.05em] text-muted-foreground", children: "Prompt" }),
1067
1104
  /* @__PURE__ */ jsx14("p", { className: "text-sm text-foreground", children: generation.prompt })
1068
1105
  ] }),
1069
1106
  /* @__PURE__ */ jsxs12("div", { className: "flex flex-wrap items-center gap-4", children: [
1070
1107
  generation.model && /* @__PURE__ */ jsxs12("div", { children: [
1071
- /* @__PURE__ */ jsx14("span", { className: "block text-[11px] font-medium text-muted-foreground", children: "Model" }),
1108
+ /* @__PURE__ */ jsx14("span", { className: "block text-xs font-semibold uppercase tracking-[0.05em] text-muted-foreground", children: "Model" }),
1072
1109
  /* @__PURE__ */ jsx14("span", { className: "text-xs text-foreground", children: generation.model })
1073
1110
  ] }),
1074
1111
  generation.cost != null && /* @__PURE__ */ jsxs12("div", { children: [
1075
- /* @__PURE__ */ jsx14("span", { className: "block text-[11px] font-medium text-muted-foreground", children: "Cost" }),
1112
+ /* @__PURE__ */ jsx14("span", { className: "block text-xs font-semibold uppercase tracking-[0.05em] text-muted-foreground", children: "Cost" }),
1076
1113
  /* @__PURE__ */ jsxs12("span", { className: "text-xs text-foreground", children: [
1077
1114
  "$",
1078
- generation.cost.toFixed(4)
1115
+ generation.cost.toFixed(3)
1079
1116
  ] })
1080
1117
  ] }),
1081
1118
  generation.createdAt && /* @__PURE__ */ jsxs12("div", { children: [
1082
- /* @__PURE__ */ jsx14("span", { className: "block text-[11px] font-medium text-muted-foreground", children: "Created" }),
1083
- /* @__PURE__ */ jsx14("span", { className: "text-xs text-foreground", children: new Date(generation.createdAt).toLocaleString() })
1119
+ /* @__PURE__ */ jsx14("span", { className: "block text-xs font-semibold uppercase tracking-[0.05em] text-muted-foreground", children: "Created" }),
1120
+ /* @__PURE__ */ jsx14("span", { className: "text-xs text-foreground", children: new Date(generation.createdAt).toLocaleString("en-US", { dateStyle: "medium", timeStyle: "short" }) })
1084
1121
  ] })
1085
1122
  ] }),
1086
1123
  generation.type === "transcription" && generation.result && /* @__PURE__ */ jsxs12("div", { children: [
1087
- /* @__PURE__ */ jsx14("span", { className: "mb-1 block text-xs font-medium text-muted-foreground", children: "Transcription" }),
1088
- /* @__PURE__ */ jsx14("pre", { className: "max-h-64 overflow-y-auto whitespace-pre-wrap rounded-lg bg-secondary p-4 text-sm text-foreground", children: generation.result })
1124
+ /* @__PURE__ */ jsx14("span", { className: "mb-1 block text-xs font-semibold uppercase tracking-[0.05em] text-muted-foreground", children: "Transcription" }),
1125
+ /* @__PURE__ */ jsx14("pre", { className: "max-h-64 overflow-y-auto whitespace-pre-wrap rounded-lg bg-secondary p-4 font-mono text-[13px] tabular-nums text-foreground", children: generation.result })
1089
1126
  ] }),
1090
1127
  href && /* @__PURE__ */ jsx14("div", { className: "border-t border-border pt-2", children: /* @__PURE__ */ jsx14(Link2, { to: href, prefetch: "intent", onClick: onNavigate, children: /* @__PURE__ */ jsxs12(Button4, { size: "sm", variant: "outline", children: [
1091
1128
  /* @__PURE__ */ jsx14(FolderOpen, { className: "mr-1.5 h-3.5 w-3.5" }),
@@ -1241,7 +1278,7 @@ function StudioWorkspace({
1241
1278
  ] }) : /* @__PURE__ */ jsxs14("section", { className: "flex flex-col items-center justify-center gap-3 rounded-xl border border-border bg-card p-10 text-center shadow-sm", children: [
1242
1279
  /* @__PURE__ */ jsx16("div", { className: "flex h-12 w-12 items-center justify-center rounded-full bg-muted", children: /* @__PURE__ */ jsx16(Images2, { className: "h-6 w-6 text-muted-foreground/40" }) }),
1243
1280
  /* @__PURE__ */ jsx16("p", { className: "text-sm font-medium text-foreground", children: mergedGenerations.length > 0 ? `${mergedGenerations.length} asset${mergedGenerations.length !== 1 ? "s" : ""} in this workspace` : "No generations yet" }),
1244
- /* @__PURE__ */ jsx16("p", { className: "max-w-sm text-xs text-muted-foreground", children: "When workspace members generate images, video, voice, avatars, or transcripts, they appear in the library." }),
1281
+ /* @__PURE__ */ jsx16("p", { className: "max-w-sm text-xs text-muted-foreground", children: "Team generations appear in the library." }),
1245
1282
  /* @__PURE__ */ jsxs14(Button6, { size: "sm", variant: "outline", onClick: openLibrary, children: [
1246
1283
  /* @__PURE__ */ jsx16(Images2, { className: "mr-1.5 h-4 w-4" }),
1247
1284
  "Open library"
@@ -1289,7 +1326,7 @@ function LibraryPanel({
1289
1326
  const visible = useMemo4(() => filterGenerations(generations, typeFilter), [generations, typeFilter]);
1290
1327
  return /* @__PURE__ */ jsxs15("div", { className: "flex min-w-0 flex-col", children: [
1291
1328
  /* @__PURE__ */ jsxs15("div", { className: "mb-4 flex flex-wrap items-center justify-between gap-3", children: [
1292
- /* @__PURE__ */ jsx17(Tabs2, { value: typeFilter ?? "all", onValueChange: (v) => onFilterChange(v === "all" ? null : v), children: /* @__PURE__ */ jsxs15(TabsList2, { className: "h-9 justify-start gap-1 overflow-x-auto overflow-y-hidden rounded-lg border border-border bg-[var(--md3-surface-container-low)] p-1", children: [
1329
+ /* @__PURE__ */ jsx17(Tabs2, { value: typeFilter ?? "all", onValueChange: (v) => onFilterChange(v === "all" ? null : v), children: /* @__PURE__ */ jsxs15(TabsList2, { className: "h-9 justify-start gap-1 overflow-x-auto overflow-y-hidden rounded-lg border border-border bg-background p-1", children: [
1293
1330
  /* @__PURE__ */ jsx17(
1294
1331
  TabsTrigger2,
1295
1332
  {
@@ -1337,7 +1374,7 @@ function GenerationDetailModal({
1337
1374
  return /* @__PURE__ */ jsx18(Dialog2, { open: generation != null, onOpenChange: (open) => {
1338
1375
  if (!open) onClose();
1339
1376
  }, children: /* @__PURE__ */ jsxs16(DialogContent, { className: "max-h-[85vh] max-w-2xl overflow-y-auto border-card-edge bg-popover shadow-overlay", children: [
1340
- /* @__PURE__ */ jsx18(DialogHeader, { children: /* @__PURE__ */ jsx18(DialogTitle, { className: "text-left text-base", children: cfg?.label ?? "Generation" }) }),
1377
+ /* @__PURE__ */ jsx18(DialogHeader, { children: /* @__PURE__ */ jsx18(DialogTitle, { className: "text-left text-[15px] font-semibold", children: cfg ? `${cfg.label} generation` : "Generation" }) }),
1341
1378
  generation && /* @__PURE__ */ jsx18(GenerationDetail, { generation, vaultHref, onNavigate: onClose })
1342
1379
  ] }) });
1343
1380
  }