@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.
- package/dist/http.js +61 -10
- package/dist/stdio.js +61 -10
- 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
|
-
|
|
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
|
-
"
|
|
26395
|
-
// La memoria es el cuaderno del propio agente
|
|
26396
|
-
//
|
|
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.
|
|
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
|
-
|
|
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
|
-
"
|
|
26170
|
-
// La memoria es el cuaderno del propio agente
|
|
26171
|
-
//
|
|
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.
|
|
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.
|
|
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/
|
|
71
|
-
"@packages/
|
|
70
|
+
"@packages/utils": "0.1.0",
|
|
71
|
+
"@packages/types": "0.1.0"
|
|
72
72
|
},
|
|
73
73
|
"publishConfig": {
|
|
74
74
|
"access": "public"
|