@productmaker/mcp 12.12.1 → 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.
package/dist/http.js CHANGED
@@ -19065,6 +19065,43 @@ var SaveAgentPlaybookSchema = z78.object({
19065
19065
  requestId: RequestIdSchema.optional(),
19066
19066
  body: z78.string().trim().min(1).max(AGENT_MEMORY_LIMITS.playbookChars)
19067
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
+ });
19068
19105
  var SaveAgentPendingAddSchema = z78.object({
19069
19106
  type: z78.literal("pending_add"),
19070
19107
  requestId: RequestIdSchema.optional(),
@@ -19074,7 +19111,9 @@ var SaveAgentPendingAddSchema = z78.object({
19074
19111
  action: z78.string().trim().min(1).max(AGENT_MEMORY_LIMITS.shortTextChars),
19075
19112
  dueAt: z78.string().datetime({
19076
19113
  offset: true
19077
- }).optional()
19114
+ }).optional(),
19115
+ /** Solo en `approval`: al aprobarse, ProductMaker lo ejecuta una vez. */
19116
+ operation: AgentPendingOperationSchema.optional()
19078
19117
  }).strict();
19079
19118
  var SaveAgentPendingResolveSchema = z78.object({
19080
19119
  type: z78.literal("pending_resolve"),
@@ -19216,6 +19255,8 @@ var AgentPendingItemSchema = z78.object({
19216
19255
  ...AGENT_PENDING_RESOLUTIONS
19217
19256
  ]),
19218
19257
  resolution: z78.string().nullable(),
19258
+ operation: AgentPendingOperationSchema.nullable(),
19259
+ execution: AgentPendingExecutionSchema.nullable(),
19219
19260
  createdAt: z78.string(),
19220
19261
  resolvedAt: z78.string().nullable()
19221
19262
  });
@@ -26395,13 +26436,16 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
26395
26436
  ], SHARED_CHANNEL_EXPOSURE),
26396
26437
  defineCapability(
26397
26438
  "save_agent_memory",
26398
- "46ddddd8ae1475dd880215696499016bbec5f961891748b82095cbf7f7a49c0c",
26399
- // La memoria es el cuaderno del propio agente: no toca nada que vea el
26400
- // 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.
26401
26444
  "none",
26402
26445
  "business",
26403
26446
  [
26404
- "state_change"
26447
+ "state_change",
26448
+ "external_mutation"
26405
26449
  ],
26406
26450
  [
26407
26451
  slot("memory", true, [
@@ -32296,7 +32340,7 @@ var ApiClient = class {
32296
32340
  };
32297
32341
 
32298
32342
  // src/index.ts
32299
- var MCP_VERSION = "12.12.1";
32343
+ var MCP_VERSION = "12.13.0";
32300
32344
 
32301
32345
  // src/meta-upload-app.ts
32302
32346
  import { readFileSync } from "fs";
@@ -33693,6 +33737,7 @@ var McpErrorCode = {
33693
33737
  AGENT_EXPERIMENT_ALREADY_CLOSED: "AGENT_EXPERIMENT_ALREADY_CLOSED",
33694
33738
  AGENT_PENDING_NOT_FOUND: "AGENT_PENDING_NOT_FOUND",
33695
33739
  AGENT_PENDING_ALREADY_RESOLVED: "AGENT_PENDING_ALREADY_RESOLVED",
33740
+ AGENT_OPERATION_NEEDS_APPROVAL: "AGENT_OPERATION_NEEDS_APPROVAL",
33696
33741
  AGENT_COUNTRY_REQUIRED: "AGENT_COUNTRY_REQUIRED",
33697
33742
  AGENT_RUN_NO_SLOT: "AGENT_RUN_NO_SLOT",
33698
33743
  AGENT_RUN_ALREADY_CLAIMED: "AGENT_RUN_ALREADY_CLAIMED",
@@ -33941,6 +33986,7 @@ var CODE_MESSAGES = {
33941
33986
  AGENT_EXPERIMENT_ALREADY_CLOSED: "That experiment is already closed and is never reopened. Open a new experiment if you are testing again.",
33942
33987
  AGENT_PENDING_NOT_FOUND: "No pending item with that id in this account's agent memory. Read the brief for the open ones.",
33943
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.',
33944
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.`,
33945
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.",
33946
33992
  AGENT_RUN_ALREADY_CLAIMED: "This autopilot turn was already claimed. Do not run this phase again; `run` shows who claimed it.",
@@ -33997,6 +34043,7 @@ var AGENT_MEMORY_CODES = [
33997
34043
  McpErrorCode.AGENT_EXPERIMENT_ALREADY_CLOSED,
33998
34044
  McpErrorCode.AGENT_PENDING_NOT_FOUND,
33999
34045
  McpErrorCode.AGENT_PENDING_ALREADY_RESOLVED,
34046
+ McpErrorCode.AGENT_OPERATION_NEEDS_APPROVAL,
34000
34047
  McpErrorCode.AGENT_COUNTRY_REQUIRED,
34001
34048
  McpErrorCode.AGENT_RUN_NO_SLOT,
34002
34049
  McpErrorCode.AGENT_RUN_ALREADY_CLAIMED,
@@ -42457,7 +42504,7 @@ function registerAgentMemoryTools(server, api) {
42457
42504
  }
42458
42505
  });
42459
42506
  server.registerTool("save_agent_memory", {
42460
- 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.',
42461
42508
  inputSchema: SaveInput.shape,
42462
42509
  annotations: OVERWRITES_INTERNAL
42463
42510
  }, async (input) => {
package/dist/stdio.js CHANGED
@@ -18840,6 +18840,43 @@ var SaveAgentPlaybookSchema = z78.object({
18840
18840
  requestId: RequestIdSchema.optional(),
18841
18841
  body: z78.string().trim().min(1).max(AGENT_MEMORY_LIMITS.playbookChars)
18842
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
+ });
18843
18880
  var SaveAgentPendingAddSchema = z78.object({
18844
18881
  type: z78.literal("pending_add"),
18845
18882
  requestId: RequestIdSchema.optional(),
@@ -18849,7 +18886,9 @@ var SaveAgentPendingAddSchema = z78.object({
18849
18886
  action: z78.string().trim().min(1).max(AGENT_MEMORY_LIMITS.shortTextChars),
18850
18887
  dueAt: z78.string().datetime({
18851
18888
  offset: true
18852
- }).optional()
18889
+ }).optional(),
18890
+ /** Solo en `approval`: al aprobarse, ProductMaker lo ejecuta una vez. */
18891
+ operation: AgentPendingOperationSchema.optional()
18853
18892
  }).strict();
18854
18893
  var SaveAgentPendingResolveSchema = z78.object({
18855
18894
  type: z78.literal("pending_resolve"),
@@ -18991,6 +19030,8 @@ var AgentPendingItemSchema = z78.object({
18991
19030
  ...AGENT_PENDING_RESOLUTIONS
18992
19031
  ]),
18993
19032
  resolution: z78.string().nullable(),
19033
+ operation: AgentPendingOperationSchema.nullable(),
19034
+ execution: AgentPendingExecutionSchema.nullable(),
18994
19035
  createdAt: z78.string(),
18995
19036
  resolvedAt: z78.string().nullable()
18996
19037
  });
@@ -26170,13 +26211,16 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
26170
26211
  ], SHARED_CHANNEL_EXPOSURE),
26171
26212
  defineCapability(
26172
26213
  "save_agent_memory",
26173
- "46ddddd8ae1475dd880215696499016bbec5f961891748b82095cbf7f7a49c0c",
26174
- // La memoria es el cuaderno del propio agente: no toca nada que vea el
26175
- // 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.
26176
26219
  "none",
26177
26220
  "business",
26178
26221
  [
26179
- "state_change"
26222
+ "state_change",
26223
+ "external_mutation"
26180
26224
  ],
26181
26225
  [
26182
26226
  slot("memory", true, [
@@ -30623,7 +30667,7 @@ var ApiClient = class {
30623
30667
  };
30624
30668
 
30625
30669
  // src/index.ts
30626
- var MCP_VERSION = "12.12.1";
30670
+ var MCP_VERSION = "12.13.0";
30627
30671
 
30628
30672
  // src/meta-upload-app.ts
30629
30673
  import { readFileSync } from "fs";
@@ -32024,6 +32068,7 @@ var McpErrorCode = {
32024
32068
  AGENT_EXPERIMENT_ALREADY_CLOSED: "AGENT_EXPERIMENT_ALREADY_CLOSED",
32025
32069
  AGENT_PENDING_NOT_FOUND: "AGENT_PENDING_NOT_FOUND",
32026
32070
  AGENT_PENDING_ALREADY_RESOLVED: "AGENT_PENDING_ALREADY_RESOLVED",
32071
+ AGENT_OPERATION_NEEDS_APPROVAL: "AGENT_OPERATION_NEEDS_APPROVAL",
32027
32072
  AGENT_COUNTRY_REQUIRED: "AGENT_COUNTRY_REQUIRED",
32028
32073
  AGENT_RUN_NO_SLOT: "AGENT_RUN_NO_SLOT",
32029
32074
  AGENT_RUN_ALREADY_CLAIMED: "AGENT_RUN_ALREADY_CLAIMED",
@@ -32272,6 +32317,7 @@ var CODE_MESSAGES = {
32272
32317
  AGENT_EXPERIMENT_ALREADY_CLOSED: "That experiment is already closed and is never reopened. Open a new experiment if you are testing again.",
32273
32318
  AGENT_PENDING_NOT_FOUND: "No pending item with that id in this account's agent memory. Read the brief for the open ones.",
32274
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.',
32275
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.`,
32276
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.",
32277
32323
  AGENT_RUN_ALREADY_CLAIMED: "This autopilot turn was already claimed. Do not run this phase again; `run` shows who claimed it.",
@@ -32328,6 +32374,7 @@ var AGENT_MEMORY_CODES = [
32328
32374
  McpErrorCode.AGENT_EXPERIMENT_ALREADY_CLOSED,
32329
32375
  McpErrorCode.AGENT_PENDING_NOT_FOUND,
32330
32376
  McpErrorCode.AGENT_PENDING_ALREADY_RESOLVED,
32377
+ McpErrorCode.AGENT_OPERATION_NEEDS_APPROVAL,
32331
32378
  McpErrorCode.AGENT_COUNTRY_REQUIRED,
32332
32379
  McpErrorCode.AGENT_RUN_NO_SLOT,
32333
32380
  McpErrorCode.AGENT_RUN_ALREADY_CLAIMED,
@@ -40942,7 +40989,7 @@ function registerAgentMemoryTools(server, api) {
40942
40989
  }
40943
40990
  });
40944
40991
  server.registerTool("save_agent_memory", {
40945
- 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.',
40946
40993
  inputSchema: SaveInput.shape,
40947
40994
  annotations: OVERWRITES_INTERNAL
40948
40995
  }, async (input) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productmaker/mcp",
3
- "version": "12.12.1",
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"