@nodaro/shared 3.9.0 → 3.10.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 (41) hide show
  1. package/dist/index.cjs +254 -50
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +741 -30
  4. package/dist/index.d.ts +741 -30
  5. package/dist/index.js +231 -51
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/__tests__/credit-identifiers.test.ts +51 -1
  9. package/src/__tests__/gvp-supported-providers.test.ts +20 -3
  10. package/src/__tests__/model-catalog-sections.test.ts +59 -0
  11. package/src/__tests__/model-tree.test.ts +2 -2
  12. package/src/__tests__/parameter-node-value.test.ts +35 -0
  13. package/src/__tests__/pricing-default-duration.test.ts +45 -0
  14. package/src/__tests__/prompt-length-limits.test.ts +4 -0
  15. package/src/__tests__/scene3d-delivery-review.test.ts +512 -0
  16. package/src/__tests__/template-categories.test.ts +45 -0
  17. package/src/__tests__/video-ref-limits.test.ts +11 -2
  18. package/src/credit-identifiers.ts +44 -9
  19. package/src/i18n/character-motion.ar.ts +1031 -0
  20. package/src/i18n/character-motion.de.ts +1031 -0
  21. package/src/i18n/character-motion.es.ts +1031 -0
  22. package/src/i18n/character-motion.fr.ts +1031 -0
  23. package/src/i18n/character-motion.he.ts +1031 -0
  24. package/src/i18n/character-motion.hi.ts +1031 -0
  25. package/src/i18n/character-motion.ja.ts +1031 -0
  26. package/src/i18n/character-motion.ko.ts +1031 -0
  27. package/src/i18n/character-motion.pt-BR.ts +1031 -0
  28. package/src/i18n/character-motion.ru.ts +1031 -0
  29. package/src/i18n/character-motion.zh-CN.ts +1031 -0
  30. package/src/i18n/types.ts +1 -0
  31. package/src/index.ts +21 -0
  32. package/src/model-catalog.ts +49 -32
  33. package/src/model-constants.ts +50 -11
  34. package/src/node-execution-state.ts +95 -0
  35. package/src/parameter-node-value.ts +33 -0
  36. package/src/presentation-utils.ts +1 -0
  37. package/src/pro-3d-render.ts +159 -0
  38. package/src/scene3d-delivery-notes.ts +490 -0
  39. package/src/scene3d-v2-plan.ts +8 -2
  40. package/src/smart-cut-windows.ts +15 -10
  41. package/src/template-categories.ts +67 -0
package/dist/index.cjs CHANGED
@@ -601,23 +601,8 @@ var IMAGE_MODELS = {
601
601
  { identifier: "ideogram-remix:QUALITY", credits: 60, note: "best quality" }
602
602
  ]
603
603
  },
604
- "ideogram-reframe": {
605
- id: "ideogram-reframe",
606
- kind: "image",
607
- modes: ["edit"],
608
- family: "Ideogram",
609
- label: "Ideogram Reframe",
610
- series: "Ideogram",
611
- description: "Outpaint / reframe to a new aspect ratio while preserving subject.",
612
- useCases: ["outpaint", "reframe"],
613
- features: ["reference-image"],
614
- aspectRatios: IDEOGRAM_RATIOS,
615
- pricing: [
616
- { identifier: "ideogram-reframe", credits: 18, note: "BALANCED default" },
617
- { identifier: "ideogram-reframe:TURBO", credits: 18, note: "fastest" },
618
- { identifier: "ideogram-reframe:QUALITY", credits: 18, note: "best quality" }
619
- ]
620
- },
604
+ // `ideogram-reframe` was retired 2026-09-15 — KIE's `ideogram/v3-reframe`
605
+ // fails every task upstream (#1331); see IDEOGRAM_PROVIDERS in model-constants.
621
606
  // ── Google Imagen ──
622
607
  "imagen4": {
623
608
  id: "imagen4",
@@ -1069,9 +1054,17 @@ var VIDEO_MODELS = {
1069
1054
  family: "Google",
1070
1055
  label: "VEO 3.1 Quality",
1071
1056
  series: "VEO",
1072
- description: "Google VEO 3.1 Quality \u2014 premium cinematic video. 4/6/8s clips, optional end frame, native audio. Flat per-generation pricing across durations.",
1057
+ description: "Google VEO 3.1 Quality \u2014 premium cinematic video. 4/6/8s clips, optional end frame, native audio. No reference-to-video mode (Fast/Lite only). Flat per-generation pricing across durations.",
1073
1058
  useCases: ["cinematic", "premium", "narrative"],
1074
- features: ["end-frame", "audio", "reference-image"],
1059
+ // NO "reference-image": KIE serves REFERENCE_2_VIDEO on the Fast and Lite
1060
+ // SKUs only. Its own words, on a production job (2026-09-04, app-reports
1061
+ // lane G): "Reference to video only supports the Veo Fast model and Veo
1062
+ // Lite model." Until 2026-09-15 this entry claimed the feature, so the
1063
+ // editor offered the reference handles, the adapter sent
1064
+ // generationType: "REFERENCE_2_VIDEO", and the call came back 422 every
1065
+ // time — after credits were reserved. `veo3.1` (KIE `veo3_fast`) and
1066
+ // `veo3_lite` DO serve it and keep the flag.
1067
+ features: ["end-frame", "audio"],
1075
1068
  durations: [4, 6, 8],
1076
1069
  aspectRatios: VIDEO_RATIOS_HV,
1077
1070
  // 720p (default) + 1080p inline. 4K generates the base at 1080p then chains
@@ -2028,7 +2021,7 @@ var VIDEO_MODELS = {
2028
2021
  id: "omnihuman-1-5",
2029
2022
  kind: "video",
2030
2023
  modes: ["lip-sync"],
2031
- family: "ByteDance",
2024
+ family: "Bytedance",
2032
2025
  label: "OmniHuman 1.5",
2033
2026
  series: "OmniHuman",
2034
2027
  description: "Premium prompt-directed talking avatar from a still image + audio. 720p / 1080p, up to 60s. People, pets, anime.",
@@ -2287,17 +2280,8 @@ var AUDIO_MODELS = {
2287
2280
  pricing: [{ identifier: "elevenlabs-dialogue", credits: 25, note: "per 1K chars" }]
2288
2281
  },
2289
2282
  // ── ElevenLabs voice utilities ──
2290
- "voice-clone": {
2291
- id: "voice-clone",
2292
- kind: "audio",
2293
- modes: ["voice-clone"],
2294
- family: "ElevenLabs",
2295
- label: "Voice Clone (Instant)",
2296
- series: "ElevenLabs",
2297
- description: "Clone a voice from a short reference clip. Instant clone via direct ElevenLabs API.",
2298
- useCases: ["voice-clone", "personalization"],
2299
- pricing: [{ identifier: "voice-clone", credits: 50 }]
2300
- },
2283
+ // (voice cloning was retired platform-wide on 2026-09-15 — no catalog entry,
2284
+ // no price, no MCP tool; existing clones still resolve as TTS voice ids.)
2301
2285
  "elevenlabs-voice-design": {
2302
2286
  id: "elevenlabs-voice-design",
2303
2287
  kind: "audio",
@@ -2353,6 +2337,17 @@ var AUDIO_MODELS = {
2353
2337
  useCases: ["dubbing", "multilingual"],
2354
2338
  pricing: [{ identifier: "elevenlabs-dubbing", credits: 40, note: "per minute of the dubbed span (min 1)" }]
2355
2339
  },
2340
+ "elevenlabs-dubbing-v2": {
2341
+ id: "elevenlabs-dubbing-v2",
2342
+ kind: "audio",
2343
+ modes: ["dubbing"],
2344
+ family: "ElevenLabs",
2345
+ label: "ElevenLabs Dubbing v2",
2346
+ series: "ElevenLabs",
2347
+ description: "Translate + dub audio or a whole video into a new language \u2014 video in, dubbed video out. Async.",
2348
+ useCases: ["dubbing", "multilingual"],
2349
+ pricing: [{ identifier: "elevenlabs-dubbing-v2", credits: 1100, note: "per minute of the dubbed span (min 1)" }]
2350
+ },
2356
2351
  "elevenlabs-forced-alignment": {
2357
2352
  id: "elevenlabs-forced-alignment",
2358
2353
  kind: "audio",
@@ -2475,6 +2470,10 @@ function groupByFamily(entries) {
2475
2470
  }
2476
2471
  return Array.from(groups.entries()).map(([family, models]) => ({ family, models }));
2477
2472
  }
2473
+ var MODEL_KINDS = ["image", "video", "audio"];
2474
+ function groupByKindAndFamily(entries) {
2475
+ return MODEL_KINDS.map((kind) => ({ kind, families: groupByFamily(entries.filter((m) => m.kind === kind)) })).filter((section) => section.families.length > 0);
2476
+ }
2478
2477
  function getModel(id) {
2479
2478
  return MODEL_CATALOG[id];
2480
2479
  }
@@ -2915,16 +2914,23 @@ var MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER = {
2915
2914
  // docs.kie.ai/market/seedream-5-lite-image-to-image (NB: t2i sibling is 1000)
2916
2915
  "qwen": 3e3,
2917
2916
  // docs.kie.ai/market/qwen/text-to-image
2918
- "qwen-edit": 2e3
2917
+ "qwen-edit": 2e3,
2919
2918
  // docs.kie.ai/market/qwen/image-edit
2919
+ // Z-Image is the SHORTEST of the family — "maxLength: 1000" in its schema
2920
+ // (docs.kie.ai/market/z-image/z-image, re-fetched 2026-09-15). It was listed
2921
+ // below as "verified == 5000", which is how three production runs on
2922
+ // 2026-09-07 sent a workflow-assembled prompt straight into KIE's
2923
+ // `{"code":500,"msg":"The text length cannot exceed the maximum limit"}`.
2924
+ "z-image": 1e3
2925
+ // docs.kie.ai/market/z-image/z-image
2920
2926
  // verified == 5000 default (no entry needed): imagen4(-fast/-ultra), nano-banana,
2921
2927
  // nano-banana-edit, flux, flux-flex, gpt-image-2, ideogram-v3/-edit/-remix,
2922
- // z-image, grok, qwen-i2i, seedream-5-pro, seedream-5-pro-i2i
2928
+ // grok, qwen-i2i, seedream-5-pro, seedream-5-pro-i2i
2923
2929
  // (docs.kie.ai/market/seedream/5-pro-text-to-image + 5-pro-image-to-image).
2924
2930
  // grok-i2i: doc states 390000 (78× its t2i sibling) — treated as a KIE schema
2925
2931
  // typo and left at the 5000 default per the sanity-cap decision.
2926
2932
  // UNVERIFIED (no limit stated in schema) → 5000 default: flux-kontext(-max)
2927
- // gpt-image, gpt-image-i2i, flux-i2i, flux-pro-i2i, ideogram-reframe.
2933
+ // gpt-image, gpt-image-i2i, flux-i2i, flux-pro-i2i.
2928
2934
  };
2929
2935
  function getMaxImagePromptChars(provider) {
2930
2936
  return provider && MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER[provider] || IMAGE_PROMPT_MAX;
@@ -3118,7 +3124,6 @@ var MODELS_WITH_REFERENCE_IMAGE_SUPPORT = /* @__PURE__ */ new Set([
3118
3124
  "flux-kontext-max",
3119
3125
  "ideogram-edit",
3120
3126
  "ideogram-remix",
3121
- "ideogram-reframe",
3122
3127
  "qwen-i2i",
3123
3128
  "qwen-edit",
3124
3129
  "seedream-edit",
@@ -3179,7 +3184,6 @@ var REF_IMAGE_MAX_LIMITS = {
3179
3184
  "flux-kontext-max": 1,
3180
3185
  "ideogram-edit": 1,
3181
3186
  "ideogram-remix": 1,
3182
- "ideogram-reframe": 1,
3183
3187
  "qwen-i2i": 1,
3184
3188
  "qwen-edit": 1,
3185
3189
  "grok-i2i": 1,
@@ -3224,7 +3228,6 @@ var VARIABLE_PRICING_MODELS = {
3224
3228
  "topaz-image-upscale": "resolution",
3225
3229
  "ideogram-edit": "rendering-speed",
3226
3230
  "ideogram-remix": "rendering-speed",
3227
- "ideogram-reframe": "rendering-speed",
3228
3231
  "ideogram-v3": "rendering-speed",
3229
3232
  "wan-2.7": "resolution",
3230
3233
  "wan-2.7-pro": "resolution"
@@ -3242,7 +3245,7 @@ var RESOLUTION_2K_4K_TIERED_PROVIDERS = /* @__PURE__ */ new Set([
3242
3245
  "wan-2.7",
3243
3246
  "wan-2.7-pro"
3244
3247
  ]);
3245
- var IDEOGRAM_PROVIDERS = /* @__PURE__ */ new Set(["ideogram-edit", "ideogram-remix", "ideogram-reframe", "ideogram-v3"]);
3248
+ var IDEOGRAM_PROVIDERS = /* @__PURE__ */ new Set(["ideogram-edit", "ideogram-remix", "ideogram-v3"]);
3246
3249
  var IMAGE_GEN_PROVIDERS = [
3247
3250
  "nano-banana",
3248
3251
  "flux",
@@ -3289,7 +3292,6 @@ var IMAGE_I2I_PROVIDERS = [
3289
3292
  "grok-2-i2i",
3290
3293
  "ideogram-edit",
3291
3294
  "ideogram-remix",
3292
- "ideogram-reframe",
3293
3295
  "qwen-i2i",
3294
3296
  "qwen-edit",
3295
3297
  "seedream-edit",
@@ -3683,7 +3685,6 @@ var I2I_STRENGTH_SUPPORT = {
3683
3685
  };
3684
3686
  var SEED_SUPPORT = /* @__PURE__ */ new Set([
3685
3687
  "ideogram-remix",
3686
- "ideogram-reframe",
3687
3688
  "ideogram-v3",
3688
3689
  "qwen",
3689
3690
  "qwen-i2i",
@@ -3699,7 +3700,6 @@ var SEED_SUPPORT = /* @__PURE__ */ new Set([
3699
3700
  ]);
3700
3701
  var RENDERING_SPEED_SUPPORT = /* @__PURE__ */ new Set([
3701
3702
  "ideogram-remix",
3702
- "ideogram-reframe",
3703
3703
  "ideogram-v3"
3704
3704
  ]);
3705
3705
  var GUIDANCE_SCALE_SUPPORT = {
@@ -3960,8 +3960,13 @@ var VIDEO_REF_LIMITS_BY_PROVIDER = {
3960
3960
  // backend kie/models.ts maxRefImages: 7
3961
3961
  "happyhorse-ref2v": { images: 9 },
3962
3962
  // backend kie/models.ts maxRefImages: 9
3963
- // VEO 3.x — REFERENCE_2_VIDEO path caps refs at 3 (kie/video.ts slice(0, 3)).
3964
- "veo3": { images: 3 },
3963
+ // VEO 3.x — REFERENCE_2_VIDEO path caps refs at 3 (kie/video.ts slices to
3964
+ // this number). `veo3` (VEO 3.1 QUALITY) is deliberately ABSENT: KIE serves
3965
+ // reference-to-video on the Fast and Lite SKUs only and rejects it on
3966
+ // Quality with "Reference to video only supports the Veo Fast model and Veo
3967
+ // Lite model." (production, 2026-09-04). Absent ⇒ 0 ⇒ the handle dims, the
3968
+ // `connectedReferences` assembly strips image tokens, and kie/video.ts never
3969
+ // flips a Quality call to REFERENCE_2_VIDEO.
3965
3970
  "veo3.1": { images: 3 },
3966
3971
  "veo3_lite": { images: 3 }
3967
3972
  // NOTE: wan-i2v / hailuo-2.3[-pro] / bytedance-pro[-fast] / grok-imagine-video-1.5
@@ -4189,8 +4194,23 @@ var VIDEO_VARIABLE_PRICING = {
4189
4194
  "wan-3-prime": "duration+resolution"
4190
4195
  };
4191
4196
  var PRICING_DEFAULT_DURATION_SEC = {
4192
- "minimax-h3": 6
4197
+ "minimax-h3": 6,
4198
+ // KIE renders 8s when `duration` is omitted (kie/models.ts extraParams), and
4199
+ // Seedance 2.5 prices one tier per second across 4–30s, so the 5s fallback
4200
+ // billed a 5s tier against an 8s render — and under-reserved every
4201
+ // reference-video run's output seconds by three (#1397).
4202
+ "seedance-2-5": 8,
4203
+ // Same shape: KIE renders 8s by default and the ladder is priced per second,
4204
+ // so the 5s fallback billed a 5s tier against an 8s render (caught by the
4205
+ // render-default ↔ priced-tier invariant in
4206
+ // backend/src/providers/__tests__/pricing-default-duration-sync.test.ts).
4207
+ "grok-imagine-video-1.5": 8
4193
4208
  };
4209
+ function pricedOutputDurationSec(provider, requested) {
4210
+ const fallback = PRICING_DEFAULT_DURATION_SEC[provider] ?? 5;
4211
+ const parsed = typeof requested === "string" ? parseInt(requested, 10) : requested;
4212
+ return parsed === void 0 || Number.isNaN(parsed) ? fallback : parsed;
4213
+ }
4194
4214
  var PRICING_DEFAULT_RESOLUTION = {
4195
4215
  // KIE renders 720p when `resolution` is omitted (kie/models.ts extraParams).
4196
4216
  "seedance-2-5": "720p",
@@ -4882,10 +4902,16 @@ function expandExtraRefsToConnectedReferences(extras, lookupCharacterContext) {
4882
4902
  }
4883
4903
 
4884
4904
  // src/credit-identifiers.ts
4905
+ function flux2MegapixelTier(model, resolution) {
4906
+ const bare = (v) => v.replace(/\s*MP$/i, "").trim();
4907
+ const raw = typeof resolution === "string" ? bare(resolution) : "";
4908
+ if (raw === "") return "1";
4909
+ const tier = FLUX2_RES_MP.find((t2) => Number(t2) === Number(raw));
4910
+ return tier ?? bare(defaultResolutionFor(model) ?? "1 MP");
4911
+ }
4885
4912
  function buildCreditModelIdentifier(provider, quality, resolution, renderingSpeed, targetResolution, referenceImageCount) {
4886
4913
  if (isFlux2Model(provider)) {
4887
- const mp = (resolution ?? "1 MP").replace(/\s*MP$/i, "").trim();
4888
- return `${provider}:${mp}MP:${Math.min(referenceImageCount ?? 0, 8)}ref`;
4914
+ return `${provider}:${flux2MegapixelTier(provider, resolution)}MP:${Math.min(referenceImageCount ?? 0, 8)}ref`;
4889
4915
  }
4890
4916
  if (HIGH_QUALITY_PROVIDERS.has(provider) && quality === "high") {
4891
4917
  return `${provider}:high`;
@@ -4991,9 +5017,7 @@ function buildVideoCreditModelIdentifier(provider, duration, sound, nodeType, mo
4991
5017
  if (!DURATION_PRICED_PROVIDERS.has(effectiveProvider)) {
4992
5018
  return effectiveProvider;
4993
5019
  }
4994
- const durationFallback = PRICING_DEFAULT_DURATION_SEC[effectiveProvider] ?? 5;
4995
- const parsed = typeof duration === "string" ? parseInt(duration, 10) : duration ?? durationFallback;
4996
- const durationSec = Number.isNaN(parsed) ? durationFallback : parsed;
5020
+ const durationSec = pricedOutputDurationSec(effectiveProvider, duration);
4997
5021
  const tiers = VIDEO_DURATION_TIERS[effectiveProvider];
4998
5022
  if (!tiers) return effectiveProvider;
4999
5023
  const tier = tiers.find((t2) => durationSec <= t2.maxSeconds) ?? tiers[tiers.length - 1];
@@ -5713,6 +5737,7 @@ var INPUT_FIELD_MAP = {
5713
5737
  "post-process-effects": { key: "postProcess", type: "select" },
5714
5738
  "action-fx": { key: "actionFx", type: "select" },
5715
5739
  "character-fx": { key: "characterFx", type: "select" },
5740
+ "character-motion": { key: "characterMotion", type: "select" },
5716
5741
  "transition": { key: "transition", type: "select" },
5717
5742
  "loop-subject": { key: "loopSubject", type: "select" },
5718
5743
  // --- Multi-dimension pickers: representative (first) field. Overriding only
@@ -8191,6 +8216,7 @@ var PARAMETER_NODE_TYPES = /* @__PURE__ */ new Set([
8191
8216
  "post-process-effects",
8192
8217
  "action-fx",
8193
8218
  "character-fx",
8219
+ "character-motion",
8194
8220
  "transition",
8195
8221
  "loop-subject",
8196
8222
  "scene-count",
@@ -8208,6 +8234,17 @@ var HINT_EXEMPT_PARAMETER_TYPES = /* @__PURE__ */ new Set([
8208
8234
  "duration",
8209
8235
  "aspect-ratio"
8210
8236
  ]);
8237
+ var VIDEO_ONLY_PARAMETER_NODE_TYPES = /* @__PURE__ */ new Set([
8238
+ "camera-motion",
8239
+ "temporal",
8240
+ "transition",
8241
+ "character-fx",
8242
+ "character-motion"
8243
+ ]);
8244
+ var EXECUTION_GRAPH_COMPOSED_PARAMETER_TYPES = /* @__PURE__ */ new Set([
8245
+ "camera-motion",
8246
+ "character-motion"
8247
+ ]);
8211
8248
  var registeredPersonPackFields = [];
8212
8249
  function setRegisteredPersonPackFields(fields) {
8213
8250
  registeredPersonPackFields = [...fields];
@@ -8250,6 +8287,8 @@ function getParameterValue(data, nodeType) {
8250
8287
  return trim(data.actionFx);
8251
8288
  case "character-fx":
8252
8289
  return trim(data.characterFx);
8290
+ case "character-motion":
8291
+ return trim(data.characterMotion);
8253
8292
  case "transition":
8254
8293
  return trim(data.transition);
8255
8294
  case "style":
@@ -13387,6 +13426,12 @@ var VOICE_CHANGER_MODEL_IDS = VOICE_CHANGER_MODELS.map(
13387
13426
  );
13388
13427
  var DEFAULT_VOICE_CHANGER_MODEL = "eleven_multilingual_sts_v2";
13389
13428
 
13429
+ // src/node-execution-state.ts
13430
+ var OUTPUT_BEARING_NODE_STATUSES = /* @__PURE__ */ new Set(["completed", "failed"]);
13431
+ function nodeStateMayCarryOutput(status) {
13432
+ return status !== void 0 && OUTPUT_BEARING_NODE_STATUSES.has(status);
13433
+ }
13434
+
13390
13435
  // src/normalize-node-params.ts
13391
13436
  var MODEL_PARAM_NODE_TYPES = /* @__PURE__ */ new Set([
13392
13437
  "generate-image",
@@ -14034,6 +14079,45 @@ function buildBoardPrompt(templateId, ctx) {
14034
14079
  return tpl.build(ctx);
14035
14080
  }
14036
14081
 
14082
+ // src/template-categories.ts
14083
+ var TEMPLATE_CATEGORIES = [
14084
+ "product-imagery",
14085
+ "static-ads",
14086
+ "user-generated-content",
14087
+ "video-ads",
14088
+ "brand-assets",
14089
+ "automations",
14090
+ "campaign-concepts",
14091
+ "social-creatives"
14092
+ ];
14093
+ var DEFAULT_TEMPLATE_CATEGORY = "automations";
14094
+ var LEGACY_TEMPLATE_CATEGORIES = {
14095
+ "image-generation": "product-imagery",
14096
+ "video-production": "video-ads",
14097
+ "audio-music": "social-creatives",
14098
+ "content-writing": "campaign-concepts",
14099
+ "social-media": "social-creatives",
14100
+ "data-processing": "automations",
14101
+ "multi-step": "automations",
14102
+ other: "automations"
14103
+ };
14104
+ var CURRENT = new Set(TEMPLATE_CATEGORIES);
14105
+ function isTemplateCategory(value) {
14106
+ return typeof value === "string" && CURRENT.has(value);
14107
+ }
14108
+ function resolveTemplateCategory(value) {
14109
+ if (value == null) return void 0;
14110
+ if (isTemplateCategory(value)) return value;
14111
+ return LEGACY_TEMPLATE_CATEGORIES[value];
14112
+ }
14113
+ function normalizeTemplateCategory(value) {
14114
+ return resolveTemplateCategory(value) ?? DEFAULT_TEMPLATE_CATEGORY;
14115
+ }
14116
+ function templateCategoryStoredValues(category) {
14117
+ const legacy = Object.keys(LEGACY_TEMPLATE_CATEGORIES).filter((value) => LEGACY_TEMPLATE_CATEGORIES[value] === category);
14118
+ return [category, ...legacy];
14119
+ }
14120
+
14037
14121
  // src/model-tree.ts
14038
14122
  var ENUM_TARGETS = [
14039
14123
  [IMAGE_GEN_PROVIDERS, "generate-image"],
@@ -16837,6 +16921,56 @@ function parseScene3DCameraTrackJson(text) {
16837
16921
  }
16838
16922
  return { ok: true, value: parsed.data };
16839
16923
  }
16924
+
16925
+ // src/scene3d-delivery-notes.ts
16926
+ var SCENE3D_AUTHORING_ASSUMPTION_CODE = "SCENE_AUTHORING_ASSUMPTION";
16927
+ var SCENE3D_REVIEW_REFUSED_CODE = "SCENE_REVIEW_REFUSED";
16928
+ var SCENE3D_REVIEW_UNAVAILABLE_CODE = "SCENE_REVIEW_UNAVAILABLE";
16929
+ var SCENE3D_REMEDY_AUTO_APPLIED_CODE = "REMEDY_AUTO_APPLIED";
16930
+ var SCENE3D_ASSERTION_RESTORED_CODE = "ASSERTION_RESTORED";
16931
+ var SCENE3D_REVIEW_UNAVAILABLE_REASONS = ["provider", "unusable"];
16932
+ function isScene3DReviewUnavailableReason(value) {
16933
+ return SCENE3D_REVIEW_UNAVAILABLE_REASONS.includes(value);
16934
+ }
16935
+ function scene3DReviewVerdictOf(output) {
16936
+ const review = output?.metadata?.review;
16937
+ if (typeof review !== "object" || review === null) return void 0;
16938
+ const candidate = review;
16939
+ if (candidate.verdict !== "refused" && candidate.verdict !== "unavailable") return void 0;
16940
+ const objections = (Array.isArray(candidate.objections) ? candidate.objections : []).flatMap((entry) => {
16941
+ if (typeof entry !== "object" || entry === null) return [];
16942
+ const objection = entry;
16943
+ if (typeof objection.what !== "string" || !objection.what) return [];
16944
+ const frames = (Array.isArray(objection.frames) ? objection.frames : []).filter((frame) => Number.isSafeInteger(frame) && frame >= 0);
16945
+ return [{
16946
+ category: typeof objection.category === "string" && objection.category ? objection.category : "unsupported",
16947
+ what: objection.what,
16948
+ ...typeof objection.correction === "string" && objection.correction ? { correction: objection.correction } : {},
16949
+ frames
16950
+ }];
16951
+ });
16952
+ const findings = {
16953
+ objections,
16954
+ ...typeof candidate.observed === "string" && candidate.observed ? { observed: candidate.observed } : {}
16955
+ };
16956
+ if (candidate.verdict === "refused") return { verdict: "refused", ...findings };
16957
+ const attempts = typeof candidate.attempts === "number" && Number.isSafeInteger(candidate.attempts) && candidate.attempts > 0 ? candidate.attempts : 1;
16958
+ const reason = isScene3DReviewUnavailableReason(candidate.reason) ? candidate.reason : "provider";
16959
+ return { verdict: "unavailable", reason, attempts, ...findings };
16960
+ }
16961
+ function scene3DReviewNote(verdict) {
16962
+ if (verdict.verdict === "unavailable") {
16963
+ const asked = verdict.attempts === 1 ? "one attempt" : `${verdict.attempts} attempts`;
16964
+ const partial = verdict.objections.length ? ` Part of the review did answer first, and its ${verdict.objections.length === 1 ? "one finding is" : `${verdict.objections.length} findings are`} listed \u2014 but they are not the whole verdict.` : "";
16965
+ const missing = verdict.reason === "unusable" ? `returned no usable verdict in ${asked}` : `did not reach its provider in ${asked}`;
16966
+ return `The scene built and every mandatory assertion passed, but the visual review ${missing}; it was delivered unreviewed.${partial}`;
16967
+ }
16968
+ const count = verdict.objections.length;
16969
+ if (!count) {
16970
+ return "The visual review refused this scene without naming anything to change; it was delivered anyway because every mandatory assertion passed.";
16971
+ }
16972
+ return `The visual review refused this scene on ${count === 1 ? "one finding" : `${count} findings`}; it was delivered anyway because every mandatory assertion passed.`;
16973
+ }
16840
16974
  var scene3DInputAssetSchema = zod.z.object({
16841
16975
  id: zod.z.string().regex(/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$/),
16842
16976
  revisionId: zod.z.uuid(),
@@ -16907,6 +17041,26 @@ var pro3DRenderQuoteSchema = zod.z.object({
16907
17041
  function isPro3DRenderQuote(value) {
16908
17042
  return pro3DRenderQuoteSchema.safeParse(value).success;
16909
17043
  }
17044
+ var pro3DRenderReviewFindingsShape = {
17045
+ objections: zod.z.array(
17046
+ zod.z.object({
17047
+ category: zod.z.string(),
17048
+ what: zod.z.string(),
17049
+ correction: zod.z.string().optional(),
17050
+ frames: zod.z.array(zod.z.number().int().min(0)).default([])
17051
+ }).passthrough()
17052
+ ),
17053
+ observed: zod.z.string().optional()
17054
+ };
17055
+ var pro3DRenderReviewVerdictSchema = zod.z.union([
17056
+ zod.z.object({ verdict: zod.z.literal("refused"), ...pro3DRenderReviewFindingsShape }).passthrough(),
17057
+ zod.z.object({
17058
+ verdict: zod.z.literal("unavailable"),
17059
+ reason: zod.z.enum(SCENE3D_REVIEW_UNAVAILABLE_REASONS).catch("provider"),
17060
+ attempts: zod.z.number().int().min(1).catch(1),
17061
+ ...pro3DRenderReviewFindingsShape
17062
+ }).passthrough()
17063
+ ]);
16910
17064
  var pro3DRenderShotStillSchema = zod.z.object({
16911
17065
  shotIndex: zod.z.number().int().min(0),
16912
17066
  frame: zod.z.number().int().min(0),
@@ -16937,8 +17091,34 @@ var pro3DRenderJobOutputSchema = zod.z.object({
16937
17091
  height: zod.z.number().int().positive(),
16938
17092
  fps: zod.z.number().positive(),
16939
17093
  frames: zod.z.number().int().positive(),
16940
- duration: zod.z.number().positive()
17094
+ duration: zod.z.number().positive(),
17095
+ summary: zod.z.string().optional(),
17096
+ /**
17097
+ * Degrades to absent rather than refusing the RESULT, which is the whole lesson of the
17098
+ * verdict this round added. A narrow `verdict` here did not merely mis-read an unreviewed
17099
+ * delivery — it failed `isPro3DRenderJobOutput` for the entire job, blanking a real,
17100
+ * paid, playable MP4 over an advisory field. A verdict a future engine invents must cost
17101
+ * at most itself; the `SCENE_REVIEW_*` entry in `validation.warnings[]` still arrives
17102
+ * either way, because that array has no code enum.
17103
+ */
17104
+ review: pro3DRenderReviewVerdictSchema.optional().catch(void 0)
16941
17105
  }).passthrough(),
17106
+ repairPasses: zod.z.number().int().min(0).optional(),
17107
+ admissionRetries: zod.z.number().int().min(0).optional(),
17108
+ mechanicalPasses: zod.z.number().int().min(0).optional(),
17109
+ // Tolerant like the review verdict above, and for the same reason: this rides a result that
17110
+ // already has a real MP4, so a malformed entry must never blank a video the platform rendered
17111
+ // and charged for. The identity fields are required because an entry without them names
17112
+ // nothing; `value` is unknown because a restored assertion holds whatever it holds.
17113
+ restoredAssertions: zod.z.array(
17114
+ zod.z.object({
17115
+ op: zod.z.string(),
17116
+ path: zod.z.string(),
17117
+ value: zod.z.unknown().optional(),
17118
+ assertionId: zod.z.string(),
17119
+ reason: zod.z.string()
17120
+ }).passthrough()
17121
+ ).optional(),
16942
17122
  changeSummary: zod.z.string().optional()
16943
17123
  }).passthrough();
16944
17124
  function isPro3DRenderJobOutput(value) {
@@ -17411,6 +17591,7 @@ exports.DEFAULT_PANEL_COUNT = DEFAULT_PANEL_COUNT;
17411
17591
  exports.DEFAULT_REF_IMAGE_MAX = DEFAULT_REF_IMAGE_MAX;
17412
17592
  exports.DEFAULT_SECTIONS = DEFAULT_SECTIONS;
17413
17593
  exports.DEFAULT_SUNO_MODEL = DEFAULT_SUNO_MODEL;
17594
+ exports.DEFAULT_TEMPLATE_CATEGORY = DEFAULT_TEMPLATE_CATEGORY;
17414
17595
  exports.DEFAULT_USAGE_MODE = DEFAULT_USAGE_MODE;
17415
17596
  exports.DEFAULT_VIDEO_ANALYSIS_MODEL = DEFAULT_VIDEO_ANALYSIS_MODEL;
17416
17597
  exports.DEFAULT_VIDEO_ANALYSIS_TIER = DEFAULT_VIDEO_ANALYSIS_TIER;
@@ -17439,6 +17620,7 @@ exports.ENTITY_TABLE = ENTITY_TABLE;
17439
17620
  exports.ENTITY_TOOL_RETRY_CAP = ENTITY_TOOL_RETRY_CAP;
17440
17621
  exports.ENTITY_TYPES = ENTITY_TYPES;
17441
17622
  exports.EXECUTION_DATA_KEYS = EXECUTION_DATA_KEYS;
17623
+ exports.EXECUTION_GRAPH_COMPOSED_PARAMETER_TYPES = EXECUTION_GRAPH_COMPOSED_PARAMETER_TYPES;
17442
17624
  exports.EXTEND_VIDEO_PROVIDERS = EXTEND_VIDEO_PROVIDERS;
17443
17625
  exports.EntityMetadataSchema = EntityMetadataSchema;
17444
17626
  exports.EntityRejectInputSchema = EntityRejectInputSchema;
@@ -17513,6 +17695,7 @@ exports.KEYFRAME_CREDITS_PER_SHOT = KEYFRAME_CREDITS_PER_SHOT;
17513
17695
  exports.KINETIC_CAPTION_STYLES = KINETIC_CAPTION_STYLES;
17514
17696
  exports.LANGUAGES = LANGUAGES;
17515
17697
  exports.LEGACY_LOTTIE_HOST_REMAP = LEGACY_LOTTIE_HOST_REMAP;
17698
+ exports.LEGACY_TEMPLATE_CATEGORIES = LEGACY_TEMPLATE_CATEGORIES;
17516
17699
  exports.LIP_SYNC_DURATION_BUCKETS = LIP_SYNC_DURATION_BUCKETS;
17517
17700
  exports.LIP_SYNC_MAX_AUDIO_SECONDS = LIP_SYNC_MAX_AUDIO_SECONDS;
17518
17701
  exports.LIP_SYNC_PROVIDERS = LIP_SYNC_PROVIDERS;
@@ -17552,6 +17735,7 @@ exports.MINIMAX_H3_DEFAULT_RESOLUTION = MINIMAX_H3_DEFAULT_RESOLUTION;
17552
17735
  exports.MINIMAX_H3_PROVIDERS = MINIMAX_H3_PROVIDERS;
17553
17736
  exports.MODELS_WITH_REFERENCE_IMAGE_SUPPORT = MODELS_WITH_REFERENCE_IMAGE_SUPPORT;
17554
17737
  exports.MODEL_CATALOG = MODEL_CATALOG;
17738
+ exports.MODEL_KINDS = MODEL_KINDS;
17555
17739
  exports.MODEL_PARAM_NODE_TYPES = MODEL_PARAM_NODE_TYPES;
17556
17740
  exports.MODEL_RECOMMENDATIONS = MODEL_RECOMMENDATIONS;
17557
17741
  exports.MODIFY_IMAGE_PROVIDERS = MODIFY_IMAGE_PROVIDERS;
@@ -17584,6 +17768,7 @@ exports.ORG_ERROR_CODES = ORG_ERROR_CODES;
17584
17768
  exports.ORG_KINDS = ORG_KINDS;
17585
17769
  exports.ORG_ROLES = ORG_ROLES;
17586
17770
  exports.ORG_STATUSES = ORG_STATUSES;
17771
+ exports.OUTPUT_BEARING_NODE_STATUSES = OUTPUT_BEARING_NODE_STATUSES;
17587
17772
  exports.OUTPUT_FIELD_MAP = OUTPUT_FIELD_MAP;
17588
17773
  exports.OUTPUT_FORMATS = OUTPUT_FORMATS;
17589
17774
  exports.OVERLAY_ANCHORS = OVERLAY_ANCHORS;
@@ -17676,9 +17861,11 @@ exports.REPEATABLE_NODE_TYPES = REPEATABLE_NODE_TYPES;
17676
17861
  exports.REPEAT_PLACEHOLDER = REPEAT_PLACEHOLDER;
17677
17862
  exports.REPLICATE_LIP_SYNC_PROVIDERS = REPLICATE_LIP_SYNC_PROVIDERS;
17678
17863
  exports.RESERVED_TEMPLATE_VARS = RESERVED_TEMPLATE_VARS;
17864
+ exports.SCENE3D_ASSERTION_RESTORED_CODE = SCENE3D_ASSERTION_RESTORED_CODE;
17679
17865
  exports.SCENE3D_ASSET_KINDS = SCENE3D_ASSET_KINDS;
17680
17866
  exports.SCENE3D_ASSET_ROLES = SCENE3D_ASSET_ROLES;
17681
17867
  exports.SCENE3D_ASSET_ROLE_KINDS = SCENE3D_ASSET_ROLE_KINDS;
17868
+ exports.SCENE3D_AUTHORING_ASSUMPTION_CODE = SCENE3D_AUTHORING_ASSUMPTION_CODE;
17682
17869
  exports.SCENE3D_AUTHORING_ENGINES = SCENE3D_AUTHORING_ENGINES;
17683
17870
  exports.SCENE3D_BASIC_ENGINE = SCENE3D_BASIC_ENGINE;
17684
17871
  exports.SCENE3D_BASIC_SCHEMA_VERSION = SCENE3D_BASIC_SCHEMA_VERSION;
@@ -17703,11 +17890,15 @@ exports.SCENE3D_PLAN_FIELD = SCENE3D_PLAN_FIELD;
17703
17890
  exports.SCENE3D_PLAN_TYPE = SCENE3D_PLAN_TYPE;
17704
17891
  exports.SCENE3D_PRIMITIVES = SCENE3D_PRIMITIVES;
17705
17892
  exports.SCENE3D_PRIMITIVE_MATERIAL_ROLE = SCENE3D_PRIMITIVE_MATERIAL_ROLE;
17893
+ exports.SCENE3D_REMEDY_AUTO_APPLIED_CODE = SCENE3D_REMEDY_AUTO_APPLIED_CODE;
17706
17894
  exports.SCENE3D_RENDERER_ASSET_KINDS = SCENE3D_RENDERER_ASSET_KINDS;
17707
17895
  exports.SCENE3D_RENDER_BASE_MAX_PX = SCENE3D_RENDER_BASE_MAX_PX;
17708
17896
  exports.SCENE3D_RENDER_TIERS = SCENE3D_RENDER_TIERS;
17709
17897
  exports.SCENE3D_RENDER_TIER_MULTIPLIERS = SCENE3D_RENDER_TIER_MULTIPLIERS;
17710
17898
  exports.SCENE3D_RENDER_XLARGE_MIN_AREA_PX = SCENE3D_RENDER_XLARGE_MIN_AREA_PX;
17899
+ exports.SCENE3D_REVIEW_REFUSED_CODE = SCENE3D_REVIEW_REFUSED_CODE;
17900
+ exports.SCENE3D_REVIEW_UNAVAILABLE_CODE = SCENE3D_REVIEW_UNAVAILABLE_CODE;
17901
+ exports.SCENE3D_REVIEW_UNAVAILABLE_REASONS = SCENE3D_REVIEW_UNAVAILABLE_REASONS;
17711
17902
  exports.SCENE3D_SCHEMA_VERSION = SCENE3D_SCHEMA_VERSION;
17712
17903
  exports.SCENE3D_SCHEMA_VERSION_V2 = SCENE3D_SCHEMA_VERSION_V2;
17713
17904
  exports.SCENE3D_SUPPORTED_SCHEMA_VERSIONS = SCENE3D_SUPPORTED_SCHEMA_VERSIONS;
@@ -17788,6 +17979,7 @@ exports.StyleDirectivesSchema = StyleDirectivesSchema;
17788
17979
  exports.SubGateNameSchema = SubGateNameSchema;
17789
17980
  exports.T2I_TO_I2I_VARIANT = T2I_TO_I2I_VARIANT;
17790
17981
  exports.TASK_CHAINED_EDIT_PROVIDERS = TASK_CHAINED_EDIT_PROVIDERS;
17982
+ exports.TEMPLATE_CATEGORIES = TEMPLATE_CATEGORIES;
17791
17983
  exports.TEXT_TO_AUDIO_PROVIDERS = TEXT_TO_AUDIO_PROVIDERS;
17792
17984
  exports.TEXT_TO_VIDEO_PROVIDERS = TEXT_TO_VIDEO_PROVIDERS;
17793
17985
  exports.TIER_MAX_PIPELINE_COST_CREDITS = TIER_MAX_PIPELINE_COST_CREDITS;
@@ -17850,6 +18042,7 @@ exports.VIDEO_GEN_PROVIDERS = VIDEO_GEN_PROVIDERS;
17850
18042
  exports.VIDEO_INPUT_LIP_SYNC_PROVIDERS = VIDEO_INPUT_LIP_SYNC_PROVIDERS;
17851
18043
  exports.VIDEO_MODEL_CAPS = VIDEO_MODEL_CAPS;
17852
18044
  exports.VIDEO_MODE_ALIASES = VIDEO_MODE_ALIASES;
18045
+ exports.VIDEO_ONLY_PARAMETER_NODE_TYPES = VIDEO_ONLY_PARAMETER_NODE_TYPES;
17853
18046
  exports.VIDEO_PRODUCER_TYPES = VIDEO_PRODUCER_TYPES;
17854
18047
  exports.VIDEO_PROMPT_MAX = VIDEO_PROMPT_MAX;
17855
18048
  exports.VIDEO_PROVIDERS_REQUIRING_IMAGE = VIDEO_PROVIDERS_REQUIRING_IMAGE;
@@ -18043,6 +18236,7 @@ exports.getVideoAudioCapability = getVideoAudioCapability;
18043
18236
  exports.getWeapon = getWeapon;
18044
18237
  exports.getWeaponLabel = getWeaponLabel;
18045
18238
  exports.groupByFamily = groupByFamily;
18239
+ exports.groupByKindAndFamily = groupByKindAndFamily;
18046
18240
  exports.groupHandleId = groupHandleId;
18047
18241
  exports.groupLlmModelsByVendor = groupLlmModelsByVendor;
18048
18242
  exports.hasContiguousSegmentDurations = hasContiguousSegmentDurations;
@@ -18083,9 +18277,11 @@ exports.isScene3DHttpUrl = isScene3DHttpUrl;
18083
18277
  exports.isScene3DPlan = isScene3DPlan;
18084
18278
  exports.isScene3DPlanV1 = isScene3DPlanV1;
18085
18279
  exports.isScene3DPlanV2 = isScene3DPlanV2;
18280
+ exports.isScene3DReviewUnavailableReason = isScene3DReviewUnavailableReason;
18086
18281
  exports.isScene3DSchemaVersionSupported = isScene3DSchemaVersionSupported;
18087
18282
  exports.isScraperActor = isScraperActor;
18088
18283
  exports.isSeedance2Provider = isSeedance2Provider;
18284
+ exports.isTemplateCategory = isTemplateCategory;
18089
18285
  exports.isTiltDirection = isTiltDirection;
18090
18286
  exports.isUsageMode = isUsageMode;
18091
18287
  exports.isVeoProvider = isVeoProvider;
@@ -18119,12 +18315,14 @@ exports.modelsForInputMode = modelsForInputMode;
18119
18315
  exports.modelsWithFeature = modelsWithFeature;
18120
18316
  exports.motionGraphicsFeature = motionGraphicsFeature;
18121
18317
  exports.newScene3DRevisionId = newScene3DRevisionId;
18318
+ exports.nodeStateMayCarryOutput = nodeStateMayCarryOutput;
18122
18319
  exports.normalizeLottieLayers = normalizeLottieLayers;
18123
18320
  exports.normalizeMinimaxH3Resolution = normalizeMinimaxH3Resolution;
18124
18321
  exports.normalizeModelInput = normalizeModelInput;
18125
18322
  exports.normalizeNodeModelParams = normalizeNodeModelParams;
18126
18323
  exports.normalizePinterestUrl = normalizePinterestUrl;
18127
18324
  exports.normalizeRoleSlug = normalizeRoleSlug;
18325
+ exports.normalizeTemplateCategory = normalizeTemplateCategory;
18128
18326
  exports.normalizeVideoRequestParams = normalizeVideoRequestParams;
18129
18327
  exports.normalizeWan3Resolution = normalizeWan3Resolution;
18130
18328
  exports.orderedLlmModels = orderedLlmModels;
@@ -18162,12 +18360,14 @@ exports.presentTypes = presentTypes;
18162
18360
  exports.presetApplyClearKeys = presetApplyClearKeys;
18163
18361
  exports.presetDataMatches = presetDataMatches;
18164
18362
  exports.presetEntries = presetEntries;
18363
+ exports.pricedOutputDurationSec = pricedOutputDurationSec;
18165
18364
  exports.pricedVideoSelection = pricedVideoSelection;
18166
18365
  exports.pro3DRenderCoreOutputSchema = pro3DRenderCoreOutputSchema;
18167
18366
  exports.pro3DRenderFrameUnit = pro3DRenderFrameUnit;
18168
18367
  exports.pro3DRenderJobOutputSchema = pro3DRenderJobOutputSchema;
18169
18368
  exports.pro3DRenderProducedSchemaVersion = pro3DRenderProducedSchemaVersion;
18170
18369
  exports.pro3DRenderQuoteSchema = pro3DRenderQuoteSchema;
18370
+ exports.pro3DRenderReviewVerdictSchema = pro3DRenderReviewVerdictSchema;
18171
18371
  exports.pro3DRenderShotStillSchema = pro3DRenderShotStillSchema;
18172
18372
  exports.pro3DRenderShotStills = pro3DRenderShotStills;
18173
18373
  exports.pro3DRenderTimingOverrides = pro3DRenderTimingOverrides;
@@ -18218,6 +18418,7 @@ exports.resolveSlideshowTransition = resolveSlideshowTransition;
18218
18418
  exports.resolveSourceThroughConnectedList = resolveSourceThroughConnectedList;
18219
18419
  exports.resolveStoredTier = resolveStoredTier;
18220
18420
  exports.resolveSwitchXCreditId = resolveSwitchXCreditId;
18421
+ exports.resolveTemplateCategory = resolveTemplateCategory;
18221
18422
  exports.resolveTopazUpscale = resolveTopazUpscale;
18222
18423
  exports.resolveVideoAnalysisModel = resolveVideoAnalysisModel;
18223
18424
  exports.resolveVideoModeForInputs = resolveVideoModeForInputs;
@@ -18290,6 +18491,8 @@ exports.scene3DProvenanceSchema = scene3DProvenanceSchema;
18290
18491
  exports.scene3DReferenceSchema = scene3DReferenceSchema;
18291
18492
  exports.scene3DRenderTier = scene3DRenderTier;
18292
18493
  exports.scene3DRenderTierCredits = scene3DRenderTierCredits;
18494
+ exports.scene3DReviewNote = scene3DReviewNote;
18495
+ exports.scene3DReviewVerdictOf = scene3DReviewVerdictOf;
18293
18496
  exports.scene3DSampleForFrame = scene3DSampleForFrame;
18294
18497
  exports.scene3DSha256Schema = scene3DSha256Schema;
18295
18498
  exports.scene3DShotForFrame = scene3DShotForFrame;
@@ -18337,6 +18540,7 @@ exports.supportedDefaultDimensions = supportedDefaultDimensions;
18337
18540
  exports.supportsAdvancedMode = supportsAdvancedMode;
18338
18541
  exports.supportsEndAnchor = supportsEndAnchor;
18339
18542
  exports.supportsExtendRender = supportsExtendRender;
18543
+ exports.templateCategoryStoredValues = templateCategoryStoredValues;
18340
18544
  exports.toConnectedReference = toConnectedReference;
18341
18545
  exports.toConnectedReferences = toConnectedReferences;
18342
18546
  exports.togglePick = togglePick;