@cavuno/board 4.53.0 → 4.55.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 (42) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/{_spec-B4TxcV4W.d.mts → _spec-QzRtIJNE.d.mts} +75 -10
  3. package/dist/{_spec-B4TxcV4W.d.ts → _spec-QzRtIJNE.d.ts} +75 -10
  4. package/dist/{blog-BYuzCPFi.d.mts → blog-D32ONCap.d.mts} +1 -1
  5. package/dist/{blog-C1nsaLmM.d.ts → blog-DBYumoqv.d.ts} +1 -1
  6. package/dist/{board-BtipyMwh.d.ts → board-BXRsEJR8.d.ts} +6 -3
  7. package/dist/{board-j0KFqNBp.d.mts → board-Dc9RJzZs.d.mts} +6 -3
  8. package/dist/{breadcrumbs-BCEsjVMn.d.mts → breadcrumbs-CsG5emA0.d.mts} +2 -2
  9. package/dist/{breadcrumbs-BKpfMLqi.d.ts → breadcrumbs-DuT2G4a5.d.ts} +2 -2
  10. package/dist/browser/cavuno-board.global.min.js +1 -1
  11. package/dist/filters.d.mts +2 -2
  12. package/dist/filters.d.ts +2 -2
  13. package/dist/filters.js +2 -1
  14. package/dist/filters.mjs +2 -1
  15. package/dist/format.d.mts +4 -4
  16. package/dist/format.d.ts +4 -4
  17. package/dist/index.d.mts +74 -15
  18. package/dist/index.d.ts +74 -15
  19. package/dist/index.js +19 -2
  20. package/dist/index.mjs +19 -2
  21. package/dist/{jobs-BMJHIKTi.d.ts → jobs-BSc8fWRd.d.ts} +7 -1
  22. package/dist/{jobs-DKo4rx45.d.mts → jobs-Cu5SX_Yp.d.mts} +7 -1
  23. package/dist/{search-DVSEJ5aj.d.ts → search-Cc0D9AIG.d.ts} +1 -1
  24. package/dist/{search-DJQkMA5T.d.mts → search-D5GiEIK5.d.mts} +1 -1
  25. package/dist/{seo-CIOAZCuc.d.ts → seo-C0NRwuve.d.ts} +1 -1
  26. package/dist/{seo-D2oDCBT0.d.mts → seo-WA9kv-W8.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 +10 -6
  30. package/dist/seo.d.ts +10 -6
  31. package/dist/seo.js +1 -4
  32. package/dist/seo.mjs +1 -4
  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-filters/SKILL.md +4 -2
  41. package/skills/cavuno-board-talent-access/SKILL.md +4 -0
  42. 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.53.0";
408
+ var SDK_VERSION = "4.55.0";
409
409
 
410
410
  // src/client.ts
411
411
  function isRawBody(body) {
@@ -3204,6 +3204,7 @@ function meNamespace(client) {
3204
3204
  const form = new FormData();
3205
3205
  form.append("resume", file);
3206
3206
  if (opts?.keepResumeOnFile) form.append("keepResumeOnFile", "true");
3207
+ if (opts?.shareWithEmployers) form.append("shareWithEmployers", "true");
3207
3208
  if (opts?.importMode) form.append("importMode", opts.importMode);
3208
3209
  if (opts?.confirmReplaceAll) form.append("confirmReplaceAll", "true");
3209
3210
  return client.fetch("/me/resume", {
@@ -3222,6 +3223,20 @@ function meNamespace(client) {
3222
3223
  retrieve(options) {
3223
3224
  return client.fetch("/me/resume", options);
3224
3225
  },
3226
+ /**
3227
+ * Set whether signed-in approved employers may receive `resumeUrl` on
3228
+ * `talent.retrieve`. Does not upload or delete the file.
3229
+ *
3230
+ * @example
3231
+ * await board.me.resume.update({ shareWithEmployers: true });
3232
+ */
3233
+ update(body, options) {
3234
+ return client.fetch("/me/resume", {
3235
+ ...options,
3236
+ method: "PATCH",
3237
+ body
3238
+ });
3239
+ },
3225
3240
  /**
3226
3241
  * Delete my stored resume file + withdraw keep-on-file consent (parsed
3227
3242
  * profile fields stay). Resolves void (204).
@@ -3960,7 +3975,9 @@ function talentNamespace(client) {
3960
3975
  /**
3961
3976
  * Retrieve a candidate's public profile by handle (or board-user id). Only
3962
3977
  * `public` profiles resolve; a non-public or unknown handle throws
3963
- * `talent_not_found` (404).
3978
+ * `talent_not_found` (404). `resumeUrl` is an expiring signed download
3979
+ * for a signed-in approved employer when the candidate opted in to share
3980
+ * their stored resume; `null` otherwise. Directory cards never include it.
3964
3981
  *
3965
3982
  * @example
3966
3983
  * const profile = await board.talent.retrieve('jane-doe');
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.53.0";
49
+ var SDK_VERSION = "4.55.0";
50
50
 
51
51
  // src/client.ts
52
52
  function isRawBody(body) {
@@ -2845,6 +2845,7 @@ function meNamespace(client) {
2845
2845
  const form = new FormData();
2846
2846
  form.append("resume", file);
2847
2847
  if (opts?.keepResumeOnFile) form.append("keepResumeOnFile", "true");
2848
+ if (opts?.shareWithEmployers) form.append("shareWithEmployers", "true");
2848
2849
  if (opts?.importMode) form.append("importMode", opts.importMode);
2849
2850
  if (opts?.confirmReplaceAll) form.append("confirmReplaceAll", "true");
2850
2851
  return client.fetch("/me/resume", {
@@ -2863,6 +2864,20 @@ function meNamespace(client) {
2863
2864
  retrieve(options) {
2864
2865
  return client.fetch("/me/resume", options);
2865
2866
  },
2867
+ /**
2868
+ * Set whether signed-in approved employers may receive `resumeUrl` on
2869
+ * `talent.retrieve`. Does not upload or delete the file.
2870
+ *
2871
+ * @example
2872
+ * await board.me.resume.update({ shareWithEmployers: true });
2873
+ */
2874
+ update(body, options) {
2875
+ return client.fetch("/me/resume", {
2876
+ ...options,
2877
+ method: "PATCH",
2878
+ body
2879
+ });
2880
+ },
2866
2881
  /**
2867
2882
  * Delete my stored resume file + withdraw keep-on-file consent (parsed
2868
2883
  * profile fields stay). Resolves void (204).
@@ -3601,7 +3616,9 @@ function talentNamespace(client) {
3601
3616
  /**
3602
3617
  * Retrieve a candidate's public profile by handle (or board-user id). Only
3603
3618
  * `public` profiles resolve; a non-public or unknown handle throws
3604
- * `talent_not_found` (404).
3619
+ * `talent_not_found` (404). `resumeUrl` is an expiring signed download
3620
+ * for a signed-in approved employer when the candidate opted in to share
3621
+ * their stored resume; `null` otherwise. Directory cards never include it.
3605
3622
  *
3606
3623
  * @example
3607
3624
  * const profile = await board.talent.retrieve('jane-doe');
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B4TxcV4W.js';
1
+ import { S as Schemas } from './_spec-QzRtIJNE.js';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -70,8 +70,14 @@ type RemoteTimezone = PublicJob['remoteTimezones'][number];
70
70
  */
71
71
  interface RelatedSearch {
72
72
  type: 'category' | 'skill' | 'market';
73
+ /** English source slug; filters and taxonomy lookups accept it. */
73
74
  slug: string;
75
+ /** The term's page slug in the board language; equals `slug` when untranslated. */
76
+ canonicalSlug: string;
77
+ /** English source label. */
74
78
  term: string;
79
+ /** The label in the board language; equals `term` when untranslated. */
80
+ displayName: string;
75
81
  count: number;
76
82
  }
77
83
  /** The browse list envelope — `PublicJobCard`s + job catalog pagination + `relatedSearches`. */
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B4TxcV4W.mjs';
1
+ import { S as Schemas } from './_spec-QzRtIJNE.mjs';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -70,8 +70,14 @@ type RemoteTimezone = PublicJob['remoteTimezones'][number];
70
70
  */
71
71
  interface RelatedSearch {
72
72
  type: 'category' | 'skill' | 'market';
73
+ /** English source slug; filters and taxonomy lookups accept it. */
73
74
  slug: string;
75
+ /** The term's page slug in the board language; equals `slug` when untranslated. */
76
+ canonicalSlug: string;
77
+ /** English source label. */
74
78
  term: string;
79
+ /** The label in the board language; equals `term` when untranslated. */
80
+ displayName: string;
75
81
  count: number;
76
82
  }
77
83
  /** The browse list envelope — `PublicJobCard`s + job catalog pagination + `relatedSearches`. */
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B4TxcV4W.js';
1
+ import { S as Schemas } from './_spec-QzRtIJNE.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B4TxcV4W.mjs';
1
+ import { S as Schemas } from './_spec-QzRtIJNE.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B4TxcV4W.js';
1
+ import { S as Schemas } from './_spec-QzRtIJNE.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-B4TxcV4W.mjs';
1
+ import { S as Schemas } from './_spec-QzRtIJNE.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-D2oDCBT0.mjs';
2
- import './_spec-B4TxcV4W.mjs';
1
+ import { B as BoardSeo } from './seo-WA9kv-W8.mjs';
2
+ import './_spec-QzRtIJNE.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-CIOAZCuc.js';
2
- import './_spec-B4TxcV4W.js';
1
+ import { B as BoardSeo } from './seo-C0NRwuve.js';
2
+ import './_spec-QzRtIJNE.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-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';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-D32ONCap.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-CsG5emA0.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-CsG5emA0.mjs';
4
+ import './_spec-QzRtIJNE.mjs';
5
+ import './board-Dc9RJzZs.mjs';
6
+ import './jobs-Cu5SX_Yp.mjs';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
@@ -112,6 +112,10 @@ interface JobLink {
112
112
  company: {
113
113
  slug: string;
114
114
  } | null;
115
+ /** The job's public URL (`links.public` on a job card), in the board's URL language. */
116
+ links?: {
117
+ public?: string | null;
118
+ } | null;
115
119
  }
116
120
  /**
117
121
  * `BreadcrumbList` (+ `ItemList` of the visible jobs) JSON-LD for a listing
package/dist/seo.d.ts CHANGED
@@ -1,9 +1,9 @@
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';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-DBYumoqv.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-DuT2G4a5.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-DuT2G4a5.js';
4
+ import './_spec-QzRtIJNE.js';
5
+ import './board-BXRsEJR8.js';
6
+ import './jobs-BSc8fWRd.js';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
@@ -112,6 +112,10 @@ interface JobLink {
112
112
  company: {
113
113
  slug: string;
114
114
  } | null;
115
+ /** The job's public URL (`links.public` on a job card), in the board's URL language. */
116
+ links?: {
117
+ public?: string | null;
118
+ } | null;
115
119
  }
116
120
  /**
117
121
  * `BreadcrumbList` (+ `ItemList` of the visible jobs) JSON-LD for a listing
package/dist/seo.js CHANGED
@@ -777,10 +777,7 @@ function listingJsonLd(options) {
777
777
  itemListElement: detailJobs.map((job, index) => ({
778
778
  "@type": "ListItem",
779
779
  position: index + 1,
780
- url: boardUrl(
781
- options.origin,
782
- jobDetailPath(job.company.slug, job.slug)
783
- )
780
+ url: job.links?.public || boardUrl(options.origin, jobDetailPath(job.company.slug, job.slug))
784
781
  }))
785
782
  });
786
783
  }
package/dist/seo.mjs CHANGED
@@ -179,10 +179,7 @@ function listingJsonLd(options) {
179
179
  itemListElement: detailJobs.map((job, index) => ({
180
180
  "@type": "ListItem",
181
181
  position: index + 1,
182
- url: boardUrl(
183
- options.origin,
184
- jobDetailPath(job.company.slug, job.slug)
185
- )
182
+ url: job.links?.public || boardUrl(options.origin, jobDetailPath(job.company.slug, job.slug))
186
183
  }))
187
184
  });
188
185
  }
package/dist/server.d.mts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.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';
2
+ import './_spec-QzRtIJNE.mjs';
3
+ import './search-D5GiEIK5.mjs';
4
+ import './jobs-Cu5SX_Yp.mjs';
5
+ import './board-Dc9RJzZs.mjs';
6
+ import './seo-WA9kv-W8.mjs';
7
+ import './blog-D32ONCap.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-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';
2
+ import './_spec-QzRtIJNE.js';
3
+ import './search-Cc0D9AIG.js';
4
+ import './jobs-BSc8fWRd.js';
5
+ import './board-BXRsEJR8.js';
6
+ import './seo-C0NRwuve.js';
7
+ import './blog-DBYumoqv.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-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';
2
+ import './_spec-QzRtIJNE.mjs';
3
+ import './search-D5GiEIK5.mjs';
4
+ import './jobs-Cu5SX_Yp.mjs';
5
+ import './board-Dc9RJzZs.mjs';
6
+ import './seo-WA9kv-W8.mjs';
7
+ import './blog-D32ONCap.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-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';
2
+ import './_spec-QzRtIJNE.js';
3
+ import './search-Cc0D9AIG.js';
4
+ import './jobs-BSc8fWRd.js';
5
+ import './board-BXRsEJR8.js';
6
+ import './seo-C0NRwuve.js';
7
+ import './blog-DBYumoqv.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-DJQkMA5T.mjs';
2
- import './_spec-B4TxcV4W.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-D5GiEIK5.mjs';
2
+ import './_spec-QzRtIJNE.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-DVSEJ5aj.js';
2
- import './_spec-B4TxcV4W.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-Cc0D9AIG.js';
2
+ import './_spec-QzRtIJNE.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.53.0",
3
+ "version": "4.55.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -86,8 +86,10 @@ const sortOptions = JOB_SORTS;
86
86
  Render seniority as a multi-select with all eight `SENIORITIES`.
87
87
  `EMPLOYMENT_TYPES` contains five listing options; `volunteer` and `other`
88
88
  remain valid job wire values but are absent from the filter control.
89
- `JOB_SORTS` contains exactly `relevance`, `newest`, and `salary_high`;
90
- `relevance` is the featured-ranked default. Label each option with your
89
+ `JOB_SORTS` contains exactly `relevance`, `newest`, `salary_high`, and
90
+ `distance`; `relevance` is the featured-ranked default. `distance` is
91
+ nearest-first from the selected location and needs coordinates — hide it
92
+ in the sort menu until a location is set. Label each option with your
91
93
  application's copy (message catalog or hard-coded board language).
92
94
 
93
95
  ## Load taxonomy options
@@ -31,6 +31,8 @@ access.companyId;
31
31
 
32
32
  `companyId` is set when the viewer has exactly one approved membership. It is `null` when they have none or more than one — pass `companyId` on writes or the API returns `company_required`.
33
33
 
34
+ For employers with multiple approved companies, select the same company for each read and write. Pass `{ query: { companyId } }` to `me.talentAccess.retrieve`, `me.talentAccess.retrieveCandidate`, and `talent.retrieve`. The selected company controls balances, candidate unlock state, and opaque profile access. Omission preserves the default viewer context; pending memberships and companies on another board grant no access. Pass `companyId` in unlock, checkout, upgrade, and cold `conversations.start` bodies so the same company pays.
35
+
34
36
  ## Gate one candidate
35
37
 
36
38
  Per-candidate already-unlocked state is a sibling read so the singleton never takes a candidate id.
@@ -136,6 +138,8 @@ Named `/p/{handle}` is the share bypass and always shows a full `public` profile
136
138
 
137
139
  `lastActive` on directory cards and profiles is a coarse bucket (`today`, `this_week`, `this_month`, `last_3_months`, `over_3_months`) for a signed-in employer looking at a candidate who is actively looking or open to offers, and `null` otherwise. It stays on redacted cards. Render it as a short label such as "Active this week" and hide it when `null`.
138
140
 
141
+ `resumeUrl` on `talent.retrieve` is an expiring signed download for a signed-in approved employer when the candidate opted in (`me.resume.update({ shareWithEmployers: true })` or the upload form field) and a file is on file. It is `null` for everyone else and never present on directory cards. Redacted opaque profiles also return `null`. Turning sharing off stops new URLs; one already issued works until it expires. Candidates manage the file through `me.resume`.
142
+
139
143
  ```ts snippet
140
144
  const named = await board.talent.retrieve('jane-doe');
141
145
  const opaque = await board.talent.retrieve('bu_candidate');
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.53.0",
2
+ "version": "4.55.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",