@cavuno/board 4.70.0 → 4.71.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 (44) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/{_spec-Dk7QyuoJ.d.mts → _spec-OPrym0QJ.d.mts} +26 -1
  3. package/dist/{_spec-Dk7QyuoJ.d.ts → _spec-OPrym0QJ.d.ts} +26 -1
  4. package/dist/{blog-DfUNkngR.d.ts → blog-BlRb84MY.d.ts} +1 -1
  5. package/dist/{blog-Oo6YHXSE.d.mts → blog-CHQYIhHH.d.mts} +1 -1
  6. package/dist/{board-DzBYIwKz.d.mts → board-Btc1dzQB.d.mts} +2 -2
  7. package/dist/{board-CfmGT0yV.d.ts → board-D74R4Iml.d.ts} +2 -2
  8. package/dist/{breadcrumbs-CS0nlknq.d.ts → breadcrumbs-Bv76gXvF.d.ts} +2 -2
  9. package/dist/{breadcrumbs-DeIA0RQp.d.mts → breadcrumbs-CSm6P79s.d.mts} +2 -2
  10. package/dist/browser/cavuno-board.global.min.js +1 -1
  11. package/dist/{chunk-UIKN2ERI.mjs → chunk-AQD4OMX4.mjs} +2 -0
  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 +31 -13
  17. package/dist/index.d.ts +31 -13
  18. package/dist/index.js +17 -7
  19. package/dist/index.mjs +16 -8
  20. package/dist/{jobs-BlAsTCQl.d.ts → jobs-BMG0vrVI.d.ts} +1 -1
  21. package/dist/{jobs-BMRvZlNx.d.mts → jobs-xjE0IrNu.d.mts} +1 -1
  22. package/dist/{search-BB1TaaLa.d.mts → search-BJkiU3Ic.d.mts} +1 -1
  23. package/dist/{search-CoBeDgYT.d.ts → search-suUh-E7O.d.ts} +1 -1
  24. package/dist/{seo-BmqJ_ChV.d.ts → seo-CW1JjEXH.d.ts} +1 -1
  25. package/dist/{seo-M_8j5vdP.d.mts → seo-DGdqWPLo.d.mts} +1 -1
  26. package/dist/seo-files.d.mts +2 -2
  27. package/dist/seo-files.d.ts +2 -2
  28. package/dist/seo-files.js +6 -0
  29. package/dist/seo-files.mjs +6 -0
  30. package/dist/seo.d.mts +6 -6
  31. package/dist/seo.d.ts +6 -6
  32. package/dist/server.d.mts +6 -6
  33. package/dist/server.d.ts +6 -6
  34. package/dist/server.mjs +1 -1
  35. package/dist/sitemap.d.mts +6 -6
  36. package/dist/sitemap.d.ts +6 -6
  37. package/dist/sitemap.mjs +1 -1
  38. package/dist/suggest.d.mts +2 -2
  39. package/dist/suggest.d.ts +2 -2
  40. package/package.json +1 -1
  41. package/skills/cavuno-board-auth/SKILL.md +3 -0
  42. package/skills/cavuno-board-job-alerts/SKILL.md +8 -3
  43. package/skills/cavuno-board-newsletter/SKILL.md +2 -0
  44. package/skills/manifest.json +1 -1
package/CHANGELOG.md CHANGED
@@ -21,6 +21,16 @@ types, runtime behavior, or supported integration patterns.
21
21
  with Cavuno's AI Builder. A frontend that calls the API from the browser
22
22
  or its own server records neither, since the address and user agent the
23
23
  API sees are not the visitor's.
24
+ - The place rows of the title-by-location and skill-by-location salary
25
+ pages (`childLocations`, `childLocationsByRegion[].cities` and
26
+ `otherLocations`) carry `indexable` for the page each row links to, as
27
+ the other salary list items already do. Link only rows where it is
28
+ `true` from an indexable page. Skill-by-location rows are never
29
+ indexable.
30
+ - `robotsBody()` and `robotsResponse()` from `@cavuno/board/seo-files`
31
+ add `Content-Signal: search=yes, ai-input=yes, ai-train=yes` under
32
+ `User-Agent: *`, so the board says how its content may be used by search
33
+ and AI. Sandbox boards, which are not indexed, leave it out.
24
34
 
25
35
  ## 4.70.0 — 2026-11-12
26
36
 
@@ -247,6 +247,8 @@ interface components {
247
247
  };
248
248
  BoardAuthConsumeMagicLinkBody: {
249
249
  token: string;
250
+ /** @description The person's IANA time zone from their browser (`Intl.DateTimeFormat().resolvedOptions().timeZone`), such as `Europe/Berlin`. Stored the first time only; an invalid value is ignored. */
251
+ timeZone?: string;
250
252
  };
251
253
  BoardAuthForgotPasswordBody: {
252
254
  /** Format: email */
@@ -303,6 +305,8 @@ interface components {
303
305
  returnTo?: string;
304
306
  /** @description The company member invite token, when the person is signing up from an invite link. When `role` is `employer` and it is a pending invite on this board sent to this same email, no verification email is sent: accepting the invite (`POST /boards/{identifier}/me/invites/accept`) verifies the address. Registration never accepts the invite itself. Any other token is ignored and the verification email is sent as usual. */
305
307
  inviteToken?: string;
308
+ /** @description The person's IANA time zone from their browser (`Intl.DateTimeFormat().resolvedOptions().timeZone`), such as `Europe/Berlin`. Stored the first time only; an invalid value is ignored. */
309
+ timeZone?: string;
306
310
  };
307
311
  BoardAuthRequestMagicLinkBody: {
308
312
  audienceAttribution?: components["schemas"]["AudienceAttribution"];
@@ -583,6 +587,8 @@ interface components {
583
587
  pageUrl?: string;
584
588
  /** @description Honeypot. Render it as a hidden field that people leave empty; when it is filled in, the request answers `submitted` and does nothing. */
585
589
  website?: string;
590
+ /** @description The person's IANA time zone from their browser (`Intl.DateTimeFormat().resolvedOptions().timeZone`), such as `Europe/Berlin`. Stored the first time only; an invalid value is ignored. */
591
+ timeZone?: string;
586
592
  };
587
593
  BoardUser: {
588
594
  /** @description Board user ID. */
@@ -3388,7 +3394,7 @@ interface components {
3388
3394
  /** @enum {string} */
3389
3395
  object: "job_alert_confirmation";
3390
3396
  /**
3391
- * @description Outcome of the confirmation. Always returned with HTTP 200 so the consumer renders by status (the token may be valid, stale, or unknown). `waitlisted`: the job alert is confirmed, but the board can't send to more people yet, so it starts once a spot opens. `unsubscribed`: a job-alert link sent before the alerts were turned off, which doesn't turn them back on. The subscription form sends an address that unsubscribed no confirmation email; resume alerts with the manage token (`POST /boards/{identifier}/job-alerts/resubscribe`) or a signed-in alert create.
3397
+ * @description Outcome of the confirmation. Always returned with HTTP 200 so the consumer renders by status (the token may be valid, stale, or unknown). `waitlisted`: the job alert is confirmed, but the board can't send to more people yet, so it starts once a spot opens. `unsubscribed`: a job-alert link sent before the alerts were turned off, which doesn't turn them back on. To get them again, subscribe again (`POST /boards/{identifier}/job-alerts`): an address that unsubscribed is sent a fresh confirmation email at most once every 12 hours (none while the address is suppressed, or when the board's team unsubscribed the address), and clicking it re-subscribes. The manage token (`POST /boards/{identifier}/job-alerts/resubscribe`) or a signed-in alert create also resumes them.
3392
3398
  * @enum {string}
3393
3399
  */
3394
3400
  status: "confirmed" | "already_confirmed" | "expired" | "not_found" | "waitlisted" | "unsubscribed";
@@ -3449,6 +3455,13 @@ interface components {
3449
3455
  */
3450
3456
  status: "submitted";
3451
3457
  };
3458
+ PublicJobAlertResubscribeResult: components["schemas"]["PublicJobAlertManageResult"] & {
3459
+ /**
3460
+ * @description `resubscribed`: the subscription is resumed; its alerts start again, or wait for a spot when the board can't send to more people yet. `confirmation_sent`: the address never confirmed, so nothing is on yet; a confirmation email went out, and the alerts start when the person clicks its link. Tell them to check their inbox, and don't show the alerts as on.
3461
+ * @enum {string}
3462
+ */
3463
+ status: "resubscribed" | "confirmation_sent";
3464
+ };
3452
3465
  PublicJobAlertSubscription: {
3453
3466
  /** @enum {string} */
3454
3467
  object: "job_alert_subscription";
@@ -4285,6 +4298,8 @@ interface components {
4285
4298
  avgSalaryMin: number;
4286
4299
  avgSalaryMax: number;
4287
4300
  jobCount: number;
4301
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4302
+ indexable: boolean;
4288
4303
  }[];
4289
4304
  childLocationsByRegion: {
4290
4305
  regionName: string;
@@ -4297,6 +4312,8 @@ interface components {
4297
4312
  avgSalaryMin: number;
4298
4313
  avgSalaryMax: number;
4299
4314
  jobCount: number;
4315
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4316
+ indexable: boolean;
4300
4317
  }[];
4301
4318
  }[];
4302
4319
  otherLocations: {
@@ -4307,6 +4324,8 @@ interface components {
4307
4324
  avgSalaryMin: number;
4308
4325
  avgSalaryMax: number;
4309
4326
  jobCount: number;
4327
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4328
+ indexable: boolean;
4310
4329
  }[];
4311
4330
  topSkills: {
4312
4331
  avgSalaryMin: number;
@@ -4845,6 +4864,8 @@ interface components {
4845
4864
  avgSalaryMin: number;
4846
4865
  avgSalaryMax: number;
4847
4866
  jobCount: number;
4867
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4868
+ indexable: boolean;
4848
4869
  }[];
4849
4870
  childLocationsByRegion: {
4850
4871
  regionName: string;
@@ -4857,6 +4878,8 @@ interface components {
4857
4878
  avgSalaryMin: number;
4858
4879
  avgSalaryMax: number;
4859
4880
  jobCount: number;
4881
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4882
+ indexable: boolean;
4860
4883
  }[];
4861
4884
  }[];
4862
4885
  otherLocations: {
@@ -4867,6 +4890,8 @@ interface components {
4867
4890
  avgSalaryMin: number;
4868
4891
  avgSalaryMax: number;
4869
4892
  jobCount: number;
4893
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4894
+ indexable: boolean;
4870
4895
  }[];
4871
4896
  topSkills: {
4872
4897
  avgSalaryMin: number;
@@ -247,6 +247,8 @@ interface components {
247
247
  };
248
248
  BoardAuthConsumeMagicLinkBody: {
249
249
  token: string;
250
+ /** @description The person's IANA time zone from their browser (`Intl.DateTimeFormat().resolvedOptions().timeZone`), such as `Europe/Berlin`. Stored the first time only; an invalid value is ignored. */
251
+ timeZone?: string;
250
252
  };
251
253
  BoardAuthForgotPasswordBody: {
252
254
  /** Format: email */
@@ -303,6 +305,8 @@ interface components {
303
305
  returnTo?: string;
304
306
  /** @description The company member invite token, when the person is signing up from an invite link. When `role` is `employer` and it is a pending invite on this board sent to this same email, no verification email is sent: accepting the invite (`POST /boards/{identifier}/me/invites/accept`) verifies the address. Registration never accepts the invite itself. Any other token is ignored and the verification email is sent as usual. */
305
307
  inviteToken?: string;
308
+ /** @description The person's IANA time zone from their browser (`Intl.DateTimeFormat().resolvedOptions().timeZone`), such as `Europe/Berlin`. Stored the first time only; an invalid value is ignored. */
309
+ timeZone?: string;
306
310
  };
307
311
  BoardAuthRequestMagicLinkBody: {
308
312
  audienceAttribution?: components["schemas"]["AudienceAttribution"];
@@ -583,6 +587,8 @@ interface components {
583
587
  pageUrl?: string;
584
588
  /** @description Honeypot. Render it as a hidden field that people leave empty; when it is filled in, the request answers `submitted` and does nothing. */
585
589
  website?: string;
590
+ /** @description The person's IANA time zone from their browser (`Intl.DateTimeFormat().resolvedOptions().timeZone`), such as `Europe/Berlin`. Stored the first time only; an invalid value is ignored. */
591
+ timeZone?: string;
586
592
  };
587
593
  BoardUser: {
588
594
  /** @description Board user ID. */
@@ -3388,7 +3394,7 @@ interface components {
3388
3394
  /** @enum {string} */
3389
3395
  object: "job_alert_confirmation";
3390
3396
  /**
3391
- * @description Outcome of the confirmation. Always returned with HTTP 200 so the consumer renders by status (the token may be valid, stale, or unknown). `waitlisted`: the job alert is confirmed, but the board can't send to more people yet, so it starts once a spot opens. `unsubscribed`: a job-alert link sent before the alerts were turned off, which doesn't turn them back on. The subscription form sends an address that unsubscribed no confirmation email; resume alerts with the manage token (`POST /boards/{identifier}/job-alerts/resubscribe`) or a signed-in alert create.
3397
+ * @description Outcome of the confirmation. Always returned with HTTP 200 so the consumer renders by status (the token may be valid, stale, or unknown). `waitlisted`: the job alert is confirmed, but the board can't send to more people yet, so it starts once a spot opens. `unsubscribed`: a job-alert link sent before the alerts were turned off, which doesn't turn them back on. To get them again, subscribe again (`POST /boards/{identifier}/job-alerts`): an address that unsubscribed is sent a fresh confirmation email at most once every 12 hours (none while the address is suppressed, or when the board's team unsubscribed the address), and clicking it re-subscribes. The manage token (`POST /boards/{identifier}/job-alerts/resubscribe`) or a signed-in alert create also resumes them.
3392
3398
  * @enum {string}
3393
3399
  */
3394
3400
  status: "confirmed" | "already_confirmed" | "expired" | "not_found" | "waitlisted" | "unsubscribed";
@@ -3449,6 +3455,13 @@ interface components {
3449
3455
  */
3450
3456
  status: "submitted";
3451
3457
  };
3458
+ PublicJobAlertResubscribeResult: components["schemas"]["PublicJobAlertManageResult"] & {
3459
+ /**
3460
+ * @description `resubscribed`: the subscription is resumed; its alerts start again, or wait for a spot when the board can't send to more people yet. `confirmation_sent`: the address never confirmed, so nothing is on yet; a confirmation email went out, and the alerts start when the person clicks its link. Tell them to check their inbox, and don't show the alerts as on.
3461
+ * @enum {string}
3462
+ */
3463
+ status: "resubscribed" | "confirmation_sent";
3464
+ };
3452
3465
  PublicJobAlertSubscription: {
3453
3466
  /** @enum {string} */
3454
3467
  object: "job_alert_subscription";
@@ -4285,6 +4298,8 @@ interface components {
4285
4298
  avgSalaryMin: number;
4286
4299
  avgSalaryMax: number;
4287
4300
  jobCount: number;
4301
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4302
+ indexable: boolean;
4288
4303
  }[];
4289
4304
  childLocationsByRegion: {
4290
4305
  regionName: string;
@@ -4297,6 +4312,8 @@ interface components {
4297
4312
  avgSalaryMin: number;
4298
4313
  avgSalaryMax: number;
4299
4314
  jobCount: number;
4315
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4316
+ indexable: boolean;
4300
4317
  }[];
4301
4318
  }[];
4302
4319
  otherLocations: {
@@ -4307,6 +4324,8 @@ interface components {
4307
4324
  avgSalaryMin: number;
4308
4325
  avgSalaryMax: number;
4309
4326
  jobCount: number;
4327
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4328
+ indexable: boolean;
4310
4329
  }[];
4311
4330
  topSkills: {
4312
4331
  avgSalaryMin: number;
@@ -4845,6 +4864,8 @@ interface components {
4845
4864
  avgSalaryMin: number;
4846
4865
  avgSalaryMax: number;
4847
4866
  jobCount: number;
4867
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4868
+ indexable: boolean;
4848
4869
  }[];
4849
4870
  childLocationsByRegion: {
4850
4871
  regionName: string;
@@ -4857,6 +4878,8 @@ interface components {
4857
4878
  avgSalaryMin: number;
4858
4879
  avgSalaryMax: number;
4859
4880
  jobCount: number;
4881
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4882
+ indexable: boolean;
4860
4883
  }[];
4861
4884
  }[];
4862
4885
  otherLocations: {
@@ -4867,6 +4890,8 @@ interface components {
4867
4890
  avgSalaryMin: number;
4868
4891
  avgSalaryMax: number;
4869
4892
  jobCount: number;
4893
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
4894
+ indexable: boolean;
4870
4895
  }[];
4871
4896
  topSkills: {
4872
4897
  avgSalaryMin: number;
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Dk7QyuoJ.js';
1
+ import { S as Schemas } from './_spec-OPrym0QJ.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-Dk7QyuoJ.mjs';
1
+ import { S as Schemas } from './_spec-OPrym0QJ.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-Dk7QyuoJ.mjs';
2
- import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-BMRvZlNx.mjs';
1
+ import { S as Schemas } from './_spec-OPrym0QJ.mjs';
2
+ import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-xjE0IrNu.mjs';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-Dk7QyuoJ.js';
2
- import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-BlAsTCQl.js';
1
+ import { S as Schemas } from './_spec-OPrym0QJ.js';
2
+ import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-BMG0vrVI.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-CfmGT0yV.js';
2
- import { P as PublicJob } from './jobs-BlAsTCQl.js';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-D74R4Iml.js';
2
+ import { P as PublicJob } from './jobs-BMG0vrVI.js';
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-DzBYIwKz.mjs';
2
- import { P as PublicJob } from './jobs-BMRvZlNx.mjs';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-Btc1dzQB.mjs';
2
+ import { P as PublicJob } from './jobs-xjE0IrNu.mjs';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any