@cavuno/board 4.64.0 → 4.66.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 (52) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/{_spec-D1Qg_Twd.d.mts → _spec-DBI6azWs.d.mts} +96 -2
  3. package/dist/{_spec-D1Qg_Twd.d.ts → _spec-DBI6azWs.d.ts} +96 -2
  4. package/dist/{blog-Dp2jAVVM.d.ts → blog--VKuBIdw.d.ts} +1 -1
  5. package/dist/{blog-e0YbZBjg.d.mts → blog-Bx-rjH4V.d.mts} +1 -1
  6. package/dist/{board-Cc3wbTKI.d.mts → board-BsUhxdjL.d.mts} +2 -2
  7. package/dist/{board-BeNZLOYC.d.ts → board-USJ9ZZab.d.ts} +2 -2
  8. package/dist/{breadcrumbs-C5WjB8jm.d.mts → breadcrumbs-BVN_gIJq.d.mts} +2 -2
  9. package/dist/{breadcrumbs-BOFeIYEX.d.ts → breadcrumbs-maV86vZP.d.ts} +2 -2
  10. package/dist/browser/cavuno-board.global.min.js +1 -1
  11. package/dist/{chunk-H3YIWHXR.mjs → chunk-R62XFNS7.mjs} +1 -0
  12. package/dist/chunk-RDHHRDKN.mjs +6 -0
  13. package/dist/doctor.js +1 -1
  14. package/dist/filters.d.mts +2 -2
  15. package/dist/filters.d.ts +2 -2
  16. package/dist/format.d.mts +4 -4
  17. package/dist/format.d.ts +4 -4
  18. package/dist/index.d.mts +46 -18
  19. package/dist/index.d.ts +46 -18
  20. package/dist/index.js +19 -1
  21. package/dist/index.mjs +22 -5
  22. package/dist/{jobs-D04ngjCP.d.ts → jobs-Dyj1HZ8W.d.ts} +1 -1
  23. package/dist/{jobs-CClqlUld.d.mts → jobs-qoVMh_Zd.d.mts} +1 -1
  24. package/dist/mcp.d.mts +52 -0
  25. package/dist/mcp.d.ts +52 -0
  26. package/dist/mcp.js +150 -0
  27. package/dist/mcp.mjs +128 -0
  28. package/dist/{search-BtrwcLkc.d.mts → search-CrXCM8Hq.d.mts} +1 -1
  29. package/dist/{search-DZeNdYN6.d.ts → search-DPHLf8pI.d.ts} +1 -1
  30. package/dist/{seo-DLoyZRTo.d.ts → seo-BDwe8PwT.d.ts} +1 -1
  31. package/dist/{seo-LfpgbdnO.d.mts → seo-DRVgmTCQ.d.mts} +1 -1
  32. package/dist/seo-files.d.mts +2 -2
  33. package/dist/seo-files.d.ts +2 -2
  34. package/dist/seo.d.mts +22 -7
  35. package/dist/seo.d.ts +22 -7
  36. package/dist/seo.js +12 -3
  37. package/dist/seo.mjs +12 -3
  38. package/dist/server.d.mts +6 -6
  39. package/dist/server.d.ts +6 -6
  40. package/dist/server.mjs +1 -1
  41. package/dist/sitemap.d.mts +6 -6
  42. package/dist/sitemap.d.ts +6 -6
  43. package/dist/sitemap.mjs +1 -1
  44. package/dist/skills.js +1 -1
  45. package/dist/suggest.d.mts +2 -2
  46. package/dist/suggest.d.ts +2 -2
  47. package/package.json +13 -2
  48. package/skills/cavuno-board-filters/SKILL.md +12 -4
  49. package/skills/cavuno-board-mcp/SKILL.md +80 -0
  50. package/skills/cavuno-board-post-a-job/SKILL.md +54 -5
  51. package/skills/cavuno-board-seo/BLOG.md +13 -8
  52. package/skills/manifest.json +8 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,63 @@
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.66.0 — 2026-11-11
7
+
8
+ - Embedded checkout for paid job postings: send `checkoutUiMode:
9
+ 'embedded_page'` to `board.jobPosting.submit` and a paid plan returns
10
+ `status: 'embedded_checkout'` with the `clientSecret`, publishable key and
11
+ connected account to mount Stripe Embedded Checkout. `hosted_page` stays
12
+ the default.
13
+ - New `board.jobPosting.getCheckout(sessionId)` reads a posting's checkout
14
+ outcome: `awaiting_payment`, `processing`, `paid`, `payment_failed` or
15
+ `canceled`, with `jobStatus` and, once live, `jobUrl`. It answers
16
+ `GET /boards/{identifier}/job-postings/checkout/{sessionId}`, and an unknown
17
+ session returns `job_posting_checkout_not_found`.
18
+ - Categories carry `totalJobCount`, the published jobs on the category or any
19
+ subcategory, each job once. `board.taxonomy.categories.list` accepts
20
+ `sort: 'totalJobCount'`, which also lists a parent with no jobs of its own.
21
+ A parent category is listed while any subcategory has published jobs.
22
+ - `GET`, `PUT` and `DELETE /sdk-frontend` register the URL your own frontend
23
+ serves the board on, so board links, auth emails, OAuth completion and
24
+ checkout returns point at it.
25
+ - `GET /contacts`, `GET /contacts/{id}`, `GET /contacts/{id}/emails` and
26
+ `GET /contacts/{id}/activity` read the board's contacts, their emails and
27
+ their activity.
28
+ - `GET /domains/{id}/dns` checks a domain's live DNS records.
29
+ - `GET /settings` and `PATCH /settings` take `mcpEnabled` and
30
+ `mcpDisabledTools`, to switch the board's MCP server off or leave out
31
+ individual tools.
32
+ - `GET /taxonomies/retag` and `POST /taxonomies/retag` re-tag live jobs (or,
33
+ for markets, companies with live jobs) against a list the board manages,
34
+ once every 24 hours per list. `/taxonomies/settings` takes
35
+ `listDescription`, one sentence on what each list means.
36
+
37
+ ## 4.65.0 — 2026-11-09
38
+
39
+ - Board MCP server: every board on a plan with API access serves a public,
40
+ read-only MCP server that AI assistants can use to search its jobs and
41
+ companies. The Board API answers it at `POST /boards/{identifier}/mcp`,
42
+ with a setup page at `GET /boards/{identifier}/mcp/docs`, an MCP Server
43
+ Card at `GET /boards/{identifier}/mcp/server-card` and an AI Catalog at
44
+ `GET /boards/{identifier}/mcp/ai-catalog`.
45
+ - New entry point `@cavuno/board/mcp` with `createMcpHandler({ board })`,
46
+ which serves the board's MCP server on your own domain. Mount it at
47
+ `/mcp`, `/mcp/*` and `/.well-known/ai-catalog.json`; any other path
48
+ below `/mcp` answers 404.
49
+ - `board.context()` returns `features.mcp`, true when the board serves its
50
+ MCP server, so a frontend can link to its setup page.
51
+ - `GET /subscribers/count` returns `subscribers`, the count shown on the
52
+ dashboard: unique people who currently receive job alerts, job matches
53
+ or both.
54
+ - A marketing suppression's `reason` can be `spam_report`.
55
+ - `GET /boards/{identifier}/blog/posts` returns `count`, the total published
56
+ posts in the list across every page, for the whole blog, one tag or one
57
+ author. Pass it as `totalPosts` to `createAuthorProfileJsonLd`.
58
+ - `createBlogArticleJsonLd` takes `authorProfileUrl`, the first author's
59
+ profile page URL. The Article `author` then carries the same `@id` and
60
+ `url` as the `Person` that `createAuthorProfileJsonLd` declares on that
61
+ page.
62
+
6
63
  ## 4.64.0 — 2026-11-05
7
64
 
8
65
  - Tip jar: tippers can cover the card fee. `board.tipJar.get` returns
@@ -225,6 +225,26 @@ interface components {
225
225
  /** @description The board-access grant. Send it as the `X-Board-Access` header on subsequent content reads to pass the password wall. */
226
226
  token: string;
227
227
  };
228
+ /** @description An AI Catalog listing the board's MCP Server Card, for discovery from the board's domain alone. */
229
+ BoardAiCatalog: {
230
+ /**
231
+ * @description The AI Catalog format version.
232
+ * @enum {string}
233
+ */
234
+ specVersion: "1.0";
235
+ /** @description One entry: the board's MCP server. */
236
+ entries: {
237
+ /** @description The server's catalog identifier, `urn:air:<host>:mcp:jobs`, where `<host>` is the board's public host without a leading `www.`. */
238
+ identifier: string;
239
+ /**
240
+ * @description The entry is an MCP Server Card.
241
+ * @enum {string}
242
+ */
243
+ type: "application/mcp-server-card+json";
244
+ /** @description Where to fetch the Server Card: `/mcp/server-card` on the board's own host. */
245
+ url: string;
246
+ }[];
247
+ };
228
248
  BoardAuthConsumeMagicLinkBody: {
229
249
  token: string;
230
250
  };
@@ -408,6 +428,40 @@ interface components {
408
428
  definition: components["schemas"]["CustomFieldDefinition"];
409
429
  };
410
430
  BoardJobFormField: components["schemas"]["BoardFormBuiltinField"] | components["schemas"]["BoardJobFormCustomField"] | components["schemas"]["BoardJobFormCollectionField"];
431
+ /** @description An MCP Server Card (SEP-2127): what an assistant needs to find and connect to the server before it connects. It lists no tools; `tools/list` on the server does. */
432
+ BoardMcpServerCard: {
433
+ /** @description The Server Card JSON Schema this document follows: `https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json`. */
434
+ $schema: string;
435
+ /** @description The server's name in reverse-DNS form, from the board's public host: `jobs.example.com` is `com.example.jobs/jobs`. A leading `www.` is dropped. */
436
+ name: string;
437
+ /** @description The server version, the same one `initialize` reports in `serverInfo`. */
438
+ version: string;
439
+ /** @description The board name, cut to 100 characters. */
440
+ title?: string;
441
+ /** @description What the server does, in at most 100 characters. */
442
+ description: string;
443
+ /** @description The server's setup page on the board's host, `/mcp/docs`. */
444
+ websiteUrl: string;
445
+ /** @description The board's square app icons when it has them, otherwise its logo. Absent when the board has neither. */
446
+ icons?: {
447
+ /** @description Absolute URL of the icon image. */
448
+ src: string;
449
+ /** @description The image type, when known (`image/png`). */
450
+ mimeType?: string;
451
+ /** @description The pixel sizes, when known (`512x512`). */
452
+ sizes?: string[];
453
+ }[];
454
+ /** @description Where to connect: one Streamable HTTP endpoint. */
455
+ remotes: {
456
+ /**
457
+ * @description The transport: stateless Streamable HTTP.
458
+ * @enum {string}
459
+ */
460
+ type: "streamable-http";
461
+ /** @description The server URL, `/mcp` on the board's own host. */
462
+ url: string;
463
+ }[];
464
+ };
411
465
  BoardProfileFormCollectionField: {
412
466
  /**
413
467
  * @description discriminator enum property added by openapi-typescript
@@ -1160,6 +1214,11 @@ interface components {
1160
1214
  }[];
1161
1215
  };
1162
1216
  colorMode?: string;
1217
+ /**
1218
+ * @description How a paid plan is checked out. `hosted_page` (the default) returns `status: checkout` with a Stripe-hosted `checkoutUrl`. `embedded_page` returns `status: embedded_checkout` with a client secret to mount Stripe Embedded Checkout on your own page; cards complete in place, and payment methods that need a redirect return to the board origin's `/post/success`.
1219
+ * @enum {string}
1220
+ */
1221
+ checkoutUiMode?: "hosted_page" | "embedded_page";
1163
1222
  };
1164
1223
  CreatePipelineStageBody: {
1165
1224
  /** @description The job whose pipeline gains the stage. */
@@ -1992,6 +2051,24 @@ interface components {
1992
2051
  object: "job_posting_billing_verification";
1993
2052
  success: boolean;
1994
2053
  };
2054
+ JobPostingCheckoutStatus: {
2055
+ /** @enum {string} */
2056
+ object: "job_posting_checkout_status";
2057
+ /**
2058
+ * @description `awaiting_payment` until Stripe confirms the payment to Cavuno, usually within seconds (poll briefly), `processing` while a delayed payment such as a bank debit clears (days), `paid` once it has, `payment_failed` when that delayed payment failed (the job stays a draft until a new checkout is paid), `canceled` when the checkout expired unpaid.
2059
+ * @enum {string}
2060
+ */
2061
+ status: "awaiting_payment" | "processing" | "paid" | "payment_failed" | "canceled";
2062
+ jobId: string;
2063
+ jobTitle: string;
2064
+ /**
2065
+ * @description `published` once the job is live, `pending_approval` while the board reviews it, `unpublished` otherwise (before payment, or taken down).
2066
+ * @enum {string}
2067
+ */
2068
+ jobStatus: "published" | "pending_approval" | "unpublished";
2069
+ /** @description `published` only: the job's public URL on the board. */
2070
+ jobUrl: string | null;
2071
+ };
1995
2072
  JobPostingLogo: {
1996
2073
  /** @enum {string} */
1997
2074
  object: "job_posting_logo";
@@ -2031,6 +2108,19 @@ interface components {
2031
2108
  status: "checkout";
2032
2109
  checkoutUrl: string;
2033
2110
  jobId: string;
2111
+ } | {
2112
+ /** @enum {string} */
2113
+ object: "job_posting_result";
2114
+ /** @enum {string} */
2115
+ status: "embedded_checkout";
2116
+ /** @description The Checkout Session client secret for `stripe.initEmbeddedCheckout`. The session expires after 24 hours unless paid. */
2117
+ clientSecret: string;
2118
+ sessionId: string;
2119
+ /** @description The board's connected Stripe account; pass it as `stripeAccount` to `loadStripe`. */
2120
+ stripeAccountId: string;
2121
+ /** @description The Stripe publishable key for `loadStripe`. */
2122
+ publishableKey: string;
2123
+ jobId: string;
2034
2124
  } | {
2035
2125
  /** @enum {string} */
2036
2126
  object: "job_posting_result";
@@ -2219,7 +2309,7 @@ interface components {
2219
2309
  status: "granted" | "withdrawn";
2220
2310
  source: string;
2221
2311
  /** @enum {string|null} */
2222
- reason: "person_request" | "operator_request" | "account_deleted" | null;
2312
+ reason: "person_request" | "operator_request" | "account_deleted" | "spam_report" | null;
2223
2313
  /** Format: date-time */
2224
2314
  grantedAt: string | null;
2225
2315
  /** Format: date-time */
@@ -2826,6 +2916,8 @@ interface components {
2826
2916
  contactPage: boolean;
2827
2917
  /** @description Whether `GET /v1/boards/{identifier}/places/suggest` suggests any place on this board (cities, towns and suburbs beyond the board's own places). When `false` it returns an empty list: offer only the board's places (`GET /places?q=`) and do not call it. */
2828
2918
  placeSuggestions: boolean;
2919
+ /** @description Whether the board serves its public MCP server, which AI assistants connect to at `/mcp` on the board's own host, with a setup page for job seekers at `/mcp/docs`. `true` on a paid board that is not password-protected and has not turned the server off. Show a link to `/mcp/docs` (for example in the footer) only when `true`. */
2920
+ mcp: boolean;
2829
2921
  };
2830
2922
  /**
2831
2923
  * @description How the operator charges employers for the candidate directory. `paid_messaging` leaves profiles fully visible and spends a credit on a first cold message; `paid_unlocks_and_messaging` also redacts directory cards and gates the opaque `/p/{id}` profile route behind an unlock credit. `null` means the operator has not chosen explicitly, in which case infer it from the published `talent_access` plans: any plan granting profile unlocks means `paid_unlocks_and_messaging`, otherwise `paid_messaging`. The paywall is inert regardless when the board publishes no talent plan. An anonymous viewer has no entitlement read to derive this from, so it ships here rather than only on `me/talent-access`.
@@ -3506,8 +3598,10 @@ interface components {
3506
3598
  canonicalSlug: string;
3507
3599
  /** @description Board-language name with source-name fallback. */
3508
3600
  displayName: string;
3509
- /** @description Live published-job count for this term on the board. Maintained as jobs publish and expire — not a tally of the current list page. */
3601
+ /** @description Live published-job count for this term on the board. Maintained as jobs publish and expire — not a tally of the current list page. For a category, only jobs tagged with the category itself, so a parent whose jobs all sit on its children has `0`; see `totalJobCount`. */
3510
3602
  jobCount: number;
3603
+ /** @description Live jobs on this category or any descendant, each job once. Present on categories; equals `jobCount` for a category with no children. Absent on skills. */
3604
+ totalJobCount?: number;
3511
3605
  };
3512
3606
  PublicVerifyBoardPasswordBody: {
3513
3607
  /** @description The board password. */
@@ -225,6 +225,26 @@ interface components {
225
225
  /** @description The board-access grant. Send it as the `X-Board-Access` header on subsequent content reads to pass the password wall. */
226
226
  token: string;
227
227
  };
228
+ /** @description An AI Catalog listing the board's MCP Server Card, for discovery from the board's domain alone. */
229
+ BoardAiCatalog: {
230
+ /**
231
+ * @description The AI Catalog format version.
232
+ * @enum {string}
233
+ */
234
+ specVersion: "1.0";
235
+ /** @description One entry: the board's MCP server. */
236
+ entries: {
237
+ /** @description The server's catalog identifier, `urn:air:<host>:mcp:jobs`, where `<host>` is the board's public host without a leading `www.`. */
238
+ identifier: string;
239
+ /**
240
+ * @description The entry is an MCP Server Card.
241
+ * @enum {string}
242
+ */
243
+ type: "application/mcp-server-card+json";
244
+ /** @description Where to fetch the Server Card: `/mcp/server-card` on the board's own host. */
245
+ url: string;
246
+ }[];
247
+ };
228
248
  BoardAuthConsumeMagicLinkBody: {
229
249
  token: string;
230
250
  };
@@ -408,6 +428,40 @@ interface components {
408
428
  definition: components["schemas"]["CustomFieldDefinition"];
409
429
  };
410
430
  BoardJobFormField: components["schemas"]["BoardFormBuiltinField"] | components["schemas"]["BoardJobFormCustomField"] | components["schemas"]["BoardJobFormCollectionField"];
431
+ /** @description An MCP Server Card (SEP-2127): what an assistant needs to find and connect to the server before it connects. It lists no tools; `tools/list` on the server does. */
432
+ BoardMcpServerCard: {
433
+ /** @description The Server Card JSON Schema this document follows: `https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json`. */
434
+ $schema: string;
435
+ /** @description The server's name in reverse-DNS form, from the board's public host: `jobs.example.com` is `com.example.jobs/jobs`. A leading `www.` is dropped. */
436
+ name: string;
437
+ /** @description The server version, the same one `initialize` reports in `serverInfo`. */
438
+ version: string;
439
+ /** @description The board name, cut to 100 characters. */
440
+ title?: string;
441
+ /** @description What the server does, in at most 100 characters. */
442
+ description: string;
443
+ /** @description The server's setup page on the board's host, `/mcp/docs`. */
444
+ websiteUrl: string;
445
+ /** @description The board's square app icons when it has them, otherwise its logo. Absent when the board has neither. */
446
+ icons?: {
447
+ /** @description Absolute URL of the icon image. */
448
+ src: string;
449
+ /** @description The image type, when known (`image/png`). */
450
+ mimeType?: string;
451
+ /** @description The pixel sizes, when known (`512x512`). */
452
+ sizes?: string[];
453
+ }[];
454
+ /** @description Where to connect: one Streamable HTTP endpoint. */
455
+ remotes: {
456
+ /**
457
+ * @description The transport: stateless Streamable HTTP.
458
+ * @enum {string}
459
+ */
460
+ type: "streamable-http";
461
+ /** @description The server URL, `/mcp` on the board's own host. */
462
+ url: string;
463
+ }[];
464
+ };
411
465
  BoardProfileFormCollectionField: {
412
466
  /**
413
467
  * @description discriminator enum property added by openapi-typescript
@@ -1160,6 +1214,11 @@ interface components {
1160
1214
  }[];
1161
1215
  };
1162
1216
  colorMode?: string;
1217
+ /**
1218
+ * @description How a paid plan is checked out. `hosted_page` (the default) returns `status: checkout` with a Stripe-hosted `checkoutUrl`. `embedded_page` returns `status: embedded_checkout` with a client secret to mount Stripe Embedded Checkout on your own page; cards complete in place, and payment methods that need a redirect return to the board origin's `/post/success`.
1219
+ * @enum {string}
1220
+ */
1221
+ checkoutUiMode?: "hosted_page" | "embedded_page";
1163
1222
  };
1164
1223
  CreatePipelineStageBody: {
1165
1224
  /** @description The job whose pipeline gains the stage. */
@@ -1992,6 +2051,24 @@ interface components {
1992
2051
  object: "job_posting_billing_verification";
1993
2052
  success: boolean;
1994
2053
  };
2054
+ JobPostingCheckoutStatus: {
2055
+ /** @enum {string} */
2056
+ object: "job_posting_checkout_status";
2057
+ /**
2058
+ * @description `awaiting_payment` until Stripe confirms the payment to Cavuno, usually within seconds (poll briefly), `processing` while a delayed payment such as a bank debit clears (days), `paid` once it has, `payment_failed` when that delayed payment failed (the job stays a draft until a new checkout is paid), `canceled` when the checkout expired unpaid.
2059
+ * @enum {string}
2060
+ */
2061
+ status: "awaiting_payment" | "processing" | "paid" | "payment_failed" | "canceled";
2062
+ jobId: string;
2063
+ jobTitle: string;
2064
+ /**
2065
+ * @description `published` once the job is live, `pending_approval` while the board reviews it, `unpublished` otherwise (before payment, or taken down).
2066
+ * @enum {string}
2067
+ */
2068
+ jobStatus: "published" | "pending_approval" | "unpublished";
2069
+ /** @description `published` only: the job's public URL on the board. */
2070
+ jobUrl: string | null;
2071
+ };
1995
2072
  JobPostingLogo: {
1996
2073
  /** @enum {string} */
1997
2074
  object: "job_posting_logo";
@@ -2031,6 +2108,19 @@ interface components {
2031
2108
  status: "checkout";
2032
2109
  checkoutUrl: string;
2033
2110
  jobId: string;
2111
+ } | {
2112
+ /** @enum {string} */
2113
+ object: "job_posting_result";
2114
+ /** @enum {string} */
2115
+ status: "embedded_checkout";
2116
+ /** @description The Checkout Session client secret for `stripe.initEmbeddedCheckout`. The session expires after 24 hours unless paid. */
2117
+ clientSecret: string;
2118
+ sessionId: string;
2119
+ /** @description The board's connected Stripe account; pass it as `stripeAccount` to `loadStripe`. */
2120
+ stripeAccountId: string;
2121
+ /** @description The Stripe publishable key for `loadStripe`. */
2122
+ publishableKey: string;
2123
+ jobId: string;
2034
2124
  } | {
2035
2125
  /** @enum {string} */
2036
2126
  object: "job_posting_result";
@@ -2219,7 +2309,7 @@ interface components {
2219
2309
  status: "granted" | "withdrawn";
2220
2310
  source: string;
2221
2311
  /** @enum {string|null} */
2222
- reason: "person_request" | "operator_request" | "account_deleted" | null;
2312
+ reason: "person_request" | "operator_request" | "account_deleted" | "spam_report" | null;
2223
2313
  /** Format: date-time */
2224
2314
  grantedAt: string | null;
2225
2315
  /** Format: date-time */
@@ -2826,6 +2916,8 @@ interface components {
2826
2916
  contactPage: boolean;
2827
2917
  /** @description Whether `GET /v1/boards/{identifier}/places/suggest` suggests any place on this board (cities, towns and suburbs beyond the board's own places). When `false` it returns an empty list: offer only the board's places (`GET /places?q=`) and do not call it. */
2828
2918
  placeSuggestions: boolean;
2919
+ /** @description Whether the board serves its public MCP server, which AI assistants connect to at `/mcp` on the board's own host, with a setup page for job seekers at `/mcp/docs`. `true` on a paid board that is not password-protected and has not turned the server off. Show a link to `/mcp/docs` (for example in the footer) only when `true`. */
2920
+ mcp: boolean;
2829
2921
  };
2830
2922
  /**
2831
2923
  * @description How the operator charges employers for the candidate directory. `paid_messaging` leaves profiles fully visible and spends a credit on a first cold message; `paid_unlocks_and_messaging` also redacts directory cards and gates the opaque `/p/{id}` profile route behind an unlock credit. `null` means the operator has not chosen explicitly, in which case infer it from the published `talent_access` plans: any plan granting profile unlocks means `paid_unlocks_and_messaging`, otherwise `paid_messaging`. The paywall is inert regardless when the board publishes no talent plan. An anonymous viewer has no entitlement read to derive this from, so it ships here rather than only on `me/talent-access`.
@@ -3506,8 +3598,10 @@ interface components {
3506
3598
  canonicalSlug: string;
3507
3599
  /** @description Board-language name with source-name fallback. */
3508
3600
  displayName: string;
3509
- /** @description Live published-job count for this term on the board. Maintained as jobs publish and expire — not a tally of the current list page. */
3601
+ /** @description Live published-job count for this term on the board. Maintained as jobs publish and expire — not a tally of the current list page. For a category, only jobs tagged with the category itself, so a parent whose jobs all sit on its children has `0`; see `totalJobCount`. */
3510
3602
  jobCount: number;
3603
+ /** @description Live jobs on this category or any descendant, each job once. Present on categories; equals `jobCount` for a category with no children. Absent on skills. */
3604
+ totalJobCount?: number;
3511
3605
  };
3512
3606
  PublicVerifyBoardPasswordBody: {
3513
3607
  /** @description The board password. */
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-D1Qg_Twd.js';
1
+ import { S as Schemas } from './_spec-DBI6azWs.js';
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-D1Qg_Twd.mjs';
1
+ import { S as Schemas } from './_spec-DBI6azWs.mjs';
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-D1Qg_Twd.mjs';
2
- import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-CClqlUld.mjs';
1
+ import { S as Schemas } from './_spec-DBI6azWs.mjs';
2
+ import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-qoVMh_Zd.mjs';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-D1Qg_Twd.js';
2
- import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-D04ngjCP.js';
1
+ import { S as Schemas } from './_spec-DBI6azWs.js';
2
+ import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-Dyj1HZ8W.js';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /**
@@ -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-Cc3wbTKI.mjs';
2
- import { P as PublicJob } from './jobs-CClqlUld.mjs';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BsUhxdjL.mjs';
2
+ import { P as PublicJob } from './jobs-qoVMh_Zd.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-BeNZLOYC.js';
2
- import { P as PublicJob } from './jobs-D04ngjCP.js';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-USJ9ZZab.js';
2
+ import { P as PublicJob } from './jobs-Dyj1HZ8W.js';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any