@productmaker/mcp 8.7.1 → 8.8.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
@@ -276,6 +276,15 @@ The `base64` field was removed. MCP JSON-RPC transports truncate large tool argu
276
276
 
277
277
  ## Version history
278
278
 
279
+ ### 8.8.1 — Variantes en video de una sola toma
280
+
281
+ - La generación canónica conserva las variantes confirmadas en una sola toma de Grok, H3 y Wan, con la misma persona usando cada prenda y sin cambiar la estructura ni el precio cotizado.
282
+ - Versión patch sincronizada con ProductMaker; las herramientas y los esquemas públicos MCP permanecen iguales.
283
+
284
+ ### 8.7.1 — Mix con múltiples ejes y referencias
285
+
286
+ - Versión patch sincronizada con la mejora canónica de Mix: múltiples ejes y referencias, con análisis acotado; las herramientas y los esquemas públicos MCP permanecen iguales.
287
+
279
288
  ### 8.7.0 — Control financiero en beta cerrada
280
289
 
281
290
  - Operaciones por país, importación de pedidos, sincronización Shopify, gastos fijos, publicidad y P&L usan las mismas rutas canónicas protegidas para administradores y colaboradores beta.
package/dist/http.js CHANGED
@@ -1998,6 +1998,28 @@ var CreativeGeneratorJob = z14.object({
1998
1998
  referenceVersionId: z14.string().uuid().optional(),
1999
1999
  cleanImagesWaitAttempt: z14.number().int().nonnegative().optional()
2000
2000
  });
2001
+ var ImageCreativeEditStatus = z14.enum([
2002
+ "queued",
2003
+ "processing",
2004
+ "published",
2005
+ "failed"
2006
+ ]);
2007
+ var ImageCreativeRegenerateRequest = z14.object({
2008
+ variantIndex: z14.number().int().nonnegative(),
2009
+ comment: z14.string().trim().min(1).max(1e3),
2010
+ clientRequestId: z14.string().trim().min(1).max(160).optional()
2011
+ });
2012
+ var ImageCreativeEditStatusResponse = z14.object({
2013
+ ok: z14.literal(true),
2014
+ operationId: z14.string().uuid(),
2015
+ taskId: z14.string().uuid(),
2016
+ variantIndex: z14.number().int().nonnegative(),
2017
+ status: ImageCreativeEditStatus,
2018
+ assetKey: z14.string().optional(),
2019
+ assetUrl: z14.string().url().optional(),
2020
+ degraded: z14.boolean(),
2021
+ error: z14.string().nullable()
2022
+ });
2001
2023
 
2002
2024
  // ../../packages/types/src/product-label.ts
2003
2025
  import { z as z15 } from "zod";
@@ -6471,7 +6493,10 @@ var MVPResult = z35.object({
6471
6493
  landing: z35.object({
6472
6494
  // Allow legacy data (10 sections × 2 variants) and new data (7 sections × 2)
6473
6495
  images: z35.array(LandingImageReadable).max(MAX_LANDING_IMAGES),
6474
- manifestVersion: z35.literal("v1")
6496
+ manifestVersion: z35.literal("v1"),
6497
+ // Landing-scoped on purpose: the regeneration dialog warns that provider
6498
+ // policy can block edits for licensed-character products.
6499
+ licensedCharacter: z35.boolean().optional()
6475
6500
  }),
6476
6501
  videoGenerators: z35.array(VideoGenerator).min(1).optional(),
6477
6502
  videoStructure: VideoStructure.optional(),
@@ -9644,12 +9669,12 @@ var DEFAULT_PRICING = {
9644
9669
  ourCostCents: 0.2,
9645
9670
  userPriceCents: 0.4
9646
9671
  },
9647
- // Landing image QA (gemini-3.8-flash since 2026-08-01, 1-2 images). Anatomy/text/background cutoff.
9648
- // 1.88¢ = the post-model-swap steady state at prod averages (11,109 prompt / 928 completion
9649
- // tokens) WITH the prompt-cache breakpoint; without caching it would be ~2.36¢.
9672
+ // Landing image QA (Qwen-2.5-VL-72B since 2026-10-02, 1-2 images). Anatomy/text/background cutoff.
9673
+ // Measured on owner corpus with Qwen-2.5-VL-72B: ~1,500 prompt tokens + 150 completion ≈ $0.00135 (0.135¢ our cost).
9674
+ // 0.25¢ ourCost keeps ~80% headroom; 2x house markup.
9650
9675
  "openrouter:landing-image-qa": {
9651
- ourCostCents: 1.88,
9652
- userPriceCents: 3.76
9676
+ ourCostCents: 0.25,
9677
+ userPriceCents: 0.5
9653
9678
  },
9654
9679
  // Usage decider (role `usage-decider`: Gemini 3.8 Flash effort:'high' since
9655
9680
  // 05f543eae, ≤6 images + seller text, temperature 0 json_object, once per
@@ -9726,9 +9751,10 @@ var DEFAULT_PRICING = {
9726
9751
  ourCostCents: 0.82,
9727
9752
  userPriceCents: 1.64
9728
9753
  },
9754
+ // Creative image anatomy QA (Qwen-2.5-VL-72B since 2026-10-02). Sized identically to landing-image-qa.
9729
9755
  "openrouter:creative-image-anatomy-qa": {
9730
- ourCostCents: 1.88,
9731
- userPriceCents: 3.76
9756
+ ourCostCents: 0.25,
9757
+ userPriceCents: 0.5
9732
9758
  },
9733
9759
  // Anatomy check (Gemini 3 Flash Preview, 1 image). Standalone anatomy verification.
9734
9760
  "openrouter:anatomy-check": {
@@ -9974,24 +10000,19 @@ var DEFAULT_PRICING = {
9974
10000
  userPriceCents: 4.5
9975
10001
  },
9976
10002
  // (d) DENSE anatomy detector (the default anatomy detector since 2026-09-26;
9977
- // QA_ANATOMY_DETECTOR=frame_judge reverts): gemini-3.1-pro judges every extracted
9978
- // frame at 1 fps, 5 frames per call, each call billing its frame count — the rate is
10003
+ // QA_ANATOMY_DETECTOR=frame_judge reverts): Qwen-2.5-VL-72B judges extracted
10004
+ // frames at 1 fps, 5 frames per call, each call billing its frame count — the rate is
9979
10005
  // PER FRAME like (b) and scales with QA_DENSE_DETECTOR_MAX_FRAMES. Measured on the
9980
10006
  // owner corpus with the shipped config (reasoning=low, grouped): $1.062 / 296 frames
9981
- // ≈ 0.36c/frame; 0.5c keeps ~40% headroom. The old 3.0c fallback was the 2026-09-22
9982
- // one-still-per-call spike at default reasoning (~1.95c/frame) and would have quoted
9983
- // QA ~10x its cost. Re-derive from 30d BillingEntry once live.
10007
+ // ≈ 0.36c/frame; 0.5c keeps ~40% headroom. Preserved to protect the 30d video credit gate
10008
+ // ceiling until 30d of live Qwen volume is recorded. Re-derive from 30d BillingEntry once live.
9984
10009
  "openrouter:video-qa-anatomy-dense-detector": {
9985
10010
  ourCostCents: 0.5,
9986
10011
  userPriceCents: 1
9987
10012
  },
9988
- // (e) Dense-mode tracing confirmation: the SAME confirmer call as (c) but routed
9989
- // to gemini-3.1-pro — flash measured 3/11 recall confirming dense stills, so
9990
- // dense findings never confirm on the gate model. PER CALL.
9991
- // Spike measured $2.22/80 ≈ 2.8c/call; the 2026-09-26 A/B measured 2.6c/flag.
9992
- // 3.0c keeps it above both. (The former 5.0c/10.0c, times the old 4-confirmation cap,
9993
- // inflated the credit gate's `max` by up to ~12,600 credits on a 30 s multi-scene.)
9994
- // Re-derive from 30d BillingEntry once live.
10013
+ // (e) Dense-mode tracing confirmation: Qwen-2.5-VL-72B evaluates 3 frames (t-1, t, t+1)
10014
+ // per flagged finding. Preserved to protect the 30d video credit gate ceiling
10015
+ // until 30d of live Qwen volume is recorded. Re-derive from 30d BillingEntry once live.
9995
10016
  "openrouter:video-qa-anatomy-dense-confirm": {
9996
10017
  ourCostCents: 3,
9997
10018
  userPriceCents: 6
@@ -11405,6 +11426,13 @@ var RegenerateLandingRoleResponse = z55.object({
11405
11426
  promptIndex: z55.number().int().nonnegative(),
11406
11427
  operationId: z55.string().min(1)
11407
11428
  });
11429
+ var LandingRegenerationFailureCode = z55.enum([
11430
+ "licensed_character_blocked",
11431
+ "provider_policy_blocked",
11432
+ "qa_rejected",
11433
+ "superseded",
11434
+ "provider_error"
11435
+ ]);
11408
11436
  var LandingRegenerationStatusResponse = z55.object({
11409
11437
  ok: z55.literal(true),
11410
11438
  operationId: z55.string().min(1),
@@ -11412,6 +11440,7 @@ var LandingRegenerationStatusResponse = z55.object({
11412
11440
  status: LandingRegenerationStatus,
11413
11441
  refunded: z55.boolean(),
11414
11442
  failureReason: z55.string().nullable(),
11443
+ failureCode: LandingRegenerationFailureCode.nullable().optional(),
11415
11444
  publishedAssetKey: z55.string().nullable(),
11416
11445
  updatedAt: z55.string().datetime()
11417
11446
  });
@@ -12369,6 +12398,23 @@ var CAPABILITY_MODEL_GUIDANCE = {
12369
12398
  "es trabajo pagado y requiere confirmaci\xF3n expl\xEDcita"
12370
12399
  ]
12371
12400
  },
12401
+ get_image_edit_status: {
12402
+ summary: "Consulta s\xF3lo el estado durable de una correcci\xF3n aceptada y su imagen entregada. No genera ni reintenta im\xE1genes; Task.done no significa que esta correcci\xF3n haya terminado.",
12403
+ useWhen: [
12404
+ "una correcci\xF3n de imagen ya devolvi\xF3 su operaci\xF3n aceptada",
12405
+ "la persona consulta el resultado de esa correcci\xF3n"
12406
+ ],
12407
+ avoidWhen: [
12408
+ "todav\xEDa no existe una operaci\xF3n aceptada"
12409
+ ],
12410
+ defaults: [
12411
+ "consulta la misma operaci\xF3n hasta su publicaci\xF3n o fallo durable",
12412
+ "un fallo al consultar no autoriza otra correcci\xF3n pagada"
12413
+ ],
12414
+ disclosures: [
12415
+ "la consulta no consume cr\xE9ditos ni inicia trabajo"
12416
+ ]
12417
+ },
12372
12418
  edit_task_draft: {
12373
12419
  summary: "Edita el draft de un angle de marketing antes de la generaci\xF3n.",
12374
12420
  useWhen: [
@@ -14324,7 +14370,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14324
14370
  "task",
14325
14371
  "video"
14326
14372
  ]),
14327
- defineCapability("edit_image_creative", "ce0abba871436850bd1db0ea4bcdade9ef35420ebd83833e2d5c2dcf70378ec0", "credit_consuming", "creative", [
14373
+ defineCapability("edit_image_creative", "50eca473829328dfb63b9cbae03a9835b79c510e29528563e09b7eb3e5e9bca4", "credit_consuming", "creative", [
14328
14374
  "credit_consuming",
14329
14375
  "state_change"
14330
14376
  ], [
@@ -14334,12 +14380,27 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14334
14380
  ]),
14335
14381
  slot("edit_instruction", true, [
14336
14382
  "instruction"
14337
- ])
14383
+ ]),
14384
+ slot("client_request", false, [
14385
+ "clientRequestId"
14386
+ ], [], "server")
14338
14387
  ], [
14339
14388
  "creative"
14340
14389
  ], [
14341
14390
  "creative"
14342
14391
  ]),
14392
+ defineCapability("get_image_edit_status", "fe59aefd433afe7e5a2d8b4a81084583750c1447c877b6bce698340326665141", "none", "read_only", [
14393
+ "read"
14394
+ ], [
14395
+ slot("creative_operation", true, [
14396
+ "taskId",
14397
+ "operationId"
14398
+ ], [], "server")
14399
+ ], [
14400
+ "creative_edit_operation"
14401
+ ], [
14402
+ "creative_edit_status"
14403
+ ], MCP_ONLY_CHANNEL_EXPOSURE),
14343
14404
  defineCapability("edit_task_draft", "1c9343bdce51aac36ec6254557c8a904037746523168527f012b4c5b6361e98e", "state_change", "creative", [
14344
14405
  "state_change"
14345
14406
  ], [
@@ -18684,7 +18745,7 @@ var ApiClient = class {
18684
18745
  };
18685
18746
 
18686
18747
  // src/index.ts
18687
- var MCP_VERSION = "8.7.1";
18748
+ var MCP_VERSION = "8.8.1";
18688
18749
 
18689
18750
  // src/meta-upload-app.ts
18690
18751
  import { readFileSync } from "fs";
@@ -22316,6 +22377,7 @@ import { z as z83 } from "zod";
22316
22377
  var generateFreeVideoGuidance = getProductMakerCapabilityModelGuidance("generate_free_video");
22317
22378
  var generateVideoCreativeGuidance = getProductMakerCapabilityModelGuidance("generate_video_creative");
22318
22379
  var generateImageCreativesGuidance = getProductMakerCapabilityModelGuidance("generate_image_creatives");
22380
+ var imageEditStatusGuidance = getProductMakerCapabilityModelGuidance("get_image_edit_status");
22319
22381
  var editImageCreativeGuidance = getProductMakerCapabilityModelGuidance("edit_image_creative");
22320
22382
  var generateLandingGuidance = getProductMakerCapabilityModelGuidance("generate_landing");
22321
22383
  var CreativeRefs = {
@@ -22537,6 +22599,7 @@ var ImageInput = z83.object({
22537
22599
  var EditImageCreativeInput = z83.object({
22538
22600
  taskId: z83.string().uuid().describe("ID de la tarea de imagen ya finalizada."),
22539
22601
  variantIndex: z83.number().int().min(0).max(10).describe("\xCDndice de la variante a corregir (0 = primera imagen)."),
22602
+ clientRequestId: z83.string().min(1).max(160).optional().describe("Identidad estable de esta correcci\xF3n; reutil\xEDzala al reconciliar una respuesta perdida, no para otra instrucci\xF3n."),
22540
22603
  instruction: z83.string().min(1).max(1e3).describe('Qu\xE9 cambiar en esa imagen. Ej. "quita el badge de env\xEDo gratis", "cambia el fondo a blanco".')
22541
22604
  });
22542
22605
  var LandingInput = z83.object({
@@ -22811,13 +22874,30 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
22811
22874
  await requirePaidCreativeConfirmation(server, `Correcci\xF3n pagada de la imagen ${input.variantIndex + 1}.`);
22812
22875
  const r = await api.postJson(`/v1/creatives/images/${encodeURIComponent(input.taskId)}/regenerate`, {
22813
22876
  comment: input.instruction,
22814
- variantIndex: input.variantIndex
22877
+ variantIndex: input.variantIndex,
22878
+ ...input.clientRequestId ? {
22879
+ clientRequestId: input.clientRequestId
22880
+ } : {}
22815
22881
  });
22816
22882
  return asText(r);
22817
22883
  } catch (e) {
22818
22884
  throw translateError(e);
22819
22885
  }
22820
22886
  });
22887
+ server.registerTool("get_image_edit_status", {
22888
+ description: imageEditStatusGuidance.summary,
22889
+ inputSchema: {
22890
+ taskId: z83.string().uuid(),
22891
+ operationId: z83.string().uuid()
22892
+ },
22893
+ annotations: READS_INTERNAL
22894
+ }, async (input) => {
22895
+ try {
22896
+ return asText(await api.getJson(`/v1/creatives/images/${encodeURIComponent(input.taskId)}/operations/${encodeURIComponent(input.operationId)}`));
22897
+ } catch (error) {
22898
+ throw translateError(error);
22899
+ }
22900
+ });
22821
22901
  server.registerTool("generate_landing", {
22822
22902
  description: generateLandingGuidance.summary + " No expone landing editable/code mientras siga siendo admin-only. Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), language, country y creativeSetup. Ante \u201Ccrea una landing con este producto\u201D y una foto local, llama primero `request_media_upload` y usa los assetId. Pregunta price, offer y compareAtPrice cuando aplique; no asumas country/language.\n\nCONFIGURACI\xD3N: usa guided salvo delegaci\xF3n total expl\xEDcita. Presenta UN checklist compacto \u2014no preguntas seriales\u2014 con estrategia, formato, competencia, m\xE9todos de pago, contexto, direcci\xF3n creativa y headline/subheadline exactos opcionales. Prop\xF3n defaults recomendados; null significa que el usuario deleg\xF3 esa decisi\xF3n concreta, nunca que el agente la olvid\xF3.\n\nANTES de invocar, muestra el resumen y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. guided pausa para revisar el \xE1ngulo; automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite la review.",
22823
22903
  inputSchema: LandingInput.shape,
package/dist/stdio.js CHANGED
@@ -2020,6 +2020,28 @@ var CreativeGeneratorJob = z14.object({
2020
2020
  referenceVersionId: z14.string().uuid().optional(),
2021
2021
  cleanImagesWaitAttempt: z14.number().int().nonnegative().optional()
2022
2022
  });
2023
+ var ImageCreativeEditStatus = z14.enum([
2024
+ "queued",
2025
+ "processing",
2026
+ "published",
2027
+ "failed"
2028
+ ]);
2029
+ var ImageCreativeRegenerateRequest = z14.object({
2030
+ variantIndex: z14.number().int().nonnegative(),
2031
+ comment: z14.string().trim().min(1).max(1e3),
2032
+ clientRequestId: z14.string().trim().min(1).max(160).optional()
2033
+ });
2034
+ var ImageCreativeEditStatusResponse = z14.object({
2035
+ ok: z14.literal(true),
2036
+ operationId: z14.string().uuid(),
2037
+ taskId: z14.string().uuid(),
2038
+ variantIndex: z14.number().int().nonnegative(),
2039
+ status: ImageCreativeEditStatus,
2040
+ assetKey: z14.string().optional(),
2041
+ assetUrl: z14.string().url().optional(),
2042
+ degraded: z14.boolean(),
2043
+ error: z14.string().nullable()
2044
+ });
2023
2045
 
2024
2046
  // ../../packages/types/src/product-label.ts
2025
2047
  import { z as z15 } from "zod";
@@ -6493,7 +6515,10 @@ var MVPResult = z35.object({
6493
6515
  landing: z35.object({
6494
6516
  // Allow legacy data (10 sections × 2 variants) and new data (7 sections × 2)
6495
6517
  images: z35.array(LandingImageReadable).max(MAX_LANDING_IMAGES),
6496
- manifestVersion: z35.literal("v1")
6518
+ manifestVersion: z35.literal("v1"),
6519
+ // Landing-scoped on purpose: the regeneration dialog warns that provider
6520
+ // policy can block edits for licensed-character products.
6521
+ licensedCharacter: z35.boolean().optional()
6497
6522
  }),
6498
6523
  videoGenerators: z35.array(VideoGenerator).min(1).optional(),
6499
6524
  videoStructure: VideoStructure.optional(),
@@ -9666,12 +9691,12 @@ var DEFAULT_PRICING = {
9666
9691
  ourCostCents: 0.2,
9667
9692
  userPriceCents: 0.4
9668
9693
  },
9669
- // Landing image QA (gemini-3.8-flash since 2026-08-01, 1-2 images). Anatomy/text/background cutoff.
9670
- // 1.88¢ = the post-model-swap steady state at prod averages (11,109 prompt / 928 completion
9671
- // tokens) WITH the prompt-cache breakpoint; without caching it would be ~2.36¢.
9694
+ // Landing image QA (Qwen-2.5-VL-72B since 2026-10-02, 1-2 images). Anatomy/text/background cutoff.
9695
+ // Measured on owner corpus with Qwen-2.5-VL-72B: ~1,500 prompt tokens + 150 completion ≈ $0.00135 (0.135¢ our cost).
9696
+ // 0.25¢ ourCost keeps ~80% headroom; 2x house markup.
9672
9697
  "openrouter:landing-image-qa": {
9673
- ourCostCents: 1.88,
9674
- userPriceCents: 3.76
9698
+ ourCostCents: 0.25,
9699
+ userPriceCents: 0.5
9675
9700
  },
9676
9701
  // Usage decider (role `usage-decider`: Gemini 3.8 Flash effort:'high' since
9677
9702
  // 05f543eae, ≤6 images + seller text, temperature 0 json_object, once per
@@ -9748,9 +9773,10 @@ var DEFAULT_PRICING = {
9748
9773
  ourCostCents: 0.82,
9749
9774
  userPriceCents: 1.64
9750
9775
  },
9776
+ // Creative image anatomy QA (Qwen-2.5-VL-72B since 2026-10-02). Sized identically to landing-image-qa.
9751
9777
  "openrouter:creative-image-anatomy-qa": {
9752
- ourCostCents: 1.88,
9753
- userPriceCents: 3.76
9778
+ ourCostCents: 0.25,
9779
+ userPriceCents: 0.5
9754
9780
  },
9755
9781
  // Anatomy check (Gemini 3 Flash Preview, 1 image). Standalone anatomy verification.
9756
9782
  "openrouter:anatomy-check": {
@@ -9996,24 +10022,19 @@ var DEFAULT_PRICING = {
9996
10022
  userPriceCents: 4.5
9997
10023
  },
9998
10024
  // (d) DENSE anatomy detector (the default anatomy detector since 2026-09-26;
9999
- // QA_ANATOMY_DETECTOR=frame_judge reverts): gemini-3.1-pro judges every extracted
10000
- // frame at 1 fps, 5 frames per call, each call billing its frame count — the rate is
10025
+ // QA_ANATOMY_DETECTOR=frame_judge reverts): Qwen-2.5-VL-72B judges extracted
10026
+ // frames at 1 fps, 5 frames per call, each call billing its frame count — the rate is
10001
10027
  // PER FRAME like (b) and scales with QA_DENSE_DETECTOR_MAX_FRAMES. Measured on the
10002
10028
  // owner corpus with the shipped config (reasoning=low, grouped): $1.062 / 296 frames
10003
- // ≈ 0.36c/frame; 0.5c keeps ~40% headroom. The old 3.0c fallback was the 2026-09-22
10004
- // one-still-per-call spike at default reasoning (~1.95c/frame) and would have quoted
10005
- // QA ~10x its cost. Re-derive from 30d BillingEntry once live.
10029
+ // ≈ 0.36c/frame; 0.5c keeps ~40% headroom. Preserved to protect the 30d video credit gate
10030
+ // ceiling until 30d of live Qwen volume is recorded. Re-derive from 30d BillingEntry once live.
10006
10031
  "openrouter:video-qa-anatomy-dense-detector": {
10007
10032
  ourCostCents: 0.5,
10008
10033
  userPriceCents: 1
10009
10034
  },
10010
- // (e) Dense-mode tracing confirmation: the SAME confirmer call as (c) but routed
10011
- // to gemini-3.1-pro — flash measured 3/11 recall confirming dense stills, so
10012
- // dense findings never confirm on the gate model. PER CALL.
10013
- // Spike measured $2.22/80 ≈ 2.8c/call; the 2026-09-26 A/B measured 2.6c/flag.
10014
- // 3.0c keeps it above both. (The former 5.0c/10.0c, times the old 4-confirmation cap,
10015
- // inflated the credit gate's `max` by up to ~12,600 credits on a 30 s multi-scene.)
10016
- // Re-derive from 30d BillingEntry once live.
10035
+ // (e) Dense-mode tracing confirmation: Qwen-2.5-VL-72B evaluates 3 frames (t-1, t, t+1)
10036
+ // per flagged finding. Preserved to protect the 30d video credit gate ceiling
10037
+ // until 30d of live Qwen volume is recorded. Re-derive from 30d BillingEntry once live.
10017
10038
  "openrouter:video-qa-anatomy-dense-confirm": {
10018
10039
  ourCostCents: 3,
10019
10040
  userPriceCents: 6
@@ -11427,6 +11448,13 @@ var RegenerateLandingRoleResponse = z55.object({
11427
11448
  promptIndex: z55.number().int().nonnegative(),
11428
11449
  operationId: z55.string().min(1)
11429
11450
  });
11451
+ var LandingRegenerationFailureCode = z55.enum([
11452
+ "licensed_character_blocked",
11453
+ "provider_policy_blocked",
11454
+ "qa_rejected",
11455
+ "superseded",
11456
+ "provider_error"
11457
+ ]);
11430
11458
  var LandingRegenerationStatusResponse = z55.object({
11431
11459
  ok: z55.literal(true),
11432
11460
  operationId: z55.string().min(1),
@@ -11434,6 +11462,7 @@ var LandingRegenerationStatusResponse = z55.object({
11434
11462
  status: LandingRegenerationStatus,
11435
11463
  refunded: z55.boolean(),
11436
11464
  failureReason: z55.string().nullable(),
11465
+ failureCode: LandingRegenerationFailureCode.nullable().optional(),
11437
11466
  publishedAssetKey: z55.string().nullable(),
11438
11467
  updatedAt: z55.string().datetime()
11439
11468
  });
@@ -12391,6 +12420,23 @@ var CAPABILITY_MODEL_GUIDANCE = {
12391
12420
  "es trabajo pagado y requiere confirmaci\xF3n expl\xEDcita"
12392
12421
  ]
12393
12422
  },
12423
+ get_image_edit_status: {
12424
+ summary: "Consulta s\xF3lo el estado durable de una correcci\xF3n aceptada y su imagen entregada. No genera ni reintenta im\xE1genes; Task.done no significa que esta correcci\xF3n haya terminado.",
12425
+ useWhen: [
12426
+ "una correcci\xF3n de imagen ya devolvi\xF3 su operaci\xF3n aceptada",
12427
+ "la persona consulta el resultado de esa correcci\xF3n"
12428
+ ],
12429
+ avoidWhen: [
12430
+ "todav\xEDa no existe una operaci\xF3n aceptada"
12431
+ ],
12432
+ defaults: [
12433
+ "consulta la misma operaci\xF3n hasta su publicaci\xF3n o fallo durable",
12434
+ "un fallo al consultar no autoriza otra correcci\xF3n pagada"
12435
+ ],
12436
+ disclosures: [
12437
+ "la consulta no consume cr\xE9ditos ni inicia trabajo"
12438
+ ]
12439
+ },
12394
12440
  edit_task_draft: {
12395
12441
  summary: "Edita el draft de un angle de marketing antes de la generaci\xF3n.",
12396
12442
  useWhen: [
@@ -14346,7 +14392,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14346
14392
  "task",
14347
14393
  "video"
14348
14394
  ]),
14349
- defineCapability("edit_image_creative", "ce0abba871436850bd1db0ea4bcdade9ef35420ebd83833e2d5c2dcf70378ec0", "credit_consuming", "creative", [
14395
+ defineCapability("edit_image_creative", "50eca473829328dfb63b9cbae03a9835b79c510e29528563e09b7eb3e5e9bca4", "credit_consuming", "creative", [
14350
14396
  "credit_consuming",
14351
14397
  "state_change"
14352
14398
  ], [
@@ -14356,12 +14402,27 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
14356
14402
  ]),
14357
14403
  slot("edit_instruction", true, [
14358
14404
  "instruction"
14359
- ])
14405
+ ]),
14406
+ slot("client_request", false, [
14407
+ "clientRequestId"
14408
+ ], [], "server")
14360
14409
  ], [
14361
14410
  "creative"
14362
14411
  ], [
14363
14412
  "creative"
14364
14413
  ]),
14414
+ defineCapability("get_image_edit_status", "fe59aefd433afe7e5a2d8b4a81084583750c1447c877b6bce698340326665141", "none", "read_only", [
14415
+ "read"
14416
+ ], [
14417
+ slot("creative_operation", true, [
14418
+ "taskId",
14419
+ "operationId"
14420
+ ], [], "server")
14421
+ ], [
14422
+ "creative_edit_operation"
14423
+ ], [
14424
+ "creative_edit_status"
14425
+ ], MCP_ONLY_CHANNEL_EXPOSURE),
14365
14426
  defineCapability("edit_task_draft", "1c9343bdce51aac36ec6254557c8a904037746523168527f012b4c5b6361e98e", "state_change", "creative", [
14366
14427
  "state_change"
14367
14428
  ], [
@@ -17016,7 +17077,7 @@ var ApiClient = class {
17016
17077
  };
17017
17078
 
17018
17079
  // src/index.ts
17019
- var MCP_VERSION = "8.7.1";
17080
+ var MCP_VERSION = "8.8.1";
17020
17081
 
17021
17082
  // src/meta-upload-app.ts
17022
17083
  import { readFileSync } from "fs";
@@ -20701,6 +20762,7 @@ import { z as z82 } from "zod";
20701
20762
  var generateFreeVideoGuidance = getProductMakerCapabilityModelGuidance("generate_free_video");
20702
20763
  var generateVideoCreativeGuidance = getProductMakerCapabilityModelGuidance("generate_video_creative");
20703
20764
  var generateImageCreativesGuidance = getProductMakerCapabilityModelGuidance("generate_image_creatives");
20765
+ var imageEditStatusGuidance = getProductMakerCapabilityModelGuidance("get_image_edit_status");
20704
20766
  var editImageCreativeGuidance = getProductMakerCapabilityModelGuidance("edit_image_creative");
20705
20767
  var generateLandingGuidance = getProductMakerCapabilityModelGuidance("generate_landing");
20706
20768
  var CreativeRefs = {
@@ -20922,6 +20984,7 @@ var ImageInput = z82.object({
20922
20984
  var EditImageCreativeInput = z82.object({
20923
20985
  taskId: z82.string().uuid().describe("ID de la tarea de imagen ya finalizada."),
20924
20986
  variantIndex: z82.number().int().min(0).max(10).describe("\xCDndice de la variante a corregir (0 = primera imagen)."),
20987
+ clientRequestId: z82.string().min(1).max(160).optional().describe("Identidad estable de esta correcci\xF3n; reutil\xEDzala al reconciliar una respuesta perdida, no para otra instrucci\xF3n."),
20925
20988
  instruction: z82.string().min(1).max(1e3).describe('Qu\xE9 cambiar en esa imagen. Ej. "quita el badge de env\xEDo gratis", "cambia el fondo a blanco".')
20926
20989
  });
20927
20990
  var LandingInput = z82.object({
@@ -21196,13 +21259,30 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
21196
21259
  await requirePaidCreativeConfirmation(server, `Correcci\xF3n pagada de la imagen ${input.variantIndex + 1}.`);
21197
21260
  const r = await api.postJson(`/v1/creatives/images/${encodeURIComponent(input.taskId)}/regenerate`, {
21198
21261
  comment: input.instruction,
21199
- variantIndex: input.variantIndex
21262
+ variantIndex: input.variantIndex,
21263
+ ...input.clientRequestId ? {
21264
+ clientRequestId: input.clientRequestId
21265
+ } : {}
21200
21266
  });
21201
21267
  return asText(r);
21202
21268
  } catch (e) {
21203
21269
  throw translateError(e);
21204
21270
  }
21205
21271
  });
21272
+ server.registerTool("get_image_edit_status", {
21273
+ description: imageEditStatusGuidance.summary,
21274
+ inputSchema: {
21275
+ taskId: z82.string().uuid(),
21276
+ operationId: z82.string().uuid()
21277
+ },
21278
+ annotations: READS_INTERNAL
21279
+ }, async (input) => {
21280
+ try {
21281
+ return asText(await api.getJson(`/v1/creatives/images/${encodeURIComponent(input.taskId)}/operations/${encodeURIComponent(input.operationId)}`));
21282
+ } catch (error) {
21283
+ throw translateError(error);
21284
+ }
21285
+ });
21206
21286
  server.registerTool("generate_landing", {
21207
21287
  description: generateLandingGuidance.summary + " No expone landing editable/code mientras siga siendo admin-only. Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), language, country y creativeSetup. Ante \u201Ccrea una landing con este producto\u201D y una foto local, llama primero `request_media_upload` y usa los assetId. Pregunta price, offer y compareAtPrice cuando aplique; no asumas country/language.\n\nCONFIGURACI\xD3N: usa guided salvo delegaci\xF3n total expl\xEDcita. Presenta UN checklist compacto \u2014no preguntas seriales\u2014 con estrategia, formato, competencia, m\xE9todos de pago, contexto, direcci\xF3n creativa y headline/subheadline exactos opcionales. Prop\xF3n defaults recomendados; null significa que el usuario deleg\xF3 esa decisi\xF3n concreta, nunca que el agente la olvid\xF3.\n\nANTES de invocar, muestra el resumen y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. guided pausa para revisar el \xE1ngulo; automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite la review.",
21208
21288
  inputSchema: LandingInput.shape,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productmaker/mcp",
3
- "version": "8.7.1",
3
+ "version": "8.8.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.",