@productmaker/mcp 8.9.2 → 8.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.
package/README.md CHANGED
@@ -283,6 +283,12 @@ The `base64` field was removed. MCP JSON-RPC transports truncate large tool argu
283
283
 
284
284
  ## Version history
285
285
 
286
+ ### 8.10.0 — Familia storyteller bloqueada
287
+
288
+ - `create_product_task`, `generate_video_creative`, `create_creative_variant` y `regenerate_video_script` ya no ofrecen los presets `storyteller`, `inner_journey`, `object_soul` y `timeline` ni las narrativas `animated_storyteller`, `animated_inner_journey`, `animated_object_soul` y `animated_timeline`; la API también las rechaza con 400 (bloqueo temporal por calidad). `animationStyle` aplica solo a `pixar_problem` y `pixar_sassy`.
289
+ - `resolve_pending_action` sigue aprobando tareas creadas antes del bloqueo que ya llevan una de esas narrativas, y `create_creative_variant` sobre ellas usa UGC Review en lugar de heredar la narrativa bloqueada.
290
+ - `regenerate_video_script` de una tarea storyteller previa al bloqueo exige elegir otra narrativa.
291
+
286
292
  ### 8.9.2 — Shopify Meta controls and synchronized MCP release metadata
287
293
 
288
294
  Per-store Meta controls remain available in Integrations. This patch retains the 8.9.0 commerce-verification and publishing contracts; the Meta settings introduce no additional MCP tools.
package/dist/http.js CHANGED
@@ -48,6 +48,18 @@ var NarrativeStyle = z.enum([
48
48
  "animated_object_soul",
49
49
  "animated_timeline"
50
50
  ]);
51
+ var BLOCKED_NARRATIVE_STYLES = [
52
+ "animated_storyteller",
53
+ "animated_inner_journey",
54
+ "animated_object_soul",
55
+ "animated_timeline"
56
+ ];
57
+ var BLOCKED_VIDEO_PRESETS = [
58
+ "storyteller",
59
+ "inner_journey",
60
+ "object_soul",
61
+ "timeline"
62
+ ];
51
63
  var AnimationStyleSchema = z.enum([
52
64
  "pixar_3d",
53
65
  "claymation",
@@ -3829,6 +3841,7 @@ var LandingPatchSchema = z21.object({
3829
3841
  }
3830
3842
  });
3831
3843
  });
3844
+ var MAX_CODE_LANDING_ARTIFACT_ASSETS = 96;
3832
3845
  var CodeLandingArtifactSchema = z21.object({
3833
3846
  schemaVersion: z21.literal(CODE_LANDING_SCHEMA_VERSION),
3834
3847
  runtimeVersion: z21.literal(CODE_LANDING_RUNTIME_VERSION),
@@ -3840,7 +3853,7 @@ var CodeLandingArtifactSchema = z21.object({
3840
3853
  document: CodeLandingDocumentSchema,
3841
3854
  blocks: z21.array(CodeLandingBlockSchema).min(1).max(32),
3842
3855
  anchors: z21.array(CodeLandingAnchorSchema).min(1).max(64),
3843
- assets: z21.array(CodeLandingAssetSchema).max(96),
3856
+ assets: z21.array(CodeLandingAssetSchema).max(MAX_CODE_LANDING_ARTIFACT_ASSETS),
3844
3857
  components: z21.array(ComponentManifestEntrySchema).max(64),
3845
3858
  interactions: z21.array(InteractionProgramSchema).max(64),
3846
3859
  protectedBindings: z21.array(ProtectedBindingSchema).max(128),
@@ -6275,7 +6288,8 @@ var TaskCreativeVariantVideoPreset = VideoPreset.exclude([
6275
6288
  "ugc_curiosity_reveal",
6276
6289
  "ugc_listicle_3",
6277
6290
  "ugc_skeptic_confession",
6278
- "metaphor_product"
6291
+ "metaphor_product",
6292
+ ...BLOCKED_VIDEO_PRESETS
6279
6293
  ]);
6280
6294
  var CreateTaskCreativeVariantBase = z33.object({
6281
6295
  clientRequestId: z33.string().uuid(),
@@ -14342,7 +14356,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14342
14356
  defineCapability(
14343
14357
  "create_creative_variant",
14344
14358
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14345
- "db6d98e9e07d57dd1a78d9b73cdbfdaa7ee7a6ae4dff30d1bd2b3edf3225cd0d",
14359
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14360
+ "3e02399a7785df328f1c4d63cfbb6d7481abaac9f91d4a5cf51d410e657d63aa",
14346
14361
  "credit_consuming",
14347
14362
  "creative",
14348
14363
  [
@@ -14397,7 +14412,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14397
14412
  // default). Recomputed from the real tools/list digest printer.
14398
14413
  // + market study opt-in copy (#2005, competitorScanEnabled description).
14399
14414
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14400
- "46b308923121dac1023b55f68b61dfbf4e89f682bdd48b04d4d0f8a3667f8999",
14415
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14416
+ "d5f2fd2f2d3687ce41acac9b5c44bdf5a5c3d542cbfdafcf5759c35f9320140f",
14401
14417
  "credit_consuming",
14402
14418
  "creative",
14403
14419
  [
@@ -14583,7 +14599,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14583
14599
  ], [
14584
14600
  "task_draft"
14585
14601
  ]),
14586
- defineCapability("estimate_creative_variant", "055a92336bfb773c14e3f7018368b4490404ebcb3e607f78d5e0d5c0e78254b8", "none", "read_only", [
14602
+ defineCapability("estimate_creative_variant", "d4453364c0706bf88f480cebc977916f06d222d7eebebc9cfa91165929a1a998", "none", "read_only", [
14587
14603
  "read"
14588
14604
  ], [
14589
14605
  slot("source_task", true, [
@@ -14915,7 +14931,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14915
14931
  defineCapability(
14916
14932
  "generate_video_creative",
14917
14933
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14918
- "5545b24de7b344c9184cfe087a39b766490526a432d8b288c02c2e9a20529c3d",
14934
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14935
+ "932a153afe51975abe3b601530f17178ed8ddd56a6f8116877bc4caab4fc6a9d",
14919
14936
  "credit_consuming",
14920
14937
  "creative",
14921
14938
  [
@@ -15358,7 +15375,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
15358
15375
  ], [
15359
15376
  "product_media"
15360
15377
  ], MCP_ONLY_CHANNEL_EXPOSURE),
15361
- defineCapability("regenerate_video_script", "198903f5d89b245daedde4e08020a6d536f2ea354f5924176253b71c84241859", "credit_consuming", "creative", [
15378
+ defineCapability("regenerate_video_script", "eb9546e5cda3864de78ff119ae81dd17c893ea9ea5be1bf0fbfeb8b45302e639", "credit_consuming", "creative", [
15362
15379
  "credit_consuming",
15363
15380
  "state_change"
15364
15381
  ], [
@@ -15421,7 +15438,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
15421
15438
  ], [
15422
15439
  "media_upload_session"
15423
15440
  ], MCP_ONLY_CHANNEL_EXPOSURE),
15424
- defineCapability("resolve_pending_action", "7d76b53ebce3265a751836e61f6959debd98bd8159291ef73437e1b7a0824333", "credit_consuming", "creative", [
15441
+ defineCapability("resolve_pending_action", "9377ff126ec842cfb8278877846c5f8f6f1b9ba0c263e7200f080db9bbe9ae12", "credit_consuming", "creative", [
15425
15442
  "credit_consuming",
15426
15443
  "state_change"
15427
15444
  ], [
@@ -15942,7 +15959,10 @@ var MCP_DOWNSTREAM_CLIENT_VALUE = "mcp";
15942
15959
 
15943
15960
  // ../../packages/types/src/mcp-surface.ts
15944
15961
  var MCP_HIDDEN_NARRATIVE_STYLES = [
15945
- "gap_replication"
15962
+ "gap_replication",
15963
+ // The blocked storyteller family is not offered, not even when revising an
15964
+ // existing script.
15965
+ ...BLOCKED_NARRATIVE_STYLES
15946
15966
  ];
15947
15967
  var McpNarrativeStyleSchema = NarrativeStyle.exclude(MCP_HIDDEN_NARRATIVE_STYLES);
15948
15968
  var MCP_ANGLE_NARRATIVE_STYLES = [
@@ -15956,10 +15976,6 @@ var MCP_ANGLE_NARRATIVE_STYLES = [
15956
15976
  "wild_card",
15957
15977
  "animated_problem_pixar",
15958
15978
  "sassy_product_pixar",
15959
- "animated_storyteller",
15960
- "animated_inner_journey",
15961
- "animated_object_soul",
15962
- "animated_timeline",
15963
15979
  "market"
15964
15980
  ];
15965
15981
  var McpAngleNarrativeStyleSchema = NarrativeStyle.extract(MCP_ANGLE_NARRATIVE_STYLES);
@@ -18930,7 +18946,7 @@ var ApiClient = class {
18930
18946
  };
18931
18947
 
18932
18948
  // src/index.ts
18933
- var MCP_VERSION = "8.9.2";
18949
+ var MCP_VERSION = "8.10.0";
18934
18950
 
18935
18951
  // src/meta-upload-app.ts
18936
18952
  import { readFileSync } from "fs";
@@ -19579,11 +19595,7 @@ var VideoPresetEnum = VideoPreset.extract([
19579
19595
  "cinematic",
19580
19596
  "wild_card",
19581
19597
  "pixar_problem",
19582
- "pixar_sassy",
19583
- "storyteller",
19584
- "inner_journey",
19585
- "object_soul",
19586
- "timeline"
19598
+ "pixar_sassy"
19587
19599
  ]);
19588
19600
  var VideoStructureEnum = VideoStructure;
19589
19601
  var VideoQualityEnum = VideoQuality;
@@ -21374,8 +21386,8 @@ var CreateProductTaskInput = z83.object({
21374
21386
  paymentMethods: z83.string().min(1).max(240).optional().describe('Opcional. M\xE9todos de pago que puede mostrar la landing. Ej. "Tarjeta, PSE, Nequi, Contraentrega". Si se omite, la landing no muestra m\xE9todos de pago.'),
21375
21387
  productContext: z83.string().max(PRODUCT_CONTEXT_MAX_CHARS).optional().describe("Opcional. Informacion adicional del producto que la IA debe usar como contexto prioritario: uso real, comprador, restricciones, diferenciadores o direccion creativa. No reemplaza la investigacion de competencia; si hay competencia, guia el primer angulo y los outputs no deben contradecirlo."),
21376
21388
  productLabel: z83.string().trim().max(80).optional().describe('Opcional. Qu\xE9 es el producto, en pocas palabras (ej. "quita pelusas para ropa"). Es AUTORITATIVO: si lo env\xEDas, la IA usa esta identidad y no la reemplaza por otra categor\xEDa. Si lo omites, la IA detecta el producto desde la imagen.'),
21377
- videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla. Default "auto" (la IA escoge tras analizar el producto). Todos los presets funcionan a 15s (single_call) y 30s (Multiescena); "problem_solution" en single_call abre sin el producto y el producto entra por referencia en su beat de soluci\xF3n. Opciones: "auto", "ugc_dynamic" (review con experiencia y prueba), "ugc_how_to" (tutorial con pasos y resultado visible), "ugc_unboxing_chaos" (apertura y primera prueba), "problem_solution" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase" (producto ejecutando una funci\xF3n real), "wearable_showcase" (prenda o accesorio modelado), "cinematic" (TV spot con receta cinematogr\xE1fica), "wild_card" (idea imposible: un truco visual que en la vida real no podr\xEDa pasar, y al cierre la invitaci\xF3n a comprar), "pixar_problem" (problema animado 3D), "pixar_sassy" (producto que habla), "storyteller" (narrador animado + met\xE1fora visual), "inner_journey" (la c\xE1mara entra al interior del problema), "object_soul" (un objeto cotidiano con alma silenciosa), "timeline" (el mismo encuadre a trav\xE9s de \xE9pocas). Si el usuario pide algo fuera de esta lista, p\xEDdele una opci\xF3n v\xE1lida.'),
21378
- animationStyle: AnimationStyleEnum.optional().describe('Opcional. Estilo visual SOLO para presets animados ("pixar_problem", "pixar_sassy", "storyteller", "inner_journey", "object_soul" o "timeline") \u2014 la API lo rechaza con cualquier otro preset. Opciones: "pixar_3d" (default, look 3D de pel\xEDcula animada), "claymation" (plastilina stop-motion artesanal), "wes_anderson" (tableau sim\xE9trico pastel), "sci_fi" (futurista con HUDs y ne\xF3n), "realista" (fotorrealista, fiel al producto). Si el usuario pide un look animado sin nombrar el estilo, omite el campo.'),
21389
+ videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla. Default "auto" (la IA escoge tras analizar el producto). Todos los presets funcionan a 15s (single_call) y 30s (Multiescena); "problem_solution" en single_call abre sin el producto y el producto entra por referencia en su beat de soluci\xF3n. Opciones: "auto", "ugc_dynamic" (review con experiencia y prueba), "ugc_how_to" (tutorial con pasos y resultado visible), "ugc_unboxing_chaos" (apertura y primera prueba), "problem_solution" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase" (producto ejecutando una funci\xF3n real), "wearable_showcase" (prenda o accesorio modelado), "cinematic" (TV spot con receta cinematogr\xE1fica), "wild_card" (idea imposible: un truco visual que en la vida real no podr\xEDa pasar, y al cierre la invitaci\xF3n a comprar), "pixar_problem" (problema animado 3D), "pixar_sassy" (producto que habla). Si el usuario pide algo fuera de esta lista, p\xEDdele una opci\xF3n v\xE1lida.'),
21390
+ animationStyle: AnimationStyleEnum.optional().describe('Opcional. Estilo visual SOLO para presets animados ("pixar_problem" o "pixar_sassy") \u2014 la API lo rechaza con cualquier otro preset. Opciones: "pixar_3d" (default, look 3D de pel\xEDcula animada), "claymation" (plastilina stop-motion artesanal), "wes_anderson" (tableau sim\xE9trico pastel), "sci_fi" (futurista con HUDs y ne\xF3n), "realista" (fotorrealista, fiel al producto). Si el usuario pide un look animado sin nombrar el estilo, omite el campo.'),
21379
21391
  durationSeconds: z83.union([
21380
21392
  z83.literal(15),
21381
21393
  z83.literal(30)
@@ -21387,7 +21399,7 @@ var CreateProductTaskInput = z83.object({
21387
21399
  videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El proveedor se elige internamente. Default: economy.'),
21388
21400
  videoResolution: VideoResolutionEnum.optional().describe('Opcional. Resoluci\xF3n del render. En la web se pregunta "\xBFResoluci\xF3n del video?". "480p" = excelente calidad y m\xE1s econ\xF3mico (RECOMENDADO, default si se omite); "720p" = m\xE1xima nitidez, entre 3% y 15% m\xE1s caro seg\xFAn formato y tier. Si el usuario no menciona resoluci\xF3n, OMITE este campo (el backend usa 480p).'),
21389
21401
  videoAngleCount: z83.number().int().min(1).max(3).optional().describe("Cantidad de videos a renderizar: 1, 2 o 3. REQUERIDO cuando outputs incluye video (o se omite outputs, cuyo default incluye video); om\xEDtelo s\xF3lo cuando no se generar\xE1 video. Preg\xFAntalo incluso con aiDecidesAll=true porque cambia el costo."),
21390
- angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "animated_storyteller" (narrador + met\xE1fora), "animated_inner_journey" (viaje al interior), "animated_object_soul" (objeto con alma), "animated_timeline" (misma c\xE1mara por \xE9pocas), "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
21402
+ angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
21391
21403
  outputs: z83.array(z83.enum([
21392
21404
  "landing",
21393
21405
  "video",
@@ -21495,7 +21507,7 @@ var PendingActionPayload = z83.discriminatedUnion("kind", [
21495
21507
  // an opaque HTTP 400 after the model already believed it had been saved.
21496
21508
  features: z83.array(z83.string().min(1).max(MCP_REVIEW_FEATURE_ITEM_MAX)).max(10).optional(),
21497
21509
  buyerPersona: z83.string().min(1).max(360).optional(),
21498
- narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n) funciona en ambos formatos \u2014 en Un solo clip abre sin producto y el producto entra por referencia en su beat. La familia storyteller ("animated_storyteller", "animated_inner_journey", "animated_object_soul", "animated_timeline") funciona en ambos formatos: 15s Un solo clip y 30s Multiescena.'),
21510
+ narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n) funciona en ambos formatos \u2014 en Un solo clip abre sin producto y el producto entra por referencia en su beat. La familia storyteller ("animated_storyteller", "animated_inner_journey", "animated_object_soul", "animated_timeline") no est\xE1 disponible por ahora.'),
21499
21511
  actor: z83.string().min(1).max(360).optional().describe("Nueva descripci\xF3n del presentador. Al enviarla sin actorId, se elimina autom\xE1ticamente cualquier actor guardado previo de esos \xE1ngulos."),
21500
21512
  actorId: z83.string().max(120).nullable().optional(),
21501
21513
  creativeDirection: z83.string().max(2e3).optional(),
@@ -21508,7 +21520,7 @@ var PendingActionPayload = z83.discriminatedUnion("kind", [
21508
21520
  ]).optional().describe("Elecci\xF3n expl\xEDcita: market usa el estudio disponible; guided usa la narrativa elegida para este \xE1ngulo."),
21509
21521
  angle: z83.string().min(1).max(480).optional(),
21510
21522
  buyerPersona: z83.string().min(1).max(360).optional(),
21511
- narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n) funciona en ambos formatos \u2014 en Un solo clip abre sin producto y el producto entra por referencia en su beat. La familia storyteller ("animated_storyteller", "animated_inner_journey", "animated_object_soul", "animated_timeline") funciona en ambos formatos: 15s Un solo clip y 30s Multiescena.'),
21523
+ narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n) funciona en ambos formatos \u2014 en Un solo clip abre sin producto y el producto entra por referencia en su beat. La familia storyteller ("animated_storyteller", "animated_inner_journey", "animated_object_soul", "animated_timeline") no est\xE1 disponible por ahora.'),
21512
21524
  actor: z83.string().min(1).max(360).optional(),
21513
21525
  actorId: z83.string().max(120).nullable().optional(),
21514
21526
  creativeDirection: z83.string().max(2e3).optional()
@@ -21584,7 +21596,10 @@ var StatusForResolveSchema = z83.object({
21584
21596
  "480p",
21585
21597
  "720p"
21586
21598
  ]).optional(),
21587
- narrativeStyle: NarrativeStyleEnum.optional(),
21599
+ // READ from /v1/status: the canonical enum, not the public input policy.
21600
+ // A task created before a narrative was blocked/hidden must still parse,
21601
+ // or resolve_pending_action could never approve it.
21602
+ narrativeStyle: NarrativeStyle.optional(),
21588
21603
  pauseForVideoScriptReview: z83.boolean().optional(),
21589
21604
  pendingUserAction: z83.object({
21590
21605
  kind: z83.string(),
@@ -22624,7 +22639,7 @@ var VideoCreativeSetup = z84.discriminatedUnion("mode", [
22624
22639
  mode: z84.literal("guided"),
22625
22640
  videoPreset: VideoPresetEnum.default("auto").describe('Narrativa opcional. Con estudio de mercado no la preguntes: se usa "auto" y el estudio define la estructura. Sin estudio conserva la elecci\xF3n del usuario. Todas las narrativas funcionan en Un solo clip y Multiescena.'),
22626
22641
  buyerPersona: z84.string().trim().min(1).max(360),
22627
- animationStyle: AnimationStyleEnum.optional().describe('Opcional. Estilo visual SOLO para presets animados ("pixar_problem", "pixar_sassy", "storyteller", "inner_journey", "object_soul" o "timeline") \u2014 la API lo rechaza con cualquier otro preset. Opciones: "pixar_3d" (default, look 3D de pel\xEDcula animada), "claymation" (plastilina stop-motion artesanal), "wes_anderson" (tableau sim\xE9trico pastel), "sci_fi" (futurista con HUDs y ne\xF3n), "realista" (fotorrealista, fiel al producto). Si el usuario pide un look animado sin nombrar el estilo, omite el campo.'),
22642
+ animationStyle: AnimationStyleEnum.optional().describe('Opcional. Estilo visual SOLO para presets animados ("pixar_problem" o "pixar_sassy") \u2014 la API lo rechaza con cualquier otro preset. Opciones: "pixar_3d" (default, look 3D de pel\xEDcula animada), "claymation" (plastilina stop-motion artesanal), "wes_anderson" (tableau sim\xE9trico pastel), "sci_fi" (futurista con HUDs y ne\xF3n), "realista" (fotorrealista, fiel al producto). Si el usuario pide un look animado sin nombrar el estilo, omite el campo.'),
22628
22643
  presenter: VideoPresenter,
22629
22644
  creativeDirection: z84.string().trim().min(1).max(500).nullable().describe("Direcci\xF3n visual elegida. null significa que el usuario deleg\xF3 expl\xEDcitamente esta decisi\xF3n.")
22630
22645
  }).strict()
@@ -22643,7 +22658,7 @@ var VideoInput = z84.object({
22643
22658
  ]).describe('Relaci\xF3n de aspecto. "9:16" = vertical (TikTok/Reels \u2014 default recomendado para ads). "16:9" = horizontal (YouTube). "Auto" = decide la IA.'),
22644
22659
  durationSeconds: z84.number().int().min(4).max(30).default(15).describe("Opcional. Duraci\xF3n objetivo: Un solo clip Econ\xF3mico o Medio usa 15s; Un solo clip Pro usa 15s o 30s; Multiescena usa 15s o 30s totales. La combinaci\xF3n de formato y calidad determina la ruta y el costo."),
22645
22660
  videoAngleCount: z84.number().int().min(1).max(3).describe("Cantidad de videos a renderizar: 1, 2 o 3. Es una decisi\xF3n de costo obligatoria: preg\xFAntala incluso cuando creativeSetup.mode=automatic."),
22646
- angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "animated_storyteller" (narrador + met\xE1fora), "animated_inner_journey" (viaje al interior), "animated_object_soul" (objeto con alma), "animated_timeline" (misma c\xE1mara por \xE9pocas), "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
22661
+ angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
22647
22662
  creativeSetup: VideoCreativeSetup.describe("Configuraci\xF3n creativa obligatoria. En guided pregunta narrativa, p\xFAblico, presentador y direcci\xF3n antes de confirmar. Usa automatic s\xF3lo si el usuario deleg\xF3 todo expl\xEDcitamente."),
22648
22663
  videoStructure: VideoStructureEnum.default("single_take").describe('Opcional. Formato: "single_take" = Un solo clip (generado completo; puede incluir cambios de plano) o "multi_scene" = Multiescena (varias tomas concatenadas). Default: single_take.'),
22649
22664
  videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El sistema elige el proveedor internamente. Default: economy.'),
package/dist/stdio.js CHANGED
@@ -70,6 +70,18 @@ var NarrativeStyle = z.enum([
70
70
  "animated_object_soul",
71
71
  "animated_timeline"
72
72
  ]);
73
+ var BLOCKED_NARRATIVE_STYLES = [
74
+ "animated_storyteller",
75
+ "animated_inner_journey",
76
+ "animated_object_soul",
77
+ "animated_timeline"
78
+ ];
79
+ var BLOCKED_VIDEO_PRESETS = [
80
+ "storyteller",
81
+ "inner_journey",
82
+ "object_soul",
83
+ "timeline"
84
+ ];
73
85
  var AnimationStyleSchema = z.enum([
74
86
  "pixar_3d",
75
87
  "claymation",
@@ -3851,6 +3863,7 @@ var LandingPatchSchema = z21.object({
3851
3863
  }
3852
3864
  });
3853
3865
  });
3866
+ var MAX_CODE_LANDING_ARTIFACT_ASSETS = 96;
3854
3867
  var CodeLandingArtifactSchema = z21.object({
3855
3868
  schemaVersion: z21.literal(CODE_LANDING_SCHEMA_VERSION),
3856
3869
  runtimeVersion: z21.literal(CODE_LANDING_RUNTIME_VERSION),
@@ -3862,7 +3875,7 @@ var CodeLandingArtifactSchema = z21.object({
3862
3875
  document: CodeLandingDocumentSchema,
3863
3876
  blocks: z21.array(CodeLandingBlockSchema).min(1).max(32),
3864
3877
  anchors: z21.array(CodeLandingAnchorSchema).min(1).max(64),
3865
- assets: z21.array(CodeLandingAssetSchema).max(96),
3878
+ assets: z21.array(CodeLandingAssetSchema).max(MAX_CODE_LANDING_ARTIFACT_ASSETS),
3866
3879
  components: z21.array(ComponentManifestEntrySchema).max(64),
3867
3880
  interactions: z21.array(InteractionProgramSchema).max(64),
3868
3881
  protectedBindings: z21.array(ProtectedBindingSchema).max(128),
@@ -6297,7 +6310,8 @@ var TaskCreativeVariantVideoPreset = VideoPreset.exclude([
6297
6310
  "ugc_curiosity_reveal",
6298
6311
  "ugc_listicle_3",
6299
6312
  "ugc_skeptic_confession",
6300
- "metaphor_product"
6313
+ "metaphor_product",
6314
+ ...BLOCKED_VIDEO_PRESETS
6301
6315
  ]);
6302
6316
  var CreateTaskCreativeVariantBase = z33.object({
6303
6317
  clientRequestId: z33.string().uuid(),
@@ -14364,7 +14378,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14364
14378
  defineCapability(
14365
14379
  "create_creative_variant",
14366
14380
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14367
- "db6d98e9e07d57dd1a78d9b73cdbfdaa7ee7a6ae4dff30d1bd2b3edf3225cd0d",
14381
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14382
+ "3e02399a7785df328f1c4d63cfbb6d7481abaac9f91d4a5cf51d410e657d63aa",
14368
14383
  "credit_consuming",
14369
14384
  "creative",
14370
14385
  [
@@ -14419,7 +14434,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14419
14434
  // default). Recomputed from the real tools/list digest printer.
14420
14435
  // + market study opt-in copy (#2005, competitorScanEnabled description).
14421
14436
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14422
- "46b308923121dac1023b55f68b61dfbf4e89f682bdd48b04d4d0f8a3667f8999",
14437
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14438
+ "d5f2fd2f2d3687ce41acac9b5c44bdf5a5c3d542cbfdafcf5759c35f9320140f",
14423
14439
  "credit_consuming",
14424
14440
  "creative",
14425
14441
  [
@@ -14605,7 +14621,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14605
14621
  ], [
14606
14622
  "task_draft"
14607
14623
  ]),
14608
- defineCapability("estimate_creative_variant", "055a92336bfb773c14e3f7018368b4490404ebcb3e607f78d5e0d5c0e78254b8", "none", "read_only", [
14624
+ defineCapability("estimate_creative_variant", "d4453364c0706bf88f480cebc977916f06d222d7eebebc9cfa91165929a1a998", "none", "read_only", [
14609
14625
  "read"
14610
14626
  ], [
14611
14627
  slot("source_task", true, [
@@ -14937,7 +14953,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14937
14953
  defineCapability(
14938
14954
  "generate_video_creative",
14939
14955
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14940
- "5545b24de7b344c9184cfe087a39b766490526a432d8b288c02c2e9a20529c3d",
14956
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14957
+ "932a153afe51975abe3b601530f17178ed8ddd56a6f8116877bc4caab4fc6a9d",
14941
14958
  "credit_consuming",
14942
14959
  "creative",
14943
14960
  [
@@ -15380,7 +15397,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
15380
15397
  ], [
15381
15398
  "product_media"
15382
15399
  ], MCP_ONLY_CHANNEL_EXPOSURE),
15383
- defineCapability("regenerate_video_script", "198903f5d89b245daedde4e08020a6d536f2ea354f5924176253b71c84241859", "credit_consuming", "creative", [
15400
+ defineCapability("regenerate_video_script", "eb9546e5cda3864de78ff119ae81dd17c893ea9ea5be1bf0fbfeb8b45302e639", "credit_consuming", "creative", [
15384
15401
  "credit_consuming",
15385
15402
  "state_change"
15386
15403
  ], [
@@ -15443,7 +15460,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
15443
15460
  ], [
15444
15461
  "media_upload_session"
15445
15462
  ], MCP_ONLY_CHANNEL_EXPOSURE),
15446
- defineCapability("resolve_pending_action", "7d76b53ebce3265a751836e61f6959debd98bd8159291ef73437e1b7a0824333", "credit_consuming", "creative", [
15463
+ defineCapability("resolve_pending_action", "9377ff126ec842cfb8278877846c5f8f6f1b9ba0c263e7200f080db9bbe9ae12", "credit_consuming", "creative", [
15447
15464
  "credit_consuming",
15448
15465
  "state_change"
15449
15466
  ], [
@@ -15957,7 +15974,10 @@ var MCP_DOWNSTREAM_CLIENT_VALUE = "mcp";
15957
15974
 
15958
15975
  // ../../packages/types/src/mcp-surface.ts
15959
15976
  var MCP_HIDDEN_NARRATIVE_STYLES = [
15960
- "gap_replication"
15977
+ "gap_replication",
15978
+ // The blocked storyteller family is not offered, not even when revising an
15979
+ // existing script.
15980
+ ...BLOCKED_NARRATIVE_STYLES
15961
15981
  ];
15962
15982
  var McpNarrativeStyleSchema = NarrativeStyle.exclude(MCP_HIDDEN_NARRATIVE_STYLES);
15963
15983
  var MCP_ANGLE_NARRATIVE_STYLES = [
@@ -15971,10 +15991,6 @@ var MCP_ANGLE_NARRATIVE_STYLES = [
15971
15991
  "wild_card",
15972
15992
  "animated_problem_pixar",
15973
15993
  "sassy_product_pixar",
15974
- "animated_storyteller",
15975
- "animated_inner_journey",
15976
- "animated_object_soul",
15977
- "animated_timeline",
15978
15994
  "market"
15979
15995
  ];
15980
15996
  var McpAngleNarrativeStyleSchema = NarrativeStyle.extract(MCP_ANGLE_NARRATIVE_STYLES);
@@ -17262,7 +17278,7 @@ var ApiClient = class {
17262
17278
  };
17263
17279
 
17264
17280
  // src/index.ts
17265
- var MCP_VERSION = "8.9.2";
17281
+ var MCP_VERSION = "8.10.0";
17266
17282
 
17267
17283
  // src/meta-upload-app.ts
17268
17284
  import { readFileSync } from "fs";
@@ -17911,11 +17927,7 @@ var VideoPresetEnum = VideoPreset.extract([
17911
17927
  "cinematic",
17912
17928
  "wild_card",
17913
17929
  "pixar_problem",
17914
- "pixar_sassy",
17915
- "storyteller",
17916
- "inner_journey",
17917
- "object_soul",
17918
- "timeline"
17930
+ "pixar_sassy"
17919
17931
  ]);
17920
17932
  var VideoStructureEnum = VideoStructure;
17921
17933
  var VideoQualityEnum = VideoQuality;
@@ -19759,8 +19771,8 @@ var CreateProductTaskInput = z82.object({
19759
19771
  paymentMethods: z82.string().min(1).max(240).optional().describe('Opcional. M\xE9todos de pago que puede mostrar la landing. Ej. "Tarjeta, PSE, Nequi, Contraentrega". Si se omite, la landing no muestra m\xE9todos de pago.'),
19760
19772
  productContext: z82.string().max(PRODUCT_CONTEXT_MAX_CHARS).optional().describe("Opcional. Informacion adicional del producto que la IA debe usar como contexto prioritario: uso real, comprador, restricciones, diferenciadores o direccion creativa. No reemplaza la investigacion de competencia; si hay competencia, guia el primer angulo y los outputs no deben contradecirlo."),
19761
19773
  productLabel: z82.string().trim().max(80).optional().describe('Opcional. Qu\xE9 es el producto, en pocas palabras (ej. "quita pelusas para ropa"). Es AUTORITATIVO: si lo env\xEDas, la IA usa esta identidad y no la reemplaza por otra categor\xEDa. Si lo omites, la IA detecta el producto desde la imagen.'),
19762
- videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla. Default "auto" (la IA escoge tras analizar el producto). Todos los presets funcionan a 15s (single_call) y 30s (Multiescena); "problem_solution" en single_call abre sin el producto y el producto entra por referencia en su beat de soluci\xF3n. Opciones: "auto", "ugc_dynamic" (review con experiencia y prueba), "ugc_how_to" (tutorial con pasos y resultado visible), "ugc_unboxing_chaos" (apertura y primera prueba), "problem_solution" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase" (producto ejecutando una funci\xF3n real), "wearable_showcase" (prenda o accesorio modelado), "cinematic" (TV spot con receta cinematogr\xE1fica), "wild_card" (idea imposible: un truco visual que en la vida real no podr\xEDa pasar, y al cierre la invitaci\xF3n a comprar), "pixar_problem" (problema animado 3D), "pixar_sassy" (producto que habla), "storyteller" (narrador animado + met\xE1fora visual), "inner_journey" (la c\xE1mara entra al interior del problema), "object_soul" (un objeto cotidiano con alma silenciosa), "timeline" (el mismo encuadre a trav\xE9s de \xE9pocas). Si el usuario pide algo fuera de esta lista, p\xEDdele una opci\xF3n v\xE1lida.'),
19763
- animationStyle: AnimationStyleEnum.optional().describe('Opcional. Estilo visual SOLO para presets animados ("pixar_problem", "pixar_sassy", "storyteller", "inner_journey", "object_soul" o "timeline") \u2014 la API lo rechaza con cualquier otro preset. Opciones: "pixar_3d" (default, look 3D de pel\xEDcula animada), "claymation" (plastilina stop-motion artesanal), "wes_anderson" (tableau sim\xE9trico pastel), "sci_fi" (futurista con HUDs y ne\xF3n), "realista" (fotorrealista, fiel al producto). Si el usuario pide un look animado sin nombrar el estilo, omite el campo.'),
19774
+ videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla. Default "auto" (la IA escoge tras analizar el producto). Todos los presets funcionan a 15s (single_call) y 30s (Multiescena); "problem_solution" en single_call abre sin el producto y el producto entra por referencia en su beat de soluci\xF3n. Opciones: "auto", "ugc_dynamic" (review con experiencia y prueba), "ugc_how_to" (tutorial con pasos y resultado visible), "ugc_unboxing_chaos" (apertura y primera prueba), "problem_solution" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase" (producto ejecutando una funci\xF3n real), "wearable_showcase" (prenda o accesorio modelado), "cinematic" (TV spot con receta cinematogr\xE1fica), "wild_card" (idea imposible: un truco visual que en la vida real no podr\xEDa pasar, y al cierre la invitaci\xF3n a comprar), "pixar_problem" (problema animado 3D), "pixar_sassy" (producto que habla). Si el usuario pide algo fuera de esta lista, p\xEDdele una opci\xF3n v\xE1lida.'),
19775
+ animationStyle: AnimationStyleEnum.optional().describe('Opcional. Estilo visual SOLO para presets animados ("pixar_problem" o "pixar_sassy") \u2014 la API lo rechaza con cualquier otro preset. Opciones: "pixar_3d" (default, look 3D de pel\xEDcula animada), "claymation" (plastilina stop-motion artesanal), "wes_anderson" (tableau sim\xE9trico pastel), "sci_fi" (futurista con HUDs y ne\xF3n), "realista" (fotorrealista, fiel al producto). Si el usuario pide un look animado sin nombrar el estilo, omite el campo.'),
19764
19776
  durationSeconds: z82.union([
19765
19777
  z82.literal(15),
19766
19778
  z82.literal(30)
@@ -19772,7 +19784,7 @@ var CreateProductTaskInput = z82.object({
19772
19784
  videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El proveedor se elige internamente. Default: economy.'),
19773
19785
  videoResolution: VideoResolutionEnum.optional().describe('Opcional. Resoluci\xF3n del render. En la web se pregunta "\xBFResoluci\xF3n del video?". "480p" = excelente calidad y m\xE1s econ\xF3mico (RECOMENDADO, default si se omite); "720p" = m\xE1xima nitidez, entre 3% y 15% m\xE1s caro seg\xFAn formato y tier. Si el usuario no menciona resoluci\xF3n, OMITE este campo (el backend usa 480p).'),
19774
19786
  videoAngleCount: z82.number().int().min(1).max(3).optional().describe("Cantidad de videos a renderizar: 1, 2 o 3. REQUERIDO cuando outputs incluye video (o se omite outputs, cuyo default incluye video); om\xEDtelo s\xF3lo cuando no se generar\xE1 video. Preg\xFAntalo incluso con aiDecidesAll=true porque cambia el costo."),
19775
- angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "animated_storyteller" (narrador + met\xE1fora), "animated_inner_journey" (viaje al interior), "animated_object_soul" (objeto con alma), "animated_timeline" (misma c\xE1mara por \xE9pocas), "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
19787
+ angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
19776
19788
  outputs: z82.array(z82.enum([
19777
19789
  "landing",
19778
19790
  "video",
@@ -19880,7 +19892,7 @@ var PendingActionPayload = z82.discriminatedUnion("kind", [
19880
19892
  // an opaque HTTP 400 after the model already believed it had been saved.
19881
19893
  features: z82.array(z82.string().min(1).max(MCP_REVIEW_FEATURE_ITEM_MAX)).max(10).optional(),
19882
19894
  buyerPersona: z82.string().min(1).max(360).optional(),
19883
- narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n) funciona en ambos formatos \u2014 en Un solo clip abre sin producto y el producto entra por referencia en su beat. La familia storyteller ("animated_storyteller", "animated_inner_journey", "animated_object_soul", "animated_timeline") funciona en ambos formatos: 15s Un solo clip y 30s Multiescena.'),
19895
+ narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n) funciona en ambos formatos \u2014 en Un solo clip abre sin producto y el producto entra por referencia en su beat. La familia storyteller ("animated_storyteller", "animated_inner_journey", "animated_object_soul", "animated_timeline") no est\xE1 disponible por ahora.'),
19884
19896
  actor: z82.string().min(1).max(360).optional().describe("Nueva descripci\xF3n del presentador. Al enviarla sin actorId, se elimina autom\xE1ticamente cualquier actor guardado previo de esos \xE1ngulos."),
19885
19897
  actorId: z82.string().max(120).nullable().optional(),
19886
19898
  creativeDirection: z82.string().max(2e3).optional(),
@@ -19893,7 +19905,7 @@ var PendingActionPayload = z82.discriminatedUnion("kind", [
19893
19905
  ]).optional().describe("Elecci\xF3n expl\xEDcita: market usa el estudio disponible; guided usa la narrativa elegida para este \xE1ngulo."),
19894
19906
  angle: z82.string().min(1).max(480).optional(),
19895
19907
  buyerPersona: z82.string().min(1).max(360).optional(),
19896
- narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n) funciona en ambos formatos \u2014 en Un solo clip abre sin producto y el producto entra por referencia en su beat. La familia storyteller ("animated_storyteller", "animated_inner_journey", "animated_object_soul", "animated_timeline") funciona en ambos formatos: 15s Un solo clip y 30s Multiescena.'),
19908
+ narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n) funciona en ambos formatos \u2014 en Un solo clip abre sin producto y el producto entra por referencia en su beat. La familia storyteller ("animated_storyteller", "animated_inner_journey", "animated_object_soul", "animated_timeline") no est\xE1 disponible por ahora.'),
19897
19909
  actor: z82.string().min(1).max(360).optional(),
19898
19910
  actorId: z82.string().max(120).nullable().optional(),
19899
19911
  creativeDirection: z82.string().max(2e3).optional()
@@ -19969,7 +19981,10 @@ var StatusForResolveSchema = z82.object({
19969
19981
  "480p",
19970
19982
  "720p"
19971
19983
  ]).optional(),
19972
- narrativeStyle: NarrativeStyleEnum.optional(),
19984
+ // READ from /v1/status: the canonical enum, not the public input policy.
19985
+ // A task created before a narrative was blocked/hidden must still parse,
19986
+ // or resolve_pending_action could never approve it.
19987
+ narrativeStyle: NarrativeStyle.optional(),
19973
19988
  pauseForVideoScriptReview: z82.boolean().optional(),
19974
19989
  pendingUserAction: z82.object({
19975
19990
  kind: z82.string(),
@@ -21009,7 +21024,7 @@ var VideoCreativeSetup = z83.discriminatedUnion("mode", [
21009
21024
  mode: z83.literal("guided"),
21010
21025
  videoPreset: VideoPresetEnum.default("auto").describe('Narrativa opcional. Con estudio de mercado no la preguntes: se usa "auto" y el estudio define la estructura. Sin estudio conserva la elecci\xF3n del usuario. Todas las narrativas funcionan en Un solo clip y Multiescena.'),
21011
21026
  buyerPersona: z83.string().trim().min(1).max(360),
21012
- animationStyle: AnimationStyleEnum.optional().describe('Opcional. Estilo visual SOLO para presets animados ("pixar_problem", "pixar_sassy", "storyteller", "inner_journey", "object_soul" o "timeline") \u2014 la API lo rechaza con cualquier otro preset. Opciones: "pixar_3d" (default, look 3D de pel\xEDcula animada), "claymation" (plastilina stop-motion artesanal), "wes_anderson" (tableau sim\xE9trico pastel), "sci_fi" (futurista con HUDs y ne\xF3n), "realista" (fotorrealista, fiel al producto). Si el usuario pide un look animado sin nombrar el estilo, omite el campo.'),
21027
+ animationStyle: AnimationStyleEnum.optional().describe('Opcional. Estilo visual SOLO para presets animados ("pixar_problem" o "pixar_sassy") \u2014 la API lo rechaza con cualquier otro preset. Opciones: "pixar_3d" (default, look 3D de pel\xEDcula animada), "claymation" (plastilina stop-motion artesanal), "wes_anderson" (tableau sim\xE9trico pastel), "sci_fi" (futurista con HUDs y ne\xF3n), "realista" (fotorrealista, fiel al producto). Si el usuario pide un look animado sin nombrar el estilo, omite el campo.'),
21013
21028
  presenter: VideoPresenter,
21014
21029
  creativeDirection: z83.string().trim().min(1).max(500).nullable().describe("Direcci\xF3n visual elegida. null significa que el usuario deleg\xF3 expl\xEDcitamente esta decisi\xF3n.")
21015
21030
  }).strict()
@@ -21028,7 +21043,7 @@ var VideoInput = z83.object({
21028
21043
  ]).describe('Relaci\xF3n de aspecto. "9:16" = vertical (TikTok/Reels \u2014 default recomendado para ads). "16:9" = horizontal (YouTube). "Auto" = decide la IA.'),
21029
21044
  durationSeconds: z83.number().int().min(4).max(30).default(15).describe("Opcional. Duraci\xF3n objetivo: Un solo clip Econ\xF3mico o Medio usa 15s; Un solo clip Pro usa 15s o 30s; Multiescena usa 15s o 30s totales. La combinaci\xF3n de formato y calidad determina la ruta y el costo."),
21030
21045
  videoAngleCount: z83.number().int().min(1).max(3).describe("Cantidad de videos a renderizar: 1, 2 o 3. Es una decisi\xF3n de costo obligatoria: preg\xFAntala incluso cuando creativeSetup.mode=automatic."),
21031
- angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "animated_storyteller" (narrador + met\xE1fora), "animated_inner_journey" (viaje al interior), "animated_object_soul" (objeto con alma), "animated_timeline" (misma c\xE1mara por \xE9pocas), "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
21046
+ angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
21032
21047
  creativeSetup: VideoCreativeSetup.describe("Configuraci\xF3n creativa obligatoria. En guided pregunta narrativa, p\xFAblico, presentador y direcci\xF3n antes de confirmar. Usa automatic s\xF3lo si el usuario deleg\xF3 todo expl\xEDcitamente."),
21033
21048
  videoStructure: VideoStructureEnum.default("single_take").describe('Opcional. Formato: "single_take" = Un solo clip (generado completo; puede incluir cambios de plano) o "multi_scene" = Multiescena (varias tomas concatenadas). Default: single_take.'),
21034
21049
  videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El sistema elige el proveedor internamente. Default: economy.'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productmaker/mcp",
3
- "version": "8.9.2",
3
+ "version": "8.10.0",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "description": "ProductMaker MCP server — cost products, generate landing pages, UGC videos, and ad creatives, and publish to Shopify, Meta Ads, and TikTok Ads.",