@nodaro/shared 3.6.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.`;
@@ -14046,6 +14217,17 @@ function overlayShapeElement(shape, w, h, inset = 0) {
14046
14217
  }
14047
14218
 
14048
14219
  // src/image-overlay-layers.ts
14220
+ var OVERLAY_ANCHORS = [
14221
+ "top-left",
14222
+ "top",
14223
+ "top-right",
14224
+ "left",
14225
+ "center",
14226
+ "right",
14227
+ "bottom-left",
14228
+ "bottom",
14229
+ "bottom-right"
14230
+ ];
14049
14231
  var OVERLAY_LAYER_KINDS = ["image", "text", "qr", "shape"];
14050
14232
  var OVERLAY_TEXT_ALIGNS = ["left", "center", "right"];
14051
14233
  var OVERLAY_IMAGE_MASKS = ["none", "circle"];
@@ -14950,7 +15132,16 @@ var SCENE3D_DEFAULT_FPS = 24;
14950
15132
  var SCENE3D_DEFAULT_DURATION_SECONDS = 4;
14951
15133
  var SCENE3D_LIMITS = {
14952
15134
  minDimensionPx: 100,
14953
- 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,
14954
15145
  minFps: 15,
14955
15146
  maxFps: 60,
14956
15147
  minDurationInFrames: 1,
@@ -15443,7 +15634,9 @@ var SCENE3D_V2_LIMITS = {
15443
15634
  defaultFps: 24,
15444
15635
  /** Even integers only — an odd axis breaks H.264 chroma subsampling. */
15445
15636
  minDimensionPx: 100,
15446
- 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,
15447
15640
  minEntities: 1,
15448
15641
  /** SEMANTIC entities, not exported mesh nodes. */
15449
15642
  maxEntities: 100,
@@ -16663,11 +16856,18 @@ var pro3DRenderQuoteSchema = zod.z.object({
16663
16856
  function isPro3DRenderQuote(value) {
16664
16857
  return pro3DRenderQuoteSchema.safeParse(value).success;
16665
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();
16666
16865
  var pro3DRenderJobOutputSchema = zod.z.object({
16667
16866
  videoUrl: zod.z.string().min(1),
16668
16867
  scenePlan: scene3DAnyPlanSchema,
16669
16868
  sceneRevisionId: zod.z.string().min(1),
16670
16869
  posterAssetId: zod.z.string().min(1),
16870
+ shotStills: zod.z.array(pro3DRenderShotStillSchema).optional(),
16671
16871
  sourceArtifactId: zod.z.string().min(1).optional(),
16672
16872
  validation: zod.z.object({
16673
16873
  status: zod.z.literal("passed"),
@@ -16693,6 +16893,20 @@ var pro3DRenderJobOutputSchema = zod.z.object({
16693
16893
  function isPro3DRenderJobOutput(value) {
16694
16894
  return pro3DRenderJobOutputSchema.safeParse(value).success;
16695
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
+ }
16696
16910
  var pro3DRenderCoreOutputSchema = zod.z.object({
16697
16911
  videoUrl: zod.z.string().min(1),
16698
16912
  scenePlan: scene3DAnyPlanSchema
@@ -16736,6 +16950,40 @@ function pro3DRenderTimingOverrides(input) {
16736
16950
  return out;
16737
16951
  }
16738
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
+
16739
16987
  // src/studio-transient.ts
16740
16988
  var STUDIO_TRANSIENT_KEYS = [
16741
16989
  "trash",
@@ -17286,6 +17534,7 @@ exports.ORG_ROLES = ORG_ROLES;
17286
17534
  exports.ORG_STATUSES = ORG_STATUSES;
17287
17535
  exports.OUTPUT_FIELD_MAP = OUTPUT_FIELD_MAP;
17288
17536
  exports.OUTPUT_FORMATS = OUTPUT_FORMATS;
17537
+ exports.OVERLAY_ANCHORS = OVERLAY_ANCHORS;
17289
17538
  exports.OVERLAY_FONTS = OVERLAY_FONTS;
17290
17539
  exports.OVERLAY_FONT_IDS = OVERLAY_FONT_IDS;
17291
17540
  exports.OVERLAY_IMAGE_MASKS = OVERLAY_IMAGE_MASKS;
@@ -17370,6 +17619,7 @@ exports.REF_HANDLE_CATEGORY = REF_HANDLE_CATEGORY;
17370
17619
  exports.REF_IMAGE_MAX_LIMITS = REF_IMAGE_MAX_LIMITS;
17371
17620
  exports.REF_TOKEN_NAMESPACE_PREFIXES = REF_TOKEN_NAMESPACE_PREFIXES;
17372
17621
  exports.RENDERING_SPEED_SUPPORT = RENDERING_SPEED_SUPPORT;
17622
+ exports.RENDER_VIDEO_CREDIT_ID = RENDER_VIDEO_CREDIT_ID;
17373
17623
  exports.REPEATABLE_NODE_TYPES = REPEATABLE_NODE_TYPES;
17374
17624
  exports.REPEAT_PLACEHOLDER = REPEAT_PLACEHOLDER;
17375
17625
  exports.REPLICATE_LIP_SYNC_PROVIDERS = REPLICATE_LIP_SYNC_PROVIDERS;
@@ -17402,6 +17652,10 @@ exports.SCENE3D_PLAN_TYPE = SCENE3D_PLAN_TYPE;
17402
17652
  exports.SCENE3D_PRIMITIVES = SCENE3D_PRIMITIVES;
17403
17653
  exports.SCENE3D_PRIMITIVE_MATERIAL_ROLE = SCENE3D_PRIMITIVE_MATERIAL_ROLE;
17404
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;
17405
17659
  exports.SCENE3D_SCHEMA_VERSION = SCENE3D_SCHEMA_VERSION;
17406
17660
  exports.SCENE3D_SCHEMA_VERSION_V2 = SCENE3D_SCHEMA_VERSION_V2;
17407
17661
  exports.SCENE3D_SUPPORTED_SCHEMA_VERSIONS = SCENE3D_SUPPORTED_SCHEMA_VERSIONS;
@@ -17853,9 +18107,12 @@ exports.presetDataMatches = presetDataMatches;
17853
18107
  exports.presetEntries = presetEntries;
17854
18108
  exports.pricedVideoSelection = pricedVideoSelection;
17855
18109
  exports.pro3DRenderCoreOutputSchema = pro3DRenderCoreOutputSchema;
18110
+ exports.pro3DRenderFrameUnit = pro3DRenderFrameUnit;
17856
18111
  exports.pro3DRenderJobOutputSchema = pro3DRenderJobOutputSchema;
17857
18112
  exports.pro3DRenderProducedSchemaVersion = pro3DRenderProducedSchemaVersion;
17858
18113
  exports.pro3DRenderQuoteSchema = pro3DRenderQuoteSchema;
18114
+ exports.pro3DRenderShotStillSchema = pro3DRenderShotStillSchema;
18115
+ exports.pro3DRenderShotStills = pro3DRenderShotStills;
17859
18116
  exports.pro3DRenderTimingOverrides = pro3DRenderTimingOverrides;
17860
18117
  exports.qualityOptionsByKind = qualityOptionsByKind;
17861
18118
  exports.readPromptAffixes = readPromptAffixes;
@@ -17865,6 +18122,7 @@ exports.referenceSheetCreditId = referenceSheetCreditId;
17865
18122
  exports.registerCatalogSidecars = registerCatalogSidecars;
17866
18123
  exports.registerSidecarLoaders = registerSidecarLoaders;
17867
18124
  exports.renderAnalyzedScene = renderAnalyzedScene;
18125
+ exports.renderVideoCreditId = renderVideoCreditId;
17868
18126
  exports.requiresSequenceExecution = requiresSequenceExecution;
17869
18127
  exports.resetCatalogSidecars = resetCatalogSidecars;
17870
18128
  exports.resolutionOptionsByKind = resolutionOptionsByKind;
@@ -17973,6 +18231,8 @@ exports.scene3DPrimitiveSchema = scene3DPrimitiveSchema;
17973
18231
  exports.scene3DProjectionIssues = scene3DProjectionIssues;
17974
18232
  exports.scene3DProvenanceSchema = scene3DProvenanceSchema;
17975
18233
  exports.scene3DReferenceSchema = scene3DReferenceSchema;
18234
+ exports.scene3DRenderTier = scene3DRenderTier;
18235
+ exports.scene3DRenderTierCredits = scene3DRenderTierCredits;
17976
18236
  exports.scene3DSampleForFrame = scene3DSampleForFrame;
17977
18237
  exports.scene3DSha256Schema = scene3DSha256Schema;
17978
18238
  exports.scene3DShotForFrame = scene3DShotForFrame;