@signalsandsorcery/plugin-sdk 2.25.1 → 2.28.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/index.d.mts CHANGED
@@ -547,6 +547,11 @@ interface PluginHost {
547
547
  key: string;
548
548
  mode: string;
549
549
  } | null>;
550
+ /**
551
+ * Read a scene's human display name by db id (for labelling a crossfade's
552
+ * origin/target scenes). Optional — callers MUST null-check. @since SDK 2.26.0
553
+ */
554
+ getSceneName?(sceneDbId: string): Promise<string | null>;
550
555
  /** Subscribe to transport state changes. Returns unsubscribe function. */
551
556
  onTransportEvent(listener: TransportEventListener): UnsubscribeFn;
552
557
  /** Subscribe to deck boundary events. Returns unsubscribe function. */
@@ -1192,6 +1197,10 @@ interface SceneFamilyTrack {
1192
1197
  name: string;
1193
1198
  /** Musical role if set — used to enforce same-role crossfade pairing. */
1194
1199
  role?: string;
1200
+ /** Generation prompt, when the track was AI-generated. The crossfade picker
1201
+ * shows this as the primary label (users recognise tracks by prompt, not id).
1202
+ * @since SDK 2.27.0 */
1203
+ prompt?: string;
1195
1204
  }
1196
1205
  /**
1197
1206
  * One OTHER scene and its candidate tracks (already type-filtered). Scenes with
@@ -2602,6 +2611,10 @@ interface CrossfadePairMeta {
2602
2611
  sliderPos: number;
2603
2612
  originDbId: string;
2604
2613
  targetDbId: string;
2614
+ /** DB id of the ORIGIN source track (in the from scene) — drives the "used once" exclusion. */
2615
+ originSourceDbId: string;
2616
+ /** DB id of the TARGET source track (in the to scene). */
2617
+ targetSourceDbId: string;
2605
2618
  originSourceName: string;
2606
2619
  originSoundLabel: string;
2607
2620
  targetSourceName: string;
@@ -2763,6 +2776,215 @@ interface CrossfadeInpaintInput {
2763
2776
  */
2764
2777
  declare function buildCrossfadeInpaintPrompt(input: CrossfadeInpaintInput): string;
2765
2778
 
2779
+ /**
2780
+ * Fade metadata — family-agnostic types + parsing for transition orphan fades
2781
+ * (synth / drum / instrument panels).
2782
+ *
2783
+ * A fade is a CROSSFADE WITH ONE EMPTY ENDPOINT: a single generated track that
2784
+ * either fades IN (a target-only track entering — `morph(∅ → target)`) or fades
2785
+ * OUT (an origin-only track leaving — `morph(origin → ∅)`) across the transition
2786
+ * loop. It reuses the same generation pipeline (`buildCrossfadeInpaintPrompt`
2787
+ * with one empty endpoint) and the same volume-automation fader as crossfade.
2788
+ *
2789
+ * Stored in scene plugin_data under `track:<dbId>:fade` (ONE entry per track —
2790
+ * unlike crossfade there is no partner / groupId). Kept as a SEPARATE type from
2791
+ * crossfade so the load-bearing "drop a half-broken pair" guard in
2792
+ * `parseCrossfadePairs` stays intact.
2793
+ *
2794
+ * @since SDK 2.28.0
2795
+ */
2796
+
2797
+ /** Which way the lone track fades over the transition. */
2798
+ type FadeDirection = 'in' | 'out';
2799
+ /**
2800
+ * How the fade is shaped:
2801
+ * - `volume` — a one-sided level ramp does the work (DJ-style). Best for
2802
+ * textural/sustained material (pads, atmospheres).
2803
+ * - `build` — the MIDI carries the fade (the inpaint grows sparse→full on the way
2804
+ * in, or dissolves on the way out); the level stays flat. Best for articulated
2805
+ * material (lead, bass, drums, winds, vocals).
2806
+ */
2807
+ type FadeGesture = 'volume' | 'build';
2808
+ /** Per-track fade metadata (one scene-data value per fade track). */
2809
+ interface FadeMeta {
2810
+ direction: FadeDirection;
2811
+ gesture: FadeGesture;
2812
+ /** DB id of the SOURCE track this fade's preset/sample + pattern was seeded from. */
2813
+ sourceTrackDbId: string;
2814
+ /** DB id of the scene the source track lives in (the from/to scene). */
2815
+ sourceSceneId: string;
2816
+ /** Source track display name (shown in the caption). */
2817
+ sourceName: string;
2818
+ /** Copied preset/sample label (shown in the caption). */
2819
+ soundLabel: string;
2820
+ /** Fade position 0..1 — WHERE in time the fade midpoint sits. */
2821
+ sliderPos: number;
2822
+ }
2823
+ /** A fade entry resolved from scene data: the fade track's dbId + its metadata. */
2824
+ interface FadeEntry {
2825
+ dbId: string;
2826
+ meta: FadeMeta;
2827
+ }
2828
+ /** Narrow an unknown scene-data value to FadeMeta (defensive — survives partial blobs). */
2829
+ declare function asFadeMeta(val: unknown): FadeMeta | null;
2830
+ /**
2831
+ * Scan all `track:<dbId>:fade` keys in a scene's plugin_data and return one entry
2832
+ * per valid fade. Unlike crossfade there is no grouping or both-present gate — a
2833
+ * fade is intrinsically a single track.
2834
+ */
2835
+ declare function parseFades(sceneData: Record<string, unknown>): FadeEntry[];
2836
+ /**
2837
+ * Build a ONE-sided volume-automation curve for a fade over `bars` at `bpm`.
2838
+ *
2839
+ * - `gesture === 'build'` → flat at unity (0 dB). The compositional build in the
2840
+ * MIDI carries the fade; layering a volume ramp on top would double-fade.
2841
+ * - `gesture === 'volume'` → an equal-power ramp identical to ONE half of
2842
+ * `buildCrossfadeVolumeCurves`: fade-out ≡ its `origin` curve (unity→floor),
2843
+ * fade-in ≡ its `target` curve (floor→unity). `sliderPos` sets WHERE the −3 dB
2844
+ * midpoint sits in time.
2845
+ *
2846
+ * Points span [0, durationSeconds] so the engine re-reads them each loop. Returns
2847
+ * dB points for `host.setTrackVolumeAutomation`.
2848
+ *
2849
+ * @since SDK 2.28.0
2850
+ */
2851
+ declare function buildFadeVolumeCurve(bars: number, bpm: number, direction: FadeDirection, sliderPos: number, gesture: FadeGesture, steps?: number): VolumeAutomationPoint[];
2852
+ /**
2853
+ * Roles whose fades default to a `volume` (level) ramp — sustained/textural
2854
+ * material that enters/leaves by level in real productions. Everything else
2855
+ * defaults to `build` (the notes carry the fade).
2856
+ *
2857
+ * This is a UI default heuristic over role tokens, NOT the canonical role list
2858
+ * (that lives in the app's instrument-classification + `host.getValidRoles()`).
2859
+ * There is no textural↔articulated axis in the taxonomy, so this small curated
2860
+ * subset lives next to its consumer (the fade modal/panels).
2861
+ *
2862
+ * @since SDK 2.28.0
2863
+ */
2864
+ declare const TEXTURAL_ROLES: ReadonlySet<string>;
2865
+ /** Pick the default fade gesture for a track's role (textural → volume, else build). */
2866
+ declare function defaultFadeGesture(role: string | null | undefined): FadeGesture;
2867
+
2868
+ /**
2869
+ * FadeTrackRow — a transition "fade track": a single locked TrackRow with a
2870
+ * direction badge (Fade in / Fade out) and a one-sided fade slider.
2871
+ *
2872
+ * A fade is a crossfade with one empty endpoint — a lone generated track that
2873
+ * either enters (fade in, for a target-only track) or leaves (fade out, for an
2874
+ * origin-only track) across the transition loop. Like a crossfade layer, the
2875
+ * sound/generation controls are omitted (the SDK TrackRow is "controlled by
2876
+ * omission"): no shuffle / Create / preset-pick / FX / drawer / inner-delete.
2877
+ * What remains: per-track volume/pan/mute/solo and a single delete.
2878
+ *
2879
+ * The slider represents WHERE in the loop the fade sits (earlier ↔ later). Omit
2880
+ * `onSliderChange` to render it read-only.
2881
+ *
2882
+ * @since SDK 2.28.0
2883
+ */
2884
+
2885
+ /** The single (engine track) layer of a fade. */
2886
+ interface FadeLayer {
2887
+ /** Engine track id of this fade's track (also the meter key). */
2888
+ trackId: string;
2889
+ /** Display name of this fade's (newly created) track. */
2890
+ name: string;
2891
+ /** Musical role (drives the auto gesture). */
2892
+ role?: string;
2893
+ /** Name of the SOURCE track this fade was seeded from (origin/target scene). */
2894
+ sourceName?: string;
2895
+ /** Human label of the copied preset/sound, shown in the caption. */
2896
+ soundLabel?: string;
2897
+ /** Playback state for this track. */
2898
+ runtimeState: {
2899
+ muted: boolean;
2900
+ solo: boolean;
2901
+ volume: number;
2902
+ pan: number;
2903
+ };
2904
+ }
2905
+ interface FadeTrackRowProps {
2906
+ /** The lone fade track. */
2907
+ layer: FadeLayer;
2908
+ /** 'in' (enters across the loop) or 'out' (leaves across the loop). */
2909
+ direction: FadeDirection;
2910
+ /** How the fade is shaped — shown read-only (volume = level ramp, build = notes). */
2911
+ gesture: FadeGesture;
2912
+ /** Fade position 0..1 — WHERE in time the fade sits. Defaults centered. */
2913
+ sliderPos?: number;
2914
+ /** Toggle mute. */
2915
+ onMuteToggle: () => void;
2916
+ /** Toggle solo. */
2917
+ onSoloToggle: () => void;
2918
+ /** Change the track's volume. */
2919
+ onVolumeChange: (volume: number) => void;
2920
+ /** Change the track's pan. */
2921
+ onPanChange: (pan: number) => void;
2922
+ /** Delete the fade. */
2923
+ onDelete: () => void;
2924
+ /** Move the fade point. Omit to render the slider read-only. */
2925
+ onSliderChange?: (pos: number) => void;
2926
+ /** Shared meter handle (welds a peak meter to the track). */
2927
+ levels?: TrackLevelsHandle;
2928
+ /** Left-border accent. Defaults to transition purple. */
2929
+ accentColor?: string;
2930
+ }
2931
+ declare function FadeTrackRow({ layer, direction, gesture, sliderPos, onMuteToggle, onSoloToggle, onVolumeChange, onPanChange, onDelete, onSliderChange, levels, accentColor, }: FadeTrackRowProps): React.ReactElement;
2932
+
2933
+ /**
2934
+ * FadeModal — "add a fade" picker for a transition scene.
2935
+ *
2936
+ * Shown only inside a `scene_type='transition'` scene. It self-fetches the FROM
2937
+ * (origin) and TO (target) scenes' family tracks and diffs them by role to find
2938
+ * ORPHANS — tracks with no counterpart on the other side:
2939
+ * - origin-only surplus → "Fade out" candidates (the track leaves)
2940
+ * - target-only surplus → "Fade in" candidates (the track enters)
2941
+ * Tracks whose role is matched on both sides are crossfade territory and are NOT
2942
+ * shown here. A source already used in a crossfade or a fade is hidden (via
2943
+ * excludeSourceDbIds).
2944
+ *
2945
+ * The fade GESTURE (volume vs build) is auto-selected from the track's role and
2946
+ * shown read-only — the user does not choose it. On confirm the modal hands the
2947
+ * selection + direction + gesture to `onCreate`, which the panel implements
2948
+ * (create one track, generate a chord-conforming part, copy the sound, apply a
2949
+ * one-sided volume curve). `onCreate` should reject on failure so the modal can
2950
+ * show it and stay open.
2951
+ *
2952
+ * @since SDK 2.28.0
2953
+ */
2954
+
2955
+ /** A picked orphan track handed to `onCreate`. */
2956
+ interface FadeSelection {
2957
+ /** Source track DB id (selector for getTrackSound + seeding the part). */
2958
+ dbId: string;
2959
+ /** Display name (for the row caption). */
2960
+ name: string;
2961
+ /** Musical role of the source track (drives the auto gesture). */
2962
+ role?: string;
2963
+ }
2964
+ interface FadeModalProps {
2965
+ /** Scoped host — the modal calls listSceneFamilyTracks itself. */
2966
+ host: PluginHost;
2967
+ /** Controls visibility (the panel owns open/closed from its header button). */
2968
+ open: boolean;
2969
+ /** DB id of the transition's FROM (origin) scene. */
2970
+ fromSceneId: string;
2971
+ /** DB id of the transition's TO (target) scene. */
2972
+ toSceneId: string;
2973
+ /** Display name for the origin scene heading (optional). */
2974
+ fromSceneName?: string;
2975
+ /** Display name for the target scene heading (optional). */
2976
+ toSceneName?: string;
2977
+ /** Source-track DB ids already used in a crossfade OR a fade — hidden here. */
2978
+ excludeSourceDbIds?: readonly string[];
2979
+ /** Close handler (Escape, backdrop, Cancel, or after a successful create). */
2980
+ onClose: () => void;
2981
+ /** Build the fade. Should reject on failure so the modal shows it. */
2982
+ onCreate: (selection: FadeSelection, direction: FadeDirection, gesture: FadeGesture) => Promise<void>;
2983
+ /** data-testid prefix. */
2984
+ testIdPrefix?: string;
2985
+ }
2986
+ declare function FadeModal({ host, open, fromSceneId, toSceneId, fromSceneName, toSceneName, excludeSourceDbIds, onClose, onCreate, testIdPrefix, }: FadeModalProps): React.ReactElement | null;
2987
+
2766
2988
  /**
2767
2989
  * ImportTrackModal — "import a track from another scene" picker (SDK component).
2768
2990
  *
@@ -2826,8 +3048,9 @@ declare function ImportTrackModal({ host, open, onClose, onImported, title, test
2826
3048
  *
2827
3049
  * Shown only inside a `scene_type='transition'` scene. The user picks an ORIGIN
2828
3050
  * track (from the transition's FROM scene) and a TARGET track (from its TO
2829
- * scene). Crossfades are same-role: once an origin is chosen, the target
2830
- * dropdown is filtered to the origin's role.
3051
+ * scene), in ANY order the only constraint is same plugin/family (the picker is
3052
+ * per-panel). A source track already used in a crossfade is hidden (via
3053
+ * excludeSourceDbIds), so each source is used at most once.
2831
3054
  *
2832
3055
  * Self-fetching: given the scoped `host`, it calls `host.listSceneFamilyTracks`
2833
3056
  * for both scenes (ungated — a transition deliberately bridges different keys).
@@ -2845,7 +3068,7 @@ interface CrossfadeSelection {
2845
3068
  dbId: string;
2846
3069
  /** Display name (for the row caption). */
2847
3070
  name: string;
2848
- /** Musical role (same for both enforced by the picker). */
3071
+ /** Musical role of the source track (the panel uses the TARGET's for generation). */
2849
3072
  role?: string;
2850
3073
  }
2851
3074
  interface CrossfadeModalProps {
@@ -2861,6 +3084,12 @@ interface CrossfadeModalProps {
2861
3084
  fromSceneName?: string;
2862
3085
  /** Display name for the target scene heading (optional). */
2863
3086
  toSceneName?: string;
3087
+ /**
3088
+ * Source-track DB ids already used in a crossfade (origin + target of every
3089
+ * existing pair in this panel). Hidden from BOTH dropdowns so each source is
3090
+ * used at most once. @since SDK 2.26.0
3091
+ */
3092
+ excludeSourceDbIds?: readonly string[];
2864
3093
  /** Close handler (Escape, backdrop, Cancel, or after a successful create). */
2865
3094
  onClose: () => void;
2866
3095
  /** Build the crossfade pair. Should reject on failure so the modal shows it. */
@@ -2868,7 +3097,7 @@ interface CrossfadeModalProps {
2868
3097
  /** data-testid prefix. */
2869
3098
  testIdPrefix?: string;
2870
3099
  }
2871
- declare function CrossfadeModal({ host, open, fromSceneId, toSceneId, fromSceneName, toSceneName, onClose, onCreate, testIdPrefix, }: CrossfadeModalProps): React.ReactElement | null;
3100
+ declare function CrossfadeModal({ host, open, fromSceneId, toSceneId, fromSceneName, toSceneName, excludeSourceDbIds, onClose, onCreate, testIdPrefix, }: CrossfadeModalProps): React.ReactElement | null;
2872
3101
 
2873
3102
  /**
2874
3103
  * ConfirmDialog — styled in-app confirmation modal (SDK component).
@@ -3593,7 +3822,7 @@ declare function useSoundHistory(applySound: (trackId: string, descriptor: unkno
3593
3822
  * Registry checks semver.gte(PLUGIN_SDK_VERSION, manifest.minHostVersion)
3594
3823
  * during activation and marks incompatible plugins accordingly.
3595
3824
  */
3596
- declare const PLUGIN_SDK_VERSION = "2.25.0";
3825
+ declare const PLUGIN_SDK_VERSION = "2.28.0";
3597
3826
 
3598
3827
  /**
3599
3828
  * FX Preset Definitions
@@ -3741,4 +3970,4 @@ interface PickTopKOptions {
3741
3970
  */
3742
3971
  declare function pickTopKWeighted<T>(scored: ReadonlyArray<ScoredCandidate<T>>, options?: PickTopKOptions): T | null;
3743
3972
 
3744
- export { type AudioInputDevice, type BulkAddPlaceholderTrack, type ComposeProgressEvent, type ComposeProgressListener, type ComposeSceneOptions, type ComposeSceneResult, ConfirmDialog, type ConfirmDialogProps, type CreateTrackOptions, type CrossfadeInpaintInput, type CrossfadeLayer, type CrossfadeMeta, CrossfadeModal, type CrossfadeModalProps, type CrossfadePairMeta, type CrossfadeSelection, type CrossfadeSlot, CrossfadeTrackRow, type CrossfadeTrackRowProps, type CrossfadeVolumeCurves, DB_MAX, DB_MIN, DEFAULT_FX_CATEGORY_DETAIL, DEFAULT_FX_DRY_WET, DRAG_DEAD_ZONE, type DeckBoundaryEvent, type DeckBoundaryListener, DownloadPackButton, type DownloadPackButtonProps, type DownloadPackButtonVariant, type DrawerTab, type DrumKit, EMPTY_FX_DETAIL_STATE, EMPTY_FX_STATE, EQUAL_POWER_GAIN, type ExportMidiBundleOptions, type ExportMidiBundleResult, type ExportedPluginData, FX_CATEGORIES, FX_CHAIN_ORDER, FX_DISPLAY_LABELS, FX_ENGINE_PLUGIN_NAMES, FX_PRESET_CONFIGS, type FxCategory, type FxCategoryDetailState, type FxPreset, type FxPresetConfig, type FxPresetData, type FxPresetDataEntry, FxToggleBar, type FxToggleBarProps, GUTTER_W, type GeneratorPlugin, type GeneratorType, type ImportCandidateScene, type ImportCandidateTrack, ImportTrackModal, type ImportTrackModalProps, type InstrumentDescriptor, TrackDrawer as InstrumentDrawer, type TrackDrawerProps as InstrumentDrawerProps, type InstrumentSampler, type InstrumentZone, type LLMCandidate, type LLMContent, type LLMFunctionDeclaration, type LLMGenerationConfig, type LLMGenerationRequest, type LLMGenerationResult, type LLMPart, type LLMSystemInstruction, type LLMTool, type LLMToolUseRequest, type LLMToolUseResponse, type LLMUsageMetadata, LevelMeter, type LevelMeterProps, type ListAudioFilesOptions, type ListImportableTracksOptions, type MidiClipData, type MidiWriteResult, type MixInterpolation, Modal, type ModalProps, type MusicalContext, OffsetScrubber, type OffsetScrubberProps, PLUGIN_SDK_VERSION, PX_PER_BEAT, PanSlider, type PeakAnalysis, PianoRollEditor, type PianoRollEditorProps, type PickTopKOptions, type PluginAppTool, type PluginAppToolInputSchema, type PluginAppToolResult, type PluginAudioTextureRequest, type PluginAudioTextureResult, type PluginCapabilities, type PluginChordSegment, type PluginChordTiming, type PluginConcurrentTrackInfo, type PluginCuePoints, type PluginDownloadOptions, PluginError, type PluginErrorCode, type PluginFileDialogOptions, type PluginFxCategoryDetailState, type PluginGenerationContext, type PluginHost, type PluginHttpRequestOptions, type PluginHttpResponse, type PluginManifest, type PluginMidiNote, type PluginPresetData, type PluginPresetInfo, type PluginRegistration, type PluginSampleFilter, type PluginSampleImportResult, type PluginSampleInfo, type PluginSampleTrackInfo, type PluginSceneContext, type PluginSceneInfo, type PluginSettingsSchema, type PluginSettingsStore, type PluginSkill, type PluginSkillInputSchema, type PluginStatus, type PluginStemSplitResult, type PluginStemTrackInfo, type PluginSynthInfo, type PluginTrackFxDetailState, type PluginTrackHandle, type PluginTrackInfo, type PluginTrackLevel, type PluginTrackRuntimeState, type PluginTransportState, type PluginTrimWindow, type PluginUIProps, type PostProcessOptions, RESIZE_HANDLE_PX, ROW_HEIGHT, type ReadMidiClip, type ReadMidiResult, type RecordingChunkFinalizedEvent, type RecordingTargetInfo, type SDKTrackRowProps, SLIDER_UNITY, SamplePackCTACard, type SamplePackCTACardProps, type SamplePackCTACardStatus, type SamplePackCardInfo, type SavePluginPresetOptions, type SceneChangeListener, type SceneFamilyTrack, type ScoredCandidate, ScrollingWaveform, type ScrollingWaveformProps, type SettingDefinition, type ShufflePresetResult, SorceryProgressBar, type SoundHistoryEntry, type StemType, type SynthesizeCuePointsOptions, TrackDrawer, type TrackDrawerProps, type TrackFxDetailState, type TrackFxState, type TrackLevelsHandle, TrackMeterStrip, type TrackMeterStripProps, type TrackMeterView, TrackRow, type TrackRowDragProps, type TrackSoundHistory, type TrackSoundSnapshot, type TrackStateChangeListener, type TransportEvent, type TransportEventListener, type UnsubscribeFn, type UseSoundHistoryOptions, type UseSoundHistoryResult, type UseTrackReorderOptions, type UseTrackReorderResult, type VolumeAutomationPoint, VolumeSlider, type WaveformPeaks, WaveformView, type WaveformViewProps, analyzeWavPeak, asCrossfadeMeta, buildCrossfadeInpaintPrompt, buildCrossfadeVolumeCurves, calculateTimeBasedTarget, cellToPx, centerScrollTop, computePeaks, dbToSlider, drawWaveform, formatConcurrentTracks, moveItem, parseCrossfadePairs, pickTopKWeighted, pitchToName, pxToCell, resizeNoteDuration, scorePromptMatch, sliderToDb, synthesizeCuePoints, tokenizePrompt, transposeNotes, useAnySolo, useSceneState, useSoundHistory, useTrackLevel, useTrackLevels, useTrackMeter, useTrackReorder, useTransportPlaying };
3973
+ export { type AudioInputDevice, type BulkAddPlaceholderTrack, type ComposeProgressEvent, type ComposeProgressListener, type ComposeSceneOptions, type ComposeSceneResult, ConfirmDialog, type ConfirmDialogProps, type CreateTrackOptions, type CrossfadeInpaintInput, type CrossfadeLayer, type CrossfadeMeta, CrossfadeModal, type CrossfadeModalProps, type CrossfadePairMeta, type CrossfadeSelection, type CrossfadeSlot, CrossfadeTrackRow, type CrossfadeTrackRowProps, type CrossfadeVolumeCurves, DB_MAX, DB_MIN, DEFAULT_FX_CATEGORY_DETAIL, DEFAULT_FX_DRY_WET, DRAG_DEAD_ZONE, type DeckBoundaryEvent, type DeckBoundaryListener, DownloadPackButton, type DownloadPackButtonProps, type DownloadPackButtonVariant, type DrawerTab, type DrumKit, EMPTY_FX_DETAIL_STATE, EMPTY_FX_STATE, EQUAL_POWER_GAIN, type ExportMidiBundleOptions, type ExportMidiBundleResult, type ExportedPluginData, FX_CATEGORIES, FX_CHAIN_ORDER, FX_DISPLAY_LABELS, FX_ENGINE_PLUGIN_NAMES, FX_PRESET_CONFIGS, type FadeDirection, type FadeEntry, type FadeGesture, type FadeLayer, type FadeMeta, FadeModal, type FadeModalProps, type FadeSelection, FadeTrackRow, type FadeTrackRowProps, type FxCategory, type FxCategoryDetailState, type FxPreset, type FxPresetConfig, type FxPresetData, type FxPresetDataEntry, FxToggleBar, type FxToggleBarProps, GUTTER_W, type GeneratorPlugin, type GeneratorType, type ImportCandidateScene, type ImportCandidateTrack, ImportTrackModal, type ImportTrackModalProps, type InstrumentDescriptor, TrackDrawer as InstrumentDrawer, type TrackDrawerProps as InstrumentDrawerProps, type InstrumentSampler, type InstrumentZone, type LLMCandidate, type LLMContent, type LLMFunctionDeclaration, type LLMGenerationConfig, type LLMGenerationRequest, type LLMGenerationResult, type LLMPart, type LLMSystemInstruction, type LLMTool, type LLMToolUseRequest, type LLMToolUseResponse, type LLMUsageMetadata, LevelMeter, type LevelMeterProps, type ListAudioFilesOptions, type ListImportableTracksOptions, type MidiClipData, type MidiWriteResult, type MixInterpolation, Modal, type ModalProps, type MusicalContext, OffsetScrubber, type OffsetScrubberProps, PLUGIN_SDK_VERSION, PX_PER_BEAT, PanSlider, type PeakAnalysis, PianoRollEditor, type PianoRollEditorProps, type PickTopKOptions, type PluginAppTool, type PluginAppToolInputSchema, type PluginAppToolResult, type PluginAudioTextureRequest, type PluginAudioTextureResult, type PluginCapabilities, type PluginChordSegment, type PluginChordTiming, type PluginConcurrentTrackInfo, type PluginCuePoints, type PluginDownloadOptions, PluginError, type PluginErrorCode, type PluginFileDialogOptions, type PluginFxCategoryDetailState, type PluginGenerationContext, type PluginHost, type PluginHttpRequestOptions, type PluginHttpResponse, type PluginManifest, type PluginMidiNote, type PluginPresetData, type PluginPresetInfo, type PluginRegistration, type PluginSampleFilter, type PluginSampleImportResult, type PluginSampleInfo, type PluginSampleTrackInfo, type PluginSceneContext, type PluginSceneInfo, type PluginSettingsSchema, type PluginSettingsStore, type PluginSkill, type PluginSkillInputSchema, type PluginStatus, type PluginStemSplitResult, type PluginStemTrackInfo, type PluginSynthInfo, type PluginTrackFxDetailState, type PluginTrackHandle, type PluginTrackInfo, type PluginTrackLevel, type PluginTrackRuntimeState, type PluginTransportState, type PluginTrimWindow, type PluginUIProps, type PostProcessOptions, RESIZE_HANDLE_PX, ROW_HEIGHT, type ReadMidiClip, type ReadMidiResult, type RecordingChunkFinalizedEvent, type RecordingTargetInfo, type SDKTrackRowProps, SLIDER_UNITY, SamplePackCTACard, type SamplePackCTACardProps, type SamplePackCTACardStatus, type SamplePackCardInfo, type SavePluginPresetOptions, type SceneChangeListener, type SceneFamilyTrack, type ScoredCandidate, ScrollingWaveform, type ScrollingWaveformProps, type SettingDefinition, type ShufflePresetResult, SorceryProgressBar, type SoundHistoryEntry, type StemType, type SynthesizeCuePointsOptions, TEXTURAL_ROLES, TrackDrawer, type TrackDrawerProps, type TrackFxDetailState, type TrackFxState, type TrackLevelsHandle, TrackMeterStrip, type TrackMeterStripProps, type TrackMeterView, TrackRow, type TrackRowDragProps, type TrackSoundHistory, type TrackSoundSnapshot, type TrackStateChangeListener, type TransportEvent, type TransportEventListener, type UnsubscribeFn, type UseSoundHistoryOptions, type UseSoundHistoryResult, type UseTrackReorderOptions, type UseTrackReorderResult, type VolumeAutomationPoint, VolumeSlider, type WaveformPeaks, WaveformView, type WaveformViewProps, analyzeWavPeak, asCrossfadeMeta, asFadeMeta, buildCrossfadeInpaintPrompt, buildCrossfadeVolumeCurves, buildFadeVolumeCurve, calculateTimeBasedTarget, cellToPx, centerScrollTop, computePeaks, dbToSlider, defaultFadeGesture, drawWaveform, formatConcurrentTracks, moveItem, parseCrossfadePairs, parseFades, pickTopKWeighted, pitchToName, pxToCell, resizeNoteDuration, scorePromptMatch, sliderToDb, synthesizeCuePoints, tokenizePrompt, transposeNotes, useAnySolo, useSceneState, useSoundHistory, useTrackLevel, useTrackLevels, useTrackMeter, useTrackReorder, useTransportPlaying };
package/dist/index.d.ts CHANGED
@@ -547,6 +547,11 @@ interface PluginHost {
547
547
  key: string;
548
548
  mode: string;
549
549
  } | null>;
550
+ /**
551
+ * Read a scene's human display name by db id (for labelling a crossfade's
552
+ * origin/target scenes). Optional — callers MUST null-check. @since SDK 2.26.0
553
+ */
554
+ getSceneName?(sceneDbId: string): Promise<string | null>;
550
555
  /** Subscribe to transport state changes. Returns unsubscribe function. */
551
556
  onTransportEvent(listener: TransportEventListener): UnsubscribeFn;
552
557
  /** Subscribe to deck boundary events. Returns unsubscribe function. */
@@ -1192,6 +1197,10 @@ interface SceneFamilyTrack {
1192
1197
  name: string;
1193
1198
  /** Musical role if set — used to enforce same-role crossfade pairing. */
1194
1199
  role?: string;
1200
+ /** Generation prompt, when the track was AI-generated. The crossfade picker
1201
+ * shows this as the primary label (users recognise tracks by prompt, not id).
1202
+ * @since SDK 2.27.0 */
1203
+ prompt?: string;
1195
1204
  }
1196
1205
  /**
1197
1206
  * One OTHER scene and its candidate tracks (already type-filtered). Scenes with
@@ -2602,6 +2611,10 @@ interface CrossfadePairMeta {
2602
2611
  sliderPos: number;
2603
2612
  originDbId: string;
2604
2613
  targetDbId: string;
2614
+ /** DB id of the ORIGIN source track (in the from scene) — drives the "used once" exclusion. */
2615
+ originSourceDbId: string;
2616
+ /** DB id of the TARGET source track (in the to scene). */
2617
+ targetSourceDbId: string;
2605
2618
  originSourceName: string;
2606
2619
  originSoundLabel: string;
2607
2620
  targetSourceName: string;
@@ -2763,6 +2776,215 @@ interface CrossfadeInpaintInput {
2763
2776
  */
2764
2777
  declare function buildCrossfadeInpaintPrompt(input: CrossfadeInpaintInput): string;
2765
2778
 
2779
+ /**
2780
+ * Fade metadata — family-agnostic types + parsing for transition orphan fades
2781
+ * (synth / drum / instrument panels).
2782
+ *
2783
+ * A fade is a CROSSFADE WITH ONE EMPTY ENDPOINT: a single generated track that
2784
+ * either fades IN (a target-only track entering — `morph(∅ → target)`) or fades
2785
+ * OUT (an origin-only track leaving — `morph(origin → ∅)`) across the transition
2786
+ * loop. It reuses the same generation pipeline (`buildCrossfadeInpaintPrompt`
2787
+ * with one empty endpoint) and the same volume-automation fader as crossfade.
2788
+ *
2789
+ * Stored in scene plugin_data under `track:<dbId>:fade` (ONE entry per track —
2790
+ * unlike crossfade there is no partner / groupId). Kept as a SEPARATE type from
2791
+ * crossfade so the load-bearing "drop a half-broken pair" guard in
2792
+ * `parseCrossfadePairs` stays intact.
2793
+ *
2794
+ * @since SDK 2.28.0
2795
+ */
2796
+
2797
+ /** Which way the lone track fades over the transition. */
2798
+ type FadeDirection = 'in' | 'out';
2799
+ /**
2800
+ * How the fade is shaped:
2801
+ * - `volume` — a one-sided level ramp does the work (DJ-style). Best for
2802
+ * textural/sustained material (pads, atmospheres).
2803
+ * - `build` — the MIDI carries the fade (the inpaint grows sparse→full on the way
2804
+ * in, or dissolves on the way out); the level stays flat. Best for articulated
2805
+ * material (lead, bass, drums, winds, vocals).
2806
+ */
2807
+ type FadeGesture = 'volume' | 'build';
2808
+ /** Per-track fade metadata (one scene-data value per fade track). */
2809
+ interface FadeMeta {
2810
+ direction: FadeDirection;
2811
+ gesture: FadeGesture;
2812
+ /** DB id of the SOURCE track this fade's preset/sample + pattern was seeded from. */
2813
+ sourceTrackDbId: string;
2814
+ /** DB id of the scene the source track lives in (the from/to scene). */
2815
+ sourceSceneId: string;
2816
+ /** Source track display name (shown in the caption). */
2817
+ sourceName: string;
2818
+ /** Copied preset/sample label (shown in the caption). */
2819
+ soundLabel: string;
2820
+ /** Fade position 0..1 — WHERE in time the fade midpoint sits. */
2821
+ sliderPos: number;
2822
+ }
2823
+ /** A fade entry resolved from scene data: the fade track's dbId + its metadata. */
2824
+ interface FadeEntry {
2825
+ dbId: string;
2826
+ meta: FadeMeta;
2827
+ }
2828
+ /** Narrow an unknown scene-data value to FadeMeta (defensive — survives partial blobs). */
2829
+ declare function asFadeMeta(val: unknown): FadeMeta | null;
2830
+ /**
2831
+ * Scan all `track:<dbId>:fade` keys in a scene's plugin_data and return one entry
2832
+ * per valid fade. Unlike crossfade there is no grouping or both-present gate — a
2833
+ * fade is intrinsically a single track.
2834
+ */
2835
+ declare function parseFades(sceneData: Record<string, unknown>): FadeEntry[];
2836
+ /**
2837
+ * Build a ONE-sided volume-automation curve for a fade over `bars` at `bpm`.
2838
+ *
2839
+ * - `gesture === 'build'` → flat at unity (0 dB). The compositional build in the
2840
+ * MIDI carries the fade; layering a volume ramp on top would double-fade.
2841
+ * - `gesture === 'volume'` → an equal-power ramp identical to ONE half of
2842
+ * `buildCrossfadeVolumeCurves`: fade-out ≡ its `origin` curve (unity→floor),
2843
+ * fade-in ≡ its `target` curve (floor→unity). `sliderPos` sets WHERE the −3 dB
2844
+ * midpoint sits in time.
2845
+ *
2846
+ * Points span [0, durationSeconds] so the engine re-reads them each loop. Returns
2847
+ * dB points for `host.setTrackVolumeAutomation`.
2848
+ *
2849
+ * @since SDK 2.28.0
2850
+ */
2851
+ declare function buildFadeVolumeCurve(bars: number, bpm: number, direction: FadeDirection, sliderPos: number, gesture: FadeGesture, steps?: number): VolumeAutomationPoint[];
2852
+ /**
2853
+ * Roles whose fades default to a `volume` (level) ramp — sustained/textural
2854
+ * material that enters/leaves by level in real productions. Everything else
2855
+ * defaults to `build` (the notes carry the fade).
2856
+ *
2857
+ * This is a UI default heuristic over role tokens, NOT the canonical role list
2858
+ * (that lives in the app's instrument-classification + `host.getValidRoles()`).
2859
+ * There is no textural↔articulated axis in the taxonomy, so this small curated
2860
+ * subset lives next to its consumer (the fade modal/panels).
2861
+ *
2862
+ * @since SDK 2.28.0
2863
+ */
2864
+ declare const TEXTURAL_ROLES: ReadonlySet<string>;
2865
+ /** Pick the default fade gesture for a track's role (textural → volume, else build). */
2866
+ declare function defaultFadeGesture(role: string | null | undefined): FadeGesture;
2867
+
2868
+ /**
2869
+ * FadeTrackRow — a transition "fade track": a single locked TrackRow with a
2870
+ * direction badge (Fade in / Fade out) and a one-sided fade slider.
2871
+ *
2872
+ * A fade is a crossfade with one empty endpoint — a lone generated track that
2873
+ * either enters (fade in, for a target-only track) or leaves (fade out, for an
2874
+ * origin-only track) across the transition loop. Like a crossfade layer, the
2875
+ * sound/generation controls are omitted (the SDK TrackRow is "controlled by
2876
+ * omission"): no shuffle / Create / preset-pick / FX / drawer / inner-delete.
2877
+ * What remains: per-track volume/pan/mute/solo and a single delete.
2878
+ *
2879
+ * The slider represents WHERE in the loop the fade sits (earlier ↔ later). Omit
2880
+ * `onSliderChange` to render it read-only.
2881
+ *
2882
+ * @since SDK 2.28.0
2883
+ */
2884
+
2885
+ /** The single (engine track) layer of a fade. */
2886
+ interface FadeLayer {
2887
+ /** Engine track id of this fade's track (also the meter key). */
2888
+ trackId: string;
2889
+ /** Display name of this fade's (newly created) track. */
2890
+ name: string;
2891
+ /** Musical role (drives the auto gesture). */
2892
+ role?: string;
2893
+ /** Name of the SOURCE track this fade was seeded from (origin/target scene). */
2894
+ sourceName?: string;
2895
+ /** Human label of the copied preset/sound, shown in the caption. */
2896
+ soundLabel?: string;
2897
+ /** Playback state for this track. */
2898
+ runtimeState: {
2899
+ muted: boolean;
2900
+ solo: boolean;
2901
+ volume: number;
2902
+ pan: number;
2903
+ };
2904
+ }
2905
+ interface FadeTrackRowProps {
2906
+ /** The lone fade track. */
2907
+ layer: FadeLayer;
2908
+ /** 'in' (enters across the loop) or 'out' (leaves across the loop). */
2909
+ direction: FadeDirection;
2910
+ /** How the fade is shaped — shown read-only (volume = level ramp, build = notes). */
2911
+ gesture: FadeGesture;
2912
+ /** Fade position 0..1 — WHERE in time the fade sits. Defaults centered. */
2913
+ sliderPos?: number;
2914
+ /** Toggle mute. */
2915
+ onMuteToggle: () => void;
2916
+ /** Toggle solo. */
2917
+ onSoloToggle: () => void;
2918
+ /** Change the track's volume. */
2919
+ onVolumeChange: (volume: number) => void;
2920
+ /** Change the track's pan. */
2921
+ onPanChange: (pan: number) => void;
2922
+ /** Delete the fade. */
2923
+ onDelete: () => void;
2924
+ /** Move the fade point. Omit to render the slider read-only. */
2925
+ onSliderChange?: (pos: number) => void;
2926
+ /** Shared meter handle (welds a peak meter to the track). */
2927
+ levels?: TrackLevelsHandle;
2928
+ /** Left-border accent. Defaults to transition purple. */
2929
+ accentColor?: string;
2930
+ }
2931
+ declare function FadeTrackRow({ layer, direction, gesture, sliderPos, onMuteToggle, onSoloToggle, onVolumeChange, onPanChange, onDelete, onSliderChange, levels, accentColor, }: FadeTrackRowProps): React.ReactElement;
2932
+
2933
+ /**
2934
+ * FadeModal — "add a fade" picker for a transition scene.
2935
+ *
2936
+ * Shown only inside a `scene_type='transition'` scene. It self-fetches the FROM
2937
+ * (origin) and TO (target) scenes' family tracks and diffs them by role to find
2938
+ * ORPHANS — tracks with no counterpart on the other side:
2939
+ * - origin-only surplus → "Fade out" candidates (the track leaves)
2940
+ * - target-only surplus → "Fade in" candidates (the track enters)
2941
+ * Tracks whose role is matched on both sides are crossfade territory and are NOT
2942
+ * shown here. A source already used in a crossfade or a fade is hidden (via
2943
+ * excludeSourceDbIds).
2944
+ *
2945
+ * The fade GESTURE (volume vs build) is auto-selected from the track's role and
2946
+ * shown read-only — the user does not choose it. On confirm the modal hands the
2947
+ * selection + direction + gesture to `onCreate`, which the panel implements
2948
+ * (create one track, generate a chord-conforming part, copy the sound, apply a
2949
+ * one-sided volume curve). `onCreate` should reject on failure so the modal can
2950
+ * show it and stay open.
2951
+ *
2952
+ * @since SDK 2.28.0
2953
+ */
2954
+
2955
+ /** A picked orphan track handed to `onCreate`. */
2956
+ interface FadeSelection {
2957
+ /** Source track DB id (selector for getTrackSound + seeding the part). */
2958
+ dbId: string;
2959
+ /** Display name (for the row caption). */
2960
+ name: string;
2961
+ /** Musical role of the source track (drives the auto gesture). */
2962
+ role?: string;
2963
+ }
2964
+ interface FadeModalProps {
2965
+ /** Scoped host — the modal calls listSceneFamilyTracks itself. */
2966
+ host: PluginHost;
2967
+ /** Controls visibility (the panel owns open/closed from its header button). */
2968
+ open: boolean;
2969
+ /** DB id of the transition's FROM (origin) scene. */
2970
+ fromSceneId: string;
2971
+ /** DB id of the transition's TO (target) scene. */
2972
+ toSceneId: string;
2973
+ /** Display name for the origin scene heading (optional). */
2974
+ fromSceneName?: string;
2975
+ /** Display name for the target scene heading (optional). */
2976
+ toSceneName?: string;
2977
+ /** Source-track DB ids already used in a crossfade OR a fade — hidden here. */
2978
+ excludeSourceDbIds?: readonly string[];
2979
+ /** Close handler (Escape, backdrop, Cancel, or after a successful create). */
2980
+ onClose: () => void;
2981
+ /** Build the fade. Should reject on failure so the modal shows it. */
2982
+ onCreate: (selection: FadeSelection, direction: FadeDirection, gesture: FadeGesture) => Promise<void>;
2983
+ /** data-testid prefix. */
2984
+ testIdPrefix?: string;
2985
+ }
2986
+ declare function FadeModal({ host, open, fromSceneId, toSceneId, fromSceneName, toSceneName, excludeSourceDbIds, onClose, onCreate, testIdPrefix, }: FadeModalProps): React.ReactElement | null;
2987
+
2766
2988
  /**
2767
2989
  * ImportTrackModal — "import a track from another scene" picker (SDK component).
2768
2990
  *
@@ -2826,8 +3048,9 @@ declare function ImportTrackModal({ host, open, onClose, onImported, title, test
2826
3048
  *
2827
3049
  * Shown only inside a `scene_type='transition'` scene. The user picks an ORIGIN
2828
3050
  * track (from the transition's FROM scene) and a TARGET track (from its TO
2829
- * scene). Crossfades are same-role: once an origin is chosen, the target
2830
- * dropdown is filtered to the origin's role.
3051
+ * scene), in ANY order the only constraint is same plugin/family (the picker is
3052
+ * per-panel). A source track already used in a crossfade is hidden (via
3053
+ * excludeSourceDbIds), so each source is used at most once.
2831
3054
  *
2832
3055
  * Self-fetching: given the scoped `host`, it calls `host.listSceneFamilyTracks`
2833
3056
  * for both scenes (ungated — a transition deliberately bridges different keys).
@@ -2845,7 +3068,7 @@ interface CrossfadeSelection {
2845
3068
  dbId: string;
2846
3069
  /** Display name (for the row caption). */
2847
3070
  name: string;
2848
- /** Musical role (same for both enforced by the picker). */
3071
+ /** Musical role of the source track (the panel uses the TARGET's for generation). */
2849
3072
  role?: string;
2850
3073
  }
2851
3074
  interface CrossfadeModalProps {
@@ -2861,6 +3084,12 @@ interface CrossfadeModalProps {
2861
3084
  fromSceneName?: string;
2862
3085
  /** Display name for the target scene heading (optional). */
2863
3086
  toSceneName?: string;
3087
+ /**
3088
+ * Source-track DB ids already used in a crossfade (origin + target of every
3089
+ * existing pair in this panel). Hidden from BOTH dropdowns so each source is
3090
+ * used at most once. @since SDK 2.26.0
3091
+ */
3092
+ excludeSourceDbIds?: readonly string[];
2864
3093
  /** Close handler (Escape, backdrop, Cancel, or after a successful create). */
2865
3094
  onClose: () => void;
2866
3095
  /** Build the crossfade pair. Should reject on failure so the modal shows it. */
@@ -2868,7 +3097,7 @@ interface CrossfadeModalProps {
2868
3097
  /** data-testid prefix. */
2869
3098
  testIdPrefix?: string;
2870
3099
  }
2871
- declare function CrossfadeModal({ host, open, fromSceneId, toSceneId, fromSceneName, toSceneName, onClose, onCreate, testIdPrefix, }: CrossfadeModalProps): React.ReactElement | null;
3100
+ declare function CrossfadeModal({ host, open, fromSceneId, toSceneId, fromSceneName, toSceneName, excludeSourceDbIds, onClose, onCreate, testIdPrefix, }: CrossfadeModalProps): React.ReactElement | null;
2872
3101
 
2873
3102
  /**
2874
3103
  * ConfirmDialog — styled in-app confirmation modal (SDK component).
@@ -3593,7 +3822,7 @@ declare function useSoundHistory(applySound: (trackId: string, descriptor: unkno
3593
3822
  * Registry checks semver.gte(PLUGIN_SDK_VERSION, manifest.minHostVersion)
3594
3823
  * during activation and marks incompatible plugins accordingly.
3595
3824
  */
3596
- declare const PLUGIN_SDK_VERSION = "2.25.0";
3825
+ declare const PLUGIN_SDK_VERSION = "2.28.0";
3597
3826
 
3598
3827
  /**
3599
3828
  * FX Preset Definitions
@@ -3741,4 +3970,4 @@ interface PickTopKOptions {
3741
3970
  */
3742
3971
  declare function pickTopKWeighted<T>(scored: ReadonlyArray<ScoredCandidate<T>>, options?: PickTopKOptions): T | null;
3743
3972
 
3744
- export { type AudioInputDevice, type BulkAddPlaceholderTrack, type ComposeProgressEvent, type ComposeProgressListener, type ComposeSceneOptions, type ComposeSceneResult, ConfirmDialog, type ConfirmDialogProps, type CreateTrackOptions, type CrossfadeInpaintInput, type CrossfadeLayer, type CrossfadeMeta, CrossfadeModal, type CrossfadeModalProps, type CrossfadePairMeta, type CrossfadeSelection, type CrossfadeSlot, CrossfadeTrackRow, type CrossfadeTrackRowProps, type CrossfadeVolumeCurves, DB_MAX, DB_MIN, DEFAULT_FX_CATEGORY_DETAIL, DEFAULT_FX_DRY_WET, DRAG_DEAD_ZONE, type DeckBoundaryEvent, type DeckBoundaryListener, DownloadPackButton, type DownloadPackButtonProps, type DownloadPackButtonVariant, type DrawerTab, type DrumKit, EMPTY_FX_DETAIL_STATE, EMPTY_FX_STATE, EQUAL_POWER_GAIN, type ExportMidiBundleOptions, type ExportMidiBundleResult, type ExportedPluginData, FX_CATEGORIES, FX_CHAIN_ORDER, FX_DISPLAY_LABELS, FX_ENGINE_PLUGIN_NAMES, FX_PRESET_CONFIGS, type FxCategory, type FxCategoryDetailState, type FxPreset, type FxPresetConfig, type FxPresetData, type FxPresetDataEntry, FxToggleBar, type FxToggleBarProps, GUTTER_W, type GeneratorPlugin, type GeneratorType, type ImportCandidateScene, type ImportCandidateTrack, ImportTrackModal, type ImportTrackModalProps, type InstrumentDescriptor, TrackDrawer as InstrumentDrawer, type TrackDrawerProps as InstrumentDrawerProps, type InstrumentSampler, type InstrumentZone, type LLMCandidate, type LLMContent, type LLMFunctionDeclaration, type LLMGenerationConfig, type LLMGenerationRequest, type LLMGenerationResult, type LLMPart, type LLMSystemInstruction, type LLMTool, type LLMToolUseRequest, type LLMToolUseResponse, type LLMUsageMetadata, LevelMeter, type LevelMeterProps, type ListAudioFilesOptions, type ListImportableTracksOptions, type MidiClipData, type MidiWriteResult, type MixInterpolation, Modal, type ModalProps, type MusicalContext, OffsetScrubber, type OffsetScrubberProps, PLUGIN_SDK_VERSION, PX_PER_BEAT, PanSlider, type PeakAnalysis, PianoRollEditor, type PianoRollEditorProps, type PickTopKOptions, type PluginAppTool, type PluginAppToolInputSchema, type PluginAppToolResult, type PluginAudioTextureRequest, type PluginAudioTextureResult, type PluginCapabilities, type PluginChordSegment, type PluginChordTiming, type PluginConcurrentTrackInfo, type PluginCuePoints, type PluginDownloadOptions, PluginError, type PluginErrorCode, type PluginFileDialogOptions, type PluginFxCategoryDetailState, type PluginGenerationContext, type PluginHost, type PluginHttpRequestOptions, type PluginHttpResponse, type PluginManifest, type PluginMidiNote, type PluginPresetData, type PluginPresetInfo, type PluginRegistration, type PluginSampleFilter, type PluginSampleImportResult, type PluginSampleInfo, type PluginSampleTrackInfo, type PluginSceneContext, type PluginSceneInfo, type PluginSettingsSchema, type PluginSettingsStore, type PluginSkill, type PluginSkillInputSchema, type PluginStatus, type PluginStemSplitResult, type PluginStemTrackInfo, type PluginSynthInfo, type PluginTrackFxDetailState, type PluginTrackHandle, type PluginTrackInfo, type PluginTrackLevel, type PluginTrackRuntimeState, type PluginTransportState, type PluginTrimWindow, type PluginUIProps, type PostProcessOptions, RESIZE_HANDLE_PX, ROW_HEIGHT, type ReadMidiClip, type ReadMidiResult, type RecordingChunkFinalizedEvent, type RecordingTargetInfo, type SDKTrackRowProps, SLIDER_UNITY, SamplePackCTACard, type SamplePackCTACardProps, type SamplePackCTACardStatus, type SamplePackCardInfo, type SavePluginPresetOptions, type SceneChangeListener, type SceneFamilyTrack, type ScoredCandidate, ScrollingWaveform, type ScrollingWaveformProps, type SettingDefinition, type ShufflePresetResult, SorceryProgressBar, type SoundHistoryEntry, type StemType, type SynthesizeCuePointsOptions, TrackDrawer, type TrackDrawerProps, type TrackFxDetailState, type TrackFxState, type TrackLevelsHandle, TrackMeterStrip, type TrackMeterStripProps, type TrackMeterView, TrackRow, type TrackRowDragProps, type TrackSoundHistory, type TrackSoundSnapshot, type TrackStateChangeListener, type TransportEvent, type TransportEventListener, type UnsubscribeFn, type UseSoundHistoryOptions, type UseSoundHistoryResult, type UseTrackReorderOptions, type UseTrackReorderResult, type VolumeAutomationPoint, VolumeSlider, type WaveformPeaks, WaveformView, type WaveformViewProps, analyzeWavPeak, asCrossfadeMeta, buildCrossfadeInpaintPrompt, buildCrossfadeVolumeCurves, calculateTimeBasedTarget, cellToPx, centerScrollTop, computePeaks, dbToSlider, drawWaveform, formatConcurrentTracks, moveItem, parseCrossfadePairs, pickTopKWeighted, pitchToName, pxToCell, resizeNoteDuration, scorePromptMatch, sliderToDb, synthesizeCuePoints, tokenizePrompt, transposeNotes, useAnySolo, useSceneState, useSoundHistory, useTrackLevel, useTrackLevels, useTrackMeter, useTrackReorder, useTransportPlaying };
3973
+ export { type AudioInputDevice, type BulkAddPlaceholderTrack, type ComposeProgressEvent, type ComposeProgressListener, type ComposeSceneOptions, type ComposeSceneResult, ConfirmDialog, type ConfirmDialogProps, type CreateTrackOptions, type CrossfadeInpaintInput, type CrossfadeLayer, type CrossfadeMeta, CrossfadeModal, type CrossfadeModalProps, type CrossfadePairMeta, type CrossfadeSelection, type CrossfadeSlot, CrossfadeTrackRow, type CrossfadeTrackRowProps, type CrossfadeVolumeCurves, DB_MAX, DB_MIN, DEFAULT_FX_CATEGORY_DETAIL, DEFAULT_FX_DRY_WET, DRAG_DEAD_ZONE, type DeckBoundaryEvent, type DeckBoundaryListener, DownloadPackButton, type DownloadPackButtonProps, type DownloadPackButtonVariant, type DrawerTab, type DrumKit, EMPTY_FX_DETAIL_STATE, EMPTY_FX_STATE, EQUAL_POWER_GAIN, type ExportMidiBundleOptions, type ExportMidiBundleResult, type ExportedPluginData, FX_CATEGORIES, FX_CHAIN_ORDER, FX_DISPLAY_LABELS, FX_ENGINE_PLUGIN_NAMES, FX_PRESET_CONFIGS, type FadeDirection, type FadeEntry, type FadeGesture, type FadeLayer, type FadeMeta, FadeModal, type FadeModalProps, type FadeSelection, FadeTrackRow, type FadeTrackRowProps, type FxCategory, type FxCategoryDetailState, type FxPreset, type FxPresetConfig, type FxPresetData, type FxPresetDataEntry, FxToggleBar, type FxToggleBarProps, GUTTER_W, type GeneratorPlugin, type GeneratorType, type ImportCandidateScene, type ImportCandidateTrack, ImportTrackModal, type ImportTrackModalProps, type InstrumentDescriptor, TrackDrawer as InstrumentDrawer, type TrackDrawerProps as InstrumentDrawerProps, type InstrumentSampler, type InstrumentZone, type LLMCandidate, type LLMContent, type LLMFunctionDeclaration, type LLMGenerationConfig, type LLMGenerationRequest, type LLMGenerationResult, type LLMPart, type LLMSystemInstruction, type LLMTool, type LLMToolUseRequest, type LLMToolUseResponse, type LLMUsageMetadata, LevelMeter, type LevelMeterProps, type ListAudioFilesOptions, type ListImportableTracksOptions, type MidiClipData, type MidiWriteResult, type MixInterpolation, Modal, type ModalProps, type MusicalContext, OffsetScrubber, type OffsetScrubberProps, PLUGIN_SDK_VERSION, PX_PER_BEAT, PanSlider, type PeakAnalysis, PianoRollEditor, type PianoRollEditorProps, type PickTopKOptions, type PluginAppTool, type PluginAppToolInputSchema, type PluginAppToolResult, type PluginAudioTextureRequest, type PluginAudioTextureResult, type PluginCapabilities, type PluginChordSegment, type PluginChordTiming, type PluginConcurrentTrackInfo, type PluginCuePoints, type PluginDownloadOptions, PluginError, type PluginErrorCode, type PluginFileDialogOptions, type PluginFxCategoryDetailState, type PluginGenerationContext, type PluginHost, type PluginHttpRequestOptions, type PluginHttpResponse, type PluginManifest, type PluginMidiNote, type PluginPresetData, type PluginPresetInfo, type PluginRegistration, type PluginSampleFilter, type PluginSampleImportResult, type PluginSampleInfo, type PluginSampleTrackInfo, type PluginSceneContext, type PluginSceneInfo, type PluginSettingsSchema, type PluginSettingsStore, type PluginSkill, type PluginSkillInputSchema, type PluginStatus, type PluginStemSplitResult, type PluginStemTrackInfo, type PluginSynthInfo, type PluginTrackFxDetailState, type PluginTrackHandle, type PluginTrackInfo, type PluginTrackLevel, type PluginTrackRuntimeState, type PluginTransportState, type PluginTrimWindow, type PluginUIProps, type PostProcessOptions, RESIZE_HANDLE_PX, ROW_HEIGHT, type ReadMidiClip, type ReadMidiResult, type RecordingChunkFinalizedEvent, type RecordingTargetInfo, type SDKTrackRowProps, SLIDER_UNITY, SamplePackCTACard, type SamplePackCTACardProps, type SamplePackCTACardStatus, type SamplePackCardInfo, type SavePluginPresetOptions, type SceneChangeListener, type SceneFamilyTrack, type ScoredCandidate, ScrollingWaveform, type ScrollingWaveformProps, type SettingDefinition, type ShufflePresetResult, SorceryProgressBar, type SoundHistoryEntry, type StemType, type SynthesizeCuePointsOptions, TEXTURAL_ROLES, TrackDrawer, type TrackDrawerProps, type TrackFxDetailState, type TrackFxState, type TrackLevelsHandle, TrackMeterStrip, type TrackMeterStripProps, type TrackMeterView, TrackRow, type TrackRowDragProps, type TrackSoundHistory, type TrackSoundSnapshot, type TrackStateChangeListener, type TransportEvent, type TransportEventListener, type UnsubscribeFn, type UseSoundHistoryOptions, type UseSoundHistoryResult, type UseTrackReorderOptions, type UseTrackReorderResult, type VolumeAutomationPoint, VolumeSlider, type WaveformPeaks, WaveformView, type WaveformViewProps, analyzeWavPeak, asCrossfadeMeta, asFadeMeta, buildCrossfadeInpaintPrompt, buildCrossfadeVolumeCurves, buildFadeVolumeCurve, calculateTimeBasedTarget, cellToPx, centerScrollTop, computePeaks, dbToSlider, defaultFadeGesture, drawWaveform, formatConcurrentTracks, moveItem, parseCrossfadePairs, parseFades, pickTopKWeighted, pitchToName, pxToCell, resizeNoteDuration, scorePromptMatch, sliderToDb, synthesizeCuePoints, tokenizePrompt, transposeNotes, useAnySolo, useSceneState, useSoundHistory, useTrackLevel, useTrackLevels, useTrackMeter, useTrackReorder, useTransportPlaying };