tongflow 0.2.0 → 1.0.0

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/canvas.d.cts CHANGED
@@ -4,7 +4,7 @@ import { Edge, EdgeTypes, Node, NodeTypes, OnConnect, OnEdgesChange, OnNodesChan
4
4
  import { JSONSchema7 } from "json-schema";
5
5
  import { FromSchema } from "json-schema-to-ts";
6
6
  import "zustand/vanilla";
7
- import "zod";
7
+ import { z } from "zod";
8
8
  import { ClassValue } from "clsx";
9
9
  import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
10
10
  import { VariantProps } from "class-variance-authority";
@@ -777,6 +777,41 @@ declare const _slot_gen_music_inputs: {
777
777
  readonly additionalProperties: false;
778
778
  };
779
779
  type GenMusicInput = FromSchema<typeof _slot_gen_music_inputs>;
780
+ declare const _slot_text_gen_audio_inputs: {
781
+ readonly type: "object";
782
+ readonly required: readonly ["text"];
783
+ readonly properties: {
784
+ readonly text: {
785
+ readonly type: "string";
786
+ readonly minLength: 1;
787
+ };
788
+ readonly ref_audios: {
789
+ readonly type: "array";
790
+ readonly items: {
791
+ readonly type: "object";
792
+ readonly required: readonly ["bytesBase64"];
793
+ readonly properties: {
794
+ readonly bytesBase64: {
795
+ readonly type: "string";
796
+ readonly minLength: 1;
797
+ };
798
+ readonly filename: {
799
+ readonly type: "string";
800
+ };
801
+ readonly mime: {
802
+ readonly type: "string";
803
+ };
804
+ };
805
+ readonly additionalProperties: false;
806
+ };
807
+ };
808
+ readonly seed: {
809
+ readonly type: "integer";
810
+ };
811
+ };
812
+ readonly additionalProperties: false;
813
+ };
814
+ type TextGenAudioInput = FromSchema<typeof _slot_text_gen_audio_inputs>;
780
815
  declare const _slot_text_gen_speech_preset_inputs: {
781
816
  readonly type: "object";
782
817
  readonly required: readonly ["text"];
@@ -2026,9 +2061,9 @@ declare const _slot_denoise_audio_inputs: {
2026
2061
  type DenoiseAudioInput = FromSchema<typeof _slot_denoise_audio_inputs>;
2027
2062
  declare const _slot_convert_voice_inputs: {
2028
2063
  readonly type: "object";
2029
- readonly required: readonly ["sourceKey", "targetKey"];
2064
+ readonly required: readonly ["audio", "ref_audio"];
2030
2065
  readonly properties: {
2031
- readonly sourceKey: {
2066
+ readonly audio: {
2032
2067
  readonly type: "object";
2033
2068
  readonly required: readonly ["bytesBase64"];
2034
2069
  readonly properties: {
@@ -2045,8 +2080,22 @@ declare const _slot_convert_voice_inputs: {
2045
2080
  };
2046
2081
  readonly additionalProperties: false;
2047
2082
  };
2048
- readonly targetKey: {
2049
- readonly type: "string";
2083
+ readonly ref_audio: {
2084
+ readonly type: "object";
2085
+ readonly required: readonly ["bytesBase64"];
2086
+ readonly properties: {
2087
+ readonly bytesBase64: {
2088
+ readonly type: "string";
2089
+ readonly minLength: 1;
2090
+ };
2091
+ readonly filename: {
2092
+ readonly type: "string";
2093
+ };
2094
+ readonly mime: {
2095
+ readonly type: "string";
2096
+ };
2097
+ };
2098
+ readonly additionalProperties: false;
2050
2099
  };
2051
2100
  };
2052
2101
  readonly additionalProperties: false;
@@ -2262,7 +2311,7 @@ declare const _slot_video_gen_model_inputs: {
2262
2311
  readonly additionalProperties: false;
2263
2312
  };
2264
2313
  type VideoGenModelInput = FromSchema<typeof _slot_video_gen_model_inputs>;
2265
- type NodeSlot = "gen-text" | "split-text" | "combine-text" | "image-fusion" | "images-gen-video" | "refs-gen-video" | "image-gen-text" | "video-gen-text" | "transcribe" | "concat-videos" | "extract-audio" | "remove-video-audio" | "merge-video-audio" | "audio-video-lip-sync" | "get-first-frame" | "get-last-frame" | "parse-document" | "split-video" | "link" | "image-gen" | "gen-music" | "text-gen-speech-preset" | "image-gen-video" | "image-edit" | "image-upscale" | "video-upscale" | "video-edit" | "image-describe" | "video-describe" | "audio-describe" | "music-repaint" | "music-cover" | "music-extract" | "separate-sound" | "music-lego" | "music-complete" | "music-brief" | "audio-image-gen-video" | "speech-text-gen-video" | "video-image-gen-video-mix" | "video-image-gen-video-move" | "image-image-gen-video" | "text-gen-video" | "image-gen-model" | "speech-video-gen-video" | "text-gen-speech-clone" | "transcribe-timestamp" | "text-gen-speech-instruct" | "drop-video" | "arrange-group" | "separate_speaker" | "separate_audio_track" | "denoise_audio" | "convert_voice" | "remove_watermark" | "subtitle_remove" | "text-audio-gen-speech" | "image-pose" | "image-body-seg" | "image-normal" | "image-matting" | "video-gen-model";
2314
+ type NodeSlot = "gen-text" | "split-text" | "combine-text" | "image-fusion" | "images-gen-video" | "refs-gen-video" | "image-gen-text" | "video-gen-text" | "transcribe" | "concat-videos" | "extract-audio" | "remove-video-audio" | "merge-video-audio" | "audio-video-lip-sync" | "get-first-frame" | "get-last-frame" | "parse-document" | "split-video" | "link" | "image-gen" | "gen-music" | "text-gen-audio" | "text-gen-speech-preset" | "image-gen-video" | "image-edit" | "image-upscale" | "video-upscale" | "video-edit" | "image-describe" | "video-describe" | "audio-describe" | "music-repaint" | "music-cover" | "music-extract" | "separate-sound" | "music-lego" | "music-complete" | "music-brief" | "audio-image-gen-video" | "speech-text-gen-video" | "video-image-gen-video-mix" | "video-image-gen-video-move" | "image-image-gen-video" | "text-gen-video" | "image-gen-model" | "speech-video-gen-video" | "text-gen-speech-clone" | "transcribe-timestamp" | "text-gen-speech-instruct" | "drop-video" | "arrange-group" | "separate_speaker" | "separate_audio_track" | "denoise_audio" | "convert_voice" | "remove_watermark" | "subtitle_remove" | "text-audio-gen-speech" | "image-pose" | "image-body-seg" | "image-normal" | "image-matting" | "video-gen-model";
2266
2315
  type SlotInputsMap = {
2267
2316
  "gen-text": GenTextInput;
2268
2317
  "split-text": SplitTextInput;
@@ -2285,6 +2334,7 @@ type SlotInputsMap = {
2285
2334
  link: LinkInput;
2286
2335
  "image-gen": ImageGenInput;
2287
2336
  "gen-music": GenMusicInput;
2337
+ "text-gen-audio": TextGenAudioInput;
2288
2338
  "text-gen-speech-preset": TextGenSpeechPresetInput;
2289
2339
  "image-gen-video": ImageGenVideoInput;
2290
2340
  "image-edit": ImageEditInput;
@@ -2487,9 +2537,15 @@ interface FlowCoreState {
2487
2537
  */
2488
2538
  expands: (nodeId: string | null, possibleNodes: PossibleNode[]) => string[];
2489
2539
  /** Create a node fed by every combo-selected node; returns the new id. */
2540
+ /**
2541
+ * Create a node from the combo selection and wire every selected node into
2542
+ * it. `sourceOrder` overrides the selection order used to assign handles
2543
+ * (sources are matched to target fields in ABI input order).
2544
+ */
2490
2545
  compose: (newNode: {
2491
2546
  type: string;
2492
2547
  data: unknown;
2548
+ sourceOrder?: string[];
2493
2549
  }) => string;
2494
2550
  /** Replace a node's `data`. `history: false` skips the undo snapshot. */
2495
2551
  updates: (nodeId: string, data: Record<string, unknown>, opts?: {
@@ -2585,6 +2641,54 @@ type TaskStatusType = (typeof TaskStatus)[keyof typeof TaskStatus];
2585
2641
  type WorkflowStatusType = (typeof WorkflowStatus)[keyof typeof WorkflowStatus];
2586
2642
  type NodeStatusType = (typeof NodeStatus)[keyof typeof NodeStatus];
2587
2643
  //#endregion
2644
+ //#region src/core/registry/plugins-registry-schema.d.ts
2645
+ declare const PluginParamSpecSchema: z.ZodObject<{
2646
+ type: z.ZodEnum<{
2647
+ number: "number";
2648
+ boolean: "boolean";
2649
+ select: "select";
2650
+ text: "text";
2651
+ integer: "integer";
2652
+ }>;
2653
+ label: z.ZodOptional<z.ZodString>;
2654
+ description: z.ZodOptional<z.ZodString>;
2655
+ default: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
2656
+ options: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
2657
+ min: z.ZodOptional<z.ZodNumber>;
2658
+ max: z.ZodOptional<z.ZodNumber>;
2659
+ step: z.ZodOptional<z.ZodNumber>;
2660
+ models: z.ZodOptional<z.ZodArray<z.ZodString>>;
2661
+ }, z.core.$strip>;
2662
+ /**
2663
+ * Optional live model catalog (`TONGFLOW_MODEL_CATALOG` in the plugin source).
2664
+ * The canvas GETs `url` in the browser (public, CORS-enabled, no auth) — or,
2665
+ * when `authEnv` names the env key holding a bearer token, through the app's
2666
+ * `/api/plugins/model-catalog` route, which injects the stored key server-side
2667
+ * — reads the record array at dot-path `items`, each model id at dot-path `id`, drops
2668
+ * records where an `exclude` field equals its literal, and keeps a record for
2669
+ * a slot when every `slots[slot]` token is a substring of the named field
2670
+ * (arrays/objects are JSON-serialized before matching; a token prefixed with
2671
+ * `!` must be absent instead). Matching ids extend
2672
+ * that slot's dropdown after the static `models` shortlist.
2673
+ */
2674
+ declare const PluginModelCatalogSchema: z.ZodObject<{
2675
+ url: z.ZodString;
2676
+ authEnv: z.ZodOptional<z.ZodString>;
2677
+ items: z.ZodDefault<z.ZodString>;
2678
+ id: z.ZodDefault<z.ZodString>;
2679
+ exclude: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
2680
+ slots: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
2681
+ }, z.core.$strip>;
2682
+ type PluginModelCatalog = z.infer<typeof PluginModelCatalogSchema>;
2683
+ type PluginParamSpec = z.infer<typeof PluginParamSpecSchema>;
2684
+ //#endregion
2685
+ //#region src/core/registry/plugin-params.d.ts
2686
+ /** A plugin's declared params for one slot, in declaration order. */
2687
+ type PluginParamEntry = {
2688
+ name: string;
2689
+ spec: PluginParamSpec;
2690
+ };
2691
+ //#endregion
2588
2692
  //#region src/core/schema/tongflow-abi.d.ts
2589
2693
  interface ResolvedOutputRoute {
2590
2694
  sourceField: string;
@@ -2613,6 +2717,10 @@ interface BaseNodeData extends Record<string, unknown> {
2613
2717
  /** Selected model for router-style plugins that declare per-slot model
2614
2718
  * lists; empty/absent means the plugin's default. */
2615
2719
  pluginModel?: string;
2720
+ /** Advanced parameters chosen for the active plugin (keys from its
2721
+ * `TONGFLOW_SLOT_PARAMS`); only values differing from the declared default
2722
+ * are kept, so absent means the plugin's own default. */
2723
+ pluginParams?: Record<string, unknown>;
2616
2724
  /** Composition linkage (`useNodesData`) */
2617
2725
  ids?: string[];
2618
2726
  texts?: string[];
@@ -2678,6 +2786,7 @@ declare function useNodePluginResolver(feature: string | undefined): {
2678
2786
  defaultPluginIdFromRegistry: string;
2679
2787
  resolveActivePluginId: () => string;
2680
2788
  resolveActiveModel: () => string | undefined;
2789
+ resolveActiveParams: () => Record<string, unknown> | undefined;
2681
2790
  };
2682
2791
  //#endregion
2683
2792
  //#region src/canvas/hooks/use-task.d.ts
@@ -2728,6 +2837,9 @@ interface TaskCreationConfig {
2728
2837
  pluginId: string;
2729
2838
  /** Selected model for router-style plugins; omitted otherwise. */
2730
2839
  model?: string;
2840
+ /** Advanced parameters (plugin's `TONGFLOW_SLOT_PARAMS` keys); omitted
2841
+ * when the node runs on plugin defaults. */
2842
+ params?: Record<string, unknown>;
2731
2843
  prompt: Record<string, unknown>;
2732
2844
  nodeId: string;
2733
2845
  workflowId?: number;
@@ -2749,7 +2861,7 @@ declare const useTaskStore: import("zustand").UseBoundStore<import("zustand").St
2749
2861
  * Handles connection lifecycle, reconnect, and parsing.
2750
2862
  */
2751
2863
  declare function useTaskSubscription(taskId?: string, options?: TaskSubscriptionOptions): {
2752
- status: "error" | "connecting" | "connected" | "reconnecting" | "disconnected";
2864
+ status: "connecting" | "connected" | "reconnecting" | "disconnected" | "error";
2753
2865
  };
2754
2866
  /**
2755
2867
  * Create a task and automatically attach SSE streaming.
@@ -2931,7 +3043,11 @@ type PluginsRegistryPayload = {
2931
3043
  methodsByNodeSlot?: Record<string, {
2932
3044
  methodName: string;
2933
3045
  models?: string[];
3046
+ /** Advanced params declared via `TONGFLOW_SLOT_PARAMS`. */
3047
+ params?: Record<string, PluginParamSpec>;
2934
3048
  }>;
3049
+ /** Live model catalog declared via `TONGFLOW_MODEL_CATALOG`. */
3050
+ modelCatalog?: PluginModelCatalog;
2935
3051
  /** Presentation metadata merged from `tongflow.plugin.json`. */
2936
3052
  name?: string;
2937
3053
  description?: string;
@@ -2961,11 +3077,38 @@ declare function usePluginsRegistry(): {
2961
3077
  declare function refreshPluginsRegistry(): Promise<void>;
2962
3078
  /** Plugin directory names registered for a single ABI `nodeSlot`. */
2963
3079
  declare function useNodePluginIds(nodeSlot: string): string[];
3080
+ type LiveModelsEntry = {
3081
+ fetchedAt: number;
3082
+ bySlot: Record<string, string[]>;
3083
+ };
3084
+ type LiveModelsState = {
3085
+ byPlugin: Record<string, LiveModelsEntry>;
3086
+ };
3087
+ declare const useLiveModelsStore: import("zustand").UseBoundStore<import("zustand").StoreApi<LiveModelsState>>;
3088
+ /**
3089
+ * Fetch (or refresh, once the TTL elapsed) a plugin's live model catalog. Safe
3090
+ * to call eagerly — it is a no-op for plugins without a catalog and while a
3091
+ * fresh result is cached.
3092
+ */
3093
+ declare function loadPluginModelCatalog(pluginId: string): Promise<void>;
2964
3094
  /**
2965
- * Model ids a plugin declares for one ABI `nodeSlot` (empty for single-model
2966
- * plugins — the model dropdown is hidden in that case).
3095
+ * Synchronous read of a plugin's model ids for one slot: the static shortlist
3096
+ * (declared order, first = default) followed by any live-catalog extras.
3097
+ */
3098
+ declare function getNodePluginModels(nodeSlot: string, pluginId: string): string[];
3099
+ /**
3100
+ * Model ids a plugin offers for one ABI `nodeSlot` (empty for single-model
3101
+ * plugins — the model dropdown is hidden in that case): the static shortlist
3102
+ * plus live-catalog extras, which this hook fetches on first use.
2967
3103
  */
2968
3104
  declare function useNodePluginModels(nodeSlot: string, pluginId: string): string[];
3105
+ /**
3106
+ * Synchronous read of the params a plugin offers for one slot given the
3107
+ * selected model, in declaration order.
3108
+ */
3109
+ declare function getNodePluginParams(nodeSlot: string, pluginId: string, model: string | undefined): PluginParamEntry[];
3110
+ /** Reactive form of {@link getNodePluginParams}. */
3111
+ declare function useNodePluginParams(nodeSlot: string, pluginId: string, model: string | undefined): PluginParamEntry[];
2969
3112
  type PluginMeta = {
2970
3113
  name?: string;
2971
3114
  description?: string;
@@ -3286,6 +3429,9 @@ interface CreateTaskRequest {
3286
3429
  pluginId: string;
3287
3430
  /** Selected model for router-style plugins; omitted otherwise. */
3288
3431
  model?: string;
3432
+ /** Advanced parameters (plugin's `TONGFLOW_SLOT_PARAMS` keys); omitted
3433
+ * when the node runs on plugin defaults. */
3434
+ params?: Record<string, unknown>;
3289
3435
  prompt: Record<string, unknown>;
3290
3436
  nodeId: string;
3291
3437
  workflowId?: number;
@@ -3534,7 +3680,7 @@ type NodeType = keyof typeof NODE_TYPES;
3534
3680
  declare const NODE_CATEGORIES: {
3535
3681
  readonly DATA: readonly ["imageNode", "textNode", "videoNode", "audioNode", "fileNode", "modelNode", "linkNode"];
3536
3682
  readonly ADD: readonly ["addImageNode", "addTextNode", "addAudioNode", "addVideoNode", "addLinkNode", "addFileNode", "addModelNode"];
3537
- readonly TRANSFORM: readonly ["imageGenVideoNode", "textGenVideoNode", "imageGenModelNode", "imagePoseNode", "imageBodySegNode", "imageNormalNode", "imageMattingNode", "videoGenModelNode", "speechGenVideoNode", "imageGenImageNode", "imageGenImageUpscaleNode", "genTextNode", "textGenImageNode", "textGenMusicNode", "textGenSpeechCloneNode", "textGenSpeechPresetNode", "textGenSpeechInstructNode", "removeVideoSubtitleNode", "removeWatermarkNode", "videoUpscaleNode", "videoEditNode", "extractAudioNode", "removeVideoAudioNode", "denoiseAudioSubtitleNode", "separateAudioTrackNode", "separateSpeakerNode", "convertVoiceNode", "audioDescribeNode", "imageGenTextNode", "videoGenTextNode", "videoGenTextSpeechRecognizeNode", "audioGenTextSpeechRecognizeNode", "fileGenTextNode", "linkGenTextNode", "getFirstFrameNode", "getLastFrameNode", "musicRepaintNode", "musicExtractNode", "musicLegoNode", "musicCompleteNode"];
3683
+ readonly TRANSFORM: readonly ["imageGenVideoNode", "textGenVideoNode", "imageGenModelNode", "imagePoseNode", "imageBodySegNode", "imageNormalNode", "imageMattingNode", "videoGenModelNode", "speechGenVideoNode", "imageGenImageNode", "imageGenImageUpscaleNode", "genTextNode", "textGenImageNode", "textGenMusicNode", "textGenAudioNode", "textGenSpeechCloneNode", "textGenSpeechPresetNode", "textGenSpeechInstructNode", "removeVideoSubtitleNode", "removeWatermarkNode", "videoUpscaleNode", "videoEditNode", "extractAudioNode", "removeVideoAudioNode", "denoiseAudioSubtitleNode", "separateAudioTrackNode", "separateSpeakerNode", "convertVoiceNode", "audioDescribeNode", "imageGenTextNode", "videoGenTextNode", "videoGenTextSpeechRecognizeNode", "audioGenTextSpeechRecognizeNode", "fileGenTextNode", "linkGenTextNode", "getFirstFrameNode", "getLastFrameNode", "musicRepaintNode", "musicExtractNode", "musicLegoNode", "musicCompleteNode"];
3538
3684
  readonly BATCH: readonly ["dropVideoNode", "arrangeNode", "concatVideoNode"];
3539
3685
  readonly COMPOSE: readonly ["mergeVideoAudioNode", "audioVideoLipSyncNode", "imageFusionNode", "imagesGenVideoNode", "refsGenVideoNode", "speechImageGenVideoNode", "speechTextGenVideoNode", "speechVideoGenVideoNode", "videoImageGenVideoMoveNode", "videoImageGenVideoMixNode", "imageImageGenVideoNode", "textAudioGenSpeechNode", "textGenSpeechCloneComposeNode", "imageGenVideoComposeNode", "textsGenTextNode", "concatVideoComposeNode", "musicCoverNode"];
3540
3686
  readonly DECOMPOSE: readonly ["splitVideoNode", "splitTextNode", "musicBriefNode", "separateSoundNode"];
@@ -3954,7 +4100,7 @@ declare class ErrorBoundary extends Component<Props, State> {
3954
4100
  static getDerivedStateFromError(error: Error): State;
3955
4101
  componentDidCatch(error: Error, info: ErrorInfo): void;
3956
4102
  handleReset: () => void;
3957
- render(): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
4103
+ render(): string | number | bigint | boolean | import("react/jsx-runtime").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
3958
4104
  }
3959
4105
  //#endregion
3960
4106
  //#region src/canvas/ui/error-toast.d.ts
@@ -4118,4 +4264,4 @@ interface WhiteBoardProps {
4118
4264
  }
4119
4265
  declare const WhiteBoard: React$1.ForwardRefExoticComponent<WhiteBoardProps & React$1.RefAttributes<WhiteBoardRef>>;
4120
4266
  //#endregion
4121
- export { AbiOutputChannel, AbiOutputView, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AudioRecorderWithVisualizer, Badge, BatchTaskConfig, Button, CANVAS_LOCALES, CanvasHostConfig, CanvasLocale, CanvasProvider, CanvasProviderProps, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, ClientTranslator, ConfigState, CreateMaterialRequest, CreateMaterialResponse, CreateTaskRequest, CreateTaskResponse, DEFAULT_QWEN_SPEAKER, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EDGE_TYPES, ErrorBoundary, FORMAT_CATEGORIES, FileValidationResult, FlowCanvas, FlowCanvasHandle, FlowCanvasProps, FlowReactBindings, FlowState, Input, Label, LibInput, ListMaterialsResponse, ListTasksResponse, LoadPriority, LoadTask, Material, MaterialType, NODE_CATEGORIES, NODE_TYPES, NodePluginIdSelect, NodeTaskHandler, NodeType, PluginMeta, PluginsRegistryPayload, type PossibleNode, PresignedUrlResponse, Progress, QWEN_SPEAKERS, QwenSpeaker, QwenSpeakerGender, RECOMMENDATIONS, SSEMessage, SSEMessageData, SSENodeInfo, SSEStatus, SSE_TASK_MESSAGE_EVENT, SUPPORTED_FORMATS, SaveFromTaskRequest, SaveFromTaskResponse, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, ShowErrorToastOptions, Skeleton, Slider, SpeakerVoiceRecorder, Switch, TASK_CANCEL_REQUEST_EVENT, TROUBLESHOOTING, Tabs, TabsContent, TabsList, TabsTrigger, Task, TaskCancelRequestDetail, TaskCreationConfig, TaskRecord, TaskState, TaskSubscriptionOptions, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TraceMaterialWorkflowResponse, UpdateStatusRequest, UpdateStatusResponse, UploadResponse, UploadState, UploadValidationError, UseAbiExecutionOptions, UseAbiExecutionReturn, UseAbiFormReturn, UseFileAsyncLoaderOptions, UseMultipleUploadOptions, UseUploadOptions, ValidationResult, VideoRecorder, WORKSPACE_MODE_KEY, Waterfall, WaterfallProps, WaterfallRenderProps, WhiteBoard, WhiteBoardRef, WorkflowExecutionStatus, WorkspaceMode, apiClient, apiDelete, apiGet, apiPatch, apiPost, apiPut, apiUrl, applyResolvedOutputRoutes, assetUrl, badgeVariants, buttonVariants, canvasMessages, cn, computeOutputView, configureCanvasHost, createMaterial, createTask, deleteMaterial, emitSSEConnected, emitSSETaskMessage, emitTaskCancelRequest, getCanvasHost, getCanvasLocale, getClientTranslator, getFileUrl, getGlobalFileCache, getGlobalFileQueue, getImageDimensions, getMaterialFileUrls, getPresignedUploadUrl, getPrivateFileUrl, getSharedFileUrl, getTaskStopUrl, getTaskWaitUrl, getVideoMetadata, hostFetch, isCanvasLocale, isImageFile, isVideoFile, listMaterials, listTasks, normalizeTaskPayloadData, pluginDisplayName, refreshPluginsRegistry, saveFromTask, setCanvasLocale, showErrorToast, toggleFavorite, traceMaterialWorkflow, updateTaskStatus, useAbiExecution, useAbiForm, useBatchTaskManager, useCreateTask, useDropzone, useFileAsyncLoader, useFileAsyncLoaderBatch, useFileLoaderStats, useFileUrl, useFlow, useMultipleUpload, useNodeAbiSpec, useNodePluginIds, useNodePluginIdsUnion, useNodePluginModels, useNodePluginResolver, useNodeState, useNodeTaskUpdate, useNodeType, usePluginMeta, usePluginsRegistry, usePluginsRegistryStore, useResolvedPluginId, useTask, useTaskStore, useTaskSubscription, useUpload, useUpstreamNodeIds, validateFile };
4267
+ export { AbiOutputChannel, AbiOutputView, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AudioRecorderWithVisualizer, Badge, BatchTaskConfig, Button, CANVAS_LOCALES, CanvasHostConfig, CanvasLocale, CanvasProvider, CanvasProviderProps, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, ClientTranslator, ConfigState, CreateMaterialRequest, CreateMaterialResponse, CreateTaskRequest, CreateTaskResponse, DEFAULT_QWEN_SPEAKER, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EDGE_TYPES, ErrorBoundary, FORMAT_CATEGORIES, FileValidationResult, FlowCanvas, FlowCanvasHandle, FlowCanvasProps, FlowReactBindings, FlowState, Input, Label, LibInput, ListMaterialsResponse, ListTasksResponse, LoadPriority, LoadTask, Material, MaterialType, NODE_CATEGORIES, NODE_TYPES, NodePluginIdSelect, NodeTaskHandler, NodeType, PluginMeta, PluginsRegistryPayload, type PossibleNode, PresignedUrlResponse, Progress, QWEN_SPEAKERS, QwenSpeaker, QwenSpeakerGender, RECOMMENDATIONS, SSEMessage, SSEMessageData, SSENodeInfo, SSEStatus, SSE_TASK_MESSAGE_EVENT, SUPPORTED_FORMATS, SaveFromTaskRequest, SaveFromTaskResponse, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, ShowErrorToastOptions, Skeleton, Slider, SpeakerVoiceRecorder, Switch, TASK_CANCEL_REQUEST_EVENT, TROUBLESHOOTING, Tabs, TabsContent, TabsList, TabsTrigger, Task, TaskCancelRequestDetail, TaskCreationConfig, TaskRecord, TaskState, TaskSubscriptionOptions, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TraceMaterialWorkflowResponse, UpdateStatusRequest, UpdateStatusResponse, UploadResponse, UploadState, UploadValidationError, UseAbiExecutionOptions, UseAbiExecutionReturn, UseAbiFormReturn, UseFileAsyncLoaderOptions, UseMultipleUploadOptions, UseUploadOptions, ValidationResult, VideoRecorder, WORKSPACE_MODE_KEY, Waterfall, WaterfallProps, WaterfallRenderProps, WhiteBoard, WhiteBoardRef, WorkflowExecutionStatus, WorkspaceMode, apiClient, apiDelete, apiGet, apiPatch, apiPost, apiPut, apiUrl, applyResolvedOutputRoutes, assetUrl, badgeVariants, buttonVariants, canvasMessages, cn, computeOutputView, configureCanvasHost, createMaterial, createTask, deleteMaterial, emitSSEConnected, emitSSETaskMessage, emitTaskCancelRequest, getCanvasHost, getCanvasLocale, getClientTranslator, getFileUrl, getGlobalFileCache, getGlobalFileQueue, getImageDimensions, getMaterialFileUrls, getNodePluginModels, getNodePluginParams, getPresignedUploadUrl, getPrivateFileUrl, getSharedFileUrl, getTaskStopUrl, getTaskWaitUrl, getVideoMetadata, hostFetch, isCanvasLocale, isImageFile, isVideoFile, listMaterials, listTasks, loadPluginModelCatalog, normalizeTaskPayloadData, pluginDisplayName, refreshPluginsRegistry, saveFromTask, setCanvasLocale, showErrorToast, toggleFavorite, traceMaterialWorkflow, updateTaskStatus, useAbiExecution, useAbiForm, useBatchTaskManager, useCreateTask, useDropzone, useFileAsyncLoader, useFileAsyncLoaderBatch, useFileLoaderStats, useFileUrl, useFlow, useLiveModelsStore, useMultipleUpload, useNodeAbiSpec, useNodePluginIds, useNodePluginIdsUnion, useNodePluginModels, useNodePluginParams, useNodePluginResolver, useNodeState, useNodeTaskUpdate, useNodeType, usePluginMeta, usePluginsRegistry, usePluginsRegistryStore, useResolvedPluginId, useTask, useTaskStore, useTaskSubscription, useUpload, useUpstreamNodeIds, validateFile };
package/dist/canvas.d.ts CHANGED
@@ -12,9 +12,9 @@ import * as TabsPrimitive from "@radix-ui/react-tabs";
12
12
  import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
13
13
  import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
14
14
  import * as LabelPrimitive from "@radix-ui/react-label";
15
+ import * as SwitchPrimitive from "@radix-ui/react-switch";
15
16
  import * as ProgressPrimitive from "@radix-ui/react-progress";
16
17
  import * as SliderPrimitive from "@radix-ui/react-slider";
17
- import * as SwitchPrimitive from "@radix-ui/react-switch";
18
18
  import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
19
19
  import * as SeparatorPrimitive from "@radix-ui/react-separator";
20
20
  import { JSONSchema7 } from "json-schema";
@@ -777,6 +777,41 @@ declare const _slot_gen_music_inputs: {
777
777
  readonly additionalProperties: false;
778
778
  };
779
779
  type GenMusicInput = FromSchema<typeof _slot_gen_music_inputs>;
780
+ declare const _slot_text_gen_audio_inputs: {
781
+ readonly type: "object";
782
+ readonly required: readonly ["text"];
783
+ readonly properties: {
784
+ readonly text: {
785
+ readonly type: "string";
786
+ readonly minLength: 1;
787
+ };
788
+ readonly ref_audios: {
789
+ readonly type: "array";
790
+ readonly items: {
791
+ readonly type: "object";
792
+ readonly required: readonly ["bytesBase64"];
793
+ readonly properties: {
794
+ readonly bytesBase64: {
795
+ readonly type: "string";
796
+ readonly minLength: 1;
797
+ };
798
+ readonly filename: {
799
+ readonly type: "string";
800
+ };
801
+ readonly mime: {
802
+ readonly type: "string";
803
+ };
804
+ };
805
+ readonly additionalProperties: false;
806
+ };
807
+ };
808
+ readonly seed: {
809
+ readonly type: "integer";
810
+ };
811
+ };
812
+ readonly additionalProperties: false;
813
+ };
814
+ type TextGenAudioInput = FromSchema<typeof _slot_text_gen_audio_inputs>;
780
815
  declare const _slot_text_gen_speech_preset_inputs: {
781
816
  readonly type: "object";
782
817
  readonly required: readonly ["text"];
@@ -2026,9 +2061,9 @@ declare const _slot_denoise_audio_inputs: {
2026
2061
  type DenoiseAudioInput = FromSchema<typeof _slot_denoise_audio_inputs>;
2027
2062
  declare const _slot_convert_voice_inputs: {
2028
2063
  readonly type: "object";
2029
- readonly required: readonly ["sourceKey", "targetKey"];
2064
+ readonly required: readonly ["audio", "ref_audio"];
2030
2065
  readonly properties: {
2031
- readonly sourceKey: {
2066
+ readonly audio: {
2032
2067
  readonly type: "object";
2033
2068
  readonly required: readonly ["bytesBase64"];
2034
2069
  readonly properties: {
@@ -2045,8 +2080,22 @@ declare const _slot_convert_voice_inputs: {
2045
2080
  };
2046
2081
  readonly additionalProperties: false;
2047
2082
  };
2048
- readonly targetKey: {
2049
- readonly type: "string";
2083
+ readonly ref_audio: {
2084
+ readonly type: "object";
2085
+ readonly required: readonly ["bytesBase64"];
2086
+ readonly properties: {
2087
+ readonly bytesBase64: {
2088
+ readonly type: "string";
2089
+ readonly minLength: 1;
2090
+ };
2091
+ readonly filename: {
2092
+ readonly type: "string";
2093
+ };
2094
+ readonly mime: {
2095
+ readonly type: "string";
2096
+ };
2097
+ };
2098
+ readonly additionalProperties: false;
2050
2099
  };
2051
2100
  };
2052
2101
  readonly additionalProperties: false;
@@ -2262,7 +2311,7 @@ declare const _slot_video_gen_model_inputs: {
2262
2311
  readonly additionalProperties: false;
2263
2312
  };
2264
2313
  type VideoGenModelInput = FromSchema<typeof _slot_video_gen_model_inputs>;
2265
- type NodeSlot = "gen-text" | "split-text" | "combine-text" | "image-fusion" | "images-gen-video" | "refs-gen-video" | "image-gen-text" | "video-gen-text" | "transcribe" | "concat-videos" | "extract-audio" | "remove-video-audio" | "merge-video-audio" | "audio-video-lip-sync" | "get-first-frame" | "get-last-frame" | "parse-document" | "split-video" | "link" | "image-gen" | "gen-music" | "text-gen-speech-preset" | "image-gen-video" | "image-edit" | "image-upscale" | "video-upscale" | "video-edit" | "image-describe" | "video-describe" | "audio-describe" | "music-repaint" | "music-cover" | "music-extract" | "separate-sound" | "music-lego" | "music-complete" | "music-brief" | "audio-image-gen-video" | "speech-text-gen-video" | "video-image-gen-video-mix" | "video-image-gen-video-move" | "image-image-gen-video" | "text-gen-video" | "image-gen-model" | "speech-video-gen-video" | "text-gen-speech-clone" | "transcribe-timestamp" | "text-gen-speech-instruct" | "drop-video" | "arrange-group" | "separate_speaker" | "separate_audio_track" | "denoise_audio" | "convert_voice" | "remove_watermark" | "subtitle_remove" | "text-audio-gen-speech" | "image-pose" | "image-body-seg" | "image-normal" | "image-matting" | "video-gen-model";
2314
+ type NodeSlot = "gen-text" | "split-text" | "combine-text" | "image-fusion" | "images-gen-video" | "refs-gen-video" | "image-gen-text" | "video-gen-text" | "transcribe" | "concat-videos" | "extract-audio" | "remove-video-audio" | "merge-video-audio" | "audio-video-lip-sync" | "get-first-frame" | "get-last-frame" | "parse-document" | "split-video" | "link" | "image-gen" | "gen-music" | "text-gen-audio" | "text-gen-speech-preset" | "image-gen-video" | "image-edit" | "image-upscale" | "video-upscale" | "video-edit" | "image-describe" | "video-describe" | "audio-describe" | "music-repaint" | "music-cover" | "music-extract" | "separate-sound" | "music-lego" | "music-complete" | "music-brief" | "audio-image-gen-video" | "speech-text-gen-video" | "video-image-gen-video-mix" | "video-image-gen-video-move" | "image-image-gen-video" | "text-gen-video" | "image-gen-model" | "speech-video-gen-video" | "text-gen-speech-clone" | "transcribe-timestamp" | "text-gen-speech-instruct" | "drop-video" | "arrange-group" | "separate_speaker" | "separate_audio_track" | "denoise_audio" | "convert_voice" | "remove_watermark" | "subtitle_remove" | "text-audio-gen-speech" | "image-pose" | "image-body-seg" | "image-normal" | "image-matting" | "video-gen-model";
2266
2315
  type SlotInputsMap = {
2267
2316
  "gen-text": GenTextInput;
2268
2317
  "split-text": SplitTextInput;
@@ -2285,6 +2334,7 @@ type SlotInputsMap = {
2285
2334
  link: LinkInput;
2286
2335
  "image-gen": ImageGenInput;
2287
2336
  "gen-music": GenMusicInput;
2337
+ "text-gen-audio": TextGenAudioInput;
2288
2338
  "text-gen-speech-preset": TextGenSpeechPresetInput;
2289
2339
  "image-gen-video": ImageGenVideoInput;
2290
2340
  "image-edit": ImageEditInput;
@@ -2487,9 +2537,15 @@ interface FlowCoreState {
2487
2537
  */
2488
2538
  expands: (nodeId: string | null, possibleNodes: PossibleNode[]) => string[];
2489
2539
  /** Create a node fed by every combo-selected node; returns the new id. */
2540
+ /**
2541
+ * Create a node from the combo selection and wire every selected node into
2542
+ * it. `sourceOrder` overrides the selection order used to assign handles
2543
+ * (sources are matched to target fields in ABI input order).
2544
+ */
2490
2545
  compose: (newNode: {
2491
2546
  type: string;
2492
2547
  data: unknown;
2548
+ sourceOrder?: string[];
2493
2549
  }) => string;
2494
2550
  /** Replace a node's `data`. `history: false` skips the undo snapshot. */
2495
2551
  updates: (nodeId: string, data: Record<string, unknown>, opts?: {
@@ -2585,6 +2641,54 @@ type TaskStatusType = (typeof TaskStatus)[keyof typeof TaskStatus];
2585
2641
  type WorkflowStatusType = (typeof WorkflowStatus)[keyof typeof WorkflowStatus];
2586
2642
  type NodeStatusType = (typeof NodeStatus)[keyof typeof NodeStatus];
2587
2643
  //#endregion
2644
+ //#region src/core/registry/plugins-registry-schema.d.ts
2645
+ declare const PluginParamSpecSchema: z.ZodObject<{
2646
+ type: z.ZodEnum<{
2647
+ number: "number";
2648
+ boolean: "boolean";
2649
+ select: "select";
2650
+ text: "text";
2651
+ integer: "integer";
2652
+ }>;
2653
+ label: z.ZodOptional<z.ZodString>;
2654
+ description: z.ZodOptional<z.ZodString>;
2655
+ default: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
2656
+ options: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
2657
+ min: z.ZodOptional<z.ZodNumber>;
2658
+ max: z.ZodOptional<z.ZodNumber>;
2659
+ step: z.ZodOptional<z.ZodNumber>;
2660
+ models: z.ZodOptional<z.ZodArray<z.ZodString>>;
2661
+ }, z.core.$strip>;
2662
+ /**
2663
+ * Optional live model catalog (`TONGFLOW_MODEL_CATALOG` in the plugin source).
2664
+ * The canvas GETs `url` in the browser (public, CORS-enabled, no auth) — or,
2665
+ * when `authEnv` names the env key holding a bearer token, through the app's
2666
+ * `/api/plugins/model-catalog` route, which injects the stored key server-side
2667
+ * — reads the record array at dot-path `items`, each model id at dot-path `id`, drops
2668
+ * records where an `exclude` field equals its literal, and keeps a record for
2669
+ * a slot when every `slots[slot]` token is a substring of the named field
2670
+ * (arrays/objects are JSON-serialized before matching; a token prefixed with
2671
+ * `!` must be absent instead). Matching ids extend
2672
+ * that slot's dropdown after the static `models` shortlist.
2673
+ */
2674
+ declare const PluginModelCatalogSchema: z.ZodObject<{
2675
+ url: z.ZodString;
2676
+ authEnv: z.ZodOptional<z.ZodString>;
2677
+ items: z.ZodDefault<z.ZodString>;
2678
+ id: z.ZodDefault<z.ZodString>;
2679
+ exclude: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
2680
+ slots: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
2681
+ }, z.core.$strip>;
2682
+ type PluginModelCatalog = z.infer<typeof PluginModelCatalogSchema>;
2683
+ type PluginParamSpec = z.infer<typeof PluginParamSpecSchema>;
2684
+ //#endregion
2685
+ //#region src/core/registry/plugin-params.d.ts
2686
+ /** A plugin's declared params for one slot, in declaration order. */
2687
+ type PluginParamEntry = {
2688
+ name: string;
2689
+ spec: PluginParamSpec;
2690
+ };
2691
+ //#endregion
2588
2692
  //#region src/core/schema/tongflow-abi.d.ts
2589
2693
  interface ResolvedOutputRoute {
2590
2694
  sourceField: string;
@@ -2613,6 +2717,10 @@ interface BaseNodeData extends Record<string, unknown> {
2613
2717
  /** Selected model for router-style plugins that declare per-slot model
2614
2718
  * lists; empty/absent means the plugin's default. */
2615
2719
  pluginModel?: string;
2720
+ /** Advanced parameters chosen for the active plugin (keys from its
2721
+ * `TONGFLOW_SLOT_PARAMS`); only values differing from the declared default
2722
+ * are kept, so absent means the plugin's own default. */
2723
+ pluginParams?: Record<string, unknown>;
2616
2724
  /** Composition linkage (`useNodesData`) */
2617
2725
  ids?: string[];
2618
2726
  texts?: string[];
@@ -2678,6 +2786,7 @@ declare function useNodePluginResolver(feature: string | undefined): {
2678
2786
  defaultPluginIdFromRegistry: string;
2679
2787
  resolveActivePluginId: () => string;
2680
2788
  resolveActiveModel: () => string | undefined;
2789
+ resolveActiveParams: () => Record<string, unknown> | undefined;
2681
2790
  };
2682
2791
  //#endregion
2683
2792
  //#region src/canvas/hooks/use-task.d.ts
@@ -2728,6 +2837,9 @@ interface TaskCreationConfig {
2728
2837
  pluginId: string;
2729
2838
  /** Selected model for router-style plugins; omitted otherwise. */
2730
2839
  model?: string;
2840
+ /** Advanced parameters (plugin's `TONGFLOW_SLOT_PARAMS` keys); omitted
2841
+ * when the node runs on plugin defaults. */
2842
+ params?: Record<string, unknown>;
2731
2843
  prompt: Record<string, unknown>;
2732
2844
  nodeId: string;
2733
2845
  workflowId?: number;
@@ -2749,7 +2861,7 @@ declare const useTaskStore: import("zustand").UseBoundStore<import("zustand").St
2749
2861
  * Handles connection lifecycle, reconnect, and parsing.
2750
2862
  */
2751
2863
  declare function useTaskSubscription(taskId?: string, options?: TaskSubscriptionOptions): {
2752
- status: "error" | "connecting" | "connected" | "reconnecting" | "disconnected";
2864
+ status: "connecting" | "connected" | "reconnecting" | "disconnected" | "error";
2753
2865
  };
2754
2866
  /**
2755
2867
  * Create a task and automatically attach SSE streaming.
@@ -2931,7 +3043,11 @@ type PluginsRegistryPayload = {
2931
3043
  methodsByNodeSlot?: Record<string, {
2932
3044
  methodName: string;
2933
3045
  models?: string[];
3046
+ /** Advanced params declared via `TONGFLOW_SLOT_PARAMS`. */
3047
+ params?: Record<string, PluginParamSpec>;
2934
3048
  }>;
3049
+ /** Live model catalog declared via `TONGFLOW_MODEL_CATALOG`. */
3050
+ modelCatalog?: PluginModelCatalog;
2935
3051
  /** Presentation metadata merged from `tongflow.plugin.json`. */
2936
3052
  name?: string;
2937
3053
  description?: string;
@@ -2961,11 +3077,38 @@ declare function usePluginsRegistry(): {
2961
3077
  declare function refreshPluginsRegistry(): Promise<void>;
2962
3078
  /** Plugin directory names registered for a single ABI `nodeSlot`. */
2963
3079
  declare function useNodePluginIds(nodeSlot: string): string[];
3080
+ type LiveModelsEntry = {
3081
+ fetchedAt: number;
3082
+ bySlot: Record<string, string[]>;
3083
+ };
3084
+ type LiveModelsState = {
3085
+ byPlugin: Record<string, LiveModelsEntry>;
3086
+ };
3087
+ declare const useLiveModelsStore: import("zustand").UseBoundStore<import("zustand").StoreApi<LiveModelsState>>;
3088
+ /**
3089
+ * Fetch (or refresh, once the TTL elapsed) a plugin's live model catalog. Safe
3090
+ * to call eagerly — it is a no-op for plugins without a catalog and while a
3091
+ * fresh result is cached.
3092
+ */
3093
+ declare function loadPluginModelCatalog(pluginId: string): Promise<void>;
2964
3094
  /**
2965
- * Model ids a plugin declares for one ABI `nodeSlot` (empty for single-model
2966
- * plugins — the model dropdown is hidden in that case).
3095
+ * Synchronous read of a plugin's model ids for one slot: the static shortlist
3096
+ * (declared order, first = default) followed by any live-catalog extras.
3097
+ */
3098
+ declare function getNodePluginModels(nodeSlot: string, pluginId: string): string[];
3099
+ /**
3100
+ * Model ids a plugin offers for one ABI `nodeSlot` (empty for single-model
3101
+ * plugins — the model dropdown is hidden in that case): the static shortlist
3102
+ * plus live-catalog extras, which this hook fetches on first use.
2967
3103
  */
2968
3104
  declare function useNodePluginModels(nodeSlot: string, pluginId: string): string[];
3105
+ /**
3106
+ * Synchronous read of the params a plugin offers for one slot given the
3107
+ * selected model, in declaration order.
3108
+ */
3109
+ declare function getNodePluginParams(nodeSlot: string, pluginId: string, model: string | undefined): PluginParamEntry[];
3110
+ /** Reactive form of {@link getNodePluginParams}. */
3111
+ declare function useNodePluginParams(nodeSlot: string, pluginId: string, model: string | undefined): PluginParamEntry[];
2969
3112
  type PluginMeta = {
2970
3113
  name?: string;
2971
3114
  description?: string;
@@ -3286,6 +3429,9 @@ interface CreateTaskRequest {
3286
3429
  pluginId: string;
3287
3430
  /** Selected model for router-style plugins; omitted otherwise. */
3288
3431
  model?: string;
3432
+ /** Advanced parameters (plugin's `TONGFLOW_SLOT_PARAMS` keys); omitted
3433
+ * when the node runs on plugin defaults. */
3434
+ params?: Record<string, unknown>;
3289
3435
  prompt: Record<string, unknown>;
3290
3436
  nodeId: string;
3291
3437
  workflowId?: number;
@@ -3534,7 +3680,7 @@ type NodeType = keyof typeof NODE_TYPES;
3534
3680
  declare const NODE_CATEGORIES: {
3535
3681
  readonly DATA: readonly ["imageNode", "textNode", "videoNode", "audioNode", "fileNode", "modelNode", "linkNode"];
3536
3682
  readonly ADD: readonly ["addImageNode", "addTextNode", "addAudioNode", "addVideoNode", "addLinkNode", "addFileNode", "addModelNode"];
3537
- readonly TRANSFORM: readonly ["imageGenVideoNode", "textGenVideoNode", "imageGenModelNode", "imagePoseNode", "imageBodySegNode", "imageNormalNode", "imageMattingNode", "videoGenModelNode", "speechGenVideoNode", "imageGenImageNode", "imageGenImageUpscaleNode", "genTextNode", "textGenImageNode", "textGenMusicNode", "textGenSpeechCloneNode", "textGenSpeechPresetNode", "textGenSpeechInstructNode", "removeVideoSubtitleNode", "removeWatermarkNode", "videoUpscaleNode", "videoEditNode", "extractAudioNode", "removeVideoAudioNode", "denoiseAudioSubtitleNode", "separateAudioTrackNode", "separateSpeakerNode", "convertVoiceNode", "audioDescribeNode", "imageGenTextNode", "videoGenTextNode", "videoGenTextSpeechRecognizeNode", "audioGenTextSpeechRecognizeNode", "fileGenTextNode", "linkGenTextNode", "getFirstFrameNode", "getLastFrameNode", "musicRepaintNode", "musicExtractNode", "musicLegoNode", "musicCompleteNode"];
3683
+ readonly TRANSFORM: readonly ["imageGenVideoNode", "textGenVideoNode", "imageGenModelNode", "imagePoseNode", "imageBodySegNode", "imageNormalNode", "imageMattingNode", "videoGenModelNode", "speechGenVideoNode", "imageGenImageNode", "imageGenImageUpscaleNode", "genTextNode", "textGenImageNode", "textGenMusicNode", "textGenAudioNode", "textGenSpeechCloneNode", "textGenSpeechPresetNode", "textGenSpeechInstructNode", "removeVideoSubtitleNode", "removeWatermarkNode", "videoUpscaleNode", "videoEditNode", "extractAudioNode", "removeVideoAudioNode", "denoiseAudioSubtitleNode", "separateAudioTrackNode", "separateSpeakerNode", "convertVoiceNode", "audioDescribeNode", "imageGenTextNode", "videoGenTextNode", "videoGenTextSpeechRecognizeNode", "audioGenTextSpeechRecognizeNode", "fileGenTextNode", "linkGenTextNode", "getFirstFrameNode", "getLastFrameNode", "musicRepaintNode", "musicExtractNode", "musicLegoNode", "musicCompleteNode"];
3538
3684
  readonly BATCH: readonly ["dropVideoNode", "arrangeNode", "concatVideoNode"];
3539
3685
  readonly COMPOSE: readonly ["mergeVideoAudioNode", "audioVideoLipSyncNode", "imageFusionNode", "imagesGenVideoNode", "refsGenVideoNode", "speechImageGenVideoNode", "speechTextGenVideoNode", "speechVideoGenVideoNode", "videoImageGenVideoMoveNode", "videoImageGenVideoMixNode", "imageImageGenVideoNode", "textAudioGenSpeechNode", "textGenSpeechCloneComposeNode", "imageGenVideoComposeNode", "textsGenTextNode", "concatVideoComposeNode", "musicCoverNode"];
3540
3686
  readonly DECOMPOSE: readonly ["splitVideoNode", "splitTextNode", "musicBriefNode", "separateSoundNode"];
@@ -3954,7 +4100,7 @@ declare class ErrorBoundary extends Component<Props, State> {
3954
4100
  static getDerivedStateFromError(error: Error): State;
3955
4101
  componentDidCatch(error: Error, info: ErrorInfo): void;
3956
4102
  handleReset: () => void;
3957
- render(): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
4103
+ render(): string | number | bigint | boolean | import("react/jsx-runtime").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
3958
4104
  }
3959
4105
  //#endregion
3960
4106
  //#region src/canvas/ui/error-toast.d.ts
@@ -4118,4 +4264,4 @@ interface WhiteBoardProps {
4118
4264
  }
4119
4265
  declare const WhiteBoard: React$1.ForwardRefExoticComponent<WhiteBoardProps & React$1.RefAttributes<WhiteBoardRef>>;
4120
4266
  //#endregion
4121
- export { AbiOutputChannel, AbiOutputView, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AudioRecorderWithVisualizer, Badge, BatchTaskConfig, Button, CANVAS_LOCALES, CanvasHostConfig, CanvasLocale, CanvasProvider, CanvasProviderProps, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, ClientTranslator, ConfigState, CreateMaterialRequest, CreateMaterialResponse, CreateTaskRequest, CreateTaskResponse, DEFAULT_QWEN_SPEAKER, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EDGE_TYPES, ErrorBoundary, FORMAT_CATEGORIES, FileValidationResult, FlowCanvas, FlowCanvasHandle, FlowCanvasProps, FlowReactBindings, FlowState, Input, Label, LibInput, ListMaterialsResponse, ListTasksResponse, LoadPriority, LoadTask, Material, MaterialType, NODE_CATEGORIES, NODE_TYPES, NodePluginIdSelect, NodeTaskHandler, NodeType, PluginMeta, PluginsRegistryPayload, type PossibleNode, PresignedUrlResponse, Progress, QWEN_SPEAKERS, QwenSpeaker, QwenSpeakerGender, RECOMMENDATIONS, SSEMessage, SSEMessageData, SSENodeInfo, SSEStatus, SSE_TASK_MESSAGE_EVENT, SUPPORTED_FORMATS, SaveFromTaskRequest, SaveFromTaskResponse, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, ShowErrorToastOptions, Skeleton, Slider, SpeakerVoiceRecorder, Switch, TASK_CANCEL_REQUEST_EVENT, TROUBLESHOOTING, Tabs, TabsContent, TabsList, TabsTrigger, Task, TaskCancelRequestDetail, TaskCreationConfig, TaskRecord, TaskState, TaskSubscriptionOptions, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TraceMaterialWorkflowResponse, UpdateStatusRequest, UpdateStatusResponse, UploadResponse, UploadState, UploadValidationError, UseAbiExecutionOptions, UseAbiExecutionReturn, UseAbiFormReturn, UseFileAsyncLoaderOptions, UseMultipleUploadOptions, UseUploadOptions, ValidationResult, VideoRecorder, WORKSPACE_MODE_KEY, Waterfall, WaterfallProps, WaterfallRenderProps, WhiteBoard, WhiteBoardRef, WorkflowExecutionStatus, WorkspaceMode, apiClient, apiDelete, apiGet, apiPatch, apiPost, apiPut, apiUrl, applyResolvedOutputRoutes, assetUrl, badgeVariants, buttonVariants, canvasMessages, cn, computeOutputView, configureCanvasHost, createMaterial, createTask, deleteMaterial, emitSSEConnected, emitSSETaskMessage, emitTaskCancelRequest, getCanvasHost, getCanvasLocale, getClientTranslator, getFileUrl, getGlobalFileCache, getGlobalFileQueue, getImageDimensions, getMaterialFileUrls, getPresignedUploadUrl, getPrivateFileUrl, getSharedFileUrl, getTaskStopUrl, getTaskWaitUrl, getVideoMetadata, hostFetch, isCanvasLocale, isImageFile, isVideoFile, listMaterials, listTasks, normalizeTaskPayloadData, pluginDisplayName, refreshPluginsRegistry, saveFromTask, setCanvasLocale, showErrorToast, toggleFavorite, traceMaterialWorkflow, updateTaskStatus, useAbiExecution, useAbiForm, useBatchTaskManager, useCreateTask, useDropzone, useFileAsyncLoader, useFileAsyncLoaderBatch, useFileLoaderStats, useFileUrl, useFlow, useMultipleUpload, useNodeAbiSpec, useNodePluginIds, useNodePluginIdsUnion, useNodePluginModels, useNodePluginResolver, useNodeState, useNodeTaskUpdate, useNodeType, usePluginMeta, usePluginsRegistry, usePluginsRegistryStore, useResolvedPluginId, useTask, useTaskStore, useTaskSubscription, useUpload, useUpstreamNodeIds, validateFile };
4267
+ export { AbiOutputChannel, AbiOutputView, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AudioRecorderWithVisualizer, Badge, BatchTaskConfig, Button, CANVAS_LOCALES, CanvasHostConfig, CanvasLocale, CanvasProvider, CanvasProviderProps, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, ClientTranslator, ConfigState, CreateMaterialRequest, CreateMaterialResponse, CreateTaskRequest, CreateTaskResponse, DEFAULT_QWEN_SPEAKER, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EDGE_TYPES, ErrorBoundary, FORMAT_CATEGORIES, FileValidationResult, FlowCanvas, FlowCanvasHandle, FlowCanvasProps, FlowReactBindings, FlowState, Input, Label, LibInput, ListMaterialsResponse, ListTasksResponse, LoadPriority, LoadTask, Material, MaterialType, NODE_CATEGORIES, NODE_TYPES, NodePluginIdSelect, NodeTaskHandler, NodeType, PluginMeta, PluginsRegistryPayload, type PossibleNode, PresignedUrlResponse, Progress, QWEN_SPEAKERS, QwenSpeaker, QwenSpeakerGender, RECOMMENDATIONS, SSEMessage, SSEMessageData, SSENodeInfo, SSEStatus, SSE_TASK_MESSAGE_EVENT, SUPPORTED_FORMATS, SaveFromTaskRequest, SaveFromTaskResponse, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, ShowErrorToastOptions, Skeleton, Slider, SpeakerVoiceRecorder, Switch, TASK_CANCEL_REQUEST_EVENT, TROUBLESHOOTING, Tabs, TabsContent, TabsList, TabsTrigger, Task, TaskCancelRequestDetail, TaskCreationConfig, TaskRecord, TaskState, TaskSubscriptionOptions, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TraceMaterialWorkflowResponse, UpdateStatusRequest, UpdateStatusResponse, UploadResponse, UploadState, UploadValidationError, UseAbiExecutionOptions, UseAbiExecutionReturn, UseAbiFormReturn, UseFileAsyncLoaderOptions, UseMultipleUploadOptions, UseUploadOptions, ValidationResult, VideoRecorder, WORKSPACE_MODE_KEY, Waterfall, WaterfallProps, WaterfallRenderProps, WhiteBoard, WhiteBoardRef, WorkflowExecutionStatus, WorkspaceMode, apiClient, apiDelete, apiGet, apiPatch, apiPost, apiPut, apiUrl, applyResolvedOutputRoutes, assetUrl, badgeVariants, buttonVariants, canvasMessages, cn, computeOutputView, configureCanvasHost, createMaterial, createTask, deleteMaterial, emitSSEConnected, emitSSETaskMessage, emitTaskCancelRequest, getCanvasHost, getCanvasLocale, getClientTranslator, getFileUrl, getGlobalFileCache, getGlobalFileQueue, getImageDimensions, getMaterialFileUrls, getNodePluginModels, getNodePluginParams, getPresignedUploadUrl, getPrivateFileUrl, getSharedFileUrl, getTaskStopUrl, getTaskWaitUrl, getVideoMetadata, hostFetch, isCanvasLocale, isImageFile, isVideoFile, listMaterials, listTasks, loadPluginModelCatalog, normalizeTaskPayloadData, pluginDisplayName, refreshPluginsRegistry, saveFromTask, setCanvasLocale, showErrorToast, toggleFavorite, traceMaterialWorkflow, updateTaskStatus, useAbiExecution, useAbiForm, useBatchTaskManager, useCreateTask, useDropzone, useFileAsyncLoader, useFileAsyncLoaderBatch, useFileLoaderStats, useFileUrl, useFlow, useLiveModelsStore, useMultipleUpload, useNodeAbiSpec, useNodePluginIds, useNodePluginIdsUnion, useNodePluginModels, useNodePluginParams, useNodePluginResolver, useNodeState, useNodeTaskUpdate, useNodeType, usePluginMeta, usePluginsRegistry, usePluginsRegistryStore, useResolvedPluginId, useTask, useTaskStore, useTaskSubscription, useUpload, useUpstreamNodeIds, validateFile };