@nodaro/shared 2.19.0 → 2.21.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.
Files changed (35) hide show
  1. package/dist/index.cjs +548 -31
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +1043 -386
  4. package/dist/index.d.ts +1043 -386
  5. package/dist/index.js +529 -32
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/__tests__/credit-identifiers.test.ts +133 -0
  9. package/src/__tests__/image-pricing-catalog-coverage.test.ts +139 -0
  10. package/src/__tests__/normalize-node-params.test.ts +36 -0
  11. package/src/__tests__/organizations-types.test.ts +29 -1
  12. package/src/__tests__/prompt-length-limits.test.ts +36 -0
  13. package/src/__tests__/safety-retry-policy.test.ts +47 -0
  14. package/src/__tests__/suno-credit-type.test.ts +54 -0
  15. package/src/__tests__/topaz-upscale.test.ts +132 -0
  16. package/src/__tests__/unresolved-ref-tokens.test.ts +66 -0
  17. package/src/__tests__/video-analysis-brief.test.ts +61 -0
  18. package/src/__tests__/video-analysis.test.ts +83 -0
  19. package/src/__tests__/video-audio-capability.test.ts +38 -4
  20. package/src/__tests__/video-catalog-totality.test.ts +85 -0
  21. package/src/__tests__/video-collapse-parity.test.ts +76 -0
  22. package/src/__tests__/video-ref-video-duration-limits.test.ts +69 -0
  23. package/src/__tests__/video-request-normalize.test.ts +239 -0
  24. package/src/credit-identifiers.ts +264 -20
  25. package/src/index.ts +30 -2
  26. package/src/model-catalog.ts +287 -6
  27. package/src/model-constants.ts +185 -13
  28. package/src/node-refs.ts +82 -0
  29. package/src/node-runtime-keys.ts +5 -0
  30. package/src/normalize-node-params.ts +8 -0
  31. package/src/organizations/types.ts +12 -0
  32. package/src/organizations/views.ts +114 -0
  33. package/src/safety-retry-policy.ts +37 -0
  34. package/src/topaz-upscale.ts +163 -0
  35. package/src/video-analysis.ts +115 -5
package/dist/index.d.ts CHANGED
@@ -524,6 +524,33 @@ declare const CREDIT_BASE_USD = 0.002;
524
524
  * (generate-image, image-to-image, edit-image). Single source of truth — the route Zod
525
525
  * schemas and the factory-preset guard test all read this. Prompt cap ONLY (not negativePrompt). */
526
526
  declare const IMAGE_PROMPT_MAX = 5000;
527
+ /**
528
+ * The ONE aspect-ratio vocabulary the image routes' Zod enums are built from —
529
+ * `/v1/generate-image`, `/v1/image-to-image` and `/v1/edit-image` all declare
530
+ * `z.enum(IMAGE_ASPECT_RATIO_VALUES)` instead of keeping three literal lists
531
+ * that drift.
532
+ *
533
+ * It is the UNION of every ratio any `kind: "image"` catalog entry declares, so
534
+ * a value the picker offers can never 400 at the route. That gap has shipped
535
+ * twice — Wan 2.7's ultra-wide `8:1`/`1:8` (fixed on generate-image only) and
536
+ * Nano Banana 2 Lite's banner `4:1`/`1:4` (still open until this tuple landed).
537
+ * `packages/shared/src/__tests__/image-pricing-catalog-coverage.test.ts` fails
538
+ * the build if a new model declares a ratio this tuple is missing.
539
+ *
540
+ * This enum is a VOCABULARY BOUND, not a per-model gate: it only stops a
541
+ * free-form string from reaching a provider as `image_size`. The per-model gate
542
+ * is the catalog snap (`resolveNormalizedImageGen` → `normalizeModelInput`),
543
+ * which CORRECTS an unsupported ratio and discloses it in the response's
544
+ * `adjustments` — never rejects. So widening this tuple is always safe: it
545
+ * defers a rejection to the correcting snap, which is the desired behaviour.
546
+ *
547
+ * `auto` is model-specific (GPT Image 2 / Nano Banana 2 Lite treat it as
548
+ * "native"); it lives here for the same reason as the rest — the snap drops or
549
+ * replaces it for models that do not declare it.
550
+ */
551
+ declare const IMAGE_ASPECT_RATIO_VALUES: readonly ["auto", "1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3", "5:4", "4:5", "21:9", "4:1", "1:4", "8:1", "1:8"];
552
+ /** A ratio string the image routes accept (pre-snap vocabulary, not a per-model guarantee). */
553
+ type ImageAspectRatio = typeof IMAGE_ASPECT_RATIO_VALUES[number];
527
554
  /**
528
555
  * Per-provider maximum ASSEMBLED image-prompt length (chars), VERIFIED against
529
556
  * each model's official docs.kie.ai schema (2026-06). Providers absent here use
@@ -560,14 +587,35 @@ declare function getMaxImagePromptChars(provider: string | undefined): number;
560
587
  declare const VIDEO_PROMPT_MAX = 8000;
561
588
  /**
562
589
  * Suno prompt / lyrics / content ceiling — the LARGEST any Suno version accepts
563
- * in custom mode (V4.5 / V4.5PLUS / V4.5ALL / V5 / V5.5 = 5000). The route Zod
564
- * uses this as a generous ceiling; the handler clamps to the per-version cap via
565
- * {@link getMaxSunoPromptChars} (V4/V3.5 = 3000, non-custom = 500). Shared with
566
- * the editor `maxLength` / counter (warn-don't-block at the per-version cap).
567
- * `style` and `title` have their own caps ({@link getMaxSunoStyleChars} /
568
- * {@link SUNO_TITLE_MAX}).
590
+ * in custom mode (V4.5 / V4.5PLUS / V4.5ALL / V5 / V5.5 = 5000). NOT the route
591
+ * Zod bound — the routes bind at {@link SUNO_HARD_CEILING} and clamp to the
592
+ * per-version cap via {@link getMaxSunoPromptChars} (3000 non-custom for every
593
+ * version; in custom mode 3000 for V4/V3.5, 5000 for V4.5+/V5) before the job
594
+ * is built. This constant is shared with the editor `maxLength` / counter
595
+ * (warn-don't-block at the per-version cap). `style` and `title` have their
596
+ * own caps ({@link getMaxSunoStyleChars} / {@link SUNO_TITLE_MAX}).
569
597
  */
570
598
  declare const SUNO_TEXT_MAX = 5000;
599
+ /**
600
+ * Absolute ceiling for every Suno text field on the route Zod schemas
601
+ * (`prompt`, `lyrics`, `fullLyrics`, `content`, `userPrompt`).
602
+ *
603
+ * WARN-DON'T-BLOCK. The per-version caps ({@link getMaxSunoPromptChars} /
604
+ * {@link getMaxSunoStyleChars}) do the real work — the routes CLAMP to them
605
+ * before building the job. The Zod bound only exists to stop abuse, so it must
606
+ * stay generous: until 2026-09 the routes bounded these fields at
607
+ * {@link SUNO_TEXT_MAX} (5000), which meant a programmatically-set prompt (an
608
+ * agent, an app run, a FieldMapping) was hard-REJECTED with a 400 before the
609
+ * clamp could trim it — three app-report rows on 2026-08-19..31.
610
+ *
611
+ * DISTINCT FROM {@link PROMPT_HARD_CEILING} on purpose: that one is an
612
+ * image/video budget pinned to MAX_IMAGE/VIDEO_PROMPT_CHARS_BY_PROVIDER by its
613
+ * own drift guard. Coupling them would let one modality's limits move the
614
+ * other's. This one has a single invariant, enforced in
615
+ * `__tests__/prompt-length-limits.test.ts`: it MUST stay >= every value
616
+ * getMaxSunoPromptChars / getMaxSunoStyleChars can return.
617
+ */
618
+ declare const SUNO_HARD_CEILING = 30000;
571
619
  /**
572
620
  * Absolute ceiling for the `prompt` / `negativePrompt` fields on the image and
573
621
  * video routes' Zod schemas. The PER-MODEL limits below (and the editor warning)
@@ -639,9 +687,11 @@ declare const MAX_TTS_CHARS_BY_PROVIDER: Record<string, number>;
639
687
  /** Max TTS text length (chars) for a provider: verified override, else {@link TTS_TEXT_MAX}. */
640
688
  declare function getMaxTtsChars(provider: string | undefined): number;
641
689
  /**
642
- * Suno per-version field caps (from docs.kie.ai/suno-api/generate-music). The old
643
- * flat {@link SUNO_TEXT_MAX} (3000) was simultaneously too low for V4.5+/V5
644
- * prompts (5000) and too high for `style` (1000) and `title` (80).
690
+ * Suno per-version field caps (from docs.kie.ai/suno-api/generate-music). The
691
+ * original flat 3000 cap was simultaneously too low for V4.5+/V5 prompts
692
+ * (5000) and too high for `style` (1000) and `title` (80). ({@link
693
+ * SUNO_TEXT_MAX} is 5000 today — the largest per-version prompt cap; the
694
+ * route Zod bound is {@link SUNO_HARD_CEILING}.)
645
695
  * - prompt / lyrics: 3000 in non-custom mode (all versions); in custom mode
646
696
  * 3000 for V4/V3.5 and 5000 for V4.5 / V4.5PLUS / V4.5ALL / V5 / V5.5.
647
697
  * - style: 200 for V4/V3.5, 1000 for V4.5+.
@@ -794,7 +844,7 @@ type ImageToVideoProvider = typeof IMAGE_TO_VIDEO_PROVIDERS[number];
794
844
  declare const TEXT_TO_VIDEO_PROVIDERS: readonly ["minimax", "veo3", "veo3.1", "veo3_lite", "kling", "kling-turbo", "kling-3.0", "grok", "seedance", "seedance-2", "seedance-2-fast", "seedance-2-mini", "seedance-2-5", "minimax-h3", "wan", "hailuo-standard", "bytedance-lite", "bytedance-pro", "wan-turbo", "wan-2.7-t2v", "happyhorse", "runway-kie", "gemini-omni-video", "gemini-omni-flash", "wan-3", "wan-3-prime", "ltx-2.3-pro", "ltx-2.3-fast", "grok-imagine-video-1.5", "kling-3-omni", "kling-master", "hailuo-2.3", "hailuo-2.3-pro", "bytedance-pro-fast", "happyhorse-ref2v"];
795
845
  type TextToVideoProvider = typeof TEXT_TO_VIDEO_PROVIDERS[number];
796
846
  /** Unified video-generation providers (image-to-video ∪ text-to-video) for the generate-video node. */
797
- declare const VIDEO_GEN_PROVIDERS: readonly ["minimax", "veo3", "veo3.1", "veo3_lite", "kling", "kling-turbo", "kling-3.0", "kling-master", "seedance", "seedance-2", "seedance-2-fast", "seedance-2-mini", "seedance-2-5", "minimax-h3", "hailuo-2.3-pro", "hailuo-2.3", "hailuo-standard", "wan-i2v", "wan-turbo", "bytedance-lite", "bytedance-pro", "bytedance-pro-fast", "grok-i2v", "wan-2.7-i2v", "happyhorse-i2v", "happyhorse-ref2v", "runway-kie", "kling-3-omni", "gemini-omni-video", "gemini-omni-flash", "wan-3", "wan-3-prime", "ltx-2.3-pro", "ltx-2.3-fast", "grok-imagine-video-1.5", ...("veo3" | "kling-3.0" | "seedance-2" | "veo3.1" | "wan-turbo" | "bytedance-lite" | "kling-turbo" | "minimax" | "hailuo-standard" | "grok" | "minimax-h3" | "hailuo-2.3-pro" | "hailuo-2.3" | "veo3_lite" | "gemini-omni-video" | "gemini-omni-flash" | "kling" | "kling-master" | "kling-3-omni" | "grok-imagine-video-1.5" | "seedance" | "seedance-2-fast" | "seedance-2-mini" | "seedance-2-5" | "wan-3" | "wan-3-prime" | "wan" | "wan-2.7-t2v" | "happyhorse" | "happyhorse-ref2v" | "bytedance-pro" | "bytedance-pro-fast" | "runway-kie" | "ltx-2.3-pro" | "ltx-2.3-fast")[]];
847
+ declare const VIDEO_GEN_PROVIDERS: readonly ["minimax", "veo3", "veo3.1", "veo3_lite", "kling", "kling-turbo", "kling-3.0", "kling-master", "seedance", "seedance-2", "seedance-2-fast", "seedance-2-mini", "seedance-2-5", "minimax-h3", "hailuo-2.3-pro", "hailuo-2.3", "hailuo-standard", "wan-i2v", "wan-turbo", "bytedance-lite", "bytedance-pro", "bytedance-pro-fast", "grok-i2v", "wan-2.7-i2v", "happyhorse-i2v", "happyhorse-ref2v", "runway-kie", "kling-3-omni", "gemini-omni-video", "gemini-omni-flash", "wan-3", "wan-3-prime", "ltx-2.3-pro", "ltx-2.3-fast", "grok-imagine-video-1.5", ...("veo3" | "kling-3.0" | "seedance-2" | "veo3.1" | "wan-turbo" | "bytedance-lite" | "kling-turbo" | "minimax" | "hailuo-standard" | "grok" | "minimax-h3" | "hailuo-2.3-pro" | "hailuo-2.3" | "veo3_lite" | "gemini-omni-video" | "gemini-omni-flash" | "kling" | "kling-master" | "kling-3-omni" | "grok-imagine-video-1.5" | "seedance" | "seedance-2-fast" | "seedance-2-mini" | "seedance-2-5" | "wan-3" | "wan-3-prime" | "wan" | "wan-2.7-t2v" | "ltx-2.3-pro" | "ltx-2.3-fast" | "happyhorse" | "happyhorse-ref2v" | "bytedance-pro" | "bytedance-pro-fast" | "runway-kie")[]];
798
848
  type VideoGenProvider = typeof VIDEO_GEN_PROVIDERS[number];
799
849
  /**
800
850
  * Video models that expose DISTINCT provider ids per mode (text-to-video vs
@@ -1270,6 +1320,53 @@ declare const VIDEO_REF_LIMITS_BY_PROVIDER: Record<string, {
1270
1320
  videos?: number;
1271
1321
  audio?: number;
1272
1322
  } | undefined>;
1323
+ /** Per-reference-video duration bounds, in seconds. */
1324
+ interface RefVideoDurationLimit {
1325
+ minSec: number;
1326
+ maxSec: number;
1327
+ /** Cap on the SUM of all reference-video durations, when the provider has one. */
1328
+ maxTotalSec?: number;
1329
+ }
1330
+ /**
1331
+ * Reference-video duration limits, provider-declared.
1332
+ *
1333
+ * `VIDEO_REF_LIMITS_BY_PROVIDER` above caps the reference COUNT; these cap the
1334
+ * duration of each clip. Both routes already ffprobe every reference video to
1335
+ * price the run (ee/billing/seedance2-ref-video-credits.ts and
1336
+ * minimax-h3-credits.ts), so the numbers are in hand before the job exists —
1337
+ * and until 2026-09-02 they were discarded, which is why "Each reference video
1338
+ * must be between 2 and 30 seconds" and "video duration 52838 ms, expected
1339
+ * [2000, 15000] ms" were reaching users as post-payment provider rejects
1340
+ * (app-reports §11.3).
1341
+ *
1342
+ * Data-driven, exactly like SEEDANCE_2_R2V_MAX_AUDIO_SEC_BY_PROVIDER above:
1343
+ * only providers with a VERIFIED documented limit are listed, so an unknown
1344
+ * provider is never false-rejected.
1345
+ *
1346
+ * Sources: docs.kie.ai/market/bytedance/seedance-2-5 ("Single video duration:
1347
+ * [2, 30] seconds"; "Total duration of reference videos must not exceed 30
1348
+ * seconds") and docs.kie.ai/market/minimax-h3/reference-to-video (reference
1349
+ * videos are "2 to 15 seconds" each and "the total duration of all reference
1350
+ * videos cannot exceed 15 seconds", up to 3 videos) — both fetched 2026-09-02.
1351
+ */
1352
+ declare const VIDEO_REF_VIDEO_DURATION_LIMITS: Record<string, RefVideoDurationLimit | undefined>;
1353
+ /**
1354
+ * Validate probed reference-video durations against the provider's limits.
1355
+ *
1356
+ * Non-finite / non-positive entries are IGNORED, never rejected: the probe
1357
+ * helpers treat an unreadable clip as a worst-case duration for pricing, and
1358
+ * turning a failed ffprobe into a user-facing 400 would block legitimate runs
1359
+ * on a transient probe failure. Callers therefore pass the RAW per-URL probe
1360
+ * outcomes (a rejected ffprobe arrives here as NaN) — an ignored entry also
1361
+ * contributes nothing to the `maxTotalSec` sum, so a probe blip can never push
1362
+ * an otherwise-legal set over the total cap either.
1363
+ */
1364
+ declare function checkRefVideoDurations(provider: string, durationsSec: readonly number[]): {
1365
+ ok: true;
1366
+ } | {
1367
+ ok: false;
1368
+ message: string;
1369
+ };
1273
1370
  /**
1274
1371
  * Video generation models whose provider API natively accepts a "match the
1275
1372
  * visual input's aspect" token, mapped to that provider's EXACT token.
@@ -1379,8 +1476,8 @@ interface VideoAudioCapability {
1379
1476
  /**
1380
1477
  * Per-model audio capability. Only models that produce SOME audio are listed;
1381
1478
  * anything absent defaults to `{ mode: "none" }` via `getVideoAudioCapability`,
1382
- * so silent models (minimax, hailuo, wan, grok-i2v, gemini-omni-video, runway,
1383
- * pika, …) need no entry. New audio-capable models MUST be added here — the
1479
+ * so silent models (minimax, hailuo, wan-i2v, grok-i2v, runway, pika, …) need
1480
+ * no entry. New audio-capable models MUST be added here — the
1384
1481
  * `video-audio-capability` guard test cross-checks this map against the model
1385
1482
  * configs' `extraParams.sound` / `generate_audio` + VEO/Seedance-2 sets so a
1386
1483
  * forgotten entry fails CI rather than silently disabling audio.
@@ -1841,10 +1938,402 @@ interface ExtraRefCharacterContext {
1841
1938
  */
1842
1939
  declare function expandExtraRefsToConnectedReferences(extras: ReadonlyArray<ExtraRefInput> | undefined, lookupCharacterContext?: (slug: string) => ExtraRefCharacterContext | undefined): ConnectedReference[];
1843
1940
 
1941
+ /**
1942
+ * Model catalog — single source of truth for what each Nodaro-exposed model
1943
+ * is, who made it, what it's good for, and which knobs it accepts.
1944
+ *
1945
+ * Consumed by:
1946
+ * - Backend MCP `list_models` tool (renders the nested per-kind / per-family
1947
+ * response so Claude can pick the right model for a user's intent)
1948
+ * - (future) Frontend config panels — today they read parallel registries
1949
+ * in `frontend/src/components/editor/config-panels/model-options.ts`; a
1950
+ * follow-up will migrate them to import from here.
1951
+ *
1952
+ * Authoring rules:
1953
+ * - Keep `description` to one line (≤120 chars). It's what Claude reads to
1954
+ * decide which model to use.
1955
+ * - `useCases` is a small set of short tags (1-3 words) — verbs/nouns Claude
1956
+ * can match against user intent ("typography", "character", "fast",
1957
+ * "cinematic"). Stay consistent across entries: don't write "text" in one
1958
+ * and "typography" in another.
1959
+ * - `aspectRatios` / `resolutions` / `qualities` only appear when the model
1960
+ * actually exposes that lever (e.g., Nano Banana base has no `resolution`).
1961
+ * - `durations` is in seconds.
1962
+ * - `pricing[0]` is ALWAYS the default variant (the bare id without a
1963
+ * composite suffix like `:4K` or `:high`).
1964
+ * - Costs are sourced from `STATIC_CREDIT_COSTS` (see backend
1965
+ * `src/billing/credits.ts`). Keep them in sync if the table changes.
1966
+ * - After editing `MODEL_CATALOG` or `MODEL_RECOMMENDATIONS`, run
1967
+ * `npm run gen:skills` (from `backend/`) to refresh the public
1968
+ * `docs/choosing-models.md` guide. CI (`gen:skills:check`) fails on drift.
1969
+ */
1970
+ type ModelKind = "image" | "video" | "audio";
1971
+ type ModelMode = "t2i" | "i2i" | "edit" | "upscale" | "remove-bg" | "i2v" | "t2v" | "v2v" | "extend" | "motion-transfer" | "lip-sync" | "video-upscale" | "tts" | "music" | "sfx" | "stt" | "voice-clone" | "voice-design" | "voice-changer" | "isolation" | "dubbing" | "forced-alignment" | "dialogue" | "video-analysis" | "video-audit";
1972
+ interface PriceVariant {
1973
+ /** Composite identifier as it appears in `STATIC_CREDIT_COSTS`. */
1974
+ identifier: string;
1975
+ /** Credits charged at reservation. */
1976
+ credits: number;
1977
+ /** Short human-readable note describing this variant ("1K default", "4K", "with audio"). */
1978
+ note?: string;
1979
+ }
1980
+ interface ModelCatalogEntry {
1981
+ id: string;
1982
+ kind: ModelKind;
1983
+ /**
1984
+ * Operations this model supports. Many video models (minimax, veo3,
1985
+ * seedance) support BOTH i2v AND t2v under the same id — the route handler
1986
+ * picks which KIE endpoint to hit based on whether an image was supplied.
1987
+ * For those, list both modes here so MCP filters and frontend pickers see
1988
+ * the model in either context.
1989
+ */
1990
+ modes: readonly ModelMode[];
1991
+ /** Vendor / lab that produced the model. Used for UI grouping. */
1992
+ family: string;
1993
+ /** Display name (NOT the id — the id is the API enum value). */
1994
+ label: string;
1995
+ /**
1996
+ * Model LINE for the add-node Models tab — the brand-agnostic product line a
1997
+ * user thinks in ("Nano Banana", "Flux", "VEO", "Kling", "ElevenLabs").
1998
+ * Distinct from `family` (the lab: Google covers Nano Banana + Imagen + VEO).
1999
+ * REQUIRED for every node-creatable model; a completeness guard in
2000
+ * `@nodaro/shared` (model-tree.test.ts) fails if one is missing.
2001
+ */
2002
+ series?: string;
2003
+ /**
2004
+ * The value written into the creating node's data field when this model is
2005
+ * picked from the Models tab, for models whose catalog id differs from the
2006
+ * stored value. Only `suno-generate` diverges today (id `suno-v5` → `data.model`
2007
+ * "V5"). Omit when the id IS the stored value (the common case).
2008
+ */
2009
+ dataValue?: string;
2010
+ /** One-liner. Visible to Claude in MCP `list_models` output. */
2011
+ description: string;
2012
+ /** Short tags Claude matches against user intent. */
2013
+ useCases: readonly string[];
2014
+ /**
2015
+ * Capabilities flags: "reference-image", "end-frame", "audio", etc.
2016
+ *
2017
+ * `"video-reference"` (video models only) means the model accepts a
2018
+ * reference VIDEO as a CONDITIONING clip — the r2v transport that
2019
+ * `resolveSeedance2Inputs` builds and that KIE receives as
2020
+ * `reference_video_urls`. It is what generate-video-pro's `extend` render
2021
+ * method needs (a continuation tail off the previous segment), and
2022
+ * `GVP_EXTEND_PROVIDERS` derives from it.
2023
+ *
2024
+ * It is deliberately NOT set on `gemini-omni-video`: that model's
2025
+ * `video_list` input is a V2V SOURCE clip with a trim window, an
2026
+ * auto-determined duration and flat per-generation pricing (see
2027
+ * `runGeminiOmni` in `backend/src/providers/kie/video.ts`) — a different
2028
+ * transport, not a continuation reference.
2029
+ */
2030
+ features?: readonly string[];
2031
+ aspectRatios?: readonly string[];
2032
+ resolutions?: readonly string[];
2033
+ /**
2034
+ * What this model actually RENDERS for a resolution outside `resolutions`.
2035
+ *
2036
+ * Most providers honour whatever band they are sent, so an off-list value is
2037
+ * best snapped to the NEAREST supported one — a 4k request on a 1080p-max
2038
+ * model renders 1080p. A few instead COLLAPSE anything unrecognised to a
2039
+ * fixed default (MiniMax H3 → 2K, Wan 3.0 → 720p), and for those the nearest
2040
+ * band is the wrong answer in the most expensive direction: snapping a stale
2041
+ * "720p" to H3's cheap 768P would send a value the provider ignores, so we
2042
+ * would bill the 768P tier against a 2K render, and `commit_credits` never
2043
+ * collects the shortfall.
2044
+ *
2045
+ * Declare it in the catalog's own spelling. `normalizeVideoRequestParams`
2046
+ * uses it in place of the nearest-band snap; `video-collapse-parity.test.ts`
2047
+ * pins each declaration to what the provider normalizer actually returns, so
2048
+ * the two cannot drift.
2049
+ */
2050
+ unlistedResolutionRendersAs?: string;
2051
+ qualities?: readonly string[];
2052
+ durations?: readonly number[];
2053
+ pricing: readonly PriceVariant[];
2054
+ /** Editorial highlight — "best in tier". Surfaces in MCP output as a ⭐. */
2055
+ featured?: boolean;
2056
+ /**
2057
+ * Per-model overrides for the global value label decorations (e.g. Hailuo
2058
+ * 2.3 Pro labels its 1080P resolution as "1080P (6s max)" because the
2059
+ * model caps long durations at lower resolution). Falls back to
2060
+ * `MODEL_VALUE_LABELS` for values not listed here.
2061
+ */
2062
+ valueLabels?: Record<string, string>;
2063
+ /**
2064
+ * Hide from MCP `list_models` output and tool model enums. Used for legacy
2065
+ * model versions superseded by newer entries — they remain in the catalog
2066
+ * (and accessible via direct API / frontend pickers for back-compat) but
2067
+ * stop showing up in Claude.ai's model picker, which keeps the surface
2068
+ * tight and steers the agent to the current generation.
2069
+ *
2070
+ * Frontend pickers ignore this flag.
2071
+ */
2072
+ mcpHidden?: boolean;
2073
+ /**
2074
+ * The provider's safety filter is known to be non-deterministic on this
2075
+ * model — the platform retries a blocked request once; `fallback` names
2076
+ * the catalog model to offer when it blocks again.
2077
+ */
2078
+ safetyFilter?: {
2079
+ stochastic: true;
2080
+ fallback?: string;
2081
+ };
2082
+ }
2083
+ /**
2084
+ * Editorial recommendations — short "best for X" picks Claude can echo back
2085
+ * to the user when they don't know which model to use. Surfaces as a "Quick
2086
+ * recommendations" footer in MCP `list_models` output.
2087
+ */
2088
+ interface ModelRecommendation {
2089
+ intent: string;
2090
+ modelIds: readonly string[];
2091
+ note: string;
2092
+ }
2093
+ declare const MODEL_RECOMMENDATIONS: readonly ModelRecommendation[];
2094
+ declare const MODEL_CATALOG: Record<string, ModelCatalogEntry>;
2095
+ /**
2096
+ * Lookup helpers for MCP and the future frontend migration.
2097
+ */
2098
+ declare function listModels(filter?: {
2099
+ kind?: ModelKind;
2100
+ mode?: ModelMode;
2101
+ family?: string;
2102
+ }): ModelCatalogEntry[];
2103
+ /**
2104
+ * Group entries by family, returning a stable order.
2105
+ * Returns Array<{ family: string; models: ModelCatalogEntry[] }>.
2106
+ */
2107
+ declare function groupByFamily(entries: ModelCatalogEntry[]): Array<{
2108
+ family: string;
2109
+ models: ModelCatalogEntry[];
2110
+ }>;
2111
+ declare function getModel(id: string): ModelCatalogEntry | undefined;
2112
+ type ValidationField = "aspectRatio" | "resolution" | "quality" | "duration";
2113
+ interface ModelValidationIssue {
2114
+ field: ValidationField;
2115
+ message: string;
2116
+ allowed: readonly (string | number)[] | null;
2117
+ }
2118
+ /**
2119
+ * Validate that the user's lever values are supported by the chosen model.
2120
+ *
2121
+ * Returns null on success or the FIRST issue found. We surface a single issue
2122
+ * rather than collecting all so the agent doesn't get a wall of complaints —
2123
+ * fix one thing, retry. Order: aspectRatio → resolution → quality → duration.
2124
+ *
2125
+ * Semantics:
2126
+ * - If the field is undefined, it's never an issue.
2127
+ * - If the catalog entry doesn't list a corresponding lever (e.g. base
2128
+ * nano-banana has no `resolutions`), passing that field IS an issue —
2129
+ * silently dropping it has caused two bugs already.
2130
+ * - If the value is in the allow list, it's valid.
2131
+ *
2132
+ * Unknown model ids are NOT flagged here — the route handler / Zod model
2133
+ * enum is the right gate for that. We just skip validation.
2134
+ */
2135
+ declare function validateModelInput(modelId: string, input: {
2136
+ aspectRatio?: string;
2137
+ resolution?: string;
2138
+ quality?: string;
2139
+ duration?: number;
2140
+ }): ModelValidationIssue | null;
2141
+ /**
2142
+ * The resolution a Flux 2 model should land on when its stored value is absent
2143
+ * or invalid. Flux 2 exposes ascending megapixel options ("0.5 MP"…"4 MP"), so
2144
+ * snapping to `options[0]` would silently downgrade every node to the cheapest
2145
+ * tier; each variant has a sensible mid default instead. Returns undefined for
2146
+ * every non-Flux-2 model (they snap to `options[0]` normally).
2147
+ */
2148
+ declare function defaultResolutionFor(modelId: string): string | undefined;
2149
+ /** One correction `normalizeModelInput` made, for disclosure to the user. */
2150
+ interface ModelInputAdjustment {
2151
+ field: "aspectRatio" | "resolution" | "quality" | "duration";
2152
+ /** The value that was asked for. */
2153
+ from: string | number;
2154
+ /** What it became — `undefined` means the lever was dropped entirely. */
2155
+ to: string | number | undefined;
2156
+ reason: string;
2157
+ }
2158
+ interface NormalizedModelInput {
2159
+ aspectRatio?: string;
2160
+ resolution?: string;
2161
+ quality?: string;
2162
+ duration?: number;
2163
+ /** Empty when the input was already valid. */
2164
+ adjustments: ModelInputAdjustment[];
2165
+ }
2166
+ /**
2167
+ * Coerce a model's parameters into a combination the model actually accepts.
2168
+ *
2169
+ * The correcting twin of `validateModelInput`. Validation is right when a
2170
+ * human/agent is composing a single call and can retry (MCP verbs do this).
2171
+ * It is the WRONG answer at a persistence or execution boundary: rejecting
2172
+ * there turns a fixable typo into a failed run — and a failed run takes every
2173
+ * already-generated, already-billed sibling node down with it. Incident
2174
+ * 2026-08-09: one node carrying `gpt-image` + `16:9` (a pair the config panel
2175
+ * cannot produce, written straight into workflow JSON by a non-UI author)
2176
+ * aborted a run whose five other nodes had already produced images.
2177
+ *
2178
+ * Rules, mirroring the config panels' provider-change snap:
2179
+ * - Model has no such lever → drop the value (sending it 400s upstream).
2180
+ * - Value outside the model's allow-list → snap to the model's default
2181
+ * (`defaultResolutionFor`) or the first valid option.
2182
+ * - Then apply cross-field constraints that only hold for certain models.
2183
+ *
2184
+ * Unknown model ids pass through untouched — the route's Zod model enum is the
2185
+ * right gate for those, exactly as in `validateModelInput`.
2186
+ *
2187
+ * Every correction is reported in `adjustments` so callers can disclose what
2188
+ * changed rather than silently handing back something else.
2189
+ */
2190
+ declare function normalizeModelInput(modelId: string, input: {
2191
+ aspectRatio?: string;
2192
+ resolution?: string;
2193
+ quality?: string;
2194
+ duration?: number;
2195
+ }): NormalizedModelInput;
2196
+ interface NormalizedVideoRequest {
2197
+ aspectRatio?: string;
2198
+ resolution?: string;
2199
+ adjustments: ModelInputAdjustment[];
2200
+ }
2201
+ /**
2202
+ * The video lane's LIMITED normalizer: `aspectRatio` + `resolution` only, and
2203
+ * only when the catalog actually declares the option list.
2204
+ *
2205
+ * Three deliberate differences from `normalizeModelInput`:
2206
+ * 1. It never DROPS a lever. `normalizeModelInput` removes a value whose list
2207
+ * the catalog doesn't declare; on the video lane `resolution` is a pricing
2208
+ * input, so dropping it would lower the reserved tier and `commit_credits`
2209
+ * never collects an upward delta — a params fix would become a money bug.
2210
+ * 2. "Auto" / "adaptive" pass through (see PASSTHROUGH_ASPECT_TOKENS).
2211
+ * 3. It snaps to the NEAREST option, not to `allowed[0]`. `normalizeModelInput`
2212
+ * would turn a portrait 9:21 into landscape 16:9 and a 4k request into the
2213
+ * cheapest 480p; nearest matches what the provider adapters and the MCP
2214
+ * normalizer already do, so all three give ONE answer. Its snap policy is
2215
+ * deliberately left alone — it is shared with the image lane and the
2216
+ * copilot, and PR 4 defers changing it.
2217
+ *
2218
+ * `duration` is deliberately NOT normalized here: the LTX bands make duration
2219
+ * legality resolution-dependent, which a flat catalog list can't express, and
2220
+ * `buildVideoCreditModelIdentifier` already snaps duration onto a seeded tier.
2221
+ * Carrying THAT tier to the wire is `pricedVideoSelection`'s job
2222
+ * (`credit-identifiers.ts`), which runs after this one, once resolution is known.
2223
+ *
2224
+ * An OMITTED lever stays omitted here — filling it is a pricing decision, not a
2225
+ * catalog one, and likewise belongs to `pricedVideoSelection`.
2226
+ *
2227
+ * Case is canonicalised to the catalog's own spelling — the credit identifiers
2228
+ * key their tables case-SENSITIVELY (LTX_DURATION_TIERS), so this is the single
2229
+ * place a "4K" becomes "4k", and it runs before every identifier site.
2230
+ *
2231
+ * Pure — so the credit-identifier preHandler, `computeCredits`, the reservation
2232
+ * site and the payload build can all call it and cannot disagree (spec §4).
2233
+ */
2234
+ declare function normalizeVideoRequestParams(modelId: string, input: {
2235
+ aspectRatio?: string;
2236
+ resolution?: string;
2237
+ }): NormalizedVideoRequest;
2238
+ interface LabeledOption {
2239
+ value: string;
2240
+ label: string;
2241
+ }
2242
+ /** Return `{value, label}[]` for the model's aspect ratios, or `null` if none. */
2243
+ declare function getAspectRatioOptions(modelId: string): LabeledOption[] | null;
2244
+ /** Return `{value, label}[]` for the model's resolution lever, or `null` if none. */
2245
+ declare function getResolutionOptions(modelId: string): LabeledOption[] | null;
2246
+ /** Return `{value, label}[]` for the model's quality lever, or `null` if none. */
2247
+ declare function getQualityOptions(modelId: string): LabeledOption[] | null;
2248
+ /** Return the model's allowed durations (in seconds), or `null` if none. */
2249
+ declare function getDurationsForModel(modelId: string): number[] | null;
2250
+ /**
2251
+ * Min/max credits across all pricing variants — used by the frontend's
2252
+ * "5–8 cr" range badge in the model dropdown. `null` for models with a
2253
+ * single price point.
2254
+ */
2255
+ declare function getCreditRange(modelId: string): {
2256
+ min: number;
2257
+ max: number;
2258
+ } | null;
2259
+ /** Whether the model declares a given capability flag in its `features` array. */
2260
+ declare function hasFeature(modelId: string, feature: string): boolean;
2261
+ /**
2262
+ * All ids in the catalog whose `features` includes the given flag. Used by
2263
+ * frontend to build PROVIDERS_WITH_END_FRAME / PROVIDERS_WITH_REFERENCES
2264
+ * lists derived from the catalog.
2265
+ */
2266
+ declare function modelsWithFeature(feature: string): string[];
2267
+ /**
2268
+ * Map of `{modelId: durations[]}` for every catalog entry whose `modes`
2269
+ * includes the given mode. Used to derive KIE_VIDEO_DURATIONS (mode i2v)
2270
+ * and KIE_T2V_DURATIONS (mode t2v) on the frontend.
2271
+ */
2272
+ declare function durationsByMode(mode: ModelMode): Record<string, number[]>;
2273
+ /**
2274
+ * Map of `{modelId: LabeledOption[]}` for every catalog entry of the given
2275
+ * kind that exposes a resolution lever. Used to derive
2276
+ * IMAGE_RESOLUTION_OPTIONS / VIDEO_RESOLUTION_OPTIONS on the frontend.
2277
+ */
2278
+ declare function resolutionOptionsByKind(kind: ModelKind): Record<string, LabeledOption[]>;
2279
+ /**
2280
+ * Map of `{modelId: LabeledOption[]}` for every catalog entry of the given
2281
+ * kind that exposes an aspect_ratio lever.
2282
+ */
2283
+ declare function aspectRatioOptionsByKind(kind: ModelKind): Record<string, LabeledOption[]>;
2284
+ /** Same shape as `aspectRatioOptionsByKind` but for `qualities`. */
2285
+ declare function qualityOptionsByKind(kind: ModelKind): Record<string, LabeledOption[]>;
2286
+ /** One shaped model row for a picker — capabilities derived from the catalog. */
2287
+ interface ModelMenuOption {
2288
+ /** Catalog id (the API enum value). */
2289
+ id: string;
2290
+ /** Human-readable display name from the catalog. */
2291
+ label: string;
2292
+ /** Resolution levers, `[]` when the model exposes none. */
2293
+ resolutions: LabeledOption[];
2294
+ /** Aspect-ratio levers, `[]` when the model exposes none. */
2295
+ aspectRatios: LabeledOption[];
2296
+ /** Duration levers in seconds (union of i2v+t2v modes); `[]` for image / fixed-duration models. */
2297
+ durations: {
2298
+ value: number;
2299
+ label: string;
2300
+ }[];
2301
+ }
2302
+ /**
2303
+ * Build shaped picker rows for one catalog `kind` from a caller-supplied id
2304
+ * allowlist (the curation — which ids, in what order, stays the caller's). Every
2305
+ * CAPABILITY is derived from the catalog accessors, never hardcoded, so the menu
2306
+ * can't drift as the catalog evolves. Ids absent from the catalog or of the
2307
+ * wrong kind are skipped (so a stale allowlist entry drops out cleanly). Pure;
2308
+ * returns fresh arrays (never aliases the accessor maps).
2309
+ */
2310
+ declare function buildModelMenu(kind: ModelKind, allowlist: readonly string[]): ModelMenuOption[];
2311
+ /** All `{modelId: {min, max}}` entries that have variable pricing (>1 variant). */
2312
+ declare function creditRangesAll(): Record<string, {
2313
+ min: number;
2314
+ max: number;
2315
+ }>;
2316
+ /**
2317
+ * Tuple of model ids for a given kind + one or more modes. Built for use as
2318
+ * a Zod `z.enum()` argument so MCP tool input schemas stay in sync with the
2319
+ * catalog without manual maintenance.
2320
+ *
2321
+ * Filters out `mcpHidden: true` entries by default — pass `includeHidden`
2322
+ * to surface legacy versions (used internally by validators that still need
2323
+ * to recognize older ids forwarded by direct API callers).
2324
+ *
2325
+ * Pass `kind: null` to skip the kind filter — useful for cross-kind ids
2326
+ * like "grok" (catalog kind=image, modes include both t2i and t2v).
2327
+ */
2328
+ declare function modelIdsByKindMode(kind: ModelKind | null, modes: readonly ModelMode[], opts?: {
2329
+ includeHidden?: boolean;
2330
+ }): [string, ...string[]];
2331
+
1844
2332
  /**
1845
2333
  * Build composite credit model identifiers for variable pricing.
1846
2334
  * Shared between frontend and backend.
1847
2335
  */
2336
+
1848
2337
  /**
1849
2338
  * Compute composite model identifier for variable credit pricing.
1850
2339
  * Examples: "gpt-image:high", "flux:2K", "nano-banana-pro:4K", "ideogram:TURBO",
@@ -1854,7 +2343,57 @@ declare function expandExtraRefsToConnectedReferences(extras: ReadonlyArray<Extr
1854
2343
  * megapixel count plus (Flux 2 Max) the number of reference images attached at request time.
1855
2344
  * For video models, uses duration/sound params when the model has variable pricing.
1856
2345
  */
1857
- declare function buildCreditModelIdentifier(provider: string, quality?: string, resolution?: string, renderingSpeed?: string, targetResolution?: string, referenceImageCount?: number): string;
2346
+ declare function buildCreditModelIdentifier(provider: string, quality?: string, resolution?: string, renderingSpeed?: string, targetResolution?: string, referenceImageCount?: number): string;
2347
+ /**
2348
+ * An image request's catalog-snapped parameters PLUS the credit identifier
2349
+ * priced off them.
2350
+ *
2351
+ * `adjustments` is the disclosure channel: every lever this changed, why, and
2352
+ * to what. Routes return it in the 200 body so a caller learns their value was
2353
+ * corrected instead of silently getting something else.
2354
+ */
2355
+ interface NormalizedImageGen {
2356
+ /** Credit identifier, priced off the SNAPPED `resolution` / `quality`. */
2357
+ identifier: string;
2358
+ /** The catalog model id the params were snapped against (post T2I→I2I swap). */
2359
+ modelId: string;
2360
+ aspectRatio?: string;
2361
+ resolution?: string;
2362
+ quality?: string;
2363
+ /** Empty when the caller's values were already valid for `modelId`. */
2364
+ adjustments: ModelInputAdjustment[];
2365
+ }
2366
+ /**
2367
+ * Snap an image request's catalog-governed levers to a combination the model
2368
+ * actually accepts, and price the credit identifier off the SNAPPED values.
2369
+ *
2370
+ * WHY THE SNAP LIVES HERE and not at the call site. Both image routes compute
2371
+ * their credit identifier TWICE — once in the `creditGuard` preHandler (the
2372
+ * CHECK) and once at the handler's `reserveCreditsForJob` (the DEBIT) — and a
2373
+ * dedicated test asserts the two stay byte-identical (see
2374
+ * `backend/src/routes/__tests__/generate-image.test.ts`, "CHECK === DEBIT").
2375
+ * `resolution` and `quality` are pricing dimensions, so a snap applied at only
2376
+ * one of those sites breaks that invariant, and `commit_credits` never collects
2377
+ * an upward delta — the reserve IS the charge. Putting the snap inside the
2378
+ * primitive makes CHECK, DEBIT and the workflow orchestrator agree by
2379
+ * construction rather than by everyone remembering to call a normalizer.
2380
+ *
2381
+ * Inputs are typed `unknown` on purpose: the preHandler runs BEFORE Zod, so a
2382
+ * caller can put a number or an object in `resolution`. Non-strings become
2383
+ * `undefined` rather than reaching `normalizeModelInput` as a lie.
2384
+ *
2385
+ * Unknown model ids pass through untouched (same contract as
2386
+ * `normalizeModelInput`) — the route's provider enum is the gate for those.
2387
+ */
2388
+ declare function resolveNormalizedImageGen(opts: {
2389
+ provider: string | undefined;
2390
+ aspectRatio?: unknown;
2391
+ quality?: unknown;
2392
+ resolution?: unknown;
2393
+ renderingSpeed?: unknown;
2394
+ refCount: number;
2395
+ swapToI2i?: boolean;
2396
+ }): NormalizedImageGen;
1858
2397
  /**
1859
2398
  * Reference-aware image-generation credit identifier — the SINGLE source of
1860
2399
  * truth shared by the single-node routes (`/v1/generate-image`,
@@ -1883,6 +2422,69 @@ declare function resolveImageGenCreditIdentifier(opts: {
1883
2422
  swapToI2i?: boolean;
1884
2423
  }): string;
1885
2424
  declare function buildVideoCreditModelIdentifier(provider: string, duration?: number | string, sound?: boolean, nodeType?: "image-to-video" | "text-to-video", mode?: string, resolution?: string, hasVideoRef?: boolean): string;
2425
+ /** What the video credit identifier PRICES for a request, for the levers whose
2426
+ * priced value must also be the value we SEND. */
2427
+ interface PricedVideoSelection {
2428
+ /** The resolution band the reservation is priced at when the request omitted
2429
+ * one — and only where the platform DECLARES that band as the provider's own
2430
+ * default. `undefined` means "leave `resolution` exactly as the request had
2431
+ * it": either the caller supplied one, or the provider's real default is not
2432
+ * known to be the band the identifier assumes. */
2433
+ resolution?: string;
2434
+ /** The seeded duration tier the reservation is priced at (LTX only — the one
2435
+ * family whose duration ladder is per-band and case-sensitively seeded).
2436
+ * `undefined` for every other provider: their duration passes through. */
2437
+ duration?: number;
2438
+ /** Non-empty only for a lever the caller ASKED for and did not get (an LTX
2439
+ * 7s snapped to the 6s tier). Filling an omitted lever is a disclosure of
2440
+ * the price already being charged, not a correction, so it reports nothing. */
2441
+ adjustments: ModelInputAdjustment[];
2442
+ }
2443
+ /**
2444
+ * The other half of the video money path: `normalizeVideoRequestParams` snaps a
2445
+ * value the CATALOG governs; this returns the value the PRICE ladder governs.
2446
+ *
2447
+ * Two defects it closes, both of the same shape — the identifier prices one
2448
+ * thing and the wire carries another, and `commit_credits` (migration 176) only
2449
+ * ever refunds a surplus, so the reservation is the final charge:
2450
+ *
2451
+ * 1. **Absent resolution.** `buildVideoCreditModelIdentifier` prices an omitted
2452
+ * `resolution` as a concrete band (LTX → 1080p; a
2453
+ * {@link PRICING_DEFAULT_RESOLUTION} member → its declared default). Leaving
2454
+ * the key unset then lets the provider pick — documented for the KIE members
2455
+ * (their `extraParams` pin the same band) but UNDOCUMENTED for LTX on
2456
+ * Replicate. Sending the band we priced makes the two agree by construction.
2457
+ *
2458
+ * The fill is deliberately limited to providers with a DECLARED default.
2459
+ * `buildVideoCreditModelIdentifier` also has un-declared fallbacks — the
2460
+ * cheapest tier for a resolution-priced provider with no
2461
+ * `PRICING_DEFAULT_RESOLUTION` row — and those are a HEDGE, not a verified
2462
+ * provider default: seedance-2 / -fast / -mini pin `resolution: "720p"`
2463
+ * KIE-side while the identifier prices 480p, so filling 480p would downgrade
2464
+ * the render to match a price we already know is wrong. That mismatch is a
2465
+ * pre-existing identifier bug and is fixed by seeding the row, not here.
2466
+ *
2467
+ * 2. **LTX duration.** The LTX ladder is seeded per (band × seconds), so the
2468
+ * identifier snaps 7s onto the 6s tier. Sending 7s bills six and renders
2469
+ * seven. Most other providers' durations pass through untouched: their
2470
+ * legality is a flat catalog list the caller already sees, and their tiers
2471
+ * are ranges (`durationSec <= maxSeconds`), not seeded points. Gemini Omni
2472
+ * is the one other seeded ladder — `GEMINI_OMNI_DURATIONS` ([4, 6, 8, 10])
2473
+ * is nearest-snapped by `buildVideoCreditModelIdentifier`, the same shape
2474
+ * as LTX — but this function does not carry it yet: a 7s request prices
2475
+ * `:6` while 7s is still what gets sent. Pre-existing, out of scope here,
2476
+ * and ticketed as a follow-up (`geminiOmniPricedTier`, mirroring
2477
+ * `ltxPricedTier`).
2478
+ *
2479
+ * Pure, and IDEMPOTENT against the identifier: feeding its output back in
2480
+ * cannot move the reserved tier. `video-request-normalize.test.ts` proves that
2481
+ * over every provider × resolution × duration.
2482
+ */
2483
+ declare function pricedVideoSelection(opts: {
2484
+ provider: string;
2485
+ resolution?: string;
2486
+ duration?: number | string;
2487
+ }): PricedVideoSelection;
1886
2488
  /**
1887
2489
  * Compute composite model identifier for motion control with duration-tiered pricing.
1888
2490
  * Examples: "kling-3.0-motion:10s", "kling-3.0-motion:1080p:15s", "motion-transfer:5s"
@@ -1895,6 +2497,47 @@ declare function buildVideoCreditModelIdentifier(provider: string, duration?: nu
1895
2497
  * @param videoDuration - Reference video duration in seconds (defaults to 10s, unused for Wan Animate)
1896
2498
  */
1897
2499
  declare function buildMotionCreditModelIdentifier(provider: string, resolution: string, videoDuration?: number): string;
2500
+ /**
2501
+ * The Suno operations whose credit key depends on the model VERSION.
2502
+ *
2503
+ * `/v1/suno/generate`, `/cover` and `/extend` resolve their creditGuard
2504
+ * identifier through `sunoCreditType(model, <operation>)` (routes/suno.ts
2505
+ * :247-249, :335-337, :407-409). EVERY other Suno route charges a flat
2506
+ * per-operation key and ignores the version the node carries — mashup (:648),
2507
+ * add-instrumental (:852), add-vocals (:907), upload-extend (:1016),
2508
+ * replace-section (:710), style-boost (:771), convert-wav (:962),
2509
+ * lyrics (:482), music-video (:594), voice (:1218).
2510
+ *
2511
+ * Anything that QUOTES a Suno price — a dropdown row, a node badge, the
2512
+ * workflow-credit estimator — must follow the same split, or it displays a
2513
+ * credit key the route never charges.
2514
+ */
2515
+ declare const SUNO_VERSION_PRICED_OPERATIONS: readonly ["suno-generate", "suno-cover", "suno-extend"];
2516
+ /**
2517
+ * The seven Suno operations that appear behind a select/dropdown UI (model
2518
+ * pickers, node badges, the credit estimator) — the three version-priced
2519
+ * operations above, plus the four flat-key operations exercised by
2520
+ * `sunoCreditType`'s own test suite. A readonly tuple so later tasks (the
2521
+ * model dropdowns, node badges) can iterate or count it without redeclaring
2522
+ * the list and drifting from this one.
2523
+ */
2524
+ declare const SUNO_SELECT_OPERATIONS: readonly ["suno-generate", "suno-cover", "suno-extend", "suno-mashup", "suno-add-instrumental", "suno-add-vocals", "suno-upload-extend"];
2525
+ /**
2526
+ * OUR Nodaro credit key for a Suno operation, given the model version and the
2527
+ * operation (which is also the node type and the BullMQ job name).
2528
+ *
2529
+ * This is the single source of truth for the Suno pricing contract, shared by
2530
+ * the reservation path (routes/suno.ts creditGuard), the egress seam
2531
+ * (workers/handlers/suno.ts `modelKey`, which must match what was reserved),
2532
+ * both workflow-credit estimators (ee/billing/credits.ts and the frontend
2533
+ * config-panels/helpers.ts), the seven Suno model dropdowns and the three Suno
2534
+ * node badges. It is a billing key — NEVER a KIE provider id — which is what
2535
+ * satisfies the B3 egress invariant.
2536
+ *
2537
+ * V5_5 → "suno-v5_5", V5 → "suno-v5", any other version → the operation key.
2538
+ * A non-version-priced operation is returned unchanged.
2539
+ */
2540
+ declare function sunoCreditType(model: string | undefined, operation: string): string;
1898
2541
 
1899
2542
  /**
1900
2543
  * Pure credit estimators for video-utility nodes (loop-video, trim-video,
@@ -1970,6 +2613,79 @@ declare function assembleNarratedVideoCredits(blockCount: number): number;
1970
2613
  * (orchestrator input-resolver) can use one source of truth. */
1971
2614
  declare function extractVideoDurationFromNode(data: Record<string, unknown> | undefined): number | undefined;
1972
2615
 
2616
+ /**
2617
+ * Topaz image upscale — the single authority for "which lever did the user
2618
+ * pull, what do we send, and what do we charge".
2619
+ *
2620
+ * KIE's `topaz/image-upscale` takes exactly ONE quality lever:
2621
+ * upscale_factor: "1" | "2" | "4" (default "2")
2622
+ * There is no target-resolution parameter (docs.kie.ai/market/topaz/image-upscale,
2623
+ * verified 2026-09-02). The editor nevertheless shipped TWO controls — an
2624
+ * `upscaleFactor` select AND a `targetResolution` select (2K/4K/8K) — and billed
2625
+ * on the second one, which never reached the worker. Everyone who bought 4K or
2626
+ * 8K got a 2x render at 2x/4x the price (app-reports triage 2026-09-01 §4.3).
2627
+ *
2628
+ * So: the FACTOR is the lever. `targetResolution` survives only as a legacy
2629
+ * input (stored node data, old API/MCP callers) and is mapped forward here.
2630
+ * The credit tier is derived from the SAME resolution, which is why callers
2631
+ * must pass `creditTier` into `buildCreditModelIdentifier` rather than the raw
2632
+ * request value — that is what makes CHECK = DEBIT = SENT.
2633
+ *
2634
+ * The composite `topaz-image-upscale:4K` is retained as the id of the 4x tier
2635
+ * (migration 288 wrote that row; renaming it would need a pricing migration for
2636
+ * zero user-visible gain). Read it as "the top Topaz tier", not as a promise of
2637
+ * 4096 pixels. `topaz-image-upscale:8K` stays priced in STATIC_CREDIT_COSTS so
2638
+ * historical usage_logs still resolve, but nothing can reserve it any more.
2639
+ *
2640
+ * Resolution order (fix round 1, 2026-09-02 review):
2641
+ * 1. Resolve the WINNING factor first — a valid `upscaleFactor` always wins;
2642
+ * an invalid one falls through to `targetResolution` exactly as if it had
2643
+ * never been sent, rather than freezing the default before the legacy
2644
+ * tier gets a chance to raise it (an invalid factor + a stored 4K/8K tier
2645
+ * must still resolve — and bill — at the tier's factor, not the default).
2646
+ * 2. Only THEN build `adjustments`, so every `to` reflects the resolved
2647
+ * factor rather than an intermediate guess, and every `from` is the raw,
2648
+ * untransformed input string (never the trimmed/uppercased copy used
2649
+ * internally to match).
2650
+ * 3. A valid `upscaleFactor` alongside a `targetResolution` it disagrees
2651
+ * with emits an informational (not corrective) adjustment — the stored
2652
+ * legacy choice is being overridden, not silently dropped — with
2653
+ * `to: undefined` because nothing was actually sent for that field.
2654
+ * Agreement (they resolve to the same factor) is reported as nothing:
2655
+ * there is no override to disclose.
2656
+ */
2657
+ type TopazUpscaleFactor = "1" | "2" | "4";
2658
+ declare const TOPAZ_UPSCALE_FACTORS: readonly TopazUpscaleFactor[];
2659
+ /** KIE's own default when `upscale_factor` is omitted (providers/kie/models.ts). */
2660
+ declare const TOPAZ_DEFAULT_UPSCALE_FACTOR: TopazUpscaleFactor;
2661
+ interface TopazUpscaleAdjustment {
2662
+ field: "upscaleFactor" | "targetResolution";
2663
+ /** The raw, untransformed value as received — never trimmed or case-normalized. */
2664
+ from: string;
2665
+ /**
2666
+ * The resolved factor this adjustment corresponds to, or `undefined` for the
2667
+ * informational "your stored targetResolution was overridden" notice, which
2668
+ * names nothing to switch TO — `upscaleFactor` already won.
2669
+ */
2670
+ to: string | undefined;
2671
+ reason: string;
2672
+ }
2673
+ interface TopazUpscaleResolution {
2674
+ /** Sent to KIE as `upscale_factor`. Always set — never rely on the model default. */
2675
+ upscaleFactor: TopazUpscaleFactor;
2676
+ /**
2677
+ * Passed VERBATIM as `buildCreditModelIdentifier`'s `targetResolution` arg.
2678
+ * `undefined` = the bare id (1x / 2x); `"4K"` = the 4x tier.
2679
+ */
2680
+ creditTier: "4K" | undefined;
2681
+ /** Non-empty when a legacy or out-of-enum value was coerced or overridden. */
2682
+ adjustments: TopazUpscaleAdjustment[];
2683
+ }
2684
+ declare function resolveTopazUpscale(input: {
2685
+ upscaleFactor?: string | null;
2686
+ targetResolution?: string | null;
2687
+ }): TopazUpscaleResolution;
2688
+
1973
2689
  interface ExposableField {
1974
2690
  readonly key: string;
1975
2691
  readonly label: string;
@@ -4093,6 +4809,10 @@ declare function canonicalVarName(label: string): string;
4093
4809
  * SUPPRESS auto-injection of a connected node the author already placed
4094
4810
  * explicitly via `{label}` (so it isn't injected twice). `matchAll` over the
4095
4811
  * global pattern does not mutate its lastIndex, so sharing the constant is safe.
4812
+ *
4813
+ * Deliberately NOT `REF_TOKEN_NAMESPACE_PREFIXES`: widening this changes
4814
+ * run-time auto-injection on BOTH engines (follow-up ticket), not just the
4815
+ * editor.
4096
4816
  */
4097
4817
  declare function extractReferencedLabels(...texts: ReadonlyArray<string | undefined | null>): Set<string>;
4098
4818
  /** Handle → combine-order category for same-label `{label}` merging. Lower wins
@@ -4194,6 +4914,55 @@ declare function combineSameLabelRefs(candidates: ReadonlyArray<RefCandidate>):
4194
4914
  * Iterates until stable to handle nested refs (e.g. {List} → {Animal1} → "dog").
4195
4915
  */
4196
4916
  declare function resolveNodeRefs(text: string, labelToOutput: ReadonlyMap<string, string>): string;
4917
+ /**
4918
+ * Token namespaces that are NOT node-label references. `{image:1:face}` is the
4919
+ * unified-reference grammar, `{slot:x}` is recast's, `{video:N}`/`{audio:N}`
4920
+ * are reference handles, and `{ref:<id>}` is the id-addressed reference form —
4921
+ * all five are substituted by their own resolvers (`resolveReferenceTokens`,
4922
+ * `resolveRefIdTokens`, the recast slot pass), not by resolveNodeRefs. Before
4923
+ * this list existed, only `image:` was excluded, so `{video:1}` classified as a
4924
+ * MISSING node ref.
4925
+ *
4926
+ * Compared against the LOWERCASED token name: `REFERENCE_TOKEN_RE` is `/gi` and
4927
+ * `REF_ID_TOKEN_RE` spells `[rR][eE][fF]`, so `{Image:1}` / `{Ref:x}` really do
4928
+ * resolve downstream and must never read as a missing node ref.
4929
+ */
4930
+ declare const REF_TOKEN_NAMESPACE_PREFIXES: readonly string[];
4931
+ type RefTokenKind = "wired" | "reserved" | "missing" | "skip" | "unknown";
4932
+ /**
4933
+ * Classify a parsed `{...}` token name against the resolvable label set.
4934
+ * `resolvable === null` means the caller has no ref data at all — such tokens
4935
+ * classify `unknown` and must render like wired, so "no data" never
4936
+ * masquerades as "nothing wired".
4937
+ *
4938
+ * Single source of truth for the editor decoration, the missing-refs chip
4939
+ * (frontend/src/lib/prompt-ref-scan.ts delegates here) and the execution
4940
+ * engine's dispatch guard.
4941
+ */
4942
+ declare function classifyRefToken(name: string, resolvable: ReadonlySet<string> | null): RefTokenKind;
4943
+ /**
4944
+ * The `{Label}` tokens in `text` that `resolveNodeRefs` would leave LITERAL and
4945
+ * that no upstream node can explain — i.e. exactly what would reach a provider
4946
+ * as the characters `{Label}`. Evidence for why this matters: `{Describe Image}`
4947
+ * ×2 (gpt-image-2) and `{gravity flip}` / `{rewind}` (seedance-2-5) in the
4948
+ * 2026-09-01 app-reports export.
4949
+ *
4950
+ * `resolvable` — labels with a value in the ref map (canonical/lowercase).
4951
+ * `known` — canonical labels of the nodes the caller considers to EXIST
4952
+ * (no state requirement; the backend passes every node in the
4953
+ * run's graph).
4954
+ *
4955
+ * A token whose label is in `known` but not `resolvable` PASSES: the node
4956
+ * exists and simply produced nothing, which is the caller's to substitute (the
4957
+ * backend resolves it to empty text), not this function's to refuse. A token
4958
+ * with an explicit `|| fallback` passes too — the fallback is substituted.
4959
+ * Returns original-cased names, de-duplicated by canonical form, for the
4960
+ * user-facing message.
4961
+ */
4962
+ declare function unresolvedRefTokens(text: string, opts: {
4963
+ resolvable: ReadonlySet<string>;
4964
+ known: ReadonlySet<string>;
4965
+ }): string[];
4197
4966
 
4198
4967
  /**
4199
4968
  * Follow a list node's `in` edge chain to its effective upstream source.
@@ -4404,392 +5173,95 @@ interface Vehicle {
4404
5173
  * once ("Airship / Dirigible" -> "airship", "Plasma Sword / Lightsaber" ->
4405
5174
  * "plasma sword"). Everywhere else the lowercased label IS the term for a
4406
5175
  * concrete object ("golden retriever", "katana"), so nothing is authored.
4407
- */
4408
- readonly term?: string;
4409
- }
4410
- declare const VEHICLES: ReadonlyArray<Vehicle>;
4411
- declare function getVehicle(id: string | undefined | null): Vehicle | undefined;
4412
- declare function getVehicleLabel(id: string | undefined | null, fallback?: string): string;
4413
- declare const VEHICLE_SUBCATEGORY_LABELS: Readonly<Record<VehicleSubcategory, string>>;
4414
- declare const VEHICLE_SUBCATEGORY_ORDER: ReadonlyArray<VehicleSubcategory>;
4415
-
4416
- /**
4417
- * Canonical catalog of weapon presets for the Object entity node.
4418
- *
4419
- * When the Object category is "weapon", users pick a specific weapon from
4420
- * this catalog. The picker auto-fills the object's `objectName` and
4421
- * `description` so the existing `buildObjectPrompt` pipeline just works —
4422
- * no backend prompt changes needed.
4423
- *
4424
- * Organized by weapon family: swords, daggers, axes, polearms, bows,
4425
- * blunt/impact, throwing, modern firearms, historical firearms, explosives
4426
- * & siege, sci-fi, and fantasy.
4427
- */
4428
- type WeaponSubcategory = "swords" | "daggers" | "axes" | "polearms" | "bows" | "blunt" | "throwing" | "firearms-modern" | "firearms-historical" | "explosives-siege" | "sci-fi" | "fantasy";
4429
- interface Weapon {
4430
- readonly id: string;
4431
- readonly label: string;
4432
- readonly subcategory: WeaponSubcategory;
4433
- readonly description: string;
4434
- /**
4435
- * Optional authored compact term — the short phrase a professional would
4436
- * write in a prompt, as opposed to the user-facing `label` (see the `term`
4437
- * convention in `@nodaro/prompts`'s `term.ts`). Authored ONLY where the
4438
- * lowercased label is not that phrase — a UI compound naming two things at
4439
- * once ("Airship / Dirigible" -> "airship", "Plasma Sword / Lightsaber" ->
4440
- * "plasma sword"). Everywhere else the lowercased label IS the term for a
4441
- * concrete object ("golden retriever", "katana"), so nothing is authored.
4442
- */
4443
- readonly term?: string;
4444
- }
4445
- declare const WEAPONS: ReadonlyArray<Weapon>;
4446
- declare function getWeapon(id: string | undefined | null): Weapon | undefined;
4447
- declare function getWeaponLabel(id: string | undefined | null, fallback?: string): string;
4448
- declare const WEAPON_SUBCATEGORY_LABELS: Readonly<Record<WeaponSubcategory, string>>;
4449
- declare const WEAPON_SUBCATEGORY_ORDER: ReadonlyArray<WeaponSubcategory>;
4450
-
4451
- /**
4452
- * Multi-select helpers for parameter dimensions that allow up to N picks.
4453
- *
4454
- * A dimension's stored value can be:
4455
- * - undefined / "" / [] → no pick
4456
- * - string → single pick (back-compat with single-select fields)
4457
- * - string[] → multi pick (1..N entries)
4458
- *
4459
- * `pickIds` normalizes any of those into a clean string[] (deduped, falsy
4460
- * entries dropped). Pickers cap the array at `maxSelected` (FIFO replacement
4461
- * is the picker's responsibility, not this helper's).
4462
- *
4463
- * Multi-select dimensions today: Person.ethnicity, Mood.mood, Aesthetic.aesthetic.
4464
- */
4465
- declare function pickIds(value: unknown): string[];
4466
- /**
4467
- * Cap a multi-pick array at `maxSelected`, FIFO-replacing the oldest entry
4468
- * when the array is full and a new id is added. Returns a fresh array.
4469
- */
4470
- declare function togglePick(current: ReadonlyArray<string>, id: string, maxSelected: number): string[];
4471
-
4472
- /**
4473
- * Model catalog — single source of truth for what each Nodaro-exposed model
4474
- * is, who made it, what it's good for, and which knobs it accepts.
4475
- *
4476
- * Consumed by:
4477
- * - Backend MCP `list_models` tool (renders the nested per-kind / per-family
4478
- * response so Claude can pick the right model for a user's intent)
4479
- * - (future) Frontend config panels — today they read parallel registries
4480
- * in `frontend/src/components/editor/config-panels/model-options.ts`; a
4481
- * follow-up will migrate them to import from here.
4482
- *
4483
- * Authoring rules:
4484
- * - Keep `description` to one line (≤120 chars). It's what Claude reads to
4485
- * decide which model to use.
4486
- * - `useCases` is a small set of short tags (1-3 words) — verbs/nouns Claude
4487
- * can match against user intent ("typography", "character", "fast",
4488
- * "cinematic"). Stay consistent across entries: don't write "text" in one
4489
- * and "typography" in another.
4490
- * - `aspectRatios` / `resolutions` / `qualities` only appear when the model
4491
- * actually exposes that lever (e.g., Nano Banana base has no `resolution`).
4492
- * - `durations` is in seconds.
4493
- * - `pricing[0]` is ALWAYS the default variant (the bare id without a
4494
- * composite suffix like `:4K` or `:high`).
4495
- * - Costs are sourced from `STATIC_CREDIT_COSTS` (see backend
4496
- * `src/billing/credits.ts`). Keep them in sync if the table changes.
4497
- * - After editing `MODEL_CATALOG` or `MODEL_RECOMMENDATIONS`, run
4498
- * `npm run gen:skills` (from `backend/`) to refresh the public
4499
- * `docs/choosing-models.md` guide. CI (`gen:skills:check`) fails on drift.
4500
- */
4501
- type ModelKind = "image" | "video" | "audio";
4502
- type ModelMode = "t2i" | "i2i" | "edit" | "upscale" | "remove-bg" | "i2v" | "t2v" | "v2v" | "extend" | "motion-transfer" | "lip-sync" | "video-upscale" | "tts" | "music" | "sfx" | "stt" | "voice-clone" | "voice-design" | "voice-changer" | "isolation" | "dubbing" | "forced-alignment" | "dialogue" | "video-analysis" | "video-audit";
4503
- interface PriceVariant {
4504
- /** Composite identifier as it appears in `STATIC_CREDIT_COSTS`. */
4505
- identifier: string;
4506
- /** Credits charged at reservation. */
4507
- credits: number;
4508
- /** Short human-readable note describing this variant ("1K default", "4K", "with audio"). */
4509
- note?: string;
4510
- }
4511
- interface ModelCatalogEntry {
4512
- id: string;
4513
- kind: ModelKind;
4514
- /**
4515
- * Operations this model supports. Many video models (minimax, veo3,
4516
- * seedance) support BOTH i2v AND t2v under the same id — the route handler
4517
- * picks which KIE endpoint to hit based on whether an image was supplied.
4518
- * For those, list both modes here so MCP filters and frontend pickers see
4519
- * the model in either context.
4520
- */
4521
- modes: readonly ModelMode[];
4522
- /** Vendor / lab that produced the model. Used for UI grouping. */
4523
- family: string;
4524
- /** Display name (NOT the id — the id is the API enum value). */
4525
- label: string;
4526
- /**
4527
- * Model LINE for the add-node Models tab — the brand-agnostic product line a
4528
- * user thinks in ("Nano Banana", "Flux", "VEO", "Kling", "ElevenLabs").
4529
- * Distinct from `family` (the lab: Google covers Nano Banana + Imagen + VEO).
4530
- * REQUIRED for every node-creatable model; a completeness guard in
4531
- * `@nodaro/shared` (model-tree.test.ts) fails if one is missing.
4532
- */
4533
- series?: string;
4534
- /**
4535
- * The value written into the creating node's data field when this model is
4536
- * picked from the Models tab, for models whose catalog id differs from the
4537
- * stored value. Only `suno-generate` diverges today (id `suno-v5` → `data.model`
4538
- * "V5"). Omit when the id IS the stored value (the common case).
4539
- */
4540
- dataValue?: string;
4541
- /** One-liner. Visible to Claude in MCP `list_models` output. */
4542
- description: string;
4543
- /** Short tags Claude matches against user intent. */
4544
- useCases: readonly string[];
4545
- /**
4546
- * Capabilities flags: "reference-image", "end-frame", "audio", etc.
4547
- *
4548
- * `"video-reference"` (video models only) means the model accepts a
4549
- * reference VIDEO as a CONDITIONING clip — the r2v transport that
4550
- * `resolveSeedance2Inputs` builds and that KIE receives as
4551
- * `reference_video_urls`. It is what generate-video-pro's `extend` render
4552
- * method needs (a continuation tail off the previous segment), and
4553
- * `GVP_EXTEND_PROVIDERS` derives from it.
4554
- *
4555
- * It is deliberately NOT set on `gemini-omni-video`: that model's
4556
- * `video_list` input is a V2V SOURCE clip with a trim window, an
4557
- * auto-determined duration and flat per-generation pricing (see
4558
- * `runGeminiOmni` in `backend/src/providers/kie/video.ts`) — a different
4559
- * transport, not a continuation reference.
4560
- */
4561
- features?: readonly string[];
4562
- aspectRatios?: readonly string[];
4563
- resolutions?: readonly string[];
4564
- qualities?: readonly string[];
4565
- durations?: readonly number[];
4566
- pricing: readonly PriceVariant[];
4567
- /** Editorial highlight — "best in tier". Surfaces in MCP output as a ⭐. */
4568
- featured?: boolean;
4569
- /**
4570
- * Per-model overrides for the global value label decorations (e.g. Hailuo
4571
- * 2.3 Pro labels its 1080P resolution as "1080P (6s max)" because the
4572
- * model caps long durations at lower resolution). Falls back to
4573
- * `MODEL_VALUE_LABELS` for values not listed here.
4574
- */
4575
- valueLabels?: Record<string, string>;
4576
- /**
4577
- * Hide from MCP `list_models` output and tool model enums. Used for legacy
4578
- * model versions superseded by newer entries — they remain in the catalog
4579
- * (and accessible via direct API / frontend pickers for back-compat) but
4580
- * stop showing up in Claude.ai's model picker, which keeps the surface
4581
- * tight and steers the agent to the current generation.
4582
- *
4583
- * Frontend pickers ignore this flag.
4584
- */
4585
- mcpHidden?: boolean;
4586
- }
4587
- /**
4588
- * Editorial recommendations — short "best for X" picks Claude can echo back
4589
- * to the user when they don't know which model to use. Surfaces as a "Quick
4590
- * recommendations" footer in MCP `list_models` output.
4591
- */
4592
- interface ModelRecommendation {
4593
- intent: string;
4594
- modelIds: readonly string[];
4595
- note: string;
4596
- }
4597
- declare const MODEL_RECOMMENDATIONS: readonly ModelRecommendation[];
4598
- declare const MODEL_CATALOG: Record<string, ModelCatalogEntry>;
4599
- /**
4600
- * Lookup helpers for MCP and the future frontend migration.
4601
- */
4602
- declare function listModels(filter?: {
4603
- kind?: ModelKind;
4604
- mode?: ModelMode;
4605
- family?: string;
4606
- }): ModelCatalogEntry[];
4607
- /**
4608
- * Group entries by family, returning a stable order.
4609
- * Returns Array<{ family: string; models: ModelCatalogEntry[] }>.
4610
- */
4611
- declare function groupByFamily(entries: ModelCatalogEntry[]): Array<{
4612
- family: string;
4613
- models: ModelCatalogEntry[];
4614
- }>;
4615
- declare function getModel(id: string): ModelCatalogEntry | undefined;
4616
- type ValidationField = "aspectRatio" | "resolution" | "quality" | "duration";
4617
- interface ModelValidationIssue {
4618
- field: ValidationField;
4619
- message: string;
4620
- allowed: readonly (string | number)[] | null;
5176
+ */
5177
+ readonly term?: string;
4621
5178
  }
5179
+ declare const VEHICLES: ReadonlyArray<Vehicle>;
5180
+ declare function getVehicle(id: string | undefined | null): Vehicle | undefined;
5181
+ declare function getVehicleLabel(id: string | undefined | null, fallback?: string): string;
5182
+ declare const VEHICLE_SUBCATEGORY_LABELS: Readonly<Record<VehicleSubcategory, string>>;
5183
+ declare const VEHICLE_SUBCATEGORY_ORDER: ReadonlyArray<VehicleSubcategory>;
5184
+
4622
5185
  /**
4623
- * Validate that the user's lever values are supported by the chosen model.
4624
- *
4625
- * Returns null on success or the FIRST issue found. We surface a single issue
4626
- * rather than collecting all so the agent doesn't get a wall of complaints —
4627
- * fix one thing, retry. Order: aspectRatio → resolution → quality → duration.
5186
+ * Canonical catalog of weapon presets for the Object entity node.
4628
5187
  *
4629
- * Semantics:
4630
- * - If the field is undefined, it's never an issue.
4631
- * - If the catalog entry doesn't list a corresponding lever (e.g. base
4632
- * nano-banana has no `resolutions`), passing that field IS an issue —
4633
- * silently dropping it has caused two bugs already.
4634
- * - If the value is in the allow list, it's valid.
5188
+ * When the Object category is "weapon", users pick a specific weapon from
5189
+ * this catalog. The picker auto-fills the object's `objectName` and
5190
+ * `description` so the existing `buildObjectPrompt` pipeline just works —
5191
+ * no backend prompt changes needed.
4635
5192
  *
4636
- * Unknown model ids are NOT flagged here — the route handler / Zod model
4637
- * enum is the right gate for that. We just skip validation.
4638
- */
4639
- declare function validateModelInput(modelId: string, input: {
4640
- aspectRatio?: string;
4641
- resolution?: string;
4642
- quality?: string;
4643
- duration?: number;
4644
- }): ModelValidationIssue | null;
4645
- /**
4646
- * The resolution a Flux 2 model should land on when its stored value is absent
4647
- * or invalid. Flux 2 exposes ascending megapixel options ("0.5 MP"…"4 MP"), so
4648
- * snapping to `options[0]` would silently downgrade every node to the cheapest
4649
- * tier; each variant has a sensible mid default instead. Returns undefined for
4650
- * every non-Flux-2 model (they snap to `options[0]` normally).
5193
+ * Organized by weapon family: swords, daggers, axes, polearms, bows,
5194
+ * blunt/impact, throwing, modern firearms, historical firearms, explosives
5195
+ * & siege, sci-fi, and fantasy.
4651
5196
  */
4652
- declare function defaultResolutionFor(modelId: string): string | undefined;
4653
- /** One correction `normalizeModelInput` made, for disclosure to the user. */
4654
- interface ModelInputAdjustment {
4655
- field: "aspectRatio" | "resolution" | "quality" | "duration";
4656
- /** The value that was asked for. */
4657
- from: string | number;
4658
- /** What it became — `undefined` means the lever was dropped entirely. */
4659
- to: string | number | undefined;
4660
- reason: string;
4661
- }
4662
- interface NormalizedModelInput {
4663
- aspectRatio?: string;
4664
- resolution?: string;
4665
- quality?: string;
4666
- duration?: number;
4667
- /** Empty when the input was already valid. */
4668
- adjustments: ModelInputAdjustment[];
5197
+ type WeaponSubcategory = "swords" | "daggers" | "axes" | "polearms" | "bows" | "blunt" | "throwing" | "firearms-modern" | "firearms-historical" | "explosives-siege" | "sci-fi" | "fantasy";
5198
+ interface Weapon {
5199
+ readonly id: string;
5200
+ readonly label: string;
5201
+ readonly subcategory: WeaponSubcategory;
5202
+ readonly description: string;
5203
+ /**
5204
+ * Optional authored compact term — the short phrase a professional would
5205
+ * write in a prompt, as opposed to the user-facing `label` (see the `term`
5206
+ * convention in `@nodaro/prompts`'s `term.ts`). Authored ONLY where the
5207
+ * lowercased label is not that phrase — a UI compound naming two things at
5208
+ * once ("Airship / Dirigible" -> "airship", "Plasma Sword / Lightsaber" ->
5209
+ * "plasma sword"). Everywhere else the lowercased label IS the term for a
5210
+ * concrete object ("golden retriever", "katana"), so nothing is authored.
5211
+ */
5212
+ readonly term?: string;
4669
5213
  }
5214
+ declare const WEAPONS: ReadonlyArray<Weapon>;
5215
+ declare function getWeapon(id: string | undefined | null): Weapon | undefined;
5216
+ declare function getWeaponLabel(id: string | undefined | null, fallback?: string): string;
5217
+ declare const WEAPON_SUBCATEGORY_LABELS: Readonly<Record<WeaponSubcategory, string>>;
5218
+ declare const WEAPON_SUBCATEGORY_ORDER: ReadonlyArray<WeaponSubcategory>;
5219
+
4670
5220
  /**
4671
- * Coerce a model's parameters into a combination the model actually accepts.
4672
- *
4673
- * The correcting twin of `validateModelInput`. Validation is right when a
4674
- * human/agent is composing a single call and can retry (MCP verbs do this).
4675
- * It is the WRONG answer at a persistence or execution boundary: rejecting
4676
- * there turns a fixable typo into a failed run — and a failed run takes every
4677
- * already-generated, already-billed sibling node down with it. Incident
4678
- * 2026-08-09: one node carrying `gpt-image` + `16:9` (a pair the config panel
4679
- * cannot produce, written straight into workflow JSON by a non-UI author)
4680
- * aborted a run whose five other nodes had already produced images.
5221
+ * Multi-select helpers for parameter dimensions that allow up to N picks.
4681
5222
  *
4682
- * Rules, mirroring the config panels' provider-change snap:
4683
- * - Model has no such lever → drop the value (sending it 400s upstream).
4684
- * - Value outside the model's allow-list → snap to the model's default
4685
- * (`defaultResolutionFor`) or the first valid option.
4686
- * - Then apply cross-field constraints that only hold for certain models.
5223
+ * A dimension's stored value can be:
5224
+ * - undefined / "" / [] → no pick
5225
+ * - string → single pick (back-compat with single-select fields)
5226
+ * - string[] → multi pick (1..N entries)
4687
5227
  *
4688
- * Unknown model ids pass through untouched — the route's Zod model enum is the
4689
- * right gate for those, exactly as in `validateModelInput`.
5228
+ * `pickIds` normalizes any of those into a clean string[] (deduped, falsy
5229
+ * entries dropped). Pickers cap the array at `maxSelected` (FIFO replacement
5230
+ * is the picker's responsibility, not this helper's).
4690
5231
  *
4691
- * Every correction is reported in `adjustments` so callers can disclose what
4692
- * changed rather than silently handing back something else.
4693
- */
4694
- declare function normalizeModelInput(modelId: string, input: {
4695
- aspectRatio?: string;
4696
- resolution?: string;
4697
- quality?: string;
4698
- duration?: number;
4699
- }): NormalizedModelInput;
4700
- interface LabeledOption {
4701
- value: string;
4702
- label: string;
4703
- }
4704
- /** Return `{value, label}[]` for the model's aspect ratios, or `null` if none. */
4705
- declare function getAspectRatioOptions(modelId: string): LabeledOption[] | null;
4706
- /** Return `{value, label}[]` for the model's resolution lever, or `null` if none. */
4707
- declare function getResolutionOptions(modelId: string): LabeledOption[] | null;
4708
- /** Return `{value, label}[]` for the model's quality lever, or `null` if none. */
4709
- declare function getQualityOptions(modelId: string): LabeledOption[] | null;
4710
- /** Return the model's allowed durations (in seconds), or `null` if none. */
4711
- declare function getDurationsForModel(modelId: string): number[] | null;
4712
- /**
4713
- * Min/max credits across all pricing variants — used by the frontend's
4714
- * "5–8 cr" range badge in the model dropdown. `null` for models with a
4715
- * single price point.
4716
- */
4717
- declare function getCreditRange(modelId: string): {
4718
- min: number;
4719
- max: number;
4720
- } | null;
4721
- /** Whether the model declares a given capability flag in its `features` array. */
4722
- declare function hasFeature(modelId: string, feature: string): boolean;
4723
- /**
4724
- * All ids in the catalog whose `features` includes the given flag. Used by
4725
- * frontend to build PROVIDERS_WITH_END_FRAME / PROVIDERS_WITH_REFERENCES
4726
- * lists derived from the catalog.
4727
- */
4728
- declare function modelsWithFeature(feature: string): string[];
4729
- /**
4730
- * Map of `{modelId: durations[]}` for every catalog entry whose `modes`
4731
- * includes the given mode. Used to derive KIE_VIDEO_DURATIONS (mode i2v)
4732
- * and KIE_T2V_DURATIONS (mode t2v) on the frontend.
5232
+ * Multi-select dimensions today: Person.ethnicity, Mood.mood, Aesthetic.aesthetic.
4733
5233
  */
4734
- declare function durationsByMode(mode: ModelMode): Record<string, number[]>;
5234
+ declare function pickIds(value: unknown): string[];
4735
5235
  /**
4736
- * Map of `{modelId: LabeledOption[]}` for every catalog entry of the given
4737
- * kind that exposes a resolution lever. Used to derive
4738
- * IMAGE_RESOLUTION_OPTIONS / VIDEO_RESOLUTION_OPTIONS on the frontend.
5236
+ * Cap a multi-pick array at `maxSelected`, FIFO-replacing the oldest entry
5237
+ * when the array is full and a new id is added. Returns a fresh array.
4739
5238
  */
4740
- declare function resolutionOptionsByKind(kind: ModelKind): Record<string, LabeledOption[]>;
5239
+ declare function togglePick(current: ReadonlyArray<string>, id: string, maxSelected: number): string[];
5240
+
4741
5241
  /**
4742
- * Map of `{modelId: LabeledOption[]}` for every catalog entry of the given
4743
- * kind that exposes an aspect_ratio lever.
5242
+ * Retry/fallback behavior derived from a catalog entry's `safetyFilter`
5243
+ * flag (see `ModelCatalogEntry.safetyFilter` in `model-catalog.ts`).
4744
5244
  */
4745
- declare function aspectRatioOptionsByKind(kind: ModelKind): Record<string, LabeledOption[]>;
4746
- /** Same shape as `aspectRatioOptionsByKind` but for `qualities`. */
4747
- declare function qualityOptionsByKind(kind: ModelKind): Record<string, LabeledOption[]>;
4748
- /** One shaped model row for a picker — capabilities derived from the catalog. */
4749
- interface ModelMenuOption {
4750
- /** Catalog id (the API enum value). */
4751
- id: string;
4752
- /** Human-readable display name from the catalog. */
4753
- label: string;
4754
- /** Resolution levers, `[]` when the model exposes none. */
4755
- resolutions: LabeledOption[];
4756
- /** Aspect-ratio levers, `[]` when the model exposes none. */
4757
- aspectRatios: LabeledOption[];
4758
- /** Duration levers in seconds (union of i2v+t2v modes); `[]` for image / fixed-duration models. */
4759
- durations: {
4760
- value: number;
4761
- label: string;
4762
- }[];
5245
+ interface SafetyRetryPolicy {
5246
+ /** 2 when the model declares `safetyFilter.stochastic`, else 1. */
5247
+ maxAttempts: 1 | 2;
5248
+ /**
5249
+ * Catalog model id to offer when the retry also blocks. Only present
5250
+ * when the entry declares one AND it resolves to a real catalog entry.
5251
+ */
5252
+ fallback?: string;
4763
5253
  }
4764
5254
  /**
4765
- * Build shaped picker rows for one catalog `kind` from a caller-supplied id
4766
- * allowlist (the curation — which ids, in what order, stays the caller's). Every
4767
- * CAPABILITY is derived from the catalog accessors, never hardcoded, so the menu
4768
- * can't drift as the catalog evolves. Ids absent from the catalog or of the
4769
- * wrong kind are skipped (so a stale allowlist entry drops out cleanly). Pure;
4770
- * returns fresh arrays (never aliases the accessor maps).
4771
- */
4772
- declare function buildModelMenu(kind: ModelKind, allowlist: readonly string[]): ModelMenuOption[];
4773
- /** All `{modelId: {min, max}}` entries that have variable pricing (>1 variant). */
4774
- declare function creditRangesAll(): Record<string, {
4775
- min: number;
4776
- max: number;
4777
- }>;
4778
- /**
4779
- * Tuple of model ids for a given kind + one or more modes. Built for use as
4780
- * a Zod `z.enum()` argument so MCP tool input schemas stay in sync with the
4781
- * catalog without manual maintenance.
4782
- *
4783
- * Filters out `mcpHidden: true` entries by default — pass `includeHidden`
4784
- * to surface legacy versions (used internally by validators that still need
4785
- * to recognize older ids forwarded by direct API callers).
5255
+ * The provider's safety filter is known to be non-deterministic on some
5256
+ * catalog models — a benign prompt can trip it once and pass on an
5257
+ * identical retry. For those models the platform retries a blocked
5258
+ * request once (`maxAttempts: 2`) before giving up; `fallback` names the
5259
+ * catalog model to offer the user when the retry also blocks.
4786
5260
  *
4787
- * Pass `kind: null` to skip the kind filter — useful for cross-kind ids
4788
- * like "grok" (catalog kind=image, modes include both t2i and t2v).
5261
+ * Every model not flagged this way — including an unrecognized id —
5262
+ * gets a single attempt and no fallback.
4789
5263
  */
4790
- declare function modelIdsByKindMode(kind: ModelKind | null, modes: readonly ModelMode[], opts?: {
4791
- includeHidden?: boolean;
4792
- }): [string, ...string[]];
5264
+ declare function safetyRetryPolicy(modelId: string): SafetyRetryPolicy;
4793
5265
 
4794
5266
  /**
4795
5267
  * Caption styles for the add-captions node. Static path uses FFmpeg drawtext;
@@ -8974,6 +9446,12 @@ declare function stripTransientRuntimeData<T extends {
8974
9446
  * through mode-dependent defaults (`"adaptive"` for Seedance/Hailuo, duration
8975
9447
  * composites tied to pricing) that this flat normalizer would flatten wrongly;
8976
9448
  * they get their own pass once those defaults are catalog-derived too.
9449
+ *
9450
+ * `modify-image` carries the same provider/aspectRatio/resolution/quality trio
9451
+ * as `image-to-image` (it routes through the same worker), and `edit-image`
9452
+ * carries provider + aspectRatio. `edit-image`'s `targetResolution` is an
9453
+ * UPSCALE target, a different field this module never reads — so listing the
9454
+ * type here heals its ratio without touching what it is priced on.
8977
9455
  */
8978
9456
  declare const MODEL_PARAM_NODE_TYPES: ReadonlySet<string>;
8979
9457
  interface NodeParamAdjustment extends ModelInputAdjustment {
@@ -9808,6 +10286,7 @@ type VideoAnalysisSpeedEffect = (typeof VIDEO_ANALYSIS_SPEED_EFFECTS)[number];
9808
10286
  */
9809
10287
  declare const clipLookSchema: z.ZodObject<{
9810
10288
  style: z.ZodOptional<z.ZodString>;
10289
+ styleId: z.ZodOptional<z.ZodString>;
9811
10290
  grade: z.ZodOptional<z.ZodString>;
9812
10291
  format: z.ZodOptional<z.ZodString>;
9813
10292
  lens: z.ZodOptional<z.ZodString>;
@@ -9861,21 +10340,40 @@ declare const entitySlotSchema: z.ZodObject<{
9861
10340
  }, z.core.$strip>>>;
9862
10341
  }, z.core.$strip>;
9863
10342
  type EntitySlot = z.infer<typeof entitySlotSchema>;
10343
+ /**
10344
+ * The sound LAYER vocabulary — what kind of thing this layer is.
10345
+ *
10346
+ * `ambience` is deliberately its own member rather than a flavour of `sfx`:
10347
+ * they are different layers of a real mix and they are recreated by different
10348
+ * means — ambience is the continuous bed a scene sits in (room tone, distant
10349
+ * traffic, wind), an sfx is a discrete hit (a door slam, a gunshot). Folded
10350
+ * together, a scene's bed and its one-off noises arrive indistinguishable and
10351
+ * anything recreating the mix has to guess which it was told.
10352
+ *
10353
+ * Exported so a consumer keying its own document by these modes imports the
10354
+ * vocabulary instead of restating it — the same reason every other closed
10355
+ * vocabulary in this file is a const.
10356
+ */
10357
+ declare const VIDEO_ANALYSIS_AUDIO_MODES: readonly ["speech", "music", "sfx", "ambience"];
10358
+ type VideoAnalysisAudioMode = (typeof VIDEO_ANALYSIS_AUDIO_MODES)[number];
9864
10359
  /**
9865
10360
  * One concurrent sound layer in a scene. Real footage stacks sound (music bed
9866
- * under dialogue over ambient sfx), so a scene carries an ARRAY of these — an
9867
- * empty array means genuine silence. `content`: speech = verbatim words;
9868
- * music/sfx = gen-ready description. `voice` is speech-only voice-casting.
10361
+ * under dialogue over ambient room tone), so a scene carries an ARRAY of these
10362
+ * — an empty array means genuine silence. `content`: speech = verbatim words;
10363
+ * music/sfx/ambience = gen-ready description. `voice` is speech-only
10364
+ * voice-casting.
9869
10365
  */
9870
10366
  declare const audioLayerSchema: z.ZodObject<{
9871
10367
  mode: z.ZodEnum<{
9872
10368
  music: "music";
9873
10369
  sfx: "sfx";
9874
10370
  speech: "speech";
10371
+ ambience: "ambience";
9875
10372
  }>;
9876
10373
  content: z.ZodString;
9877
10374
  voice: z.ZodOptional<z.ZodString>;
9878
10375
  speakerSlot: z.ZodOptional<z.ZodString>;
10376
+ speaker: z.ZodOptional<z.ZodString>;
9879
10377
  }, z.core.$strip>;
9880
10378
  type AudioLayer = z.infer<typeof audioLayerSchema>;
9881
10379
  declare const windowSceneSchema: z.ZodObject<{
@@ -9958,10 +10456,12 @@ declare const windowSceneSchema: z.ZodObject<{
9958
10456
  music: "music";
9959
10457
  sfx: "sfx";
9960
10458
  speech: "speech";
10459
+ ambience: "ambience";
9961
10460
  }>;
9962
10461
  content: z.ZodString;
9963
10462
  voice: z.ZodOptional<z.ZodString>;
9964
10463
  speakerSlot: z.ZodOptional<z.ZodString>;
10464
+ speaker: z.ZodOptional<z.ZodString>;
9965
10465
  }, z.core.$strip>>;
9966
10466
  slotVariations: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
9967
10467
  }, z.core.$strip>;
@@ -9971,6 +10471,7 @@ declare const windowAnalysisSchema: z.ZodObject<{
9971
10471
  language: z.ZodOptional<z.ZodString>;
9972
10472
  look: z.ZodOptional<z.ZodObject<{
9973
10473
  style: z.ZodOptional<z.ZodString>;
10474
+ styleId: z.ZodOptional<z.ZodString>;
9974
10475
  grade: z.ZodOptional<z.ZodString>;
9975
10476
  format: z.ZodOptional<z.ZodString>;
9976
10477
  lens: z.ZodOptional<z.ZodString>;
@@ -10081,10 +10582,12 @@ declare const windowAnalysisSchema: z.ZodObject<{
10081
10582
  music: "music";
10082
10583
  sfx: "sfx";
10083
10584
  speech: "speech";
10585
+ ambience: "ambience";
10084
10586
  }>;
10085
10587
  content: z.ZodString;
10086
10588
  voice: z.ZodOptional<z.ZodString>;
10087
10589
  speakerSlot: z.ZodOptional<z.ZodString>;
10590
+ speaker: z.ZodOptional<z.ZodString>;
10088
10591
  }, z.core.$strip>>;
10089
10592
  slotVariations: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
10090
10593
  }, z.core.$strip>>;
@@ -10170,10 +10673,12 @@ declare const analyzedSceneSchema: z.ZodObject<{
10170
10673
  music: "music";
10171
10674
  sfx: "sfx";
10172
10675
  speech: "speech";
10676
+ ambience: "ambience";
10173
10677
  }>;
10174
10678
  content: z.ZodString;
10175
10679
  voice: z.ZodOptional<z.ZodString>;
10176
10680
  speakerSlot: z.ZodOptional<z.ZodString>;
10681
+ speaker: z.ZodOptional<z.ZodString>;
10177
10682
  }, z.core.$strip>>;
10178
10683
  slotVariations: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
10179
10684
  sceneNumber: z.ZodNumber;
@@ -10193,6 +10698,7 @@ declare const videoAnalysisResultSchema: z.ZodObject<{
10193
10698
  }, z.core.$strip>;
10194
10699
  look: z.ZodOptional<z.ZodObject<{
10195
10700
  style: z.ZodOptional<z.ZodString>;
10701
+ styleId: z.ZodOptional<z.ZodString>;
10196
10702
  grade: z.ZodOptional<z.ZodString>;
10197
10703
  format: z.ZodOptional<z.ZodString>;
10198
10704
  lens: z.ZodOptional<z.ZodString>;
@@ -10303,10 +10809,12 @@ declare const videoAnalysisResultSchema: z.ZodObject<{
10303
10809
  music: "music";
10304
10810
  sfx: "sfx";
10305
10811
  speech: "speech";
10812
+ ambience: "ambience";
10306
10813
  }>;
10307
10814
  content: z.ZodString;
10308
10815
  voice: z.ZodOptional<z.ZodString>;
10309
10816
  speakerSlot: z.ZodOptional<z.ZodString>;
10817
+ speaker: z.ZodOptional<z.ZodString>;
10310
10818
  }, z.core.$strip>>;
10311
10819
  slotVariations: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
10312
10820
  sceneNumber: z.ZodNumber;
@@ -10361,7 +10869,7 @@ declare function rewriteSpeakerSlots(audio: AudioLayer[], slotRenames: Record<st
10361
10869
  * Strip attribution that no scene can honour — the `dropUnknownBindings` mirror
10362
10870
  * for the `audio` channel. Two cases, both model sloppiness rather than errors
10363
10871
  * worth failing a roll over:
10364
- * - a `speakerSlot` on a `music`/`sfx` layer (nobody is speaking)
10872
+ * - a `speakerSlot` on any non-`speech` layer (nobody is speaking)
10365
10873
  * - a `speakerSlot` naming a slot that is not in the final list
10366
10874
  *
10367
10875
  * MUST run AFTER the orphan-slot sweep, and attribution must NEVER count as a
@@ -10423,6 +10931,19 @@ declare function inferMusicVideo(analysis: {
10423
10931
  }>;
10424
10932
  }>;
10425
10933
  } | undefined | null): boolean;
10934
+ /**
10935
+ * The analysis with its server-derived fields removed — the form an LLM is
10936
+ * handed when the analysis IS the brief (Nodaro Studio's Director and its
10937
+ * job-id loader). Drops `warnings` and `variationFolds` at the top and
10938
+ * `visualResolved`, `slotRefs`, `oversized` on every scene; keeps
10939
+ * `refImageUrl` (a downstream cast image) and everything else. Never mutates;
10940
+ * a non-object input comes back as-is.
10941
+ *
10942
+ * ONE strip list, shared by the worker that composes the brief server-side
10943
+ * (`llm-structured` jobs with a `videoUrl`) and the client that loads a
10944
+ * finished analysis into a textarea, so the two can never drift.
10945
+ */
10946
+ declare function stripDerivedAnalysisFields(json: unknown): unknown;
10426
10947
 
10427
10948
  /**
10428
10949
  * Video-analysis pricing — shared duration-bucket credit model.
@@ -10745,12 +11266,21 @@ declare const GRANTED_ACCESS: readonly ["view", "edit"];
10745
11266
  type GrantedAccess = (typeof GRANTED_ACCESS)[number];
10746
11267
  declare const SUBMISSION_STATUSES: readonly ["submitted", "in_review", "returned", "approved"];
10747
11268
  type SubmissionStatus = (typeof SUBMISSION_STATUSES)[number];
11269
+ /**
11270
+ * How a usage report is bucketed. `workspace` is org-scope only; `none`
11271
+ * = flat rows. A runtime list, like `ORG_ROLES`, so the plugin route's Zod is
11272
+ * `z.enum(USAGE_GROUP_BYS)` and the migration guard asserts the SQL
11273
+ * `NOT IN (...)` list equals this minus `none` — one vocabulary, never three
11274
+ * hand-copies that drift.
11275
+ */
11276
+ declare const USAGE_GROUP_BYS: readonly ["workspace", "member", "model", "day", "none"];
11277
+ type UsageGroupBy = (typeof USAGE_GROUP_BYS)[number];
10748
11278
  /**
10749
11279
  * Error codes the organization endpoints add to the standard envelope
10750
11280
  * (`{ error: { code, message } }`). Clients dispatch on the code, never on
10751
11281
  * the message text.
10752
11282
  */
10753
- declare const ORG_ERROR_CODES: readonly ["not_a_member", "insufficient_role", "org_not_active", "member_suspended", "workspace_archived", "personal_space_disabled", "token_workspace_mismatch", "run_requires_authenticated_member", "budget_exceeded", "member_cap_exceeded", "model_not_allowed", "invitation_expired", "invitation_revoked", "email_mismatch", "join_code_invalid", "domain_not_allowed", "already_started", "collab_unavailable", "terms_required", "not_org_member", "already_a_member", "owner_cannot_leave", "has_active_workspaces", "invitation_not_found", "invitation_accepted", "bulk_invite_cap_exceeded"];
11283
+ declare const ORG_ERROR_CODES: readonly ["not_a_member", "insufficient_role", "org_not_active", "member_suspended", "workspace_archived", "personal_space_disabled", "token_workspace_mismatch", "run_requires_authenticated_member", "budget_exceeded", "member_cap_exceeded", "model_not_allowed", "invitation_expired", "invitation_revoked", "email_mismatch", "join_code_invalid", "domain_not_allowed", "already_started", "collab_unavailable", "audit_unavailable", "terms_required", "not_org_member", "already_a_member", "owner_cannot_leave", "has_active_workspaces", "invitation_not_found", "invitation_accepted", "bulk_invite_cap_exceeded"];
10754
11284
  type OrgErrorCode = (typeof ORG_ERROR_CODES)[number];
10755
11285
  /**
10756
11286
  * The settings every organization kind has a default for. `organizations.
@@ -11027,6 +11557,133 @@ interface OrgPage<T> {
11027
11557
  data: T[];
11028
11558
  nextCursor: string | null;
11029
11559
  }
11560
+ /**
11561
+ * Usage reporting. What `GET /v1/orgs/:id/usage` and
11562
+ * `GET /v1/workspaces/:id/usage` return. No cost/USD field appears anywhere —
11563
+ * a report shows CREDITS a class or team spent, never the platform's own rates
11564
+ * (pricing-leak class, guarded by organizations-types.test.ts and the
11565
+ * migration guard).
11566
+ */
11567
+ /** One bucket of a usage report. Exactly one of workspace/member/model/day is set. */
11568
+ interface UsageReportRow {
11569
+ key: string;
11570
+ workspace: {
11571
+ id: string;
11572
+ name: string | null;
11573
+ slug: string | null;
11574
+ archived: boolean;
11575
+ } | null;
11576
+ member: {
11577
+ userId: string;
11578
+ displayName: string | null;
11579
+ email: string | null;
11580
+ } | null;
11581
+ model: string | null;
11582
+ /** `YYYY-MM-DD` in the report's `tz`. */
11583
+ day: string | null;
11584
+ runCount: number;
11585
+ appRunCount: number;
11586
+ /** Settled where known, the held reservation otherwise. = settledCredits + inFlightCredits. */
11587
+ credits: number;
11588
+ settledCredits: number;
11589
+ inFlightCredits: number;
11590
+ inFlightRuns: number;
11591
+ }
11592
+ /**
11593
+ * A platform-absorbed line for one workspace, split by ORIGIN (never attributed
11594
+ * to a member). Two ledgers share the `org_usage_variance` source: a
11595
+ * `metered_overrun` (a metered run's overrun beyond the budget — it HAS a
11596
+ * settled usage_logs counterpart) and an `app_markup` shortfall (an
11597
+ * approved-app markup the budget could not cover — it has NO usage_logs row).
11598
+ * `other` is a future/unrecognised origin.
11599
+ */
11600
+ interface UsageVarianceRow {
11601
+ workspace: {
11602
+ id: string;
11603
+ name: string | null;
11604
+ slug: string | null;
11605
+ } | null;
11606
+ kind: "metered_overrun" | "app_markup" | "other";
11607
+ credits: number;
11608
+ rowCount: number;
11609
+ }
11610
+ /**
11611
+ * Totals over the WHOLE window — every usage_logs row in [from, to] after the
11612
+ * scope / userId / workspaceId narrowing — never over the returned `rows`.
11613
+ * Unaffected by `truncated`; equals a `groupBy=day` report's column-wise sum.
11614
+ */
11615
+ interface UsageReportTotals {
11616
+ runCount: number;
11617
+ credits: number;
11618
+ settledCredits: number;
11619
+ inFlightCredits: number;
11620
+ /** Metered-overrun variance in the window — a run's overrun the platform absorbed. */
11621
+ platformAbsorbedCredits: number;
11622
+ /** Approved-app markup shortfall the platform absorbed. It has NO usage_logs run, so it is not in the figures above. */
11623
+ appMarkupAbsorbedCredits: number;
11624
+ /**
11625
+ * settledCredits − platformAbsorbedCredits: the METERED settlement that
11626
+ * reached the workspace budget(s). App markup charged to a budget (migration
11627
+ * 352) is not a usage_logs row and is not included here; when a markup
11628
+ * shortfall is absorbed this figure under-reports and may go negative — it is
11629
+ * NOT `workspace_budgets.spent_credits`.
11630
+ */
11631
+ chargedToBudget: number;
11632
+ }
11633
+ interface UsageReport {
11634
+ scope: "org" | "workspace";
11635
+ scopeId: string;
11636
+ from: string;
11637
+ to: string;
11638
+ tz: string;
11639
+ groupBy: Exclude<UsageGroupBy, "none">;
11640
+ /** Present when a member's self-view or an admin's `?userId=` narrowed the report. */
11641
+ userId: string | null;
11642
+ /** Present when an org report was narrowed to one workspace. */
11643
+ workspaceId: string | null;
11644
+ rows: UsageReportRow[];
11645
+ variance: UsageVarianceRow[];
11646
+ totals: UsageReportTotals;
11647
+ /**
11648
+ * True when more than 5000 buckets existed and the tail of `rows` was dropped
11649
+ * — narrow the window. Only `rows` is incomplete; `totals` and `variance`
11650
+ * cover the whole window regardless.
11651
+ */
11652
+ truncated: boolean;
11653
+ }
11654
+ /** One usage_logs row as an organization sees it. No cost fields, ever. */
11655
+ interface UsageLogEntry {
11656
+ id: string;
11657
+ createdAt: string;
11658
+ workspace: {
11659
+ id: string;
11660
+ name: string | null;
11661
+ slug: string | null;
11662
+ } | null;
11663
+ member: {
11664
+ userId: string;
11665
+ displayName: string | null;
11666
+ email: string | null;
11667
+ } | null;
11668
+ jobId: string | null;
11669
+ model: string;
11670
+ status: "reserved" | "committed";
11671
+ creditsReserved: number;
11672
+ creditsSettled: number | null;
11673
+ credits: number;
11674
+ isAppRun: boolean;
11675
+ }
11676
+ /** Query parameters shared by both usage routes (dates inclusive, IANA tz). */
11677
+ interface UsageQuery {
11678
+ from?: string;
11679
+ to?: string;
11680
+ tz?: string;
11681
+ groupBy?: UsageGroupBy;
11682
+ workspaceId?: string;
11683
+ userId?: string;
11684
+ cursor?: string;
11685
+ limit?: number;
11686
+ }
11030
11687
 
11031
11688
  /**
11032
11689
  * Which DB columns of a saved entity land on its canvas node, per kind.
@@ -11095,4 +11752,4 @@ declare function entityHydrationColumns(kind: EntityNodeKind): string[];
11095
11752
  /** Every scalar `kind` actually has, shared plus its own. */
11096
11753
  declare function entityScalarFields(kind: EntityNodeKind): ReadonlyArray<readonly [string, string]>;
11097
11754
 
11098
- export { ACCESS_LEVELS, ACTIVE_SCENE_HELPERS, ADVANCED_MODE_UNAVAILABLE_REASON, AGGREGATEABLE_TYPES, AGGREGATE_LANE_SOURCE_TYPES, AI_AVATAR_DURATION_BUCKETS, AI_AVATAR_MAX_AUDIO_SEC, AI_AVATAR_MAX_DURATION_SEC, AI_AVATAR_RESERVE_IDS, AI_WRITER_PROVIDERS, ALA_CARTE_BOARDS, ALL_CAPTION_STYLES, ANIMALS, ANIMAL_SUBCATEGORY_LABELS, ANIMAL_SUBCATEGORY_ORDER, ASPECT_RATIO_DIMENSIONS, AUDIO_ADDON_PROVIDERS, AUDIO_CROSSFADE_CURVES, AUDIO_CROSSFADE_CURVE_IDS, AUDIO_FX_PRESETS, AUDIO_FX_PRESET_LABELS, AUDIO_FX_PRESET_SET, AUDIO_FX_REVERB_PRESETS, AUDIO_PRODUCER_TYPES, type AccessLevel, type AddBRollResult, AddBRollResultSchema, type AggregateableType, type AggregationBuckets, type AiAvatarDurationBucket, type AiAvatarEngine, type AiAvatarResolution, type AiWriterProvider, type AlaCarteBoard, type AnalyzedScene, type AnchorSceneStyleResult, AnchorSceneStyleResultSchema, type Animal, type AnimalSubcategory, type AssetRef, AssetRefSchema, type AudioCrossfadeCurve, type AudioFxPreset, type AudioLayer, type AuditImagesResult, AuditImagesResultSchema, type AuditImagesShotEntry, AuditImagesShotEntrySchema, AuditPromptIssueSchema, type AuditPromptResult, AuditPromptResultSchema, AvatarPayloadError, BOARD_TO_ASSET_TYPE, BOARD_TO_COLUMN, BOARD_VARIANTS, type BoardEntityKind, type BoardPromptContext, type BoardTemplate, BridgeToNextSceneInputSchema, type BridgeToNextSceneResult, BridgeToNextSceneResultSchema, type BrowseCommunityParams, type BrowseCommunityResult, CATEGORY_DURATION_DEFAULTS, CHARACTER_ASPECT_DEFAULTS, CHARACTER_ASPECT_OPTIONS, CHARACTER_ASSET_TYPES, CHARACTER_ASSET_VARIANTS, CHARACTER_ATTACH_COLUMNS, CHARACTER_FACETS, CHARACTER_FACET_IDS, CHARACTER_LORA_TRAINING_JOB_TYPE, CHARACTER_MOTION_PROVIDERS, CHARACTER_PICKER_DISPLAY_ORDER, CHARACTER_REFERENCE_PHOTO_KINDS, CHARACTER_STYLES, CHARACTER_VARIANT_ASSET_BUCKETS, CHAT_ENABLED_STAGES, CHAT_STAGES, CHAT_TURN_CAPS, CHAT_WIRED_STAGES, CINEMATIC_DEFAULT_DURATION_SEC, CINEMATIC_DEFAULT_RESOLUTION, CINEMATIC_MAX_DURATION_SEC, CINEMATIC_MAX_LOOKS, CINEMATIC_MAX_REFERENCE_IMAGES, CINEMATIC_MAX_REFERENCE_VIDEOS, CINEMATIC_MIN_DURATION_SEC, CINEMATIC_MIN_LOOKS, CINEMATIC_PROMPT_MAX, CINEMATIC_RESERVE_IDS, COLLABORATOR_ROLES, COLLECT_IN_HANDLE, COMBINE_TRANSITIONS, COMBINE_TRANSITION_GROUP_LABELS, COMBINE_TRANSITION_GROUP_ORDER, COMBINE_TRANSITION_IDS, COMPOSER_PLAN_FIELDS, COMPOSER_PLAN_MAP, CONTENT_TYPES_BY_PLATFORM, CREATURE_ATTACH_COLUMNS, CREDIT_BASE_USD, CREDIT_ROUNDING_RESOLUTION, type CaptionStyle, type CastCoverageCriticVerdict, CastCoverageCriticVerdictSchema, type CharacterAspectRatio, type CharacterAssetType, type CharacterAssetTypeForAspect, type CharacterAttachColumn, type CharacterDef, type CharacterFacet, type CharacterImageCriticVerdict, CharacterImageCriticVerdictSchema, type CharacterLoraFields, type CharacterMentionTokenInfo, CharacterMetadataSchema, type CharacterMotionProvider, type CharacterReferencePhoto, type CharacterReferencePhotoKind, type CharacterVariantAssetBucket, type CharacterVariantAssetItem, type CharacterVoiceSpec, type ChatEnabledStage, type ChatTurnResponse, ChatTurnResponseSchema, type CinematicResolution, type ClipLook, type CloneListingResult, type CollaboratorRole, type CombineTransition, type CombineTransitionGroup, type CombineVideosEstimatorInput, type CommunityCard, type CommunityEntityType, type CommunityFullDetail, type CommunityReportReason, type CommunitySort, type ComponentHandle, type ComponentMetadata, type ConnectedReference, type CreatureAttachColumn, CriticIssueSchema, type CustomEntry, DEFAULT_AUDIO_CROSSFADE_CURVE_ID, DEFAULT_CARRIED_FRACTION, DEFAULT_CHARACTER_ANGLE_COUNT, DEFAULT_CHARACTER_EXPRESSION_COUNT, DEFAULT_CHARACTER_FACET, DEFAULT_LABEL_BY_SOURCE, DEFAULT_LOCATION_USAGE_MODE, DEFAULT_PANEL_COUNT, DEFAULT_REF_IMAGE_MAX, DEFAULT_SECTIONS, DEFAULT_USAGE_MODE, DEFAULT_VIDEO_ANALYSIS_MODEL, DEFAULT_VIDEO_ANALYSIS_TIER, DEFAULT_VIDEO_CLIP_COST, DEFAULT_VIDEO_DURATION_SEC, DEFAULT_VIDEO_PROVIDER, DEFAULT_VOICE_CHANGER_MODEL, DEFAULT_VOICE_DESIGN_MODEL, DETAIL_VARIANTS, DURATION_PRICED_PROVIDERS, DYNAMIC_PRODUCER_TYPES, type DetectionResult, DetectionResultSchema, type DialogueLine, EFFORT_TIER_BUMP, EMOTIONAL_BEAT, ENTITY_ASPECT_DEFAULTS, ENTITY_BUCKET_FIELDS, ENTITY_DB_ID_FIELD, ENTITY_IMAGE_HANDLE_TYPES, ENTITY_KIND_SCALAR_FIELDS, ENTITY_NAME_FIELD, ENTITY_NODE_KINDS, ENTITY_SCALAR_FIELDS, ENTITY_SECTIONS, ENTITY_STATUSES, ENTITY_TABLE, ENTITY_TOOL_RETRY_CAP, ENTITY_TYPES, EXECUTION_DATA_KEYS, EXTEND_VIDEO_PROVIDERS, type EntityKind, type EntityMentionTokenInfo, type EntityMetadata, EntityMetadataSchema, type EntityNodeKind, type EntityReferenceInput, type EntityRejectInput, EntityRejectInputSchema, type EntitySlot, type EntityStaleEvent, EntityStaleEventSchema, type EntityStateChangeEvent, EntityStateChangeEventSchema, type EntityStatus, type EntityStudioKind, type EntityStyle, type EntityType, type EvaluateConditionOptions, type ExportedPreset, type ExposableField, type ExposableOutput, type ExposedSetting, type ExtendVideoProvider, type ExtraRefCharacterContext, type ExtraRefInput, FACE_SWAP_PROVIDERS, FAL_LIP_SYNC_PROVIDERS, FAN_OUT_EACH_TYPES, FEATURED_ENTITIES, FILM_BASE_CREDITS, FLEXIBLE_INPUT_LIP_SYNC_PROVIDERS, FLUX2_RES_MP, FLUX_LORA_CHARACTER_MODEL_ID, FRAME_MODE_ADAPTIVE_ONLY_ASPECT, FRAME_TARGET_HANDLES, FREECUT_EXPORT_COMPLETE, FREECUT_EXPORT_PROGRESS, FREECUT_READY, FREECUT_REQUEST_IMPORT, FURNITURE, FURNITURE_SUBCATEGORY_LABELS, FURNITURE_SUBCATEGORY_ORDER, type FaceSwapProvider, type FavoriteListingResult, type FeaturedEntity, type FilmCreditEstimate, type FilterListCondition, type FilterListOperator, type FilterOperator, type FixContinuityInput, FixContinuityInputSchema, type FixContinuityResult, FixContinuityResultSchema, type Flux2Model, type FreecutExportCompletePayload, type FreecutExportProgressPayload, type FreecutImportFile, type FreecutRequestImportPayload, type FullSelectorMode, type Furniture, type FurnitureSubcategory, GEMINI_OMNI_PROVIDERS, GENERATE_TEXT_DELIMITER, GLOBAL_MAX_DURATION_SECONDS, GRANTED_ACCESS, GROUP_HANDLE_PREFIX, GUIDANCE_SCALE_SUPPORT, GVP_ANCHOR_CHOICES, GVP_DEFAULT_PROVIDER, GVP_END_FRAME_PROVIDERS, GVP_EXTEND_PROVIDERS, GVP_SUPPORTED_PROVIDERS, GenerateMotionInputSchema, type GenerateMotionResult, GenerateMotionResultSchema, type GenericEdge, type GenericNode, type GrantedAccess, type GvpAnchorChoice, type GvpAnchorWireMode, HANDLE_PORT_SEPARATOR, HELPERS_SHIPPED_IN_1B3, HIGH_QUALITY_PROVIDERS, HINT_EXEMPT_PARAMETER_TYPES, type HintEdgeLike, type HintGraphContext, type HintNodeLike, type I18nCatalogId, I2I_MASK_SUPPORT, I2I_STRENGTH_SUPPORT, IDEOGRAM_PROVIDERS, IMAGE_CRITIC_LEAF_MODES, IMAGE_CRITIC_MAX_RETRIES, IMAGE_CRITIC_METADATA_KEYS, IMAGE_CRITIC_MIN_ADHERENCE_SCORE, IMAGE_CRITIC_MODES, IMAGE_CRITIC_UNRESOLVABLE, IMAGE_EDIT_PROVIDERS, IMAGE_GEN_PROVIDERS, IMAGE_I2I_PROVIDERS, IMAGE_MASK_MODE, IMAGE_PROMPT_MAX, IMAGE_REF_TYPES, IMAGE_TO_VIDEO_PROVIDERS, INPUT_FIELD_MAP, INPUT_NODE_TYPES, INSTAGRAM_CAROUSEL_MAX_ITEMS, INSTAGRAM_CAROUSEL_MIN_ITEMS, ITER_CLONE_PATTERN, type IdentityFidelity, type IdentityMeta, type ImageCriticIssue, ImageCriticIssueSchema, type ImageCriticLeafMode, type ImageCriticMetadataKey, type ImageCriticMode, type ImageCriticNodeIssue, type ImageCriticResult, ImageCriticResultSchema, type ImageCriticVerdict, ImageCriticVerdictSchema, type ImageEditProvider, type ImageGenProvider, type ImageI2IProvider, type ImageMaskMode, type ImageMentionTokenInfo, type ImageToVideoProvider, type ImprovePromptInput, ImprovePromptInputSchema, type ImprovePromptResult, ImprovePromptResultSchema, type InputFieldSchema, type InvitationDelivery, type InvitationPreview, type InvitationState, type InvitationView, type JoinCodeView, type JsonEvalResult, type JsonFilter, type JsonPatch, KEYFRAME_CREDITS_PER_SHOT, KINETIC_CAPTION_STYLES, type KieApiFormat, type KineticCaptionStyle, LANGUAGES, LEGACY_LOTTIE_HOST_REMAP, LIP_SYNC_DURATION_BUCKETS, LIP_SYNC_MAX_AUDIO_SECONDS, LIP_SYNC_PROVIDERS, LLM_FEATURE_DEFAULTS, LLM_MODALITY_CAPS, LLM_MODELS, LLM_MODEL_IDS, LLM_REASONING_EFFORTS, LLM_ROUTE_DEFAULTS, LLM_TEXT_INPUT_MAX, LLM_VENDOR_LABELS, LLM_VENDOR_ORDER, LOCATION_ASSET_TYPES, LOCATION_ASSET_VARIANTS, LOCATION_ATMOSPHERE_PROVIDERS, LOCATION_ATTACH_COLUMNS, LOCATION_BUCKET_TO_CATALOG_ID, LOCATION_PRESET_TO_CATALOG, LOCATION_REFERENCE_PHOTO_KINDS, LOCATION_REFERENCE_PHOTO_KIND_LABELS, LOCATION_USAGE_MODES, LOTTIE_OVERLAY_CATALOG, LOTTIE_SLOT_FIELD_PREFIX, type LabeledOption, type LipSyncDurationBucket, type LipSyncProvider, type LlmFeature, type LlmModelDef, type LlmModelGroup, type LlmReasoningEffort, type LlmRouteDefaults, type LlmTier, type LlmVendor, type LocaleCatalogMap, type LocaleDirection, type LocaleId, type LocationAssetType, type LocationAtmosphereProvider, type LocationAttachColumn, type LocationCatalogRef, type LocationImageCriticVerdict, LocationImageCriticVerdictSchema, type LocationMentionTokenInfo, LocationMetadataSchema, type LocationReferencePhotoKind, type LocationUsageMode, LocationsCoverageCriticIssueSchema, type LocationsCoverageCriticVerdict, LocationsCoverageCriticVerdictSchema, type LoopTrimEstimatorInput, type LoopVideoEstimatorInput, type LoraEligibleRef, type LoraRouting, type LottieOverlayCatalogEntry, type LottieSlotField, MAX_CUSTOM_ENTRIES_PER_BOARD, MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER, MAX_LOCATION_VARIANTS, MAX_NEGATIVE_PROMPT_CHARS_BY_PROVIDER, MAX_PANELS_PER_SHEET, MAX_TTS_CHARS_BY_PROVIDER, MAX_VIDEO_PROMPT_CHARS_BY_PROVIDER, MEMBER_STATUSES, MINIMAX_H3_DEFAULT_RESOLUTION, MINIMAX_H3_PROVIDERS, MODELS_WITH_REFERENCE_IMAGE_SUPPORT, MODEL_CATALOG, MODEL_PARAM_NODE_TYPES, MODEL_RECOMMENDATIONS, MODIFY_IMAGE_PROVIDERS, MOTION_COLUMN, MOTION_TRANSFER_PROVIDERS, MUSIC_PROVIDERS, type MaskRegionDescriptor, type MatchCutVerdict, MatchCutVerdictSchema, type MeOrganizations, type Member, type MemberStatus, type MinimalEdge, type MinimalNode, type ModelCatalogEntry, type ModelInputAdjustment, type ModelKind, type ModelMenuOption, type ModelMode, type ModelNodeTarget, type ModelPromptingStyle, type ModelRecommendation, type ModelTreeLine, type ModelTreeVariant, type ModelValidationIssue, type ModifyImageProvider, type MotionTransferProviderType, type MusicProvider, NATIVE_ADAPTIVE_ASPECT, NATIVE_NEGATIVE_PROMPT_MODELS, NATIVE_NEGATIVE_VIDEO_PROVIDERS, NEGATIVE_PROMPT_MAX, NODARO_IMPORT_FILES, NODARO_LOAD_TIMELINE, NODARO_LOAD_VIDEO, NODARO_RESET_PROJECT, NODE_DEFAULT_TYPES, NODE_MAPPABLE_FIELDS, NODE_PRESET_EXPORT_KIND, NODE_REF_PATTERN, NON_EN_LOCALE_IDS, NO_SPLIT_DELIMITER, type NodaroLoadTimelinePayload, type NodaroLoadVideoPayload, type NodeDefaultType, type NodeParamAdjustment, type NodePresetExport, type NormalizedModelInput, type NormalizedNodes, OBJECT_ASPECT_DEFAULTS, OBJECT_ASPECT_OPTIONS, OBJECT_ASSET_TYPES, OBJECT_ASSET_VARIANTS, OBJECT_ATTACH_COLUMNS, OBJECT_MOTION_PROVIDERS, OBJECT_PICKER_NODE_TYPES, ORG_ERROR_CODES, ORG_KINDS, ORG_ROLES, ORG_STATUSES, OUTPUT_FIELD_MAP, OUTPUT_FORMATS, type ObjectAspectRatio, type ObjectAssetType, type ObjectAssetTypeForAspect, type ObjectAttachColumn, ObjectMetadataSchema, type ObjectMotionProvider, type ObjectsValidationIssue, type ObjectsValidationResult, OptimizeForModelInputSchema, type OptimizeForModelResult, OptimizeForModelResultSchema, type OrgAuditEntry, type OrgErrorCode, type OrgKind, type OrgMemberView, type OrgPage, type OrgRole, type OrgSettings, OrgSettingsSchema, type OrgStatus, type OrganizationSummary, type OrganizationView, type OutputFormat, type OutputMode, type OutputType, PARAMETER_NODE_TYPES, PASSTHROUGH_TYPES, PAYG_RETENTION_DAYS, PER_FORMAT_DURATION_BOUNDS, PICKER_TO_COMBINE_TRANSITION, PIPELINE_ACTIVATION_MODES, PIPELINE_FORMATS, PIPELINE_HARD_TIMEOUT_MS, PIPELINE_MODEL_STAGES, PIPELINE_MODES, PIPELINE_OUTPUT_RESOLUTIONS, PIPELINE_PINNABLE_IMAGE_MODELS, PIPELINE_PINNABLE_SCRIPT_LLMS, PIPELINE_PINNABLE_VIDEO_MODELS, PIPELINE_STAGE_NAMES, PIPELINE_STAGE_TIMEOUT_MS, PIPELINE_TYPES, PLACEHOLDER_CHARACTER_NAME, PLATFORM_LABELS, PLATFORM_SPECS, PRESET_APPLY_CLEAR_KEYS, PRESET_EXCLUDED_KEYS, PRESET_LABELS, PRESET_SETTING_KEYS, PRICING_DEFAULT_DURATION_SEC, PRICING_DEFAULT_RESOLUTION, PROMPT_HARD_CEILING, PROMPT_PREFIX_KEY, PROMPT_SUFFIX_KEY, PROVIDER_DIRECTIVE_DEFAULTS, PROVIDER_PLACEHOLDER_PREFIX, type PanelGenRequest, type PanelRequest, type PanelSource, type PipelineActivationMode, type PipelineCompletedEvent, PipelineCompletedEventSchema, type PipelineConfig, PipelineConfigSchema, type PipelineDriftSummary, PipelineDriftSummarySchema, type PipelineEditorDecisionsReadyEvent, PipelineEditorDecisionsReadyEventSchema, type PipelineEvent, type PipelineForkedEvent, PipelineForkedEventSchema, type PipelineFormat, type PipelineInput, PipelineInputSchema, type PipelineLifecycleEvent, type PipelineMode, type PipelineModelStage, type PipelineMusicReadyEvent, PipelineMusicReadyEventSchema, type PipelineOutputResolution, type PipelinePinnableImageModel, type PipelinePinnableScriptLlm, type PipelinePinnableVideoModel, type PipelineStageName, PipelineStageNameSchema, type PipelineStageStatus, PipelineStageStatusSchema, type PipelineState, PipelineStateSchema, type PipelineStatus, PipelineStatusSchema, type PipelineType, type PixelBox, type PresentationItem, type PresetEntry, type PresetSettingKey, type PresetSettings, PresetSettingsSchema, type PriceVariant, type ProgressSegment, type ProjectedCatalog, type ProjectedCatalogDimension, type ProjectedCatalogOption, type PromptAffixFields, type PromptAffixes, type ProposedChange, type PublishListingParams, type PublishListingResult, QA_CHECK_PROVIDERS, type QaCheckProvider, type QualityLevel, REDUCE_STRATEGIES, REDUCE_STRATEGY_IDS, REFERENCE_BOARD_PROVIDERS, REFERENCE_BOARD_TEMPLATES, REFERENCE_HANDLE_MAP, REFERENCE_ROLE_PRESETS, REF_HANDLE_CATEGORY, REF_IMAGE_MAX_LIMITS, RENDERING_SPEED_SUPPORT, REPEATABLE_NODE_TYPES, REPEAT_PLACEHOLDER, REPLICATE_LIP_SYNC_PROVIDERS, RESERVED_TEMPLATE_VARS, type ReduceMeta, type ReduceStrategy, type ReduceStrategyId, type RefCandidate, type RefModalityEdge, type ReferenceBoardProvider, type ReferenceModality, type ReferenceSheet, type ReferenceSource, type ReportListingResult, type ResolveCharacterAspectOptions, type ResolveObjectAspectOptions, type ResolveSeparatorOptions, type ResolvedDialogueVoiceLine, type RouterConditionGroup, SCENE_HELPER_NAMES, SCRAPER_ACTOR_LABELS, SCRAPER_CREDIT_COSTS, SCRAPER_OUTPUT_FIELDS, SCRIPT_PROVIDERS, SEASONS, SECTION_BOARD, SECTION_KINDS, SEEDANCE_2_5_REF_LIMITS, SEEDANCE_2_CONTINUATION_REF_SEC, SEEDANCE_2_EXTEND_STITCH, SEEDANCE_2_PROVIDERS, SEEDANCE_2_R2V_MAX_AUDIO_SEC_BY_PROVIDER, SEEDANCE_2_R2V_MIN_REF_VIDEO_SEC, SEEDANCE_2_REF_LIMITS, SEEDANCE_LIP_SYNC_PROVIDERS, SEED_SUPPORT, SEPARATOR_DISPLAY, SEPARATOR_PRESETS, SHEET_ASPECTS, SHEET_BACKGROUNDS, SHEET_PRESETS, SHEET_SKINS, SHEET_TYPES, SHORT_FILM_ANGLE_COUNT, SHORT_FILM_EXPRESSION_COUNT, SHORT_FILM_VARIANT_THRESHOLD_SEC, SLOT_TOKEN_RE, SMART_CUT_WINDOW_DEFAULT, SMART_CUT_WINDOW_MAX, SMART_CUT_WINDOW_MIN, SOCIAL_POST_NODE_TYPES, STAGE_PATCH_SCHEMA, STATIC_CAPTION_STYLES, STRUCTURAL_SECTIONS, STRUCTURED_VISION_MODELS, SUBMISSION_STATUSES, SUNO_ADD_TRACK_MODELS, SUNO_FIELD_HANDLE_FIELDS, SUNO_MODELS, SUNO_TEXT_MAX, SUNO_TITLE_MAX, SUNO_TRACK_SOURCE_TYPES, SUPPORTED_FONT_NAMES, SURROUND_DIRECTIONS, SWITCHX_BLOCK_FRAMES, SWITCHX_FRAME_TIERS, type SceneData, type SceneHelperName, SceneHelperNameSchema, type SceneInputMode, SceneInputModeSchema, type SceneMetadata, SceneMetadataSchema, type SceneNodeData, SceneNodeDataSchema, SceneSpecSchema, type ScraperActorId, type ScriptCriticVerdict, ScriptCriticVerdictSchema, type ScriptProvider, type Season, type SectionKind, type SelectorConfig, type SelectorFields, type SelectorMode, type SelectorPredicateOp, type SelectorResult, type SemanticAspectRatio, type SeparatorPreset, type SharedListing, type SharedVoice, type SheetAspect, type SheetBackground, type SheetCostEstimate, type SheetEntry, type SheetFlavour, type SheetGenerationPlan, type SheetPreset, type SheetPresetId, type SheetSection, type SheetSkin, type SheetTextData, type SheetType, type ShotElement, type ShotImageElement, type ShotShapeElement, type ShotSpec, ShotSpecSchema, type ShotTextElement, type ShowrunnerPlan, ShowrunnerPlanSchema, type SidecarLoader, type SlotControlDescriptor, type SlotControlKind, type SlotVariation, type SocialMediaContentType, type SocialMediaPlatform, type SocialMediaSpec, type SortDirection, type SortListOptions, type SortType, type StageAwaitingSubGateEvent, StageAwaitingSubGateEventSchema, type StaticCaptionStyle, type StoryboardCohesionCriticVerdict, StoryboardCohesionCriticVerdictSchema, type StyleDirectives, StyleDirectivesSchema, type SubGateName, SubGateNameSchema, type SubmissionStatus, type SunoAddTrackModel, type SunoModel, type SupportedFontName, type SurroundDirection, type Swatch, T2I_TO_I2I_VARIANT, TASK_CHAINED_EDIT_PROVIDERS, TEXT_TO_AUDIO_PROVIDERS, TEXT_TO_VIDEO_PROVIDERS, TIER_MAX_PIPELINE_COST_CREDITS, TIER_PIPELINE_PARALLELISM, TILT_CARRIED_FRACTION, TRANSCRIBE_PROVIDERS, TRANSIENT_RUNTIME_KEYS, TTS_PROVIDERS, TTS_TEXT_MAX, TWO_K_RESOLUTION_PROVIDERS, type TextToAudioProvider, type TextToVideoProvider, type TranscribeProvider, type TransitionType, TransitionTypeSchema, type TrimVideoEstimatorInput, type TtsProvider, UPSCALE_IMAGE_PROVIDERS, USAGE_MODES, type UpscaleImageProvider, type UsageMode, VARIABLES_HANDLE_ID, VARIABLE_PRICING_MODELS, VEHICLES, VEHICLE_SUBCATEGORY_LABELS, VEHICLE_SUBCATEGORY_ORDER, VEO_PROVIDERS, VIDEO_ANALYSIS_BUCKET_CREDITS, VIDEO_ANALYSIS_CLIP_TRANSITIONS_IN, VIDEO_ANALYSIS_DEFAULT_VARIATION, VIDEO_ANALYSIS_DURATION_BUCKETS, VIDEO_ANALYSIS_DURATION_TOLERANCE_SEC, VIDEO_ANALYSIS_ENTITY_SOURCES, VIDEO_ANALYSIS_FACELESS_ANGLES, VIDEO_ANALYSIS_LEGACY_MODELS, VIDEO_ANALYSIS_LLM_MODELS, VIDEO_ANALYSIS_MAX_DURATION_SEC, VIDEO_ANALYSIS_MAX_SCENE_SEC, VIDEO_ANALYSIS_MAX_VARIATIONS, VIDEO_ANALYSIS_MIXED_TIERS, VIDEO_ANALYSIS_SHOT_ANGLES, VIDEO_ANALYSIS_SPEED_EFFECTS, VIDEO_ANALYSIS_STORY_JUMPS, VIDEO_ANALYSIS_TEXT_KINDS, VIDEO_ANALYSIS_TIERS, VIDEO_ANALYSIS_TIER_LABELS, VIDEO_ANALYSIS_TIER_ORDER, VIDEO_ANALYSIS_TIMES_OF_DAY, VIDEO_ANALYSIS_TRANSITIONS, VIDEO_ANALYSIS_VARIATION_SLUGS, VIDEO_ANALYSIS_VISUAL_EFFECTS, VIDEO_ANALYSIS_WINDOW, VIDEO_AUDIO_CAPABILITY, VIDEO_AUDIT_BUCKET_CREDITS, VIDEO_CLIP_CREDITS, VIDEO_CRITIC_CREDITS_PER_SHOT, VIDEO_CRITIC_FRAME_MODES, VIDEO_CRITIC_MAX_RETRIES, VIDEO_CRITIC_METADATA_KEYS, VIDEO_CRITIC_MIN_ADHERENCE_SCORE, VIDEO_DURATION_TIERS, VIDEO_GEN_COLLAPSED_T2V_IDS, VIDEO_GEN_PROVIDERS, VIDEO_INPUT_LIP_SYNC_PROVIDERS, VIDEO_MODEL_CAPS, VIDEO_MODE_ALIASES, VIDEO_PRODUCER_TYPES, VIDEO_PROMPT_MAX, VIDEO_PROVIDERS_REQUIRING_IMAGE, VIDEO_PROVIDERS_WITHOUT_DISPATCH, VIDEO_REF_LIMITS_BY_PROVIDER, VIDEO_TO_VIDEO_PROVIDERS, VIDEO_UPSCALE_PROVIDERS, VIDEO_UTIL_PRICING, VIDEO_VARIABLE_PRICING, VOICE_CHANGER_MODELS, VOICE_CHANGER_MODEL_IDS, VOICE_DESIGN_MODELS, type ValidateMatchCutInput, ValidateMatchCutInputSchema, type ValidateMatchCutResult, ValidateMatchCutResultSchema, type ValidationField, type Vehicle, type VehicleSubcategory, type VideoAnalysisClipTransitionIn, type VideoAnalysisEntitySource, type VideoAnalysisMixedTier, type VideoAnalysisModelTier, type VideoAnalysisResult, type VideoAnalysisShotAngle, type VideoAnalysisSpeedEffect, type VideoAnalysisTextKind, type VideoAnalysisTier, type VideoAnalysisTransition, type VideoAnalysisVisualEffect, type VideoAudioCapability, type VideoAudioMode, type VideoClipCost, type VideoCriticFrameMode, type VideoCriticMetadataKey, type VideoCriticShotFields, type VideoCriticVerdict, VideoCriticVerdictSchema, type VideoGenProvider, type VideoModeAlias, type VideoModelCapabilities, type VideoToVideoProvider, type VideoUpscaleProvider, type Voice, type VoiceChangerModel, type VoiceClone, type VoiceDesignModel, type VoiceLibraryParams, type VoiceLibraryResponse, type VoiceMatch, VoiceMatchSchema, type VoiceType, WAN_3_DEFAULT_RESOLUTION, WAN_3_PROVIDERS, WARDROBE_VARIANTS, WEAPONS, WEAPON_SUBCATEGORY_LABELS, WEAPON_SUBCATEGORY_ORDER, WORKFLOW_VISIBILITIES, WORKSPACE_HEADER, WORKSPACE_HEADER_LOWER, WORKSPACE_ROLES, type Weapon, type WeaponSubcategory, type WindowAnalysis, type WindowScene, type WorkflowAssetKind, type WorkflowExport, type WorkflowExportCharacter, type WorkflowExportCreature, type WorkflowExportLocation, type WorkflowExportObject, type WorkflowImportReport, type WorkflowImportSkippedAsset, type WorkflowMediaRef, type WorkflowPortability, type WorkflowVisibility, type WorkspaceMemberView, type WorkspaceRole, type WorkspaceSettings, WorkspaceSettingsSchema, type WorkspaceSummary, type WorkspaceView, aggregateByType, aiAvatarReserveCreditId, analyzedSceneSchema, applyDefaultVideoSelection, applyHandleInputOverride, applyRange, applyRangeIndices, applySlots, applyVideoAudioToggle, applyVideoNegativePrompt, aspectRatioFromDims, aspectRatioOptionsByKind, aspectRatioToNumber, assembleNarratedVideoCredits, availableReasoningEfforts, bucketSecondsFromAuditCreditId, bucketSecondsFromCreditId, buildBoardPrompt, buildChildrenByParent, buildConditionVariables, buildCreditModelIdentifier, buildExpressionFromVisual, buildLipSyncCreditId, buildLlmCreditIdentifier, buildModelMenu, buildModelTree, buildMotionCreditModelIdentifier, buildNodePresetExport, buildPanelPrompt, buildProgressSegments, buildRangeLabel, buildScraperCreditId, buildVideoAnalysisCreditId, buildVideoAuditCreditId, buildVideoCreditModelIdentifier, calculateCombinedProgress, calculateMonetizationMarkup, calculateMonetizedCost, calculateProgress, canonicalVarName, characterBoardItems, characterBucketDisplayRank, characterMentionSlug, characterMentionableAssetArrays, characterSheetRefItems, characterVariantAssetArrays, cinematicCreditId, clampCinematicDuration, clampSmartCutWindow, cleanOrphanedItems, clearImageCriticMetadata, clearVideoCriticMetadata, clipLookSchema, collectAncestorRefs, combineSameLabelRefs, computeAggregateLanes, countRefModalityEdges, creditRangesAll, creditsToUsd, decodeProviderItem, defaultCarriedFraction, defaultResolutionFor, defaultRoleForSource, defaultVideoAspectRatio, deriveLinkedFields, deriveLottieSlotFields, deriveSlotRefs, describeEdgeBehavior, describeMaskRegion, describeNodeAdjustments, describeSlotControl, dropUnknownBindings, dropUnknownSpeakers, durationsByMode, effectiveReasoningEffort, encodeProviderItem, ensureLocaleCatalogLoaded, entityHydrationColumns, entityMentionSlug, entityMentionSlugForRef, entityScalarFields, entitySlotSchema, entryMatchesQuery, estimateCombineVideosCredits, estimateFilmCredits, estimateLoopTrimAddonCredits, estimateLoopVideoCredits, estimateScriptDurationSec, estimateSheetCost, estimateTrimVideoCredits, evaluateCondition, evaluateConditionGroup, evaluateJsonExpression, evaluateJsonPath, expandExtraRefsToConnectedReferences, expandItemsWithRepeat, extractAllGeneratedResults, extractCharacterLoraFields, extractGeneratedJsonAsList, extractPresetData, extractReferencedLabels, extractVideoDurationFromNode, fieldKeyFromHandle, filterCloneNodes, findCharacterMentionTokens, findEntityMentionTokens, findImageMentionTokens, findLocationMentionTokens, findSeedance2AudioOverLimit, firstSightExtraRole, flattenItems, getAnimal, getAnimalLabel, getAnimalPromptHint, getAnimalTerm, getAspectRatioOptions, getAudioCrossfadeCurve, getCharacterFacet, getCombineTransition, getCreditRange, getDurationsForModel, getEffectiveRepeatCount, getFeaturedEntities, getFurniture, getFurnitureLabel, getInputFieldSchema, getInputNodes, getItemSortId, getLipSyncMaxAudioSeconds, getLlmModalityCaps, getLlmModel, getLlmTier, getLocaleDirection, getMaxImagePromptChars, getMaxNegativePromptChars, getMaxSunoPromptChars, getMaxSunoStyleChars, getMaxTtsChars, getMaxVideoPromptChars, getModel, getNodeLabel, getNodeResult, getOutputNodes, getOutputType, getParameterValue, getQualityOptions, getResolutionOptions, getRouteReachableNodeIds, getStrategy, getTargetField, getValidValues, getVehicle, getVehicleLabel, getVideoAudioCapability, getWeapon, getWeaponLabel, groupByFamily, groupHandleId, groupLlmModelsByVendor, hasContiguousSegmentDurations, hasFeature, hexToRgbaArray, humanizeSlotSid, imageMentionSlug, imageMentionSlugForRef, imageReferenceLimit, inferMusicVideo, isAggregateableType, isCharacterAspectRatio, isCollectInEdge, isDefaultSelectorConfig, isExpandedClone, isFlux2Model, isGeminiOmniProvider, isGvpSupportedProvider, isHandleInputWired, isKineticCaptionStyle, isLocationUsageMode, isMinimaxH3Provider, isObjectAspectRatio, isOversizedScene, isPaygRetentionActive, isPerSecondLipSyncProvider, isScraperActor, isSeedance2Provider, isTiltDirection, isUsageMode, isVeoProvider, isVideoAnalysisMixedTier, isVideoAnalysisTier, isWan3Provider, jsonResultToList, knownEntitySlugsFromRefs, knownImageSlugsFromRefs, listBoardTemplates, listModels, listSlotSids, llmRouteDefaults, locationMentionSlug, locationReferencePhotoKindLabel, locationUsageModeLabel, mapAspectRatio, mapQuality, mapShotIntentToProviderDirectives, matchVariant, maxSegmentSecFor, maxSegmentsFor, mergeClipLook, mergeExposedSettings, migrateEdgeOutputMode, migrateToItems, minSegmentSecFor, modelIdsByKindMode, modelToNodeTarget, modelsForInputMode, modelsWithFeature, motionGraphicsFeature, normalizeLottieLayers, normalizeMinimaxH3Resolution, normalizeModelInput, normalizeNodeModelParams, normalizePinterestUrl, normalizeRoleSlug, normalizeWan3Resolution, orderedLlmModels, parseAttributedDialogue, parseCharacterMentionToken, parseEntityMentionToken, parseGroupHandle, parseHandleId, parseImageMentionToken, parseListExpression, parseLocationMentionToken, parseNodePresetExport, parseNodeRef, pickAiAvatarBucket, pickIds, pickLipSyncBucket, pickSwitchXFrameTier, pickVideoAnalysisBucket, planSheetGeneration, planSheetPanels, preferredInputModeForModel, presentTypes, presetApplyClearKeys, presetDataMatches, presetEntries, qualityOptionsByKind, readPromptAffixes, refHandleCategory, referenceModalityForHandle, referenceSheetCreditId, registerCatalogSidecars, registerSidecarLoaders, renderAnalyzedScene, resetCatalogSidecars, resolutionOptionsByKind, resolveAiAvatarCreditId, resolveAudioCrossfadeCurve, resolveCharacterAspectRatio, resolveCinematicCreditId, resolveConditionValue, resolveDefaultRole, resolveDescription, resolveDialogueVoices, resolveEffectiveSourceType, resolveEffectiveTier, resolveEntityAspect, resolveFieldMappings, resolveGvpAnchorWire, resolveImageGenCreditIdentifier, resolveIndex, resolveLabel, resolveListExpression, resolveLlmCreditId, resolveLocationFields, resolveLocationPresetCatalog, resolveLottieOverlaySrc, resolveNodeRefs, resolveObjectAspectRatio, resolvePipelineModel, resolveRelativeWindowToken, resolveScraperCreditId, resolveSelectorRefs, resolveSeparator, resolveSheetSections, resolveSlideshowTransition, resolveSourceThroughConnectedList, resolveStoredTier, resolveSwitchXCreditId, resolveVideoAnalysisModel, resolveVideoModeForInputs, resolveVideoProviderForMode, resolveXfadeName, rewriteSceneBindings, rewriteSlotTokens, rewriteSpeakerSlots, rgbaArrayToHex, roleToPhrase, runSelector, sanitizeRole, searchModelVariants, seedance2AudioLimitSec, segmentDurationsFor, selectByModulo, selectByNamedKey, selectByPredicate, selectListItems, selectLoraRoutingForMentions, selectRandom, setRegisteredPersonPackFields, settledWithLimit, slotVariationSchema, sortCharacterEntriesForDisplay, sortListItems, sourceRefKey, spliceDelimitedRows, splitByLoopDelimiter, splitGeneratedItems, spreadJsonArrayIfSingleton, stringifyPathResults, stripExportContent, stripTransientRuntimeData, supportedDefaultDimensions, supportsAdvancedMode, supportsEndAnchor, supportsExtendRender, toConnectedReference, toConnectedReferences, togglePick, tryParseJson, uiAspectRatioFill, uiDurationFill, uiResolutionFill, unwrapUnresolvedTokens, usageModeDirective, usageModeIncludesName, usageModeLabel, usdToCredits, validateAiAvatarPayload, validateCinematicAvatarPayload, validateDurationForFormat, validateModeActivation, validateModelInput, validateNoNestedGroups, validateObjects, validateProviderForNodeType, validateSubWorkflowRoutes, variantJobId, videoAnalysisCreditSegment, videoAnalysisNumWindows, videoAnalysisResultSchema, videoAuditCreditsForBucket, videoModelCanSpeakDialogue, videoModelSupportsAudio, videoNegativeSuffix, videoProviderRequiresImage, windowAnalysisSchema, zipMergeLists };
11755
+ export { ACCESS_LEVELS, ACTIVE_SCENE_HELPERS, ADVANCED_MODE_UNAVAILABLE_REASON, AGGREGATEABLE_TYPES, AGGREGATE_LANE_SOURCE_TYPES, AI_AVATAR_DURATION_BUCKETS, AI_AVATAR_MAX_AUDIO_SEC, AI_AVATAR_MAX_DURATION_SEC, AI_AVATAR_RESERVE_IDS, AI_WRITER_PROVIDERS, ALA_CARTE_BOARDS, ALL_CAPTION_STYLES, ANIMALS, ANIMAL_SUBCATEGORY_LABELS, ANIMAL_SUBCATEGORY_ORDER, ASPECT_RATIO_DIMENSIONS, AUDIO_ADDON_PROVIDERS, AUDIO_CROSSFADE_CURVES, AUDIO_CROSSFADE_CURVE_IDS, AUDIO_FX_PRESETS, AUDIO_FX_PRESET_LABELS, AUDIO_FX_PRESET_SET, AUDIO_FX_REVERB_PRESETS, AUDIO_PRODUCER_TYPES, type AccessLevel, type AddBRollResult, AddBRollResultSchema, type AggregateableType, type AggregationBuckets, type AiAvatarDurationBucket, type AiAvatarEngine, type AiAvatarResolution, type AiWriterProvider, type AlaCarteBoard, type AnalyzedScene, type AnchorSceneStyleResult, AnchorSceneStyleResultSchema, type Animal, type AnimalSubcategory, type AssetRef, AssetRefSchema, type AudioCrossfadeCurve, type AudioFxPreset, type AudioLayer, type AuditImagesResult, AuditImagesResultSchema, type AuditImagesShotEntry, AuditImagesShotEntrySchema, AuditPromptIssueSchema, type AuditPromptResult, AuditPromptResultSchema, AvatarPayloadError, BOARD_TO_ASSET_TYPE, BOARD_TO_COLUMN, BOARD_VARIANTS, type BoardEntityKind, type BoardPromptContext, type BoardTemplate, BridgeToNextSceneInputSchema, type BridgeToNextSceneResult, BridgeToNextSceneResultSchema, type BrowseCommunityParams, type BrowseCommunityResult, CATEGORY_DURATION_DEFAULTS, CHARACTER_ASPECT_DEFAULTS, CHARACTER_ASPECT_OPTIONS, CHARACTER_ASSET_TYPES, CHARACTER_ASSET_VARIANTS, CHARACTER_ATTACH_COLUMNS, CHARACTER_FACETS, CHARACTER_FACET_IDS, CHARACTER_LORA_TRAINING_JOB_TYPE, CHARACTER_MOTION_PROVIDERS, CHARACTER_PICKER_DISPLAY_ORDER, CHARACTER_REFERENCE_PHOTO_KINDS, CHARACTER_STYLES, CHARACTER_VARIANT_ASSET_BUCKETS, CHAT_ENABLED_STAGES, CHAT_STAGES, CHAT_TURN_CAPS, CHAT_WIRED_STAGES, CINEMATIC_DEFAULT_DURATION_SEC, CINEMATIC_DEFAULT_RESOLUTION, CINEMATIC_MAX_DURATION_SEC, CINEMATIC_MAX_LOOKS, CINEMATIC_MAX_REFERENCE_IMAGES, CINEMATIC_MAX_REFERENCE_VIDEOS, CINEMATIC_MIN_DURATION_SEC, CINEMATIC_MIN_LOOKS, CINEMATIC_PROMPT_MAX, CINEMATIC_RESERVE_IDS, COLLABORATOR_ROLES, COLLECT_IN_HANDLE, COMBINE_TRANSITIONS, COMBINE_TRANSITION_GROUP_LABELS, COMBINE_TRANSITION_GROUP_ORDER, COMBINE_TRANSITION_IDS, COMPOSER_PLAN_FIELDS, COMPOSER_PLAN_MAP, CONTENT_TYPES_BY_PLATFORM, CREATURE_ATTACH_COLUMNS, CREDIT_BASE_USD, CREDIT_ROUNDING_RESOLUTION, type CaptionStyle, type CastCoverageCriticVerdict, CastCoverageCriticVerdictSchema, type CharacterAspectRatio, type CharacterAssetType, type CharacterAssetTypeForAspect, type CharacterAttachColumn, type CharacterDef, type CharacterFacet, type CharacterImageCriticVerdict, CharacterImageCriticVerdictSchema, type CharacterLoraFields, type CharacterMentionTokenInfo, CharacterMetadataSchema, type CharacterMotionProvider, type CharacterReferencePhoto, type CharacterReferencePhotoKind, type CharacterVariantAssetBucket, type CharacterVariantAssetItem, type CharacterVoiceSpec, type ChatEnabledStage, type ChatTurnResponse, ChatTurnResponseSchema, type CinematicResolution, type ClipLook, type CloneListingResult, type CollaboratorRole, type CombineTransition, type CombineTransitionGroup, type CombineVideosEstimatorInput, type CommunityCard, type CommunityEntityType, type CommunityFullDetail, type CommunityReportReason, type CommunitySort, type ComponentHandle, type ComponentMetadata, type ConnectedReference, type CreatureAttachColumn, CriticIssueSchema, type CustomEntry, DEFAULT_AUDIO_CROSSFADE_CURVE_ID, DEFAULT_CARRIED_FRACTION, DEFAULT_CHARACTER_ANGLE_COUNT, DEFAULT_CHARACTER_EXPRESSION_COUNT, DEFAULT_CHARACTER_FACET, DEFAULT_LABEL_BY_SOURCE, DEFAULT_LOCATION_USAGE_MODE, DEFAULT_PANEL_COUNT, DEFAULT_REF_IMAGE_MAX, DEFAULT_SECTIONS, DEFAULT_USAGE_MODE, DEFAULT_VIDEO_ANALYSIS_MODEL, DEFAULT_VIDEO_ANALYSIS_TIER, DEFAULT_VIDEO_CLIP_COST, DEFAULT_VIDEO_DURATION_SEC, DEFAULT_VIDEO_PROVIDER, DEFAULT_VOICE_CHANGER_MODEL, DEFAULT_VOICE_DESIGN_MODEL, DETAIL_VARIANTS, DURATION_PRICED_PROVIDERS, DYNAMIC_PRODUCER_TYPES, type DetectionResult, DetectionResultSchema, type DialogueLine, EFFORT_TIER_BUMP, EMOTIONAL_BEAT, ENTITY_ASPECT_DEFAULTS, ENTITY_BUCKET_FIELDS, ENTITY_DB_ID_FIELD, ENTITY_IMAGE_HANDLE_TYPES, ENTITY_KIND_SCALAR_FIELDS, ENTITY_NAME_FIELD, ENTITY_NODE_KINDS, ENTITY_SCALAR_FIELDS, ENTITY_SECTIONS, ENTITY_STATUSES, ENTITY_TABLE, ENTITY_TOOL_RETRY_CAP, ENTITY_TYPES, EXECUTION_DATA_KEYS, EXTEND_VIDEO_PROVIDERS, type EntityKind, type EntityMentionTokenInfo, type EntityMetadata, EntityMetadataSchema, type EntityNodeKind, type EntityReferenceInput, type EntityRejectInput, EntityRejectInputSchema, type EntitySlot, type EntityStaleEvent, EntityStaleEventSchema, type EntityStateChangeEvent, EntityStateChangeEventSchema, type EntityStatus, type EntityStudioKind, type EntityStyle, type EntityType, type EvaluateConditionOptions, type ExportedPreset, type ExposableField, type ExposableOutput, type ExposedSetting, type ExtendVideoProvider, type ExtraRefCharacterContext, type ExtraRefInput, FACE_SWAP_PROVIDERS, FAL_LIP_SYNC_PROVIDERS, FAN_OUT_EACH_TYPES, FEATURED_ENTITIES, FILM_BASE_CREDITS, FLEXIBLE_INPUT_LIP_SYNC_PROVIDERS, FLUX2_RES_MP, FLUX_LORA_CHARACTER_MODEL_ID, FRAME_MODE_ADAPTIVE_ONLY_ASPECT, FRAME_TARGET_HANDLES, FREECUT_EXPORT_COMPLETE, FREECUT_EXPORT_PROGRESS, FREECUT_READY, FREECUT_REQUEST_IMPORT, FURNITURE, FURNITURE_SUBCATEGORY_LABELS, FURNITURE_SUBCATEGORY_ORDER, type FaceSwapProvider, type FavoriteListingResult, type FeaturedEntity, type FilmCreditEstimate, type FilterListCondition, type FilterListOperator, type FilterOperator, type FixContinuityInput, FixContinuityInputSchema, type FixContinuityResult, FixContinuityResultSchema, type Flux2Model, type FreecutExportCompletePayload, type FreecutExportProgressPayload, type FreecutImportFile, type FreecutRequestImportPayload, type FullSelectorMode, type Furniture, type FurnitureSubcategory, GEMINI_OMNI_PROVIDERS, GENERATE_TEXT_DELIMITER, GLOBAL_MAX_DURATION_SECONDS, GRANTED_ACCESS, GROUP_HANDLE_PREFIX, GUIDANCE_SCALE_SUPPORT, GVP_ANCHOR_CHOICES, GVP_DEFAULT_PROVIDER, GVP_END_FRAME_PROVIDERS, GVP_EXTEND_PROVIDERS, GVP_SUPPORTED_PROVIDERS, GenerateMotionInputSchema, type GenerateMotionResult, GenerateMotionResultSchema, type GenericEdge, type GenericNode, type GrantedAccess, type GvpAnchorChoice, type GvpAnchorWireMode, HANDLE_PORT_SEPARATOR, HELPERS_SHIPPED_IN_1B3, HIGH_QUALITY_PROVIDERS, HINT_EXEMPT_PARAMETER_TYPES, type HintEdgeLike, type HintGraphContext, type HintNodeLike, type I18nCatalogId, I2I_MASK_SUPPORT, I2I_STRENGTH_SUPPORT, IDEOGRAM_PROVIDERS, IMAGE_ASPECT_RATIO_VALUES, IMAGE_CRITIC_LEAF_MODES, IMAGE_CRITIC_MAX_RETRIES, IMAGE_CRITIC_METADATA_KEYS, IMAGE_CRITIC_MIN_ADHERENCE_SCORE, IMAGE_CRITIC_MODES, IMAGE_CRITIC_UNRESOLVABLE, IMAGE_EDIT_PROVIDERS, IMAGE_GEN_PROVIDERS, IMAGE_I2I_PROVIDERS, IMAGE_MASK_MODE, IMAGE_PROMPT_MAX, IMAGE_REF_TYPES, IMAGE_TO_VIDEO_PROVIDERS, INPUT_FIELD_MAP, INPUT_NODE_TYPES, INSTAGRAM_CAROUSEL_MAX_ITEMS, INSTAGRAM_CAROUSEL_MIN_ITEMS, ITER_CLONE_PATTERN, type IdentityFidelity, type IdentityMeta, type ImageAspectRatio, type ImageCriticIssue, ImageCriticIssueSchema, type ImageCriticLeafMode, type ImageCriticMetadataKey, type ImageCriticMode, type ImageCriticNodeIssue, type ImageCriticResult, ImageCriticResultSchema, type ImageCriticVerdict, ImageCriticVerdictSchema, type ImageEditProvider, type ImageGenProvider, type ImageI2IProvider, type ImageMaskMode, type ImageMentionTokenInfo, type ImageToVideoProvider, type ImprovePromptInput, ImprovePromptInputSchema, type ImprovePromptResult, ImprovePromptResultSchema, type InputFieldSchema, type InvitationDelivery, type InvitationPreview, type InvitationState, type InvitationView, type JoinCodeView, type JsonEvalResult, type JsonFilter, type JsonPatch, KEYFRAME_CREDITS_PER_SHOT, KINETIC_CAPTION_STYLES, type KieApiFormat, type KineticCaptionStyle, LANGUAGES, LEGACY_LOTTIE_HOST_REMAP, LIP_SYNC_DURATION_BUCKETS, LIP_SYNC_MAX_AUDIO_SECONDS, LIP_SYNC_PROVIDERS, LLM_FEATURE_DEFAULTS, LLM_MODALITY_CAPS, LLM_MODELS, LLM_MODEL_IDS, LLM_REASONING_EFFORTS, LLM_ROUTE_DEFAULTS, LLM_TEXT_INPUT_MAX, LLM_VENDOR_LABELS, LLM_VENDOR_ORDER, LOCATION_ASSET_TYPES, LOCATION_ASSET_VARIANTS, LOCATION_ATMOSPHERE_PROVIDERS, LOCATION_ATTACH_COLUMNS, LOCATION_BUCKET_TO_CATALOG_ID, LOCATION_PRESET_TO_CATALOG, LOCATION_REFERENCE_PHOTO_KINDS, LOCATION_REFERENCE_PHOTO_KIND_LABELS, LOCATION_USAGE_MODES, LOTTIE_OVERLAY_CATALOG, LOTTIE_SLOT_FIELD_PREFIX, type LabeledOption, type LipSyncDurationBucket, type LipSyncProvider, type LlmFeature, type LlmModelDef, type LlmModelGroup, type LlmReasoningEffort, type LlmRouteDefaults, type LlmTier, type LlmVendor, type LocaleCatalogMap, type LocaleDirection, type LocaleId, type LocationAssetType, type LocationAtmosphereProvider, type LocationAttachColumn, type LocationCatalogRef, type LocationImageCriticVerdict, LocationImageCriticVerdictSchema, type LocationMentionTokenInfo, LocationMetadataSchema, type LocationReferencePhotoKind, type LocationUsageMode, LocationsCoverageCriticIssueSchema, type LocationsCoverageCriticVerdict, LocationsCoverageCriticVerdictSchema, type LoopTrimEstimatorInput, type LoopVideoEstimatorInput, type LoraEligibleRef, type LoraRouting, type LottieOverlayCatalogEntry, type LottieSlotField, MAX_CUSTOM_ENTRIES_PER_BOARD, MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER, MAX_LOCATION_VARIANTS, MAX_NEGATIVE_PROMPT_CHARS_BY_PROVIDER, MAX_PANELS_PER_SHEET, MAX_TTS_CHARS_BY_PROVIDER, MAX_VIDEO_PROMPT_CHARS_BY_PROVIDER, MEMBER_STATUSES, MINIMAX_H3_DEFAULT_RESOLUTION, MINIMAX_H3_PROVIDERS, MODELS_WITH_REFERENCE_IMAGE_SUPPORT, MODEL_CATALOG, MODEL_PARAM_NODE_TYPES, MODEL_RECOMMENDATIONS, MODIFY_IMAGE_PROVIDERS, MOTION_COLUMN, MOTION_TRANSFER_PROVIDERS, MUSIC_PROVIDERS, type MaskRegionDescriptor, type MatchCutVerdict, MatchCutVerdictSchema, type MeOrganizations, type Member, type MemberStatus, type MinimalEdge, type MinimalNode, type ModelCatalogEntry, type ModelInputAdjustment, type ModelKind, type ModelMenuOption, type ModelMode, type ModelNodeTarget, type ModelPromptingStyle, type ModelRecommendation, type ModelTreeLine, type ModelTreeVariant, type ModelValidationIssue, type ModifyImageProvider, type MotionTransferProviderType, type MusicProvider, NATIVE_ADAPTIVE_ASPECT, NATIVE_NEGATIVE_PROMPT_MODELS, NATIVE_NEGATIVE_VIDEO_PROVIDERS, NEGATIVE_PROMPT_MAX, NODARO_IMPORT_FILES, NODARO_LOAD_TIMELINE, NODARO_LOAD_VIDEO, NODARO_RESET_PROJECT, NODE_DEFAULT_TYPES, NODE_MAPPABLE_FIELDS, NODE_PRESET_EXPORT_KIND, NODE_REF_PATTERN, NON_EN_LOCALE_IDS, NO_SPLIT_DELIMITER, type NodaroLoadTimelinePayload, type NodaroLoadVideoPayload, type NodeDefaultType, type NodeParamAdjustment, type NodePresetExport, type NormalizedImageGen, type NormalizedModelInput, type NormalizedNodes, type NormalizedVideoRequest, OBJECT_ASPECT_DEFAULTS, OBJECT_ASPECT_OPTIONS, OBJECT_ASSET_TYPES, OBJECT_ASSET_VARIANTS, OBJECT_ATTACH_COLUMNS, OBJECT_MOTION_PROVIDERS, OBJECT_PICKER_NODE_TYPES, ORG_ERROR_CODES, ORG_KINDS, ORG_ROLES, ORG_STATUSES, OUTPUT_FIELD_MAP, OUTPUT_FORMATS, type ObjectAspectRatio, type ObjectAssetType, type ObjectAssetTypeForAspect, type ObjectAttachColumn, ObjectMetadataSchema, type ObjectMotionProvider, type ObjectsValidationIssue, type ObjectsValidationResult, OptimizeForModelInputSchema, type OptimizeForModelResult, OptimizeForModelResultSchema, type OrgAuditEntry, type OrgErrorCode, type OrgKind, type OrgMemberView, type OrgPage, type OrgRole, type OrgSettings, OrgSettingsSchema, type OrgStatus, type OrganizationSummary, type OrganizationView, type OutputFormat, type OutputMode, type OutputType, PARAMETER_NODE_TYPES, PASSTHROUGH_TYPES, PAYG_RETENTION_DAYS, PER_FORMAT_DURATION_BOUNDS, PICKER_TO_COMBINE_TRANSITION, PIPELINE_ACTIVATION_MODES, PIPELINE_FORMATS, PIPELINE_HARD_TIMEOUT_MS, PIPELINE_MODEL_STAGES, PIPELINE_MODES, PIPELINE_OUTPUT_RESOLUTIONS, PIPELINE_PINNABLE_IMAGE_MODELS, PIPELINE_PINNABLE_SCRIPT_LLMS, PIPELINE_PINNABLE_VIDEO_MODELS, PIPELINE_STAGE_NAMES, PIPELINE_STAGE_TIMEOUT_MS, PIPELINE_TYPES, PLACEHOLDER_CHARACTER_NAME, PLATFORM_LABELS, PLATFORM_SPECS, PRESET_APPLY_CLEAR_KEYS, PRESET_EXCLUDED_KEYS, PRESET_LABELS, PRESET_SETTING_KEYS, PRICING_DEFAULT_DURATION_SEC, PRICING_DEFAULT_RESOLUTION, PROMPT_HARD_CEILING, PROMPT_PREFIX_KEY, PROMPT_SUFFIX_KEY, PROVIDER_DIRECTIVE_DEFAULTS, PROVIDER_PLACEHOLDER_PREFIX, type PanelGenRequest, type PanelRequest, type PanelSource, type PipelineActivationMode, type PipelineCompletedEvent, PipelineCompletedEventSchema, type PipelineConfig, PipelineConfigSchema, type PipelineDriftSummary, PipelineDriftSummarySchema, type PipelineEditorDecisionsReadyEvent, PipelineEditorDecisionsReadyEventSchema, type PipelineEvent, type PipelineForkedEvent, PipelineForkedEventSchema, type PipelineFormat, type PipelineInput, PipelineInputSchema, type PipelineLifecycleEvent, type PipelineMode, type PipelineModelStage, type PipelineMusicReadyEvent, PipelineMusicReadyEventSchema, type PipelineOutputResolution, type PipelinePinnableImageModel, type PipelinePinnableScriptLlm, type PipelinePinnableVideoModel, type PipelineStageName, PipelineStageNameSchema, type PipelineStageStatus, PipelineStageStatusSchema, type PipelineState, PipelineStateSchema, type PipelineStatus, PipelineStatusSchema, type PipelineType, type PixelBox, type PresentationItem, type PresetEntry, type PresetSettingKey, type PresetSettings, PresetSettingsSchema, type PriceVariant, type PricedVideoSelection, type ProgressSegment, type ProjectedCatalog, type ProjectedCatalogDimension, type ProjectedCatalogOption, type PromptAffixFields, type PromptAffixes, type ProposedChange, type PublishListingParams, type PublishListingResult, QA_CHECK_PROVIDERS, type QaCheckProvider, type QualityLevel, REDUCE_STRATEGIES, REDUCE_STRATEGY_IDS, REFERENCE_BOARD_PROVIDERS, REFERENCE_BOARD_TEMPLATES, REFERENCE_HANDLE_MAP, REFERENCE_ROLE_PRESETS, REF_HANDLE_CATEGORY, REF_IMAGE_MAX_LIMITS, REF_TOKEN_NAMESPACE_PREFIXES, RENDERING_SPEED_SUPPORT, REPEATABLE_NODE_TYPES, REPEAT_PLACEHOLDER, REPLICATE_LIP_SYNC_PROVIDERS, RESERVED_TEMPLATE_VARS, type ReduceMeta, type ReduceStrategy, type ReduceStrategyId, type RefCandidate, type RefModalityEdge, type RefTokenKind, type RefVideoDurationLimit, type ReferenceBoardProvider, type ReferenceModality, type ReferenceSheet, type ReferenceSource, type ReportListingResult, type ResolveCharacterAspectOptions, type ResolveObjectAspectOptions, type ResolveSeparatorOptions, type ResolvedDialogueVoiceLine, type RouterConditionGroup, SCENE_HELPER_NAMES, SCRAPER_ACTOR_LABELS, SCRAPER_CREDIT_COSTS, SCRAPER_OUTPUT_FIELDS, SCRIPT_PROVIDERS, SEASONS, SECTION_BOARD, SECTION_KINDS, SEEDANCE_2_5_REF_LIMITS, SEEDANCE_2_CONTINUATION_REF_SEC, SEEDANCE_2_EXTEND_STITCH, SEEDANCE_2_PROVIDERS, SEEDANCE_2_R2V_MAX_AUDIO_SEC_BY_PROVIDER, SEEDANCE_2_R2V_MIN_REF_VIDEO_SEC, SEEDANCE_2_REF_LIMITS, SEEDANCE_LIP_SYNC_PROVIDERS, SEED_SUPPORT, SEPARATOR_DISPLAY, SEPARATOR_PRESETS, SHEET_ASPECTS, SHEET_BACKGROUNDS, SHEET_PRESETS, SHEET_SKINS, SHEET_TYPES, SHORT_FILM_ANGLE_COUNT, SHORT_FILM_EXPRESSION_COUNT, SHORT_FILM_VARIANT_THRESHOLD_SEC, SLOT_TOKEN_RE, SMART_CUT_WINDOW_DEFAULT, SMART_CUT_WINDOW_MAX, SMART_CUT_WINDOW_MIN, SOCIAL_POST_NODE_TYPES, STAGE_PATCH_SCHEMA, STATIC_CAPTION_STYLES, STRUCTURAL_SECTIONS, STRUCTURED_VISION_MODELS, SUBMISSION_STATUSES, SUNO_ADD_TRACK_MODELS, SUNO_FIELD_HANDLE_FIELDS, SUNO_HARD_CEILING, SUNO_MODELS, SUNO_SELECT_OPERATIONS, SUNO_TEXT_MAX, SUNO_TITLE_MAX, SUNO_TRACK_SOURCE_TYPES, SUNO_VERSION_PRICED_OPERATIONS, SUPPORTED_FONT_NAMES, SURROUND_DIRECTIONS, SWITCHX_BLOCK_FRAMES, SWITCHX_FRAME_TIERS, type SafetyRetryPolicy, type SceneData, type SceneHelperName, SceneHelperNameSchema, type SceneInputMode, SceneInputModeSchema, type SceneMetadata, SceneMetadataSchema, type SceneNodeData, SceneNodeDataSchema, SceneSpecSchema, type ScraperActorId, type ScriptCriticVerdict, ScriptCriticVerdictSchema, type ScriptProvider, type Season, type SectionKind, type SelectorConfig, type SelectorFields, type SelectorMode, type SelectorPredicateOp, type SelectorResult, type SemanticAspectRatio, type SeparatorPreset, type SharedListing, type SharedVoice, type SheetAspect, type SheetBackground, type SheetCostEstimate, type SheetEntry, type SheetFlavour, type SheetGenerationPlan, type SheetPreset, type SheetPresetId, type SheetSection, type SheetSkin, type SheetTextData, type SheetType, type ShotElement, type ShotImageElement, type ShotShapeElement, type ShotSpec, ShotSpecSchema, type ShotTextElement, type ShowrunnerPlan, ShowrunnerPlanSchema, type SidecarLoader, type SlotControlDescriptor, type SlotControlKind, type SlotVariation, type SocialMediaContentType, type SocialMediaPlatform, type SocialMediaSpec, type SortDirection, type SortListOptions, type SortType, type StageAwaitingSubGateEvent, StageAwaitingSubGateEventSchema, type StaticCaptionStyle, type StoryboardCohesionCriticVerdict, StoryboardCohesionCriticVerdictSchema, type StyleDirectives, StyleDirectivesSchema, type SubGateName, SubGateNameSchema, type SubmissionStatus, type SunoAddTrackModel, type SunoModel, type SupportedFontName, type SurroundDirection, type Swatch, T2I_TO_I2I_VARIANT, TASK_CHAINED_EDIT_PROVIDERS, TEXT_TO_AUDIO_PROVIDERS, TEXT_TO_VIDEO_PROVIDERS, TIER_MAX_PIPELINE_COST_CREDITS, TIER_PIPELINE_PARALLELISM, TILT_CARRIED_FRACTION, TOPAZ_DEFAULT_UPSCALE_FACTOR, TOPAZ_UPSCALE_FACTORS, TRANSCRIBE_PROVIDERS, TRANSIENT_RUNTIME_KEYS, TTS_PROVIDERS, TTS_TEXT_MAX, TWO_K_RESOLUTION_PROVIDERS, type TextToAudioProvider, type TextToVideoProvider, type TopazUpscaleAdjustment, type TopazUpscaleFactor, type TopazUpscaleResolution, type TranscribeProvider, type TransitionType, TransitionTypeSchema, type TrimVideoEstimatorInput, type TtsProvider, UPSCALE_IMAGE_PROVIDERS, USAGE_GROUP_BYS, USAGE_MODES, type UpscaleImageProvider, type UsageGroupBy, type UsageLogEntry, type UsageMode, type UsageQuery, type UsageReport, type UsageReportRow, type UsageReportTotals, type UsageVarianceRow, VARIABLES_HANDLE_ID, VARIABLE_PRICING_MODELS, VEHICLES, VEHICLE_SUBCATEGORY_LABELS, VEHICLE_SUBCATEGORY_ORDER, VEO_PROVIDERS, VIDEO_ANALYSIS_AUDIO_MODES, VIDEO_ANALYSIS_BUCKET_CREDITS, VIDEO_ANALYSIS_CLIP_TRANSITIONS_IN, VIDEO_ANALYSIS_DEFAULT_VARIATION, VIDEO_ANALYSIS_DURATION_BUCKETS, VIDEO_ANALYSIS_DURATION_TOLERANCE_SEC, VIDEO_ANALYSIS_ENTITY_SOURCES, VIDEO_ANALYSIS_FACELESS_ANGLES, VIDEO_ANALYSIS_LEGACY_MODELS, VIDEO_ANALYSIS_LLM_MODELS, VIDEO_ANALYSIS_MAX_DURATION_SEC, VIDEO_ANALYSIS_MAX_SCENE_SEC, VIDEO_ANALYSIS_MAX_VARIATIONS, VIDEO_ANALYSIS_MIXED_TIERS, VIDEO_ANALYSIS_SHOT_ANGLES, VIDEO_ANALYSIS_SPEED_EFFECTS, VIDEO_ANALYSIS_STORY_JUMPS, VIDEO_ANALYSIS_TEXT_KINDS, VIDEO_ANALYSIS_TIERS, VIDEO_ANALYSIS_TIER_LABELS, VIDEO_ANALYSIS_TIER_ORDER, VIDEO_ANALYSIS_TIMES_OF_DAY, VIDEO_ANALYSIS_TRANSITIONS, VIDEO_ANALYSIS_VARIATION_SLUGS, VIDEO_ANALYSIS_VISUAL_EFFECTS, VIDEO_ANALYSIS_WINDOW, VIDEO_AUDIO_CAPABILITY, VIDEO_AUDIT_BUCKET_CREDITS, VIDEO_CLIP_CREDITS, VIDEO_CRITIC_CREDITS_PER_SHOT, VIDEO_CRITIC_FRAME_MODES, VIDEO_CRITIC_MAX_RETRIES, VIDEO_CRITIC_METADATA_KEYS, VIDEO_CRITIC_MIN_ADHERENCE_SCORE, VIDEO_DURATION_TIERS, VIDEO_GEN_COLLAPSED_T2V_IDS, VIDEO_GEN_PROVIDERS, VIDEO_INPUT_LIP_SYNC_PROVIDERS, VIDEO_MODEL_CAPS, VIDEO_MODE_ALIASES, VIDEO_PRODUCER_TYPES, VIDEO_PROMPT_MAX, VIDEO_PROVIDERS_REQUIRING_IMAGE, VIDEO_PROVIDERS_WITHOUT_DISPATCH, VIDEO_REF_LIMITS_BY_PROVIDER, VIDEO_REF_VIDEO_DURATION_LIMITS, VIDEO_TO_VIDEO_PROVIDERS, VIDEO_UPSCALE_PROVIDERS, VIDEO_UTIL_PRICING, VIDEO_VARIABLE_PRICING, VOICE_CHANGER_MODELS, VOICE_CHANGER_MODEL_IDS, VOICE_DESIGN_MODELS, type ValidateMatchCutInput, ValidateMatchCutInputSchema, type ValidateMatchCutResult, ValidateMatchCutResultSchema, type ValidationField, type Vehicle, type VehicleSubcategory, type VideoAnalysisAudioMode, type VideoAnalysisClipTransitionIn, type VideoAnalysisEntitySource, type VideoAnalysisMixedTier, type VideoAnalysisModelTier, type VideoAnalysisResult, type VideoAnalysisShotAngle, type VideoAnalysisSpeedEffect, type VideoAnalysisTextKind, type VideoAnalysisTier, type VideoAnalysisTransition, type VideoAnalysisVisualEffect, type VideoAudioCapability, type VideoAudioMode, type VideoClipCost, type VideoCriticFrameMode, type VideoCriticMetadataKey, type VideoCriticShotFields, type VideoCriticVerdict, VideoCriticVerdictSchema, type VideoGenProvider, type VideoModeAlias, type VideoModelCapabilities, type VideoToVideoProvider, type VideoUpscaleProvider, type Voice, type VoiceChangerModel, type VoiceClone, type VoiceDesignModel, type VoiceLibraryParams, type VoiceLibraryResponse, type VoiceMatch, VoiceMatchSchema, type VoiceType, WAN_3_DEFAULT_RESOLUTION, WAN_3_PROVIDERS, WARDROBE_VARIANTS, WEAPONS, WEAPON_SUBCATEGORY_LABELS, WEAPON_SUBCATEGORY_ORDER, WORKFLOW_VISIBILITIES, WORKSPACE_HEADER, WORKSPACE_HEADER_LOWER, WORKSPACE_ROLES, type Weapon, type WeaponSubcategory, type WindowAnalysis, type WindowScene, type WorkflowAssetKind, type WorkflowExport, type WorkflowExportCharacter, type WorkflowExportCreature, type WorkflowExportLocation, type WorkflowExportObject, type WorkflowImportReport, type WorkflowImportSkippedAsset, type WorkflowMediaRef, type WorkflowPortability, type WorkflowVisibility, type WorkspaceMemberView, type WorkspaceRole, type WorkspaceSettings, WorkspaceSettingsSchema, type WorkspaceSummary, type WorkspaceView, aggregateByType, aiAvatarReserveCreditId, analyzedSceneSchema, applyDefaultVideoSelection, applyHandleInputOverride, applyRange, applyRangeIndices, applySlots, applyVideoAudioToggle, applyVideoNegativePrompt, aspectRatioFromDims, aspectRatioOptionsByKind, aspectRatioToNumber, assembleNarratedVideoCredits, availableReasoningEfforts, bucketSecondsFromAuditCreditId, bucketSecondsFromCreditId, buildBoardPrompt, buildChildrenByParent, buildConditionVariables, buildCreditModelIdentifier, buildExpressionFromVisual, buildLipSyncCreditId, buildLlmCreditIdentifier, buildModelMenu, buildModelTree, buildMotionCreditModelIdentifier, buildNodePresetExport, buildPanelPrompt, buildProgressSegments, buildRangeLabel, buildScraperCreditId, buildVideoAnalysisCreditId, buildVideoAuditCreditId, buildVideoCreditModelIdentifier, calculateCombinedProgress, calculateMonetizationMarkup, calculateMonetizedCost, calculateProgress, canonicalVarName, characterBoardItems, characterBucketDisplayRank, characterMentionSlug, characterMentionableAssetArrays, characterSheetRefItems, characterVariantAssetArrays, checkRefVideoDurations, cinematicCreditId, clampCinematicDuration, clampSmartCutWindow, classifyRefToken, cleanOrphanedItems, clearImageCriticMetadata, clearVideoCriticMetadata, clipLookSchema, collectAncestorRefs, combineSameLabelRefs, computeAggregateLanes, countRefModalityEdges, creditRangesAll, creditsToUsd, decodeProviderItem, defaultCarriedFraction, defaultResolutionFor, defaultRoleForSource, defaultVideoAspectRatio, deriveLinkedFields, deriveLottieSlotFields, deriveSlotRefs, describeEdgeBehavior, describeMaskRegion, describeNodeAdjustments, describeSlotControl, dropUnknownBindings, dropUnknownSpeakers, durationsByMode, effectiveReasoningEffort, encodeProviderItem, ensureLocaleCatalogLoaded, entityHydrationColumns, entityMentionSlug, entityMentionSlugForRef, entityScalarFields, entitySlotSchema, entryMatchesQuery, estimateCombineVideosCredits, estimateFilmCredits, estimateLoopTrimAddonCredits, estimateLoopVideoCredits, estimateScriptDurationSec, estimateSheetCost, estimateTrimVideoCredits, evaluateCondition, evaluateConditionGroup, evaluateJsonExpression, evaluateJsonPath, expandExtraRefsToConnectedReferences, expandItemsWithRepeat, extractAllGeneratedResults, extractCharacterLoraFields, extractGeneratedJsonAsList, extractPresetData, extractReferencedLabels, extractVideoDurationFromNode, fieldKeyFromHandle, filterCloneNodes, findCharacterMentionTokens, findEntityMentionTokens, findImageMentionTokens, findLocationMentionTokens, findSeedance2AudioOverLimit, firstSightExtraRole, flattenItems, getAnimal, getAnimalLabel, getAnimalPromptHint, getAnimalTerm, getAspectRatioOptions, getAudioCrossfadeCurve, getCharacterFacet, getCombineTransition, getCreditRange, getDurationsForModel, getEffectiveRepeatCount, getFeaturedEntities, getFurniture, getFurnitureLabel, getInputFieldSchema, getInputNodes, getItemSortId, getLipSyncMaxAudioSeconds, getLlmModalityCaps, getLlmModel, getLlmTier, getLocaleDirection, getMaxImagePromptChars, getMaxNegativePromptChars, getMaxSunoPromptChars, getMaxSunoStyleChars, getMaxTtsChars, getMaxVideoPromptChars, getModel, getNodeLabel, getNodeResult, getOutputNodes, getOutputType, getParameterValue, getQualityOptions, getResolutionOptions, getRouteReachableNodeIds, getStrategy, getTargetField, getValidValues, getVehicle, getVehicleLabel, getVideoAudioCapability, getWeapon, getWeaponLabel, groupByFamily, groupHandleId, groupLlmModelsByVendor, hasContiguousSegmentDurations, hasFeature, hexToRgbaArray, humanizeSlotSid, imageMentionSlug, imageMentionSlugForRef, imageReferenceLimit, inferMusicVideo, isAggregateableType, isCharacterAspectRatio, isCollectInEdge, isDefaultSelectorConfig, isExpandedClone, isFlux2Model, isGeminiOmniProvider, isGvpSupportedProvider, isHandleInputWired, isKineticCaptionStyle, isLocationUsageMode, isMinimaxH3Provider, isObjectAspectRatio, isOversizedScene, isPaygRetentionActive, isPerSecondLipSyncProvider, isScraperActor, isSeedance2Provider, isTiltDirection, isUsageMode, isVeoProvider, isVideoAnalysisMixedTier, isVideoAnalysisTier, isWan3Provider, jsonResultToList, knownEntitySlugsFromRefs, knownImageSlugsFromRefs, listBoardTemplates, listModels, listSlotSids, llmRouteDefaults, locationMentionSlug, locationReferencePhotoKindLabel, locationUsageModeLabel, mapAspectRatio, mapQuality, mapShotIntentToProviderDirectives, matchVariant, maxSegmentSecFor, maxSegmentsFor, mergeClipLook, mergeExposedSettings, migrateEdgeOutputMode, migrateToItems, minSegmentSecFor, modelIdsByKindMode, modelToNodeTarget, modelsForInputMode, modelsWithFeature, motionGraphicsFeature, normalizeLottieLayers, normalizeMinimaxH3Resolution, normalizeModelInput, normalizeNodeModelParams, normalizePinterestUrl, normalizeRoleSlug, normalizeVideoRequestParams, normalizeWan3Resolution, orderedLlmModels, parseAttributedDialogue, parseCharacterMentionToken, parseEntityMentionToken, parseGroupHandle, parseHandleId, parseImageMentionToken, parseListExpression, parseLocationMentionToken, parseNodePresetExport, parseNodeRef, pickAiAvatarBucket, pickIds, pickLipSyncBucket, pickSwitchXFrameTier, pickVideoAnalysisBucket, planSheetGeneration, planSheetPanels, preferredInputModeForModel, presentTypes, presetApplyClearKeys, presetDataMatches, presetEntries, pricedVideoSelection, qualityOptionsByKind, readPromptAffixes, refHandleCategory, referenceModalityForHandle, referenceSheetCreditId, registerCatalogSidecars, registerSidecarLoaders, renderAnalyzedScene, resetCatalogSidecars, resolutionOptionsByKind, resolveAiAvatarCreditId, resolveAudioCrossfadeCurve, resolveCharacterAspectRatio, resolveCinematicCreditId, resolveConditionValue, resolveDefaultRole, resolveDescription, resolveDialogueVoices, resolveEffectiveSourceType, resolveEffectiveTier, resolveEntityAspect, resolveFieldMappings, resolveGvpAnchorWire, resolveImageGenCreditIdentifier, resolveIndex, resolveLabel, resolveListExpression, resolveLlmCreditId, resolveLocationFields, resolveLocationPresetCatalog, resolveLottieOverlaySrc, resolveNodeRefs, resolveNormalizedImageGen, resolveObjectAspectRatio, resolvePipelineModel, resolveRelativeWindowToken, resolveScraperCreditId, resolveSelectorRefs, resolveSeparator, resolveSheetSections, resolveSlideshowTransition, resolveSourceThroughConnectedList, resolveStoredTier, resolveSwitchXCreditId, resolveTopazUpscale, resolveVideoAnalysisModel, resolveVideoModeForInputs, resolveVideoProviderForMode, resolveXfadeName, rewriteSceneBindings, rewriteSlotTokens, rewriteSpeakerSlots, rgbaArrayToHex, roleToPhrase, runSelector, safetyRetryPolicy, sanitizeRole, searchModelVariants, seedance2AudioLimitSec, segmentDurationsFor, selectByModulo, selectByNamedKey, selectByPredicate, selectListItems, selectLoraRoutingForMentions, selectRandom, setRegisteredPersonPackFields, settledWithLimit, slotVariationSchema, sortCharacterEntriesForDisplay, sortListItems, sourceRefKey, spliceDelimitedRows, splitByLoopDelimiter, splitGeneratedItems, spreadJsonArrayIfSingleton, stringifyPathResults, stripDerivedAnalysisFields, stripExportContent, stripTransientRuntimeData, sunoCreditType, supportedDefaultDimensions, supportsAdvancedMode, supportsEndAnchor, supportsExtendRender, toConnectedReference, toConnectedReferences, togglePick, tryParseJson, uiAspectRatioFill, uiDurationFill, uiResolutionFill, unresolvedRefTokens, unwrapUnresolvedTokens, usageModeDirective, usageModeIncludesName, usageModeLabel, usdToCredits, validateAiAvatarPayload, validateCinematicAvatarPayload, validateDurationForFormat, validateModeActivation, validateModelInput, validateNoNestedGroups, validateObjects, validateProviderForNodeType, validateSubWorkflowRoutes, variantJobId, videoAnalysisCreditSegment, videoAnalysisNumWindows, videoAnalysisResultSchema, videoAuditCreditsForBucket, videoModelCanSpeakDialogue, videoModelSupportsAudio, videoNegativeSuffix, videoProviderRequiresImage, windowAnalysisSchema, zipMergeLists };