@tangle-network/agent-app 0.46.2 → 0.46.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/assistant/index.js +2 -1
- package/dist/assistant/index.js.map +1 -1
- package/dist/chunk-KKBTPZIE.js +805 -0
- package/dist/chunk-KKBTPZIE.js.map +1 -0
- package/dist/{chunk-2RTYQU4W.js → chunk-LEGZX5MQ.js} +150 -4
- package/dist/chunk-LEGZX5MQ.js.map +1 -0
- package/dist/{chunk-MBKNKAN2.js → chunk-RZ6MYWMJ.js} +416 -1210
- package/dist/chunk-RZ6MYWMJ.js.map +1 -0
- package/dist/stories/studio/StudioProviders.d.ts +10 -0
- package/dist/stories/studio/fixtures.d.ts +10 -2
- package/dist/studio/audio-preview.d.ts +12 -0
- package/dist/studio/generation.d.ts +22 -1
- package/dist/studio/index.d.ts +2 -0
- package/dist/studio/index.js +29 -1
- package/dist/studio/ports.d.ts +54 -0
- package/dist/studio-react/composer-option-controls.d.ts +19 -8
- package/dist/studio-react/download-generations.d.ts +4 -0
- package/dist/studio-react/index.d.ts +38 -22
- package/dist/studio-react/index.js +2198 -545
- package/dist/studio-react/index.js.map +1 -1
- package/dist/studio-react/media-tile.d.ts +21 -0
- package/dist/studio-react/media-viewer.d.ts +12 -0
- package/dist/studio-react/studio-confirm.d.ts +8 -0
- package/dist/studio-react/studio-generation-screen.d.ts +42 -0
- package/dist/studio-react/studio-history-screen.d.ts +28 -0
- package/dist/studio-react/studio-home-screen.d.ts +20 -0
- package/dist/studio-react/studio-playback.d.ts +31 -0
- package/dist/studio-react/studio-toasts.d.ts +21 -0
- package/dist/studio-react/studio.css +142 -72
- package/dist/studio-react/use-batch-navigation.d.ts +20 -0
- package/dist/studio-react/use-deferred-delete.d.ts +19 -0
- package/dist/studio-react/use-generation-history.d.ts +22 -0
- package/dist/studio-react/vault-path-popover.d.ts +12 -0
- package/dist/web-react/index.js +8 -6
- package/package.json +2 -7
- package/dist/chunk-2RTYQU4W.js.map +0 -1
- package/dist/chunk-MBKNKAN2.js.map +0 -1
- package/dist/studio-react/generation-card.d.ts +0 -9
- package/dist/studio-react/generation-detail-modal.d.ts +0 -11
- package/dist/studio-react/generation-detail.d.ts +0 -6
- package/dist/studio-react/generation-grid.d.ts +0 -15
- package/dist/studio-react/library-drawer.d.ts +0 -12
- package/dist/studio-react/library-panel.d.ts +0 -15
- package/dist/studio-react/result-canvas.d.ts +0 -6
- package/dist/studio-react/studio-header.d.ts +0 -5
- package/dist/studio-react/studio-sheet.d.ts +0 -12
- package/dist/studio-react/studio-workspace.d.ts +0 -21
- package/dist/studio-react/type-config.d.ts +0 -11
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { Generation } from '../../studio';
|
|
3
|
+
import type { StudioMediaActions } from '../../studio/ports';
|
|
4
|
+
export declare function StudioProviders({ children }: {
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
export declare const storyMediaActions: StudioMediaActions;
|
|
8
|
+
/** Composer screens need their model catalog without pretending generation works. */
|
|
9
|
+
export declare function installStudioComposerFetchStub(): void;
|
|
10
|
+
export declare const noOpGenerated: (generation: Generation) => void;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import type { Generation } from '../../studio';
|
|
1
|
+
import type { FetchGenerationsPage, Generation, GenerationPage } from '../../studio';
|
|
2
|
+
/** Tiny browser-native silent WAV used by stories that exercise real playback. */
|
|
3
|
+
export declare function silentWavDataUri(seconds: number): string;
|
|
2
4
|
export declare const teaserA: Generation;
|
|
3
5
|
export declare const storyboardGeneration: Generation;
|
|
4
6
|
export declare const videoGeneration: Generation;
|
|
5
7
|
export declare const avatarGeneration: Generation;
|
|
6
8
|
export declare const speechGeneration: Generation;
|
|
9
|
+
export declare const speechGenerationPlayable: Generation;
|
|
7
10
|
export declare const transcriptionGeneration: Generation;
|
|
8
11
|
export declare const queuedGeneration: Generation;
|
|
9
12
|
export declare const runningGeneration: Generation;
|
|
@@ -14,5 +17,10 @@ export declare const teaserBatch: Generation[];
|
|
|
14
17
|
/** Populated library: the newest batch first, every type and status represented. */
|
|
15
18
|
export declare const libraryGenerations: Generation[];
|
|
16
19
|
export declare const libraryTotalCost = 1.87;
|
|
17
|
-
/**
|
|
20
|
+
/** Large enough to exercise search, filtering, and a second cursor page. */
|
|
21
|
+
export declare const historyGenerations: Generation[];
|
|
22
|
+
export declare function makeGenerationPage(items: Generation[], nextCursor?: string): GenerationPage;
|
|
23
|
+
/** In-memory version of the history endpoint, including abortable latency. */
|
|
24
|
+
export declare function fakeFetchGenerationsPage(all: Generation[]): FetchGenerationsPage;
|
|
25
|
+
/** Demo story route for opening a persisted generation in the vault. */
|
|
18
26
|
export declare const demoVaultHref: (filePath?: string | null) => string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** A deterministic waveform bar used when decoded audio is unavailable. */
|
|
2
|
+
export interface WaveformBar {
|
|
3
|
+
/** 7–100, % of tile height. */
|
|
4
|
+
heightPct: number;
|
|
5
|
+
opacity: number;
|
|
6
|
+
}
|
|
7
|
+
export declare const GRID_WAVEFORM_BARS = 26;
|
|
8
|
+
export declare const WIDE_WAVEFORM_BARS = 72;
|
|
9
|
+
/** Hash a string with FNV-1a into an unsigned 32-bit seed. */
|
|
10
|
+
export declare function hashSeed(value: string): number;
|
|
11
|
+
/** Build stable pseudo-waveform bars for a media preview. */
|
|
12
|
+
export declare function previewWaveformBars(seed: string, count: number): readonly WaveformBar[];
|
|
@@ -114,8 +114,29 @@ export declare function optimisticGeneration({ type, prompt, model, clientReques
|
|
|
114
114
|
clientRequestId: string;
|
|
115
115
|
outputIndex?: number;
|
|
116
116
|
outputCount?: number;
|
|
117
|
-
}): Generation;
|
|
117
|
+
}, aspectRatio?: number): Generation;
|
|
118
118
|
/** Mark a generation as failed with updated status and error information */
|
|
119
119
|
export declare function failedOptimisticGeneration(generation: Generation): Generation;
|
|
120
120
|
/** Normalize a value to a finite integer within the allowed image count range */
|
|
121
121
|
export declare function normalizeImageCount(value: unknown): number;
|
|
122
|
+
/** Resolve a generation's batch identity, preferring the server batch id. */
|
|
123
|
+
export declare function generationBatchKey(generation: Generation): string;
|
|
124
|
+
/** Resolve the stored media asset id, when present. */
|
|
125
|
+
export declare function generationAssetId(generation: Generation): string | null;
|
|
126
|
+
/** Select and order all outputs belonging to a generation batch. */
|
|
127
|
+
export declare function generationsInBatch(generations: readonly Generation[], batchKey: string): Generation[];
|
|
128
|
+
/** Resolve the best available aspect ratio for a generation row. */
|
|
129
|
+
export declare function generationAspectRatio(generation: Generation): number;
|
|
130
|
+
/** Resolve a requested lane's aspect ratio from its selected options. */
|
|
131
|
+
export declare function aspectRatioFromOptions(type: GenerationType, options: {
|
|
132
|
+
size?: string;
|
|
133
|
+
aspectRatio?: string;
|
|
134
|
+
}): number | undefined;
|
|
135
|
+
/** Choose the default vault folder shared by a homogeneous media selection. */
|
|
136
|
+
export declare function defaultVaultPathFor(generations: readonly Generation[]): string;
|
|
137
|
+
/** Normalize a user-entered relative vault folder or reject an unsafe path. */
|
|
138
|
+
export declare function normalizeVaultPath(input: string): string | null;
|
|
139
|
+
/** Append a page while preserving the first row seen for each id. */
|
|
140
|
+
export declare function mergeGenerationPages(prev: readonly Generation[], next: readonly Generation[]): Generation[];
|
|
141
|
+
/** Resolve only the human-readable media specification fields a row carries. */
|
|
142
|
+
export declare function generationSpecSegments(generation: Generation): string[];
|
package/dist/studio/index.d.ts
CHANGED
package/dist/studio/index.js
CHANGED
|
@@ -2,29 +2,43 @@ import {
|
|
|
2
2
|
FALLBACK_VIDEO_MODEL_OPTIONS,
|
|
3
3
|
GENERATION_TYPES,
|
|
4
4
|
GPT_IMAGE_2_CUSTOM_SIZE,
|
|
5
|
+
GRID_WAVEFORM_BARS,
|
|
5
6
|
IMAGE_TO_VIDEO_SIBLINGS,
|
|
6
7
|
MAX_IMAGE_COUNT,
|
|
8
|
+
MEDIA_TYPE_FILTERS,
|
|
7
9
|
MIN_IMAGE_COUNT,
|
|
10
|
+
WIDE_WAVEFORM_BARS,
|
|
11
|
+
aspectRatioFromOptions,
|
|
8
12
|
buildGenerationRequestBody,
|
|
9
13
|
curateComposerModels,
|
|
14
|
+
defaultVaultPathFor,
|
|
10
15
|
failedOptimisticGeneration,
|
|
16
|
+
generationAspectRatio,
|
|
17
|
+
generationAssetId,
|
|
18
|
+
generationBatchKey,
|
|
11
19
|
generationError,
|
|
12
20
|
generationMergeKey,
|
|
21
|
+
generationSpecSegments,
|
|
13
22
|
generationStatus,
|
|
14
23
|
generationVaultPath,
|
|
24
|
+
generationsInBatch,
|
|
25
|
+
hashSeed,
|
|
15
26
|
imageToVideoSibling,
|
|
16
27
|
isGenerationType,
|
|
17
28
|
isLocalGeneration,
|
|
18
29
|
latestBatchOf,
|
|
30
|
+
mergeGenerationPages,
|
|
19
31
|
mergeLiveGeneration,
|
|
20
32
|
mergeLoaderAndLive,
|
|
21
33
|
modelMessage,
|
|
22
34
|
normalizeImageCount,
|
|
35
|
+
normalizeVaultPath,
|
|
23
36
|
optimisticGeneration,
|
|
24
37
|
optionChoices,
|
|
25
38
|
optionDefault,
|
|
26
39
|
outputPathFor,
|
|
27
40
|
preferredModelId,
|
|
41
|
+
previewWaveformBars,
|
|
28
42
|
reconcileOptionValues,
|
|
29
43
|
relativeTime,
|
|
30
44
|
resolveComposerOptions,
|
|
@@ -33,34 +47,48 @@ import {
|
|
|
33
47
|
textToVideoSibling,
|
|
34
48
|
userSafeGenerationMessage,
|
|
35
49
|
validateCustomImageSize
|
|
36
|
-
} from "../chunk-
|
|
50
|
+
} from "../chunk-LEGZX5MQ.js";
|
|
37
51
|
export {
|
|
38
52
|
FALLBACK_VIDEO_MODEL_OPTIONS,
|
|
39
53
|
GENERATION_TYPES,
|
|
40
54
|
GPT_IMAGE_2_CUSTOM_SIZE,
|
|
55
|
+
GRID_WAVEFORM_BARS,
|
|
41
56
|
IMAGE_TO_VIDEO_SIBLINGS,
|
|
42
57
|
MAX_IMAGE_COUNT,
|
|
58
|
+
MEDIA_TYPE_FILTERS,
|
|
43
59
|
MIN_IMAGE_COUNT,
|
|
60
|
+
WIDE_WAVEFORM_BARS,
|
|
61
|
+
aspectRatioFromOptions,
|
|
44
62
|
buildGenerationRequestBody,
|
|
45
63
|
curateComposerModels,
|
|
64
|
+
defaultVaultPathFor,
|
|
46
65
|
failedOptimisticGeneration,
|
|
66
|
+
generationAspectRatio,
|
|
67
|
+
generationAssetId,
|
|
68
|
+
generationBatchKey,
|
|
47
69
|
generationError,
|
|
48
70
|
generationMergeKey,
|
|
71
|
+
generationSpecSegments,
|
|
49
72
|
generationStatus,
|
|
50
73
|
generationVaultPath,
|
|
74
|
+
generationsInBatch,
|
|
75
|
+
hashSeed,
|
|
51
76
|
imageToVideoSibling,
|
|
52
77
|
isGenerationType,
|
|
53
78
|
isLocalGeneration,
|
|
54
79
|
latestBatchOf,
|
|
80
|
+
mergeGenerationPages,
|
|
55
81
|
mergeLiveGeneration,
|
|
56
82
|
mergeLoaderAndLive,
|
|
57
83
|
modelMessage,
|
|
58
84
|
normalizeImageCount,
|
|
85
|
+
normalizeVaultPath,
|
|
59
86
|
optimisticGeneration,
|
|
60
87
|
optionChoices,
|
|
61
88
|
optionDefault,
|
|
62
89
|
outputPathFor,
|
|
63
90
|
preferredModelId,
|
|
91
|
+
previewWaveformBars,
|
|
64
92
|
reconcileOptionValues,
|
|
65
93
|
relativeTime,
|
|
66
94
|
resolveComposerOptions,
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Product seams for the studio media library. A product such as gtm-agent
|
|
3
|
+
* implements these against its `/api/generations`, `/api/media/save`, and
|
|
4
|
+
* `/api/generations/bulk-delete` routes. The ports themselves are never fetched
|
|
5
|
+
* by the shell; note the assembled screens ALSO require the host to serve
|
|
6
|
+
* `StudioComposer`'s `/api/generate` and `/api/media-models` (see
|
|
7
|
+
* `../studio-react/index.tsx`), and `useStudioGenerations` polls its
|
|
8
|
+
* `generationsEndpoint` (default `/api/generations`).
|
|
9
|
+
*/
|
|
10
|
+
import type { Generation } from './generation';
|
|
11
|
+
export type MediaTypeFilter = 'all' | 'image' | 'video' | 'speech';
|
|
12
|
+
export declare const MEDIA_TYPE_FILTERS: readonly {
|
|
13
|
+
value: MediaTypeFilter;
|
|
14
|
+
label: string;
|
|
15
|
+
}[];
|
|
16
|
+
export interface GenerationPageQuery {
|
|
17
|
+
/** Trimmed prompt search; '' means no filter. Goes on the wire as `q`. */
|
|
18
|
+
q: string;
|
|
19
|
+
type: MediaTypeFilter;
|
|
20
|
+
/** null for the first page; otherwise the server's opaque cursor. */
|
|
21
|
+
cursor: string | null;
|
|
22
|
+
signal: AbortSignal;
|
|
23
|
+
}
|
|
24
|
+
export interface GenerationPage {
|
|
25
|
+
items: Generation[];
|
|
26
|
+
nextCursor?: string;
|
|
27
|
+
}
|
|
28
|
+
export type FetchGenerationsPage = (query: GenerationPageQuery) => Promise<GenerationPage>;
|
|
29
|
+
export interface VaultSaveResult {
|
|
30
|
+
generationId: string;
|
|
31
|
+
vaultPath: string;
|
|
32
|
+
}
|
|
33
|
+
export type SaveGenerationsToVault = (input: {
|
|
34
|
+
generations: readonly Generation[];
|
|
35
|
+
path: string;
|
|
36
|
+
signal?: AbortSignal;
|
|
37
|
+
}) => Promise<readonly VaultSaveResult[]>;
|
|
38
|
+
/** The shell may invoke this during page teardown (the `pagehide`/unmount flush
|
|
39
|
+
* of a deferred delete). Implementations must use unload-survivable transport
|
|
40
|
+
* such as `fetch(..., { keepalive: true })` or `navigator.sendBeacon`, and keep
|
|
41
|
+
* the payload within the keepalive transport's approximately 64 KB bound. */
|
|
42
|
+
export type DeleteGenerations = (ids: readonly string[]) => Promise<void>;
|
|
43
|
+
export type DownloadGenerations = (generations: readonly Generation[]) => void | Promise<void>;
|
|
44
|
+
/** Every media action a tile / viewer / batch bar can offer. An ABSENT member
|
|
45
|
+
* hides its control — a product with no vault endpoint must not render a
|
|
46
|
+
* "Save to vault" button that does nothing. */
|
|
47
|
+
export interface StudioMediaActions {
|
|
48
|
+
download?: DownloadGenerations;
|
|
49
|
+
save?: SaveGenerationsToVault;
|
|
50
|
+
remove?: DeleteGenerations;
|
|
51
|
+
vaultHref?: (filePath?: string | null) => string;
|
|
52
|
+
/** Intercept the vault link for SPA nav; the href stays for middle-click. */
|
|
53
|
+
onOpenVault?: (generation: Generation) => void;
|
|
54
|
+
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* the band no longer points at anything, so it closes when the pill's
|
|
14
14
|
* horizontal CENTRE leaves the band's box.
|
|
15
15
|
*/
|
|
16
|
-
import { type ReactNode, type RefObject } from 'react';
|
|
16
|
+
import { type JSX, type ReactNode, type RefObject } from 'react';
|
|
17
17
|
import { type LucideIcon } from 'lucide-react';
|
|
18
18
|
import { type MediaModelOption, type ModelOptionValue } from '../studio';
|
|
19
19
|
/** One media lane's segment: the icon it shows collapsed, the word it shows
|
|
@@ -32,7 +32,7 @@ export declare function MediaTypeSegments<T extends string>({ value, segments, o
|
|
|
32
32
|
value: T;
|
|
33
33
|
segments: readonly MediaTypeSegment<T>[];
|
|
34
34
|
onChange: (type: T) => void;
|
|
35
|
-
}):
|
|
35
|
+
}): JSX.Element;
|
|
36
36
|
/**
|
|
37
37
|
* The middle scroller. It hides its scrollbar and fades whichever edge has
|
|
38
38
|
* content behind it, at the DEPTH of what is actually hidden (capped at
|
|
@@ -46,12 +46,23 @@ export declare function ComposerBand({ bandRef, resetKey, children, }: {
|
|
|
46
46
|
/** Changing this scrolls the band back to the start. */
|
|
47
47
|
resetKey: string;
|
|
48
48
|
children: ReactNode;
|
|
49
|
-
}):
|
|
49
|
+
}): JSX.Element;
|
|
50
50
|
/** One renderable value: the wire value, untouched, and how it reads. */
|
|
51
51
|
export interface OptionChoice {
|
|
52
52
|
value: ModelOptionValue;
|
|
53
53
|
label: string;
|
|
54
54
|
}
|
|
55
|
+
/** A standalone enum picker using the studio composer's pill and menu grammar. */
|
|
56
|
+
export declare function MenuPill<T extends string>({ label, value, choices, onSelect, className, }: {
|
|
57
|
+
label: string;
|
|
58
|
+
value: T;
|
|
59
|
+
choices: readonly {
|
|
60
|
+
value: T;
|
|
61
|
+
label: string;
|
|
62
|
+
}[];
|
|
63
|
+
onSelect: (value: T) => void;
|
|
64
|
+
className?: string;
|
|
65
|
+
}): JSX.Element;
|
|
55
66
|
/**
|
|
56
67
|
* A value pill and the menu it opens.
|
|
57
68
|
*
|
|
@@ -74,7 +85,7 @@ export declare function OptionPill({ label, value, choices, onSelect, bandRef, c
|
|
|
74
85
|
close: () => void;
|
|
75
86
|
}) => ReactNode;
|
|
76
87
|
};
|
|
77
|
-
}):
|
|
88
|
+
}): JSX.Element;
|
|
78
89
|
/**
|
|
79
90
|
* The custom-size form the Size menu swaps to.
|
|
80
91
|
*
|
|
@@ -86,7 +97,7 @@ export declare function CustomSizeForm({ initial, onApply, onCancel, }: {
|
|
|
86
97
|
initial?: string;
|
|
87
98
|
onApply: (size: string) => void;
|
|
88
99
|
onCancel: () => void;
|
|
89
|
-
}):
|
|
100
|
+
}): JSX.Element;
|
|
90
101
|
/**
|
|
91
102
|
* The audio switch. It is a toggle rather than a menu because the parameter has
|
|
92
103
|
* exactly two states, and a two-row menu to say "on" is a menu that costs a
|
|
@@ -95,7 +106,7 @@ export declare function CustomSizeForm({ initial, onApply, onCancel, }: {
|
|
|
95
106
|
export declare function AudioTogglePill({ on, onToggle }: {
|
|
96
107
|
on: boolean;
|
|
97
108
|
onToggle: (on: boolean) => void;
|
|
98
|
-
}):
|
|
109
|
+
}): JSX.Element;
|
|
99
110
|
/**
|
|
100
111
|
* The reference-image pill: the only control that changes which MODEL runs, so
|
|
101
112
|
* the swap to the image-to-video sibling is the caller's (`onAttach`/`onRemove`)
|
|
@@ -112,7 +123,7 @@ export declare function ReferencePill({ url, onAttach, onRemove, pick, bandRef,
|
|
|
112
123
|
onRemove: () => void;
|
|
113
124
|
pick?: () => Promise<string | null>;
|
|
114
125
|
bandRef: RefObject<HTMLDivElement | null>;
|
|
115
|
-
}):
|
|
126
|
+
}): JSX.Element;
|
|
116
127
|
/**
|
|
117
128
|
* The model pill — first in the band on every lane, and the only pill that is
|
|
118
129
|
* always there. A model with no published option metadata renders this and
|
|
@@ -128,7 +139,7 @@ export declare function ModelPill({ models, value, displayName, provider, onSele
|
|
|
128
139
|
provider?: string;
|
|
129
140
|
onSelect: (id: string) => void;
|
|
130
141
|
bandRef: RefObject<HTMLDivElement | null>;
|
|
131
|
-
}):
|
|
142
|
+
}): JSX.Element;
|
|
132
143
|
/**
|
|
133
144
|
* How a wire value reads, with the wire value itself untouched underneath.
|
|
134
145
|
*
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DownloadGenerations } from '../studio/ports';
|
|
2
|
+
/** Same-origin anchor download, staggered so the browser does not swallow
|
|
3
|
+
* every request after the first. Default when no `download` port is given. */
|
|
4
|
+
export declare const downloadGenerationsViaAnchor: DownloadGenerations;
|
|
@@ -1,29 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `@tangle-network/agent-app/studio-react` — the media-generation studio
|
|
3
|
-
* surface:
|
|
4
|
-
* (image / video / speech) whose option pills are the SELECTED MODEL's own
|
|
5
|
-
* published parameters, plus a result canvas and a right-side asset-library
|
|
6
|
-
* drawer with card + detail views. `StudioWorkspace` is the ready-to-mount shell (header +
|
|
7
|
-
* composer + canvas + drawer + the merge/poll/revalidate orchestrator); the
|
|
8
|
-
* leaf components are exported so a product can compose its own shell.
|
|
3
|
+
* surface: three screens over injected ports plus the pieces they compose.
|
|
9
4
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
5
|
+
* - `StudioHomeScreen` — the centered `StudioComposer` above a full-bleed
|
|
6
|
+
* "Recent media" grid.
|
|
7
|
+
* - `StudioGenerationScreen` — one prompt's batch: shimmer skeletons at the
|
|
8
|
+
* chosen aspect, results, and the docked composer on an opaque band.
|
|
9
|
+
* - `StudioHistoryScreen` — server-side search + media-type filter, select
|
|
10
|
+
* mode with batch actions, cursor-paginated lazy loading.
|
|
11
|
+
* - `MediaTile` / `MediaViewerModal` — the shared tile (hover scrim, vault
|
|
12
|
+
* state, select circle, audio badge) and the viewer with the audio
|
|
13
|
+
* transport.
|
|
14
|
+
* - `StudioToastProvider` + `StudioPlaybackProvider` — required above every
|
|
15
|
+
* screen: bottom-centre toasts with Undo, and ONE audio playback state
|
|
16
|
+
* shared by tiles and the viewer.
|
|
17
|
+
* - `useDeferredDelete` / `useGenerationHistory` / `useBatchNavigation` —
|
|
18
|
+
* the undo-window delete, cursor paging, and once-per-batch navigation.
|
|
19
|
+
*
|
|
20
|
+
* The host route owns the loader (auth / RBAC / generation query), the server
|
|
21
|
+
* endpoints (`/api/generate`, `/api/media-models`, `/api/generations`, save /
|
|
22
|
+
* delete routes), navigation between the screens, and the providers;
|
|
23
|
+
* `useStudioGenerations` is the merge/poll/revalidate orchestrator a host
|
|
24
|
+
* route drives. Data and actions reach the screens only through the seams in
|
|
25
|
+
* `../studio/ports` — an absent action hides its control. This subpath is
|
|
26
|
+
* sandbox-ui-free and Radix-free; styling is Tailwind against the shared
|
|
27
|
+
* design tokens, with studio-specific rules at `./studio-react/styles`.
|
|
15
28
|
*/
|
|
16
|
-
export * from './studio-workspace';
|
|
17
29
|
export * from './use-studio-generations';
|
|
18
30
|
export * from './studio-composer';
|
|
31
|
+
export * from './composer-option-controls';
|
|
19
32
|
export * from './generation-notice';
|
|
20
|
-
export * from './
|
|
21
|
-
export * from './
|
|
22
|
-
export * from './
|
|
23
|
-
export * from './
|
|
24
|
-
export * from './
|
|
25
|
-
export * from './
|
|
26
|
-
export * from './
|
|
27
|
-
export * from './
|
|
28
|
-
export * from './
|
|
29
|
-
export * from './
|
|
33
|
+
export * from './media-tile';
|
|
34
|
+
export * from './media-viewer';
|
|
35
|
+
export * from './studio-home-screen';
|
|
36
|
+
export * from './studio-generation-screen';
|
|
37
|
+
export * from './studio-history-screen';
|
|
38
|
+
export * from './studio-toasts';
|
|
39
|
+
export * from './studio-confirm';
|
|
40
|
+
export * from './vault-path-popover';
|
|
41
|
+
export * from './studio-playback';
|
|
42
|
+
export * from './use-batch-navigation';
|
|
43
|
+
export * from './use-generation-history';
|
|
44
|
+
export * from './use-deferred-delete';
|
|
45
|
+
export * from './download-generations';
|