@offerkit/sdk 0.2.3 → 0.2.5

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/index.mjs CHANGED
@@ -38,8 +38,9 @@ const apiKeys = {
38
38
  revoke: oc.route({
39
39
  method: "DELETE",
40
40
  path: "/api-keys/{id}",
41
- summary: "Disable an API key (cannot be re-enabled)"
42
- }).input(z.object({ id: z.string() })).output(z.object({ ok: z.literal(true) }))
41
+ summary: "Disable an API key (cannot be re-enabled)",
42
+ inputStructure: "detailed"
43
+ }).input(z.object({ params: z.object({ id: z.string() }) })).output(z.object({ ok: z.literal(true) }))
43
44
  };
44
45
  //#endregion
45
46
  //#region ../contract/src/mcp.ts
@@ -140,8 +141,9 @@ const campaigns = {
140
141
  })).route({
141
142
  method: "GET",
142
143
  path: "/campaigns/{id}",
143
- summary: "Get campaign"
144
- }).input(z.object({ id: z.string().uuid() })).output(campaignOutput),
144
+ summary: "Get campaign",
145
+ inputStructure: "detailed"
146
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(campaignOutput),
145
147
  create: oc.route({
146
148
  method: "POST",
147
149
  path: "/campaigns",
@@ -150,16 +152,18 @@ const campaigns = {
150
152
  update: oc.route({
151
153
  method: "PATCH",
152
154
  path: "/campaigns/{id}",
153
- summary: "Update campaign"
155
+ summary: "Update campaign",
156
+ inputStructure: "detailed"
154
157
  }).input(z.object({
155
- id: z.string().uuid(),
156
- patch: campaignUpdateInput
158
+ params: z.object({ id: z.string().uuid() }),
159
+ body: z.object({ patch: campaignUpdateInput })
157
160
  })).output(campaignOutput),
158
161
  delete: oc.route({
159
162
  method: "DELETE",
160
163
  path: "/campaigns/{id}",
161
- summary: "Soft-delete campaign"
162
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) }))
164
+ summary: "Soft-delete campaign",
165
+ inputStructure: "detailed"
166
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) }))
163
167
  };
164
168
  //#endregion
165
169
  //#region ../contract/src/schemas/customer.ts
@@ -226,16 +230,18 @@ const customers = {
226
230
  })).route({
227
231
  method: "GET",
228
232
  path: "/customers/{id}",
229
- summary: "Get customer"
230
- }).input(z.object({ id: z.string().uuid() })).output(customerOutput),
233
+ summary: "Get customer",
234
+ inputStructure: "detailed"
235
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(customerOutput),
231
236
  getByExternalId: oc.meta(mcpMeta({
232
237
  expose: true,
233
238
  riskLevel: "safe"
234
239
  })).route({
235
240
  method: "GET",
236
241
  path: "/customers/by-external-id/{externalId}",
237
- summary: "Get a customer by integrator-supplied externalId"
238
- }).input(z.object({ externalId: z.string().min(1).max(256) })).output(customerOutput),
242
+ summary: "Get a customer by integrator-supplied externalId",
243
+ inputStructure: "detailed"
244
+ }).input(z.object({ params: z.object({ externalId: z.string().min(1).max(256) }) })).output(customerOutput),
239
245
  create: oc.route({
240
246
  method: "POST",
241
247
  path: "/customers",
@@ -249,16 +255,18 @@ const customers = {
249
255
  update: oc.route({
250
256
  method: "PATCH",
251
257
  path: "/customers/{id}",
252
- summary: "Update customer"
258
+ summary: "Update customer",
259
+ inputStructure: "detailed"
253
260
  }).input(z.object({
254
- id: z.string().uuid(),
255
- patch: customerUpdateInput
261
+ params: z.object({ id: z.string().uuid() }),
262
+ body: z.object({ patch: customerUpdateInput })
256
263
  })).output(customerOutput),
257
264
  delete: oc.route({
258
265
  method: "DELETE",
259
266
  path: "/customers/{id}",
260
- summary: "Soft-delete customer"
261
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) }))
267
+ summary: "Soft-delete customer",
268
+ inputStructure: "detailed"
269
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) }))
262
270
  };
263
271
  //#endregion
264
272
  //#region ../contract/src/schemas/loyalty.ts
@@ -416,8 +424,9 @@ const loyalty = {
416
424
  get: oc.route({
417
425
  method: "GET",
418
426
  path: "/loyalty/programs/{id}",
419
- summary: "Get loyalty program"
420
- }).input(z.object({ id: z.string().uuid() })).output(loyaltyProgramOutput),
427
+ summary: "Get loyalty program",
428
+ inputStructure: "detailed"
429
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(loyaltyProgramOutput),
421
430
  create: oc.route({
422
431
  method: "POST",
423
432
  path: "/loyalty/programs",
@@ -426,23 +435,26 @@ const loyalty = {
426
435
  update: oc.route({
427
436
  method: "PATCH",
428
437
  path: "/loyalty/programs/{id}",
429
- summary: "Update loyalty program"
438
+ summary: "Update loyalty program",
439
+ inputStructure: "detailed"
430
440
  }).input(z.object({
431
- id: z.string().uuid(),
432
- patch: loyaltyProgramUpdateInput
441
+ params: z.object({ id: z.string().uuid() }),
442
+ body: z.object({ patch: loyaltyProgramUpdateInput })
433
443
  })).output(loyaltyProgramOutput),
434
444
  delete: oc.route({
435
445
  method: "DELETE",
436
446
  path: "/loyalty/programs/{id}",
437
- summary: "Soft-delete program"
438
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) }))
447
+ summary: "Soft-delete program",
448
+ inputStructure: "detailed"
449
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) }))
439
450
  },
440
451
  tiers: {
441
452
  list: oc.route({
442
453
  method: "GET",
443
454
  path: "/loyalty/programs/{programId}/tiers",
444
- summary: "List tiers"
445
- }).input(z.object({ programId: z.string().uuid() })).output(z.object({ data: z.array(loyaltyTierOutput) })),
455
+ summary: "List tiers",
456
+ inputStructure: "detailed"
457
+ }).input(z.object({ params: z.object({ programId: z.string().uuid() }) })).output(z.object({ data: z.array(loyaltyTierOutput) })),
446
458
  create: oc.route({
447
459
  method: "POST",
448
460
  path: "/loyalty/tiers",
@@ -451,23 +463,26 @@ const loyalty = {
451
463
  update: oc.route({
452
464
  method: "PATCH",
453
465
  path: "/loyalty/tiers/{id}",
454
- summary: "Update tier"
466
+ summary: "Update tier",
467
+ inputStructure: "detailed"
455
468
  }).input(z.object({
456
- id: z.string().uuid(),
457
- patch: loyaltyTierUpdateInput
469
+ params: z.object({ id: z.string().uuid() }),
470
+ body: z.object({ patch: loyaltyTierUpdateInput })
458
471
  })).output(loyaltyTierOutput),
459
472
  delete: oc.route({
460
473
  method: "DELETE",
461
474
  path: "/loyalty/tiers/{id}",
462
- summary: "Delete tier"
463
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) }))
475
+ summary: "Delete tier",
476
+ inputStructure: "detailed"
477
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) }))
464
478
  },
465
479
  earningRules: {
466
480
  list: oc.route({
467
481
  method: "GET",
468
482
  path: "/loyalty/programs/{programId}/earning-rules",
469
- summary: "List earning rules"
470
- }).input(z.object({ programId: z.string().uuid() })).output(z.object({ data: z.array(loyaltyEarningRuleOutput) })),
483
+ summary: "List earning rules",
484
+ inputStructure: "detailed"
485
+ }).input(z.object({ params: z.object({ programId: z.string().uuid() }) })).output(z.object({ data: z.array(loyaltyEarningRuleOutput) })),
471
486
  create: oc.route({
472
487
  method: "POST",
473
488
  path: "/loyalty/earning-rules",
@@ -476,23 +491,26 @@ const loyalty = {
476
491
  update: oc.route({
477
492
  method: "PATCH",
478
493
  path: "/loyalty/earning-rules/{id}",
479
- summary: "Update earning rule"
494
+ summary: "Update earning rule",
495
+ inputStructure: "detailed"
480
496
  }).input(z.object({
481
- id: z.string().uuid(),
482
- patch: loyaltyEarningRuleUpdateInput
497
+ params: z.object({ id: z.string().uuid() }),
498
+ body: z.object({ patch: loyaltyEarningRuleUpdateInput })
483
499
  })).output(loyaltyEarningRuleOutput),
484
500
  delete: oc.route({
485
501
  method: "DELETE",
486
502
  path: "/loyalty/earning-rules/{id}",
487
- summary: "Delete earning rule"
488
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) }))
503
+ summary: "Delete earning rule",
504
+ inputStructure: "detailed"
505
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) }))
489
506
  },
490
507
  rewards: {
491
508
  list: oc.route({
492
509
  method: "GET",
493
510
  path: "/loyalty/programs/{programId}/rewards",
494
- summary: "List rewards"
495
- }).input(z.object({ programId: z.string().uuid() })).output(z.object({ data: z.array(loyaltyRewardOutput) })),
511
+ summary: "List rewards",
512
+ inputStructure: "detailed"
513
+ }).input(z.object({ params: z.object({ programId: z.string().uuid() }) })).output(z.object({ data: z.array(loyaltyRewardOutput) })),
496
514
  create: oc.route({
497
515
  method: "POST",
498
516
  path: "/loyalty/rewards",
@@ -501,28 +519,35 @@ const loyalty = {
501
519
  update: oc.route({
502
520
  method: "PATCH",
503
521
  path: "/loyalty/rewards/{id}",
504
- summary: "Update reward"
522
+ summary: "Update reward",
523
+ inputStructure: "detailed"
505
524
  }).input(z.object({
506
- id: z.string().uuid(),
507
- patch: loyaltyRewardUpdateInput
525
+ params: z.object({ id: z.string().uuid() }),
526
+ body: z.object({ patch: loyaltyRewardUpdateInput })
508
527
  })).output(loyaltyRewardOutput),
509
528
  delete: oc.route({
510
529
  method: "DELETE",
511
530
  path: "/loyalty/rewards/{id}",
512
- summary: "Soft-delete reward"
513
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) }))
531
+ summary: "Soft-delete reward",
532
+ inputStructure: "detailed"
533
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) }))
514
534
  },
515
535
  members: {
516
536
  list: oc.route({
517
537
  method: "GET",
518
538
  path: "/loyalty/programs/{programId}/members",
519
- summary: "List members of a program"
520
- }).input(paginationInput.extend({ programId: z.string().uuid() })).output(paginatedOutput(loyaltyMemberOutput)),
539
+ summary: "List members of a program",
540
+ inputStructure: "detailed"
541
+ }).input(z.object({
542
+ params: z.object({ programId: z.string().uuid() }),
543
+ query: paginationInput
544
+ })).output(paginatedOutput(loyaltyMemberOutput)),
521
545
  get: oc.route({
522
546
  method: "GET",
523
547
  path: "/loyalty/members/{id}",
524
- summary: "Get member"
525
- }).input(z.object({ id: z.string().uuid() })).output(loyaltyMemberOutput),
548
+ summary: "Get member",
549
+ inputStructure: "detailed"
550
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(loyaltyMemberOutput),
526
551
  enroll: oc.route({
527
552
  method: "POST",
528
553
  path: "/loyalty/members",
@@ -574,8 +599,9 @@ const loyalty = {
574
599
  })).route({
575
600
  method: "GET",
576
601
  path: "/loyalty/members/{id}/transactions",
577
- summary: "Member transaction ledger"
578
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ data: z.array(loyaltyTransactionOutput) }))
602
+ summary: "Member transaction ledger",
603
+ inputStructure: "detailed"
604
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ data: z.array(loyaltyTransactionOutput) }))
579
605
  }
580
606
  };
581
607
  //#endregion
@@ -650,6 +676,10 @@ const referralConversionOutput = z.object({
650
676
  createdAt: z.string().datetime(),
651
677
  updatedAt: z.string().datetime()
652
678
  });
679
+ const referralProgramConversionOutput = referralConversionOutput.extend({
680
+ code: z.string(),
681
+ referrerCustomerId: z.string().uuid()
682
+ });
653
683
  const referralIssueInput = z.object({
654
684
  programId: z.string().uuid(),
655
685
  referrerCustomerId: z.string().uuid(),
@@ -690,8 +720,9 @@ const referrals = {
690
720
  get: oc.route({
691
721
  method: "GET",
692
722
  path: "/referral-programs/{id}",
693
- summary: "Get referral program"
694
- }).input(z.object({ id: z.string().uuid() })).output(referralProgramOutput),
723
+ summary: "Get referral program",
724
+ inputStructure: "detailed"
725
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(referralProgramOutput),
695
726
  create: oc.route({
696
727
  method: "POST",
697
728
  path: "/referral-programs",
@@ -700,32 +731,52 @@ const referrals = {
700
731
  update: oc.route({
701
732
  method: "PATCH",
702
733
  path: "/referral-programs/{id}",
703
- summary: "Update referral program"
734
+ summary: "Update referral program",
735
+ inputStructure: "detailed"
704
736
  }).input(z.object({
705
- id: z.string().uuid(),
706
- patch: referralProgramUpdateInput
737
+ params: z.object({ id: z.string().uuid() }),
738
+ body: z.object({ patch: referralProgramUpdateInput })
707
739
  })).output(referralProgramOutput),
708
740
  delete: oc.route({
709
741
  method: "DELETE",
710
742
  path: "/referral-programs/{id}",
711
- summary: "Soft-delete referral program"
712
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) }))
743
+ summary: "Soft-delete referral program",
744
+ inputStructure: "detailed"
745
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) }))
713
746
  },
714
747
  listCodes: oc.route({
715
748
  method: "GET",
716
749
  path: "/referral-programs/{programId}/codes",
717
- summary: "List referral codes in a program"
718
- }).input(paginationInput.extend({ programId: z.string().uuid() })).output(paginatedOutput(referralCodeOutput)),
750
+ summary: "List referral codes in a program",
751
+ inputStructure: "detailed"
752
+ }).input(z.object({
753
+ params: z.object({ programId: z.string().uuid() }),
754
+ query: paginationInput
755
+ })).output(paginatedOutput(referralCodeOutput)),
719
756
  listConversions: oc.route({
720
757
  method: "GET",
721
758
  path: "/referral-codes/{codeId}/conversions",
722
- summary: "List conversions for a referral code"
723
- }).input(paginationInput.extend({ codeId: z.string().uuid() })).output(paginatedOutput(referralConversionOutput)),
759
+ summary: "List conversions for a referral code",
760
+ inputStructure: "detailed"
761
+ }).input(z.object({
762
+ params: z.object({ codeId: z.string().uuid() }),
763
+ query: paginationInput
764
+ })).output(paginatedOutput(referralConversionOutput)),
765
+ listProgramConversions: oc.route({
766
+ method: "GET",
767
+ path: "/referral-programs/{programId}/conversions",
768
+ summary: "List conversions in a referral program",
769
+ inputStructure: "detailed"
770
+ }).input(z.object({
771
+ params: z.object({ programId: z.string().uuid() }),
772
+ query: paginationInput
773
+ })).output(paginatedOutput(referralProgramConversionOutput)),
724
774
  getByCode: oc.route({
725
775
  method: "GET",
726
776
  path: "/referrals/{code}",
727
- summary: "Look up a referral code"
728
- }).input(z.object({ code: z.string() })).output(referralCodeOutput),
777
+ summary: "Look up a referral code",
778
+ inputStructure: "detailed"
779
+ }).input(z.object({ params: z.object({ code: z.string() }) })).output(referralCodeOutput),
729
780
  issue: oc.route({
730
781
  method: "POST",
731
782
  path: "/referrals/issue",
@@ -795,7 +846,9 @@ const voucherUpdateInput = voucherCreateInput.omit({
795
846
  }).partial().extend({ active: z.boolean().optional() });
796
847
  const voucherBulkCreateInput = z.object({
797
848
  campaignId: z.string().uuid(),
798
- count: z.number().int().min(1).max(1e5)
849
+ count: z.number().int().min(1).max(1e5),
850
+ discount: voucherDiscount.optional(),
851
+ giftBalance: z.number().int().min(1).optional()
799
852
  });
800
853
  //#endregion
801
854
  //#region ../contract/src/schemas/redemption.ts
@@ -832,11 +885,14 @@ const breakdownEntry = z.object({
832
885
  const redemptionExplanation = z.object({
833
886
  code: z.enum([
834
887
  "voucher_not_found",
888
+ "campaign_inactive",
835
889
  "voucher_disabled",
836
890
  "voucher_expired",
837
891
  "redemption_limit_reached",
892
+ "validation_failed",
838
893
  "currency_mismatch",
839
894
  "gift_balance_zero",
895
+ "no_discount_effect",
840
896
  "order_required",
841
897
  "exclusivity_lost",
842
898
  "zero_after_running_total",
@@ -1042,16 +1098,18 @@ const promotions = {
1042
1098
  update: oc.route({
1043
1099
  method: "PATCH",
1044
1100
  path: "/promotions/tiers/{id}",
1045
- summary: "Update promotion tier"
1101
+ summary: "Update promotion tier",
1102
+ inputStructure: "detailed"
1046
1103
  }).input(z.object({
1047
- id: z.string().uuid(),
1048
- patch: promotionTierUpdateInput
1104
+ params: z.object({ id: z.string().uuid() }),
1105
+ body: z.object({ patch: promotionTierUpdateInput })
1049
1106
  })).output(promotionTierOutput),
1050
1107
  delete: oc.route({
1051
1108
  method: "DELETE",
1052
1109
  path: "/promotions/tiers/{id}",
1053
- summary: "Soft-delete promotion tier"
1054
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) }))
1110
+ summary: "Soft-delete promotion tier",
1111
+ inputStructure: "detailed"
1112
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) }))
1055
1113
  },
1056
1114
  qualify: oc.meta(mcpMeta({
1057
1115
  expose: true,
@@ -1091,8 +1149,9 @@ const rewardTypes = {
1091
1149
  get: oc.route({
1092
1150
  method: "GET",
1093
1151
  path: "/reward-types/{id}",
1094
- summary: "Get reward type"
1095
- }).input(z.object({ id: z.string().uuid() })).output(rewardTypeOutput),
1152
+ summary: "Get reward type",
1153
+ inputStructure: "detailed"
1154
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(rewardTypeOutput),
1096
1155
  create: oc.route({
1097
1156
  method: "POST",
1098
1157
  path: "/reward-types",
@@ -1101,16 +1160,18 @@ const rewardTypes = {
1101
1160
  update: oc.route({
1102
1161
  method: "PATCH",
1103
1162
  path: "/reward-types/{id}",
1104
- summary: "Update reward type"
1163
+ summary: "Update reward type",
1164
+ inputStructure: "detailed"
1105
1165
  }).input(z.object({
1106
- id: z.string().uuid(),
1107
- patch: rewardTypeUpdateInput
1166
+ params: z.object({ id: z.string().uuid() }),
1167
+ body: z.object({ patch: rewardTypeUpdateInput })
1108
1168
  })).output(rewardTypeOutput),
1109
1169
  delete: oc.route({
1110
1170
  method: "DELETE",
1111
1171
  path: "/reward-types/{id}",
1112
- summary: "Soft-delete reward type"
1113
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) }))
1172
+ summary: "Soft-delete reward type",
1173
+ inputStructure: "detailed"
1174
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) }))
1114
1175
  };
1115
1176
  //#endregion
1116
1177
  //#region ../contract/src/schemas/segment.ts
@@ -1140,8 +1201,9 @@ const segments = {
1140
1201
  get: oc.route({
1141
1202
  method: "GET",
1142
1203
  path: "/segments/{id}",
1143
- summary: "Get segment"
1144
- }).input(z.object({ id: z.string().uuid() })).output(segmentOutput),
1204
+ summary: "Get segment",
1205
+ inputStructure: "detailed"
1206
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(segmentOutput),
1145
1207
  create: oc.route({
1146
1208
  method: "POST",
1147
1209
  path: "/segments",
@@ -1150,16 +1212,18 @@ const segments = {
1150
1212
  update: oc.route({
1151
1213
  method: "PATCH",
1152
1214
  path: "/segments/{id}",
1153
- summary: "Update segment"
1215
+ summary: "Update segment",
1216
+ inputStructure: "detailed"
1154
1217
  }).input(z.object({
1155
- id: z.string().uuid(),
1156
- patch: segmentUpdateInput
1218
+ params: z.object({ id: z.string().uuid() }),
1219
+ body: z.object({ patch: segmentUpdateInput })
1157
1220
  })).output(segmentOutput),
1158
1221
  delete: oc.route({
1159
1222
  method: "DELETE",
1160
1223
  path: "/segments/{id}",
1161
- summary: "Soft-delete segment"
1162
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) })),
1224
+ summary: "Soft-delete segment",
1225
+ inputStructure: "detailed"
1226
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) })),
1163
1227
  preview: oc.meta(mcpMeta({
1164
1228
  expose: true,
1165
1229
  riskLevel: "safe",
@@ -1211,8 +1275,9 @@ const validationRules = {
1211
1275
  get: oc.route({
1212
1276
  method: "GET",
1213
1277
  path: "/validation-rules/{id}",
1214
- summary: "Get validation rule"
1215
- }).input(z.object({ id: z.string().uuid() })).output(validationRuleOutput),
1278
+ summary: "Get validation rule",
1279
+ inputStructure: "detailed"
1280
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(validationRuleOutput),
1216
1281
  create: oc.route({
1217
1282
  method: "POST",
1218
1283
  path: "/validation-rules",
@@ -1221,16 +1286,18 @@ const validationRules = {
1221
1286
  update: oc.route({
1222
1287
  method: "PATCH",
1223
1288
  path: "/validation-rules/{id}",
1224
- summary: "Update validation rule"
1289
+ summary: "Update validation rule",
1290
+ inputStructure: "detailed"
1225
1291
  }).input(z.object({
1226
- id: z.string().uuid(),
1227
- patch: validationRuleUpdateInput
1292
+ params: z.object({ id: z.string().uuid() }),
1293
+ body: z.object({ patch: validationRuleUpdateInput })
1228
1294
  })).output(validationRuleOutput),
1229
1295
  delete: oc.route({
1230
1296
  method: "DELETE",
1231
1297
  path: "/validation-rules/{id}",
1232
- summary: "Soft-delete validation rule"
1233
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) }))
1298
+ summary: "Soft-delete validation rule",
1299
+ inputStructure: "detailed"
1300
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) }))
1234
1301
  };
1235
1302
  //#endregion
1236
1303
  //#region ../contract/src/routes/vouchers.ts
@@ -1254,8 +1321,9 @@ const vouchers = {
1254
1321
  })).route({
1255
1322
  method: "GET",
1256
1323
  path: "/vouchers/{code}",
1257
- summary: "Get voucher by code"
1258
- }).input(z.object({ code: z.string() })).output(voucherOutput),
1324
+ summary: "Get voucher by code",
1325
+ inputStructure: "detailed"
1326
+ }).input(z.object({ params: z.object({ code: z.string() }) })).output(voucherOutput),
1259
1327
  create: oc.route({
1260
1328
  method: "POST",
1261
1329
  path: "/vouchers",
@@ -1264,16 +1332,18 @@ const vouchers = {
1264
1332
  update: oc.route({
1265
1333
  method: "PATCH",
1266
1334
  path: "/vouchers/{code}",
1267
- summary: "Update voucher"
1335
+ summary: "Update voucher",
1336
+ inputStructure: "detailed"
1268
1337
  }).input(z.object({
1269
- code: z.string(),
1270
- patch: voucherUpdateInput
1338
+ params: z.object({ code: z.string() }),
1339
+ body: z.object({ patch: voucherUpdateInput })
1271
1340
  })).output(voucherOutput),
1272
1341
  delete: oc.route({
1273
1342
  method: "DELETE",
1274
1343
  path: "/vouchers/{code}",
1275
- summary: "Soft-delete voucher"
1276
- }).input(z.object({ code: z.string() })).output(z.object({ ok: z.literal(true) })),
1344
+ summary: "Soft-delete voucher",
1345
+ inputStructure: "detailed"
1346
+ }).input(z.object({ params: z.object({ code: z.string() }) })).output(z.object({ ok: z.literal(true) })),
1277
1347
  bulk: oc.route({
1278
1348
  method: "POST",
1279
1349
  path: "/vouchers/bulk",
@@ -1289,8 +1359,12 @@ const vouchers = {
1289
1359
  })).route({
1290
1360
  method: "POST",
1291
1361
  path: "/vouchers/{code}/validate",
1292
- summary: "Validate a voucher against an optional order context"
1293
- }).input(validateInput).output(validateOutput),
1362
+ summary: "Validate a voucher against an optional order context",
1363
+ inputStructure: "detailed"
1364
+ }).input(z.object({
1365
+ params: z.object({ code: z.string().min(1) }),
1366
+ body: validateInput.omit({ code: true }).optional()
1367
+ })).output(validateOutput),
1294
1368
  qualify: oc.meta(mcpMeta({
1295
1369
  expose: true,
1296
1370
  riskLevel: "safe"
@@ -1306,8 +1380,12 @@ const vouchers = {
1306
1380
  })).route({
1307
1381
  method: "POST",
1308
1382
  path: "/vouchers/{code}/redemption",
1309
- summary: "Redeem a voucher"
1310
- }).input(redeemInput).output(redeemOutput),
1383
+ summary: "Redeem a voucher",
1384
+ inputStructure: "detailed"
1385
+ }).input(z.object({
1386
+ params: z.object({ code: z.string().min(1) }),
1387
+ body: redeemInput.omit({ code: true }).optional()
1388
+ })).output(redeemOutput),
1311
1389
  stackRedeem: oc.meta(mcpMeta({
1312
1390
  expose: true,
1313
1391
  riskLevel: "mutating",
@@ -1320,8 +1398,9 @@ const vouchers = {
1320
1398
  transactions: oc.route({
1321
1399
  method: "GET",
1322
1400
  path: "/vouchers/{code}/transactions",
1323
- summary: "Gift card balance ledger"
1324
- }).input(z.object({ code: z.string() })).output(z.object({ data: z.array(z.object({
1401
+ summary: "Gift card balance ledger",
1402
+ inputStructure: "detailed"
1403
+ }).input(z.object({ params: z.object({ code: z.string() }) })).output(z.object({ data: z.array(z.object({
1325
1404
  id: z.string().uuid(),
1326
1405
  redemptionId: z.string().uuid().nullable(),
1327
1406
  delta: z.number().int(),
@@ -1399,8 +1478,9 @@ const webhooks$1 = {
1399
1478
  get: oc.route({
1400
1479
  method: "GET",
1401
1480
  path: "/webhooks/{id}",
1402
- summary: "Get webhook"
1403
- }).input(z.object({ id: z.string().uuid() })).output(webhookOutput),
1481
+ summary: "Get webhook",
1482
+ inputStructure: "detailed"
1483
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(webhookOutput),
1404
1484
  create: oc.route({
1405
1485
  method: "POST",
1406
1486
  path: "/webhooks",
@@ -1409,29 +1489,33 @@ const webhooks$1 = {
1409
1489
  update: oc.route({
1410
1490
  method: "PATCH",
1411
1491
  path: "/webhooks/{id}",
1412
- summary: "Update webhook"
1492
+ summary: "Update webhook",
1493
+ inputStructure: "detailed"
1413
1494
  }).input(z.object({
1414
- id: z.string().uuid(),
1415
- patch: webhookUpdateInput
1495
+ params: z.object({ id: z.string().uuid() }),
1496
+ body: z.object({ patch: webhookUpdateInput })
1416
1497
  })).output(webhookOutput),
1417
1498
  delete: oc.route({
1418
1499
  method: "DELETE",
1419
1500
  path: "/webhooks/{id}",
1420
- summary: "Soft-delete webhook"
1421
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) })),
1501
+ summary: "Soft-delete webhook",
1502
+ inputStructure: "detailed"
1503
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) })),
1422
1504
  deliveries: oc.route({
1423
1505
  method: "GET",
1424
1506
  path: "/webhooks/{id}/deliveries",
1425
- summary: "Recent deliveries for a webhook"
1507
+ summary: "Recent deliveries for a webhook",
1508
+ inputStructure: "detailed"
1426
1509
  }).input(z.object({
1427
- id: z.string().uuid(),
1428
- limit: z.number().int().min(1).max(100).default(50)
1510
+ params: z.object({ id: z.string().uuid() }),
1511
+ query: z.object({ limit: z.number().int().min(1).max(100).default(50) })
1429
1512
  })).output(z.object({ data: z.array(webhookDeliveryOutput) })),
1430
1513
  replay: oc.route({
1431
1514
  method: "POST",
1432
1515
  path: "/webhooks/deliveries/{id}/replay",
1433
- summary: "Re-enqueue a delivery (succeeded or otherwise)"
1434
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) }))
1516
+ summary: "Re-enqueue a delivery (succeeded or otherwise)",
1517
+ inputStructure: "detailed"
1518
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) }))
1435
1519
  };
1436
1520
  const events = {
1437
1521
  list: oc.route({
@@ -1442,8 +1526,9 @@ const events = {
1442
1526
  get: oc.route({
1443
1527
  method: "GET",
1444
1528
  path: "/events/{id}",
1445
- summary: "Get event"
1446
- }).input(z.object({ id: z.string().uuid() })).output(eventOutput)
1529
+ summary: "Get event",
1530
+ inputStructure: "detailed"
1531
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(eventOutput)
1447
1532
  };
1448
1533
  //#endregion
1449
1534
  //#region ../contract/src/routes/insights.ts
@@ -1522,26 +1607,30 @@ const users = {
1522
1607
  resetPassword: oc.route({
1523
1608
  method: "POST",
1524
1609
  path: "/users/{id}/reset-password",
1525
- summary: "Reset a staff user's password (admin)"
1526
- }).input(z.object({ id: z.string() })).output(userCreateOutput),
1610
+ summary: "Reset a staff user's password (admin)",
1611
+ inputStructure: "detailed"
1612
+ }).input(z.object({ params: z.object({ id: z.string() }) })).output(userCreateOutput),
1527
1613
  setRole: oc.route({
1528
1614
  method: "PATCH",
1529
1615
  path: "/users/{id}/role",
1530
- summary: "Change a staff user's role (admin)"
1616
+ summary: "Change a staff user's role (admin)",
1617
+ inputStructure: "detailed"
1531
1618
  }).input(z.object({
1532
- id: z.string(),
1533
- role: userRole
1619
+ params: z.object({ id: z.string() }),
1620
+ body: z.object({ role: userRole })
1534
1621
  })).output(userOutput),
1535
1622
  disable: oc.route({
1536
1623
  method: "POST",
1537
1624
  path: "/users/{id}/disable",
1538
- summary: "Disable a staff user (admin)"
1539
- }).input(z.object({ id: z.string() })).output(userOutput),
1625
+ summary: "Disable a staff user (admin)",
1626
+ inputStructure: "detailed"
1627
+ }).input(z.object({ params: z.object({ id: z.string() }) })).output(userOutput),
1540
1628
  enable: oc.route({
1541
1629
  method: "POST",
1542
1630
  path: "/users/{id}/enable",
1543
- summary: "Re-enable a staff user (admin)"
1544
- }).input(z.object({ id: z.string() })).output(userOutput)
1631
+ summary: "Re-enable a staff user (admin)",
1632
+ inputStructure: "detailed"
1633
+ }).input(z.object({ params: z.object({ id: z.string() }) })).output(userOutput)
1545
1634
  };
1546
1635
  //#endregion
1547
1636
  //#region ../contract/src/schemas/order.ts
@@ -1607,8 +1696,9 @@ const orders = {
1607
1696
  get: oc.route({
1608
1697
  method: "GET",
1609
1698
  path: "/orders/{id}",
1610
- summary: "Fetch one order"
1611
- }).input(z.object({ id: z.string().uuid() })).output(orderOutput),
1699
+ summary: "Fetch one order",
1700
+ inputStructure: "detailed"
1701
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(orderOutput),
1612
1702
  create: oc.route({
1613
1703
  method: "POST",
1614
1704
  path: "/orders",
@@ -1617,28 +1707,36 @@ const orders = {
1617
1707
  update: oc.route({
1618
1708
  method: "PATCH",
1619
1709
  path: "/orders/{id}",
1620
- summary: "Update an order"
1621
- }).input(orderUpdateInput).output(orderOutput),
1710
+ summary: "Update an order",
1711
+ inputStructure: "detailed"
1712
+ }).input(z.object({
1713
+ params: z.object({ id: z.string().uuid() }),
1714
+ body: orderUpdateInput.omit({ id: true })
1715
+ })).output(orderOutput),
1622
1716
  cancel: oc.route({
1623
1717
  method: "POST",
1624
1718
  path: "/orders/{id}/cancel",
1625
- summary: "Cancel an order"
1626
- }).input(z.object({ id: z.string().uuid() })).output(orderOutput),
1719
+ summary: "Cancel an order",
1720
+ inputStructure: "detailed"
1721
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(orderOutput),
1627
1722
  fulfill: oc.route({
1628
1723
  method: "POST",
1629
1724
  path: "/orders/{id}/fulfill",
1630
- summary: "Mark order fulfilled"
1631
- }).input(z.object({ id: z.string().uuid() })).output(orderOutput),
1725
+ summary: "Mark order fulfilled",
1726
+ inputStructure: "detailed"
1727
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(orderOutput),
1632
1728
  delete: oc.route({
1633
1729
  method: "DELETE",
1634
1730
  path: "/orders/{id}",
1635
- summary: "Soft-delete an order"
1636
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ ok: z.literal(true) })),
1731
+ summary: "Soft-delete an order",
1732
+ inputStructure: "detailed"
1733
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ ok: z.literal(true) })),
1637
1734
  redemptions: oc.route({
1638
1735
  method: "GET",
1639
1736
  path: "/orders/{id}/redemptions",
1640
- summary: "List redemptions attached to an order"
1641
- }).input(z.object({ id: z.string().uuid() })).output(z.object({ data: z.array(z.object({
1737
+ summary: "List redemptions attached to an order",
1738
+ inputStructure: "detailed"
1739
+ }).input(z.object({ params: z.object({ id: z.string().uuid() }) })).output(z.object({ data: z.array(z.object({
1642
1740
  id: z.string().uuid(),
1643
1741
  voucherCode: z.string(),
1644
1742
  voucherId: z.string().uuid(),