@cavuno/board 4.1.0 → 4.3.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 (33) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/{_spec-BZDv2dc5.d.mts → _spec-CT7rWhQ-.d.mts} +50 -3
  3. package/dist/{_spec-BZDv2dc5.d.ts → _spec-CT7rWhQ-.d.ts} +50 -3
  4. package/dist/{blog-DyDvyQrI.d.mts → blog-CJda3-Ab.d.mts} +1 -1
  5. package/dist/{blog-BHx6iH3Z.d.ts → blog-DOBig1Wh.d.ts} +1 -1
  6. package/dist/{board-BTEZ0uiI.d.ts → board-BLwReKB8.d.mts} +10 -3
  7. package/dist/{board-BF3Qao6J.d.mts → board-O990tPTt.d.ts} +10 -3
  8. package/dist/{breadcrumbs-icxRVydh.d.mts → breadcrumbs-CQjU_wHB.d.mts} +2 -2
  9. package/dist/{breadcrumbs-SGaWth6C.d.ts → breadcrumbs-ClvafKXZ.d.ts} +2 -2
  10. package/dist/filters.d.mts +2 -2
  11. package/dist/filters.d.ts +2 -2
  12. package/dist/format.d.mts +4 -4
  13. package/dist/format.d.ts +4 -4
  14. package/dist/index.d.mts +51 -15
  15. package/dist/index.d.ts +51 -15
  16. package/dist/index.js +13 -6
  17. package/dist/index.mjs +13 -6
  18. package/dist/{jobs-BX6d_sdd.d.mts → jobs-CZUpStJ3.d.mts} +1 -1
  19. package/dist/{jobs-BbLJfz1z.d.ts → jobs-Cf7J5vJe.d.ts} +1 -1
  20. package/dist/{search-OKrdAHv8.d.mts → search-CHLEpKE5.d.mts} +1 -1
  21. package/dist/{search-7B-mVRNA.d.ts → search-YWruydKJ.d.ts} +1 -1
  22. package/dist/seo.d.mts +6 -6
  23. package/dist/seo.d.ts +6 -6
  24. package/dist/server.d.mts +5 -5
  25. package/dist/server.d.ts +5 -5
  26. package/dist/sitemap.d.mts +5 -5
  27. package/dist/sitemap.d.ts +5 -5
  28. package/dist/suggest.d.mts +2 -2
  29. package/dist/suggest.d.ts +2 -2
  30. package/package.json +1 -1
  31. package/skills/cavuno-board-companies/SKILL.md +19 -7
  32. package/skills/cavuno-board-seo/SKILL.md +12 -0
  33. package/skills/manifest.json +1 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,44 @@
3
3
  This changelog records changes that affect Board API compatibility, exported
4
4
  types, runtime behavior, or supported integration patterns.
5
5
 
6
+ ## 4.3.0 — 2026-08-07
7
+
8
+ - **`CompanyPublic.salarySampleCount`**: number of jobs that contribute to a
9
+ company's salary aggregates on the board (`0` when there is no usable
10
+ sample). Prefer this over fetching the full company-salary document just to
11
+ gate a Salaries tab or empty state. Distinct from `publishedJobCount` (open
12
+ roles without pay data stay at 0 here).
13
+ - **`GET …/companies/{slug}/salaries/summary`** and
14
+ `board.companies.salaries.summary(slug)`: lightweight profile teaser —
15
+ overall pay numbers, top categories by sample size, `sampleCount`, and
16
+ `currency` as `CompanySalarySummary`. Skips seniority, competitors,
17
+ locations, and logo joins from the full `CompanySalary` document. Format
18
+ currency ranges and multi-locale UI strings in the app.
19
+
20
+ ## 4.2.0 — 2026-08-06
21
+
22
+ - **Board logo + favicon pack on `board.context()`**: public board context now
23
+ includes `icons` next to `logoUrl` — absolute CDN URLs (or `null`) for
24
+ `ico`, `svg`, `appleTouch`, `icon192`, `icon512`, and `iconMaskable512`.
25
+ Derived from the operator logo (Settings → General upload / logo generator).
26
+ Brand identity, not SEO infra — `board.seo()` stays ads/IndexNow/GSV/
27
+ canonical/manifest.name only. Map `icons` into root-layout favicon `<link>`
28
+ tags. Operators set the logo in Cavuno; the API resolves the pack.
29
+ - **Card `summary` on jobs, companies, and talent**: list/card models gain a
30
+ server-derived plain-text `summary: string | null` — HTML stripped, entities
31
+ decoded, cut at a sentence boundary (or word boundary with `…`). The API does
32
+ the data cleaning; consumers decide how much of the string to show.
33
+ - `PublicJobCard.summary` — denormalized at write time on
34
+ `publicJobCardDocs` (backfill migration
35
+ `jobs/migrations:backfillPublicJobCardSummary`). Independent of the
36
+ existing `?fields=+description` opt-in, which keeps working as before.
37
+ - `CompanyPublic.summary` — derived from `description` at serialization for
38
+ list, search, and similar. Detail still ships the full HTML body.
39
+ - `TalentDirectoryEntry.summary` — derived from `bio` at serialization.
40
+ - **Deprecations** (still returned; prefer `summary` for card teasers):
41
+ - `CompanyPublic.description` on list/search/similar
42
+ - `TalentDirectoryEntry.bio`
43
+
6
44
  ## 4.1.0 — 2026-08-06
7
45
 
8
46
  - **Salary null-clears on job PATCH** (operator `PATCH /v1/jobs/:id` and
@@ -438,12 +438,19 @@ interface components {
438
438
  website: string | null;
439
439
  /** @description URL of the company logo, or `null` if no logo is set. */
440
440
  logoUrl: string | null;
441
- /** @description Long-form description of the company, or `null` if not set. */
441
+ /** @description Plain-text card teaser: the operator-authored company summary when set, otherwise a derived teaser from the long-form description (HTML stripped, first sentence / word-boundary cut). `null` when neither yields anything. Prefer this over `description` for list/card renders. */
442
+ summary: string | null;
443
+ /**
444
+ * @deprecated
445
+ * @description Long-form description of the company (HTML), or `null` if not set. **Deprecated on list/search/similar responses** — prefer `summary` for card teasers. Still the full prose for detail pages (`GET …/companies/{slug}`).
446
+ */
442
447
  description: string | null;
443
448
  /** @description Total number of public-facing jobs at this company. Currently mirrors `publishedJobCount`. */
444
449
  jobCount: number;
445
450
  /** @description Number of currently-published, non-expired jobs at this company. */
446
451
  publishedJobCount: number;
452
+ /** @description Number of jobs that contribute to this company's salary aggregates on the board (the salary sample size). `0` when there is no usable salary data — prefer this over fetching the full company-salary document just to decide whether to show a Salaries tab. Not the same as `publishedJobCount` (open roles without pay data stay at 0 here). */
453
+ salarySampleCount: number;
447
454
  links: components["schemas"]["PublicCompanyLinks"];
448
455
  };
449
456
  CompanyPublicDetail: components["schemas"]["CompanyPublic"] & {
@@ -510,6 +517,28 @@ interface components {
510
517
  boardP75Max: number | null;
511
518
  currency: string;
512
519
  };
520
+ CompanySalarySummary: {
521
+ /** @enum {string} */
522
+ object: "company_salary_summary";
523
+ companyName: string;
524
+ companySlug: string;
525
+ overallSalary: {
526
+ avgMin: number;
527
+ avgMax: number;
528
+ jobCount: number;
529
+ } | null;
530
+ /** @description Top job categories at the company by sample size (capped; full list is on CompanySalary.byCategory). Category names/slugs are board-language localized. */
531
+ topCategories: {
532
+ categorySlug: string;
533
+ categoryName: string;
534
+ avgSalaryMin: number;
535
+ avgSalaryMax: number;
536
+ jobCount: number;
537
+ }[];
538
+ /** @description Jobs contributing to this company's salary aggregates (same meaning as CompanyPublic.salarySampleCount / overallSalary.jobCount). */
539
+ sampleCount: number;
540
+ currency: string;
541
+ };
513
542
  CompanySuggestion: {
514
543
  /** @enum {string} */
515
544
  object: "suggestion";
@@ -868,7 +897,7 @@ interface components {
868
897
  */
869
898
  employmentType?: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other";
870
899
  /**
871
- * @description Whether the role is on-site, hybrid, or fully remote.
900
+ * @description Whether the role is on-site, hybrid, or fully remote. **Never valid on its own:** `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST). Sending it alone returns `400`.
872
901
  * @enum {string}
873
902
  */
874
903
  remoteOption?: "on_site" | "hybrid" | "remote";
@@ -1113,7 +1142,7 @@ interface components {
1113
1142
  */
1114
1143
  employmentType?: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other";
1115
1144
  /**
1116
- * @description Whether the role is on-site, hybrid, or fully remote.
1145
+ * @description Whether the role is on-site, hybrid, or fully remote. **Never valid on its own:** `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST). Sending it alone returns `400`.
1117
1146
  * @enum {string}
1118
1147
  */
1119
1148
  remoteOption?: "on_site" | "hybrid" | "remote";
@@ -1665,7 +1694,17 @@ interface components {
1665
1694
  name: string;
1666
1695
  /** @description Board language (ISO code); defaults to "en". */
1667
1696
  language: string;
1697
+ /** @description Absolute URL for the board logo, or null when unset. Operators set this under Settings → General (upload or logo generator); the website builder can manage it too. */
1668
1698
  logoUrl: string | null;
1699
+ /** @description Absolute URLs for the favicon / app-icon pack derived from the board logo (null when a variant is unset). Brand identity next to `logoUrl` — build `<link rel="icon">` tags and the web-manifest icon list from these. Not SEO infra (`board.seo()`). */
1700
+ icons: {
1701
+ ico: string | null;
1702
+ svg: string | null;
1703
+ appleTouch: string | null;
1704
+ icon192: string | null;
1705
+ icon512: string | null;
1706
+ iconMaskable512: string | null;
1707
+ };
1669
1708
  /** @description Active custom-domain hostname, or null. */
1670
1709
  primaryDomain: string | null;
1671
1710
  /** @description Whitelabel toggle (default `true`). Render the "Powered by Cavuno" badge unless `false`. */
@@ -1941,6 +1980,8 @@ interface components {
1941
1980
  salaryCurrency: string | null;
1942
1981
  salaryTimeframe: string | null;
1943
1982
  isFeatured: boolean;
1983
+ /** @description Plain-text card teaser derived from the job description (HTML stripped, first sentence / word-boundary cut). `null` when there is nothing honest to show. Always present — independent of the `?fields=+description` opt-in for the long-form HTML body. Prefer this over requesting `+description` for list/card renders. */
1984
+ summary: string | null;
1944
1985
  locationLabel: string | null;
1945
1986
  /** @description Embedded company summary, or `null` if none is attached. */
1946
1987
  company: {
@@ -2403,6 +2444,12 @@ interface components {
2403
2444
  headline: string | null;
2404
2445
  location: string | null;
2405
2446
  avatarUrl: string | null;
2447
+ /** @description Plain-text card teaser derived from `bio` (HTML stripped, first sentence / word-boundary cut). `null` when there is nothing honest to show. Prefer this over `bio` for directory/card renders; cards still lead with `headline` when present. */
2448
+ summary: string | null;
2449
+ /**
2450
+ * @deprecated
2451
+ * @description Long-form candidate bio. **Deprecated on directory entries** — prefer `summary` for card teasers. Still the full prose on the talent profile detail (`GET …/talent/{handle}`).
2452
+ */
2406
2453
  bio: string | null;
2407
2454
  jobSearchStatus: string | null;
2408
2455
  skills: string[];
@@ -438,12 +438,19 @@ interface components {
438
438
  website: string | null;
439
439
  /** @description URL of the company logo, or `null` if no logo is set. */
440
440
  logoUrl: string | null;
441
- /** @description Long-form description of the company, or `null` if not set. */
441
+ /** @description Plain-text card teaser: the operator-authored company summary when set, otherwise a derived teaser from the long-form description (HTML stripped, first sentence / word-boundary cut). `null` when neither yields anything. Prefer this over `description` for list/card renders. */
442
+ summary: string | null;
443
+ /**
444
+ * @deprecated
445
+ * @description Long-form description of the company (HTML), or `null` if not set. **Deprecated on list/search/similar responses** — prefer `summary` for card teasers. Still the full prose for detail pages (`GET …/companies/{slug}`).
446
+ */
442
447
  description: string | null;
443
448
  /** @description Total number of public-facing jobs at this company. Currently mirrors `publishedJobCount`. */
444
449
  jobCount: number;
445
450
  /** @description Number of currently-published, non-expired jobs at this company. */
446
451
  publishedJobCount: number;
452
+ /** @description Number of jobs that contribute to this company's salary aggregates on the board (the salary sample size). `0` when there is no usable salary data — prefer this over fetching the full company-salary document just to decide whether to show a Salaries tab. Not the same as `publishedJobCount` (open roles without pay data stay at 0 here). */
453
+ salarySampleCount: number;
447
454
  links: components["schemas"]["PublicCompanyLinks"];
448
455
  };
449
456
  CompanyPublicDetail: components["schemas"]["CompanyPublic"] & {
@@ -510,6 +517,28 @@ interface components {
510
517
  boardP75Max: number | null;
511
518
  currency: string;
512
519
  };
520
+ CompanySalarySummary: {
521
+ /** @enum {string} */
522
+ object: "company_salary_summary";
523
+ companyName: string;
524
+ companySlug: string;
525
+ overallSalary: {
526
+ avgMin: number;
527
+ avgMax: number;
528
+ jobCount: number;
529
+ } | null;
530
+ /** @description Top job categories at the company by sample size (capped; full list is on CompanySalary.byCategory). Category names/slugs are board-language localized. */
531
+ topCategories: {
532
+ categorySlug: string;
533
+ categoryName: string;
534
+ avgSalaryMin: number;
535
+ avgSalaryMax: number;
536
+ jobCount: number;
537
+ }[];
538
+ /** @description Jobs contributing to this company's salary aggregates (same meaning as CompanyPublic.salarySampleCount / overallSalary.jobCount). */
539
+ sampleCount: number;
540
+ currency: string;
541
+ };
513
542
  CompanySuggestion: {
514
543
  /** @enum {string} */
515
544
  object: "suggestion";
@@ -868,7 +897,7 @@ interface components {
868
897
  */
869
898
  employmentType?: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other";
870
899
  /**
871
- * @description Whether the role is on-site, hybrid, or fully remote.
900
+ * @description Whether the role is on-site, hybrid, or fully remote. **Never valid on its own:** `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST). Sending it alone returns `400`.
872
901
  * @enum {string}
873
902
  */
874
903
  remoteOption?: "on_site" | "hybrid" | "remote";
@@ -1113,7 +1142,7 @@ interface components {
1113
1142
  */
1114
1143
  employmentType?: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other";
1115
1144
  /**
1116
- * @description Whether the role is on-site, hybrid, or fully remote.
1145
+ * @description Whether the role is on-site, hybrid, or fully remote. **Never valid on its own:** `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST). Sending it alone returns `400`.
1117
1146
  * @enum {string}
1118
1147
  */
1119
1148
  remoteOption?: "on_site" | "hybrid" | "remote";
@@ -1665,7 +1694,17 @@ interface components {
1665
1694
  name: string;
1666
1695
  /** @description Board language (ISO code); defaults to "en". */
1667
1696
  language: string;
1697
+ /** @description Absolute URL for the board logo, or null when unset. Operators set this under Settings → General (upload or logo generator); the website builder can manage it too. */
1668
1698
  logoUrl: string | null;
1699
+ /** @description Absolute URLs for the favicon / app-icon pack derived from the board logo (null when a variant is unset). Brand identity next to `logoUrl` — build `<link rel="icon">` tags and the web-manifest icon list from these. Not SEO infra (`board.seo()`). */
1700
+ icons: {
1701
+ ico: string | null;
1702
+ svg: string | null;
1703
+ appleTouch: string | null;
1704
+ icon192: string | null;
1705
+ icon512: string | null;
1706
+ iconMaskable512: string | null;
1707
+ };
1669
1708
  /** @description Active custom-domain hostname, or null. */
1670
1709
  primaryDomain: string | null;
1671
1710
  /** @description Whitelabel toggle (default `true`). Render the "Powered by Cavuno" badge unless `false`. */
@@ -1941,6 +1980,8 @@ interface components {
1941
1980
  salaryCurrency: string | null;
1942
1981
  salaryTimeframe: string | null;
1943
1982
  isFeatured: boolean;
1983
+ /** @description Plain-text card teaser derived from the job description (HTML stripped, first sentence / word-boundary cut). `null` when there is nothing honest to show. Always present — independent of the `?fields=+description` opt-in for the long-form HTML body. Prefer this over requesting `+description` for list/card renders. */
1984
+ summary: string | null;
1944
1985
  locationLabel: string | null;
1945
1986
  /** @description Embedded company summary, or `null` if none is attached. */
1946
1987
  company: {
@@ -2403,6 +2444,12 @@ interface components {
2403
2444
  headline: string | null;
2404
2445
  location: string | null;
2405
2446
  avatarUrl: string | null;
2447
+ /** @description Plain-text card teaser derived from `bio` (HTML stripped, first sentence / word-boundary cut). `null` when there is nothing honest to show. Prefer this over `bio` for directory/card renders; cards still lead with `headline` when present. */
2448
+ summary: string | null;
2449
+ /**
2450
+ * @deprecated
2451
+ * @description Long-form candidate bio. **Deprecated on directory entries** — prefer `summary` for card teasers. Still the full prose on the talent profile detail (`GET …/talent/{handle}`).
2452
+ */
2406
2453
  bio: string | null;
2407
2454
  jobSearchStatus: string | null;
2408
2455
  skills: string[];
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.mjs';
1
+ import { S as Schemas } from './_spec-CT7rWhQ-.mjs';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.js';
1
+ import { S as Schemas } from './_spec-CT7rWhQ-.js';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.js';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-BbLJfz1z.js';
1
+ import { S as Schemas } from './_spec-CT7rWhQ-.mjs';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-CZUpStJ3.mjs';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -12,6 +12,13 @@ type PublicCompanyDetail = Schemas['CompanyPublicDetail'];
12
12
  * Names are board-language localized; the company slug/name are not.
13
13
  */
14
14
  type CompanySalary = Schemas['CompanySalary'];
15
+ /**
16
+ * Lightweight company salary teaser for profile / overview UIs: overall pay
17
+ * numbers, top categories, currency, and sampleCount. Prefer over
18
+ * `CompanySalary` when you only need a teaser. Format ranges and multi-locale
19
+ * UI strings in the app.
20
+ */
21
+ type CompanySalarySummary = Schemas['CompanySalarySummary'];
15
22
  /**
16
23
  * A company's salary for one job category: the category's source + board-language
17
24
  * canonical slug, by-seniority vs the board-category baseline, and competitors in
@@ -102,4 +109,4 @@ type CustomFieldDefinition = Schemas['CustomFieldDefinition'];
102
109
  type CustomFieldType = CustomFieldDefinition['type'];
103
110
  type CustomFieldOption = Schemas['CustomFieldOption'];
104
111
 
105
- export type { TitleLocationsIndex as A, CustomFieldDefinition as C, LocationSalaryDetail as L, PublicBoard as P, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, CompanyMarket as j, CompanyMarketRef as k, CustomFieldOption as l, CustomFieldType as m, LocationSkillsIndex as n, LocationTitlesIndex as o, PublicBoardAnalytics as p, PublicBoardFeatures as q, PublicCompany as r, PublicCompanyDetail as s, SalaryCompany as t, SalaryLocation as u, SalarySkill as v, SalaryTitle as w, SkillLocationSalary as x, SkillLocationsIndex as y, TitleLocationSalary as z };
112
+ export type { TitleLocationSalary as A, TitleLocationsIndex as B, CustomFieldDefinition as C, LocationSalaryDetail as L, PublicBoard as P, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, CompanyMarket as j, CompanyMarketRef as k, CompanySalarySummary as l, CustomFieldOption as m, CustomFieldType as n, LocationSkillsIndex as o, LocationTitlesIndex as p, PublicBoardAnalytics as q, PublicBoardFeatures as r, PublicCompany as s, PublicCompanyDetail as t, SalaryCompany as u, SalaryLocation as v, SalarySkill as w, SalaryTitle as x, SkillLocationSalary as y, SkillLocationsIndex as z };
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.mjs';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-BX6d_sdd.mjs';
1
+ import { S as Schemas } from './_spec-CT7rWhQ-.js';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-Cf7J5vJe.js';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -12,6 +12,13 @@ type PublicCompanyDetail = Schemas['CompanyPublicDetail'];
12
12
  * Names are board-language localized; the company slug/name are not.
13
13
  */
14
14
  type CompanySalary = Schemas['CompanySalary'];
15
+ /**
16
+ * Lightweight company salary teaser for profile / overview UIs: overall pay
17
+ * numbers, top categories, currency, and sampleCount. Prefer over
18
+ * `CompanySalary` when you only need a teaser. Format ranges and multi-locale
19
+ * UI strings in the app.
20
+ */
21
+ type CompanySalarySummary = Schemas['CompanySalarySummary'];
15
22
  /**
16
23
  * A company's salary for one job category: the category's source + board-language
17
24
  * canonical slug, by-seniority vs the board-category baseline, and competitors in
@@ -102,4 +109,4 @@ type CustomFieldDefinition = Schemas['CustomFieldDefinition'];
102
109
  type CustomFieldType = CustomFieldDefinition['type'];
103
110
  type CustomFieldOption = Schemas['CustomFieldOption'];
104
111
 
105
- export type { TitleLocationsIndex as A, CustomFieldDefinition as C, LocationSalaryDetail as L, PublicBoard as P, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, CompanyMarket as j, CompanyMarketRef as k, CustomFieldOption as l, CustomFieldType as m, LocationSkillsIndex as n, LocationTitlesIndex as o, PublicBoardAnalytics as p, PublicBoardFeatures as q, PublicCompany as r, PublicCompanyDetail as s, SalaryCompany as t, SalaryLocation as u, SalarySkill as v, SalaryTitle as w, SkillLocationSalary as x, SkillLocationsIndex as y, TitleLocationSalary as z };
112
+ export type { TitleLocationSalary as A, TitleLocationsIndex as B, CustomFieldDefinition as C, LocationSalaryDetail as L, PublicBoard as P, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, CompanyMarket as j, CompanyMarketRef as k, CompanySalarySummary as l, CustomFieldOption as m, CustomFieldType as n, LocationSkillsIndex as o, LocationTitlesIndex as p, PublicBoardAnalytics as q, PublicBoardFeatures as r, PublicCompany as s, PublicCompanyDetail as t, SalaryCompany as u, SalaryLocation as v, SalarySkill as w, SalaryTitle as x, SkillLocationSalary as y, SkillLocationsIndex as z };
@@ -1,5 +1,5 @@
1
- import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BF3Qao6J.mjs';
2
- import { P as PublicJob } from './jobs-BX6d_sdd.mjs';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BLwReKB8.mjs';
2
+ import { P as PublicJob } from './jobs-CZUpStJ3.mjs';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
@@ -1,5 +1,5 @@
1
- import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BTEZ0uiI.js';
2
- import { P as PublicJob } from './jobs-BbLJfz1z.js';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-O990tPTt.js';
2
+ import { P as PublicJob } from './jobs-Cf7J5vJe.js';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
@@ -1,5 +1,5 @@
1
- import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-BX6d_sdd.mjs';
2
- import './_spec-BZDv2dc5.mjs';
1
+ import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-CZUpStJ3.mjs';
2
+ import './_spec-CT7rWhQ-.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-BbLJfz1z.js';
2
- import './_spec-BZDv2dc5.js';
1
+ import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-Cf7J5vJe.js';
2
+ import './_spec-CT7rWhQ-.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-icxRVydh.mjs';
2
- import { C as CustomFieldDefinition } from './board-BF3Qao6J.mjs';
3
- import { C as CustomFieldValues } from './jobs-BX6d_sdd.mjs';
4
- import './_spec-BZDv2dc5.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-CQjU_wHB.mjs';
2
+ import { C as CustomFieldDefinition } from './board-BLwReKB8.mjs';
3
+ import { C as CustomFieldValues } from './jobs-CZUpStJ3.mjs';
4
+ import './_spec-CT7rWhQ-.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-SGaWth6C.js';
2
- import { C as CustomFieldDefinition } from './board-BTEZ0uiI.js';
3
- import { C as CustomFieldValues } from './jobs-BbLJfz1z.js';
4
- import './_spec-BZDv2dc5.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-ClvafKXZ.js';
2
+ import { C as CustomFieldDefinition } from './board-O990tPTt.js';
3
+ import { C as CustomFieldValues } from './jobs-Cf7J5vJe.js';
4
+ import './_spec-CT7rWhQ-.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,12 @@
1
- import { S as Schemas, c as components } from './_spec-BZDv2dc5.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-OKrdAHv8.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-OKrdAHv8.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-BF3Qao6J.mjs';
5
- export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, C as CustomFieldDefinition, l as CustomFieldOption, m as CustomFieldType, L as LocationSalaryDetail, n as LocationSkillsIndex, o as LocationTitlesIndex, P as PublicBoard, p as PublicBoardAnalytics, q as PublicBoardFeatures, r as PublicCompany, s as PublicCompanyDetail, t as SalaryCompany, u as SalaryLocation, v as SalarySkill, w as SalaryTitle, x as SkillLocationSalary, y as SkillLocationsIndex, S as SkillSalaryDetail, z as TitleLocationSalary, A as TitleLocationsIndex, T as TitleSalaryDetail } from './board-BF3Qao6J.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-BX6d_sdd.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-BX6d_sdd.mjs';
8
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-DyDvyQrI.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-DyDvyQrI.mjs';
1
+ import { S as Schemas, c as components } from './_spec-CT7rWhQ-.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-CHLEpKE5.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-CHLEpKE5.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-BLwReKB8.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-BLwReKB8.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-CZUpStJ3.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-CZUpStJ3.mjs';
8
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-CJda3-Ab.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-CJda3-Ab.mjs';
10
10
 
11
11
  /**
12
12
  * Well-known `<domain>_<snake_reason>` codes the Board API sends, grouped by
@@ -142,7 +142,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
142
142
  * constant because the package is platform-neutral and cannot read
143
143
  * package.json at runtime.
144
144
  */
145
- declare const SDK_VERSION = "4.1.0";
145
+ declare const SDK_VERSION = "4.3.0";
146
146
 
147
147
  type SavedJob = Schemas['SavedJob'];
148
148
  type SavedJobsListQuery = {
@@ -679,10 +679,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
679
679
  */
680
680
  client: BoardClient;
681
681
  /**
682
- * Board context — identity, language, features, and analytics.
682
+ * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
683
+ * features, and analytics.
683
684
  *
684
685
  * @example
685
- * const { name, language } = await board.context();
686
+ * const { name, language, logoUrl, icons } = await board.context();
686
687
  */
687
688
  context(options?: FetchOptions): Promise<{
688
689
  object: "public_board";
@@ -691,6 +692,14 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
691
692
  name: string;
692
693
  language: string;
693
694
  logoUrl: string | null;
695
+ icons: {
696
+ ico: string | null;
697
+ svg: string | null;
698
+ appleTouch: string | null;
699
+ icon192: string | null;
700
+ icon512: string | null;
701
+ iconMaskable512: string | null;
702
+ };
694
703
  primaryDomain: string | null;
695
704
  showCavunoBranding: boolean;
696
705
  features: {
@@ -726,9 +735,9 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
726
735
  };
727
736
  }>;
728
737
  /**
729
- * Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
730
- * the canonical base URL. Rebuild `robots.txt` / `ads.txt` /
731
- * `indexnow-key.txt` from it.
738
+ * Board SEO infra tokens — `ads.txt`, IndexNow key, Google site-verification,
739
+ * canonical base URL, and `manifest.name`. Favicon / app-icon URLs are
740
+ * brand identity on `board.context()` (`logoUrl` + `icons`).
732
741
  *
733
742
  * @example
734
743
  * const { adsTxt, canonicalBase } = await board.seo();
@@ -821,6 +830,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
821
830
  salaryCurrency: string | null;
822
831
  salaryTimeframe: string | null;
823
832
  isFeatured: boolean;
833
+ summary: string | null;
824
834
  locationLabel: string | null;
825
835
  company: {
826
836
  slug: string;
@@ -920,6 +930,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
920
930
  salaryCurrency: string | null;
921
931
  salaryTimeframe: string | null;
922
932
  isFeatured: boolean;
933
+ summary: string | null;
923
934
  locationLabel: string | null;
924
935
  company: {
925
936
  slug: string;
@@ -949,9 +960,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
949
960
  slug: string;
950
961
  website: string | null;
951
962
  logoUrl: string | null;
963
+ summary: string | null;
952
964
  description: string | null;
953
965
  jobCount: number;
954
966
  publishedJobCount: number;
967
+ salarySampleCount: number;
955
968
  links: components["schemas"]["PublicCompanyLinks"];
956
969
  } & {
957
970
  markets: components["schemas"]["CompanyMarketRef"][];
@@ -963,9 +976,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
963
976
  slug: string;
964
977
  website: string | null;
965
978
  logoUrl: string | null;
979
+ summary: string | null;
966
980
  description: string | null;
967
981
  jobCount: number;
968
982
  publishedJobCount: number;
983
+ salarySampleCount: number;
969
984
  links: components["schemas"]["PublicCompanyLinks"];
970
985
  }>>;
971
986
  listJobs(companySlug: string, query?: CompanyJobsListQuery, options?: FetchOptions): Promise<JobCardListEnvelope>;
@@ -976,9 +991,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
976
991
  slug: string;
977
992
  website: string | null;
978
993
  logoUrl: string | null;
994
+ summary: string | null;
979
995
  description: string | null;
980
996
  jobCount: number;
981
997
  publishedJobCount: number;
998
+ salarySampleCount: number;
982
999
  links: components["schemas"]["PublicCompanyLinks"];
983
1000
  }>>;
984
1001
  markets: ((query?: CompanyMarketsListQuery, options?: FetchOptions) => Promise<ListEnvelope<{
@@ -1056,6 +1073,25 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1056
1073
  boardP75Max: number | null;
1057
1074
  currency: string;
1058
1075
  }>) & {
1076
+ summary(companySlug: string, options?: FetchOptions): Promise<{
1077
+ object: "company_salary_summary";
1078
+ companyName: string;
1079
+ companySlug: string;
1080
+ overallSalary: {
1081
+ avgMin: number;
1082
+ avgMax: number;
1083
+ jobCount: number;
1084
+ } | null;
1085
+ topCategories: {
1086
+ categorySlug: string;
1087
+ categoryName: string;
1088
+ avgSalaryMin: number;
1089
+ avgSalaryMax: number;
1090
+ jobCount: number;
1091
+ }[];
1092
+ sampleCount: number;
1093
+ currency: string;
1094
+ }>;
1059
1095
  category(companySlug: string, categorySlug: string, query?: SalaryDetailQuery, options?: FetchOptions): Promise<{
1060
1096
  object: "company_category_salary";
1061
1097
  categorySourceSlug: string;
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- import { S as Schemas, c as components } from './_spec-BZDv2dc5.js';
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-7B-mVRNA.js';
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-7B-mVRNA.js';
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-BTEZ0uiI.js';
5
- export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, C as CustomFieldDefinition, l as CustomFieldOption, m as CustomFieldType, L as LocationSalaryDetail, n as LocationSkillsIndex, o as LocationTitlesIndex, P as PublicBoard, p as PublicBoardAnalytics, q as PublicBoardFeatures, r as PublicCompany, s as PublicCompanyDetail, t as SalaryCompany, u as SalaryLocation, v as SalarySkill, w as SalaryTitle, x as SkillLocationSalary, y as SkillLocationsIndex, S as SkillSalaryDetail, z as TitleLocationSalary, A as TitleLocationsIndex, T as TitleSalaryDetail } from './board-BTEZ0uiI.js';
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-BbLJfz1z.js';
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-BbLJfz1z.js';
8
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-BHx6iH3Z.js';
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-BHx6iH3Z.js';
1
+ import { S as Schemas, c as components } from './_spec-CT7rWhQ-.js';
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-YWruydKJ.js';
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-YWruydKJ.js';
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-O990tPTt.js';
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-O990tPTt.js';
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-Cf7J5vJe.js';
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-Cf7J5vJe.js';
8
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-DOBig1Wh.js';
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-DOBig1Wh.js';
10
10
 
11
11
  /**
12
12
  * Well-known `<domain>_<snake_reason>` codes the Board API sends, grouped by
@@ -142,7 +142,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
142
142
  * constant because the package is platform-neutral and cannot read
143
143
  * package.json at runtime.
144
144
  */
145
- declare const SDK_VERSION = "4.1.0";
145
+ declare const SDK_VERSION = "4.3.0";
146
146
 
147
147
  type SavedJob = Schemas['SavedJob'];
148
148
  type SavedJobsListQuery = {
@@ -679,10 +679,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
679
679
  */
680
680
  client: BoardClient;
681
681
  /**
682
- * Board context — identity, language, features, and analytics.
682
+ * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
683
+ * features, and analytics.
683
684
  *
684
685
  * @example
685
- * const { name, language } = await board.context();
686
+ * const { name, language, logoUrl, icons } = await board.context();
686
687
  */
687
688
  context(options?: FetchOptions): Promise<{
688
689
  object: "public_board";
@@ -691,6 +692,14 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
691
692
  name: string;
692
693
  language: string;
693
694
  logoUrl: string | null;
695
+ icons: {
696
+ ico: string | null;
697
+ svg: string | null;
698
+ appleTouch: string | null;
699
+ icon192: string | null;
700
+ icon512: string | null;
701
+ iconMaskable512: string | null;
702
+ };
694
703
  primaryDomain: string | null;
695
704
  showCavunoBranding: boolean;
696
705
  features: {
@@ -726,9 +735,9 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
726
735
  };
727
736
  }>;
728
737
  /**
729
- * Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
730
- * the canonical base URL. Rebuild `robots.txt` / `ads.txt` /
731
- * `indexnow-key.txt` from it.
738
+ * Board SEO infra tokens — `ads.txt`, IndexNow key, Google site-verification,
739
+ * canonical base URL, and `manifest.name`. Favicon / app-icon URLs are
740
+ * brand identity on `board.context()` (`logoUrl` + `icons`).
732
741
  *
733
742
  * @example
734
743
  * const { adsTxt, canonicalBase } = await board.seo();
@@ -821,6 +830,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
821
830
  salaryCurrency: string | null;
822
831
  salaryTimeframe: string | null;
823
832
  isFeatured: boolean;
833
+ summary: string | null;
824
834
  locationLabel: string | null;
825
835
  company: {
826
836
  slug: string;
@@ -920,6 +930,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
920
930
  salaryCurrency: string | null;
921
931
  salaryTimeframe: string | null;
922
932
  isFeatured: boolean;
933
+ summary: string | null;
923
934
  locationLabel: string | null;
924
935
  company: {
925
936
  slug: string;
@@ -949,9 +960,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
949
960
  slug: string;
950
961
  website: string | null;
951
962
  logoUrl: string | null;
963
+ summary: string | null;
952
964
  description: string | null;
953
965
  jobCount: number;
954
966
  publishedJobCount: number;
967
+ salarySampleCount: number;
955
968
  links: components["schemas"]["PublicCompanyLinks"];
956
969
  } & {
957
970
  markets: components["schemas"]["CompanyMarketRef"][];
@@ -963,9 +976,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
963
976
  slug: string;
964
977
  website: string | null;
965
978
  logoUrl: string | null;
979
+ summary: string | null;
966
980
  description: string | null;
967
981
  jobCount: number;
968
982
  publishedJobCount: number;
983
+ salarySampleCount: number;
969
984
  links: components["schemas"]["PublicCompanyLinks"];
970
985
  }>>;
971
986
  listJobs(companySlug: string, query?: CompanyJobsListQuery, options?: FetchOptions): Promise<JobCardListEnvelope>;
@@ -976,9 +991,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
976
991
  slug: string;
977
992
  website: string | null;
978
993
  logoUrl: string | null;
994
+ summary: string | null;
979
995
  description: string | null;
980
996
  jobCount: number;
981
997
  publishedJobCount: number;
998
+ salarySampleCount: number;
982
999
  links: components["schemas"]["PublicCompanyLinks"];
983
1000
  }>>;
984
1001
  markets: ((query?: CompanyMarketsListQuery, options?: FetchOptions) => Promise<ListEnvelope<{
@@ -1056,6 +1073,25 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1056
1073
  boardP75Max: number | null;
1057
1074
  currency: string;
1058
1075
  }>) & {
1076
+ summary(companySlug: string, options?: FetchOptions): Promise<{
1077
+ object: "company_salary_summary";
1078
+ companyName: string;
1079
+ companySlug: string;
1080
+ overallSalary: {
1081
+ avgMin: number;
1082
+ avgMax: number;
1083
+ jobCount: number;
1084
+ } | null;
1085
+ topCategories: {
1086
+ categorySlug: string;
1087
+ categoryName: string;
1088
+ avgSalaryMin: number;
1089
+ avgSalaryMax: number;
1090
+ jobCount: number;
1091
+ }[];
1092
+ sampleCount: number;
1093
+ currency: string;
1094
+ }>;
1059
1095
  category(companySlug: string, categorySlug: string, query?: SalaryDetailQuery, options?: FetchOptions): Promise<{
1060
1096
  object: "company_category_salary";
1061
1097
  categorySourceSlug: string;
package/dist/index.js CHANGED
@@ -312,7 +312,7 @@ async function clearSession(storage) {
312
312
  }
313
313
 
314
314
  // src/version.ts
315
- var SDK_VERSION = "4.1.0";
315
+ var SDK_VERSION = "4.3.0";
316
316
 
317
317
  // src/client.ts
318
318
  function isRawBody(body) {
@@ -776,6 +776,12 @@ function companiesNamespace(client) {
776
776
  options
777
777
  ),
778
778
  {
779
+ summary(companySlug, options) {
780
+ return client.fetch(
781
+ `/companies/${encodeURIComponent(companySlug)}/salaries/summary`,
782
+ options
783
+ );
784
+ },
779
785
  category(companySlug, categorySlug, query, options) {
780
786
  return client.fetch(
781
787
  `/companies/${encodeURIComponent(companySlug)}/salaries/${encodeURIComponent(categorySlug)}`,
@@ -2840,18 +2846,19 @@ function createBoardClient(options) {
2840
2846
  */
2841
2847
  client,
2842
2848
  /**
2843
- * Board context — identity, language, features, and analytics.
2849
+ * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
2850
+ * features, and analytics.
2844
2851
  *
2845
2852
  * @example
2846
- * const { name, language } = await board.context();
2853
+ * const { name, language, logoUrl, icons } = await board.context();
2847
2854
  */
2848
2855
  context(options2) {
2849
2856
  return client.fetch("", options2);
2850
2857
  },
2851
2858
  /**
2852
- * Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
2853
- * the canonical base URL. Rebuild `robots.txt` / `ads.txt` /
2854
- * `indexnow-key.txt` from it.
2859
+ * Board SEO infra tokens — `ads.txt`, IndexNow key, Google site-verification,
2860
+ * canonical base URL, and `manifest.name`. Favicon / app-icon URLs are
2861
+ * brand identity on `board.context()` (`logoUrl` + `icons`).
2855
2862
  *
2856
2863
  * @example
2857
2864
  * const { adsTxt, canonicalBase } = await board.seo();
package/dist/index.mjs CHANGED
@@ -39,7 +39,7 @@ function toSearchParams(query) {
39
39
  }
40
40
 
41
41
  // src/version.ts
42
- var SDK_VERSION = "4.1.0";
42
+ var SDK_VERSION = "4.3.0";
43
43
 
44
44
  // src/client.ts
45
45
  function isRawBody(body) {
@@ -503,6 +503,12 @@ function companiesNamespace(client) {
503
503
  options
504
504
  ),
505
505
  {
506
+ summary(companySlug, options) {
507
+ return client.fetch(
508
+ `/companies/${encodeURIComponent(companySlug)}/salaries/summary`,
509
+ options
510
+ );
511
+ },
506
512
  category(companySlug, categorySlug, query, options) {
507
513
  return client.fetch(
508
514
  `/companies/${encodeURIComponent(companySlug)}/salaries/${encodeURIComponent(categorySlug)}`,
@@ -2537,18 +2543,19 @@ function createBoardClient(options) {
2537
2543
  */
2538
2544
  client,
2539
2545
  /**
2540
- * Board context — identity, language, features, and analytics.
2546
+ * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
2547
+ * features, and analytics.
2541
2548
  *
2542
2549
  * @example
2543
- * const { name, language } = await board.context();
2550
+ * const { name, language, logoUrl, icons } = await board.context();
2544
2551
  */
2545
2552
  context(options2) {
2546
2553
  return client.fetch("", options2);
2547
2554
  },
2548
2555
  /**
2549
- * Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
2550
- * the canonical base URL. Rebuild `robots.txt` / `ads.txt` /
2551
- * `indexnow-key.txt` from it.
2556
+ * Board SEO infra tokens — `ads.txt`, IndexNow key, Google site-verification,
2557
+ * canonical base URL, and `manifest.name`. Favicon / app-icon URLs are
2558
+ * brand identity on `board.context()` (`logoUrl` + `icons`).
2552
2559
  *
2553
2560
  * @example
2554
2561
  * const { adsTxt, canonicalBase } = await board.seo();
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.mjs';
1
+ import { S as Schemas } from './_spec-CT7rWhQ-.mjs';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.js';
1
+ import { S as Schemas } from './_spec-CT7rWhQ-.js';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.mjs';
1
+ import { S as Schemas } from './_spec-CT7rWhQ-.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.js';
1
+ import { S as Schemas } from './_spec-CT7rWhQ-.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
package/dist/seo.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-DyDvyQrI.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-icxRVydh.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-icxRVydh.mjs';
4
- import './_spec-BZDv2dc5.mjs';
5
- import './board-BF3Qao6J.mjs';
6
- import './jobs-BX6d_sdd.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-CJda3-Ab.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-CQjU_wHB.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-CQjU_wHB.mjs';
4
+ import './_spec-CT7rWhQ-.mjs';
5
+ import './board-BLwReKB8.mjs';
6
+ import './jobs-CZUpStJ3.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-BHx6iH3Z.js';
2
- import { e as JsonLdObject } from './breadcrumbs-SGaWth6C.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-SGaWth6C.js';
4
- import './_spec-BZDv2dc5.js';
5
- import './board-BTEZ0uiI.js';
6
- import './jobs-BbLJfz1z.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-DOBig1Wh.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-ClvafKXZ.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-ClvafKXZ.js';
4
+ import './_spec-CT7rWhQ-.js';
5
+ import './board-O990tPTt.js';
6
+ import './jobs-Cf7J5vJe.js';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/server.d.mts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-BZDv2dc5.mjs';
3
- import './search-OKrdAHv8.mjs';
4
- import './board-BF3Qao6J.mjs';
5
- import './jobs-BX6d_sdd.mjs';
6
- import './blog-DyDvyQrI.mjs';
2
+ import './_spec-CT7rWhQ-.mjs';
3
+ import './search-CHLEpKE5.mjs';
4
+ import './board-BLwReKB8.mjs';
5
+ import './jobs-CZUpStJ3.mjs';
6
+ import './blog-CJda3-Ab.mjs';
7
7
 
8
8
  /**
9
9
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-BZDv2dc5.js';
3
- import './search-7B-mVRNA.js';
4
- import './board-BTEZ0uiI.js';
5
- import './jobs-BbLJfz1z.js';
6
- import './blog-BHx6iH3Z.js';
2
+ import './_spec-CT7rWhQ-.js';
3
+ import './search-YWruydKJ.js';
4
+ import './board-O990tPTt.js';
5
+ import './jobs-Cf7J5vJe.js';
6
+ import './blog-DOBig1Wh.js';
7
7
 
8
8
  /**
9
9
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-BZDv2dc5.mjs';
3
- import './search-OKrdAHv8.mjs';
4
- import './board-BF3Qao6J.mjs';
5
- import './jobs-BX6d_sdd.mjs';
6
- import './blog-DyDvyQrI.mjs';
2
+ import './_spec-CT7rWhQ-.mjs';
3
+ import './search-CHLEpKE5.mjs';
4
+ import './board-BLwReKB8.mjs';
5
+ import './jobs-CZUpStJ3.mjs';
6
+ import './blog-CJda3-Ab.mjs';
7
7
 
8
8
  /**
9
9
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-BZDv2dc5.js';
3
- import './search-7B-mVRNA.js';
4
- import './board-BTEZ0uiI.js';
5
- import './jobs-BbLJfz1z.js';
6
- import './blog-BHx6iH3Z.js';
2
+ import './_spec-CT7rWhQ-.js';
3
+ import './search-YWruydKJ.js';
4
+ import './board-O990tPTt.js';
5
+ import './jobs-Cf7J5vJe.js';
6
+ import './blog-DOBig1Wh.js';
7
7
 
8
8
  /**
9
9
  * 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-OKrdAHv8.mjs';
2
- import './_spec-BZDv2dc5.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-CHLEpKE5.mjs';
2
+ import './_spec-CT7rWhQ-.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-7B-mVRNA.js';
2
- import './_spec-BZDv2dc5.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-YWruydKJ.js';
2
+ import './_spec-CT7rWhQ-.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.1.0",
3
+ "version": "4.3.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -80,12 +80,23 @@ the current company, and ranks by open roles. Fetch `retrieve` before reading
80
80
 
81
81
  ## Render company salaries
82
82
 
83
- `companies.salaries` is callable and carries `.category`. The overview returns
84
- `CompanySalary`: nullable `overallSalary`, `bySeniority` rows with board
85
- comparison `diffPercent`, `competitors`, `topLocations`, `byCategory`,
86
- board-wide baselines, and `currency`.
83
+ `companies.salaries` is callable and carries `.summary` and `.category`.
84
+
85
+ For a profile / overview teaser, prefer `.summary` — it returns
86
+ `CompanySalarySummary` (overall numbers, top categories, `sampleCount`,
87
+ `currency`) without seniority, competitors, locations, or logos. Format
88
+ currency ranges and multi-locale UI strings in the app.
89
+
90
+ The full overview returns `CompanySalary`: nullable `overallSalary`,
91
+ `bySeniority` rows with board comparison `diffPercent`, `competitors`,
92
+ `topLocations`, `byCategory`, board-wide baselines, and `currency`.
87
93
 
88
94
  ```ts snippet
95
+ const teaser = await board.companies.salaries.summary('acme');
96
+ teaser.overallSalary;
97
+ teaser.topCategories;
98
+ teaser.sampleCount;
99
+
89
100
  const overview = await board.companies.salaries('acme');
90
101
  overview.bySeniority[0]?.diffPercent;
91
102
 
@@ -97,11 +108,12 @@ category.categorySourceSlug;
97
108
  category.categoryCanonicalSlug;
98
109
  ```
99
110
 
100
- Pass `{ locale }` for board-language category names. Company identity remains
101
- untranslated. The API returns both the immutable English
111
+ Pass `{ locale }` for board-language category names on `.category`. Company
112
+ identity remains untranslated. The API returns both the immutable English
102
113
  `categorySourceSlug` and the board-language `categoryCanonicalSlug`; the host
103
114
  route issues a 308 when the inbound category slug differs from the canonical
104
- one.
115
+ one. Gate a Salaries tab with `company.salarySampleCount > 0` from
116
+ `companies.retrieve` rather than fetching salary documents just for presence.
105
117
 
106
118
  ## Completion gate
107
119
 
@@ -19,6 +19,18 @@ Read the matching reference completely before implementing that page:
19
19
 
20
20
  For a page that combines branches, read every matching reference.
21
21
 
22
+ ## Favicons and board logo
23
+
24
+ Brand identity — not SEO builders. Read them from `board.context()`:
25
+
26
+ ```ts
27
+ const { logoUrl, icons } = await board.context();
28
+ // logoUrl — board logo
29
+ // icons.ico / .svg / .appleTouch / .icon192 / .icon512 / .iconMaskable512
30
+ ```
31
+
32
+ `board.seo()` is infra tokens only (ads, IndexNow, verification, canonical base, optional `manifest.name`).
33
+
22
34
  Sitemaps and robots.txt use `cavuno-board-sitemap`. The host app owns OG-image
23
35
  generation and its route map. `listingHead` receives app-owned title and
24
36
  meta description copy; the SDK never composes those sentences or joins
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.1.0",
2
+ "version": "4.3.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",