@cavuno/board 1.39.0 → 1.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/{_spec-DxC1ze93.d.mts → _spec-DRbgPIlN.d.mts} +351 -0
  2. package/dist/{_spec-DxC1ze93.d.ts → _spec-DRbgPIlN.d.ts} +351 -0
  3. package/dist/bin.mjs +242 -18
  4. package/dist/{board-RfZEAJse.d.ts → board-BxPUtrOl.d.ts} +1 -1
  5. package/dist/{board-CqYibYUA.d.mts → board-DCiNpgFf.d.mts} +1 -1
  6. package/dist/doctor.js +238 -14
  7. package/dist/doctor.mjs +238 -14
  8. package/dist/filters.d.mts +2 -2
  9. package/dist/filters.d.ts +2 -2
  10. package/dist/format.d.mts +3 -3
  11. package/dist/format.d.ts +3 -3
  12. package/dist/index.d.mts +55 -10
  13. package/dist/index.d.ts +55 -10
  14. package/dist/index.js +50 -1
  15. package/dist/index.mjs +50 -1
  16. package/dist/{jobs-CLLIvtMc.d.ts → jobs-DAGAVHQL.d.ts} +1 -1
  17. package/dist/{jobs-DPPA1Nev.d.mts → jobs-DhePKSRe.d.mts} +1 -1
  18. package/dist/{salaries-Rb5h_eVZ.d.mts → salaries-D6SUVMmt.d.mts} +2 -2
  19. package/dist/{salaries-DK4RnJnw.d.ts → salaries-cqb78kg0.d.ts} +2 -2
  20. package/dist/{search-DBoMM-gE.d.ts → search-BalPAS0P.d.ts} +1 -1
  21. package/dist/{search-CqBa1Qc4.d.mts → search-DYUQzCq_.d.mts} +1 -1
  22. package/dist/seo.d.mts +4 -4
  23. package/dist/seo.d.ts +4 -4
  24. package/dist/server.d.mts +56 -6
  25. package/dist/server.d.ts +56 -6
  26. package/dist/server.js +41 -0
  27. package/dist/server.mjs +41 -0
  28. package/dist/sitemap.d.mts +5 -5
  29. package/dist/sitemap.d.ts +5 -5
  30. package/dist/suggest.d.mts +2 -2
  31. package/dist/suggest.d.ts +2 -2
  32. package/dist/theme.d.mts +49 -1
  33. package/dist/theme.d.ts +49 -1
  34. package/dist/theme.js +60 -26
  35. package/dist/theme.mjs +60 -26
  36. package/package.json +1 -1
  37. package/skills/manifest.json +1 -1
@@ -86,6 +86,31 @@ interface components {
86
86
  */
87
87
  admin: string;
88
88
  };
89
+ AdminPlan: {
90
+ /** @description Unique identifier for the plan. */
91
+ id: string;
92
+ /** @enum {string} */
93
+ object: "plan";
94
+ name: string;
95
+ description: string | null;
96
+ kind: string;
97
+ /**
98
+ * @description Subscription billing interval. Required for kind=subscription.
99
+ * @enum {string|null}
100
+ */
101
+ billingInterval: "month" | "year" | null;
102
+ /**
103
+ * @description Whether the plan grants job-posting or talent-access entitlement.
104
+ * @enum {string}
105
+ */
106
+ purpose: "job_posting" | "talent_access";
107
+ isPublic: boolean;
108
+ isRecommended: boolean;
109
+ isArchived: boolean;
110
+ displayOrder: number | null;
111
+ price: components["schemas"]["PlanPrice"];
112
+ features: components["schemas"]["PlanFeature"][];
113
+ };
89
114
  AiUsage: {
90
115
  id: string;
91
116
  /** @enum {string} */
@@ -276,6 +301,37 @@ interface components {
276
301
  resourceId: string;
277
302
  })[];
278
303
  };
304
+ BillingCheckout: {
305
+ /** @enum {string} */
306
+ object: "billing_checkout";
307
+ funding: components["schemas"]["BillingHostedCheckoutFunding"];
308
+ /**
309
+ * Format: uri
310
+ * @description Hosted Stripe Checkout Session URL.
311
+ */
312
+ url: string;
313
+ /** @description Stripe Checkout Session id (cs_…). */
314
+ sessionId: string;
315
+ /**
316
+ * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
317
+ * @enum {string}
318
+ */
319
+ planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
320
+ /** @enum {string} */
321
+ interval: "monthly" | "annual";
322
+ };
323
+ BillingCheckoutBody: {
324
+ /**
325
+ * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
326
+ * @enum {string}
327
+ */
328
+ planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
329
+ /**
330
+ * @description Billing interval. Defaults to monthly when omitted.
331
+ * @enum {string}
332
+ */
333
+ interval?: "monthly" | "annual";
334
+ };
279
335
  BillingConnect: {
280
336
  /** @enum {string} */
281
337
  object: "billing_connect";
@@ -314,6 +370,14 @@ interface components {
314
370
  canRemoveBranding: boolean;
315
371
  apiAccess: boolean;
316
372
  };
373
+ BillingHostedCheckoutFunding: {
374
+ /** @enum {string} */
375
+ type: "hosted_checkout";
376
+ };
377
+ BillingSavedPmFunding: {
378
+ /** @enum {string} */
379
+ type: "saved_pm";
380
+ };
317
381
  BillingSubscription: {
318
382
  /** @enum {string} */
319
383
  object: "billing_subscription";
@@ -331,6 +395,47 @@ interface components {
331
395
  stripePriceId: string;
332
396
  quantity: number;
333
397
  };
398
+ BillingUpgrade: components["schemas"]["BillingUpgradeSavedPm"] | components["schemas"]["BillingUpgradeCheckoutRequired"];
399
+ BillingUpgradeBody: {
400
+ /**
401
+ * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
402
+ * @enum {string}
403
+ */
404
+ planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
405
+ /**
406
+ * @description Billing interval. Defaults to monthly when omitted.
407
+ * @enum {string}
408
+ */
409
+ interval?: "monthly" | "annual";
410
+ };
411
+ BillingUpgradeCheckoutRequired: {
412
+ /** @enum {string} */
413
+ object: "billing_upgrade";
414
+ funding: components["schemas"]["BillingHostedCheckoutFunding"];
415
+ /** @enum {string} */
416
+ status: "checkout_required";
417
+ /** Format: uri */
418
+ url: string;
419
+ sessionId: string;
420
+ /**
421
+ * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
422
+ * @enum {string}
423
+ */
424
+ planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
425
+ };
426
+ BillingUpgradeSavedPm: {
427
+ /** @enum {string} */
428
+ object: "billing_upgrade";
429
+ funding: components["schemas"]["BillingSavedPmFunding"];
430
+ /** @enum {string} */
431
+ status: "upgraded";
432
+ /**
433
+ * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
434
+ * @enum {string}
435
+ */
436
+ planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
437
+ stripeSubscriptionId: string;
438
+ };
334
439
  Block: {
335
440
  /** @enum {string} */
336
441
  object: "block";
@@ -1090,6 +1195,21 @@ interface components {
1090
1195
  object: "conversation_ref";
1091
1196
  conversationId: string | null;
1092
1197
  };
1198
+ Coupon: {
1199
+ id: string;
1200
+ /** @enum {string} */
1201
+ object: "coupon";
1202
+ name: string | null;
1203
+ percentOff: number | null;
1204
+ amountOff: number | null;
1205
+ currency: string | null;
1206
+ duration: string;
1207
+ durationInMonths: number | null;
1208
+ valid: boolean;
1209
+ appliesTo: string[] | null;
1210
+ timesRedeemed: number;
1211
+ created: string;
1212
+ };
1093
1213
  CreateAuthorBody: {
1094
1214
  /** @description URL-friendly slug for the author. Auto-generated from `name` when omitted. */
1095
1215
  slug?: string;
@@ -1171,6 +1291,20 @@ interface components {
1171
1291
  /** @description URL-friendly slug for the company. Auto-generated from `name` when omitted. */
1172
1292
  slug?: string;
1173
1293
  };
1294
+ CreateCouponBody: {
1295
+ name: string;
1296
+ percentOff?: number | null;
1297
+ /** @description Fixed discount in the currency major unit (e.g. 10 for $10, 1000 for ¥1000). Required with `currency` when there is no percentOff. */
1298
+ amountOff?: number | null;
1299
+ currency?: string | null;
1300
+ /** @enum {string} */
1301
+ duration: "once" | "forever" | "repeating";
1302
+ durationInMonths?: number;
1303
+ maxRedemptions?: number;
1304
+ /** @description Unix ms deadline after which the coupon cannot be redeemed. */
1305
+ redeemBy?: number;
1306
+ appliesToPlanIds?: string[];
1307
+ };
1174
1308
  CreateDomainBody: {
1175
1309
  /** @description Hostname to bind to this board, for example jobs.acme.com. Labels may contain letters, numbers, and hyphens, and may not start or end with a hyphen. The API normalizes accepted hostnames to lowercase before writing. */
1176
1310
  domain: string;
@@ -1202,6 +1336,15 @@ interface components {
1202
1336
  description?: string;
1203
1337
  sortOrder?: number;
1204
1338
  };
1339
+ CreateFeatureBody: {
1340
+ /** @description Stable feature key, e.g. jobs.max_active. */
1341
+ key: string;
1342
+ name: string;
1343
+ /** @description Value data type, e.g. integer or string. */
1344
+ dataType: string;
1345
+ description?: string;
1346
+ defaultValue?: string;
1347
+ };
1205
1348
  CreateForagerSubscriptionBody: {
1206
1349
  name: string;
1207
1350
  rules: components["schemas"]["ForagerRule"][];
@@ -1409,6 +1552,43 @@ interface components {
1409
1552
  /** @description The stage label. */
1410
1553
  label: string;
1411
1554
  };
1555
+ CreatePlanBody: {
1556
+ /** @description Display name for the plan. */
1557
+ name: string;
1558
+ /** @description Optional plan description. */
1559
+ description?: string;
1560
+ /**
1561
+ * @description Plan billing kind.
1562
+ * @enum {string}
1563
+ */
1564
+ kind: "free" | "one_time" | "bundle" | "subscription";
1565
+ /**
1566
+ * @description Subscription billing interval. Required for kind=subscription.
1567
+ * @enum {string}
1568
+ */
1569
+ billingInterval?: "month" | "year";
1570
+ /**
1571
+ * @description Whether the plan grants job-posting or talent-access entitlement.
1572
+ * @enum {string}
1573
+ */
1574
+ purpose?: "job_posting" | "talent_access";
1575
+ /** @description Whether the plan is publicly listed. Defaults to false. */
1576
+ isPublic?: boolean;
1577
+ isRecommended?: boolean;
1578
+ displayOrder?: number;
1579
+ };
1580
+ CreatePromotionCodeBody: {
1581
+ code: string;
1582
+ maxRedemptions?: number;
1583
+ /**
1584
+ * Format: date-time
1585
+ * @description ISO-8601 expiry; converted to epoch seconds for Stripe.
1586
+ */
1587
+ expiresAt?: string;
1588
+ firstTimeTransaction?: boolean;
1589
+ minimumAmount?: number;
1590
+ minimumAmountCurrency?: string;
1591
+ };
1412
1592
  CreateRedirectBody: {
1413
1593
  /** @description Source path to match, for example `/old-careers`. */
1414
1594
  fromPath: string;
@@ -1919,6 +2099,25 @@ interface components {
1919
2099
  hidden: boolean;
1920
2100
  position: number;
1921
2101
  };
2102
+ EmployerSubscription: {
2103
+ id: string;
2104
+ /** @enum {string} */
2105
+ object: "employer_subscription";
2106
+ employerEmail: string;
2107
+ companyId: string | null;
2108
+ companyName: string | null;
2109
+ planId: string | null;
2110
+ planName: string | null;
2111
+ status: string;
2112
+ /** @description ISO-8601 period end, or null. */
2113
+ currentPeriodEnd: string | null;
2114
+ cancelAtPeriodEnd: boolean;
2115
+ /** @description ISO-8601 creation time. */
2116
+ createdAt: string;
2117
+ stripeCustomerId: string | null;
2118
+ stripeSubscriptionId: string | null;
2119
+ };
2120
+ EmployerSubscriptionOrNull: components["schemas"]["EmployerSubscription"] | unknown | unknown;
1922
2121
  EmployerUpdateJobBody: {
1923
2122
  /** @description Long-form description of the role. Up to 25,000 characters. */
1924
2123
  description?: string;
@@ -1992,6 +2191,17 @@ interface components {
1992
2191
  /** @description The job title. */
1993
2192
  title?: string;
1994
2193
  };
2194
+ FeatureDefinition: {
2195
+ id: string;
2196
+ /** @enum {string} */
2197
+ object: "feature";
2198
+ key: string;
2199
+ name: string;
2200
+ description: string | null;
2201
+ dataType: string;
2202
+ defaultValue: string | null;
2203
+ isSystem: boolean;
2204
+ };
1995
2205
  FindOrCreateCompanyBody: {
1996
2206
  /** @description The company's display name. */
1997
2207
  name: string;
@@ -2910,6 +3120,10 @@ interface components {
2910
3120
  requireApprovalAggregatedJobs?: boolean;
2911
3121
  /** @description Whether visitors must sign in to view jobs. */
2912
3122
  registrationWallEnabled?: boolean;
3123
+ /** @description Whether the board's built-in ATS receives applications. When `false` (external-applications-only board), posting surfaces require an external `applicationUrl` and `POST /boards/:identifier/jobs/:jobSlug/apply` rejects with `applications_native_disabled`. Turning this off UNPUBLISHES every published native-apply job (those with no external `applicationUrl`) back to draft via an asynchronous batched drain — expect published job counts to shrink over the following seconds. Nothing is deleted, and re-enabling does NOT republish the drafted jobs. Absent means `true`. */
3124
+ nativeApplicationsEnabled?: boolean;
3125
+ /** @description Whether applicant↔employer messaging is enabled. When `false`, the `me/conversations` route family rejects with `messaging_disabled` and new-message emails are suppressed. Absent means `true`. */
3126
+ applicantMessagingEnabled?: boolean;
2913
3127
  /** @description Legacy shorthand for the talent directory. `true` maps to `talentDirectoryVisibility: "public"`; `false` maps to `"off"`. Prefer the tri-state field. Providing both with conflicting values returns `settings_conflicting_fields`. */
2914
3128
  talentDirectoryEnabled?: boolean;
2915
3129
  /**
@@ -2956,6 +3170,34 @@ interface components {
2956
3170
  [key: string]: unknown;
2957
3171
  };
2958
3172
  };
3173
+ PaywallGrantAdmin: {
3174
+ id: string;
3175
+ /** @enum {string} */
3176
+ object: "paywall_grant";
3177
+ boardUserId: string;
3178
+ email: string;
3179
+ displayName: string;
3180
+ /** @enum {string} */
3181
+ kind: "recurring" | "one_time";
3182
+ offerKey: string;
3183
+ status: string;
3184
+ stripeCustomerId: string | null;
3185
+ stripeSubscriptionId: string | null;
3186
+ amountCents: number;
3187
+ currency: string;
3188
+ currentPeriodStart: string | null;
3189
+ currentPeriodEnd: string | null;
3190
+ cancelAtPeriodEnd: boolean;
3191
+ activatedAt: string | null;
3192
+ canceledAt: string | null;
3193
+ createdAt: string;
3194
+ };
3195
+ PaywallGrantCount: {
3196
+ /** @enum {string} */
3197
+ object: "paywall_grant_count";
3198
+ cancelableRecurring: number;
3199
+ windingDownRecurring: number;
3200
+ };
2959
3201
  PaywallOffer: {
2960
3202
  /** @enum {string} */
2961
3203
  object: "paywall_offer";
@@ -2974,6 +3216,26 @@ interface components {
2974
3216
  intervalCount: number | null;
2975
3217
  isDefault: boolean;
2976
3218
  };
3219
+ PaywallOfferAdmin: {
3220
+ id: string;
3221
+ /** @enum {string} */
3222
+ object: "paywall_offer";
3223
+ offerKey: string;
3224
+ label: string | null;
3225
+ billingLabel: string | null;
3226
+ /** @enum {string} */
3227
+ kind: "recurring" | "one_time";
3228
+ intervalUnit: string | null;
3229
+ intervalCount: number | null;
3230
+ amountCents: number;
3231
+ currency: string;
3232
+ stripePriceId: string | null;
3233
+ enabled: boolean;
3234
+ isDefault: boolean;
3235
+ displayOrder: number;
3236
+ createdAt: string;
3237
+ };
3238
+ PaywallOfferAdminOrNull: components["schemas"]["PaywallOfferAdmin"] | unknown | unknown;
2977
3239
  Permission: {
2978
3240
  /** @description Unique identifier for the permission. */
2979
3241
  id: string;
@@ -3022,6 +3284,36 @@ interface components {
3022
3284
  messagesPerPeriod: string;
3023
3285
  };
3024
3286
  };
3287
+ PlanFeature: {
3288
+ /** @description Stable feature key, e.g. jobs.max_active. */
3289
+ key: string;
3290
+ name: string | null;
3291
+ value: string | null;
3292
+ dataType: string | null;
3293
+ };
3294
+ PlanFeatureValue: {
3295
+ key: string;
3296
+ value: string;
3297
+ };
3298
+ /** @description The plan single active price, or null when no price has been set. */
3299
+ PlanPrice: {
3300
+ /** @description ISO 4217 currency code, lowercase. */
3301
+ currency: string;
3302
+ /** @description Unit amount in the smallest currency unit. */
3303
+ amountCents: number;
3304
+ stripePriceId: string | null;
3305
+ stripeProductId: string | null;
3306
+ isActive: boolean;
3307
+ } | null;
3308
+ PromotionCode: {
3309
+ id: string;
3310
+ /** @enum {string} */
3311
+ object: "promotion_code";
3312
+ code: string;
3313
+ couponId: string;
3314
+ active: boolean;
3315
+ created: string;
3316
+ };
3025
3317
  PublicBlogAdjacentPosts: {
3026
3318
  /** @enum {string} */
3027
3319
  object: "blog_adjacent_posts";
@@ -3115,6 +3407,10 @@ interface components {
3115
3407
  publicJobSubmission: boolean;
3116
3408
  candidatePaywall: boolean;
3117
3409
  impressum: boolean;
3410
+ /** @description Whether the board accepts native (on-board ATS) applications. `false` means external-applications-only: the server rejects native submissions to `POST /jobs/:jobSlug/apply` with `applications_native_disabled` (422). Clients should hide native apply UI and treat a job with no external `applicationUrl` as not-applyable. */
3411
+ nativeApplications: boolean;
3412
+ /** @description Whether applicant↔employer messaging is enabled on the board. `false` means the `me/conversations` route family rejects with `messaging_disabled` (403) — hide inbox/dock/Message CTAs. */
3413
+ messaging: boolean;
3118
3414
  };
3119
3415
  /**
3120
3416
  * @description The tri-state behind `features.talentDirectory` (which is `visibility === 'public'`). Link /talent whenever this is not `'off'` — an employers-only directory renders a sign-in upsell for anonymous visitors, matching the hosted chrome.
@@ -3622,6 +3918,9 @@ interface components {
3622
3918
  RemoveForagerCompanyBody: {
3623
3919
  companyUrl: string;
3624
3920
  };
3921
+ RenameCouponBody: {
3922
+ name: string;
3923
+ };
3625
3924
  ReorderPipelineStagesBody: {
3626
3925
  /** @description The job whose stages are reordered. */
3627
3926
  jobId: string;
@@ -3931,6 +4230,19 @@ interface components {
3931
4230
  /** Format: email */
3932
4231
  workEmail: string;
3933
4232
  };
4233
+ SetPlanFeaturesBody: {
4234
+ /** @description Full replacement set of feature key/value pairs for the plan. */
4235
+ features: {
4236
+ key: string;
4237
+ value: string;
4238
+ }[];
4239
+ };
4240
+ SetPlanPriceBody: {
4241
+ /** @description ISO 4217 currency code (e.g. usd). */
4242
+ currency: string;
4243
+ /** @description Unit amount in the smallest currency unit. */
4244
+ amountCents: number;
4245
+ };
3934
4246
  SettingsAdsenseBody: {
3935
4247
  /** @description Whether AdSense placements are rendered on the public board. */
3936
4248
  adsenseEnabled?: boolean;
@@ -4141,6 +4453,9 @@ interface components {
4141
4453
  StartConversationBody: {
4142
4454
  candidateBoardUserId: string;
4143
4455
  body: string;
4456
+ } | {
4457
+ candidateHandle: string;
4458
+ body: string;
4144
4459
  };
4145
4460
  Subscriber: {
4146
4461
  /** @description Unique identifier for the subscriber. */
@@ -4202,6 +4517,18 @@ interface components {
4202
4517
  items: components["schemas"]["SuggestionItem"][];
4203
4518
  };
4204
4519
  SuggestionItem: components["schemas"]["CompanySuggestion"] | components["schemas"]["TermSuggestion"];
4520
+ TalentAccess: {
4521
+ /** @enum {string} */
4522
+ object: "talent_access";
4523
+ /** @description Whether the viewer has an approved company membership on this board. */
4524
+ isEmployer: boolean;
4525
+ /** @description Whether this board sells talent access (a public `talent_access` plan exists). When `false` the talent surfaces are not credit-gated for employers. */
4526
+ paywallActive: boolean;
4527
+ /** @description The CTA answer: the viewer is an approved employer AND either the board has no talent paywall or one of their companies holds an active talent_access subscription or a succeeded credit pack. Always `false` for candidates; anonymous viewers get 401. */
4528
+ hasTalentAccess: boolean;
4529
+ /** @description True when any active talent_access subscription carries the unlimited profile-unlock sentinel on its feature snapshot. */
4530
+ hasUnlimitedUnlocks: boolean;
4531
+ };
4205
4532
  TalentDirectoryEntry: {
4206
4533
  /** @enum {string} */
4207
4534
  object: "talent_directory_entry";
@@ -4240,6 +4567,8 @@ interface components {
4240
4567
  title: string;
4241
4568
  companyName: string;
4242
4569
  companyUrl: string | null;
4570
+ /** @description Absolute logo URL for the company, resolved from `companyUrl` the same way the hosted profile renders it; `null` when the company has no usable website. Render a monogram/initials fallback when `null` (and on image error — the URL 404s when the brand has no icon). */
4571
+ companyLogoUrl: string | null;
4243
4572
  location: string | null;
4244
4573
  employmentType: string | null;
4245
4574
  locationType: string | null;
@@ -4255,6 +4584,8 @@ interface components {
4255
4584
  education: {
4256
4585
  institutionName: string;
4257
4586
  institutionUrl: string | null;
4587
+ /** @description Absolute logo URL for the institution, resolved from `institutionUrl` the same way the hosted profile renders it; `null` when the institution has no usable website. Render a monogram/initials fallback when `null` (and on image error). */
4588
+ institutionLogoUrl: string | null;
4258
4589
  degree: string | null;
4259
4590
  fieldOfStudy: string | null;
4260
4591
  grade: string | null;
@@ -4769,10 +5100,30 @@ interface components {
4769
5100
  channel: "messageEmails" | "applicationEmails";
4770
5101
  subscribed: boolean;
4771
5102
  };
5103
+ UpdatePaywallOfferBody: {
5104
+ /** @description Enable or disable the offer. */
5105
+ isEnabled?: boolean;
5106
+ /** @description Alias of isEnabled (either is accepted). */
5107
+ enabled?: boolean;
5108
+ label?: string;
5109
+ billingLabel?: string;
5110
+ displayOrder?: number;
5111
+ isDefault?: boolean;
5112
+ };
4772
5113
  UpdatePipelineStageBody: {
4773
5114
  label?: string;
4774
5115
  hidden?: boolean;
4775
5116
  };
5117
+ UpdatePlanBody: {
5118
+ name?: string;
5119
+ description?: string;
5120
+ /** @description Publish/unpublish the plan. */
5121
+ isPublic?: boolean;
5122
+ isRecommended?: boolean;
5123
+ /** @description Archive the plan (soft-delete). There is no hard DELETE. */
5124
+ isArchived?: boolean;
5125
+ displayOrder?: number;
5126
+ };
4776
5127
  UpdateRedirectBody: {
4777
5128
  /** @description Source path to match, for example `/old-careers`. */
4778
5129
  fromPath?: string;