@cavuno/board 4.61.0 → 4.63.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 (67) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/{_spec-B6YOcfhm.d.mts → _spec-D1Qg_Twd.d.mts} +109 -3
  3. package/dist/{_spec-B6YOcfhm.d.ts → _spec-D1Qg_Twd.d.ts} +109 -3
  4. package/dist/bin.mjs +12 -5
  5. package/dist/{blog-Iz3vKyol.d.ts → blog-Dp2jAVVM.d.ts} +1 -1
  6. package/dist/{blog-BazgjIMl.d.mts → blog-e0YbZBjg.d.mts} +1 -1
  7. package/dist/{board-Bd7H1jwl.d.ts → board-BeNZLOYC.d.ts} +2 -2
  8. package/dist/{board-BwOeOQ6v.d.mts → board-Cc3wbTKI.d.mts} +2 -2
  9. package/dist/{breadcrumbs-pccdTbvQ.d.ts → breadcrumbs-BOFeIYEX.d.ts} +2 -2
  10. package/dist/{breadcrumbs-DxlE86G-.d.mts → breadcrumbs-C5WjB8jm.d.mts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/{chunk-R3QB3WM6.mjs → chunk-4KMZZR3A.mjs} +1 -1
  13. package/dist/{chunk-M4CX64RC.mjs → chunk-COHTNSU2.mjs} +9 -1
  14. package/dist/{chunk-LO7D3AIX.mjs → chunk-HHMY3W7T.mjs} +7 -4
  15. package/dist/{chunk-MSY7ERBY.mjs → chunk-RAE63XH5.mjs} +3 -1
  16. package/dist/doctor.js +12 -5
  17. package/dist/doctor.mjs +12 -5
  18. package/dist/filters.d.mts +2 -2
  19. package/dist/filters.d.ts +2 -2
  20. package/dist/format.d.mts +4 -4
  21. package/dist/format.d.ts +4 -4
  22. package/dist/format.js +3 -1
  23. package/dist/format.mjs +2 -2
  24. package/dist/go.js +3 -1
  25. package/dist/go.mjs +1 -1
  26. package/dist/index.d.mts +114 -13
  27. package/dist/index.d.ts +114 -13
  28. package/dist/index.js +82 -6
  29. package/dist/index.mjs +74 -6
  30. package/dist/{jobs-DrDmqiBb.d.mts → jobs-CClqlUld.d.mts} +1 -1
  31. package/dist/{jobs-BwxCoTRJ.d.ts → jobs-D04ngjCP.d.ts} +1 -1
  32. package/dist/paths.d.mts +2 -0
  33. package/dist/paths.d.ts +2 -0
  34. package/dist/paths.js +3 -1
  35. package/dist/paths.mjs +1 -1
  36. package/dist/{roles-B_d0igKI.d.mts → roles-D745cT5b.d.mts} +3 -1
  37. package/dist/{roles-B_d0igKI.d.ts → roles-D745cT5b.d.ts} +3 -1
  38. package/dist/route-contract.d.mts +2 -2
  39. package/dist/route-contract.d.ts +2 -2
  40. package/dist/route-contract.js +9 -4
  41. package/dist/route-contract.mjs +2 -2
  42. package/dist/{search-CbGEG89W.d.mts → search-BtrwcLkc.d.mts} +1 -1
  43. package/dist/{search-D4Uo2bRh.d.ts → search-DZeNdYN6.d.ts} +1 -1
  44. package/dist/{seo-CnqvU41p.d.ts → seo-DLoyZRTo.d.ts} +1 -1
  45. package/dist/{seo-DiJBveAA.d.mts → seo-LfpgbdnO.d.mts} +1 -1
  46. package/dist/seo-files.d.mts +2 -2
  47. package/dist/seo-files.d.ts +2 -2
  48. package/dist/seo.d.mts +6 -6
  49. package/dist/seo.d.ts +6 -6
  50. package/dist/seo.js +3 -1
  51. package/dist/seo.mjs +2 -2
  52. package/dist/server.d.mts +6 -6
  53. package/dist/server.d.ts +6 -6
  54. package/dist/server.mjs +1 -1
  55. package/dist/sitemap.d.mts +6 -6
  56. package/dist/sitemap.d.ts +6 -6
  57. package/dist/sitemap.js +3 -1
  58. package/dist/sitemap.mjs +2 -2
  59. package/dist/suggest.d.mts +2 -2
  60. package/dist/suggest.d.ts +2 -2
  61. package/dist/well-known.d.mts +1 -1
  62. package/dist/well-known.d.ts +1 -1
  63. package/dist/well-known.js +9 -4
  64. package/dist/well-known.mjs +2 -2
  65. package/package.json +1 -1
  66. package/skills/cavuno-board-products/SKILL.md +30 -1
  67. package/skills/manifest.json +2 -2
package/CHANGELOG.md CHANGED
@@ -3,6 +3,38 @@
3
3
  This changelog records changes that affect Board API compatibility, exported
4
4
  types, runtime behavior, or supported integration patterns.
5
5
 
6
+ ## 4.63.0 — 2026-11-05
7
+
8
+ - `board.me.profile.listVerifications` returns a row for every item on the
9
+ profile that can be verified, including unchecked ones, typed as the new
10
+ exported `MyItemVerification`. Each row's `nextStep` (`email`, `team` or
11
+ `none`) says which check the item allows now, and `emailCheck` is set
12
+ while an emailed code is waiting. A rejected item reopens only after its
13
+ checked details change.
14
+ - New operator operations: `batchPlans` (`POST /plans/batch`, up to 10
15
+ complete plans with their prices per call) and `listTodos`
16
+ (`GET /todos`, the board's setup to-dos as they read on Home).
17
+ - Domains returned by the operator domain operations carry `dnsRecords`,
18
+ the routing records to add at the DNS provider.
19
+ - `PATCH /jobs/{id}` clears `experienceMonths` and in-office attendance
20
+ when they are sent as `null`.
21
+
22
+ ## 4.62.0 — 2026-11-04
23
+
24
+ - Tip jar. `board.tipJar.get` reads the board's tip page settings,
25
+ `board.tipJar.checkout` starts a tip with an embedded Stripe Checkout, and
26
+ `board.tipJar.getCheckout` reads the tip back after Stripe returns the
27
+ tipper. New exported types: `TipJar`, `TipJarCheckout`,
28
+ `TipJarCheckoutBody` and `TipJarCheckoutStatus`.
29
+ - `BOARD_PATHS.tip` (`/tip`) and the `tip` route role. A board without a tip
30
+ jar may leave the page unpublished.
31
+ - New error codes: `tip_jar_not_found`, `tip_checkout_not_found`,
32
+ `tip_amount_below_minimum`, `tip_amount_invalid`, `tip_note_not_allowed`
33
+ and `tip_note_too_long`.
34
+ - New operator operations and events: plan purpose `tip_jar` with a `tipJar`
35
+ object on the plans operations, `listPlanTips`, and the `tip.received` and
36
+ `tip.refunded` webhooks.
37
+
6
38
  ## 4.61.0 — 2026-11-04
7
39
 
8
40
  - `board.context()` carries `verification.experience` and
@@ -1373,7 +1373,7 @@ interface components {
1373
1373
  * @enum {string}
1374
1374
  */
1375
1375
  remoteOption: "on_site" | "hybrid" | "remote";
1376
- /** @description Where remote candidates must hold work authorization. Each entry is the smallest relevant scope: `worldwide`, a `world_region` (EMEA / LATAM / NA / APAC), a `continent`, a `region`, a `subregion`, a `custom` group (e.g. `EU`), a `country` (ISO 3166-1 alpha-2), or a `subdivision` (ISO 3166-2). Subdivisions auto-imply their parent country in the derived `remoteWorkPermitCountryCodes` output. Worldwide is mutually exclusive with all other entries. The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-permits`. Pass `[]` to clear an existing constraint. */
1376
+ /** @description Where remote candidates must hold work authorization. Each entry is the smallest relevant scope: `worldwide`, a `world_region` (EMEA / LATAM / NA / APAC), a `continent`, a `region`, a `subregion`, a `custom` group (e.g. `EU`), a `country` (ISO 3166-1 alpha-2), or a `subdivision` (ISO 3166-2). Subdivisions auto-imply their parent country in the derived `remoteWorkPermitCountryCodes` output. Worldwide is mutually exclusive with all other entries. The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-permits`. Pass `[]` to clear an existing constraint on an `on_site` or `hybrid` job; a `remote` job always needs at least one entry, so send `[{"type":"worldwide","value":"worldwide"}]` to lift the restriction. */
1377
1377
  remotePermits?: {
1378
1378
  /** @enum {string} */
1379
1379
  type: "worldwide" | "world_region" | "continent" | "region" | "subregion" | "subdivision" | "country" | "custom";
@@ -1688,7 +1688,7 @@ interface components {
1688
1688
  * @enum {string}
1689
1689
  */
1690
1690
  remoteOption?: "on_site" | "hybrid" | "remote";
1691
- /** @description Where remote candidates must hold work authorization. Each entry is the smallest relevant scope: `worldwide`, a `world_region` (EMEA / LATAM / NA / APAC), a `continent`, a `region`, a `subregion`, a `custom` group (e.g. `EU`), a `country` (ISO 3166-1 alpha-2), or a `subdivision` (ISO 3166-2). Subdivisions auto-imply their parent country in the derived `remoteWorkPermitCountryCodes` output. Worldwide is mutually exclusive with all other entries. The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-permits`. Pass `[]` to clear an existing constraint. */
1691
+ /** @description Where remote candidates must hold work authorization. Each entry is the smallest relevant scope: `worldwide`, a `world_region` (EMEA / LATAM / NA / APAC), a `continent`, a `region`, a `subregion`, a `custom` group (e.g. `EU`), a `country` (ISO 3166-1 alpha-2), or a `subdivision` (ISO 3166-2). Subdivisions auto-imply their parent country in the derived `remoteWorkPermitCountryCodes` output. Worldwide is mutually exclusive with all other entries. The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-permits`. Pass `[]` to clear an existing constraint on an `on_site` or `hybrid` job; a `remote` job always needs at least one entry, so send `[{"type":"worldwide","value":"worldwide"}]` to lift the restriction. */
1692
1692
  remotePermits?: {
1693
1693
  /** @enum {string} */
1694
1694
  type: "worldwide" | "world_region" | "continent" | "region" | "subregion" | "subdivision" | "country" | "custom";
@@ -1804,7 +1804,7 @@ interface components {
1804
1804
  object: "item_verification";
1805
1805
  itemKey: string;
1806
1806
  /**
1807
- * @description `changed`: a checked field was edited after verification. `lapsed`: past its expiry or re-check date (see `lapseReason`).
1807
+ * @description `changed`: a checked field was edited after the item was verified or rejected. `lapsed`: past its expiry or re-check date (see `lapseReason`).
1808
1808
  * @enum {string}
1809
1809
  */
1810
1810
  status: "unverified" | "pending" | "needs_info" | "verified" | "rejected" | "unable_to_verify" | "changed" | "lapsed" | "revoked";
@@ -2266,6 +2266,35 @@ interface components {
2266
2266
  /** @description The target stage id. */
2267
2267
  stageId: string;
2268
2268
  };
2269
+ MyItemVerification: components["schemas"]["ItemVerification"] & {
2270
+ /** @description The verification's id. For an item with no verification yet (`unverified`), its `itemKey`. */
2271
+ id?: string;
2272
+ /**
2273
+ * Format: date-time
2274
+ * @description When the verification last changed. For an item with no verification yet, when the profile last saved it.
2275
+ */
2276
+ updatedAt?: string;
2277
+ /**
2278
+ * @description What the worker can do for this item now, from its state on the server. `email`: the item allows an email-domain check (`POST …/verifications/email-domain`); asking the board team is also allowed. A start can still be rate limited (per item, per worker, or within a minute of the last check), and the route then answers `429` with `item_verification_rate_limited`. `team`: the item allows only asking the board team (`POST …/verifications`), for example a past job, an item with no website, a field the team verifies, or a rejected item whose checked details were edited since. `none`: nothing to do now (waiting for review, verified, revoked, or rejected and not edited since). Company profile items are never `email`.
2279
+ * @enum {string}
2280
+ */
2281
+ nextStep: "email" | "team" | "none";
2282
+ /** @description A code emailed for this item that can still be typed (`POST …/verifications/email-domain/confirm`), so a client can return to the code step after a reload. `null` when there is none, it expired, or the item changed since it was sent. Only set while `nextStep` is `email`. */
2283
+ emailCheck: {
2284
+ /** @description The domain the code was sent to. The address itself is never stored. */
2285
+ domain: string;
2286
+ /**
2287
+ * Format: date-time
2288
+ * @description When the emailed code stops working.
2289
+ */
2290
+ codeExpiresAt: string;
2291
+ /**
2292
+ * Format: date-time
2293
+ * @description When a new check can send another email for this item; before then a new check sends nothing.
2294
+ */
2295
+ resendAvailableAt: string;
2296
+ } | null;
2297
+ };
2269
2298
  NotificationPreference: {
2270
2299
  /** @enum {string} */
2271
2300
  object: "notification_preference";
@@ -4448,6 +4477,83 @@ interface components {
4448
4477
  /** @description Board-language name with source-name fallback. */
4449
4478
  displayName: string;
4450
4479
  };
4480
+ TipJar: {
4481
+ /** @enum {string} */
4482
+ object: "tip_jar";
4483
+ name: string;
4484
+ /** @description Plain-text description. When `descriptionHtml` is set, this is its text. */
4485
+ description: string | null;
4486
+ /** @description Formatted description as sanitized HTML (the same tags as a digital product description). `null` when the board wrote none; show `description` instead. */
4487
+ descriptionHtml: string | null;
4488
+ /** @description Lowercase ISO currency code. */
4489
+ currency: string;
4490
+ /** @description The smallest tip, in minor units: the board's minimum, or Stripe's smallest charge in the currency when none is set. */
4491
+ minimumCents: number;
4492
+ /** @description Three suggested amounts in minor units, smallest first. */
4493
+ suggestedCents: number[];
4494
+ /** @description Whether the tipper may leave a note for the board. */
4495
+ allowNote: boolean;
4496
+ /** @description The longest note, in characters (280). */
4497
+ noteMaxLength: number;
4498
+ /** @description The card rate behind "Add {fee} to cover the card fee", or `null` when the board does not offer it (then leave `coverFee` out of the checkout body). The fee for a tip of A minor units is ceil((A + fixedMinor) / (1 - percentBps / 10000)) - A, so the board keeps the whole tip after the card fee; show it next to the checkbox and send `coverFee: true` when ticked. */
4499
+ coverFee: {
4500
+ /** @description The percentage part of the card rate, in basis points (290 is 2.9%). */
4501
+ percentBps: number;
4502
+ /** @description The fixed part of the card rate, in minor units of the currency. */
4503
+ fixedMinor: number;
4504
+ } | null;
4505
+ /** @description Plain text shown after a tip; `null` when unset. */
4506
+ thankYouMessage: string | null;
4507
+ /** @description Tips so far, when the board shows the number of tips; otherwise `null`. */
4508
+ tipCount: number | null;
4509
+ /** @description The tip page path on the board (its route manifest words). */
4510
+ url: string;
4511
+ };
4512
+ TipJarCheckout: {
4513
+ /** @enum {string} */
4514
+ object: "tip_jar_checkout";
4515
+ /**
4516
+ * @description Mount the embedded Stripe Checkout with the mount kit fields. They are `null` only when the request was discarded (the honeypot was filled).
4517
+ * @enum {string}
4518
+ */
4519
+ status: "open";
4520
+ sessionId: string | null;
4521
+ /** @description The Checkout Session client secret. The session expires after 30 minutes. */
4522
+ clientSecret: string | null;
4523
+ /** @description The board’s connected Stripe account. */
4524
+ stripeAccountId: string | null;
4525
+ /** @description The Stripe publishable key for `loadStripe`. */
4526
+ publishableKey: string | null;
4527
+ };
4528
+ TipJarCheckoutBody: {
4529
+ /** @description The tip in minor units of the tip jar currency: at least `minimumCents`. */
4530
+ amountCents: number;
4531
+ /** @description Optional plain-text note for the board, at most 280 characters (longer is refused with `tip_note_too_long`). Only when `allowNote` is true; leave it out otherwise. */
4532
+ note?: string;
4533
+ /** @description Add the card fee on top of the tip, so the board keeps the whole tip. Default false. Only when the tip jar `coverFee` is not `null` (otherwise refused with `tip_fee_cover_not_allowed`); the checkout then charges `amountCents` plus the fee worked out from it. */
4534
+ coverFee?: boolean;
4535
+ /** @description The relative path Stripe returns the tipper to (`session_id` is appended). Defaults to the tip page. */
4536
+ returnPath?: string;
4537
+ /** @description Honeypot. Render it hidden and leave it empty; a filled value is answered like a success and nothing is recorded. */
4538
+ website?: string;
4539
+ };
4540
+ TipJarCheckoutStatus: {
4541
+ /** @enum {string} */
4542
+ object: "tip_jar_checkout_status";
4543
+ /**
4544
+ * @description `processing` until the payment clears (a delayed payment method, or the webhook has not landed yet; poll briefly), then `paid`.
4545
+ * @enum {string}
4546
+ */
4547
+ status: "processing" | "paid";
4548
+ /** @description The tip, without the card fee. */
4549
+ amountCents: number;
4550
+ /** @description The card fee the tipper added on top of the tip; 0 when none. The charge was `amountCents` + `coverFeeCents`. */
4551
+ coverFeeCents: number;
4552
+ currency: string;
4553
+ /** @description Where the receipt goes, masked (`m•••@gmail.com`): the session id is in a URL that can be shared. `null` until paid, or when Stripe collected none. */
4554
+ receiptEmail: string | null;
4555
+ thankYouMessage: string | null;
4556
+ };
4451
4557
  TitleLocationSalary: {
4452
4558
  /** @enum {string} */
4453
4559
  object: "title_location_salary";
@@ -1373,7 +1373,7 @@ interface components {
1373
1373
  * @enum {string}
1374
1374
  */
1375
1375
  remoteOption: "on_site" | "hybrid" | "remote";
1376
- /** @description Where remote candidates must hold work authorization. Each entry is the smallest relevant scope: `worldwide`, a `world_region` (EMEA / LATAM / NA / APAC), a `continent`, a `region`, a `subregion`, a `custom` group (e.g. `EU`), a `country` (ISO 3166-1 alpha-2), or a `subdivision` (ISO 3166-2). Subdivisions auto-imply their parent country in the derived `remoteWorkPermitCountryCodes` output. Worldwide is mutually exclusive with all other entries. The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-permits`. Pass `[]` to clear an existing constraint. */
1376
+ /** @description Where remote candidates must hold work authorization. Each entry is the smallest relevant scope: `worldwide`, a `world_region` (EMEA / LATAM / NA / APAC), a `continent`, a `region`, a `subregion`, a `custom` group (e.g. `EU`), a `country` (ISO 3166-1 alpha-2), or a `subdivision` (ISO 3166-2). Subdivisions auto-imply their parent country in the derived `remoteWorkPermitCountryCodes` output. Worldwide is mutually exclusive with all other entries. The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-permits`. Pass `[]` to clear an existing constraint on an `on_site` or `hybrid` job; a `remote` job always needs at least one entry, so send `[{"type":"worldwide","value":"worldwide"}]` to lift the restriction. */
1377
1377
  remotePermits?: {
1378
1378
  /** @enum {string} */
1379
1379
  type: "worldwide" | "world_region" | "continent" | "region" | "subregion" | "subdivision" | "country" | "custom";
@@ -1688,7 +1688,7 @@ interface components {
1688
1688
  * @enum {string}
1689
1689
  */
1690
1690
  remoteOption?: "on_site" | "hybrid" | "remote";
1691
- /** @description Where remote candidates must hold work authorization. Each entry is the smallest relevant scope: `worldwide`, a `world_region` (EMEA / LATAM / NA / APAC), a `continent`, a `region`, a `subregion`, a `custom` group (e.g. `EU`), a `country` (ISO 3166-1 alpha-2), or a `subdivision` (ISO 3166-2). Subdivisions auto-imply their parent country in the derived `remoteWorkPermitCountryCodes` output. Worldwide is mutually exclusive with all other entries. The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-permits`. Pass `[]` to clear an existing constraint. */
1691
+ /** @description Where remote candidates must hold work authorization. Each entry is the smallest relevant scope: `worldwide`, a `world_region` (EMEA / LATAM / NA / APAC), a `continent`, a `region`, a `subregion`, a `custom` group (e.g. `EU`), a `country` (ISO 3166-1 alpha-2), or a `subdivision` (ISO 3166-2). Subdivisions auto-imply their parent country in the derived `remoteWorkPermitCountryCodes` output. Worldwide is mutually exclusive with all other entries. The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-permits`. Pass `[]` to clear an existing constraint on an `on_site` or `hybrid` job; a `remote` job always needs at least one entry, so send `[{"type":"worldwide","value":"worldwide"}]` to lift the restriction. */
1692
1692
  remotePermits?: {
1693
1693
  /** @enum {string} */
1694
1694
  type: "worldwide" | "world_region" | "continent" | "region" | "subregion" | "subdivision" | "country" | "custom";
@@ -1804,7 +1804,7 @@ interface components {
1804
1804
  object: "item_verification";
1805
1805
  itemKey: string;
1806
1806
  /**
1807
- * @description `changed`: a checked field was edited after verification. `lapsed`: past its expiry or re-check date (see `lapseReason`).
1807
+ * @description `changed`: a checked field was edited after the item was verified or rejected. `lapsed`: past its expiry or re-check date (see `lapseReason`).
1808
1808
  * @enum {string}
1809
1809
  */
1810
1810
  status: "unverified" | "pending" | "needs_info" | "verified" | "rejected" | "unable_to_verify" | "changed" | "lapsed" | "revoked";
@@ -2266,6 +2266,35 @@ interface components {
2266
2266
  /** @description The target stage id. */
2267
2267
  stageId: string;
2268
2268
  };
2269
+ MyItemVerification: components["schemas"]["ItemVerification"] & {
2270
+ /** @description The verification's id. For an item with no verification yet (`unverified`), its `itemKey`. */
2271
+ id?: string;
2272
+ /**
2273
+ * Format: date-time
2274
+ * @description When the verification last changed. For an item with no verification yet, when the profile last saved it.
2275
+ */
2276
+ updatedAt?: string;
2277
+ /**
2278
+ * @description What the worker can do for this item now, from its state on the server. `email`: the item allows an email-domain check (`POST …/verifications/email-domain`); asking the board team is also allowed. A start can still be rate limited (per item, per worker, or within a minute of the last check), and the route then answers `429` with `item_verification_rate_limited`. `team`: the item allows only asking the board team (`POST …/verifications`), for example a past job, an item with no website, a field the team verifies, or a rejected item whose checked details were edited since. `none`: nothing to do now (waiting for review, verified, revoked, or rejected and not edited since). Company profile items are never `email`.
2279
+ * @enum {string}
2280
+ */
2281
+ nextStep: "email" | "team" | "none";
2282
+ /** @description A code emailed for this item that can still be typed (`POST …/verifications/email-domain/confirm`), so a client can return to the code step after a reload. `null` when there is none, it expired, or the item changed since it was sent. Only set while `nextStep` is `email`. */
2283
+ emailCheck: {
2284
+ /** @description The domain the code was sent to. The address itself is never stored. */
2285
+ domain: string;
2286
+ /**
2287
+ * Format: date-time
2288
+ * @description When the emailed code stops working.
2289
+ */
2290
+ codeExpiresAt: string;
2291
+ /**
2292
+ * Format: date-time
2293
+ * @description When a new check can send another email for this item; before then a new check sends nothing.
2294
+ */
2295
+ resendAvailableAt: string;
2296
+ } | null;
2297
+ };
2269
2298
  NotificationPreference: {
2270
2299
  /** @enum {string} */
2271
2300
  object: "notification_preference";
@@ -4448,6 +4477,83 @@ interface components {
4448
4477
  /** @description Board-language name with source-name fallback. */
4449
4478
  displayName: string;
4450
4479
  };
4480
+ TipJar: {
4481
+ /** @enum {string} */
4482
+ object: "tip_jar";
4483
+ name: string;
4484
+ /** @description Plain-text description. When `descriptionHtml` is set, this is its text. */
4485
+ description: string | null;
4486
+ /** @description Formatted description as sanitized HTML (the same tags as a digital product description). `null` when the board wrote none; show `description` instead. */
4487
+ descriptionHtml: string | null;
4488
+ /** @description Lowercase ISO currency code. */
4489
+ currency: string;
4490
+ /** @description The smallest tip, in minor units: the board's minimum, or Stripe's smallest charge in the currency when none is set. */
4491
+ minimumCents: number;
4492
+ /** @description Three suggested amounts in minor units, smallest first. */
4493
+ suggestedCents: number[];
4494
+ /** @description Whether the tipper may leave a note for the board. */
4495
+ allowNote: boolean;
4496
+ /** @description The longest note, in characters (280). */
4497
+ noteMaxLength: number;
4498
+ /** @description The card rate behind "Add {fee} to cover the card fee", or `null` when the board does not offer it (then leave `coverFee` out of the checkout body). The fee for a tip of A minor units is ceil((A + fixedMinor) / (1 - percentBps / 10000)) - A, so the board keeps the whole tip after the card fee; show it next to the checkbox and send `coverFee: true` when ticked. */
4499
+ coverFee: {
4500
+ /** @description The percentage part of the card rate, in basis points (290 is 2.9%). */
4501
+ percentBps: number;
4502
+ /** @description The fixed part of the card rate, in minor units of the currency. */
4503
+ fixedMinor: number;
4504
+ } | null;
4505
+ /** @description Plain text shown after a tip; `null` when unset. */
4506
+ thankYouMessage: string | null;
4507
+ /** @description Tips so far, when the board shows the number of tips; otherwise `null`. */
4508
+ tipCount: number | null;
4509
+ /** @description The tip page path on the board (its route manifest words). */
4510
+ url: string;
4511
+ };
4512
+ TipJarCheckout: {
4513
+ /** @enum {string} */
4514
+ object: "tip_jar_checkout";
4515
+ /**
4516
+ * @description Mount the embedded Stripe Checkout with the mount kit fields. They are `null` only when the request was discarded (the honeypot was filled).
4517
+ * @enum {string}
4518
+ */
4519
+ status: "open";
4520
+ sessionId: string | null;
4521
+ /** @description The Checkout Session client secret. The session expires after 30 minutes. */
4522
+ clientSecret: string | null;
4523
+ /** @description The board’s connected Stripe account. */
4524
+ stripeAccountId: string | null;
4525
+ /** @description The Stripe publishable key for `loadStripe`. */
4526
+ publishableKey: string | null;
4527
+ };
4528
+ TipJarCheckoutBody: {
4529
+ /** @description The tip in minor units of the tip jar currency: at least `minimumCents`. */
4530
+ amountCents: number;
4531
+ /** @description Optional plain-text note for the board, at most 280 characters (longer is refused with `tip_note_too_long`). Only when `allowNote` is true; leave it out otherwise. */
4532
+ note?: string;
4533
+ /** @description Add the card fee on top of the tip, so the board keeps the whole tip. Default false. Only when the tip jar `coverFee` is not `null` (otherwise refused with `tip_fee_cover_not_allowed`); the checkout then charges `amountCents` plus the fee worked out from it. */
4534
+ coverFee?: boolean;
4535
+ /** @description The relative path Stripe returns the tipper to (`session_id` is appended). Defaults to the tip page. */
4536
+ returnPath?: string;
4537
+ /** @description Honeypot. Render it hidden and leave it empty; a filled value is answered like a success and nothing is recorded. */
4538
+ website?: string;
4539
+ };
4540
+ TipJarCheckoutStatus: {
4541
+ /** @enum {string} */
4542
+ object: "tip_jar_checkout_status";
4543
+ /**
4544
+ * @description `processing` until the payment clears (a delayed payment method, or the webhook has not landed yet; poll briefly), then `paid`.
4545
+ * @enum {string}
4546
+ */
4547
+ status: "processing" | "paid";
4548
+ /** @description The tip, without the card fee. */
4549
+ amountCents: number;
4550
+ /** @description The card fee the tipper added on top of the tip; 0 when none. The charge was `amountCents` + `coverFeeCents`. */
4551
+ coverFeeCents: number;
4552
+ currency: string;
4553
+ /** @description Where the receipt goes, masked (`m•••@gmail.com`): the session id is in a URL that can be shared. `null` until paid, or when Stripe collected none. */
4554
+ receiptEmail: string | null;
4555
+ thankYouMessage: string | null;
4556
+ };
4451
4557
  TitleLocationSalary: {
4452
4558
  /** @enum {string} */
4453
4559
  object: "title_location_salary";
package/dist/bin.mjs CHANGED
@@ -126,7 +126,9 @@ var BOARD_PATHS = {
126
126
  /** The digital product catalogue. */
127
127
  products: "/products",
128
128
  /** A signed-in board user's purchased products. */
129
- mePurchases: "/me/purchases"
129
+ mePurchases: "/me/purchases",
130
+ /** The tip page: visitors tip the board through its tip jar. */
131
+ tip: "/tip"
130
132
  };
131
133
 
132
134
  // src/route-contract/roles.ts
@@ -166,7 +168,8 @@ var ROLE_PARAM_REGISTRY = {
166
168
  alertsManage: [],
167
169
  alertsConfirm: [],
168
170
  products: [],
169
- mePurchases: []
171
+ mePurchases: [],
172
+ tip: []
170
173
  };
171
174
  var ALL_ROLES = Object.keys(
172
175
  ROLE_PARAM_REGISTRY
@@ -210,7 +213,8 @@ var CANONICAL_MANIFEST = {
210
213
  alertsManage: "/alerts/manage",
211
214
  alertsConfirm: "/alerts/confirm",
212
215
  products: BOARD_PATHS.products,
213
- mePurchases: BOARD_PATHS.mePurchases
216
+ mePurchases: BOARD_PATHS.mePurchases,
217
+ tip: BOARD_PATHS.tip
214
218
  }
215
219
  };
216
220
 
@@ -251,7 +255,8 @@ var ROLE_INDEX_PATHS = {
251
255
  product: BOARD_PATHS.products,
252
256
  purchase: BOARD_PATHS.home,
253
257
  products: BOARD_PATHS.products,
254
- mePurchases: BOARD_PATHS.home
258
+ mePurchases: BOARD_PATHS.home,
259
+ tip: BOARD_PATHS.home
255
260
  };
256
261
  function splitSegments(path) {
257
262
  const withoutLeading = path.startsWith("/") ? path.slice(1) : path;
@@ -8769,7 +8774,9 @@ var MAY_BE_UNPUBLISHED = /* @__PURE__ */ new Set([
8769
8774
  "privacyPolicy",
8770
8775
  "termsOfService",
8771
8776
  "cookiePolicy",
8772
- "impressum"
8777
+ "impressum",
8778
+ // A board with no tip jar (or an archived one) has no tip page.
8779
+ "tip"
8773
8780
  ]);
8774
8781
  var GATE_SEGMENTS = /* @__PURE__ */ new Set([
8775
8782
  "password",
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B6YOcfhm.js';
1
+ import { S as Schemas } from './_spec-D1Qg_Twd.js';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B6YOcfhm.mjs';
1
+ import { S as Schemas } from './_spec-D1Qg_Twd.mjs';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-B6YOcfhm.js';
2
- import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-BwxCoTRJ.js';
1
+ import { S as Schemas } from './_spec-D1Qg_Twd.js';
2
+ import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-D04ngjCP.js';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-B6YOcfhm.mjs';
2
- import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-DrDmqiBb.mjs';
1
+ import { S as Schemas } from './_spec-D1Qg_Twd.mjs';
2
+ import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-CClqlUld.mjs';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-Bd7H1jwl.js';
2
- import { P as PublicJob } from './jobs-BwxCoTRJ.js';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BeNZLOYC.js';
2
+ import { P as PublicJob } from './jobs-D04ngjCP.js';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
@@ -1,5 +1,5 @@
1
- import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BwOeOQ6v.mjs';
2
- import { P as PublicJob } from './jobs-DrDmqiBb.mjs';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-Cc3wbTKI.mjs';
2
+ import { P as PublicJob } from './jobs-CClqlUld.mjs';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any