@productmaker/mcp 12.0.0 → 12.0.2

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
@@ -309,6 +309,12 @@ The `base64` field was removed. MCP JSON-RPC transports truncate large tool argu
309
309
 
310
310
  ## Version history
311
311
 
312
+ ### 12.0.1 — Service output recovery
313
+
314
+ Internal motion output admission isolates artifacts by claim, accepts paired
315
+ upload ordering and preserves historical output URLs. Complete upload targets
316
+ and full-refund-aware settlement protect delivery without MCP contract changes.
317
+
312
318
  ### 12.0.0 — Ready service required for new service content
313
319
 
314
320
  - New Motion Graphics videos require an owned ready Service (`brandId`) before
package/dist/http.js CHANGED
@@ -16365,6 +16365,23 @@ var motionGraphicsStateSchema = z86.object({
16365
16365
  speechOperations: z86.record(z86.string().regex(/^[a-f0-9]{64}$/), MotionGraphicsSpeechOperationSchema).refine((operations) => Object.keys(operations).length <= MOTION_GRAPHICS_VO_SEGMENTS_MAX + 3 * MOTION_GRAPHICS_LIPSYNC_MAX_CLIPS, {
16366
16366
  message: "too many speech receipts"
16367
16367
  }).optional(),
16368
+ /** Durable, unpaid Generate intent. Removed only after capture admission and payment. */
16369
+ captureAdmission: z86.object({
16370
+ version: z86.literal("v1"),
16371
+ captureId: z86.string().uuid().optional(),
16372
+ maxSocialAcquisitionPriceCents: z86.number().finite().nonnegative(),
16373
+ maxTotalPriceCents: z86.number().finite().nonnegative(),
16374
+ deadlineAt: z86.string().datetime(),
16375
+ failureCause: z86.enum([
16376
+ "site_blocked",
16377
+ "site_unreachable",
16378
+ "not_enough_content",
16379
+ "internal",
16380
+ "expired",
16381
+ "price_exceeded",
16382
+ "insufficient_credits"
16383
+ ]).optional()
16384
+ }).strict().optional(),
16368
16385
  websiteCapture: WebsiteCaptureBindingSchema.optional(),
16369
16386
  format: MotionGraphicsFormatSchema,
16370
16387
  durationSec: MotionGraphicsDurationSchema,
@@ -16373,6 +16390,8 @@ var motionGraphicsStateSchema = z86.object({
16373
16390
  stage: MotionGraphicsStageSchema,
16374
16391
  /** How many times an agent has taken this job. */
16375
16392
  claims: z86.number().int().nonnegative(),
16393
+ /** Upload admission binds all outputs to this claim; absent on legacy jobs. */
16394
+ outputAttempt: z86.number().int().positive().optional(),
16376
16395
  /** Until when the current claim holds. Null while queued. */
16377
16396
  leaseUntil: z86.string().datetime().nullable(),
16378
16397
  /** When the job first entered the queue: the age that decides "nobody is coming". */
@@ -16395,8 +16414,7 @@ var motionGraphicsStateSchema = z86.object({
16395
16414
  /**
16396
16415
  * Where the live preview (a screenshot of the site taken during research)
16397
16416
  * was signed for upload. Recorded when the upload is signed, because it
16398
- * arrives long before `done` writes `outputs`. Fixed by the task id
16399
- * (`motionGraphicsOutputKey(taskId, "preview")`).
16417
+ * arrives long before `done` writes `outputs`. New admissions isolate it by claim.
16400
16418
  */
16401
16419
  previewKey: z86.string().min(1).optional(),
16402
16420
  outputs: MotionGraphicsOutputsSchema.optional(),
@@ -16515,6 +16533,8 @@ var MotionGraphicsExistingClipSchema = z87.object({
16515
16533
  }
16516
16534
  });
16517
16535
  var MotionGraphicsJobSchema = z87.object({
16536
+ /** Protocol 7: delivery settlement follows the accepted hook prefix. */
16537
+ deliveryUsageVersion: z87.literal("v1").optional(),
16518
16538
  soundtrackVersion: z87.literal("v1").optional(),
16519
16539
  speechRecoveryVersion: z87.literal("v1").optional(),
16520
16540
  freeDirectionVersion: z87.literal(MOTION_GRAPHICS_FREE_DIRECTION_VERSION).optional(),
@@ -16704,6 +16724,12 @@ var MotionGraphicsUploadResponseSchema = z87.object({
16704
16724
  contentType: z87.string()
16705
16725
  }))
16706
16726
  });
16727
+ var MotionGraphicsDeliveryUsageSchema = z87.object({
16728
+ variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1),
16729
+ clipsUsed: z87.number().int().min(0).max(MOTION_GRAPHICS_BROLL_MAX_CLIPS).optional(),
16730
+ lipsyncUsed: z87.number().int().min(0).max(MOTION_GRAPHICS_LIPSYNC_MAX_CLIPS).optional(),
16731
+ voUsed: z87.boolean().optional()
16732
+ }).strict();
16707
16733
  var MotionGraphicsDoneRequestSchema = z87.object({
16708
16734
  musicUsed: z87.boolean().optional(),
16709
16735
  cleanVariants: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional(),
@@ -16736,8 +16762,77 @@ var MotionGraphicsDoneRequestSchema = z87.object({
16736
16762
  * EXTRA hook versions uploaded and delivered (0..2; the main video is not
16737
16763
  * counted). Each paid version beyond it is refunded. Absent reads as 0.
16738
16764
  */
16739
- variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional()
16740
- }).strict();
16765
+ variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional(),
16766
+ usageByVariantCount: z87.array(MotionGraphicsDeliveryUsageSchema).min(1).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX).optional()
16767
+ }).strict().superRefine((request, ctx) => {
16768
+ const usage = request.usageByVariantCount;
16769
+ if (!usage) return;
16770
+ if (usage.length !== (request.variantsDelivered ?? 0) + 1) {
16771
+ ctx.addIssue({
16772
+ code: z87.ZodIssueCode.custom,
16773
+ path: [
16774
+ "usageByVariantCount"
16775
+ ],
16776
+ message: "Usage must cover every delivered hook prefix"
16777
+ });
16778
+ }
16779
+ for (const [index, entry] of usage.entries()) {
16780
+ if (entry.variantsDelivered !== index) {
16781
+ ctx.addIssue({
16782
+ code: z87.ZodIssueCode.custom,
16783
+ path: [
16784
+ "usageByVariantCount",
16785
+ index,
16786
+ "variantsDelivered"
16787
+ ],
16788
+ message: "Usage prefixes must be contiguous and ordered"
16789
+ });
16790
+ }
16791
+ const previous = usage[index - 1];
16792
+ for (const field of [
16793
+ "clipsUsed",
16794
+ "lipsyncUsed",
16795
+ "voUsed"
16796
+ ]) {
16797
+ const value = entry[field];
16798
+ const aggregate = request[field];
16799
+ if (value === void 0 !== (aggregate === void 0) || index === usage.length - 1 && value !== aggregate) {
16800
+ ctx.addIssue({
16801
+ code: z87.ZodIssueCode.custom,
16802
+ path: [
16803
+ "usageByVariantCount",
16804
+ index,
16805
+ field
16806
+ ],
16807
+ message: "Usage must preserve aggregate field presence and final totals"
16808
+ });
16809
+ }
16810
+ const before = previous?.[field];
16811
+ if (before !== void 0 && value !== void 0 && Number(value) < Number(before)) {
16812
+ ctx.addIssue({
16813
+ code: z87.ZodIssueCode.custom,
16814
+ path: [
16815
+ "usageByVariantCount",
16816
+ index,
16817
+ field
16818
+ ],
16819
+ message: "Usage cannot decrease when a hook is added"
16820
+ });
16821
+ }
16822
+ }
16823
+ if (entry.clipsUsed !== void 0 && entry.lipsyncUsed !== void 0 && entry.lipsyncUsed > entry.clipsUsed) {
16824
+ ctx.addIssue({
16825
+ code: z87.ZodIssueCode.custom,
16826
+ path: [
16827
+ "usageByVariantCount",
16828
+ index,
16829
+ "lipsyncUsed"
16830
+ ],
16831
+ message: "Lip sync usage cannot exceed clip usage"
16832
+ });
16833
+ }
16834
+ }
16835
+ });
16741
16836
  var MotionGraphicsClipSubmitRequestSchema = z87.object({
16742
16837
  attempt: MotionGraphicsAttemptSchema,
16743
16838
  clips: MotionGraphicsClipRequestSchema.shape.clips
@@ -25510,7 +25605,7 @@ var ApiClient = class {
25510
25605
  };
25511
25606
 
25512
25607
  // src/index.ts
25513
- var MCP_VERSION = "12.0.0";
25608
+ var MCP_VERSION = "12.0.2";
25514
25609
 
25515
25610
  // src/meta-upload-app.ts
25516
25611
  import { readFileSync } from "fs";
package/dist/stdio.js CHANGED
@@ -16140,6 +16140,23 @@ var motionGraphicsStateSchema = z86.object({
16140
16140
  speechOperations: z86.record(z86.string().regex(/^[a-f0-9]{64}$/), MotionGraphicsSpeechOperationSchema).refine((operations) => Object.keys(operations).length <= MOTION_GRAPHICS_VO_SEGMENTS_MAX + 3 * MOTION_GRAPHICS_LIPSYNC_MAX_CLIPS, {
16141
16141
  message: "too many speech receipts"
16142
16142
  }).optional(),
16143
+ /** Durable, unpaid Generate intent. Removed only after capture admission and payment. */
16144
+ captureAdmission: z86.object({
16145
+ version: z86.literal("v1"),
16146
+ captureId: z86.string().uuid().optional(),
16147
+ maxSocialAcquisitionPriceCents: z86.number().finite().nonnegative(),
16148
+ maxTotalPriceCents: z86.number().finite().nonnegative(),
16149
+ deadlineAt: z86.string().datetime(),
16150
+ failureCause: z86.enum([
16151
+ "site_blocked",
16152
+ "site_unreachable",
16153
+ "not_enough_content",
16154
+ "internal",
16155
+ "expired",
16156
+ "price_exceeded",
16157
+ "insufficient_credits"
16158
+ ]).optional()
16159
+ }).strict().optional(),
16143
16160
  websiteCapture: WebsiteCaptureBindingSchema.optional(),
16144
16161
  format: MotionGraphicsFormatSchema,
16145
16162
  durationSec: MotionGraphicsDurationSchema,
@@ -16148,6 +16165,8 @@ var motionGraphicsStateSchema = z86.object({
16148
16165
  stage: MotionGraphicsStageSchema,
16149
16166
  /** How many times an agent has taken this job. */
16150
16167
  claims: z86.number().int().nonnegative(),
16168
+ /** Upload admission binds all outputs to this claim; absent on legacy jobs. */
16169
+ outputAttempt: z86.number().int().positive().optional(),
16151
16170
  /** Until when the current claim holds. Null while queued. */
16152
16171
  leaseUntil: z86.string().datetime().nullable(),
16153
16172
  /** When the job first entered the queue: the age that decides "nobody is coming". */
@@ -16170,8 +16189,7 @@ var motionGraphicsStateSchema = z86.object({
16170
16189
  /**
16171
16190
  * Where the live preview (a screenshot of the site taken during research)
16172
16191
  * was signed for upload. Recorded when the upload is signed, because it
16173
- * arrives long before `done` writes `outputs`. Fixed by the task id
16174
- * (`motionGraphicsOutputKey(taskId, "preview")`).
16192
+ * arrives long before `done` writes `outputs`. New admissions isolate it by claim.
16175
16193
  */
16176
16194
  previewKey: z86.string().min(1).optional(),
16177
16195
  outputs: MotionGraphicsOutputsSchema.optional(),
@@ -16290,6 +16308,8 @@ var MotionGraphicsExistingClipSchema = z87.object({
16290
16308
  }
16291
16309
  });
16292
16310
  var MotionGraphicsJobSchema = z87.object({
16311
+ /** Protocol 7: delivery settlement follows the accepted hook prefix. */
16312
+ deliveryUsageVersion: z87.literal("v1").optional(),
16293
16313
  soundtrackVersion: z87.literal("v1").optional(),
16294
16314
  speechRecoveryVersion: z87.literal("v1").optional(),
16295
16315
  freeDirectionVersion: z87.literal(MOTION_GRAPHICS_FREE_DIRECTION_VERSION).optional(),
@@ -16479,6 +16499,12 @@ var MotionGraphicsUploadResponseSchema = z87.object({
16479
16499
  contentType: z87.string()
16480
16500
  }))
16481
16501
  });
16502
+ var MotionGraphicsDeliveryUsageSchema = z87.object({
16503
+ variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1),
16504
+ clipsUsed: z87.number().int().min(0).max(MOTION_GRAPHICS_BROLL_MAX_CLIPS).optional(),
16505
+ lipsyncUsed: z87.number().int().min(0).max(MOTION_GRAPHICS_LIPSYNC_MAX_CLIPS).optional(),
16506
+ voUsed: z87.boolean().optional()
16507
+ }).strict();
16482
16508
  var MotionGraphicsDoneRequestSchema = z87.object({
16483
16509
  musicUsed: z87.boolean().optional(),
16484
16510
  cleanVariants: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional(),
@@ -16511,8 +16537,77 @@ var MotionGraphicsDoneRequestSchema = z87.object({
16511
16537
  * EXTRA hook versions uploaded and delivered (0..2; the main video is not
16512
16538
  * counted). Each paid version beyond it is refunded. Absent reads as 0.
16513
16539
  */
16514
- variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional()
16515
- }).strict();
16540
+ variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional(),
16541
+ usageByVariantCount: z87.array(MotionGraphicsDeliveryUsageSchema).min(1).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX).optional()
16542
+ }).strict().superRefine((request, ctx) => {
16543
+ const usage = request.usageByVariantCount;
16544
+ if (!usage) return;
16545
+ if (usage.length !== (request.variantsDelivered ?? 0) + 1) {
16546
+ ctx.addIssue({
16547
+ code: z87.ZodIssueCode.custom,
16548
+ path: [
16549
+ "usageByVariantCount"
16550
+ ],
16551
+ message: "Usage must cover every delivered hook prefix"
16552
+ });
16553
+ }
16554
+ for (const [index, entry] of usage.entries()) {
16555
+ if (entry.variantsDelivered !== index) {
16556
+ ctx.addIssue({
16557
+ code: z87.ZodIssueCode.custom,
16558
+ path: [
16559
+ "usageByVariantCount",
16560
+ index,
16561
+ "variantsDelivered"
16562
+ ],
16563
+ message: "Usage prefixes must be contiguous and ordered"
16564
+ });
16565
+ }
16566
+ const previous = usage[index - 1];
16567
+ for (const field of [
16568
+ "clipsUsed",
16569
+ "lipsyncUsed",
16570
+ "voUsed"
16571
+ ]) {
16572
+ const value = entry[field];
16573
+ const aggregate = request[field];
16574
+ if (value === void 0 !== (aggregate === void 0) || index === usage.length - 1 && value !== aggregate) {
16575
+ ctx.addIssue({
16576
+ code: z87.ZodIssueCode.custom,
16577
+ path: [
16578
+ "usageByVariantCount",
16579
+ index,
16580
+ field
16581
+ ],
16582
+ message: "Usage must preserve aggregate field presence and final totals"
16583
+ });
16584
+ }
16585
+ const before = previous?.[field];
16586
+ if (before !== void 0 && value !== void 0 && Number(value) < Number(before)) {
16587
+ ctx.addIssue({
16588
+ code: z87.ZodIssueCode.custom,
16589
+ path: [
16590
+ "usageByVariantCount",
16591
+ index,
16592
+ field
16593
+ ],
16594
+ message: "Usage cannot decrease when a hook is added"
16595
+ });
16596
+ }
16597
+ }
16598
+ if (entry.clipsUsed !== void 0 && entry.lipsyncUsed !== void 0 && entry.lipsyncUsed > entry.clipsUsed) {
16599
+ ctx.addIssue({
16600
+ code: z87.ZodIssueCode.custom,
16601
+ path: [
16602
+ "usageByVariantCount",
16603
+ index,
16604
+ "lipsyncUsed"
16605
+ ],
16606
+ message: "Lip sync usage cannot exceed clip usage"
16607
+ });
16608
+ }
16609
+ }
16610
+ });
16516
16611
  var MotionGraphicsClipSubmitRequestSchema = z87.object({
16517
16612
  attempt: MotionGraphicsAttemptSchema,
16518
16613
  clips: MotionGraphicsClipRequestSchema.shape.clips
@@ -23839,7 +23934,7 @@ var ApiClient = class {
23839
23934
  };
23840
23935
 
23841
23936
  // src/index.ts
23842
- var MCP_VERSION = "12.0.0";
23937
+ var MCP_VERSION = "12.0.2";
23843
23938
 
23844
23939
  // src/meta-upload-app.ts
23845
23940
  import { readFileSync } from "fs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productmaker/mcp",
3
- "version": "12.0.0",
3
+ "version": "12.0.2",
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.",