@productmaker/mcp 8.9.2 → 8.10.1

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",
@@ -1316,6 +1328,19 @@ var AnchoredIntel = z9.object({
1316
1328
  "market",
1317
1329
  "guided"
1318
1330
  ]).optional(),
1331
+ /**
1332
+ * WHERE `narrativeSelection` came from: `create` = the seller chose it when
1333
+ * creating the task (positional `angleNarratives` or a concrete upfront
1334
+ * `videoPreset`), stamped by angles.worker; `review` = picked on the review
1335
+ * card. Two owner rules meet here: an explicit choice beats the market default
1336
+ * (prod 97352dac), and a blanket upfront preset must NOT block the winner
1337
+ * replica (2026-08-04) while a review-time pick does (#1807). The origin is
1338
+ * the only thing that tells them apart. Absent ⇒ legacy review decision.
1339
+ */
1340
+ narrativeSelectionSource: z9.enum([
1341
+ "create",
1342
+ "review"
1343
+ ]).optional(),
1319
1344
  painPointIndices: z9.array(z9.number().int().nonnegative()).max(10),
1320
1345
  hookIndices: z9.array(z9.number().int().nonnegative()).max(10),
1321
1346
  claimIndices: z9.array(z9.number().int().nonnegative()).max(10),
@@ -3580,6 +3605,14 @@ var CodeLandingProvenanceSchema = z21.object({
3580
3605
  */
3581
3606
  budgetDroppedBlockIds: z21.array(z21.string().min(1).max(60)).max(16).optional(),
3582
3607
  /**
3608
+ * Sections that EXHAUSTED CONTENT AUTHORING and were dropped, in the order
3609
+ * they failed. Only non-critical sections can land here (the pack selector,
3610
+ * sticky CTA and reviews pager still fail the page); the page shipped
3611
+ * degraded on purpose, and this is what makes that measurable instead of
3612
+ * silent. Absent when nothing was dropped — presence IS the signal.
3613
+ */
3614
+ authoringDroppedBlockIds: z21.array(z21.string().min(1).max(60)).max(16).optional(),
3615
+ /**
3583
3616
  * The budget loop gave up with the page STILL over its target.
3584
3617
  *
3585
3618
  * It can only shed what `OVERFLOW_DROP_ORDER` lists and never below the
@@ -3829,6 +3862,7 @@ var LandingPatchSchema = z21.object({
3829
3862
  }
3830
3863
  });
3831
3864
  });
3865
+ var MAX_CODE_LANDING_ARTIFACT_ASSETS = 96;
3832
3866
  var CodeLandingArtifactSchema = z21.object({
3833
3867
  schemaVersion: z21.literal(CODE_LANDING_SCHEMA_VERSION),
3834
3868
  runtimeVersion: z21.literal(CODE_LANDING_RUNTIME_VERSION),
@@ -3840,7 +3874,7 @@ var CodeLandingArtifactSchema = z21.object({
3840
3874
  document: CodeLandingDocumentSchema,
3841
3875
  blocks: z21.array(CodeLandingBlockSchema).min(1).max(32),
3842
3876
  anchors: z21.array(CodeLandingAnchorSchema).min(1).max(64),
3843
- assets: z21.array(CodeLandingAssetSchema).max(96),
3877
+ assets: z21.array(CodeLandingAssetSchema).max(MAX_CODE_LANDING_ARTIFACT_ASSETS),
3844
3878
  components: z21.array(ComponentManifestEntrySchema).max(64),
3845
3879
  interactions: z21.array(InteractionProgramSchema).max(64),
3846
3880
  protectedBindings: z21.array(ProtectedBindingSchema).max(128),
@@ -3977,6 +4011,11 @@ var CreateLandingEditRequest = z21.union([
3977
4011
  LegacyLandingEditRequest
3978
4012
  ]);
3979
4013
  var CommerceReconciliationSchema = z21.object({
4014
+ /** Omission retains legacy checkout authority; document proof never enables purchase. */
4015
+ purpose: z21.enum([
4016
+ "checkout",
4017
+ "document"
4018
+ ]).optional(),
3980
4019
  state: z21.enum([
3981
4020
  "pending",
3982
4021
  "awaiting_external_fix",
@@ -3984,6 +4023,8 @@ var CommerceReconciliationSchema = z21.object({
3984
4023
  "superseded"
3985
4024
  ]),
3986
4025
  desiredRevision: z21.number().int().positive(),
4026
+ /** Guarded fence installation can serve a later cosmetic head of the same offer. */
4027
+ checkoutFenceRevision: z21.number().int().positive().optional(),
3987
4028
  fingerprint: z21.string().min(1),
3988
4029
  startedAt: z21.string().datetime(),
3989
4030
  deadlineAt: z21.string().datetime(),
@@ -6275,7 +6316,8 @@ var TaskCreativeVariantVideoPreset = VideoPreset.exclude([
6275
6316
  "ugc_curiosity_reveal",
6276
6317
  "ugc_listicle_3",
6277
6318
  "ugc_skeptic_confession",
6278
- "metaphor_product"
6319
+ "metaphor_product",
6320
+ ...BLOCKED_VIDEO_PRESETS
6279
6321
  ]);
6280
6322
  var CreateTaskCreativeVariantBase = z33.object({
6281
6323
  clientRequestId: z33.string().uuid(),
@@ -8839,6 +8881,13 @@ var DEFAULT_PRICING = {
8839
8881
  ourCostCents: 1.7,
8840
8882
  userPriceCents: 3.4
8841
8883
  },
8884
+ // Native prompt condense: an LLM shortens the authored visuals of a take
8885
+ // whose prompt overflows the provider (up to five calls, only on overflow).
8886
+ // Unmeasured; priced like the final-simplify rewrite until prod data exists.
8887
+ "openrouter:video-prompt-condense": {
8888
+ ourCostCents: 1,
8889
+ userPriceCents: 2
8890
+ },
8842
8891
  // For helper-recorded entries (`callOpenRouter`), `ourCostCents` here is
8843
8892
  // only used when `usage.cost` is missing from the provider response —
8844
8893
  // otherwise real cost wins via `overrideOurCostCents`. `userPriceCents` is
@@ -14342,7 +14391,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14342
14391
  defineCapability(
14343
14392
  "create_creative_variant",
14344
14393
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14345
- "db6d98e9e07d57dd1a78d9b73cdbfdaa7ee7a6ae4dff30d1bd2b3edf3225cd0d",
14394
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14395
+ "3e02399a7785df328f1c4d63cfbb6d7481abaac9f91d4a5cf51d410e657d63aa",
14346
14396
  "credit_consuming",
14347
14397
  "creative",
14348
14398
  [
@@ -14397,7 +14447,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14397
14447
  // default). Recomputed from the real tools/list digest printer.
14398
14448
  // + market study opt-in copy (#2005, competitorScanEnabled description).
14399
14449
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14400
- "46b308923121dac1023b55f68b61dfbf4e89f682bdd48b04d4d0f8a3667f8999",
14450
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14451
+ "d5f2fd2f2d3687ce41acac9b5c44bdf5a5c3d542cbfdafcf5759c35f9320140f",
14401
14452
  "credit_consuming",
14402
14453
  "creative",
14403
14454
  [
@@ -14583,7 +14634,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14583
14634
  ], [
14584
14635
  "task_draft"
14585
14636
  ]),
14586
- defineCapability("estimate_creative_variant", "055a92336bfb773c14e3f7018368b4490404ebcb3e607f78d5e0d5c0e78254b8", "none", "read_only", [
14637
+ defineCapability("estimate_creative_variant", "d4453364c0706bf88f480cebc977916f06d222d7eebebc9cfa91165929a1a998", "none", "read_only", [
14587
14638
  "read"
14588
14639
  ], [
14589
14640
  slot("source_task", true, [
@@ -14915,7 +14966,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14915
14966
  defineCapability(
14916
14967
  "generate_video_creative",
14917
14968
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14918
- "5545b24de7b344c9184cfe087a39b766490526a432d8b288c02c2e9a20529c3d",
14969
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14970
+ "932a153afe51975abe3b601530f17178ed8ddd56a6f8116877bc4caab4fc6a9d",
14919
14971
  "credit_consuming",
14920
14972
  "creative",
14921
14973
  [
@@ -15358,7 +15410,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
15358
15410
  ], [
15359
15411
  "product_media"
15360
15412
  ], MCP_ONLY_CHANNEL_EXPOSURE),
15361
- defineCapability("regenerate_video_script", "198903f5d89b245daedde4e08020a6d536f2ea354f5924176253b71c84241859", "credit_consuming", "creative", [
15413
+ defineCapability("regenerate_video_script", "eb9546e5cda3864de78ff119ae81dd17c893ea9ea5be1bf0fbfeb8b45302e639", "credit_consuming", "creative", [
15362
15414
  "credit_consuming",
15363
15415
  "state_change"
15364
15416
  ], [
@@ -15421,7 +15473,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
15421
15473
  ], [
15422
15474
  "media_upload_session"
15423
15475
  ], MCP_ONLY_CHANNEL_EXPOSURE),
15424
- defineCapability("resolve_pending_action", "7d76b53ebce3265a751836e61f6959debd98bd8159291ef73437e1b7a0824333", "credit_consuming", "creative", [
15476
+ defineCapability("resolve_pending_action", "9377ff126ec842cfb8278877846c5f8f6f1b9ba0c263e7200f080db9bbe9ae12", "credit_consuming", "creative", [
15425
15477
  "credit_consuming",
15426
15478
  "state_change"
15427
15479
  ], [
@@ -15942,7 +15994,10 @@ var MCP_DOWNSTREAM_CLIENT_VALUE = "mcp";
15942
15994
 
15943
15995
  // ../../packages/types/src/mcp-surface.ts
15944
15996
  var MCP_HIDDEN_NARRATIVE_STYLES = [
15945
- "gap_replication"
15997
+ "gap_replication",
15998
+ // The blocked storyteller family is not offered, not even when revising an
15999
+ // existing script.
16000
+ ...BLOCKED_NARRATIVE_STYLES
15946
16001
  ];
15947
16002
  var McpNarrativeStyleSchema = NarrativeStyle.exclude(MCP_HIDDEN_NARRATIVE_STYLES);
15948
16003
  var MCP_ANGLE_NARRATIVE_STYLES = [
@@ -15956,10 +16011,6 @@ var MCP_ANGLE_NARRATIVE_STYLES = [
15956
16011
  "wild_card",
15957
16012
  "animated_problem_pixar",
15958
16013
  "sassy_product_pixar",
15959
- "animated_storyteller",
15960
- "animated_inner_journey",
15961
- "animated_object_soul",
15962
- "animated_timeline",
15963
16014
  "market"
15964
16015
  ];
15965
16016
  var McpAngleNarrativeStyleSchema = NarrativeStyle.extract(MCP_ANGLE_NARRATIVE_STYLES);
@@ -18930,7 +18981,7 @@ var ApiClient = class {
18930
18981
  };
18931
18982
 
18932
18983
  // src/index.ts
18933
- var MCP_VERSION = "8.9.2";
18984
+ var MCP_VERSION = "8.10.1";
18934
18985
 
18935
18986
  // src/meta-upload-app.ts
18936
18987
  import { readFileSync } from "fs";
@@ -19579,11 +19630,7 @@ var VideoPresetEnum = VideoPreset.extract([
19579
19630
  "cinematic",
19580
19631
  "wild_card",
19581
19632
  "pixar_problem",
19582
- "pixar_sassy",
19583
- "storyteller",
19584
- "inner_journey",
19585
- "object_soul",
19586
- "timeline"
19633
+ "pixar_sassy"
19587
19634
  ]);
19588
19635
  var VideoStructureEnum = VideoStructure;
19589
19636
  var VideoQualityEnum = VideoQuality;
@@ -21374,8 +21421,8 @@ var CreateProductTaskInput = z83.object({
21374
21421
  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
21422
  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
21423
  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.'),
21424
+ 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.'),
21425
+ 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
21426
  durationSeconds: z83.union([
21380
21427
  z83.literal(15),
21381
21428
  z83.literal(30)
@@ -21387,7 +21434,7 @@ var CreateProductTaskInput = z83.object({
21387
21434
  videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El proveedor se elige internamente. Default: economy.'),
21388
21435
  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
21436
  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.'),
21437
+ 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
21438
  outputs: z83.array(z83.enum([
21392
21439
  "landing",
21393
21440
  "video",
@@ -21495,7 +21542,7 @@ var PendingActionPayload = z83.discriminatedUnion("kind", [
21495
21542
  // an opaque HTTP 400 after the model already believed it had been saved.
21496
21543
  features: z83.array(z83.string().min(1).max(MCP_REVIEW_FEATURE_ITEM_MAX)).max(10).optional(),
21497
21544
  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.'),
21545
+ 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
21546
  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
21547
  actorId: z83.string().max(120).nullable().optional(),
21501
21548
  creativeDirection: z83.string().max(2e3).optional(),
@@ -21508,7 +21555,7 @@ var PendingActionPayload = z83.discriminatedUnion("kind", [
21508
21555
  ]).optional().describe("Elecci\xF3n expl\xEDcita: market usa el estudio disponible; guided usa la narrativa elegida para este \xE1ngulo."),
21509
21556
  angle: z83.string().min(1).max(480).optional(),
21510
21557
  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.'),
21558
+ 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
21559
  actor: z83.string().min(1).max(360).optional(),
21513
21560
  actorId: z83.string().max(120).nullable().optional(),
21514
21561
  creativeDirection: z83.string().max(2e3).optional()
@@ -21584,7 +21631,10 @@ var StatusForResolveSchema = z83.object({
21584
21631
  "480p",
21585
21632
  "720p"
21586
21633
  ]).optional(),
21587
- narrativeStyle: NarrativeStyleEnum.optional(),
21634
+ // READ from /v1/status: the canonical enum, not the public input policy.
21635
+ // A task created before a narrative was blocked/hidden must still parse,
21636
+ // or resolve_pending_action could never approve it.
21637
+ narrativeStyle: NarrativeStyle.optional(),
21588
21638
  pauseForVideoScriptReview: z83.boolean().optional(),
21589
21639
  pendingUserAction: z83.object({
21590
21640
  kind: z83.string(),
@@ -22624,7 +22674,7 @@ var VideoCreativeSetup = z84.discriminatedUnion("mode", [
22624
22674
  mode: z84.literal("guided"),
22625
22675
  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
22676
  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.'),
22677
+ 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
22678
  presenter: VideoPresenter,
22629
22679
  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
22680
  }).strict()
@@ -22643,7 +22693,7 @@ var VideoInput = z84.object({
22643
22693
  ]).describe('Relaci\xF3n de aspecto. "9:16" = vertical (TikTok/Reels \u2014 default recomendado para ads). "16:9" = horizontal (YouTube). "Auto" = decide la IA.'),
22644
22694
  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
22695
  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.'),
22696
+ 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
22697
  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
22698
  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
22699
  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",
@@ -1338,6 +1350,19 @@ var AnchoredIntel = z9.object({
1338
1350
  "market",
1339
1351
  "guided"
1340
1352
  ]).optional(),
1353
+ /**
1354
+ * WHERE `narrativeSelection` came from: `create` = the seller chose it when
1355
+ * creating the task (positional `angleNarratives` or a concrete upfront
1356
+ * `videoPreset`), stamped by angles.worker; `review` = picked on the review
1357
+ * card. Two owner rules meet here: an explicit choice beats the market default
1358
+ * (prod 97352dac), and a blanket upfront preset must NOT block the winner
1359
+ * replica (2026-08-04) while a review-time pick does (#1807). The origin is
1360
+ * the only thing that tells them apart. Absent ⇒ legacy review decision.
1361
+ */
1362
+ narrativeSelectionSource: z9.enum([
1363
+ "create",
1364
+ "review"
1365
+ ]).optional(),
1341
1366
  painPointIndices: z9.array(z9.number().int().nonnegative()).max(10),
1342
1367
  hookIndices: z9.array(z9.number().int().nonnegative()).max(10),
1343
1368
  claimIndices: z9.array(z9.number().int().nonnegative()).max(10),
@@ -3602,6 +3627,14 @@ var CodeLandingProvenanceSchema = z21.object({
3602
3627
  */
3603
3628
  budgetDroppedBlockIds: z21.array(z21.string().min(1).max(60)).max(16).optional(),
3604
3629
  /**
3630
+ * Sections that EXHAUSTED CONTENT AUTHORING and were dropped, in the order
3631
+ * they failed. Only non-critical sections can land here (the pack selector,
3632
+ * sticky CTA and reviews pager still fail the page); the page shipped
3633
+ * degraded on purpose, and this is what makes that measurable instead of
3634
+ * silent. Absent when nothing was dropped — presence IS the signal.
3635
+ */
3636
+ authoringDroppedBlockIds: z21.array(z21.string().min(1).max(60)).max(16).optional(),
3637
+ /**
3605
3638
  * The budget loop gave up with the page STILL over its target.
3606
3639
  *
3607
3640
  * It can only shed what `OVERFLOW_DROP_ORDER` lists and never below the
@@ -3851,6 +3884,7 @@ var LandingPatchSchema = z21.object({
3851
3884
  }
3852
3885
  });
3853
3886
  });
3887
+ var MAX_CODE_LANDING_ARTIFACT_ASSETS = 96;
3854
3888
  var CodeLandingArtifactSchema = z21.object({
3855
3889
  schemaVersion: z21.literal(CODE_LANDING_SCHEMA_VERSION),
3856
3890
  runtimeVersion: z21.literal(CODE_LANDING_RUNTIME_VERSION),
@@ -3862,7 +3896,7 @@ var CodeLandingArtifactSchema = z21.object({
3862
3896
  document: CodeLandingDocumentSchema,
3863
3897
  blocks: z21.array(CodeLandingBlockSchema).min(1).max(32),
3864
3898
  anchors: z21.array(CodeLandingAnchorSchema).min(1).max(64),
3865
- assets: z21.array(CodeLandingAssetSchema).max(96),
3899
+ assets: z21.array(CodeLandingAssetSchema).max(MAX_CODE_LANDING_ARTIFACT_ASSETS),
3866
3900
  components: z21.array(ComponentManifestEntrySchema).max(64),
3867
3901
  interactions: z21.array(InteractionProgramSchema).max(64),
3868
3902
  protectedBindings: z21.array(ProtectedBindingSchema).max(128),
@@ -3999,6 +4033,11 @@ var CreateLandingEditRequest = z21.union([
3999
4033
  LegacyLandingEditRequest
4000
4034
  ]);
4001
4035
  var CommerceReconciliationSchema = z21.object({
4036
+ /** Omission retains legacy checkout authority; document proof never enables purchase. */
4037
+ purpose: z21.enum([
4038
+ "checkout",
4039
+ "document"
4040
+ ]).optional(),
4002
4041
  state: z21.enum([
4003
4042
  "pending",
4004
4043
  "awaiting_external_fix",
@@ -4006,6 +4045,8 @@ var CommerceReconciliationSchema = z21.object({
4006
4045
  "superseded"
4007
4046
  ]),
4008
4047
  desiredRevision: z21.number().int().positive(),
4048
+ /** Guarded fence installation can serve a later cosmetic head of the same offer. */
4049
+ checkoutFenceRevision: z21.number().int().positive().optional(),
4009
4050
  fingerprint: z21.string().min(1),
4010
4051
  startedAt: z21.string().datetime(),
4011
4052
  deadlineAt: z21.string().datetime(),
@@ -6297,7 +6338,8 @@ var TaskCreativeVariantVideoPreset = VideoPreset.exclude([
6297
6338
  "ugc_curiosity_reveal",
6298
6339
  "ugc_listicle_3",
6299
6340
  "ugc_skeptic_confession",
6300
- "metaphor_product"
6341
+ "metaphor_product",
6342
+ ...BLOCKED_VIDEO_PRESETS
6301
6343
  ]);
6302
6344
  var CreateTaskCreativeVariantBase = z33.object({
6303
6345
  clientRequestId: z33.string().uuid(),
@@ -8861,6 +8903,13 @@ var DEFAULT_PRICING = {
8861
8903
  ourCostCents: 1.7,
8862
8904
  userPriceCents: 3.4
8863
8905
  },
8906
+ // Native prompt condense: an LLM shortens the authored visuals of a take
8907
+ // whose prompt overflows the provider (up to five calls, only on overflow).
8908
+ // Unmeasured; priced like the final-simplify rewrite until prod data exists.
8909
+ "openrouter:video-prompt-condense": {
8910
+ ourCostCents: 1,
8911
+ userPriceCents: 2
8912
+ },
8864
8913
  // For helper-recorded entries (`callOpenRouter`), `ourCostCents` here is
8865
8914
  // only used when `usage.cost` is missing from the provider response —
8866
8915
  // otherwise real cost wins via `overrideOurCostCents`. `userPriceCents` is
@@ -14364,7 +14413,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14364
14413
  defineCapability(
14365
14414
  "create_creative_variant",
14366
14415
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14367
- "db6d98e9e07d57dd1a78d9b73cdbfdaa7ee7a6ae4dff30d1bd2b3edf3225cd0d",
14416
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14417
+ "3e02399a7785df328f1c4d63cfbb6d7481abaac9f91d4a5cf51d410e657d63aa",
14368
14418
  "credit_consuming",
14369
14419
  "creative",
14370
14420
  [
@@ -14419,7 +14469,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14419
14469
  // default). Recomputed from the real tools/list digest printer.
14420
14470
  // + market study opt-in copy (#2005, competitorScanEnabled description).
14421
14471
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14422
- "46b308923121dac1023b55f68b61dfbf4e89f682bdd48b04d4d0f8a3667f8999",
14472
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14473
+ "d5f2fd2f2d3687ce41acac9b5c44bdf5a5c3d542cbfdafcf5759c35f9320140f",
14423
14474
  "credit_consuming",
14424
14475
  "creative",
14425
14476
  [
@@ -14605,7 +14656,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14605
14656
  ], [
14606
14657
  "task_draft"
14607
14658
  ]),
14608
- defineCapability("estimate_creative_variant", "055a92336bfb773c14e3f7018368b4490404ebcb3e607f78d5e0d5c0e78254b8", "none", "read_only", [
14659
+ defineCapability("estimate_creative_variant", "d4453364c0706bf88f480cebc977916f06d222d7eebebc9cfa91165929a1a998", "none", "read_only", [
14609
14660
  "read"
14610
14661
  ], [
14611
14662
  slot("source_task", true, [
@@ -14937,7 +14988,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14937
14988
  defineCapability(
14938
14989
  "generate_video_creative",
14939
14990
  // MCP 8.6.0: + storyteller narrative family and animationStyle axis.
14940
- "5545b24de7b344c9184cfe087a39b766490526a432d8b288c02c2e9a20529c3d",
14991
+ // MCP 8.10.0: storyteller family blocked (BLOCKED_NARRATIVE_STYLES).
14992
+ "932a153afe51975abe3b601530f17178ed8ddd56a6f8116877bc4caab4fc6a9d",
14941
14993
  "credit_consuming",
14942
14994
  "creative",
14943
14995
  [
@@ -15380,7 +15432,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
15380
15432
  ], [
15381
15433
  "product_media"
15382
15434
  ], MCP_ONLY_CHANNEL_EXPOSURE),
15383
- defineCapability("regenerate_video_script", "198903f5d89b245daedde4e08020a6d536f2ea354f5924176253b71c84241859", "credit_consuming", "creative", [
15435
+ defineCapability("regenerate_video_script", "eb9546e5cda3864de78ff119ae81dd17c893ea9ea5be1bf0fbfeb8b45302e639", "credit_consuming", "creative", [
15384
15436
  "credit_consuming",
15385
15437
  "state_change"
15386
15438
  ], [
@@ -15443,7 +15495,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
15443
15495
  ], [
15444
15496
  "media_upload_session"
15445
15497
  ], MCP_ONLY_CHANNEL_EXPOSURE),
15446
- defineCapability("resolve_pending_action", "7d76b53ebce3265a751836e61f6959debd98bd8159291ef73437e1b7a0824333", "credit_consuming", "creative", [
15498
+ defineCapability("resolve_pending_action", "9377ff126ec842cfb8278877846c5f8f6f1b9ba0c263e7200f080db9bbe9ae12", "credit_consuming", "creative", [
15447
15499
  "credit_consuming",
15448
15500
  "state_change"
15449
15501
  ], [
@@ -15957,7 +16009,10 @@ var MCP_DOWNSTREAM_CLIENT_VALUE = "mcp";
15957
16009
 
15958
16010
  // ../../packages/types/src/mcp-surface.ts
15959
16011
  var MCP_HIDDEN_NARRATIVE_STYLES = [
15960
- "gap_replication"
16012
+ "gap_replication",
16013
+ // The blocked storyteller family is not offered, not even when revising an
16014
+ // existing script.
16015
+ ...BLOCKED_NARRATIVE_STYLES
15961
16016
  ];
15962
16017
  var McpNarrativeStyleSchema = NarrativeStyle.exclude(MCP_HIDDEN_NARRATIVE_STYLES);
15963
16018
  var MCP_ANGLE_NARRATIVE_STYLES = [
@@ -15971,10 +16026,6 @@ var MCP_ANGLE_NARRATIVE_STYLES = [
15971
16026
  "wild_card",
15972
16027
  "animated_problem_pixar",
15973
16028
  "sassy_product_pixar",
15974
- "animated_storyteller",
15975
- "animated_inner_journey",
15976
- "animated_object_soul",
15977
- "animated_timeline",
15978
16029
  "market"
15979
16030
  ];
15980
16031
  var McpAngleNarrativeStyleSchema = NarrativeStyle.extract(MCP_ANGLE_NARRATIVE_STYLES);
@@ -17262,7 +17313,7 @@ var ApiClient = class {
17262
17313
  };
17263
17314
 
17264
17315
  // src/index.ts
17265
- var MCP_VERSION = "8.9.2";
17316
+ var MCP_VERSION = "8.10.1";
17266
17317
 
17267
17318
  // src/meta-upload-app.ts
17268
17319
  import { readFileSync } from "fs";
@@ -17911,11 +17962,7 @@ var VideoPresetEnum = VideoPreset.extract([
17911
17962
  "cinematic",
17912
17963
  "wild_card",
17913
17964
  "pixar_problem",
17914
- "pixar_sassy",
17915
- "storyteller",
17916
- "inner_journey",
17917
- "object_soul",
17918
- "timeline"
17965
+ "pixar_sassy"
17919
17966
  ]);
17920
17967
  var VideoStructureEnum = VideoStructure;
17921
17968
  var VideoQualityEnum = VideoQuality;
@@ -19759,8 +19806,8 @@ var CreateProductTaskInput = z82.object({
19759
19806
  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
19807
  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
19808
  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.'),
19809
+ 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.'),
19810
+ 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
19811
  durationSeconds: z82.union([
19765
19812
  z82.literal(15),
19766
19813
  z82.literal(30)
@@ -19772,7 +19819,7 @@ var CreateProductTaskInput = z82.object({
19772
19819
  videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El proveedor se elige internamente. Default: economy.'),
19773
19820
  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
19821
  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.'),
19822
+ 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
19823
  outputs: z82.array(z82.enum([
19777
19824
  "landing",
19778
19825
  "video",
@@ -19880,7 +19927,7 @@ var PendingActionPayload = z82.discriminatedUnion("kind", [
19880
19927
  // an opaque HTTP 400 after the model already believed it had been saved.
19881
19928
  features: z82.array(z82.string().min(1).max(MCP_REVIEW_FEATURE_ITEM_MAX)).max(10).optional(),
19882
19929
  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.'),
19930
+ 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
19931
  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
19932
  actorId: z82.string().max(120).nullable().optional(),
19886
19933
  creativeDirection: z82.string().max(2e3).optional(),
@@ -19893,7 +19940,7 @@ var PendingActionPayload = z82.discriminatedUnion("kind", [
19893
19940
  ]).optional().describe("Elecci\xF3n expl\xEDcita: market usa el estudio disponible; guided usa la narrativa elegida para este \xE1ngulo."),
19894
19941
  angle: z82.string().min(1).max(480).optional(),
19895
19942
  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.'),
19943
+ 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
19944
  actor: z82.string().min(1).max(360).optional(),
19898
19945
  actorId: z82.string().max(120).nullable().optional(),
19899
19946
  creativeDirection: z82.string().max(2e3).optional()
@@ -19969,7 +20016,10 @@ var StatusForResolveSchema = z82.object({
19969
20016
  "480p",
19970
20017
  "720p"
19971
20018
  ]).optional(),
19972
- narrativeStyle: NarrativeStyleEnum.optional(),
20019
+ // READ from /v1/status: the canonical enum, not the public input policy.
20020
+ // A task created before a narrative was blocked/hidden must still parse,
20021
+ // or resolve_pending_action could never approve it.
20022
+ narrativeStyle: NarrativeStyle.optional(),
19973
20023
  pauseForVideoScriptReview: z82.boolean().optional(),
19974
20024
  pendingUserAction: z82.object({
19975
20025
  kind: z82.string(),
@@ -21009,7 +21059,7 @@ var VideoCreativeSetup = z83.discriminatedUnion("mode", [
21009
21059
  mode: z83.literal("guided"),
21010
21060
  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
21061
  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.'),
21062
+ 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
21063
  presenter: VideoPresenter,
21014
21064
  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
21065
  }).strict()
@@ -21028,7 +21078,7 @@ var VideoInput = z83.object({
21028
21078
  ]).describe('Relaci\xF3n de aspecto. "9:16" = vertical (TikTok/Reels \u2014 default recomendado para ads). "16:9" = horizontal (YouTube). "Auto" = decide la IA.'),
21029
21079
  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
21080
  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.'),
21081
+ 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
21082
  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
21083
  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
21084
  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.1",
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.",