@cavuno/board 4.48.0 → 4.50.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 (39) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +19 -0
  3. package/dist/{_spec-Fw9b79TI.d.mts → _spec-Dvlsj5V6.d.mts} +12 -2
  4. package/dist/{_spec-Fw9b79TI.d.ts → _spec-Dvlsj5V6.d.ts} +12 -2
  5. package/dist/{blog-Dlyky5Eo.d.mts → blog-DhlbCKam.d.mts} +1 -1
  6. package/dist/{blog-DldIXX6n.d.ts → blog-WtDJZV-Z.d.ts} +1 -1
  7. package/dist/{board-B1Ueww2w.d.ts → board-BiKb5_ZM.d.ts} +2 -2
  8. package/dist/{board-DkwbMZdt.d.mts → board-CIbqqcEg.d.mts} +2 -2
  9. package/dist/{breadcrumbs-Bj8SieZi.d.mts → breadcrumbs-212hOj5L.d.mts} +2 -2
  10. package/dist/{breadcrumbs-CzFiddAt.d.ts → breadcrumbs-B0QBK24H.d.ts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/filters.d.mts +2 -2
  13. package/dist/filters.d.ts +2 -2
  14. package/dist/format.d.mts +4 -4
  15. package/dist/format.d.ts +4 -4
  16. package/dist/index.d.mts +60 -15
  17. package/dist/index.d.ts +60 -15
  18. package/dist/index.js +43 -4
  19. package/dist/index.mjs +43 -4
  20. package/dist/{jobs-rnatMRvm.d.ts → jobs-NgZT_lvs.d.mts} +29 -3
  21. package/dist/{jobs-oSTStcbC.d.mts → jobs-roZu2VmM.d.ts} +29 -3
  22. package/dist/{search-CKvtGE6t.d.ts → search-DGuJBU-G.d.ts} +1 -1
  23. package/dist/{search-uiAE7AFt.d.mts → search-Dlo0GUG5.d.mts} +1 -1
  24. package/dist/{seo-Cz0544dX.d.mts → seo-BDZfybrw.d.mts} +1 -1
  25. package/dist/{seo-C2WvBFEi.d.ts → seo-DcrK1vzk.d.ts} +1 -1
  26. package/dist/seo-files.d.mts +2 -2
  27. package/dist/seo-files.d.ts +2 -2
  28. package/dist/seo.d.mts +6 -6
  29. package/dist/seo.d.ts +6 -6
  30. package/dist/server.d.mts +6 -6
  31. package/dist/server.d.ts +6 -6
  32. package/dist/sitemap.d.mts +6 -6
  33. package/dist/sitemap.d.ts +6 -6
  34. package/dist/suggest.d.mts +2 -2
  35. package/dist/suggest.d.ts +2 -2
  36. package/package.json +1 -1
  37. package/skills/cavuno-board-jobs/SKILL.md +33 -3
  38. package/skills/cavuno-board-setup/SKILL.md +13 -0
  39. package/skills/manifest.json +1 -1
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Fw9b79TI.mjs';
1
+ import { S as Schemas } from './_spec-Dvlsj5V6.js';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -111,9 +111,21 @@ type JobsListQuery = {
111
111
  /**
112
112
  * Widen a city or locality `location` to jobs placed in a city or
113
113
  * locality within this many km of it (1–250, decimals allowed). Omit for
114
- * jobs in the place itself. Ignored for region and country places.
114
+ * jobs in the place itself. Ignored for region and country places. For a
115
+ * place from `taxonomy.places.suggest()`, an omitted radius uses the
116
+ * place's own default distance (15 km neighbourhood, 25 km town, 50 km city).
115
117
  */
116
118
  radius?: number;
119
+ /**
120
+ * With `location` and no `radius`: widen a city or locality to the market
121
+ * default distance (25 mi in the US, GB, LR and MM; 50 km elsewhere),
122
+ * computed from the resolved place. Regions and countries are not
123
+ * widened; an explicit `radius` wins. Saves resolving the place first to
124
+ * pick the radius. A place from `places.suggest` always uses its own
125
+ * default (15 km neighbourhood, 25 km town, 50 km city), with or without
126
+ * this flag.
127
+ */
128
+ defaultRadius?: boolean;
117
129
  /** Category slug seed (the `/jobs/[keyword]` page) — server resolves it to the English source name; unresolvable → 404. */
118
130
  category?: string;
119
131
  /** Skill slug seed (the `/jobs/skills/[skill]` page) — server-resolved; unresolvable → 404. */
@@ -121,6 +133,20 @@ type JobsListQuery = {
121
133
  /** Sparse fieldset (Medusa-style `+field`). Only `'+description'` is supported — adds `description` to each card. */
122
134
  fields?: string;
123
135
  };
136
+ /**
137
+ * An opt-in capability token for `jobs.retrieve`. `apply-gateway-v1` selects
138
+ * the country-gated Apply shape (opaque Sponsored Apply).
139
+ */
140
+ type JobCapability = 'apply-gateway-v1';
141
+ type JobRetrieveQuery = {
142
+ /**
143
+ * Capability opt-ins, sent as the `capabilities` query parameter. Same
144
+ * effect as the `x-cavuno-board-capabilities` header, but the response
145
+ * stays shared-cacheable under its own URL; the header form is never
146
+ * cached.
147
+ */
148
+ capabilities?: JobCapability[];
149
+ };
124
150
  type JobsSimilarQuery = {
125
151
  /** How many similar jobs to return (1–20; default 5). */
126
152
  limit?: number;
@@ -143,4 +169,4 @@ type ObjectReferenceFilter = {
143
169
  */
144
170
  type JobsSearchBody = Schemas['PublicSearchJobsBody'];
145
171
 
146
- export type { CustomFieldValues as C, EmploymentType as E, JobSort as J, ListEnvelope as L, ObjectReferenceFilter as O, PublicJob as P, RemoteOption as R, Seniority as S, CustomFieldFilter as a, JobCollectionChoiceQuery as b, JobsListQuery as c, JobCardListEnvelope as d, JobsSearchBody as e, JobCardSearchEnvelope as f, JobsSimilarQuery as g, SearchEnvelope as h, CustomFieldValue as i, CustomFilterValue as j, EducationRequirement as k, JobCatalogPagination as l, JobCollectionChoiceList as m, JobCollectionFieldDefinition as n, JobCompany as o, JobCustomEmploymentType as p, OfficeLocation as q, OffsetPagination as r, PublicJobCard as s, RelatedSearch as t, RemotePermit as u, RemoteTimezone as v, ResolvedJobCollectionField as w, StorefrontPagination as x };
172
+ export type { CustomFieldValues as C, EmploymentType as E, JobSort as J, ListEnvelope as L, ObjectReferenceFilter as O, PublicJob as P, RemoteOption as R, Seniority as S, CustomFieldFilter as a, JobCollectionChoiceQuery as b, JobsListQuery as c, JobCardListEnvelope as d, JobRetrieveQuery as e, JobsSearchBody as f, JobCardSearchEnvelope as g, JobsSimilarQuery as h, SearchEnvelope as i, CustomFieldValue as j, CustomFilterValue as k, EducationRequirement as l, JobCapability as m, JobCatalogPagination as n, JobCollectionChoiceList as o, JobCollectionFieldDefinition as p, JobCompany as q, JobCustomEmploymentType as r, OfficeLocation as s, OffsetPagination as t, PublicJobCard as u, RelatedSearch as v, RemotePermit as w, RemoteTimezone as x, ResolvedJobCollectionField as y, StorefrontPagination as z };
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Fw9b79TI.js';
1
+ import { S as Schemas } from './_spec-Dvlsj5V6.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Fw9b79TI.mjs';
1
+ import { S as Schemas } from './_spec-Dvlsj5V6.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Fw9b79TI.mjs';
1
+ import { S as Schemas } from './_spec-Dvlsj5V6.mjs';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Fw9b79TI.js';
1
+ import { S as Schemas } from './_spec-Dvlsj5V6.js';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-Cz0544dX.mjs';
2
- import './_spec-Fw9b79TI.mjs';
1
+ import { B as BoardSeo } from './seo-BDZfybrw.mjs';
2
+ import './_spec-Dvlsj5V6.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-C2WvBFEi.js';
2
- import './_spec-Fw9b79TI.js';
1
+ import { B as BoardSeo } from './seo-DcrK1vzk.js';
2
+ import './_spec-Dvlsj5V6.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
package/dist/seo.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-Dlyky5Eo.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-Bj8SieZi.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-Bj8SieZi.mjs';
4
- import './_spec-Fw9b79TI.mjs';
5
- import './board-DkwbMZdt.mjs';
6
- import './jobs-oSTStcbC.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-DhlbCKam.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-212hOj5L.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-212hOj5L.mjs';
4
+ import './_spec-Dvlsj5V6.mjs';
5
+ import './board-CIbqqcEg.mjs';
6
+ import './jobs-NgZT_lvs.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-DldIXX6n.js';
2
- import { e as JsonLdObject } from './breadcrumbs-CzFiddAt.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-CzFiddAt.js';
4
- import './_spec-Fw9b79TI.js';
5
- import './board-B1Ueww2w.js';
6
- import './jobs-rnatMRvm.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-WtDJZV-Z.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-B0QBK24H.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-B0QBK24H.js';
4
+ import './_spec-Dvlsj5V6.js';
5
+ import './board-BiKb5_ZM.js';
6
+ import './jobs-roZu2VmM.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,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-Fw9b79TI.mjs';
3
- import './search-uiAE7AFt.mjs';
4
- import './jobs-oSTStcbC.mjs';
5
- import './board-DkwbMZdt.mjs';
6
- import './seo-Cz0544dX.mjs';
7
- import './blog-Dlyky5Eo.mjs';
2
+ import './_spec-Dvlsj5V6.mjs';
3
+ import './search-Dlo0GUG5.mjs';
4
+ import './jobs-NgZT_lvs.mjs';
5
+ import './board-CIbqqcEg.mjs';
6
+ import './seo-BDZfybrw.mjs';
7
+ import './blog-DhlbCKam.mjs';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-Fw9b79TI.js';
3
- import './search-CKvtGE6t.js';
4
- import './jobs-rnatMRvm.js';
5
- import './board-B1Ueww2w.js';
6
- import './seo-C2WvBFEi.js';
7
- import './blog-DldIXX6n.js';
2
+ import './_spec-Dvlsj5V6.js';
3
+ import './search-DGuJBU-G.js';
4
+ import './jobs-roZu2VmM.js';
5
+ import './board-BiKb5_ZM.js';
6
+ import './seo-DcrK1vzk.js';
7
+ import './blog-WtDJZV-Z.js';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-Fw9b79TI.mjs';
3
- import './search-uiAE7AFt.mjs';
4
- import './jobs-oSTStcbC.mjs';
5
- import './board-DkwbMZdt.mjs';
6
- import './seo-Cz0544dX.mjs';
7
- import './blog-Dlyky5Eo.mjs';
2
+ import './_spec-Dvlsj5V6.mjs';
3
+ import './search-Dlo0GUG5.mjs';
4
+ import './jobs-NgZT_lvs.mjs';
5
+ import './board-CIbqqcEg.mjs';
6
+ import './seo-BDZfybrw.mjs';
7
+ import './blog-DhlbCKam.mjs';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-Fw9b79TI.js';
3
- import './search-CKvtGE6t.js';
4
- import './jobs-rnatMRvm.js';
5
- import './board-B1Ueww2w.js';
6
- import './seo-C2WvBFEi.js';
7
- import './blog-DldIXX6n.js';
2
+ import './_spec-Dvlsj5V6.js';
3
+ import './search-DGuJBU-G.js';
4
+ import './jobs-roZu2VmM.js';
5
+ import './board-BiKb5_ZM.js';
6
+ import './seo-DcrK1vzk.js';
7
+ import './blog-WtDJZV-Z.js';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-uiAE7AFt.mjs';
2
- import './_spec-Fw9b79TI.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-Dlo0GUG5.mjs';
2
+ import './_spec-Dvlsj5V6.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-CKvtGE6t.js';
2
- import './_spec-Fw9b79TI.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-DGuJBU-G.js';
2
+ import './_spec-Dvlsj5V6.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.48.0",
3
+ "version": "4.50.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -20,9 +20,9 @@ widget uses `embed.jobs`.
20
20
 
21
21
  `JobsListQuery` accepts `limit` (1–100), `cursor`, `offset`, `companyId`,
22
22
  `companySlug`, `remoteOption`, `employmentType`, `seniority`, `location` with
23
- `radius` in kilometres, `category`, and `skill`. Repeated `seniority` values
24
- are OR-matched. `offset` takes precedence over `cursor`, so choose one paging
25
- mode per request.
23
+ `radius` in kilometres or `defaultRadius`, `category`, and `skill`. Repeated
24
+ `seniority` values are OR-matched. `offset` takes precedence over `cursor`, so
25
+ choose one paging mode per request.
26
26
 
27
27
  ```ts snippet
28
28
  const first = await board.jobs.list({
@@ -58,6 +58,24 @@ const page = await board.jobs.list({
58
58
  });
59
59
  ```
60
60
 
61
+ ### List a location page in one request
62
+
63
+ `defaultRadius: true` with a `location` and no `radius` widens a city or
64
+ locality to the market default distance: 25 miles (40.2336 km) in the US, GB,
65
+ LR and MM, 50 km elsewhere. Regions, countries and places without coordinates
66
+ are not widened, and an explicit `radius` wins. The server picks the distance
67
+ from the place it already resolves, so a location page can fetch its jobs in
68
+ parallel with `taxonomy.places.resolve` instead of after it. `jobs.search` takes the
69
+ same flag in `filters`.
70
+
71
+ ```ts snippet
72
+ const nearby = await board.jobs.list({
73
+ location: 'houston-texas-united-states',
74
+ defaultRadius: true,
75
+ limit: 20,
76
+ });
77
+ ```
78
+
61
79
  ## Search
62
80
 
63
81
  `jobs.search` posts `JobsSearchBody`: free-text `query`, structured `filters`,
@@ -88,6 +106,18 @@ job.company?.slug;
88
106
  const rail = await board.jobs.similar('senior-chef', { limit: 5 });
89
107
  ```
90
108
 
109
+ A starter that renders the country-gated Apply flow opts in per request with
110
+ `capabilities: ['apply-gateway-v1']`. The opt-in travels in the URL, so the
111
+ response stays shared-cacheable. The older `x-cavuno-board-capabilities`
112
+ header returns the same body but is never cached.
113
+
114
+ ```ts snippet
115
+ const gated = await board.jobs.retrieve('senior-chef', {
116
+ capabilities: ['apply-gateway-v1'],
117
+ });
118
+ gated.applyAction; // 'gateway_external' | 'gateway_native' | …
119
+ ```
120
+
91
121
  ## Surface candidate gating
92
122
 
93
123
  On a gated board, `gatedCount` reports results withheld from the current
@@ -82,6 +82,19 @@ Pause with a concrete blocker when the board identifier or a required test crede
82
82
 
83
83
  **Complete when:** doctor, direct API probes, implemented-surface checks, and the production-build probe all pass or each skipped credentialed check is reported.
84
84
 
85
+ ## Reporting problems
86
+
87
+ When Cavuno itself gets in the way (a missing capability, unclear or wrong documentation, a surprising response, an unhelpful error, a bug or slow performance), report it, even if you found a workaround. `POST https://api.cavuno.com/v1/feedback` accepts [Agent Feedback Protocol v0.1](https://trybackloop.com/spec/) reports without credentials; the discovery document is at `https://api.cavuno.com/.well-known/agent-feedback`.
88
+
89
+ ```bash
90
+ curl https://api.cavuno.com/v1/feedback \
91
+ -X POST \
92
+ -H "Content-Type: application/json" \
93
+ -d '{ "type": "unclear_documentation", "goal": "What you were trying to do", "message": "What got in the way", "agent": { "name": "my-agent", "model": "model-name" } }'
94
+ ```
95
+
96
+ `type`, `goal` and `message` are required; fill `agent.name` and `agent.model`. Up to 20 reports every 5 minutes. Never include credentials, `pk_…` keys, personal data or your user's private content. Send the report, then continue with the task.
97
+
85
98
  ## Cavuno SDK reference
86
99
 
87
100
  For setup and API details beyond this workflow, use the [Cavuno Board SDK documentation](https://cavuno.com/docs/sdk).
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.48.0",
2
+ "version": "4.50.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",