@productmaker/mcp 12.12.0 → 12.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/http.js +61 -10
  2. package/dist/stdio.js +61 -10
  3. package/package.json +3 -3
package/dist/http.js CHANGED
@@ -9408,10 +9408,13 @@ var AnchoredIntel = z25.object({
9408
9408
  * (prod 97352dac), and a blanket upfront preset must NOT block the winner
9409
9409
  * replica (2026-08-04) while a review-time pick does (#1807). The origin is
9410
9410
  * the only thing that tells them apart. Absent ⇒ legacy review decision.
9411
+ * `default` = nobody chose: the server's approval-time market default
9412
+ * (owner A′, 2026-11-07) — a later card pick still replaces it.
9411
9413
  */
9412
9414
  narrativeSelectionSource: z25.enum([
9413
9415
  "create",
9414
- "review"
9416
+ "review",
9417
+ "default"
9415
9418
  ]).optional(),
9416
9419
  painPointIndices: z25.array(z25.number().int().nonnegative()).max(10),
9417
9420
  hookIndices: z25.array(z25.number().int().nonnegative()).max(10),
@@ -19062,6 +19065,43 @@ var SaveAgentPlaybookSchema = z78.object({
19062
19065
  requestId: RequestIdSchema.optional(),
19063
19066
  body: z78.string().trim().min(1).max(AGENT_MEMORY_LIMITS.playbookChars)
19064
19067
  }).strict();
19068
+ var AGENT_PENDING_OPERATION_TARGETS = [
19069
+ "campaign",
19070
+ "adset"
19071
+ ];
19072
+ var MetaObjectIdSchema = z78.string().trim().regex(/^\d{1,30}$/u);
19073
+ var AgentPendingOperationSchema = z78.discriminatedUnion("type", [
19074
+ z78.object({
19075
+ type: z78.literal("meta_set_status"),
19076
+ target: z78.enum(AGENT_PENDING_OPERATION_TARGETS),
19077
+ objectId: MetaObjectIdSchema,
19078
+ status: z78.enum([
19079
+ "ACTIVE",
19080
+ "PAUSED"
19081
+ ])
19082
+ }).strict(),
19083
+ z78.object({
19084
+ type: z78.literal("meta_set_daily_budget"),
19085
+ target: z78.enum(AGENT_PENDING_OPERATION_TARGETS),
19086
+ objectId: MetaObjectIdSchema,
19087
+ /** En unidades de la moneda (COP 80000, USD 25.5), no en las de Meta. */
19088
+ amount: z78.number().positive().max(1e9),
19089
+ currency: z78.string().trim().length(3).toUpperCase(),
19090
+ /** Lo que tenía al proponerlo (obligatorio): si ya no coincide, no se pisa. */
19091
+ expectedAmount: z78.number().positive().max(1e9)
19092
+ }).strict()
19093
+ ]);
19094
+ var AGENT_PENDING_EXECUTION_OUTCOMES = [
19095
+ "applied",
19096
+ "skipped",
19097
+ "failed"
19098
+ ];
19099
+ var AgentPendingExecutionSchema = z78.object({
19100
+ outcome: z78.enum(AGENT_PENDING_EXECUTION_OUTCOMES),
19101
+ /** Para el dueño, en palabras simples. */
19102
+ message: z78.string(),
19103
+ at: z78.string()
19104
+ });
19065
19105
  var SaveAgentPendingAddSchema = z78.object({
19066
19106
  type: z78.literal("pending_add"),
19067
19107
  requestId: RequestIdSchema.optional(),
@@ -19071,7 +19111,9 @@ var SaveAgentPendingAddSchema = z78.object({
19071
19111
  action: z78.string().trim().min(1).max(AGENT_MEMORY_LIMITS.shortTextChars),
19072
19112
  dueAt: z78.string().datetime({
19073
19113
  offset: true
19074
- }).optional()
19114
+ }).optional(),
19115
+ /** Solo en `approval`: al aprobarse, ProductMaker lo ejecuta una vez. */
19116
+ operation: AgentPendingOperationSchema.optional()
19075
19117
  }).strict();
19076
19118
  var SaveAgentPendingResolveSchema = z78.object({
19077
19119
  type: z78.literal("pending_resolve"),
@@ -19213,6 +19255,8 @@ var AgentPendingItemSchema = z78.object({
19213
19255
  ...AGENT_PENDING_RESOLUTIONS
19214
19256
  ]),
19215
19257
  resolution: z78.string().nullable(),
19258
+ operation: AgentPendingOperationSchema.nullable(),
19259
+ execution: AgentPendingExecutionSchema.nullable(),
19216
19260
  createdAt: z78.string(),
19217
19261
  resolvedAt: z78.string().nullable()
19218
19262
  });
@@ -25688,7 +25732,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
25688
25732
  defineCapability(
25689
25733
  "resolve_pending_action",
25690
25734
  // MCP 12.8.0: + manual-only, cohort-gated «viral» preset/angle narrative.
25691
- "bba3af0b7022b79ba4859c7d6b880e835459cb23095d22147cb17127e8fb0dc9",
25735
+ // MCP 12.12.1: angleEdits[].narrativeSelection documents the server market default.
25736
+ "c15335d63c13e6a086f6b8f8a859bec6345faad6548d7ee637f50103721b5ff0",
25692
25737
  "credit_consuming",
25693
25738
  "creative",
25694
25739
  [
@@ -26391,13 +26436,16 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
26391
26436
  ], SHARED_CHANNEL_EXPOSURE),
26392
26437
  defineCapability(
26393
26438
  "save_agent_memory",
26394
- "46ddddd8ae1475dd880215696499016bbec5f961891748b82095cbf7f7a49c0c",
26395
- // La memoria es el cuaderno del propio agente: no toca nada que vea el
26396
- // comprador ni cobra créditos, así que escribir no pide confirmación.
26439
+ "6d4a660cfe9018cdd4392dbaa73a3490e562fa2b7040b10ec70f9044637294a7",
26440
+ // La memoria es el cuaderno del propio agente y no cobra créditos. Aprobar
26441
+ // un pendiente que trae `operation` sí cambia la campaña o el conjunto en
26442
+ // Meta: esa aprobación ES la confirmación del dueño (el pendiente muestra
26443
+ // el cambio exacto), así que la herramienta no pide otra.
26397
26444
  "none",
26398
26445
  "business",
26399
26446
  [
26400
- "state_change"
26447
+ "state_change",
26448
+ "external_mutation"
26401
26449
  ],
26402
26450
  [
26403
26451
  slot("memory", true, [
@@ -32292,7 +32340,7 @@ var ApiClient = class {
32292
32340
  };
32293
32341
 
32294
32342
  // src/index.ts
32295
- var MCP_VERSION = "12.12.0";
32343
+ var MCP_VERSION = "12.13.0";
32296
32344
 
32297
32345
  // src/meta-upload-app.ts
32298
32346
  import { readFileSync } from "fs";
@@ -33689,6 +33737,7 @@ var McpErrorCode = {
33689
33737
  AGENT_EXPERIMENT_ALREADY_CLOSED: "AGENT_EXPERIMENT_ALREADY_CLOSED",
33690
33738
  AGENT_PENDING_NOT_FOUND: "AGENT_PENDING_NOT_FOUND",
33691
33739
  AGENT_PENDING_ALREADY_RESOLVED: "AGENT_PENDING_ALREADY_RESOLVED",
33740
+ AGENT_OPERATION_NEEDS_APPROVAL: "AGENT_OPERATION_NEEDS_APPROVAL",
33692
33741
  AGENT_COUNTRY_REQUIRED: "AGENT_COUNTRY_REQUIRED",
33693
33742
  AGENT_RUN_NO_SLOT: "AGENT_RUN_NO_SLOT",
33694
33743
  AGENT_RUN_ALREADY_CLAIMED: "AGENT_RUN_ALREADY_CLAIMED",
@@ -33937,6 +33986,7 @@ var CODE_MESSAGES = {
33937
33986
  AGENT_EXPERIMENT_ALREADY_CLOSED: "That experiment is already closed and is never reopened. Open a new experiment if you are testing again.",
33938
33987
  AGENT_PENDING_NOT_FOUND: "No pending item with that id in this account's agent memory. Read the brief for the open ones.",
33939
33988
  AGENT_PENDING_ALREADY_RESOLVED: "That pending item was already resolved. Add a new one if the decision changed.",
33989
+ AGENT_OPERATION_NEEDS_APPROVAL: 'Only a pending item of kind "approval" carries an operation (it runs in Meta when the owner approves). Send it as an approval, or drop the operation.',
33940
33990
  AGENT_COUNTRY_REQUIRED: `This account has no country or time zone yet. Save the seller's country (or time zone) with save_agent_memory type "settings", then try again.`,
33941
33991
  AGENT_RUN_NO_SLOT: "No autopilot turn is open now in the agent's time zone. Do not run a phase; turns start at 9, 12, 15, 18 and 21.",
33942
33992
  AGENT_RUN_ALREADY_CLAIMED: "This autopilot turn was already claimed. Do not run this phase again; `run` shows who claimed it.",
@@ -33993,6 +34043,7 @@ var AGENT_MEMORY_CODES = [
33993
34043
  McpErrorCode.AGENT_EXPERIMENT_ALREADY_CLOSED,
33994
34044
  McpErrorCode.AGENT_PENDING_NOT_FOUND,
33995
34045
  McpErrorCode.AGENT_PENDING_ALREADY_RESOLVED,
34046
+ McpErrorCode.AGENT_OPERATION_NEEDS_APPROVAL,
33996
34047
  McpErrorCode.AGENT_COUNTRY_REQUIRED,
33997
34048
  McpErrorCode.AGENT_RUN_NO_SLOT,
33998
34049
  McpErrorCode.AGENT_RUN_ALREADY_CLAIMED,
@@ -36351,7 +36402,7 @@ var PendingActionPayload = z141.discriminatedUnion("kind", [
36351
36402
  narrativeSelection: z141.enum([
36352
36403
  "market",
36353
36404
  "guided"
36354
- ]).optional().describe("Elecci\xF3n expl\xEDcita: market usa el estudio disponible; guided usa la narrativa elegida para este \xE1ngulo."),
36405
+ ]).optional().describe("Elecci\xF3n expl\xEDcita: market usa el estudio disponible; guided usa la narrativa elegida para este \xE1ngulo. Si la omites y la tarea tiene un estudio de mercado listo, el \xE1ngulo sale en market; repetir la narrativeStyle que propuso la IA no cuenta como elecci\xF3n."),
36355
36406
  angle: z141.string().min(1).max(480).optional(),
36356
36407
  buyerPersona: z141.string().min(1).max(360).optional(),
36357
36408
  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. "viral" (sin voz, r\xF3tulos y antes/despu\xE9s; solo Multiescena de 15 s) solo est\xE1 disponible para cuentas habilitadas y tareas del motor nuevo.'),
@@ -42453,7 +42504,7 @@ function registerAgentMemoryTools(server, api) {
42453
42504
  }
42454
42505
  });
42455
42506
  server.registerTool("save_agent_memory", {
42456
- description: saveGuidance.summary + ' Un solo punto de escritura; `memory.type` dice qu\xE9 se guarda: "product" crea o actualiza la ficha por `code` (la primera vez exige `name`; solo cambia los campos enviados; `verdict: ""` lo borra; productControlId/projectId deben ser de esta cuenta), "experiment_open" abre un experimento con hip\xF3tesis y montaje, "experiment_close" lo cierra UNA vez con outcome y conclusi\xF3n (cerrado no se reabre: 409, abre otro), "playbook" guarda una versi\xF3n NUEVA completa del playbook (no un parche; las anteriores quedan en el historial), "pending_add" deja una aprobaci\xF3n o seguimiento abierto, "pending_resolve" lo resuelve UNA vez (409 si ya estaba resuelto), "note" escribe en la bit\xE1cora, "settings" guarda la configuraci\xF3n del agente (solo los campos enviados; `null` borra un valor; pa\xEDs, moneda, presupuesto y topes salen del contexto o de lo que diga el vendedor, nunca de un n\xFAmero por defecto; prender `autopilot` exige pa\xEDs o zona: 400 AGENT_COUNTRY_REQUIRED) y "spend" lleva el gasto del d\xEDa: `mode: "check"` ANTES de cada gasto (cr\xE9ditos cotizados o 1 conjunto nuevo) dice si cabe (`fits`) en el tope del vendedor, sin escribir (sin tope, siempre cabe); si no cabe, pide OK al vendedor. `mode: "record"` DESPU\xC9S registra el costo real con una `ref` por cobro (`<taskId>:<tool>`, runId o adSetId): repetirlo con el mismo monto no suma dos veces y otro monto con la misma ref es 409 AGENT_SPEND_REF_CONFLICT. "run_claim" reclama el turno vigente del piloto autom\xE1tico ANTES de correr una fase programada (turnos a las 9, 12, 15, 18 y 21 en la zona del agente; devuelve `phase`: launch, review, evening o weekly): 409 AGENT_RUN_ALREADY_CLAIMED si ya lo corri\xF3 otro (no lo corras), 409 AGENT_RUN_NO_SLOT fuera de horario, 400 AGENT_COUNTRY_REQUIRED si a\xFAn no hay pa\xEDs ni zona (guarda primero "settings" con el pa\xEDs o la zona del vendedor y reclama otra vez). "run_complete" cierra ese turno UNA vez con `status` done o failed y el reporte corto en `summary`. `productCode` debe existir (404 AGENT_PRODUCT_NOT_FOUND: guarda primero el producto). Para reintentar sin duplicar, manda el mismo `requestId` (UUID): la respuesta trae `replayed: true`. Nunca guardes datos personales de compradores, contrase\xF1as ni llaves.',
42507
+ description: saveGuidance.summary + ' Un solo punto de escritura; `memory.type` dice qu\xE9 se guarda: "product" crea o actualiza la ficha por `code` (la primera vez exige `name`; solo cambia los campos enviados; `verdict: ""` lo borra; productControlId/projectId deben ser de esta cuenta), "experiment_open" abre un experimento con hip\xF3tesis y montaje, "experiment_close" lo cierra UNA vez con outcome y conclusi\xF3n (cerrado no se reabre: 409, abre otro), "playbook" guarda una versi\xF3n NUEVA completa del playbook (no un parche; las anteriores quedan en el historial), "pending_add" deja una aprobaci\xF3n o seguimiento abierto (una aprobaci\xF3n de activar, pausar o cambiar el presupuesto diario de una campa\xF1a o un conjunto lleva `operation` con el id de Meta y, para presupuesto, monto y moneda de la cuenta m\xE1s `expectedAmount` con lo que ten\xEDa; 400 AGENT_OPERATION_NEEDS_APPROVAL en un seguimiento), "pending_resolve" lo resuelve UNA vez (409 si ya estaba resuelto; aprobar uno con `operation` lo ejecuta ProductMaker en Meta en ese momento y `execution` trae el resultado: applied, skipped si ya estaba as\xED o alguien lo cambi\xF3, o failed; no lo repitas t\xFA), "note" escribe en la bit\xE1cora, "settings" guarda la configuraci\xF3n del agente (solo los campos enviados; `null` borra un valor; pa\xEDs, moneda, presupuesto y topes salen del contexto o de lo que diga el vendedor, nunca de un n\xFAmero por defecto; prender `autopilot` exige pa\xEDs o zona: 400 AGENT_COUNTRY_REQUIRED) y "spend" lleva el gasto del d\xEDa: `mode: "check"` ANTES de cada gasto (cr\xE9ditos cotizados o 1 conjunto nuevo) dice si cabe (`fits`) en el tope del vendedor, sin escribir (sin tope, siempre cabe); si no cabe, pide OK al vendedor. `mode: "record"` DESPU\xC9S registra el costo real con una `ref` por cobro (`<taskId>:<tool>`, runId o adSetId): repetirlo con el mismo monto no suma dos veces y otro monto con la misma ref es 409 AGENT_SPEND_REF_CONFLICT. "run_claim" reclama el turno vigente del piloto autom\xE1tico ANTES de correr una fase programada (turnos a las 9, 12, 15, 18 y 21 en la zona del agente; devuelve `phase`: launch, review, evening o weekly): 409 AGENT_RUN_ALREADY_CLAIMED si ya lo corri\xF3 otro (no lo corras), 409 AGENT_RUN_NO_SLOT fuera de horario, 400 AGENT_COUNTRY_REQUIRED si a\xFAn no hay pa\xEDs ni zona (guarda primero "settings" con el pa\xEDs o la zona del vendedor y reclama otra vez). "run_complete" cierra ese turno UNA vez con `status` done o failed y el reporte corto en `summary`. `productCode` debe existir (404 AGENT_PRODUCT_NOT_FOUND: guarda primero el producto). Para reintentar sin duplicar, manda el mismo `requestId` (UUID): la respuesta trae `replayed: true`. Nunca guardes datos personales de compradores, contrase\xF1as ni llaves.',
42457
42508
  inputSchema: SaveInput.shape,
42458
42509
  annotations: OVERWRITES_INTERNAL
42459
42510
  }, async (input) => {
package/dist/stdio.js CHANGED
@@ -9183,10 +9183,13 @@ var AnchoredIntel = z25.object({
9183
9183
  * (prod 97352dac), and a blanket upfront preset must NOT block the winner
9184
9184
  * replica (2026-08-04) while a review-time pick does (#1807). The origin is
9185
9185
  * the only thing that tells them apart. Absent ⇒ legacy review decision.
9186
+ * `default` = nobody chose: the server's approval-time market default
9187
+ * (owner A′, 2026-11-07) — a later card pick still replaces it.
9186
9188
  */
9187
9189
  narrativeSelectionSource: z25.enum([
9188
9190
  "create",
9189
- "review"
9191
+ "review",
9192
+ "default"
9190
9193
  ]).optional(),
9191
9194
  painPointIndices: z25.array(z25.number().int().nonnegative()).max(10),
9192
9195
  hookIndices: z25.array(z25.number().int().nonnegative()).max(10),
@@ -18837,6 +18840,43 @@ var SaveAgentPlaybookSchema = z78.object({
18837
18840
  requestId: RequestIdSchema.optional(),
18838
18841
  body: z78.string().trim().min(1).max(AGENT_MEMORY_LIMITS.playbookChars)
18839
18842
  }).strict();
18843
+ var AGENT_PENDING_OPERATION_TARGETS = [
18844
+ "campaign",
18845
+ "adset"
18846
+ ];
18847
+ var MetaObjectIdSchema = z78.string().trim().regex(/^\d{1,30}$/u);
18848
+ var AgentPendingOperationSchema = z78.discriminatedUnion("type", [
18849
+ z78.object({
18850
+ type: z78.literal("meta_set_status"),
18851
+ target: z78.enum(AGENT_PENDING_OPERATION_TARGETS),
18852
+ objectId: MetaObjectIdSchema,
18853
+ status: z78.enum([
18854
+ "ACTIVE",
18855
+ "PAUSED"
18856
+ ])
18857
+ }).strict(),
18858
+ z78.object({
18859
+ type: z78.literal("meta_set_daily_budget"),
18860
+ target: z78.enum(AGENT_PENDING_OPERATION_TARGETS),
18861
+ objectId: MetaObjectIdSchema,
18862
+ /** En unidades de la moneda (COP 80000, USD 25.5), no en las de Meta. */
18863
+ amount: z78.number().positive().max(1e9),
18864
+ currency: z78.string().trim().length(3).toUpperCase(),
18865
+ /** Lo que tenía al proponerlo (obligatorio): si ya no coincide, no se pisa. */
18866
+ expectedAmount: z78.number().positive().max(1e9)
18867
+ }).strict()
18868
+ ]);
18869
+ var AGENT_PENDING_EXECUTION_OUTCOMES = [
18870
+ "applied",
18871
+ "skipped",
18872
+ "failed"
18873
+ ];
18874
+ var AgentPendingExecutionSchema = z78.object({
18875
+ outcome: z78.enum(AGENT_PENDING_EXECUTION_OUTCOMES),
18876
+ /** Para el dueño, en palabras simples. */
18877
+ message: z78.string(),
18878
+ at: z78.string()
18879
+ });
18840
18880
  var SaveAgentPendingAddSchema = z78.object({
18841
18881
  type: z78.literal("pending_add"),
18842
18882
  requestId: RequestIdSchema.optional(),
@@ -18846,7 +18886,9 @@ var SaveAgentPendingAddSchema = z78.object({
18846
18886
  action: z78.string().trim().min(1).max(AGENT_MEMORY_LIMITS.shortTextChars),
18847
18887
  dueAt: z78.string().datetime({
18848
18888
  offset: true
18849
- }).optional()
18889
+ }).optional(),
18890
+ /** Solo en `approval`: al aprobarse, ProductMaker lo ejecuta una vez. */
18891
+ operation: AgentPendingOperationSchema.optional()
18850
18892
  }).strict();
18851
18893
  var SaveAgentPendingResolveSchema = z78.object({
18852
18894
  type: z78.literal("pending_resolve"),
@@ -18988,6 +19030,8 @@ var AgentPendingItemSchema = z78.object({
18988
19030
  ...AGENT_PENDING_RESOLUTIONS
18989
19031
  ]),
18990
19032
  resolution: z78.string().nullable(),
19033
+ operation: AgentPendingOperationSchema.nullable(),
19034
+ execution: AgentPendingExecutionSchema.nullable(),
18991
19035
  createdAt: z78.string(),
18992
19036
  resolvedAt: z78.string().nullable()
18993
19037
  });
@@ -25463,7 +25507,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
25463
25507
  defineCapability(
25464
25508
  "resolve_pending_action",
25465
25509
  // MCP 12.8.0: + manual-only, cohort-gated «viral» preset/angle narrative.
25466
- "bba3af0b7022b79ba4859c7d6b880e835459cb23095d22147cb17127e8fb0dc9",
25510
+ // MCP 12.12.1: angleEdits[].narrativeSelection documents the server market default.
25511
+ "c15335d63c13e6a086f6b8f8a859bec6345faad6548d7ee637f50103721b5ff0",
25467
25512
  "credit_consuming",
25468
25513
  "creative",
25469
25514
  [
@@ -26166,13 +26211,16 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
26166
26211
  ], SHARED_CHANNEL_EXPOSURE),
26167
26212
  defineCapability(
26168
26213
  "save_agent_memory",
26169
- "46ddddd8ae1475dd880215696499016bbec5f961891748b82095cbf7f7a49c0c",
26170
- // La memoria es el cuaderno del propio agente: no toca nada que vea el
26171
- // comprador ni cobra créditos, así que escribir no pide confirmación.
26214
+ "6d4a660cfe9018cdd4392dbaa73a3490e562fa2b7040b10ec70f9044637294a7",
26215
+ // La memoria es el cuaderno del propio agente y no cobra créditos. Aprobar
26216
+ // un pendiente que trae `operation` sí cambia la campaña o el conjunto en
26217
+ // Meta: esa aprobación ES la confirmación del dueño (el pendiente muestra
26218
+ // el cambio exacto), así que la herramienta no pide otra.
26172
26219
  "none",
26173
26220
  "business",
26174
26221
  [
26175
- "state_change"
26222
+ "state_change",
26223
+ "external_mutation"
26176
26224
  ],
26177
26225
  [
26178
26226
  slot("memory", true, [
@@ -30619,7 +30667,7 @@ var ApiClient = class {
30619
30667
  };
30620
30668
 
30621
30669
  // src/index.ts
30622
- var MCP_VERSION = "12.12.0";
30670
+ var MCP_VERSION = "12.13.0";
30623
30671
 
30624
30672
  // src/meta-upload-app.ts
30625
30673
  import { readFileSync } from "fs";
@@ -32020,6 +32068,7 @@ var McpErrorCode = {
32020
32068
  AGENT_EXPERIMENT_ALREADY_CLOSED: "AGENT_EXPERIMENT_ALREADY_CLOSED",
32021
32069
  AGENT_PENDING_NOT_FOUND: "AGENT_PENDING_NOT_FOUND",
32022
32070
  AGENT_PENDING_ALREADY_RESOLVED: "AGENT_PENDING_ALREADY_RESOLVED",
32071
+ AGENT_OPERATION_NEEDS_APPROVAL: "AGENT_OPERATION_NEEDS_APPROVAL",
32023
32072
  AGENT_COUNTRY_REQUIRED: "AGENT_COUNTRY_REQUIRED",
32024
32073
  AGENT_RUN_NO_SLOT: "AGENT_RUN_NO_SLOT",
32025
32074
  AGENT_RUN_ALREADY_CLAIMED: "AGENT_RUN_ALREADY_CLAIMED",
@@ -32268,6 +32317,7 @@ var CODE_MESSAGES = {
32268
32317
  AGENT_EXPERIMENT_ALREADY_CLOSED: "That experiment is already closed and is never reopened. Open a new experiment if you are testing again.",
32269
32318
  AGENT_PENDING_NOT_FOUND: "No pending item with that id in this account's agent memory. Read the brief for the open ones.",
32270
32319
  AGENT_PENDING_ALREADY_RESOLVED: "That pending item was already resolved. Add a new one if the decision changed.",
32320
+ AGENT_OPERATION_NEEDS_APPROVAL: 'Only a pending item of kind "approval" carries an operation (it runs in Meta when the owner approves). Send it as an approval, or drop the operation.',
32271
32321
  AGENT_COUNTRY_REQUIRED: `This account has no country or time zone yet. Save the seller's country (or time zone) with save_agent_memory type "settings", then try again.`,
32272
32322
  AGENT_RUN_NO_SLOT: "No autopilot turn is open now in the agent's time zone. Do not run a phase; turns start at 9, 12, 15, 18 and 21.",
32273
32323
  AGENT_RUN_ALREADY_CLAIMED: "This autopilot turn was already claimed. Do not run this phase again; `run` shows who claimed it.",
@@ -32324,6 +32374,7 @@ var AGENT_MEMORY_CODES = [
32324
32374
  McpErrorCode.AGENT_EXPERIMENT_ALREADY_CLOSED,
32325
32375
  McpErrorCode.AGENT_PENDING_NOT_FOUND,
32326
32376
  McpErrorCode.AGENT_PENDING_ALREADY_RESOLVED,
32377
+ McpErrorCode.AGENT_OPERATION_NEEDS_APPROVAL,
32327
32378
  McpErrorCode.AGENT_COUNTRY_REQUIRED,
32328
32379
  McpErrorCode.AGENT_RUN_NO_SLOT,
32329
32380
  McpErrorCode.AGENT_RUN_ALREADY_CLAIMED,
@@ -34836,7 +34887,7 @@ var PendingActionPayload = z140.discriminatedUnion("kind", [
34836
34887
  narrativeSelection: z140.enum([
34837
34888
  "market",
34838
34889
  "guided"
34839
- ]).optional().describe("Elecci\xF3n expl\xEDcita: market usa el estudio disponible; guided usa la narrativa elegida para este \xE1ngulo."),
34890
+ ]).optional().describe("Elecci\xF3n expl\xEDcita: market usa el estudio disponible; guided usa la narrativa elegida para este \xE1ngulo. Si la omites y la tarea tiene un estudio de mercado listo, el \xE1ngulo sale en market; repetir la narrativeStyle que propuso la IA no cuenta como elecci\xF3n."),
34840
34891
  angle: z140.string().min(1).max(480).optional(),
34841
34892
  buyerPersona: z140.string().min(1).max(360).optional(),
34842
34893
  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. "viral" (sin voz, r\xF3tulos y antes/despu\xE9s; solo Multiescena de 15 s) solo est\xE1 disponible para cuentas habilitadas y tareas del motor nuevo.'),
@@ -40938,7 +40989,7 @@ function registerAgentMemoryTools(server, api) {
40938
40989
  }
40939
40990
  });
40940
40991
  server.registerTool("save_agent_memory", {
40941
- description: saveGuidance.summary + ' Un solo punto de escritura; `memory.type` dice qu\xE9 se guarda: "product" crea o actualiza la ficha por `code` (la primera vez exige `name`; solo cambia los campos enviados; `verdict: ""` lo borra; productControlId/projectId deben ser de esta cuenta), "experiment_open" abre un experimento con hip\xF3tesis y montaje, "experiment_close" lo cierra UNA vez con outcome y conclusi\xF3n (cerrado no se reabre: 409, abre otro), "playbook" guarda una versi\xF3n NUEVA completa del playbook (no un parche; las anteriores quedan en el historial), "pending_add" deja una aprobaci\xF3n o seguimiento abierto, "pending_resolve" lo resuelve UNA vez (409 si ya estaba resuelto), "note" escribe en la bit\xE1cora, "settings" guarda la configuraci\xF3n del agente (solo los campos enviados; `null` borra un valor; pa\xEDs, moneda, presupuesto y topes salen del contexto o de lo que diga el vendedor, nunca de un n\xFAmero por defecto; prender `autopilot` exige pa\xEDs o zona: 400 AGENT_COUNTRY_REQUIRED) y "spend" lleva el gasto del d\xEDa: `mode: "check"` ANTES de cada gasto (cr\xE9ditos cotizados o 1 conjunto nuevo) dice si cabe (`fits`) en el tope del vendedor, sin escribir (sin tope, siempre cabe); si no cabe, pide OK al vendedor. `mode: "record"` DESPU\xC9S registra el costo real con una `ref` por cobro (`<taskId>:<tool>`, runId o adSetId): repetirlo con el mismo monto no suma dos veces y otro monto con la misma ref es 409 AGENT_SPEND_REF_CONFLICT. "run_claim" reclama el turno vigente del piloto autom\xE1tico ANTES de correr una fase programada (turnos a las 9, 12, 15, 18 y 21 en la zona del agente; devuelve `phase`: launch, review, evening o weekly): 409 AGENT_RUN_ALREADY_CLAIMED si ya lo corri\xF3 otro (no lo corras), 409 AGENT_RUN_NO_SLOT fuera de horario, 400 AGENT_COUNTRY_REQUIRED si a\xFAn no hay pa\xEDs ni zona (guarda primero "settings" con el pa\xEDs o la zona del vendedor y reclama otra vez). "run_complete" cierra ese turno UNA vez con `status` done o failed y el reporte corto en `summary`. `productCode` debe existir (404 AGENT_PRODUCT_NOT_FOUND: guarda primero el producto). Para reintentar sin duplicar, manda el mismo `requestId` (UUID): la respuesta trae `replayed: true`. Nunca guardes datos personales de compradores, contrase\xF1as ni llaves.',
40992
+ description: saveGuidance.summary + ' Un solo punto de escritura; `memory.type` dice qu\xE9 se guarda: "product" crea o actualiza la ficha por `code` (la primera vez exige `name`; solo cambia los campos enviados; `verdict: ""` lo borra; productControlId/projectId deben ser de esta cuenta), "experiment_open" abre un experimento con hip\xF3tesis y montaje, "experiment_close" lo cierra UNA vez con outcome y conclusi\xF3n (cerrado no se reabre: 409, abre otro), "playbook" guarda una versi\xF3n NUEVA completa del playbook (no un parche; las anteriores quedan en el historial), "pending_add" deja una aprobaci\xF3n o seguimiento abierto (una aprobaci\xF3n de activar, pausar o cambiar el presupuesto diario de una campa\xF1a o un conjunto lleva `operation` con el id de Meta y, para presupuesto, monto y moneda de la cuenta m\xE1s `expectedAmount` con lo que ten\xEDa; 400 AGENT_OPERATION_NEEDS_APPROVAL en un seguimiento), "pending_resolve" lo resuelve UNA vez (409 si ya estaba resuelto; aprobar uno con `operation` lo ejecuta ProductMaker en Meta en ese momento y `execution` trae el resultado: applied, skipped si ya estaba as\xED o alguien lo cambi\xF3, o failed; no lo repitas t\xFA), "note" escribe en la bit\xE1cora, "settings" guarda la configuraci\xF3n del agente (solo los campos enviados; `null` borra un valor; pa\xEDs, moneda, presupuesto y topes salen del contexto o de lo que diga el vendedor, nunca de un n\xFAmero por defecto; prender `autopilot` exige pa\xEDs o zona: 400 AGENT_COUNTRY_REQUIRED) y "spend" lleva el gasto del d\xEDa: `mode: "check"` ANTES de cada gasto (cr\xE9ditos cotizados o 1 conjunto nuevo) dice si cabe (`fits`) en el tope del vendedor, sin escribir (sin tope, siempre cabe); si no cabe, pide OK al vendedor. `mode: "record"` DESPU\xC9S registra el costo real con una `ref` por cobro (`<taskId>:<tool>`, runId o adSetId): repetirlo con el mismo monto no suma dos veces y otro monto con la misma ref es 409 AGENT_SPEND_REF_CONFLICT. "run_claim" reclama el turno vigente del piloto autom\xE1tico ANTES de correr una fase programada (turnos a las 9, 12, 15, 18 y 21 en la zona del agente; devuelve `phase`: launch, review, evening o weekly): 409 AGENT_RUN_ALREADY_CLAIMED si ya lo corri\xF3 otro (no lo corras), 409 AGENT_RUN_NO_SLOT fuera de horario, 400 AGENT_COUNTRY_REQUIRED si a\xFAn no hay pa\xEDs ni zona (guarda primero "settings" con el pa\xEDs o la zona del vendedor y reclama otra vez). "run_complete" cierra ese turno UNA vez con `status` done o failed y el reporte corto en `summary`. `productCode` debe existir (404 AGENT_PRODUCT_NOT_FOUND: guarda primero el producto). Para reintentar sin duplicar, manda el mismo `requestId` (UUID): la respuesta trae `replayed: true`. Nunca guardes datos personales de compradores, contrase\xF1as ni llaves.',
40942
40993
  inputSchema: SaveInput.shape,
40943
40994
  annotations: OVERWRITES_INTERNAL
40944
40995
  }, async (input) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productmaker/mcp",
3
- "version": "12.12.0",
3
+ "version": "12.13.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.",
@@ -67,8 +67,8 @@
67
67
  "typescript": "^7.0.2",
68
68
  "vitest": "5.0.3",
69
69
  "@packages/product-economics": "0.1.0",
70
- "@packages/types": "0.1.0",
71
- "@packages/utils": "0.1.0"
70
+ "@packages/utils": "0.1.0",
71
+ "@packages/types": "0.1.0"
72
72
  },
73
73
  "publishConfig": {
74
74
  "access": "public"