@nodaro/shared 3.7.0 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -74,6 +74,21 @@ var KONTEXT_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4", "21:9"];
74
74
  var GROK_RATIOS = ["1:1", "16:9", "9:16", "3:2", "2:3"];
75
75
  var GPT_IMAGE_RATIOS = ["1:1", "3:2", "2:3"];
76
76
  var GPT_IMAGE_2_RATIOS = ["auto", "1:1", "16:9", "9:16", "4:3", "3:4"];
77
+ var GPT_IMAGE_2_5_RATIOS = [
78
+ "auto",
79
+ "1:1",
80
+ "3:2",
81
+ "2:3",
82
+ "4:3",
83
+ "3:4",
84
+ "16:9",
85
+ "9:16",
86
+ "21:9",
87
+ "27:16",
88
+ "16:27",
89
+ "9:8",
90
+ "8:9"
91
+ ];
77
92
  var IMAGEN4_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4"];
78
93
  var IDEOGRAM_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4"];
79
94
  var SEEDREAM_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3", "21:9"];
@@ -420,6 +435,114 @@ var IMAGE_MODELS = {
420
435
  { identifier: "gpt-image-2-i2i:4K", credits: 60, note: "4K" }
421
436
  ]
422
437
  },
438
+ "gpt-image-2-5-flare": {
439
+ id: "gpt-image-2-5-flare",
440
+ kind: "image",
441
+ modes: ["t2i"],
442
+ family: "OpenAI",
443
+ label: "GPT Image 2.5 Flare",
444
+ series: "GPT Image",
445
+ description: "Fast everyday GPT Image 2.5 - higher quality than GPT Image 2 at about half the latency. The default of the pair: social and creator content, campaign variants, thumbnails, rapid iteration, high-volume work.",
446
+ useCases: ["typography", "high-res", "general", "draft"],
447
+ features: ["reference-image"],
448
+ aspectRatios: GPT_IMAGE_2_5_RATIOS,
449
+ resolutions: ["1K", "2K", "4K"],
450
+ pricing: [
451
+ { identifier: "gpt-image-2-5-flare", credits: 15, note: "1K default" },
452
+ { identifier: "gpt-image-2-5-flare:2K", credits: 25, note: "2K" },
453
+ { identifier: "gpt-image-2-5-flare:4K", credits: 40, note: "4K" }
454
+ ],
455
+ valueLabels: {
456
+ "3:2": "3:2 (Landscape)",
457
+ "2:3": "2:3 (Portrait)",
458
+ "27:16": "27:16 (Ultra-wide)",
459
+ "16:27": "16:27 (Ultra-tall)",
460
+ "9:8": "9:8 (Near-square)",
461
+ "8:9": "8:9 (Near-square)"
462
+ },
463
+ safetyFilter: { stochastic: true, fallback: "nano-banana-pro" }
464
+ },
465
+ "gpt-image-2-5-flare-i2i": {
466
+ id: "gpt-image-2-5-flare-i2i",
467
+ kind: "image",
468
+ modes: ["i2i"],
469
+ family: "OpenAI",
470
+ label: "GPT Image 2.5 Flare (I2I)",
471
+ series: "GPT Image",
472
+ description: "Fast GPT Image 2.5 edits (up to 16 source images) - the default when you are iterating rather than finishing.",
473
+ useCases: ["edit", "high-res"],
474
+ features: ["reference-image"],
475
+ aspectRatios: GPT_IMAGE_2_5_RATIOS,
476
+ resolutions: ["1K", "2K", "4K"],
477
+ pricing: [
478
+ { identifier: "gpt-image-2-5-flare-i2i", credits: 15, note: "1K default" },
479
+ { identifier: "gpt-image-2-5-flare-i2i:2K", credits: 25, note: "2K" },
480
+ { identifier: "gpt-image-2-5-flare-i2i:4K", credits: 40, note: "4K" }
481
+ ],
482
+ valueLabels: {
483
+ "3:2": "3:2 (Landscape)",
484
+ "2:3": "2:3 (Portrait)",
485
+ "27:16": "27:16 (Ultra-wide)",
486
+ "16:27": "16:27 (Ultra-tall)",
487
+ "9:8": "9:8 (Near-square)",
488
+ "8:9": "8:9 (Near-square)"
489
+ },
490
+ safetyFilter: { stochastic: true, fallback: "nano-banana-pro" }
491
+ },
492
+ "gpt-image-2-5-sunburst": {
493
+ id: "gpt-image-2-5-sunburst",
494
+ kind: "image",
495
+ modes: ["t2i"],
496
+ family: "OpenAI",
497
+ label: "GPT Image 2.5 Sunburst",
498
+ series: "GPT Image",
499
+ description: "Precision GPT Image 2.5 - trades generation time for tighter control and detail fidelity. Pick it for brand-sensitive and production work: packaging, diagrams, ecommerce retouching, polished campaign creative.",
500
+ useCases: ["typography", "high-res", "general"],
501
+ features: ["reference-image"],
502
+ aspectRatios: GPT_IMAGE_2_5_RATIOS,
503
+ resolutions: ["1K", "2K", "4K"],
504
+ pricing: [
505
+ { identifier: "gpt-image-2-5-sunburst", credits: 15, note: "1K default" },
506
+ { identifier: "gpt-image-2-5-sunburst:2K", credits: 25, note: "2K" },
507
+ { identifier: "gpt-image-2-5-sunburst:4K", credits: 40, note: "4K" }
508
+ ],
509
+ valueLabels: {
510
+ "3:2": "3:2 (Landscape)",
511
+ "2:3": "2:3 (Portrait)",
512
+ "27:16": "27:16 (Ultra-wide)",
513
+ "16:27": "16:27 (Ultra-tall)",
514
+ "9:8": "9:8 (Near-square)",
515
+ "8:9": "8:9 (Near-square)"
516
+ },
517
+ safetyFilter: { stochastic: true, fallback: "nano-banana-pro" }
518
+ },
519
+ "gpt-image-2-5-sunburst-i2i": {
520
+ id: "gpt-image-2-5-sunburst-i2i",
521
+ kind: "image",
522
+ modes: ["i2i"],
523
+ family: "OpenAI",
524
+ label: "GPT Image 2.5 Sunburst (I2I)",
525
+ series: "GPT Image",
526
+ description: "Precision GPT Image 2.5 edits (up to 16 source images) - the most controlled edit in the GPT family, at the cost of a longer run.",
527
+ useCases: ["edit", "high-res"],
528
+ features: ["reference-image"],
529
+ aspectRatios: GPT_IMAGE_2_5_RATIOS,
530
+ resolutions: ["1K", "2K", "4K"],
531
+ pricing: [
532
+ { identifier: "gpt-image-2-5-sunburst-i2i", credits: 15, note: "1K default" },
533
+ { identifier: "gpt-image-2-5-sunburst-i2i:2K", credits: 25, note: "2K" },
534
+ { identifier: "gpt-image-2-5-sunburst-i2i:4K", credits: 40, note: "4K" }
535
+ ],
536
+ valueLabels: {
537
+ "3:2": "3:2 (Landscape)",
538
+ "2:3": "2:3 (Portrait)",
539
+ "27:16": "27:16 (Ultra-wide)",
540
+ "16:27": "16:27 (Ultra-tall)",
541
+ "9:8": "9:8 (Near-square)",
542
+ "8:9": "8:9 (Near-square)"
543
+ },
544
+ safetyFilter: { stochastic: true, fallback: "nano-banana-pro" }
545
+ },
423
546
  // ── Ideogram ──
424
547
  // Ideogram models use a `rendering_speed` (TURBO / BALANCED / QUALITY)
425
548
  // dimension that's distinct from the `quality` lever — frontend exposes
@@ -2718,7 +2841,13 @@ var IMAGE_ASPECT_RATIO_VALUES = [
2718
2841
  "4:1",
2719
2842
  "1:4",
2720
2843
  "8:1",
2721
- "1:8"
2844
+ "1:8",
2845
+ // GPT Image 2.5 (Flare + Sunburst) additions: near-square and ultra-wide/tall
2846
+ // cinema ratios (docs.kie.ai/market/gpt/gpt-image-2-5-*).
2847
+ "27:16",
2848
+ "16:27",
2849
+ "9:8",
2850
+ "8:9"
2722
2851
  ];
2723
2852
  var MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER = {
2724
2853
  // ── higher than the 5000 default ──
@@ -2730,6 +2859,15 @@ var MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER = {
2730
2859
  // docs.kie.ai/market/google/pro-image-to-image
2731
2860
  "gpt-image-2-i2i": 2e4,
2732
2861
  // docs.kie.ai/market/gpt/gpt-image-2-image-to-image
2862
+ // GPT Image 2.5 — all four lanes document a 20000-char prompt ceiling.
2863
+ "gpt-image-2-5-flare": 2e4,
2864
+ // docs.kie.ai/market/gpt/gpt-image-2-5-flare-text-to-image
2865
+ "gpt-image-2-5-flare-i2i": 2e4,
2866
+ // docs.kie.ai/market/gpt/gpt-image-2-5-flare-image-to-image
2867
+ "gpt-image-2-5-sunburst": 2e4,
2868
+ // docs.kie.ai/market/gpt/gpt-image-2-5-sunburst-text-to-image
2869
+ "gpt-image-2-5-sunburst-i2i": 2e4,
2870
+ // docs.kie.ai/market/gpt/gpt-image-2-5-sunburst-image-to-image
2733
2871
  // ── lower than the 5000 default (over-send risk if left at default) ──
2734
2872
  "seedream": 3e3,
2735
2873
  // docs.kie.ai/market/seedream/4-5-text-to-image
@@ -2921,6 +3059,8 @@ var MODELS_WITH_REFERENCE_IMAGE_SUPPORT = /* @__PURE__ */ new Set([
2921
3059
  // T2I providers that auto-route to their i2i sibling when refs are attached
2922
3060
  "gpt-image",
2923
3061
  "gpt-image-2",
3062
+ "gpt-image-2-5-flare",
3063
+ "gpt-image-2-5-sunburst",
2924
3064
  "grok",
2925
3065
  "grok-2",
2926
3066
  "qwen",
@@ -2933,6 +3073,8 @@ var MODELS_WITH_REFERENCE_IMAGE_SUPPORT = /* @__PURE__ */ new Set([
2933
3073
  "nano-banana-edit",
2934
3074
  "gpt-image-i2i",
2935
3075
  "gpt-image-2-i2i",
3076
+ "gpt-image-2-5-flare-i2i",
3077
+ "gpt-image-2-5-sunburst-i2i",
2936
3078
  "grok-2-i2i",
2937
3079
  "flux-i2i",
2938
3080
  "flux-pro-i2i",
@@ -2962,6 +3104,8 @@ var MODELS_WITH_REFERENCE_IMAGE_SUPPORT = /* @__PURE__ */ new Set([
2962
3104
  var T2I_TO_I2I_VARIANT = {
2963
3105
  "gpt-image": "gpt-image-i2i",
2964
3106
  "gpt-image-2": "gpt-image-2-i2i",
3107
+ "gpt-image-2-5-flare": "gpt-image-2-5-flare-i2i",
3108
+ "gpt-image-2-5-sunburst": "gpt-image-2-5-sunburst-i2i",
2965
3109
  "grok": "grok-i2i",
2966
3110
  // grok-2's t2i takes NO image input; its "i2i" is the segment-map(image_url)
2967
3111
  // → image-edit(task_id) chain in the KIE provider (single reference).
@@ -2987,6 +3131,8 @@ var REF_IMAGE_MAX_LIMITS = {
2987
3131
  "nano-banana-edit": 8,
2988
3132
  "gpt-image-i2i": 16,
2989
3133
  "gpt-image-2-i2i": 16,
3134
+ "gpt-image-2-5-flare-i2i": 16,
3135
+ "gpt-image-2-5-sunburst-i2i": 16,
2990
3136
  "flux-i2i": 4,
2991
3137
  "flux-pro-i2i": 4,
2992
3138
  "seedream-edit": 16,
@@ -3023,6 +3169,10 @@ var VARIABLE_PRICING_MODELS = {
3023
3169
  "gpt-image-i2i": "quality",
3024
3170
  "gpt-image-2": "resolution",
3025
3171
  "gpt-image-2-i2i": "resolution",
3172
+ "gpt-image-2-5-flare": "resolution",
3173
+ "gpt-image-2-5-flare-i2i": "resolution",
3174
+ "gpt-image-2-5-sunburst": "resolution",
3175
+ "gpt-image-2-5-sunburst-i2i": "resolution",
3026
3176
  "nano-banana-pro": "resolution",
3027
3177
  "nano-banana-2": "resolution",
3028
3178
  "flux": "resolution",
@@ -3049,6 +3199,10 @@ var RESOLUTION_2K_4K_TIERED_PROVIDERS = /* @__PURE__ */ new Set([
3049
3199
  "nano-banana-2",
3050
3200
  "gpt-image-2",
3051
3201
  "gpt-image-2-i2i",
3202
+ "gpt-image-2-5-flare",
3203
+ "gpt-image-2-5-flare-i2i",
3204
+ "gpt-image-2-5-sunburst",
3205
+ "gpt-image-2-5-sunburst-i2i",
3052
3206
  "wan-2.7",
3053
3207
  "wan-2.7-pro"
3054
3208
  ]);
@@ -3063,6 +3217,8 @@ var IMAGE_GEN_PROVIDERS = [
3063
3217
  "grok-2",
3064
3218
  "gpt-image",
3065
3219
  "gpt-image-2",
3220
+ "gpt-image-2-5-flare",
3221
+ "gpt-image-2-5-sunburst",
3066
3222
  "imagen4",
3067
3223
  "imagen4-fast",
3068
3224
  "imagen4-ultra",
@@ -3092,6 +3248,8 @@ var IMAGE_I2I_PROVIDERS = [
3092
3248
  "flux-pro-i2i",
3093
3249
  "gpt-image-i2i",
3094
3250
  "gpt-image-2-i2i",
3251
+ "gpt-image-2-5-flare-i2i",
3252
+ "gpt-image-2-5-sunburst-i2i",
3095
3253
  "grok-2-i2i",
3096
3254
  "ideogram-edit",
3097
3255
  "ideogram-remix",
@@ -3450,6 +3608,8 @@ var IMAGE_MASK_MODE = {
3450
3608
  "nano-banana-2-lite": "prompt",
3451
3609
  "gpt-image": "prompt",
3452
3610
  "gpt-image-2": "prompt",
3611
+ "gpt-image-2-5-flare": "prompt",
3612
+ "gpt-image-2-5-sunburst": "prompt",
3453
3613
  "seedream": "prompt",
3454
3614
  "seedream-5-lite": "prompt",
3455
3615
  "seedream-5-pro": "prompt",
@@ -8881,6 +9041,10 @@ var QUALITY_MAP = {
8881
9041
  "flux-pro-i2i": { field: "resolution", values: { low: "1K", mid: "2K", high: "2K" } },
8882
9042
  "gpt-image-2": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
8883
9043
  "gpt-image-2-i2i": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
9044
+ "gpt-image-2-5-flare": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
9045
+ "gpt-image-2-5-flare-i2i": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
9046
+ "gpt-image-2-5-sunburst": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
9047
+ "gpt-image-2-5-sunburst-i2i": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
8884
9048
  // Image gen — quality-style (medium/high or basic/high)
8885
9049
  "gpt-image": { field: "quality", values: { low: "medium", mid: "medium", high: "high" } },
8886
9050
  "gpt-image-i2i": { field: "quality", values: { low: "medium", mid: "medium", high: "high" } },
@@ -11531,7 +11695,9 @@ var PIPELINE_PINNABLE_IMAGE_MODELS = [
11531
11695
  "nano-banana-2",
11532
11696
  "flux",
11533
11697
  "gpt-image",
11534
- "gpt-image-2"
11698
+ "gpt-image-2",
11699
+ "gpt-image-2-5-flare",
11700
+ "gpt-image-2-5-sunburst"
11535
11701
  ];
11536
11702
  var PIPELINE_PINNABLE_VIDEO_MODELS = [
11537
11703
  "kling-turbo",
@@ -13789,7 +13955,12 @@ function estimateSheetCost(entityKind, sections, flavour, buckets, name, perPane
13789
13955
  }
13790
13956
 
13791
13957
  // src/reference-board-templates.ts
13792
- var REFERENCE_BOARD_PROVIDERS = ["nano-banana-pro", "gpt-image-2"];
13958
+ var REFERENCE_BOARD_PROVIDERS = [
13959
+ "nano-banana-pro",
13960
+ "gpt-image-2",
13961
+ "gpt-image-2-5-flare",
13962
+ "gpt-image-2-5-sunburst"
13963
+ ];
13793
13964
  var ANTI_RIGID = "Editorial reference-board layout, dark near-black background, thin yellow neon accent light, faint film-grain overlay, production-grade design UI. Organized but not rigidly locked: panels may shift position from generation to generation while staying readable, balanced and premium. Works cleanly in different aspect ratios without depending on a fixed left-column structure. All on-image labels in ENGLISH.";
13794
13965
  var PALETTE = "A COLOR PALETTE panel: 6 swatches with HEX codes derived from the dominant tones.";
13795
13966
  var CAPTION = (kind) => `Bottom caption: "Use this ${kind} board as a visual reference for consistent depiction across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Realistic \xB7 Cinematic. Style: photorealistic, no illustration. 8K, fine grain, cinematic color grading.`;
@@ -14961,7 +15132,16 @@ var SCENE3D_DEFAULT_FPS = 24;
14961
15132
  var SCENE3D_DEFAULT_DURATION_SECONDS = 4;
14962
15133
  var SCENE3D_LIMITS = {
14963
15134
  minDimensionPx: 100,
14964
- maxDimensionPx: 1920,
15135
+ /** Applies to BOTH axes, so the worst admissible frame is SQUARE, not merely
15136
+ * wider — 2560x2560 is 3.2x the pixels of 1920x1080, and that is the frame
15137
+ * this bound was measured at. Raised from 1920 once that cost was measured
15138
+ * rather than assumed: on the software GL path a container actually uses,
15139
+ * an animated 2560x2560 frame costs ~154 ms/frame against ~65 ms at
15140
+ * 1920x1080, so even `maxDurationInFrames` (3600) lands near 9 min against
15141
+ * the render worker's 25-minute budget. Peak memory is the real price —
15142
+ * ~3.1 GB across the browser process tree versus ~1.6 GB — and is the number
15143
+ * to re-measure before widening this again. */
15144
+ maxDimensionPx: 2560,
14965
15145
  minFps: 15,
14966
15146
  maxFps: 60,
14967
15147
  minDurationInFrames: 1,
@@ -15454,7 +15634,9 @@ var SCENE3D_V2_LIMITS = {
15454
15634
  defaultFps: 24,
15455
15635
  /** Even integers only — an odd axis breaks H.264 chroma subsampling. */
15456
15636
  minDimensionPx: 100,
15457
- maxDimensionPx: 1920,
15637
+ /** Deliberately kept equal to v1's `SCENE3D_LIMITS.maxDimensionPx`: one
15638
+ * renderer draws both versions, so one measured ceiling bounds both. */
15639
+ maxDimensionPx: SCENE3D_LIMITS.maxDimensionPx,
15458
15640
  minEntities: 1,
15459
15641
  /** SEMANTIC entities, not exported mesh nodes. */
15460
15642
  maxEntities: 100,
@@ -16674,11 +16856,18 @@ var pro3DRenderQuoteSchema = zod.z.object({
16674
16856
  function isPro3DRenderQuote(value) {
16675
16857
  return pro3DRenderQuoteSchema.safeParse(value).success;
16676
16858
  }
16859
+ var pro3DRenderShotStillSchema = zod.z.object({
16860
+ shotIndex: zod.z.number().int().min(0),
16861
+ frame: zod.z.number().int().min(0),
16862
+ assetId: zod.z.string().min(1),
16863
+ url: zod.z.string().min(1)
16864
+ }).passthrough();
16677
16865
  var pro3DRenderJobOutputSchema = zod.z.object({
16678
16866
  videoUrl: zod.z.string().min(1),
16679
16867
  scenePlan: scene3DAnyPlanSchema,
16680
16868
  sceneRevisionId: zod.z.string().min(1),
16681
16869
  posterAssetId: zod.z.string().min(1),
16870
+ shotStills: zod.z.array(pro3DRenderShotStillSchema).optional(),
16682
16871
  sourceArtifactId: zod.z.string().min(1).optional(),
16683
16872
  validation: zod.z.object({
16684
16873
  status: zod.z.literal("passed"),
@@ -16704,6 +16893,20 @@ var pro3DRenderJobOutputSchema = zod.z.object({
16704
16893
  function isPro3DRenderJobOutput(value) {
16705
16894
  return pro3DRenderJobOutputSchema.safeParse(value).success;
16706
16895
  }
16896
+ function pro3DRenderShotStills(output) {
16897
+ const list = output?.shotStills;
16898
+ if (!Array.isArray(list)) return [];
16899
+ const parsed = list.flatMap((entry) => {
16900
+ const result = pro3DRenderShotStillSchema.safeParse(entry);
16901
+ return result.success ? [{
16902
+ shotIndex: result.data.shotIndex,
16903
+ frame: result.data.frame,
16904
+ assetId: result.data.assetId,
16905
+ url: result.data.url
16906
+ }] : [];
16907
+ });
16908
+ return parsed.sort((a, b) => a.shotIndex - b.shotIndex);
16909
+ }
16707
16910
  var pro3DRenderCoreOutputSchema = zod.z.object({
16708
16911
  videoUrl: zod.z.string().min(1),
16709
16912
  scenePlan: scene3DAnyPlanSchema
@@ -16747,6 +16950,40 @@ function pro3DRenderTimingOverrides(input) {
16747
16950
  return out;
16748
16951
  }
16749
16952
 
16953
+ // src/scene3d-render-pricing.ts
16954
+ var SCENE3D_RENDER_TIERS = ["base", "large", "xlarge"];
16955
+ var SCENE3D_RENDER_BASE_MAX_PX = 1920;
16956
+ var SCENE3D_RENDER_XLARGE_MIN_AREA_PX = 512e4;
16957
+ var SCENE3D_RENDER_TIER_MULTIPLIERS = {
16958
+ base: 1,
16959
+ large: 1.5,
16960
+ xlarge: 2.5
16961
+ };
16962
+ function scene3DRenderTier(width, height) {
16963
+ const w = typeof width === "number" && Number.isFinite(width) && width > 0 ? width : 0;
16964
+ const h = typeof height === "number" && Number.isFinite(height) && height > 0 ? height : 0;
16965
+ if (w === 0 || h === 0) return "base";
16966
+ if (Math.max(w, h) <= SCENE3D_RENDER_BASE_MAX_PX) return "base";
16967
+ return w * h > SCENE3D_RENDER_XLARGE_MIN_AREA_PX ? "xlarge" : "large";
16968
+ }
16969
+ function scene3DRenderTierCredits(baseCredits, tier) {
16970
+ return Math.ceil(baseCredits * SCENE3D_RENDER_TIER_MULTIPLIERS[tier]);
16971
+ }
16972
+ var RENDER_VIDEO_CREDIT_ID = "render-video";
16973
+ function renderVideoCreditId(input) {
16974
+ if (!input || typeof input !== "object") return RENDER_VIDEO_CREDIT_ID;
16975
+ const body = input;
16976
+ if (body.planType !== SCENE3D_PLAN_TYPE) return RENDER_VIDEO_CREDIT_ID;
16977
+ if (!body.plan || typeof body.plan !== "object") return RENDER_VIDEO_CREDIT_ID;
16978
+ const plan = body.plan;
16979
+ const tier = scene3DRenderTier(plan.width, plan.height);
16980
+ return tier === "base" ? RENDER_VIDEO_CREDIT_ID : `${RENDER_VIDEO_CREDIT_ID}:3d-${tier}`;
16981
+ }
16982
+ function pro3DRenderFrameUnit(quality, tier = "base") {
16983
+ const unit = `${PRO3D_RENDER_CREDIT_ID}:render-frame:${quality}`;
16984
+ return tier === "base" ? unit : `${unit}:${tier}`;
16985
+ }
16986
+
16750
16987
  // src/studio-transient.ts
16751
16988
  var STUDIO_TRANSIENT_KEYS = [
16752
16989
  "trash",
@@ -17382,6 +17619,7 @@ exports.REF_HANDLE_CATEGORY = REF_HANDLE_CATEGORY;
17382
17619
  exports.REF_IMAGE_MAX_LIMITS = REF_IMAGE_MAX_LIMITS;
17383
17620
  exports.REF_TOKEN_NAMESPACE_PREFIXES = REF_TOKEN_NAMESPACE_PREFIXES;
17384
17621
  exports.RENDERING_SPEED_SUPPORT = RENDERING_SPEED_SUPPORT;
17622
+ exports.RENDER_VIDEO_CREDIT_ID = RENDER_VIDEO_CREDIT_ID;
17385
17623
  exports.REPEATABLE_NODE_TYPES = REPEATABLE_NODE_TYPES;
17386
17624
  exports.REPEAT_PLACEHOLDER = REPEAT_PLACEHOLDER;
17387
17625
  exports.REPLICATE_LIP_SYNC_PROVIDERS = REPLICATE_LIP_SYNC_PROVIDERS;
@@ -17414,6 +17652,10 @@ exports.SCENE3D_PLAN_TYPE = SCENE3D_PLAN_TYPE;
17414
17652
  exports.SCENE3D_PRIMITIVES = SCENE3D_PRIMITIVES;
17415
17653
  exports.SCENE3D_PRIMITIVE_MATERIAL_ROLE = SCENE3D_PRIMITIVE_MATERIAL_ROLE;
17416
17654
  exports.SCENE3D_RENDERER_ASSET_KINDS = SCENE3D_RENDERER_ASSET_KINDS;
17655
+ exports.SCENE3D_RENDER_BASE_MAX_PX = SCENE3D_RENDER_BASE_MAX_PX;
17656
+ exports.SCENE3D_RENDER_TIERS = SCENE3D_RENDER_TIERS;
17657
+ exports.SCENE3D_RENDER_TIER_MULTIPLIERS = SCENE3D_RENDER_TIER_MULTIPLIERS;
17658
+ exports.SCENE3D_RENDER_XLARGE_MIN_AREA_PX = SCENE3D_RENDER_XLARGE_MIN_AREA_PX;
17417
17659
  exports.SCENE3D_SCHEMA_VERSION = SCENE3D_SCHEMA_VERSION;
17418
17660
  exports.SCENE3D_SCHEMA_VERSION_V2 = SCENE3D_SCHEMA_VERSION_V2;
17419
17661
  exports.SCENE3D_SUPPORTED_SCHEMA_VERSIONS = SCENE3D_SUPPORTED_SCHEMA_VERSIONS;
@@ -17865,9 +18107,12 @@ exports.presetDataMatches = presetDataMatches;
17865
18107
  exports.presetEntries = presetEntries;
17866
18108
  exports.pricedVideoSelection = pricedVideoSelection;
17867
18109
  exports.pro3DRenderCoreOutputSchema = pro3DRenderCoreOutputSchema;
18110
+ exports.pro3DRenderFrameUnit = pro3DRenderFrameUnit;
17868
18111
  exports.pro3DRenderJobOutputSchema = pro3DRenderJobOutputSchema;
17869
18112
  exports.pro3DRenderProducedSchemaVersion = pro3DRenderProducedSchemaVersion;
17870
18113
  exports.pro3DRenderQuoteSchema = pro3DRenderQuoteSchema;
18114
+ exports.pro3DRenderShotStillSchema = pro3DRenderShotStillSchema;
18115
+ exports.pro3DRenderShotStills = pro3DRenderShotStills;
17871
18116
  exports.pro3DRenderTimingOverrides = pro3DRenderTimingOverrides;
17872
18117
  exports.qualityOptionsByKind = qualityOptionsByKind;
17873
18118
  exports.readPromptAffixes = readPromptAffixes;
@@ -17877,6 +18122,7 @@ exports.referenceSheetCreditId = referenceSheetCreditId;
17877
18122
  exports.registerCatalogSidecars = registerCatalogSidecars;
17878
18123
  exports.registerSidecarLoaders = registerSidecarLoaders;
17879
18124
  exports.renderAnalyzedScene = renderAnalyzedScene;
18125
+ exports.renderVideoCreditId = renderVideoCreditId;
17880
18126
  exports.requiresSequenceExecution = requiresSequenceExecution;
17881
18127
  exports.resetCatalogSidecars = resetCatalogSidecars;
17882
18128
  exports.resolutionOptionsByKind = resolutionOptionsByKind;
@@ -17985,6 +18231,8 @@ exports.scene3DPrimitiveSchema = scene3DPrimitiveSchema;
17985
18231
  exports.scene3DProjectionIssues = scene3DProjectionIssues;
17986
18232
  exports.scene3DProvenanceSchema = scene3DProvenanceSchema;
17987
18233
  exports.scene3DReferenceSchema = scene3DReferenceSchema;
18234
+ exports.scene3DRenderTier = scene3DRenderTier;
18235
+ exports.scene3DRenderTierCredits = scene3DRenderTierCredits;
17988
18236
  exports.scene3DSampleForFrame = scene3DSampleForFrame;
17989
18237
  exports.scene3DSha256Schema = scene3DSha256Schema;
17990
18238
  exports.scene3DShotForFrame = scene3DShotForFrame;