@cavuno/board 4.51.0 → 4.53.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 (44) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/dist/{_spec-Pr6ZvyW_.d.mts → _spec-B4TxcV4W.d.mts} +83 -0
  3. package/dist/{_spec-Pr6ZvyW_.d.ts → _spec-B4TxcV4W.d.ts} +83 -0
  4. package/dist/{blog-D-MQEaMU.d.mts → blog-BYuzCPFi.d.mts} +1 -1
  5. package/dist/{blog-BBBiKhsA.d.ts → blog-C1nsaLmM.d.ts} +1 -1
  6. package/dist/{board-C6PEXL7n.d.mts → board-BtipyMwh.d.ts} +8 -2
  7. package/dist/{board-CaZu8nEl.d.ts → board-j0KFqNBp.d.mts} +8 -2
  8. package/dist/{breadcrumbs-WcxTd2Ka.d.mts → breadcrumbs-BCEsjVMn.d.mts} +4 -3
  9. package/dist/{breadcrumbs-DIIA4MaX.d.ts → breadcrumbs-BKpfMLqi.d.ts} +4 -3
  10. package/dist/browser/cavuno-board.global.min.js +1 -1
  11. package/dist/{chunk-JTFUOGWE.mjs → chunk-P4DNSVGM.mjs} +1 -1
  12. package/dist/filters.d.mts +2 -2
  13. package/dist/filters.d.ts +2 -2
  14. package/dist/format.d.mts +4 -4
  15. package/dist/format.d.ts +4 -4
  16. package/dist/format.mjs +1 -1
  17. package/dist/index.d.mts +56 -12
  18. package/dist/index.d.ts +56 -12
  19. package/dist/index.js +52 -9
  20. package/dist/index.mjs +52 -9
  21. package/dist/{jobs-CeB5FVGG.d.mts → jobs-BMJHIKTi.d.ts} +18 -4
  22. package/dist/{jobs-DN0ePjTg.d.ts → jobs-DKo4rx45.d.mts} +18 -4
  23. package/dist/{search-Kgs7ubkH.d.mts → search-DJQkMA5T.d.mts} +1 -1
  24. package/dist/{search-CDl4MJV4.d.ts → search-DVSEJ5aj.d.ts} +1 -1
  25. package/dist/{seo-BhHH3OMM.d.ts → seo-CIOAZCuc.d.ts} +1 -1
  26. package/dist/{seo-CPX54V1D.d.mts → seo-D2oDCBT0.d.mts} +1 -1
  27. package/dist/seo-files.d.mts +2 -2
  28. package/dist/seo-files.d.ts +2 -2
  29. package/dist/seo.d.mts +6 -6
  30. package/dist/seo.d.ts +6 -6
  31. package/dist/seo.js +1 -1
  32. package/dist/seo.mjs +1 -1
  33. package/dist/server.d.mts +6 -6
  34. package/dist/server.d.ts +6 -6
  35. package/dist/sitemap.d.mts +6 -6
  36. package/dist/sitemap.d.ts +6 -6
  37. package/dist/suggest.d.mts +2 -2
  38. package/dist/suggest.d.ts +2 -2
  39. package/package.json +1 -1
  40. package/skills/cavuno-board-companies/SKILL.md +13 -0
  41. package/skills/cavuno-board-jobs/SKILL.md +15 -0
  42. package/skills/cavuno-board-paywall/SKILL.md +8 -2
  43. package/skills/cavuno-board-talent-access/SKILL.md +6 -2
  44. package/skills/manifest.json +1 -1
package/dist/index.js CHANGED
@@ -405,7 +405,7 @@ async function clearSession(storage) {
405
405
  }
406
406
 
407
407
  // src/version.ts
408
- var SDK_VERSION = "4.51.0";
408
+ var SDK_VERSION = "4.53.0";
409
409
 
410
410
  // src/client.ts
411
411
  function isRawBody(body) {
@@ -1373,7 +1373,10 @@ function jobsNamespace(client) {
1373
1373
  );
1374
1374
  },
1375
1375
  /**
1376
- * List published jobs.
1376
+ * List published jobs. A starter that renders opaque Sponsored Apply
1377
+ * passes `{ capabilities: ['apply-gateway-v1'] }` to include Sponsored
1378
+ * jobs; other callers do not see them. The opt-in travels in the URL, so
1379
+ * the response stays shared-cacheable.
1377
1380
  *
1378
1381
  * @example
1379
1382
  * const { data, nextCursor } = await board.jobs.list({ limit: 20 });
@@ -1411,7 +1414,9 @@ function jobsNamespace(client) {
1411
1414
  });
1412
1415
  },
1413
1416
  /**
1414
- * Free-text + faceted job search.
1417
+ * Free-text + faceted job search. Sponsored jobs are included only when
1418
+ * `options.headers` carries `x-cavuno-board-capabilities: apply-gateway-v1`
1419
+ * (a search is never cached, so the header form costs nothing).
1415
1420
  *
1416
1421
  * @example
1417
1422
  * const { data } = await board.jobs.search({
@@ -1431,6 +1436,8 @@ function jobsNamespace(client) {
1431
1436
  * List jobs similar to one job — the same ranking that powers the
1432
1437
  * on-page similar-jobs rail. Returns up to `limit` slim cards (default
1433
1438
  * 5), excluding the job itself and any role at the same company.
1439
+ * Sponsored jobs are included only with
1440
+ * `{ capabilities: ['apply-gateway-v1'] }`, as for `list`.
1434
1441
  *
1435
1442
  * @example
1436
1443
  * const { data } = await board.jobs.similar('senior-chef', { limit: 5 });
@@ -2095,11 +2102,20 @@ function meNamespace(client) {
2095
2102
  },
2096
2103
  /**
2097
2104
  * Poll a membership checkout session started for this company: `open`
2098
- * (re-mountable via `clientSecret`), `complete`, or `expired`. A session
2099
- * minted for another company is 404 `paywall_invalid_checkout_session`.
2105
+ * (re-mountable via `clientSecret`), `complete`, or `expired`. A
2106
+ * `complete` session carries `paymentStatus`: `processing` means a
2107
+ * delayed payment (bank debit or transfer) has not cleared, so the
2108
+ * membership starts only once it does, usually within a few business
2109
+ * days. Stop polling and tell the buyer; read the session again later
2110
+ * (for example on their next visit) to see whether it cleared or
2111
+ * failed. `failed` means the payment did
2112
+ * not go through: no membership was started, and the buyer can start a
2113
+ * new checkout. A session minted for another company is 404
2114
+ * `paywall_invalid_checkout_session`.
2100
2115
  *
2101
2116
  * @example
2102
2117
  * const s = await board.me.companies.retrieveMembershipCheckout('acme', kit.sessionId);
2118
+ * if (s.paymentStatus === 'processing') renderPaymentProcessing();
2103
2119
  */
2104
2120
  retrieveMembershipCheckout(slug, sessionId, options) {
2105
2121
  return client.fetch(
@@ -2210,10 +2226,14 @@ function meNamespace(client) {
2210
2226
  */
2211
2227
  jobs: {
2212
2228
  /**
2213
- * List a company's jobs (all statuses), newest first.
2229
+ * List a company's jobs (all statuses), newest first. Each job
2230
+ * carries `paymentProcessing`, `true` while the employer's bank debit
2231
+ * or transfer for it has not cleared: the job stays a `draft` until it
2232
+ * does, so label it "payment processing" rather than "draft".
2214
2233
  *
2215
2234
  * @example
2216
2235
  * const { data } = await board.me.companies.jobs.list('acme');
2236
+ * const label = data[0]?.paymentProcessing ? 'Payment processing' : data[0]?.status;
2217
2237
  */
2218
2238
  list(slug, query, options) {
2219
2239
  return client.fetch(
@@ -2223,9 +2243,15 @@ function meNamespace(client) {
2223
2243
  },
2224
2244
  /**
2225
2245
  * Retrieve one of my company's jobs (any status), fully enriched.
2246
+ * `paymentProcessing` is `true` while the employer's bank debit or
2247
+ * transfer for the job has not cleared: the job stays a `draft` until
2248
+ * it does (usually a few business days) and a new `checkout` is
2249
+ * refused meanwhile, so show "payment processing" rather than an
2250
+ * unpaid draft.
2226
2251
  *
2227
2252
  * @example
2228
2253
  * const job = await board.me.companies.jobs.retrieve('acme', jobId);
2254
+ * if (job.paymentProcessing) renderPaymentProcessing();
2229
2255
  */
2230
2256
  retrieve(slug, id, options) {
2231
2257
  return client.fetch(
@@ -2979,10 +3005,18 @@ function meNamespace(client) {
2979
3005
  /**
2980
3006
  * Poll a talent-access checkout session: `open` (re-mountable via
2981
3007
  * `clientSecret`), `complete`, or `expired`. The session must be
2982
- * `origin: talent_access` for this board user.
3008
+ * `origin: talent_access` for this board user. A `complete` session
3009
+ * carries `paymentStatus`: on `processing` a delayed payment (bank debit
3010
+ * or transfer) has not cleared, so access is not granted until it does.
3011
+ * Stop polling `retrieve()` and tell the buyer; read the session again
3012
+ * later (for example on their next visit) to see whether it cleared or
3013
+ * failed. On `failed` the payment
3014
+ * did not go through: nothing was granted, and the buyer can start a
3015
+ * new checkout.
2983
3016
  *
2984
3017
  * @example
2985
3018
  * const s = await board.me.talentAccess.retrieveCheckout(kit.sessionId);
3019
+ * if (s.paymentStatus === 'processing') renderPaymentProcessing();
2986
3020
  */
2987
3021
  retrieveCheckout(sessionId, options) {
2988
3022
  return client.fetch(
@@ -3581,11 +3615,20 @@ function meNamespace(client) {
3581
3615
  },
3582
3616
  /**
3583
3617
  * Poll a checkout session's state: `open` (re-mountable via
3584
- * `clientSecret`), `complete`, or `expired`. On `complete`, re-read
3585
- * `grant()` to confirm entitlement.
3618
+ * `clientSecret`), `complete`, or `expired`. On `complete` with
3619
+ * `paymentStatus: 'paid'`, re-read `grant()` to confirm entitlement. On
3620
+ * `paymentStatus: 'processing'` a delayed payment (bank debit or
3621
+ * transfer) has not cleared, so `grant()` stays `hasAccess: false` until
3622
+ * it does, usually within a few business days. Stop polling and tell
3623
+ * the buyer their payment is processing; read the session again later
3624
+ * (for example on their next visit) to see whether it cleared or
3625
+ * failed. On `paymentStatus: 'failed'`
3626
+ * the payment did not go through: nothing was granted, and the buyer
3627
+ * can start a new checkout.
3586
3628
  *
3587
3629
  * @example
3588
3630
  * const s = await board.me.access.retrieveCheckout(kit.sessionId);
3631
+ * if (s.paymentStatus === 'processing') renderPaymentProcessing();
3589
3632
  */
3590
3633
  retrieveCheckout(sessionId, options) {
3591
3634
  return client.fetch(
package/dist/index.mjs CHANGED
@@ -46,7 +46,7 @@ function toSearchParams(query) {
46
46
  }
47
47
 
48
48
  // src/version.ts
49
- var SDK_VERSION = "4.51.0";
49
+ var SDK_VERSION = "4.53.0";
50
50
 
51
51
  // src/client.ts
52
52
  function isRawBody(body) {
@@ -1014,7 +1014,10 @@ function jobsNamespace(client) {
1014
1014
  );
1015
1015
  },
1016
1016
  /**
1017
- * List published jobs.
1017
+ * List published jobs. A starter that renders opaque Sponsored Apply
1018
+ * passes `{ capabilities: ['apply-gateway-v1'] }` to include Sponsored
1019
+ * jobs; other callers do not see them. The opt-in travels in the URL, so
1020
+ * the response stays shared-cacheable.
1018
1021
  *
1019
1022
  * @example
1020
1023
  * const { data, nextCursor } = await board.jobs.list({ limit: 20 });
@@ -1052,7 +1055,9 @@ function jobsNamespace(client) {
1052
1055
  });
1053
1056
  },
1054
1057
  /**
1055
- * Free-text + faceted job search.
1058
+ * Free-text + faceted job search. Sponsored jobs are included only when
1059
+ * `options.headers` carries `x-cavuno-board-capabilities: apply-gateway-v1`
1060
+ * (a search is never cached, so the header form costs nothing).
1056
1061
  *
1057
1062
  * @example
1058
1063
  * const { data } = await board.jobs.search({
@@ -1072,6 +1077,8 @@ function jobsNamespace(client) {
1072
1077
  * List jobs similar to one job — the same ranking that powers the
1073
1078
  * on-page similar-jobs rail. Returns up to `limit` slim cards (default
1074
1079
  * 5), excluding the job itself and any role at the same company.
1080
+ * Sponsored jobs are included only with
1081
+ * `{ capabilities: ['apply-gateway-v1'] }`, as for `list`.
1075
1082
  *
1076
1083
  * @example
1077
1084
  * const { data } = await board.jobs.similar('senior-chef', { limit: 5 });
@@ -1736,11 +1743,20 @@ function meNamespace(client) {
1736
1743
  },
1737
1744
  /**
1738
1745
  * Poll a membership checkout session started for this company: `open`
1739
- * (re-mountable via `clientSecret`), `complete`, or `expired`. A session
1740
- * minted for another company is 404 `paywall_invalid_checkout_session`.
1746
+ * (re-mountable via `clientSecret`), `complete`, or `expired`. A
1747
+ * `complete` session carries `paymentStatus`: `processing` means a
1748
+ * delayed payment (bank debit or transfer) has not cleared, so the
1749
+ * membership starts only once it does, usually within a few business
1750
+ * days. Stop polling and tell the buyer; read the session again later
1751
+ * (for example on their next visit) to see whether it cleared or
1752
+ * failed. `failed` means the payment did
1753
+ * not go through: no membership was started, and the buyer can start a
1754
+ * new checkout. A session minted for another company is 404
1755
+ * `paywall_invalid_checkout_session`.
1741
1756
  *
1742
1757
  * @example
1743
1758
  * const s = await board.me.companies.retrieveMembershipCheckout('acme', kit.sessionId);
1759
+ * if (s.paymentStatus === 'processing') renderPaymentProcessing();
1744
1760
  */
1745
1761
  retrieveMembershipCheckout(slug, sessionId, options) {
1746
1762
  return client.fetch(
@@ -1851,10 +1867,14 @@ function meNamespace(client) {
1851
1867
  */
1852
1868
  jobs: {
1853
1869
  /**
1854
- * List a company's jobs (all statuses), newest first.
1870
+ * List a company's jobs (all statuses), newest first. Each job
1871
+ * carries `paymentProcessing`, `true` while the employer's bank debit
1872
+ * or transfer for it has not cleared: the job stays a `draft` until it
1873
+ * does, so label it "payment processing" rather than "draft".
1855
1874
  *
1856
1875
  * @example
1857
1876
  * const { data } = await board.me.companies.jobs.list('acme');
1877
+ * const label = data[0]?.paymentProcessing ? 'Payment processing' : data[0]?.status;
1858
1878
  */
1859
1879
  list(slug, query, options) {
1860
1880
  return client.fetch(
@@ -1864,9 +1884,15 @@ function meNamespace(client) {
1864
1884
  },
1865
1885
  /**
1866
1886
  * Retrieve one of my company's jobs (any status), fully enriched.
1887
+ * `paymentProcessing` is `true` while the employer's bank debit or
1888
+ * transfer for the job has not cleared: the job stays a `draft` until
1889
+ * it does (usually a few business days) and a new `checkout` is
1890
+ * refused meanwhile, so show "payment processing" rather than an
1891
+ * unpaid draft.
1867
1892
  *
1868
1893
  * @example
1869
1894
  * const job = await board.me.companies.jobs.retrieve('acme', jobId);
1895
+ * if (job.paymentProcessing) renderPaymentProcessing();
1870
1896
  */
1871
1897
  retrieve(slug, id, options) {
1872
1898
  return client.fetch(
@@ -2620,10 +2646,18 @@ function meNamespace(client) {
2620
2646
  /**
2621
2647
  * Poll a talent-access checkout session: `open` (re-mountable via
2622
2648
  * `clientSecret`), `complete`, or `expired`. The session must be
2623
- * `origin: talent_access` for this board user.
2649
+ * `origin: talent_access` for this board user. A `complete` session
2650
+ * carries `paymentStatus`: on `processing` a delayed payment (bank debit
2651
+ * or transfer) has not cleared, so access is not granted until it does.
2652
+ * Stop polling `retrieve()` and tell the buyer; read the session again
2653
+ * later (for example on their next visit) to see whether it cleared or
2654
+ * failed. On `failed` the payment
2655
+ * did not go through: nothing was granted, and the buyer can start a
2656
+ * new checkout.
2624
2657
  *
2625
2658
  * @example
2626
2659
  * const s = await board.me.talentAccess.retrieveCheckout(kit.sessionId);
2660
+ * if (s.paymentStatus === 'processing') renderPaymentProcessing();
2627
2661
  */
2628
2662
  retrieveCheckout(sessionId, options) {
2629
2663
  return client.fetch(
@@ -3222,11 +3256,20 @@ function meNamespace(client) {
3222
3256
  },
3223
3257
  /**
3224
3258
  * Poll a checkout session's state: `open` (re-mountable via
3225
- * `clientSecret`), `complete`, or `expired`. On `complete`, re-read
3226
- * `grant()` to confirm entitlement.
3259
+ * `clientSecret`), `complete`, or `expired`. On `complete` with
3260
+ * `paymentStatus: 'paid'`, re-read `grant()` to confirm entitlement. On
3261
+ * `paymentStatus: 'processing'` a delayed payment (bank debit or
3262
+ * transfer) has not cleared, so `grant()` stays `hasAccess: false` until
3263
+ * it does, usually within a few business days. Stop polling and tell
3264
+ * the buyer their payment is processing; read the session again later
3265
+ * (for example on their next visit) to see whether it cleared or
3266
+ * failed. On `paymentStatus: 'failed'`
3267
+ * the payment did not go through: nothing was granted, and the buyer
3268
+ * can start a new checkout.
3227
3269
  *
3228
3270
  * @example
3229
3271
  * const s = await board.me.access.retrieveCheckout(kit.sessionId);
3272
+ * if (s.paymentStatus === 'processing') renderPaymentProcessing();
3230
3273
  */
3231
3274
  retrieveCheckout(sessionId, options) {
3232
3275
  return client.fetch(
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Pr6ZvyW_.mjs';
1
+ import { S as Schemas } from './_spec-B4TxcV4W.js';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -132,10 +132,18 @@ type JobsListQuery = {
132
132
  skill?: string;
133
133
  /** Sparse fieldset (Medusa-style `+field`). Only `'+description'` is supported — adds `description` to each card. */
134
134
  fields?: string;
135
+ /**
136
+ * Capability opt-ins, sent as the `capabilities` query parameter.
137
+ * `apply-gateway-v1` includes Sponsored jobs, which are left out without
138
+ * it; counts and pagination cover only the jobs returned.
139
+ */
140
+ capabilities?: JobCapability[];
135
141
  };
136
142
  /**
137
- * An opt-in capability token for `jobs.retrieve`. `apply-gateway-v1` selects
138
- * the country-gated Apply shape (opaque Sponsored Apply).
143
+ * An opt-in capability token. `apply-gateway-v1` declares that the caller
144
+ * renders opaque Sponsored Apply: `jobs.retrieve` returns the country-gated
145
+ * Apply shape, and the job lists include Sponsored jobs. Without it a
146
+ * Sponsored job is left out of the lists and `jobs.retrieve` returns 404.
139
147
  */
140
148
  type JobCapability = 'apply-gateway-v1';
141
149
  type JobRetrieveQuery = {
@@ -150,6 +158,12 @@ type JobRetrieveQuery = {
150
158
  type JobsSimilarQuery = {
151
159
  /** How many similar jobs to return (1–20; default 5). */
152
160
  limit?: number;
161
+ /**
162
+ * Capability opt-ins, sent as the `capabilities` query parameter.
163
+ * `apply-gateway-v1` includes Sponsored jobs, which are left out without
164
+ * it; counts and pagination cover only the jobs returned.
165
+ */
166
+ capabilities?: JobCapability[];
153
167
  };
154
168
  type CustomFilterValue = string | number | boolean;
155
169
  type CustomFieldFilter = {
@@ -169,4 +183,4 @@ type ObjectReferenceFilter = {
169
183
  */
170
184
  type JobsSearchBody = Schemas['PublicSearchJobsBody'];
171
185
 
172
- export type { CustomFieldValues as C, EmploymentType as E, JobSort as J, ListEnvelope as L, ObjectReferenceFilter as O, PublicJob as P, RemoteOption as R, Seniority as S, CustomFieldFilter as a, JobCollectionChoiceQuery as b, JobsListQuery as c, JobCardListEnvelope as d, JobRetrieveQuery as e, JobsSearchBody as f, JobCardSearchEnvelope as g, JobsSimilarQuery as h, SearchEnvelope as i, CustomFieldValue as j, CustomFilterValue as k, EducationRequirement as l, JobCapability as m, JobCatalogPagination as n, JobCollectionChoiceList as o, JobCollectionFieldDefinition as p, JobCompany as q, JobCustomEmploymentType as r, OfficeLocation as s, OffsetPagination as t, PublicJobCard as u, RelatedSearch as v, RemotePermit as w, RemoteTimezone as x, ResolvedJobCollectionField as y, StorefrontPagination as z };
186
+ export type { CustomFieldValues as C, EmploymentType as E, JobSort as J, ListEnvelope as L, ObjectReferenceFilter as O, PublicJob as P, RemoteOption as R, Seniority as S, JobCapability as a, CustomFieldFilter as b, JobCollectionChoiceQuery as c, JobsListQuery as d, JobCardListEnvelope as e, JobRetrieveQuery as f, JobsSearchBody as g, JobCardSearchEnvelope as h, JobsSimilarQuery as i, SearchEnvelope as j, CustomFieldValue as k, CustomFilterValue as l, EducationRequirement as m, JobCatalogPagination as n, JobCollectionChoiceList as o, JobCollectionFieldDefinition as p, JobCompany as q, JobCustomEmploymentType as r, OfficeLocation as s, OffsetPagination as t, PublicJobCard as u, RelatedSearch as v, RemotePermit as w, RemoteTimezone as x, ResolvedJobCollectionField as y, StorefrontPagination as z };
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Pr6ZvyW_.js';
1
+ import { S as Schemas } from './_spec-B4TxcV4W.mjs';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -132,10 +132,18 @@ type JobsListQuery = {
132
132
  skill?: string;
133
133
  /** Sparse fieldset (Medusa-style `+field`). Only `'+description'` is supported — adds `description` to each card. */
134
134
  fields?: string;
135
+ /**
136
+ * Capability opt-ins, sent as the `capabilities` query parameter.
137
+ * `apply-gateway-v1` includes Sponsored jobs, which are left out without
138
+ * it; counts and pagination cover only the jobs returned.
139
+ */
140
+ capabilities?: JobCapability[];
135
141
  };
136
142
  /**
137
- * An opt-in capability token for `jobs.retrieve`. `apply-gateway-v1` selects
138
- * the country-gated Apply shape (opaque Sponsored Apply).
143
+ * An opt-in capability token. `apply-gateway-v1` declares that the caller
144
+ * renders opaque Sponsored Apply: `jobs.retrieve` returns the country-gated
145
+ * Apply shape, and the job lists include Sponsored jobs. Without it a
146
+ * Sponsored job is left out of the lists and `jobs.retrieve` returns 404.
139
147
  */
140
148
  type JobCapability = 'apply-gateway-v1';
141
149
  type JobRetrieveQuery = {
@@ -150,6 +158,12 @@ type JobRetrieveQuery = {
150
158
  type JobsSimilarQuery = {
151
159
  /** How many similar jobs to return (1–20; default 5). */
152
160
  limit?: number;
161
+ /**
162
+ * Capability opt-ins, sent as the `capabilities` query parameter.
163
+ * `apply-gateway-v1` includes Sponsored jobs, which are left out without
164
+ * it; counts and pagination cover only the jobs returned.
165
+ */
166
+ capabilities?: JobCapability[];
153
167
  };
154
168
  type CustomFilterValue = string | number | boolean;
155
169
  type CustomFieldFilter = {
@@ -169,4 +183,4 @@ type ObjectReferenceFilter = {
169
183
  */
170
184
  type JobsSearchBody = Schemas['PublicSearchJobsBody'];
171
185
 
172
- export type { CustomFieldValues as C, EmploymentType as E, JobSort as J, ListEnvelope as L, ObjectReferenceFilter as O, PublicJob as P, RemoteOption as R, Seniority as S, CustomFieldFilter as a, JobCollectionChoiceQuery as b, JobsListQuery as c, JobCardListEnvelope as d, JobRetrieveQuery as e, JobsSearchBody as f, JobCardSearchEnvelope as g, JobsSimilarQuery as h, SearchEnvelope as i, CustomFieldValue as j, CustomFilterValue as k, EducationRequirement as l, JobCapability as m, JobCatalogPagination as n, JobCollectionChoiceList as o, JobCollectionFieldDefinition as p, JobCompany as q, JobCustomEmploymentType as r, OfficeLocation as s, OffsetPagination as t, PublicJobCard as u, RelatedSearch as v, RemotePermit as w, RemoteTimezone as x, ResolvedJobCollectionField as y, StorefrontPagination as z };
186
+ export type { CustomFieldValues as C, EmploymentType as E, JobSort as J, ListEnvelope as L, ObjectReferenceFilter as O, PublicJob as P, RemoteOption as R, Seniority as S, JobCapability as a, CustomFieldFilter as b, JobCollectionChoiceQuery as c, JobsListQuery as d, JobCardListEnvelope as e, JobRetrieveQuery as f, JobsSearchBody as g, JobCardSearchEnvelope as h, JobsSimilarQuery as i, SearchEnvelope as j, CustomFieldValue as k, CustomFilterValue as l, EducationRequirement as m, JobCatalogPagination as n, JobCollectionChoiceList as o, JobCollectionFieldDefinition as p, JobCompany as q, JobCustomEmploymentType as r, OfficeLocation as s, OffsetPagination as t, PublicJobCard as u, RelatedSearch as v, RemotePermit as w, RemoteTimezone as x, ResolvedJobCollectionField as y, StorefrontPagination as z };
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Pr6ZvyW_.mjs';
1
+ import { S as Schemas } from './_spec-B4TxcV4W.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Pr6ZvyW_.js';
1
+ import { S as Schemas } from './_spec-B4TxcV4W.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Pr6ZvyW_.js';
1
+ import { S as Schemas } from './_spec-B4TxcV4W.js';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Pr6ZvyW_.mjs';
1
+ import { S as Schemas } from './_spec-B4TxcV4W.mjs';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-CPX54V1D.mjs';
2
- import './_spec-Pr6ZvyW_.mjs';
1
+ import { B as BoardSeo } from './seo-D2oDCBT0.mjs';
2
+ import './_spec-B4TxcV4W.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-BhHH3OMM.js';
2
- import './_spec-Pr6ZvyW_.js';
1
+ import { B as BoardSeo } from './seo-CIOAZCuc.js';
2
+ import './_spec-B4TxcV4W.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
package/dist/seo.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-D-MQEaMU.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-WcxTd2Ka.mjs';
3
- export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-WcxTd2Ka.mjs';
4
- import './_spec-Pr6ZvyW_.mjs';
5
- import './board-C6PEXL7n.mjs';
6
- import './jobs-CeB5FVGG.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BYuzCPFi.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-BCEsjVMn.mjs';
3
+ export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-BCEsjVMn.mjs';
4
+ import './_spec-B4TxcV4W.mjs';
5
+ import './board-j0KFqNBp.mjs';
6
+ import './jobs-DKo4rx45.mjs';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/seo.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BBBiKhsA.js';
2
- import { e as JsonLdObject } from './breadcrumbs-DIIA4MaX.js';
3
- export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-DIIA4MaX.js';
4
- import './_spec-Pr6ZvyW_.js';
5
- import './board-CaZu8nEl.js';
6
- import './jobs-DN0ePjTg.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-C1nsaLmM.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-BKpfMLqi.js';
3
+ export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-BKpfMLqi.js';
4
+ import './_spec-B4TxcV4W.js';
5
+ import './board-BtipyMwh.js';
6
+ import './jobs-BMJHIKTi.js';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/seo.js CHANGED
@@ -221,7 +221,7 @@ function createBreadcrumbJsonLd(items, options = {}) {
221
221
  name,
222
222
  href: item.href?.trim() ?? null
223
223
  } : null;
224
- }).filter((item) => !!item);
224
+ }).filter((item) => !!item).filter((item, index, all) => !!item.href || index === all.length - 1);
225
225
  if (normalizedItems.length < 2) {
226
226
  return null;
227
227
  }
package/dist/seo.mjs CHANGED
@@ -17,7 +17,7 @@ import {
17
17
  skillSalaryJsonLd,
18
18
  sortBySeniority,
19
19
  titleSalaryJsonLd
20
- } from "./chunk-JTFUOGWE.mjs";
20
+ } from "./chunk-P4DNSVGM.mjs";
21
21
  import {
22
22
  boardUrl,
23
23
  jobDetailPath
package/dist/server.d.mts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-Pr6ZvyW_.mjs';
3
- import './search-Kgs7ubkH.mjs';
4
- import './jobs-CeB5FVGG.mjs';
5
- import './board-C6PEXL7n.mjs';
6
- import './seo-CPX54V1D.mjs';
7
- import './blog-D-MQEaMU.mjs';
2
+ import './_spec-B4TxcV4W.mjs';
3
+ import './search-DJQkMA5T.mjs';
4
+ import './jobs-DKo4rx45.mjs';
5
+ import './board-j0KFqNBp.mjs';
6
+ import './seo-D2oDCBT0.mjs';
7
+ import './blog-BYuzCPFi.mjs';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-Pr6ZvyW_.js';
3
- import './search-CDl4MJV4.js';
4
- import './jobs-DN0ePjTg.js';
5
- import './board-CaZu8nEl.js';
6
- import './seo-BhHH3OMM.js';
7
- import './blog-BBBiKhsA.js';
2
+ import './_spec-B4TxcV4W.js';
3
+ import './search-DVSEJ5aj.js';
4
+ import './jobs-BMJHIKTi.js';
5
+ import './board-BtipyMwh.js';
6
+ import './seo-CIOAZCuc.js';
7
+ import './blog-C1nsaLmM.js';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-Pr6ZvyW_.mjs';
3
- import './search-Kgs7ubkH.mjs';
4
- import './jobs-CeB5FVGG.mjs';
5
- import './board-C6PEXL7n.mjs';
6
- import './seo-CPX54V1D.mjs';
7
- import './blog-D-MQEaMU.mjs';
2
+ import './_spec-B4TxcV4W.mjs';
3
+ import './search-DJQkMA5T.mjs';
4
+ import './jobs-DKo4rx45.mjs';
5
+ import './board-j0KFqNBp.mjs';
6
+ import './seo-D2oDCBT0.mjs';
7
+ import './blog-BYuzCPFi.mjs';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-Pr6ZvyW_.js';
3
- import './search-CDl4MJV4.js';
4
- import './jobs-DN0ePjTg.js';
5
- import './board-CaZu8nEl.js';
6
- import './seo-BhHH3OMM.js';
7
- import './blog-BBBiKhsA.js';
2
+ import './_spec-B4TxcV4W.js';
3
+ import './search-DVSEJ5aj.js';
4
+ import './jobs-BMJHIKTi.js';
5
+ import './board-BtipyMwh.js';
6
+ import './seo-CIOAZCuc.js';
7
+ import './blog-C1nsaLmM.js';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-Kgs7ubkH.mjs';
2
- import './_spec-Pr6ZvyW_.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-DJQkMA5T.mjs';
2
+ import './_spec-B4TxcV4W.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
package/dist/suggest.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-CDl4MJV4.js';
2
- import './_spec-Pr6ZvyW_.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-DVSEJ5aj.js';
2
+ import './_spec-B4TxcV4W.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavuno/board",
3
- "version": "4.51.0",
3
+ "version": "4.53.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -25,6 +25,12 @@ An approved member can buy a public, priced membership plan for the company
25
25
  with `board.me.companies.startMembershipCheckout(slug, body)`. It returns the
26
26
  same embedded-checkout mount kit as talent access; poll
27
27
  `retrieveMembershipCheckout(slug, sessionId)` after the return redirect. A
28
+ `complete` session with `paymentStatus: 'processing'` was paid by bank debit
29
+ or transfer that has not cleared; the membership starts only once it does, so
30
+ show a payment-processing state rather than waiting for it, and read the
31
+ checkout again on the next visit to see whether it cleared or failed. With
32
+ `paymentStatus: 'failed'` the bank payment did not go through: no membership
33
+ was started, and the buyer can start a new checkout. A
28
34
  company that already holds a membership is `membership_seat_taken`.
29
35
 
30
36
  ```ts snippet
@@ -65,6 +71,13 @@ const draft = await board.me.companies.jobs.create('acme', {
65
71
  await board.me.companies.jobs.update('acme', draft.id, { salaryMax: 200000 });
66
72
  ```
67
73
 
74
+ `board.me.companies.jobs.retrieve(slug, id)` and every job from
75
+ `board.me.companies.jobs.list(slug)` carry `paymentProcessing: true` while the
76
+ employer's bank debit or transfer for the job has not cleared. The job stays a
77
+ `draft` until it does and `checkout` for it is refused meanwhile, so show a
78
+ payment-processing state rather than an unpaid draft: in the job list, label it
79
+ "Payment processing" instead of "Draft".
80
+
68
81
  ## Render the company profile form
69
82
 
70
83
  `board.context().forms.company` is the company profile form as one ordered list, set by the operator. Use it for `board.me.companies.create` and `update`: render in order, skip entries with `visible: false`, and validate `required` in the form before saving.
@@ -118,6 +118,21 @@ const gated = await board.jobs.retrieve('senior-chef', {
118
118
  gated.applyAction; // 'gateway_external' | 'gateway_native' | …
119
119
  ```
120
120
 
121
+ Sponsored jobs (`isSponsored: true`) are being restricted to callers that
122
+ send the capability. Without it, `jobs.list`, `jobs.similar`, `companies.listJobs`
123
+ and `embed.jobs` leave them out (counts and pagination included), and
124
+ `jobs.retrieve` returns 404 for one. A starter that renders the gateway
125
+ passes the same option (not the header: a shared cache keys by URL) on
126
+ every list read; `jobs.search` and
127
+ `me.recommendedJobs.list` take the header in `options.headers`.
128
+
129
+ ```ts snippet
130
+ const page = await board.jobs.list({
131
+ limit: 20,
132
+ capabilities: ['apply-gateway-v1'],
133
+ });
134
+ ```
135
+
121
136
  ## Surface candidate gating
122
137
 
123
138
  On a gated board, `gatedCount` reports results withheld from the current