@cavuno/board 4.69.0 → 4.70.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 (42) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/{_spec-CFOj7Qdf.d.mts → _spec-Dk7QyuoJ.d.mts} +58 -2
  3. package/dist/{_spec-CFOj7Qdf.d.ts → _spec-Dk7QyuoJ.d.ts} +58 -2
  4. package/dist/{blog-BaVJi3q1.d.ts → blog-DfUNkngR.d.ts} +1 -1
  5. package/dist/{blog-DCRBPnpZ.d.mts → blog-Oo6YHXSE.d.mts} +1 -1
  6. package/dist/{board-zLt7j6hj.d.ts → board-CfmGT0yV.d.ts} +2 -2
  7. package/dist/{board-DMS3I3sJ.d.mts → board-DzBYIwKz.d.mts} +2 -2
  8. package/dist/{breadcrumbs-yGijUUtR.d.ts → breadcrumbs-CS0nlknq.d.ts} +2 -2
  9. package/dist/{breadcrumbs-Dwf0yq7B.d.mts → breadcrumbs-DeIA0RQp.d.mts} +2 -2
  10. package/dist/browser/cavuno-board.global.min.js +1 -1
  11. package/dist/{chunk-7SAHE7UW.mjs → chunk-UIKN2ERI.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 +74 -22
  17. package/dist/index.d.ts +74 -22
  18. package/dist/index.js +50 -2
  19. package/dist/index.mjs +49 -3
  20. package/dist/{jobs-Cew_q69W.d.mts → jobs-BMRvZlNx.d.mts} +1 -1
  21. package/dist/{jobs-Dz_w1jZq.d.ts → jobs-BlAsTCQl.d.ts} +1 -1
  22. package/dist/{search-DwvgvtEg.d.mts → search-BB1TaaLa.d.mts} +1 -1
  23. package/dist/{search-BqAYR47P.d.ts → search-CoBeDgYT.d.ts} +1 -1
  24. package/dist/{seo-CGy4fY5a.d.ts → seo-BmqJ_ChV.d.ts} +1 -1
  25. package/dist/{seo-FKj1pSHZ.d.mts → seo-M_8j5vdP.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.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/server.mjs +1 -1
  33. package/dist/sitemap.d.mts +6 -6
  34. package/dist/sitemap.d.ts +6 -6
  35. package/dist/sitemap.mjs +1 -1
  36. package/dist/suggest.d.mts +2 -2
  37. package/dist/suggest.d.ts +2 -2
  38. package/package.json +1 -1
  39. package/skills/cavuno-board-account/SKILL.md +16 -0
  40. package/skills/cavuno-board-job-alerts/SKILL.md +7 -0
  41. package/skills/cavuno-board-newsletter/SKILL.md +79 -0
  42. package/skills/manifest.json +8 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,50 @@
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.71.0 — 2026-11-12
7
+
8
+ - `board.jobAlerts.confirm({ token })` can resolve two more statuses,
9
+ which the API already returned: `waitlisted` (the alert is confirmed and
10
+ starts once the board can send to more people) and `unsubscribed` (the
11
+ link was sent before the person's alerts were turned off, so it does not
12
+ turn them back on; they resume them from a manage link with
13
+ `board.jobAlerts.resubscribe`). `JobAlertConfirmation['status']` lists
14
+ both, so an exhaustive `switch` over it needs the two new cases.
15
+ - `JobAlertConfirmation['subscription']` is also present when a link is
16
+ refused (`expired`, `not_found` or `unsubscribed`): `marketing` for a
17
+ link from `board.subscribe`, `job_alerts` for a job alert link. Word the
18
+ refusal by it. It is still absent for an unknown token.
19
+ - `board.subscribe(...)` records the visitor's IP address and user agent
20
+ as consent evidence only when the request comes through a board built
21
+ with Cavuno's AI Builder. A frontend that calls the API from the browser
22
+ or its own server records neither, since the address and user agent the
23
+ API sees are not the visitor's.
24
+
25
+ ## 4.70.0 — 2026-11-12
26
+
27
+ - Company members can add gallery images and files to their company's
28
+ custom fields. `board.me.companies.uploadCustomFieldFile(slug, fieldKey,
29
+ file)` uploads one file (up to 10 MB; galleries take JPEG, PNG, WebP or
30
+ GIF) and returns a `ProfileFieldMedia` draft. Save its `id` with
31
+ `board.me.companies.updateCustomFields` to attach it. The caller must be
32
+ an approved member of the company. A key that is not an upload field is
33
+ refused with `company_custom_field_not_found`, and a field company
34
+ members cannot edit with `company_custom_field_not_editable`.
35
+ - `board.me.companies.retrieveCustomFields(slug)` and `updateCustomFields`
36
+ are typed `MyCompanyProfileFieldValues`, which adds `customFieldMedia`:
37
+ the saved files of upload fields, keyed by field, with links that also
38
+ load drafts for the company's members. `MyCompanyProfileFieldValues` is
39
+ exported.
40
+ - `board.subscribe({ email, consent, consentText, source })` signs an
41
+ address up for the board's email from a newsletter form. The person gets
42
+ a confirmation email and nothing is granted until they click it. It
43
+ always resolves `{ status: 'submitted', sendingPaused }`.
44
+ `BoardSubscribeInput` and `SubscriptionRequest` are exported.
45
+ - `board.auth.register(...)` and `board.auth.resendVerification()` answer
46
+ 422 `board_auth_email_undeliverable` when the address cannot receive
47
+ email, such as a temporary or disposable inbox. On register nothing is
48
+ created, so ask for a different address.
49
+
6
50
  ## 4.69.0 — 2026-11-12
7
51
 
8
52
  - Members-only boards: on a board whose context has
@@ -428,6 +428,17 @@ interface components {
428
428
  definition: components["schemas"]["CustomFieldDefinition"];
429
429
  };
430
430
  BoardJobFormField: components["schemas"]["BoardFormBuiltinField"] | components["schemas"]["BoardJobFormCustomField"] | components["schemas"]["BoardJobFormCollectionField"];
431
+ BoardMarketingTopic: {
432
+ /**
433
+ * @description String representing the object's type. Objects of the same type share the same value.
434
+ * @enum {string}
435
+ */
436
+ object: "marketing_topic";
437
+ /** @description The topic’s key, which a sign-up sends in `topics` when the person ticks it. */
438
+ key: string;
439
+ /** @description The topic’s name, to label its checkbox. */
440
+ name: string;
441
+ };
431
442
  /** @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
443
  BoardMcpServerCard: {
433
444
  /** @description The Server Card JSON Schema this document follows: `https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json`. */
@@ -550,6 +561,29 @@ interface components {
550
561
  /** @description ISO 8601 timestamp of the newest content in the bucket, when the board tracks one. */
551
562
  lastModified?: string;
552
563
  };
564
+ BoardSubscribeBody: {
565
+ /**
566
+ * Format: email
567
+ * @description The address to sign up. It gets a confirmation email.
568
+ */
569
+ email: string;
570
+ /**
571
+ * @description Must be `true`: the person ticked an unticked checkbox agreeing to `consentText`.
572
+ * @enum {boolean}
573
+ */
574
+ consent: true;
575
+ /** @description The checkbox wording the person agreed to, exactly as shown, such as "Send me news and offers from Acme Jobs." It must contain the board's name (any letter case), or the request is refused with 400. Kept with the consent once the person confirms. */
576
+ consentText: string;
577
+ /** @description A label for the form, such as `blog-footer`: lowercase letters, digits and hyphens, up to 64 characters. It shows as the contact's Source. */
578
+ source: string;
579
+ /**
580
+ * Format: uri
581
+ * @description The page the form was on. Defaults to the request's `Referer`.
582
+ */
583
+ pageUrl?: string;
584
+ /** @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
+ website?: string;
586
+ };
553
587
  BoardUser: {
554
588
  /** @description Board user ID. */
555
589
  id: string;
@@ -2373,6 +2407,12 @@ interface components {
2373
2407
  [key: string]: components["schemas"]["ProfileFieldMedia"][];
2374
2408
  };
2375
2409
  };
2410
+ MyCompanyProfileFieldValuesResponse: components["schemas"]["ProfileFieldValuesResponse"] & {
2411
+ /** @description Resolved files for the company’s saved `image_gallery` and `file` values, keyed by field key like `values`, in the stored order, including private fields. Each file `id` matches a value in `values`. `url` is a signed link for the company’s members that expires after at least 24 hours, so read it from the response rather than storing it. Unsaved uploads are not listed. Fields with no files are omitted. */
2412
+ customFieldMedia: {
2413
+ [key: string]: components["schemas"]["ProfileFieldMedia"][];
2414
+ };
2415
+ };
2376
2416
  MyItemVerification: components["schemas"]["ItemVerification"] & {
2377
2417
  /** @description The verification's id. For an item with no verification yet (`unverified`), its `itemKey`. */
2378
2418
  id?: string;
@@ -3348,10 +3388,15 @@ interface components {
3348
3388
  /** @enum {string} */
3349
3389
  object: "job_alert_confirmation";
3350
3390
  /**
3351
- * @description Outcome of the confirmation. Always returned with HTTP 200 so the consumer renders by status (the token may be valid, stale, or unknown).
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.
3352
3392
  * @enum {string}
3353
3393
  */
3354
- status: "confirmed" | "already_confirmed" | "expired" | "not_found";
3394
+ status: "confirmed" | "already_confirmed" | "expired" | "not_found" | "waitlisted" | "unsubscribed";
3395
+ /**
3396
+ * @description What the link confirms: `marketing` for a link from a newsletter sign-up (`POST /boards/{identifier}/subscribe`), which signs the person up for the board's email and never turns job alerts on, or `job_alerts`. Word the outcome by it. Present on a refused link too (`expired`, `not_found` or `unsubscribed`). Absent when the token is unknown or isn't a confirmation link.
3397
+ * @enum {string}
3398
+ */
3399
+ subscription?: "job_alerts" | "marketing";
3355
3400
  };
3356
3401
  PublicJobAlertManageResult: {
3357
3402
  /** @enum {string} */
@@ -3635,6 +3680,17 @@ interface components {
3635
3680
  */
3636
3681
  offset?: number;
3637
3682
  };
3683
+ PublicSubscriptionRequest: {
3684
+ /** @enum {string} */
3685
+ object: "subscription_request";
3686
+ /**
3687
+ * @description Always `submitted`, whether the address is new, waiting to confirm or already subscribed, so the response can't be used to find out who is subscribed. Unless the person already gets the board's email, a confirmation email has been sent; nothing is sent to them until they click it.
3688
+ * @enum {string}
3689
+ */
3690
+ status: "submitted";
3691
+ /** @description The board's marketing email is paused (too many bounces or spam reports). Sign-ups are still recorded; tell the person emails may be delayed. */
3692
+ sendingPaused: boolean;
3693
+ };
3638
3694
  PublicTalentPlace: {
3639
3695
  /** @enum {string} */
3640
3696
  object: "talent_place";
@@ -428,6 +428,17 @@ interface components {
428
428
  definition: components["schemas"]["CustomFieldDefinition"];
429
429
  };
430
430
  BoardJobFormField: components["schemas"]["BoardFormBuiltinField"] | components["schemas"]["BoardJobFormCustomField"] | components["schemas"]["BoardJobFormCollectionField"];
431
+ BoardMarketingTopic: {
432
+ /**
433
+ * @description String representing the object's type. Objects of the same type share the same value.
434
+ * @enum {string}
435
+ */
436
+ object: "marketing_topic";
437
+ /** @description The topic’s key, which a sign-up sends in `topics` when the person ticks it. */
438
+ key: string;
439
+ /** @description The topic’s name, to label its checkbox. */
440
+ name: string;
441
+ };
431
442
  /** @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
443
  BoardMcpServerCard: {
433
444
  /** @description The Server Card JSON Schema this document follows: `https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json`. */
@@ -550,6 +561,29 @@ interface components {
550
561
  /** @description ISO 8601 timestamp of the newest content in the bucket, when the board tracks one. */
551
562
  lastModified?: string;
552
563
  };
564
+ BoardSubscribeBody: {
565
+ /**
566
+ * Format: email
567
+ * @description The address to sign up. It gets a confirmation email.
568
+ */
569
+ email: string;
570
+ /**
571
+ * @description Must be `true`: the person ticked an unticked checkbox agreeing to `consentText`.
572
+ * @enum {boolean}
573
+ */
574
+ consent: true;
575
+ /** @description The checkbox wording the person agreed to, exactly as shown, such as "Send me news and offers from Acme Jobs." It must contain the board's name (any letter case), or the request is refused with 400. Kept with the consent once the person confirms. */
576
+ consentText: string;
577
+ /** @description A label for the form, such as `blog-footer`: lowercase letters, digits and hyphens, up to 64 characters. It shows as the contact's Source. */
578
+ source: string;
579
+ /**
580
+ * Format: uri
581
+ * @description The page the form was on. Defaults to the request's `Referer`.
582
+ */
583
+ pageUrl?: string;
584
+ /** @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
+ website?: string;
586
+ };
553
587
  BoardUser: {
554
588
  /** @description Board user ID. */
555
589
  id: string;
@@ -2373,6 +2407,12 @@ interface components {
2373
2407
  [key: string]: components["schemas"]["ProfileFieldMedia"][];
2374
2408
  };
2375
2409
  };
2410
+ MyCompanyProfileFieldValuesResponse: components["schemas"]["ProfileFieldValuesResponse"] & {
2411
+ /** @description Resolved files for the company’s saved `image_gallery` and `file` values, keyed by field key like `values`, in the stored order, including private fields. Each file `id` matches a value in `values`. `url` is a signed link for the company’s members that expires after at least 24 hours, so read it from the response rather than storing it. Unsaved uploads are not listed. Fields with no files are omitted. */
2412
+ customFieldMedia: {
2413
+ [key: string]: components["schemas"]["ProfileFieldMedia"][];
2414
+ };
2415
+ };
2376
2416
  MyItemVerification: components["schemas"]["ItemVerification"] & {
2377
2417
  /** @description The verification's id. For an item with no verification yet (`unverified`), its `itemKey`. */
2378
2418
  id?: string;
@@ -3348,10 +3388,15 @@ interface components {
3348
3388
  /** @enum {string} */
3349
3389
  object: "job_alert_confirmation";
3350
3390
  /**
3351
- * @description Outcome of the confirmation. Always returned with HTTP 200 so the consumer renders by status (the token may be valid, stale, or unknown).
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.
3352
3392
  * @enum {string}
3353
3393
  */
3354
- status: "confirmed" | "already_confirmed" | "expired" | "not_found";
3394
+ status: "confirmed" | "already_confirmed" | "expired" | "not_found" | "waitlisted" | "unsubscribed";
3395
+ /**
3396
+ * @description What the link confirms: `marketing` for a link from a newsletter sign-up (`POST /boards/{identifier}/subscribe`), which signs the person up for the board's email and never turns job alerts on, or `job_alerts`. Word the outcome by it. Present on a refused link too (`expired`, `not_found` or `unsubscribed`). Absent when the token is unknown or isn't a confirmation link.
3397
+ * @enum {string}
3398
+ */
3399
+ subscription?: "job_alerts" | "marketing";
3355
3400
  };
3356
3401
  PublicJobAlertManageResult: {
3357
3402
  /** @enum {string} */
@@ -3635,6 +3680,17 @@ interface components {
3635
3680
  */
3636
3681
  offset?: number;
3637
3682
  };
3683
+ PublicSubscriptionRequest: {
3684
+ /** @enum {string} */
3685
+ object: "subscription_request";
3686
+ /**
3687
+ * @description Always `submitted`, whether the address is new, waiting to confirm or already subscribed, so the response can't be used to find out who is subscribed. Unless the person already gets the board's email, a confirmation email has been sent; nothing is sent to them until they click it.
3688
+ * @enum {string}
3689
+ */
3690
+ status: "submitted";
3691
+ /** @description The board's marketing email is paused (too many bounces or spam reports). Sign-ups are still recorded; tell the person emails may be delayed. */
3692
+ sendingPaused: boolean;
3693
+ };
3638
3694
  PublicTalentPlace: {
3639
3695
  /** @enum {string} */
3640
3696
  object: "talent_place";
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-CFOj7Qdf.js';
1
+ import { S as Schemas } from './_spec-Dk7QyuoJ.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-CFOj7Qdf.mjs';
1
+ import { S as Schemas } from './_spec-Dk7QyuoJ.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-CFOj7Qdf.js';
2
- import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-Dz_w1jZq.js';
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';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-CFOj7Qdf.mjs';
2
- import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-Cew_q69W.mjs';
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';
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-zLt7j6hj.js';
2
- import { P as PublicJob } from './jobs-Dz_w1jZq.js';
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';
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-DMS3I3sJ.mjs';
2
- import { P as PublicJob } from './jobs-Cew_q69W.mjs';
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';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any