@tangle-network/agent-app 0.35.0 → 0.37.1
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/chunk-DTS5TZRN.js +293 -0
- package/dist/chunk-DTS5TZRN.js.map +1 -0
- package/dist/{chunk-GZGF3JWQ.js → chunk-FFBZJEBE.js} +226 -171
- package/dist/chunk-FFBZJEBE.js.map +1 -0
- package/dist/{chunk-MH6AVXQ7.js → chunk-VT5DI6GL.js} +40 -34
- package/dist/chunk-VT5DI6GL.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/sandbox/index.d.ts +22 -26
- package/dist/sandbox/index.js +2 -2
- package/dist/studio/index.d.ts +132 -0
- package/dist/studio/index.js +59 -0
- package/dist/studio/index.js.map +1 -0
- package/dist/studio-react/index.d.ts +193 -0
- package/dist/studio-react/index.js +1217 -0
- package/dist/studio-react/index.js.map +1 -0
- package/dist/studio-react/studio.css +73 -0
- package/dist/tools/index.js +1 -1
- package/dist/web-react/index.js +31 -13
- package/dist/web-react/index.js.map +1 -1
- package/package.json +38 -6
- package/dist/chunk-GZGF3JWQ.js.map +0 -1
- package/dist/chunk-MH6AVXQ7.js.map +0 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
interface StudioIntegrationConnection {
|
|
2
|
+
status: string;
|
|
3
|
+
providerId: string;
|
|
4
|
+
connectorId: string;
|
|
5
|
+
}
|
|
6
|
+
type GenerationType = 'image' | 'video' | 'speech' | 'avatar' | 'transcription';
|
|
7
|
+
type GenerationStatus = 'pending' | 'running' | 'succeeded' | 'failed';
|
|
8
|
+
type MediaModelStatus = 'available' | 'limited' | 'unavailable';
|
|
9
|
+
interface Generation {
|
|
10
|
+
id: string;
|
|
11
|
+
type: string;
|
|
12
|
+
prompt: string;
|
|
13
|
+
result: string | null;
|
|
14
|
+
model: string | null;
|
|
15
|
+
cost: number | null;
|
|
16
|
+
createdAt: Date | null;
|
|
17
|
+
metadata: Record<string, unknown> | null;
|
|
18
|
+
}
|
|
19
|
+
interface MediaModelOption {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
provider?: string;
|
|
23
|
+
type: GenerationType;
|
|
24
|
+
status: MediaModelStatus;
|
|
25
|
+
reason?: string;
|
|
26
|
+
}
|
|
27
|
+
interface MediaModelCatalogResponse {
|
|
28
|
+
defaults: Record<GenerationType, string>;
|
|
29
|
+
models: Record<GenerationType, MediaModelOption[]>;
|
|
30
|
+
error?: string;
|
|
31
|
+
}
|
|
32
|
+
interface PublishPackage {
|
|
33
|
+
caption: string;
|
|
34
|
+
description: string;
|
|
35
|
+
mentions: string[];
|
|
36
|
+
destinations: string[];
|
|
37
|
+
cadence: string;
|
|
38
|
+
workflowDraft: boolean;
|
|
39
|
+
evalContract: {
|
|
40
|
+
artifactType: string;
|
|
41
|
+
deterministicChecks: string[];
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
interface PublishDestination {
|
|
45
|
+
id: string;
|
|
46
|
+
label: string;
|
|
47
|
+
providerIds: string[];
|
|
48
|
+
fields: string;
|
|
49
|
+
}
|
|
50
|
+
declare const GENERATION_TYPES: readonly GenerationType[];
|
|
51
|
+
declare function isGenerationType(value: string): value is GenerationType;
|
|
52
|
+
declare const DESTINATIONS: PublishDestination[];
|
|
53
|
+
declare const CADENCES: string[];
|
|
54
|
+
declare const MIN_IMAGE_COUNT = 1;
|
|
55
|
+
declare const MAX_IMAGE_COUNT = 4;
|
|
56
|
+
declare function relativeTime(date: Date | null): string;
|
|
57
|
+
declare function outputPathFor(type: GenerationType): string;
|
|
58
|
+
declare function generationVaultPath(generation: Generation): string | null;
|
|
59
|
+
declare function buildPublishPackage({ caption, postDescription, mentions, cadence, destinations, }: {
|
|
60
|
+
caption: string;
|
|
61
|
+
postDescription: string;
|
|
62
|
+
mentions: string;
|
|
63
|
+
cadence: string;
|
|
64
|
+
destinations: string[];
|
|
65
|
+
}): PublishPackage | null;
|
|
66
|
+
declare function isPublishPackage(value: unknown): value is {
|
|
67
|
+
caption?: string;
|
|
68
|
+
description?: string;
|
|
69
|
+
mentions?: string[];
|
|
70
|
+
destinations?: string[];
|
|
71
|
+
cadence?: string;
|
|
72
|
+
};
|
|
73
|
+
declare function isDestinationConnected(destination: PublishDestination, connections: StudioIntegrationConnection[]): boolean;
|
|
74
|
+
declare function selectedModelsWithDefaults(current: Partial<Record<GenerationType, string>>, catalog: MediaModelCatalogResponse): Partial<Record<GenerationType, string>>;
|
|
75
|
+
declare function preferredModelId(type: GenerationType, catalog: MediaModelCatalogResponse | null): string | undefined;
|
|
76
|
+
declare function modelMessage(model: MediaModelOption | undefined, loading: boolean, count: number): string | null;
|
|
77
|
+
interface GenerationRequestFields {
|
|
78
|
+
workspaceId: string;
|
|
79
|
+
clientRequestId: string;
|
|
80
|
+
type: GenerationType;
|
|
81
|
+
model: string;
|
|
82
|
+
prompt: string;
|
|
83
|
+
negativePrompt: string;
|
|
84
|
+
outputPath: string;
|
|
85
|
+
publishPackage: PublishPackage | null;
|
|
86
|
+
image: {
|
|
87
|
+
size: string;
|
|
88
|
+
quality: string;
|
|
89
|
+
count: number;
|
|
90
|
+
};
|
|
91
|
+
video: {
|
|
92
|
+
duration: string;
|
|
93
|
+
resolution: string;
|
|
94
|
+
aspectRatio: string;
|
|
95
|
+
referenceImageUrl: string;
|
|
96
|
+
};
|
|
97
|
+
speech: {
|
|
98
|
+
voice: string;
|
|
99
|
+
};
|
|
100
|
+
avatar: {
|
|
101
|
+
audioUrl: string;
|
|
102
|
+
imageUrl: string;
|
|
103
|
+
avatarId: string;
|
|
104
|
+
};
|
|
105
|
+
transcription: {
|
|
106
|
+
audioUrl: string;
|
|
107
|
+
language: string;
|
|
108
|
+
responseFormat: string;
|
|
109
|
+
temperature: string;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
declare function buildGenerationRequestBody(fields: GenerationRequestFields): Record<string, unknown>;
|
|
113
|
+
declare function generationStatus(generation: Generation): GenerationStatus;
|
|
114
|
+
declare function generationError(generation: Generation): string | null;
|
|
115
|
+
declare function generationMergeKey(generation: Generation): string | null;
|
|
116
|
+
declare function mergeLiveGeneration(current: Generation[], generation: Generation): Generation[];
|
|
117
|
+
declare function mergeLoaderAndLive(loader: Generation[], live: Generation[]): Generation[];
|
|
118
|
+
declare function isLocalGeneration(generation: Generation): boolean;
|
|
119
|
+
declare function latestBatchOf(generations: Generation[]): Generation[];
|
|
120
|
+
declare function userSafeGenerationMessage(message?: string): string;
|
|
121
|
+
declare function optimisticGeneration({ type, prompt, model, clientRequestId, outputIndex, outputCount, }: {
|
|
122
|
+
type: GenerationType;
|
|
123
|
+
prompt: string;
|
|
124
|
+
model?: string;
|
|
125
|
+
clientRequestId: string;
|
|
126
|
+
outputIndex?: number;
|
|
127
|
+
outputCount?: number;
|
|
128
|
+
}): Generation;
|
|
129
|
+
declare function failedOptimisticGeneration(generation: Generation): Generation;
|
|
130
|
+
declare function normalizeImageCount(value: unknown): number;
|
|
131
|
+
|
|
132
|
+
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 };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CADENCES,
|
|
3
|
+
DESTINATIONS,
|
|
4
|
+
GENERATION_TYPES,
|
|
5
|
+
MAX_IMAGE_COUNT,
|
|
6
|
+
MIN_IMAGE_COUNT,
|
|
7
|
+
buildGenerationRequestBody,
|
|
8
|
+
buildPublishPackage,
|
|
9
|
+
failedOptimisticGeneration,
|
|
10
|
+
generationError,
|
|
11
|
+
generationMergeKey,
|
|
12
|
+
generationStatus,
|
|
13
|
+
generationVaultPath,
|
|
14
|
+
isDestinationConnected,
|
|
15
|
+
isGenerationType,
|
|
16
|
+
isLocalGeneration,
|
|
17
|
+
isPublishPackage,
|
|
18
|
+
latestBatchOf,
|
|
19
|
+
mergeLiveGeneration,
|
|
20
|
+
mergeLoaderAndLive,
|
|
21
|
+
modelMessage,
|
|
22
|
+
normalizeImageCount,
|
|
23
|
+
optimisticGeneration,
|
|
24
|
+
outputPathFor,
|
|
25
|
+
preferredModelId,
|
|
26
|
+
relativeTime,
|
|
27
|
+
selectedModelsWithDefaults,
|
|
28
|
+
userSafeGenerationMessage
|
|
29
|
+
} from "../chunk-DTS5TZRN.js";
|
|
30
|
+
export {
|
|
31
|
+
CADENCES,
|
|
32
|
+
DESTINATIONS,
|
|
33
|
+
GENERATION_TYPES,
|
|
34
|
+
MAX_IMAGE_COUNT,
|
|
35
|
+
MIN_IMAGE_COUNT,
|
|
36
|
+
buildGenerationRequestBody,
|
|
37
|
+
buildPublishPackage,
|
|
38
|
+
failedOptimisticGeneration,
|
|
39
|
+
generationError,
|
|
40
|
+
generationMergeKey,
|
|
41
|
+
generationStatus,
|
|
42
|
+
generationVaultPath,
|
|
43
|
+
isDestinationConnected,
|
|
44
|
+
isGenerationType,
|
|
45
|
+
isLocalGeneration,
|
|
46
|
+
isPublishPackage,
|
|
47
|
+
latestBatchOf,
|
|
48
|
+
mergeLiveGeneration,
|
|
49
|
+
mergeLoaderAndLive,
|
|
50
|
+
modelMessage,
|
|
51
|
+
normalizeImageCount,
|
|
52
|
+
optimisticGeneration,
|
|
53
|
+
outputPathFor,
|
|
54
|
+
preferredModelId,
|
|
55
|
+
relativeTime,
|
|
56
|
+
selectedModelsWithDefaults,
|
|
57
|
+
userSafeGenerationMessage
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, SelectHTMLAttributes } from 'react';
|
|
3
|
+
import { Generation } from '../studio/index.js';
|
|
4
|
+
import { IntegrationConnection } from '@tangle-network/sandbox-ui/integrations';
|
|
5
|
+
import { Image } from 'lucide-react';
|
|
6
|
+
|
|
7
|
+
type StudioRole = 'owner' | 'admin' | 'editor' | 'viewer';
|
|
8
|
+
interface StudioWorkspaceProps {
|
|
9
|
+
generations: Generation[];
|
|
10
|
+
totalCost: number;
|
|
11
|
+
workspaceId?: string;
|
|
12
|
+
role: StudioRole;
|
|
13
|
+
/** Polling endpoint override (default `/api/generations`). */
|
|
14
|
+
generationsEndpoint?: string;
|
|
15
|
+
/** Build a vault link, optionally to a specific file. Defaults to `/app/<workspaceId>/vault`. */
|
|
16
|
+
vaultHref?: (filePath?: string | null) => string;
|
|
17
|
+
/** Integrations page href for the publish-package "Connect" link. Defaults to `/app/<workspaceId>/integrations`. */
|
|
18
|
+
integrationsHref?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The full studio surface: header + composer + result canvas + library drawer,
|
|
22
|
+
* with the generation orchestrator (merge/poll/revalidate) wired in. The host
|
|
23
|
+
* route owns the loader (auth, RBAC, the generation query) and the server
|
|
24
|
+
* endpoints (`/api/generate`, `/api/media-models`, `/api/generations`); this
|
|
25
|
+
* shell renders that data and drives the live UI. Role gates the composer
|
|
26
|
+
* (viewers get a read-only library) and the integration-management affordances.
|
|
27
|
+
*/
|
|
28
|
+
declare function StudioWorkspace({ generations, totalCost, workspaceId, role, generationsEndpoint, vaultHref, integrationsHref, }: StudioWorkspaceProps): react.JSX.Element;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The generation orchestrator behind a studio surface: it merges the loader's
|
|
32
|
+
* rows with in-flight live generations, computes the latest batch for the
|
|
33
|
+
* canvas, polls running generations until they settle, and revalidates the
|
|
34
|
+
* route loader when a status changes.
|
|
35
|
+
*
|
|
36
|
+
* The merge keeps the canvas, the library, and the polling path looking at the
|
|
37
|
+
* same full list. Polling hits `generationsEndpoint` (default `/api/generations`,
|
|
38
|
+
* the convention both apps already serve); pass an override if a product routes
|
|
39
|
+
* it elsewhere. `onGenerated` is wired to the composer's per-result callback.
|
|
40
|
+
*/
|
|
41
|
+
declare function useStudioGenerations(loaderGenerations: Generation[], options?: {
|
|
42
|
+
workspaceId?: string;
|
|
43
|
+
generationsEndpoint?: string;
|
|
44
|
+
}): {
|
|
45
|
+
mergedGenerations: Generation[];
|
|
46
|
+
latestBatch: Generation[];
|
|
47
|
+
onGenerated: (generation: Generation) => void;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
declare function ComposerHero({ workspaceId, integrationsHref, canManageIntegrations, onGenerated, }: {
|
|
51
|
+
workspaceId?: string;
|
|
52
|
+
integrationsHref?: string;
|
|
53
|
+
canManageIntegrations: boolean;
|
|
54
|
+
onGenerated: (generation: Generation) => void;
|
|
55
|
+
}): react.JSX.Element;
|
|
56
|
+
|
|
57
|
+
declare function Field({ label, htmlFor, className, children, }: {
|
|
58
|
+
label: string;
|
|
59
|
+
htmlFor?: string;
|
|
60
|
+
className?: string;
|
|
61
|
+
children: ReactNode;
|
|
62
|
+
}): react.JSX.Element;
|
|
63
|
+
declare function ComposerDisclosure({ summary, children }: {
|
|
64
|
+
summary: ReactNode;
|
|
65
|
+
children: ReactNode;
|
|
66
|
+
}): react.JSX.Element;
|
|
67
|
+
declare function NativeSelect(props: SelectHTMLAttributes<HTMLSelectElement>): react.JSX.Element;
|
|
68
|
+
|
|
69
|
+
declare function StudioHeader({ count, onOpenLibrary, canGenerate, }: {
|
|
70
|
+
count: number;
|
|
71
|
+
onOpenLibrary: () => void;
|
|
72
|
+
canGenerate: boolean;
|
|
73
|
+
}): react.JSX.Element;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Right-side overlay sheet built on Radix Dialog — gives focus-trap, scroll-lock,
|
|
77
|
+
* and Escape-to-close for free. Slide/fade come from the studio-sheet-* classes in
|
|
78
|
+
* ./studio.css (driven by Radix data-state), not tailwindcss-animate.
|
|
79
|
+
*/
|
|
80
|
+
declare function StudioSheet({ open, onOpenChange, title, children, }: {
|
|
81
|
+
open: boolean;
|
|
82
|
+
onOpenChange: (open: boolean) => void;
|
|
83
|
+
title: string;
|
|
84
|
+
children: ReactNode;
|
|
85
|
+
}): react.JSX.Element;
|
|
86
|
+
|
|
87
|
+
declare function ResultCanvas({ batch, onOpenLibrary, onSelect, }: {
|
|
88
|
+
batch: Generation[];
|
|
89
|
+
onOpenLibrary: () => void;
|
|
90
|
+
onSelect: (generation: Generation) => void;
|
|
91
|
+
}): react.JSX.Element;
|
|
92
|
+
|
|
93
|
+
declare function LibraryDrawer({ open, onOpenChange, generations, totalCost, typeFilter, onFilterChange, vaultHref, selected, onSelect, }: {
|
|
94
|
+
open: boolean;
|
|
95
|
+
onOpenChange: (open: boolean) => void;
|
|
96
|
+
generations: Generation[];
|
|
97
|
+
totalCost: number;
|
|
98
|
+
typeFilter: string | null;
|
|
99
|
+
onFilterChange: (type: string | null) => void;
|
|
100
|
+
vaultHref?: (filePath?: string | null) => string;
|
|
101
|
+
selected: Generation | null;
|
|
102
|
+
onSelect: (generation: Generation | null) => void;
|
|
103
|
+
}): react.JSX.Element;
|
|
104
|
+
|
|
105
|
+
declare function GenerationCard({ generation, onSelect, }: {
|
|
106
|
+
generation: Generation;
|
|
107
|
+
onSelect: (generation: Generation) => void;
|
|
108
|
+
}): react.JSX.Element;
|
|
109
|
+
declare function GenerationStatusBadge({ generation, inline, }: {
|
|
110
|
+
generation: Generation;
|
|
111
|
+
inline?: boolean;
|
|
112
|
+
}): react.JSX.Element | null;
|
|
113
|
+
|
|
114
|
+
declare function GenerationDetail({ generation, vaultHref, onNavigate, }: {
|
|
115
|
+
generation: Generation;
|
|
116
|
+
vaultHref?: (filePath?: string | null) => string;
|
|
117
|
+
onNavigate?: () => void;
|
|
118
|
+
}): react.JSX.Element;
|
|
119
|
+
|
|
120
|
+
declare function PublishPackageComposer({ caption, postDescription, mentions, cadence, selectedDestinations, connections, connectionError, connectionsLoading, integrationsHref, canManageIntegrations, onCaptionChange, onDescriptionChange, onMentionsChange, onCadenceChange, onDestinationToggle, }: {
|
|
121
|
+
caption: string;
|
|
122
|
+
postDescription: string;
|
|
123
|
+
mentions: string;
|
|
124
|
+
cadence: string;
|
|
125
|
+
selectedDestinations: string[];
|
|
126
|
+
connections: IntegrationConnection[];
|
|
127
|
+
connectionError: Error | null;
|
|
128
|
+
connectionsLoading: boolean;
|
|
129
|
+
integrationsHref?: string;
|
|
130
|
+
canManageIntegrations: boolean;
|
|
131
|
+
onCaptionChange: (value: string) => void;
|
|
132
|
+
onDescriptionChange: (value: string) => void;
|
|
133
|
+
onMentionsChange: (value: string) => void;
|
|
134
|
+
onCadenceChange: (value: string) => void;
|
|
135
|
+
onDestinationToggle: (destination: string) => void;
|
|
136
|
+
}): react.JSX.Element;
|
|
137
|
+
|
|
138
|
+
interface TypeConfig {
|
|
139
|
+
label: string;
|
|
140
|
+
icon: typeof Image;
|
|
141
|
+
color: string;
|
|
142
|
+
}
|
|
143
|
+
declare const TYPE_CONFIG: Record<string, TypeConfig>;
|
|
144
|
+
declare function typeConfigFor(type: string): TypeConfig;
|
|
145
|
+
|
|
146
|
+
declare function ImageComposer({ size, quality, imageCount, onSizeChange, onQualityChange, onImageCountChange, }: {
|
|
147
|
+
size: string;
|
|
148
|
+
quality: string;
|
|
149
|
+
imageCount: number;
|
|
150
|
+
onSizeChange: (value: string) => void;
|
|
151
|
+
onQualityChange: (value: string) => void;
|
|
152
|
+
onImageCountChange: (value: number) => void;
|
|
153
|
+
}): react.JSX.Element;
|
|
154
|
+
|
|
155
|
+
declare function VideoComposer({ duration, resolution, aspectRatio, referenceImageUrl, onDurationChange, onResolutionChange, onAspectRatioChange, onReferenceImageUrlChange, }: {
|
|
156
|
+
duration: string;
|
|
157
|
+
resolution: string;
|
|
158
|
+
aspectRatio: string;
|
|
159
|
+
referenceImageUrl: string;
|
|
160
|
+
onDurationChange: (value: string) => void;
|
|
161
|
+
onResolutionChange: (value: string) => void;
|
|
162
|
+
onAspectRatioChange: (value: string) => void;
|
|
163
|
+
onReferenceImageUrlChange: (value: string) => void;
|
|
164
|
+
}): react.JSX.Element;
|
|
165
|
+
|
|
166
|
+
declare function SpeechComposer({ voice, onVoiceChange, }: {
|
|
167
|
+
voice: string;
|
|
168
|
+
onVoiceChange: (value: string) => void;
|
|
169
|
+
}): react.JSX.Element;
|
|
170
|
+
|
|
171
|
+
declare function AvatarComposer({ audioUrl, imageUrl, avatarId, onAudioUrlChange, onImageUrlChange, onAvatarIdChange, }: {
|
|
172
|
+
audioUrl: string;
|
|
173
|
+
imageUrl: string;
|
|
174
|
+
avatarId: string;
|
|
175
|
+
onAudioUrlChange: (value: string) => void;
|
|
176
|
+
onImageUrlChange: (value: string) => void;
|
|
177
|
+
onAvatarIdChange: (value: string) => void;
|
|
178
|
+
}): react.JSX.Element;
|
|
179
|
+
|
|
180
|
+
declare function TranscriptionComposer({ audioUrl, language, onAudioUrlChange, onLanguageChange, }: {
|
|
181
|
+
audioUrl: string;
|
|
182
|
+
language: string;
|
|
183
|
+
onAudioUrlChange: (value: string) => void;
|
|
184
|
+
onLanguageChange: (value: string) => void;
|
|
185
|
+
}): react.JSX.Element;
|
|
186
|
+
declare function TranscriptionOptions({ responseFormat, temperature, onResponseFormatChange, onTemperatureChange, }: {
|
|
187
|
+
responseFormat: string;
|
|
188
|
+
temperature: string;
|
|
189
|
+
onResponseFormatChange: (value: string) => void;
|
|
190
|
+
onTemperatureChange: (value: string) => void;
|
|
191
|
+
}): react.JSX.Element;
|
|
192
|
+
|
|
193
|
+
export { AvatarComposer, ComposerDisclosure, ComposerHero, Field, GenerationCard, GenerationDetail, GenerationStatusBadge, ImageComposer, LibraryDrawer, NativeSelect, PublishPackageComposer, ResultCanvas, SpeechComposer, StudioHeader, type StudioRole, StudioSheet, StudioWorkspace, type StudioWorkspaceProps, TYPE_CONFIG, TranscriptionComposer, TranscriptionOptions, type TypeConfig, VideoComposer, typeConfigFor, useStudioGenerations };
|