@cavuno/board 4.8.0 → 4.9.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 (47) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/{_spec-DePC7a05.d.mts → _spec-B9Ah8dNs.d.mts} +35 -0
  3. package/dist/{_spec-DePC7a05.d.ts → _spec-B9Ah8dNs.d.ts} +35 -0
  4. package/dist/bin.mjs +174 -19
  5. package/dist/{blog-DbFr4VPW.d.mts → blog-BmqWfLZi.d.mts} +1 -1
  6. package/dist/{blog-ummlt6Uq.d.ts → blog-bh07fZ8Q.d.ts} +1 -1
  7. package/dist/{board-zWyHbyi4.d.ts → board-B4jLqmxn.d.mts} +5 -3
  8. package/dist/{board-DxTMBgIf.d.mts → board-De8nLbk7.d.ts} +5 -3
  9. package/dist/{breadcrumbs-kbmspmfk.d.ts → breadcrumbs-B1HVufC7.d.ts} +2 -2
  10. package/dist/{breadcrumbs-P4qh0zML.d.mts → breadcrumbs-BVQL2dNY.d.mts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/{chunk-IWWPHFK2.mjs → chunk-T46JASKG.mjs} +3 -0
  13. package/dist/doctor.d.mts +3 -1
  14. package/dist/doctor.d.ts +3 -1
  15. package/dist/doctor.js +169 -17
  16. package/dist/doctor.mjs +169 -17
  17. package/dist/filters.d.mts +2 -2
  18. package/dist/filters.d.ts +2 -2
  19. package/dist/format.d.mts +4 -4
  20. package/dist/format.d.ts +4 -4
  21. package/dist/index.d.mts +45 -23
  22. package/dist/index.d.ts +45 -23
  23. package/dist/index.js +10 -6
  24. package/dist/index.mjs +8 -7
  25. package/dist/{jobs-DTLDt57G.d.mts → jobs-B7q3BgIK.d.mts} +1 -1
  26. package/dist/{jobs-twt5TO9l.d.ts → jobs-Iv6Wkvvf.d.ts} +1 -1
  27. package/dist/{search-CHD6peIl.d.ts → search-CbDZwdyl.d.ts} +1 -1
  28. package/dist/{search-f2UNlTfv.d.mts → search-DC0jatQN.d.mts} +1 -1
  29. package/dist/seo-BDFUuvXM.d.ts +12 -0
  30. package/dist/seo-HCE7aCkh.d.mts +12 -0
  31. package/dist/seo-files.d.mts +36 -0
  32. package/dist/seo-files.d.ts +36 -0
  33. package/dist/seo-files.js +102 -0
  34. package/dist/seo-files.mjs +81 -0
  35. package/dist/seo.d.mts +6 -6
  36. package/dist/seo.d.ts +6 -6
  37. package/dist/server.d.mts +6 -5
  38. package/dist/server.d.ts +6 -5
  39. package/dist/server.mjs +1 -1
  40. package/dist/sitemap.d.mts +6 -5
  41. package/dist/sitemap.d.ts +6 -5
  42. package/dist/suggest.d.mts +2 -2
  43. package/dist/suggest.d.ts +2 -2
  44. package/package.json +11 -1
  45. package/skills/cavuno-board-account/SKILL.md +3 -1
  46. package/skills/cavuno-board-filters/SKILL.md +17 -3
  47. package/skills/manifest.json +1 -1
package/dist/doctor.mjs CHANGED
@@ -107,7 +107,14 @@ function summarize(results) {
107
107
  const passed = results.filter((r) => r.status === "pass").map((r) => r.id);
108
108
  const failed = results.filter((r) => r.status === "fail").map((r) => r.id);
109
109
  const skipped = results.filter((r) => r.status === "skip").map((r) => r.id);
110
- return { exitCode: failed.length > 0 ? 1 : 0, passed, failed, skipped };
110
+ const warned = results.filter((r) => r.status === "warn").map((r) => r.id);
111
+ return {
112
+ exitCode: failed.length > 0 ? 1 : 0,
113
+ passed,
114
+ failed,
115
+ skipped,
116
+ warned
117
+ };
111
118
  }
112
119
 
113
120
  // src/doctor/cookie-conformance.ts
@@ -282,7 +289,7 @@ function checkCookieCodecConformance(projectRoot) {
282
289
  }
283
290
 
284
291
  // src/doctor/probe.ts
285
- var FETCH_TIMEOUT_MS = 1e4;
292
+ var FETCH_TIMEOUT_MS = 6e4;
286
293
  async function probe(fetchImpl, url) {
287
294
  try {
288
295
  const response = await fetchImpl(url, {
@@ -308,7 +315,11 @@ var READ = {
308
315
  jobs: record("read.jobs", 2),
309
316
  jsonld: record("read.jsonld", 2),
310
317
  sitemap: record("read.sitemap", 2),
311
- robots: record("read.robots", 2)
318
+ robots: record("read.robots", 2),
319
+ adsTxt: record("read.adsTxt", 2),
320
+ indexNow: record("read.indexNow", 2),
321
+ googleVerification: record("read.googleVerification", 2),
322
+ oauthCallback: record("read.oauthCallback", 2)
312
323
  };
313
324
  function skipReadProbes(reason) {
314
325
  return Object.values(READ).map((make) => make("skip", reason));
@@ -364,7 +375,11 @@ async function probeSitemap(fetchImpl, base) {
364
375
  }
365
376
  let urls = doc.urls;
366
377
  if (doc.kind === "index") {
367
- const child = await probe(fetchImpl, onFrontend(base, urls[0]));
378
+ const childUrl = onFrontend(base, urls[0]);
379
+ let child = await probe(fetchImpl, childUrl);
380
+ if (!child.ok && (child.status === 503 || child.status === 0)) {
381
+ child = await probe(fetchImpl, childUrl);
382
+ }
368
383
  const childDoc = child.ok ? parseSitemap(child.body) : null;
369
384
  if (!childDoc || childDoc.urls.length === 0) {
370
385
  return READ.sitemap(
@@ -378,14 +393,109 @@ async function probeSitemap(fetchImpl, base) {
378
393
  const sample = await probe(fetchImpl, sampleUrl);
379
394
  return sample.ok ? READ.sitemap("pass", `${urls.length} entries; sample page resolves`) : READ.sitemap("fail", `sitemap page ${sampleUrl} \u2192 HTTP ${sample.status}`);
380
395
  }
381
- async function runReadProbes(fetchImpl, frontendUrl) {
396
+ function scoreRobots(robots, seo) {
397
+ if (!robots.ok) {
398
+ return READ.robots("fail", `robots.txt HTTP ${robots.status}`);
399
+ }
400
+ const missing = [];
401
+ if (!/user-agent\s*:/i.test(robots.body)) missing.push("User-agent");
402
+ if (!robots.body.includes("Disallow: /go/")) missing.push("Disallow: /go/");
403
+ if (seo) {
404
+ const canonicalBase = seo.canonicalBase.replace(/\/+$/, "");
405
+ const sitemapLine = `Sitemap: ${canonicalBase}/sitemap.xml`;
406
+ if (!robots.body.includes(sitemapLine)) missing.push(sitemapLine);
407
+ }
408
+ if (missing.includes("User-agent")) {
409
+ return READ.robots(
410
+ "fail",
411
+ "robots.txt returned 200 but has no User-agent directive"
412
+ );
413
+ }
414
+ return missing.length === 0 ? READ.robots("pass", "present") : READ.robots(
415
+ "warn",
416
+ `robots.txt is missing ${missing.join(", ")} (hosted boards emit it)`
417
+ );
418
+ }
419
+ function configuredText(value) {
420
+ return typeof value === "string" && value.length > 0 ? value : null;
421
+ }
422
+ function scoreOptionalTextFile(options) {
423
+ const { make, label, path, seo, probed } = options;
424
+ if (seo == null) {
425
+ return make("skip", "board seo not fetched");
426
+ }
427
+ const expected = configuredText(options.configured);
428
+ if (expected !== null) {
429
+ if (!probed.ok) {
430
+ return make("fail", `${path} HTTP ${probed.status}`);
431
+ }
432
+ if (probed.body.trimEnd() === expected.trimEnd()) {
433
+ return make("pass", `${label} matches dashboard`);
434
+ }
435
+ return make("fail", `${path} body does not match dashboard ${label}`);
436
+ }
437
+ if (probed.status === 404) {
438
+ return make("pass", "unconfigured; 404 as expected");
439
+ }
440
+ if (probed.status === 200) {
441
+ return make(
442
+ "warn",
443
+ `${label} served but not configured in dashboard \u2014 clone leftover?`
444
+ );
445
+ }
446
+ return make("fail", `${path} HTTP ${probed.status}`);
447
+ }
448
+ function escapeRegExp(value) {
449
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
450
+ }
451
+ function hasGoogleSiteVerificationMeta(html, token) {
452
+ const escaped = escapeRegExp(token);
453
+ const quoted = `["']${escaped}["']`;
454
+ const name = `name\\s*=\\s*["']google-site-verification["']`;
455
+ const content = `content\\s*=\\s*${quoted}`;
456
+ return new RegExp(`<meta\\b[^>]*\\b${name}[^>]*\\b${content}`, "i").test(html) || new RegExp(`<meta\\b[^>]*\\b${content}[^>]*\\b${name}`, "i").test(html);
457
+ }
458
+ function scoreGoogleVerification(homeHtml, seo) {
459
+ if (seo == null) {
460
+ return READ.googleVerification("skip", "board seo not fetched");
461
+ }
462
+ const token = configuredText(seo.googleSiteVerification);
463
+ if (token === null) {
464
+ return READ.googleVerification("skip", "no token configured");
465
+ }
466
+ return hasGoogleSiteVerificationMeta(homeHtml, token) ? READ.googleVerification("pass", "google-site-verification meta present") : READ.googleVerification(
467
+ "fail",
468
+ "home HTML is missing the google-site-verification meta tag"
469
+ );
470
+ }
471
+ var OAUTH_PROVIDERS = ["google", "linkedin"];
472
+ function scoreOAuthCallback(probed) {
473
+ const broken = OAUTH_PROVIDERS.filter(
474
+ (provider) => !(probed[provider].status === 400 && /missing code or state/i.test(probed[provider].body))
475
+ );
476
+ return broken.length === 0 ? READ.oauthCallback("pass", "callback paths reach the hosted app") : READ.oauthCallback(
477
+ "warn",
478
+ `${broken.map((p) => `/api/board-auth/oauth/${p}/callback \u2192 HTTP ${probed[p].status}`).join(", ")} \u2014 only matters if you registered this domain's callback with the provider: forward the path to cavuno.com, or register https://cavuno.com/api/board-auth/oauth/{provider}/callback instead`
479
+ );
480
+ }
481
+ async function runReadProbes(fetchImpl, frontendUrl, seo) {
382
482
  const base = frontendUrl.replace(/\/$/, "");
383
- const [home, jobsAndJsonLd, sitemap, robots] = await Promise.all([
384
- probe(fetchImpl, base),
385
- probeJobsAndJsonLd(fetchImpl, base),
386
- probeSitemap(fetchImpl, base),
387
- probe(fetchImpl, `${base}/robots.txt`)
388
- ]);
483
+ const home = await probe(fetchImpl, base);
484
+ const jobsAndJsonLd = await probeJobsAndJsonLd(fetchImpl, base);
485
+ const sitemap = await probeSitemap(fetchImpl, base);
486
+ const robots = await probe(fetchImpl, `${base}/robots.txt`);
487
+ const adsTxt = await probe(fetchImpl, `${base}/ads.txt`);
488
+ const indexNow = await probe(fetchImpl, `${base}/indexnow-key.txt`);
489
+ const oauthCallback = {
490
+ google: await probe(
491
+ fetchImpl,
492
+ `${base}/api/board-auth/oauth/google/callback`
493
+ ),
494
+ linkedin: await probe(
495
+ fetchImpl,
496
+ `${base}/api/board-auth/oauth/linkedin/callback`
497
+ )
498
+ };
389
499
  return [
390
500
  home.ok && /<(html|body|div|main)[\s>]/i.test(home.body) ? READ.home("pass", "home renders") : READ.home(
391
501
  "fail",
@@ -393,10 +503,25 @@ async function runReadProbes(fetchImpl, frontendUrl) {
393
503
  ),
394
504
  ...jobsAndJsonLd,
395
505
  sitemap,
396
- robots.ok && /user-agent\s*:/i.test(robots.body) ? READ.robots("pass", "present") : READ.robots(
397
- "fail",
398
- robots.ok ? "robots.txt returned 200 but has no User-agent directive" : `robots.txt HTTP ${robots.status}`
399
- )
506
+ scoreRobots(robots, seo),
507
+ scoreOptionalTextFile({
508
+ make: READ.adsTxt,
509
+ label: "ads.txt",
510
+ path: "/ads.txt",
511
+ seo,
512
+ configured: seo?.adsTxt,
513
+ probed: adsTxt
514
+ }),
515
+ scoreOptionalTextFile({
516
+ make: READ.indexNow,
517
+ label: "indexnow-key.txt",
518
+ path: "/indexnow-key.txt",
519
+ seo,
520
+ configured: seo?.indexNowKey,
521
+ probed: indexNow
522
+ }),
523
+ scoreGoogleVerification(home.body, seo),
524
+ scoreOAuthCallback(oauthCallback)
400
525
  ];
401
526
  }
402
527
 
@@ -452,6 +577,28 @@ async function checkBoardResolves(fetchImpl, env) {
452
577
  }
453
578
  return STATIC_BOARD("pass", "publishable key resolves the board");
454
579
  }
580
+ async function fetchBoardSeo(fetchImpl, env) {
581
+ const result = await probe(
582
+ fetchImpl,
583
+ `${apiBase(env.apiUrl)}/v1/boards/${encodeURIComponent(env.boardKey)}/seo`
584
+ );
585
+ if (!result.ok) return null;
586
+ try {
587
+ const parsed = JSON.parse(result.body);
588
+ if (typeof parsed !== "object" || parsed === null) return null;
589
+ const rec = parsed;
590
+ if (typeof rec.canonicalBase !== "string") return null;
591
+ const asNullableString = (value) => value === null || typeof value === "string" ? value : null;
592
+ return {
593
+ canonicalBase: rec.canonicalBase,
594
+ adsTxt: asNullableString(rec.adsTxt),
595
+ indexNowKey: asNullableString(rec.indexNowKey),
596
+ googleSiteVerification: asNullableString(rec.googleSiteVerification)
597
+ };
598
+ } catch {
599
+ return null;
600
+ }
601
+ }
455
602
  var SKILL_ROOTS = [
456
603
  ".claude/skills",
457
604
  ".agents/skills",
@@ -513,8 +660,13 @@ async function runDoctor(options) {
513
660
  } else {
514
661
  results.push(STATIC_API("skip", "PUBLIC_CAVUNO_API_URL not set"));
515
662
  }
663
+ let seo = null;
516
664
  if (envOk) {
517
- results.push(await checkBoardResolves(fetchImpl, env));
665
+ const boardResult = await checkBoardResolves(fetchImpl, env);
666
+ results.push(boardResult);
667
+ if (boardResult.status === "pass") {
668
+ seo = await fetchBoardSeo(fetchImpl, env);
669
+ }
518
670
  } else {
519
671
  results.push(STATIC_BOARD("skip", "env checks failed \u2014 fix them first"));
520
672
  }
@@ -523,7 +675,7 @@ async function runDoctor(options) {
523
675
  ...checkCookieCodecConformance(options.projectRoot ?? process.cwd())
524
676
  );
525
677
  results.push(
526
- ...options.frontendUrl ? await runReadProbes(fetchImpl, options.frontendUrl) : skipReadProbes("no --frontend <url> given")
678
+ ...options.frontendUrl ? await runReadProbes(fetchImpl, options.frontendUrl, seo) : skipReadProbes("no --frontend <url> given")
527
679
  );
528
680
  return { results, summary: summarize(results) };
529
681
  }
@@ -1,5 +1,5 @@
1
- import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-DTLDt57G.mjs';
2
- import './_spec-DePC7a05.mjs';
1
+ import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-B7q3BgIK.mjs';
2
+ import './_spec-B9Ah8dNs.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/filters` — the canonical listing-filter vocabulary and URL
package/dist/filters.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-twt5TO9l.js';
2
- import './_spec-DePC7a05.js';
1
+ import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-Iv6Wkvvf.js';
2
+ import './_spec-B9Ah8dNs.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/filters` — the canonical listing-filter vocabulary and URL
package/dist/format.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-P4qh0zML.mjs';
2
- import { C as CustomFieldDefinition } from './board-DxTMBgIf.mjs';
3
- import { C as CustomFieldValues } from './jobs-DTLDt57G.mjs';
4
- import './_spec-DePC7a05.mjs';
1
+ export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-BVQL2dNY.mjs';
2
+ import { C as CustomFieldDefinition } from './board-B4jLqmxn.mjs';
3
+ import { C as CustomFieldValues } from './jobs-B7q3BgIK.mjs';
4
+ import './_spec-B9Ah8dNs.mjs';
5
5
 
6
6
  /**
7
7
  * Date display helpers in the board language (required leading parameter,
package/dist/format.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-kbmspmfk.js';
2
- import { C as CustomFieldDefinition } from './board-zWyHbyi4.js';
3
- import { C as CustomFieldValues } from './jobs-twt5TO9l.js';
4
- import './_spec-DePC7a05.js';
1
+ export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-B1HVufC7.js';
2
+ import { C as CustomFieldDefinition } from './board-De8nLbk7.js';
3
+ import { C as CustomFieldValues } from './jobs-Iv6Wkvvf.js';
4
+ import './_spec-B9Ah8dNs.js';
5
5
 
6
6
  /**
7
7
  * Date display helpers in the board language (required leading parameter,
package/dist/index.d.mts CHANGED
@@ -1,12 +1,13 @@
1
- import { S as Schemas, c as components } from './_spec-DePC7a05.mjs';
2
- import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-f2UNlTfv.mjs';
3
- export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-f2UNlTfv.mjs';
4
- import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-DxTMBgIf.mjs';
5
- export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, l as CompanySalarySummary, C as CustomFieldDefinition, m as CustomFieldOption, n as CustomFieldType, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, P as PublicBoard, q as PublicBoardAnalytics, r as PublicBoardFeatures, s as PublicCompany, t as PublicCompanyDetail, u as SalaryCompany, v as SalaryLocation, w as SalarySkill, x as SalaryTitle, y as SkillLocationSalary, z as SkillLocationsIndex, S as SkillSalaryDetail, A as TitleLocationSalary, B as TitleLocationsIndex, T as TitleSalaryDetail } from './board-DxTMBgIf.mjs';
6
- import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-DTLDt57G.mjs';
7
- export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-DTLDt57G.mjs';
8
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-DbFr4VPW.mjs';
9
- export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-DbFr4VPW.mjs';
1
+ import { S as Schemas, c as components } from './_spec-B9Ah8dNs.mjs';
2
+ import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-DC0jatQN.mjs';
3
+ export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-DC0jatQN.mjs';
4
+ import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-B4jLqmxn.mjs';
5
+ export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, l as CompanySalarySummary, C as CustomFieldDefinition, m as CustomFieldOption, n as CustomFieldType, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, P as PublicBoard, q as PublicBoardAds, r as PublicBoardAnalytics, s as PublicBoardFeatures, t as PublicBoardJobForm, u as PublicCompany, v as PublicCompanyDetail, w as SalaryCompany, x as SalaryLocation, y as SalarySkill, z as SalaryTitle, A as SkillLocationSalary, B as SkillLocationsIndex, S as SkillSalaryDetail, D as TitleLocationSalary, E as TitleLocationsIndex, T as TitleSalaryDetail } from './board-B4jLqmxn.mjs';
6
+ export { B as BoardSeo } from './seo-HCE7aCkh.mjs';
7
+ import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-B7q3BgIK.mjs';
8
+ export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-B7q3BgIK.mjs';
9
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-BmqWfLZi.mjs';
10
+ export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-BmqWfLZi.mjs';
10
11
 
11
12
  /**
12
13
  * Well-known `<domain>_<snake_reason>` codes the Board API sends, grouped by
@@ -19,7 +20,7 @@ export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts,
19
20
  * `unknown_error` is SDK-synthesized when a response carries no parseable
20
21
  * envelope.
21
22
  */
22
- declare const BOARD_API_ERROR_CODES: readonly ["internal_error", "validation_bad_request", "validation_payload_too_large", "rate_limited", "rate_limit_unavailable", "search_unavailable", "too_many_filter_values", "pagination_invalid_cursor", "pagination_offset_too_large", "auth_unauthenticated", "auth_forbidden", "plan_upgrade_required", "unknown_error", "boards_not_found", "board_page_not_found", "board_auth_email_taken", "board_auth_invalid_credentials", "board_auth_invalid_token", "board_auth_registration_disabled", "board_auth_token_expired", "invalid_current_password", "no_password", "same_email", "email_taken", "invalid_token", "board_password_required", "board_password_invalid", "jobs_not_found", "jobs_invalid_filter", "categories_not_found", "skills_not_found", "places_not_found", "companies_not_found", "company_markets_not_found", "company_salary_not_found", "company_category_salary_not_found", "salaries_title_not_found", "salaries_skill_not_found", "salaries_location_not_found", "salaries_title_location_not_found", "salaries_skill_location_not_found", "blog_post_not_found", "blog_author_not_found", "blog_tag_not_found", "talent_not_found", "talent_directory_not_found", "talent_directory_restricted", "job_alert_not_found", "job_alerts_disabled", "candidate_alert_limit_reached", "candidate_alert_not_found", "candidate_entry_not_found", "candidate_handle_taken", "candidate_job_not_found", "resume_invalid_file", "resume_upload_forbidden", "applications_external_apply_only", "applications_country_not_allowed", "applications_guest_not_allowed", "applications_job_not_found", "applications_not_found", "applications_resume_invalid_file", "applications_unprocessable", "messaging_application_not_found", "messaging_application_not_linked", "messaging_blocked", "messaging_cannot_block_self", "messaging_cold_rule", "messaging_conversation_not_found", "messaging_disabled", "messaging_edit_window_expired", "messaging_message_deleted", "messaging_message_not_found", "messaging_not_author", "messaging_not_participant", "messaging_not_permitted", "messaging_not_recipient", "messaging_rate_limited", "messaging_recipient_not_found", "messaging_recipient_not_open", "messaging_unsend_window_expired", "employer_applicant_not_found", "employer_ats_unprocessable", "employer_checkout_failed", "employer_company_exists", "employer_company_name_taken", "employer_company_not_found", "employer_job_not_found", "employer_job_slug_taken", "employer_jobs_quota_exceeded", "employer_not_member", "employer_payment_required", "employer_pipeline_stage_not_found", "employer_member_not_found", "employer_invite_not_found", "not_company_admin", "not_company_member", "company_deletion_disabled", "last_admin", "already_member", "already_invited", "invalid_email", "invite_email_mismatch", "candidate_role", "job_not_published", "paywall_already_active", "paywall_disabled", "paywall_invalid_checkout_session", "paywall_no_candidate_profile", "paywall_no_recurring_subscription", "paywall_offer_not_found", "job_posting_logo_lookup_unavailable", "job_posting_logo_not_found", "job_posting_rejected"];
23
+ declare const BOARD_API_ERROR_CODES: readonly ["internal_error", "validation_bad_request", "validation_payload_too_large", "rate_limited", "rate_limit_unavailable", "search_unavailable", "too_many_filter_values", "pagination_invalid_cursor", "pagination_offset_too_large", "auth_unauthenticated", "auth_forbidden", "plan_upgrade_required", "unknown_error", "boards_not_found", "board_page_not_found", "board_auth_email_taken", "board_auth_invalid_credentials", "board_auth_invalid_token", "board_auth_registration_disabled", "board_auth_token_expired", "invalid_current_password", "no_password", "same_email", "email_taken", "invalid_token", "board_password_required", "board_password_invalid", "jobs_not_found", "jobs_invalid_filter", "categories_not_found", "skills_not_found", "places_not_found", "companies_not_found", "company_markets_not_found", "company_salary_not_found", "company_category_salary_not_found", "salaries_title_not_found", "salaries_skill_not_found", "salaries_location_not_found", "salaries_title_location_not_found", "salaries_skill_location_not_found", "blog_post_not_found", "blog_author_not_found", "blog_tag_not_found", "talent_not_found", "talent_directory_not_found", "talent_directory_restricted", "job_recommendations_not_found", "recommended_talent_not_found", "job_alert_not_found", "job_alerts_disabled", "candidate_alert_limit_reached", "candidate_alert_not_found", "candidate_entry_not_found", "candidate_handle_taken", "candidate_job_not_found", "candidate_notification_preference_paused", "resume_invalid_file", "resume_upload_forbidden", "applications_external_apply_only", "applications_country_not_allowed", "applications_guest_not_allowed", "applications_job_not_found", "applications_not_found", "applications_resume_invalid_file", "applications_unprocessable", "messaging_application_not_found", "messaging_application_not_linked", "messaging_blocked", "messaging_cannot_block_self", "messaging_cold_rule", "messaging_conversation_not_found", "messaging_disabled", "messaging_edit_window_expired", "messaging_message_deleted", "messaging_message_not_found", "messaging_not_author", "messaging_not_participant", "messaging_not_permitted", "messaging_not_recipient", "messaging_rate_limited", "messaging_recipient_not_found", "messaging_recipient_not_open", "messaging_unsend_window_expired", "employer_applicant_not_found", "employer_ats_unprocessable", "employer_checkout_failed", "employer_company_exists", "employer_company_name_taken", "employer_company_not_found", "employer_job_not_found", "employer_job_slug_taken", "employer_jobs_quota_exceeded", "employer_not_member", "employer_payment_required", "employer_pipeline_stage_not_found", "employer_member_not_found", "employer_invite_not_found", "not_company_admin", "not_company_member", "company_deletion_disabled", "last_admin", "already_member", "already_invited", "invalid_email", "invite_email_mismatch", "candidate_role", "job_not_published", "paywall_already_active", "paywall_disabled", "paywall_invalid_checkout_session", "paywall_no_candidate_profile", "paywall_no_recurring_subscription", "paywall_offer_not_found", "job_posting_logo_lookup_unavailable", "job_posting_logo_not_found", "job_posting_rejected"];
23
24
  /**
24
25
  * The known code set plus open string — new codes ship additively within v1,
25
26
  * so exhaustive narrowing is intentionally impossible.
@@ -142,7 +143,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
142
143
  * constant because the package is platform-neutral and cannot read
143
144
  * package.json at runtime.
144
145
  */
145
- declare const SDK_VERSION = "4.8.0";
146
+ declare const SDK_VERSION = "4.9.0";
146
147
 
147
148
  type SavedJob = Schemas['SavedJob'];
148
149
  type SavedJobsListQuery = {
@@ -468,15 +469,6 @@ type OAuthAuthorizationQuery = {
468
469
  type OAuthAuthorizationUrl = Schemas['BoardAuthOAuthAuthorizationUrl'];
469
470
  type OAuthExchangeBody = Schemas['BoardAuthOAuthExchangeBody'];
470
471
 
471
- /**
472
- * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
473
- * headless frontend rebuilds `robots.txt` / `ads.txt` / `indexnow-key.txt`
474
- * (+ the Google site-verification `<meta>`) from, byte-identically to the
475
- * hosted board. Icons and `themeColor` left in 4.0.0; applications
476
- * own brand assets and presentation tokens.
477
- */
478
- type BoardSeo = Schemas['BoardSeo'];
479
-
480
472
  type EmbedJobsQuery = {
481
473
  /** Free-text search query, up to 200 characters. */
482
474
  q?: string;
@@ -689,6 +681,8 @@ type TaxonomyListQuery = {
689
681
  q?: string;
690
682
  cursor?: string;
691
683
  limit?: number;
684
+ /** `name` (default) or `jobCount` (highest published-job count first). */
685
+ sort?: 'name' | 'jobCount';
692
686
  };
693
687
  /**
694
688
  * Query for `taxonomy.places.list()`. Omit it (or `q`) for the full
@@ -740,10 +734,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
740
734
  client: BoardClient;
741
735
  /**
742
736
  * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
743
- * features, and analytics.
737
+ * features, analytics, and AdSense (`ads.enabled` + `ads.clientId`).
738
+ * Per-placement slot ids are not on this resource.
744
739
  *
745
740
  * @example
746
- * const { name, language, logoUrl, icons } = await board.context();
741
+ * const { name, language, logoUrl, icons, ads } = await board.context();
747
742
  */
748
743
  context(options?: FetchOptions): Promise<{
749
744
  object: "public_board";
@@ -764,6 +759,8 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
764
759
  showCavunoBranding: boolean;
765
760
  features: {
766
761
  jobAlerts: boolean;
762
+ jobRecommendationsEnabled: boolean;
763
+ recommendedTalentEnabled: boolean;
767
764
  candidates: boolean;
768
765
  employers: boolean;
769
766
  blog: boolean;
@@ -783,9 +780,27 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
783
780
  linkedInPartnerId: string | null;
784
781
  cookieConsentRequired: boolean;
785
782
  };
783
+ ads: {
784
+ enabled: boolean;
785
+ clientId: string | null;
786
+ };
786
787
  customFields: {
787
788
  job: components["schemas"]["CustomFieldDefinition"][];
788
789
  };
790
+ jobForm: {
791
+ salary: {
792
+ visible: boolean;
793
+ };
794
+ seniority: {
795
+ visible: boolean;
796
+ };
797
+ location: {
798
+ visible: boolean;
799
+ };
800
+ sponsorship: {
801
+ visible: boolean;
802
+ };
803
+ };
789
804
  contact: {
790
805
  email: string | null;
791
806
  websiteUrl: string | null;
@@ -1580,12 +1595,14 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1580
1595
  object: "notification_preference";
1581
1596
  channel: "messageEmails" | "applicationEmails" | "recommendedJobEmails";
1582
1597
  subscribed: boolean;
1598
+ waitlisted: boolean;
1583
1599
  updatedAt: number | null;
1584
1600
  }>>;
1585
1601
  update(body: UpdateNotificationPreferenceBody, options?: FetchOptions): Promise<ListEnvelope<{
1586
1602
  object: "notification_preference";
1587
1603
  channel: "messageEmails" | "applicationEmails" | "recommendedJobEmails";
1588
1604
  subscribed: boolean;
1605
+ waitlisted: boolean;
1589
1606
  updatedAt: number | null;
1590
1607
  }>>;
1591
1608
  unsubscribeWithToken(body: UnsubscribeBody, options?: FetchOptions): Promise<void>;
@@ -1656,6 +1673,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1656
1673
  linkedinUrl: string | null;
1657
1674
  facebookUrl: string | null;
1658
1675
  logoUrl: string | null;
1676
+ deletionEnabled: boolean;
1659
1677
  }>;
1660
1678
  update(slug: string, body: UpdateEmployerCompanyBody, options?: FetchOptions): Promise<{
1661
1679
  id: string;
@@ -1669,6 +1687,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1669
1687
  linkedinUrl: string | null;
1670
1688
  facebookUrl: string | null;
1671
1689
  logoUrl: string | null;
1690
+ deletionEnabled: boolean;
1672
1691
  }>;
1673
1692
  delete(slug: string, options?: FetchOptions): Promise<void>;
1674
1693
  listMembers(slug: string, options?: FetchOptions): Promise<ListEnvelope<{
@@ -1711,6 +1730,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1711
1730
  linkedinUrl: string | null;
1712
1731
  facebookUrl: string | null;
1713
1732
  logoUrl: string | null;
1733
+ deletionEnabled: boolean;
1714
1734
  }>;
1715
1735
  workEmail: {
1716
1736
  verify(slug: string, body: SendWorkEmailBody, options?: FetchOptions): Promise<{
@@ -2488,6 +2508,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2488
2508
  sourceSlug: string;
2489
2509
  canonicalSlug: string;
2490
2510
  displayName: string;
2511
+ jobCount: number;
2491
2512
  }>>;
2492
2513
  resolve(slug: string, options?: FetchOptions): Promise<{
2493
2514
  object: "taxonomy_resolution";
@@ -2507,6 +2528,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2507
2528
  sourceSlug: string;
2508
2529
  canonicalSlug: string;
2509
2530
  displayName: string;
2531
+ jobCount: number;
2510
2532
  }>>;
2511
2533
  resolve(slug: string, options?: FetchOptions): Promise<{
2512
2534
  object: "taxonomy_resolution";
@@ -3187,4 +3209,4 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
3187
3209
  };
3188
3210
  type BoardSdk = ReturnType<typeof createBoardClient>;
3189
3211
 
3190
- export { type AcceptCompanyMemberInviteBody, type AccessCheckoutBody, type AccessCheckoutSession, type AccessCheckoutSessionState, type AccessGrant, type AccessPortalBody, type AccessPortalSession, type AddApplicantNoteBody, type Alert, type AlertBody, type Application, type ApplicationsListQuery, type ApplyAction, type ApplyApprovalPlan, type ApplyApprovalReceipt, type ApplyBody, type ApplyIntent, Awaitable, BOARD_API_ERROR_CODES, type Block, type BlockStatus, type BlockUserBody, type BlockedUser, BlogPostsListQuery, BlogSearchBody, BlogSimilarQuery, type BoardAccessGrant, BoardApiError, type BoardApiErrorCode, type BoardAuthSession, BoardClient, BoardRequest, type BoardSdk, type BoardSeo, type BoardUser, type BulkMoveApplicantsBody, type BulkRejectApplicantsBody, type CandidateAvatar, type CandidateEducation, type CandidateExperience, type CandidateLanguage, type CandidateProfile, type CandidateSkill, type ClaimableCompany, CompaniesListQuery, CompaniesSearchBody, CompanyJobsListQuery, CompanyListEnvelope, CompanyMarketsListQuery, type CompanyMember, type CompanyMemberInvite, type CompanyMemberInviteAcceptance, type CompanyMembership, CompanySimilarQuery, type ConfirmEmailChangeBody, type ConfirmWorkEmailBody, type ConsumeMagicLinkBody, type Conversation, type ConversationArchive, type ConversationDetail, type ConversationRef, type ConversationsListQuery, type CreateApplyApprovalBody, type CreateApplyIntentBody, type CreateBoardClientOptions, type CreateCompanyBody, type CreateCompanyMemberInviteBody, type CreateEducationBody, type CreateEmployerJobBody, type CreateExperienceBody, type CreateJobPostingInput, type CreatePipelineStageBody, type EditMessageBody, type EmbedJobsQuery, type EmployerApplicant, type EmployerBillingOption, type EmployerCheckout, type EmployerCheckoutBody, type EmployerCompany, type EmployerCompanySearchQuery, type EmployerJob, type EmployerJobStat, type EmployerJobStatsPoint, type EmployerJobStatsTimeseriesQuery, type EmployerJobSummary, type EmployerJobsListQuery, type EmployerPipeline, type EmployerPipelineQuery, type EmployerPipelineStage, type EmployerProfileStats, type EmployerProfileViewsPoint, type EmployerProfileViewsTimeseriesQuery, EmploymentType, FetchOptions, type FindExistingConversationQuery, type ForgotPasswordBody, type HandleAvailability, type JobAlertConfirmation, type JobAlertDeletePreferenceInput, type JobAlertFiltersInput, type JobAlertFrequency, type JobAlertManageQuery, type JobAlertManageResult, type JobAlertManageState, type JobAlertManageTokenInput, type JobAlertPreference, type JobAlertRemoteOption, type JobAlertResendResult, type JobAlertStoredFilters, type JobAlertSubscribeInput, type JobAlertSubscription, type JobAlertUpdatePreferenceInput, JobCardListEnvelope, JobCardSearchEnvelope, type JobPostingBillingOptions, type JobPostingBillingVerification, type JobPostingLogoResult, type JobPostingPlan, type JobPostingResult, JobsListQuery, JobsSearchBody, JobsSimilarQuery, ListEnvelope, Logger, type LoginBody, type LogoutBody, type MarketingConsent, type Message, type ModerationReport, type MoveApplicantStageBody, type NotificationPreference, type OAuthAuthorizationQuery, type OAuthAuthorizationUrl, type OAuthExchangeBody, type OAuthProvider, type Paginator, type PaywallOffer, type PaywallOfferListEnvelope, type PlacesListQuery, type Plan, type PlanListEnvelope, type PlansListQuery, type PublicPlace, type PublicTaxonomyTerm, type ReadReceipt, type RecommendedJob, type RecommendedJobsListQuery, type RecommendedTalent, type RecommendedTalentListQuery, type RedirectResolution, type RefreshBody, type RegisterBody, RemoteOption, type RemotePermitTaxonomyEntry, type ReorderPipelineStagesBody, type ReplyBody, type ReportBody, type RequestEmailChangeBody, type RequestMagicLinkBody, type ResetPasswordBody, type Resume, type ResumeUploadOptions, SDK_VERSION, SalaryDetailQuery, type SalesLedPlan, type SalesLedPlanListEnvelope, type SaveJobBody, type SavedJob, type SavedJobsListQuery, SearchEnvelope, SearchSuggestQuery, type SendWorkEmailBody, Seniority, type StartAboutApplicationBody, type StartConversationBody, StorageMode, type TalentAccess, type TalentDirectoryEntry, type TalentDirectoryListEnvelope, type TalentDirectoryQuery, type TalentProfile, type TaxonomyGeo, type TaxonomyListQuery, type TaxonomyResolution, type ThreadMessagesQuery, type UnreadCount, type UnsubscribeBody, type UpdateApplicationFactsBody, type UpdateCandidateProfileBody, type UpdateCompanyMemberRoleBody, type UpdateEducationBody, type UpdateEmployerCompanyBody, type UpdateEmployerJobBody, type UpdateExperienceBody, type UpdateLanguagesBody, type UpdateNotificationPreferenceBody, type UpdatePasswordBody, type UpdatePipelineStageBody, type UpdateSkillsBody, type VerifyEmailBody, createBoardClient, isBoardApiError, isBoardPasswordRequired, isColdRule, isConflict, isForbidden, isNotFound, isOwnMessage, isRateLimited, isSafeApplicationUrl, isUnauthorized, isValidationError, lastOwnMessageId, paginate, resolveApplyAction };
3212
+ export { type AcceptCompanyMemberInviteBody, type AccessCheckoutBody, type AccessCheckoutSession, type AccessCheckoutSessionState, type AccessGrant, type AccessPortalBody, type AccessPortalSession, type AddApplicantNoteBody, type Alert, type AlertBody, type Application, type ApplicationsListQuery, type ApplyAction, type ApplyApprovalPlan, type ApplyApprovalReceipt, type ApplyBody, type ApplyIntent, Awaitable, BOARD_API_ERROR_CODES, type Block, type BlockStatus, type BlockUserBody, type BlockedUser, BlogPostsListQuery, BlogSearchBody, BlogSimilarQuery, type BoardAccessGrant, BoardApiError, type BoardApiErrorCode, type BoardAuthSession, BoardClient, BoardRequest, type BoardSdk, type BoardUser, type BulkMoveApplicantsBody, type BulkRejectApplicantsBody, type CandidateAvatar, type CandidateEducation, type CandidateExperience, type CandidateLanguage, type CandidateProfile, type CandidateSkill, type ClaimableCompany, CompaniesListQuery, CompaniesSearchBody, CompanyJobsListQuery, CompanyListEnvelope, CompanyMarketsListQuery, type CompanyMember, type CompanyMemberInvite, type CompanyMemberInviteAcceptance, type CompanyMembership, CompanySimilarQuery, type ConfirmEmailChangeBody, type ConfirmWorkEmailBody, type ConsumeMagicLinkBody, type Conversation, type ConversationArchive, type ConversationDetail, type ConversationRef, type ConversationsListQuery, type CreateApplyApprovalBody, type CreateApplyIntentBody, type CreateBoardClientOptions, type CreateCompanyBody, type CreateCompanyMemberInviteBody, type CreateEducationBody, type CreateEmployerJobBody, type CreateExperienceBody, type CreateJobPostingInput, type CreatePipelineStageBody, type EditMessageBody, type EmbedJobsQuery, type EmployerApplicant, type EmployerBillingOption, type EmployerCheckout, type EmployerCheckoutBody, type EmployerCompany, type EmployerCompanySearchQuery, type EmployerJob, type EmployerJobStat, type EmployerJobStatsPoint, type EmployerJobStatsTimeseriesQuery, type EmployerJobSummary, type EmployerJobsListQuery, type EmployerPipeline, type EmployerPipelineQuery, type EmployerPipelineStage, type EmployerProfileStats, type EmployerProfileViewsPoint, type EmployerProfileViewsTimeseriesQuery, EmploymentType, FetchOptions, type FindExistingConversationQuery, type ForgotPasswordBody, type HandleAvailability, type JobAlertConfirmation, type JobAlertDeletePreferenceInput, type JobAlertFiltersInput, type JobAlertFrequency, type JobAlertManageQuery, type JobAlertManageResult, type JobAlertManageState, type JobAlertManageTokenInput, type JobAlertPreference, type JobAlertRemoteOption, type JobAlertResendResult, type JobAlertStoredFilters, type JobAlertSubscribeInput, type JobAlertSubscription, type JobAlertUpdatePreferenceInput, JobCardListEnvelope, JobCardSearchEnvelope, type JobPostingBillingOptions, type JobPostingBillingVerification, type JobPostingLogoResult, type JobPostingPlan, type JobPostingResult, JobsListQuery, JobsSearchBody, JobsSimilarQuery, ListEnvelope, Logger, type LoginBody, type LogoutBody, type MarketingConsent, type Message, type ModerationReport, type MoveApplicantStageBody, type NotificationPreference, type OAuthAuthorizationQuery, type OAuthAuthorizationUrl, type OAuthExchangeBody, type OAuthProvider, type Paginator, type PaywallOffer, type PaywallOfferListEnvelope, type PlacesListQuery, type Plan, type PlanListEnvelope, type PlansListQuery, type PublicPlace, type PublicTaxonomyTerm, type ReadReceipt, type RecommendedJob, type RecommendedJobsListQuery, type RecommendedTalent, type RecommendedTalentListQuery, type RedirectResolution, type RefreshBody, type RegisterBody, RemoteOption, type RemotePermitTaxonomyEntry, type ReorderPipelineStagesBody, type ReplyBody, type ReportBody, type RequestEmailChangeBody, type RequestMagicLinkBody, type ResetPasswordBody, type Resume, type ResumeUploadOptions, SDK_VERSION, SalaryDetailQuery, type SalesLedPlan, type SalesLedPlanListEnvelope, type SaveJobBody, type SavedJob, type SavedJobsListQuery, SearchEnvelope, SearchSuggestQuery, type SendWorkEmailBody, Seniority, type StartAboutApplicationBody, type StartConversationBody, StorageMode, type TalentAccess, type TalentDirectoryEntry, type TalentDirectoryListEnvelope, type TalentDirectoryQuery, type TalentProfile, type TaxonomyGeo, type TaxonomyListQuery, type TaxonomyResolution, type ThreadMessagesQuery, type UnreadCount, type UnsubscribeBody, type UpdateApplicationFactsBody, type UpdateCandidateProfileBody, type UpdateCompanyMemberRoleBody, type UpdateEducationBody, type UpdateEmployerCompanyBody, type UpdateEmployerJobBody, type UpdateExperienceBody, type UpdateLanguagesBody, type UpdateNotificationPreferenceBody, type UpdatePasswordBody, type UpdatePipelineStageBody, type UpdateSkillsBody, type VerifyEmailBody, createBoardClient, isBoardApiError, isBoardPasswordRequired, isColdRule, isConflict, isForbidden, isNotFound, isOwnMessage, isRateLimited, isSafeApplicationUrl, isUnauthorized, isValidationError, lastOwnMessageId, paginate, resolveApplyAction };