@cavuno/board 4.4.0 → 4.5.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 (43) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +93 -77
  3. package/dist/{_spec-COlkrizX.d.mts → _spec-BJah6GIZ.d.mts} +55 -0
  4. package/dist/{_spec-COlkrizX.d.ts → _spec-BJah6GIZ.d.ts} +55 -0
  5. package/dist/{blog-DO8Yn21_.d.mts → blog-4Owyo4U_.d.mts} +1 -1
  6. package/dist/{blog-CgA_ljHa.d.ts → blog-DJi_1n7W.d.ts} +1 -1
  7. package/dist/{board-JgFR-2UW.d.mts → board-CpR7o9bL.d.mts} +2 -2
  8. package/dist/{board-D51C3gB5.d.ts → board-KDx9U0nw.d.ts} +2 -2
  9. package/dist/{breadcrumbs-_QzN4nEk.d.ts → breadcrumbs-CJ-NpA-V.d.ts} +2 -2
  10. package/dist/{breadcrumbs-zAN2biAq.d.mts → breadcrumbs-DOJH_7nO.d.mts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/{chunk-2ETP5UH4.mjs → chunk-GC5QWN7Y.mjs} +16 -0
  13. package/dist/{chunk-YEAQ3JEI.mjs → chunk-VWGF4I5C.mjs} +143 -4
  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/format.js +15 -2
  19. package/dist/format.mjs +2 -126
  20. package/dist/index.d.mts +75 -12
  21. package/dist/index.d.ts +75 -12
  22. package/dist/index.js +187 -1
  23. package/dist/index.mjs +172 -2
  24. package/dist/{jobs-DOF3QXdq.d.ts → jobs-Ay-V6Q6y.d.ts} +1 -1
  25. package/dist/{jobs-C1Mxty1n.d.mts → jobs-C27qlt6o.d.mts} +1 -1
  26. package/dist/{search-Cx_dsVUb.d.mts → search-CC-rlMgk.d.mts} +1 -1
  27. package/dist/{search-_QDaN6Um.d.ts → search-fG_K9J8x.d.ts} +1 -1
  28. package/dist/seo.d.mts +6 -6
  29. package/dist/seo.d.ts +6 -6
  30. package/dist/seo.js +16 -1
  31. package/dist/seo.mjs +1 -1
  32. package/dist/server.d.mts +5 -5
  33. package/dist/server.d.ts +5 -5
  34. package/dist/server.mjs +1 -1
  35. package/dist/sitemap.d.mts +5 -5
  36. package/dist/sitemap.d.ts +5 -5
  37. package/dist/suggest.d.mts +2 -2
  38. package/dist/suggest.d.ts +2 -2
  39. package/package.json +1 -1
  40. package/skills/cavuno-board-account/SKILL.md +11 -1
  41. package/skills/cavuno-board-companies/SKILL.md +21 -0
  42. package/skills/cavuno-board-seo/SALARY.md +2 -1
  43. package/skills/manifest.json +1 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,34 @@
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.5.0 — 2026-08-21
7
+
8
+ - **Board-user account self-service**: signed-in board users manage their own
9
+ account over the API. New `board.me` verbs and `/v1/boards/{identifier}/me/*`
10
+ endpoints: `updatePassword`, `requestEmailChange` / `confirmEmailChange`
11
+ (verify-then-switch), and account deletion. The `board_user` resource now
12
+ exposes `hasPassword` so headless frontends can decide between change-password
13
+ and set-password flows.
14
+ - **Company team management**: `board.me.companies` gains members and invites —
15
+ list members, change a member's role (`admin` / `member`), remove a member,
16
+ create / list / revoke email invites (7-day links), accept an invite, and
17
+ `leave(slug)` (`DELETE .../me/companies/{slug}/membership`). A company always
18
+ keeps at least one admin: the API answers `409 last_admin` when an action
19
+ would strand it.
20
+ - **Analytics**: apply-clicks and job-visitors reporting can group by
21
+ first-touch channel, and apply-click rows carry `jobSlug`.
22
+ - **Company blocklist**: endpoints for blocking a company from automated
23
+ sourcing so imports and aggregation cannot reintroduce it.
24
+ - **Fix**: salary formatting falls back cleanly when the runtime lacks
25
+ `Intl.NumberFormat.formatRange`.
26
+
27
+ ## 4.4.1 — 2026-08-10
28
+
29
+ - **SDK installation documentation**: The npm and GitHub README now presents
30
+ package installation as the recommended TypeScript SDK path, with CDN
31
+ installation as a separate option for static HTML and other no-build sites.
32
+ Links point to the canonical SDK installation guides on cavuno.com.
33
+
6
34
  ## 4.4.0 — 2026-08-10
7
35
 
8
36
  - **Classic-script browser build**: `@cavuno/board` now ships a dependency-free
package/README.md CHANGED
@@ -2,114 +2,130 @@
2
2
 
3
3
  Build custom job boards and careers pages with Cavuno’s TypeScript SDK.
4
4
 
5
- `@cavuno/board` is a typed, isomorphic client for the
6
- [Cavuno job board platform](https://cavuno.com) Board API. It has zero runtime
7
- dependencies and runs in browsers, Node.js 20 or newer, and Cloudflare Workers.
5
+ `@cavuno/board` is the zero-dependency client for the Cavuno Board API. It
6
+ runs in browsers, Node.js 20 or newer, and Cloudflare Workers, with TypeScript
7
+ declarations generated from the API’s OpenAPI contract.
8
8
 
9
- You bring the framework and own the layout; the SDK brings the job board:
10
- jobs and search, companies, salaries, blog, board-user auth, saved jobs,
11
- applications, job alerts, messaging, employer self-service, checkout, and
12
- the candidate paywall — every method typed from the API's own OpenAPI
13
- contract.
9
+ [Documentation](https://cavuno.com/docs/sdk) ·
10
+ [Installing](https://cavuno.com/docs/sdk/installing) ·
11
+ [SDK reference](https://cavuno.com/docs/sdk/reference) ·
12
+ [API reference](https://cavuno.com/docs/api) ·
13
+ [Source](https://github.com/wollemiahq/cavuno-sdk)
14
14
 
15
- ## Building with a coding agent
15
+ ## Installation
16
16
 
17
- The package ships an Agent Skills corpus for Codex, Claude Code, Cursor, and
18
- other compatible coding agents. It teaches them how to wire a board correctly — client setup,
19
- auth and session ownership, pagination, gating, error handling, and a
20
- runtime smoke test:
21
-
22
- Install the latest skills directly from the public SDK repository:
17
+ ### Install as package
23
18
 
24
19
  ```bash
25
- npx skills add wollemiahq/cavuno-sdk --skill cavuno-board-setup
26
- # Or install the complete Cavuno skill set:
27
- npx skills add wollemiahq/cavuno-sdk --skill '*'
20
+ npm install @cavuno/board
28
21
  ```
29
22
 
30
- For skills matched exactly to an installed SDK version, copy them from the
31
- package instead:
23
+ The package includes ESM and CommonJS builds. ESM imports are tree-shakeable,
24
+ and helper packages such as `@cavuno/board/format` can be imported separately.
32
25
 
33
- ```bash
34
- npm install @cavuno/board # or: pnpm add / yarn add / bun add
35
- npx @cavuno/board setup # copies version-matched Agent Skills
36
- ```
26
+ ### Install via CDN
27
+
28
+ No package manager or build step? Follow the
29
+ [CDN installation guide](https://cavuno.com/docs/sdk/installing/cdn)
30
+ for a version-pinned build and its integrity hash. The CDN build is
31
+ the same SDK downloaded as one file; package imports remain the recommended
32
+ choice when they are available.
37
33
 
38
- Then ask your agent: *"set up my Cavuno board"* — it reads the
39
- `cavuno-board-setup` skill and works surface by surface. Because the
40
- skills live in your project and match your installed version, the agent
41
- never works from stale docs.
34
+ See [Installing](https://cavuno.com/docs/sdk/installing) for every installation option.
42
35
 
43
- ## Quick start (by hand)
36
+ ## Quick start
44
37
 
45
38
  ```ts
46
39
  import { createBoardClient } from '@cavuno/board';
47
40
 
48
41
  const board = createBoardClient({
49
- board: process.env.PUBLIC_CAVUNO_BOARD!, // pk_… publishable key
42
+ board: 'pk_your_publishable_key',
50
43
  });
51
44
 
52
- const { name, language, features } = await board.context();
53
- const page = await board.jobs.list({ limit: 20 });
54
- const job = await board.jobs.retrieve('senior-chef');
45
+ const [context, jobs] = await Promise.all([
46
+ board.context(),
47
+ board.jobs.list({ limit: 20 }),
48
+ ]);
55
49
 
56
- // Federated search-dropdown suggestions (companies, markets, taxonomy terms).
57
- const { items } = await board.search.suggest({
58
- q: 'acme',
59
- limit: 10,
60
- types: ['company', 'skill'],
61
- });
62
- // Or the headless controller (debounce / abort / stale-drop built in):
63
- // import { createSuggestController } from '@cavuno/board/suggest';
64
- // const suggest = createSuggestController(board);
65
- // suggest.setQuery('acme');
50
+ console.log(context.name);
51
+ console.log(jobs.data);
66
52
  ```
67
53
 
68
- Every method accepts trailing `FetchOptions` — `signal`, `headers`, and
69
- framework caching directives (`next: { tags }`, `cf: {…}`) pass through to
70
- `fetch` untouched. Walk full catalogs with the async iterator:
54
+ A `pk_…` key identifies a board and is public by design. Get it from
55
+ **Settings → Developer → SDK** in Cavuno. The client connects to
56
+ `https://api.cavuno.com` by default.
71
57
 
72
- ```ts
73
- import { paginate } from '@cavuno/board';
58
+ The client exposes typed namespaces for jobs and search, companies, salaries,
59
+ blog, board-user authentication, saved jobs, applications, job alerts,
60
+ messaging, employer workflows, checkout, candidate access, and SEO data.
61
+
62
+ ## Handle errors
63
+
64
+ Every non-2xx response throws a `BoardApiError` with the API status, code,
65
+ details, and request ID.
74
66
 
75
- // the query `limit` is the page size; toArray's `limit` caps items collected
76
- for await (const card of paginate(board.jobs.list, { limit: 100 })) {
77
- urls.push(card.links.public);
67
+ ```ts
68
+ import { BoardApiError, isNotFound } from '@cavuno/board';
69
+
70
+ try {
71
+ await board.jobs.retrieve('missing-job');
72
+ } catch (error) {
73
+ if (isNotFound(error)) {
74
+ // Render your application's not-found state.
75
+ } else if (error instanceof BoardApiError) {
76
+ console.error(error.code, error.requestId);
77
+ }
78
78
  }
79
- const first500 = await paginate(board.companies.list, { limit: 100 })
80
- .toArray({ limit: 500 });
81
79
  ```
82
80
 
83
- Errors are typed — every non-2xx throws a `BoardApiError` carrying the full
84
- v1 envelope (`status`, `code`, `details`, `requestId`), with guards like
85
- `isNotFound`, `isRateLimited`, and `isBoardPasswordRequired`.
81
+ See [Handle SDK errors](https://cavuno.com/docs/sdk/fundamentals/errors) for
82
+ the complete error contract and guards.
83
+
84
+ ## Authentication
85
+
86
+ - A `pk_…` publishable key identifies the board and may be included in browser
87
+ code.
88
+ - Candidate and employer sessions use `board.auth.*`. Choose browser storage
89
+ deliberately; server-rendered applications should keep sessions in their
90
+ own httpOnly cookies.
91
+ - Operator and admin credentials must never be used with this SDK or exposed
92
+ to frontend code.
93
+
94
+ Read [Authentication and sessions](https://cavuno.com/docs/sdk/fundamentals/authentication-and-session-ownership)
95
+ before adding signed-in workflows.
86
96
 
87
- ## Auth model
97
+ ## Make a request to a custom endpoint
88
98
 
89
- Three tiers, safe for browsers by construction:
99
+ For an endpoint without a namespace method, `board.client.fetch<T>(path, init)`
100
+ uses the same board base path, headers, bearer token, serialization, and hooks
101
+ as the rest of the client. Treat the generic response type as your
102
+ application’s assertion; custom responses are not generated from the public
103
+ OpenAPI contract.
90
104
 
91
- - **`pk_…` publishable key** — identifies the board; public by design.
92
- - **Board-user JWT** — candidate/employer sessions via `board.auth.*`.
93
- Pluggable storage (`memory` in the browser, `nostore` on the server);
94
- on SSR, keep the session in an httpOnly cookie your app owns and pass
95
- the token per call. No auto-refresh on 401 — rotation is explicit.
96
- - **No secret keys** — operator/admin credentials never touch this SDK.
105
+ See [`board.client.fetch()`](https://cavuno.com/docs/sdk/reference/top-level-methods#make-a-request-to-a-custom-endpoint)
106
+ for options and examples.
97
107
 
98
- ## Escape hatch
108
+ ## Set up with a coding agent
109
+
110
+ The package includes version-matched Agent Skills for Codex, Claude Code,
111
+ Cursor, and other compatible coding agents:
112
+
113
+ ```bash
114
+ npx @cavuno/board setup
115
+ ```
99
116
 
100
- `board.client.fetch<T>(path, init)` sends a typed request through the full
101
- pipeline (board base path, headers, bearer token, hooks) for endpoints the
102
- SDK doesn't cover yet.
117
+ Then ask your agent to set up the Cavuno board using the installed
118
+ `cavuno-board-setup` skill. See
119
+ [Set up with an agent](https://cavuno.com/docs/sdk/installing/agent)
120
+ for the review and verification workflow.
103
121
 
104
- ## Docs
122
+ ## Resources
105
123
 
106
- - Cavuno: <https://cavuno.com>
107
- - SDK guides and reference: <https://cavuno.com/docs/sdk>
108
- - API documentation: <https://cavuno.com/docs/api>
109
- - OpenAPI document: `GET https://api.cavuno.com/v1/openapi.json`
110
- - Source: <https://github.com/wollemiahq/cavuno-sdk>
111
- - Issues: <https://github.com/wollemiahq/cavuno-sdk/issues>
112
- - Clone-and-own TanStack Start + shadcn/ui template:
113
- <https://github.com/wollemiahq/cavuno-tanstack-start-shadcn-job-board-template>
124
+ - [SDK guides and reference](https://cavuno.com/docs/sdk)
125
+ - [Board API documentation](https://cavuno.com/docs/api)
126
+ - [OpenAPI document](https://api.cavuno.com/v1/openapi.json)
127
+ - [Source](https://github.com/wollemiahq/cavuno-sdk)
128
+ - [Issues](https://github.com/wollemiahq/cavuno-sdk/issues)
129
+ - [TanStack Start + shadcn/ui job board template](https://github.com/wollemiahq/cavuno-tanstack-start-shadcn-job-board-template)
114
130
 
115
131
  MIT © Wollemia
@@ -1,5 +1,8 @@
1
1
  interface components {
2
2
  schemas: {
3
+ AcceptCompanyMemberInviteBody: {
4
+ token: string;
5
+ };
3
6
  AccessCheckoutBody: {
4
7
  /**
5
8
  * @description The offer tier to purchase (from `GET /paywall/offers/enabled`).
@@ -262,6 +265,8 @@ interface components {
262
265
  email: string;
263
266
  displayName: string | null;
264
267
  emailVerified: boolean;
268
+ /** @description Whether the account has a password credential. False for OAuth/magic-link-only accounts; frontends use it to offer change-password vs set-password (the set flow is POST /auth/forgot-password). */
269
+ hasPassword: boolean;
265
270
  };
266
271
  BulkMoveApplicantsBody: {
267
272
  applicationIds: string[];
@@ -404,6 +409,34 @@ interface components {
404
409
  /** @description Source slug for the market. Use it as the `:market` segment of the market-scoped company browse. */
405
410
  slug: string;
406
411
  };
412
+ CompanyMember: {
413
+ id: string;
414
+ /** @enum {string} */
415
+ object: "company_member";
416
+ boardUserId: string;
417
+ displayName: string | null;
418
+ email: string;
419
+ /** @enum {string} */
420
+ role: "admin" | "member";
421
+ approvedBy: string | null;
422
+ /** Format: date-time */
423
+ createdAt: string;
424
+ };
425
+ CompanyMemberInvite: {
426
+ id: string;
427
+ /** @enum {string} */
428
+ object: "company_member_invite";
429
+ email: string;
430
+ /** Format: date-time */
431
+ createdAt: string;
432
+ /** Format: date-time */
433
+ expiresAt: string;
434
+ };
435
+ CompanyMemberInviteAcceptance: {
436
+ /** @enum {string} */
437
+ object: "company_member_invite_acceptance";
438
+ companySlug: string;
439
+ };
407
440
  CompanyMembership: {
408
441
  id: string;
409
442
  /** @enum {string} */
@@ -558,6 +591,9 @@ interface components {
558
591
  /** @description Live published-job count for this company on the board. */
559
592
  jobCount: number;
560
593
  };
594
+ ConfirmEmailChangeBody: {
595
+ token: string;
596
+ };
561
597
  ConfirmWorkEmailBody: {
562
598
  token: string;
563
599
  };
@@ -618,6 +654,10 @@ interface components {
618
654
  /** @description URL-friendly slug for the company. Auto-generated from `name` when omitted. */
619
655
  slug?: string;
620
656
  };
657
+ CreateCompanyMemberInviteBody: {
658
+ /** Format: email */
659
+ email: string;
660
+ };
621
661
  CreateEducationBody: {
622
662
  institutionName: string;
623
663
  institutionUrl?: string;
@@ -1982,6 +2022,8 @@ interface components {
1982
2022
  salaryCurrency: string | null;
1983
2023
  salaryTimeframe: string | null;
1984
2024
  isFeatured: boolean;
2025
+ /** @description True when this listing is a Forager CPC / partner-feed ad persisted on the board. */
2026
+ isSponsored: boolean;
1985
2027
  /** @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. */
1986
2028
  summary: string | null;
1987
2029
  locationLabel: string | null;
@@ -2154,6 +2196,10 @@ interface components {
2154
2196
  reason: "spam" | "harassment" | "misrepresentation" | "other";
2155
2197
  freeText?: string;
2156
2198
  };
2199
+ RequestEmailChangeBody: {
2200
+ /** Format: email */
2201
+ email: string;
2202
+ };
2157
2203
  Resume: {
2158
2204
  /** @enum {string} */
2159
2205
  object: "resume";
@@ -2730,6 +2776,10 @@ interface components {
2730
2776
  jobSearchStatusVisibleTo?: "everyone" | "employers_only";
2731
2777
  openToRelocate?: boolean;
2732
2778
  };
2779
+ UpdateCompanyMemberRoleBody: {
2780
+ /** @enum {string} */
2781
+ role: "admin" | "member";
2782
+ };
2733
2783
  UpdateEducationBody: {
2734
2784
  institutionName?: string;
2735
2785
  institutionUrl?: string;
@@ -2775,6 +2825,11 @@ interface components {
2775
2825
  channel: "messageEmails" | "applicationEmails";
2776
2826
  subscribed: boolean;
2777
2827
  };
2828
+ UpdatePasswordBody: {
2829
+ currentPassword: string;
2830
+ /** @description Minimum 8 characters. */
2831
+ newPassword: string;
2832
+ };
2778
2833
  UpdatePipelineStageBody: {
2779
2834
  label?: string;
2780
2835
  hidden?: boolean;
@@ -1,5 +1,8 @@
1
1
  interface components {
2
2
  schemas: {
3
+ AcceptCompanyMemberInviteBody: {
4
+ token: string;
5
+ };
3
6
  AccessCheckoutBody: {
4
7
  /**
5
8
  * @description The offer tier to purchase (from `GET /paywall/offers/enabled`).
@@ -262,6 +265,8 @@ interface components {
262
265
  email: string;
263
266
  displayName: string | null;
264
267
  emailVerified: boolean;
268
+ /** @description Whether the account has a password credential. False for OAuth/magic-link-only accounts; frontends use it to offer change-password vs set-password (the set flow is POST /auth/forgot-password). */
269
+ hasPassword: boolean;
265
270
  };
266
271
  BulkMoveApplicantsBody: {
267
272
  applicationIds: string[];
@@ -404,6 +409,34 @@ interface components {
404
409
  /** @description Source slug for the market. Use it as the `:market` segment of the market-scoped company browse. */
405
410
  slug: string;
406
411
  };
412
+ CompanyMember: {
413
+ id: string;
414
+ /** @enum {string} */
415
+ object: "company_member";
416
+ boardUserId: string;
417
+ displayName: string | null;
418
+ email: string;
419
+ /** @enum {string} */
420
+ role: "admin" | "member";
421
+ approvedBy: string | null;
422
+ /** Format: date-time */
423
+ createdAt: string;
424
+ };
425
+ CompanyMemberInvite: {
426
+ id: string;
427
+ /** @enum {string} */
428
+ object: "company_member_invite";
429
+ email: string;
430
+ /** Format: date-time */
431
+ createdAt: string;
432
+ /** Format: date-time */
433
+ expiresAt: string;
434
+ };
435
+ CompanyMemberInviteAcceptance: {
436
+ /** @enum {string} */
437
+ object: "company_member_invite_acceptance";
438
+ companySlug: string;
439
+ };
407
440
  CompanyMembership: {
408
441
  id: string;
409
442
  /** @enum {string} */
@@ -558,6 +591,9 @@ interface components {
558
591
  /** @description Live published-job count for this company on the board. */
559
592
  jobCount: number;
560
593
  };
594
+ ConfirmEmailChangeBody: {
595
+ token: string;
596
+ };
561
597
  ConfirmWorkEmailBody: {
562
598
  token: string;
563
599
  };
@@ -618,6 +654,10 @@ interface components {
618
654
  /** @description URL-friendly slug for the company. Auto-generated from `name` when omitted. */
619
655
  slug?: string;
620
656
  };
657
+ CreateCompanyMemberInviteBody: {
658
+ /** Format: email */
659
+ email: string;
660
+ };
621
661
  CreateEducationBody: {
622
662
  institutionName: string;
623
663
  institutionUrl?: string;
@@ -1982,6 +2022,8 @@ interface components {
1982
2022
  salaryCurrency: string | null;
1983
2023
  salaryTimeframe: string | null;
1984
2024
  isFeatured: boolean;
2025
+ /** @description True when this listing is a Forager CPC / partner-feed ad persisted on the board. */
2026
+ isSponsored: boolean;
1985
2027
  /** @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. */
1986
2028
  summary: string | null;
1987
2029
  locationLabel: string | null;
@@ -2154,6 +2196,10 @@ interface components {
2154
2196
  reason: "spam" | "harassment" | "misrepresentation" | "other";
2155
2197
  freeText?: string;
2156
2198
  };
2199
+ RequestEmailChangeBody: {
2200
+ /** Format: email */
2201
+ email: string;
2202
+ };
2157
2203
  Resume: {
2158
2204
  /** @enum {string} */
2159
2205
  object: "resume";
@@ -2730,6 +2776,10 @@ interface components {
2730
2776
  jobSearchStatusVisibleTo?: "everyone" | "employers_only";
2731
2777
  openToRelocate?: boolean;
2732
2778
  };
2779
+ UpdateCompanyMemberRoleBody: {
2780
+ /** @enum {string} */
2781
+ role: "admin" | "member";
2782
+ };
2733
2783
  UpdateEducationBody: {
2734
2784
  institutionName?: string;
2735
2785
  institutionUrl?: string;
@@ -2775,6 +2825,11 @@ interface components {
2775
2825
  channel: "messageEmails" | "applicationEmails";
2776
2826
  subscribed: boolean;
2777
2827
  };
2828
+ UpdatePasswordBody: {
2829
+ currentPassword: string;
2830
+ /** @description Minimum 8 characters. */
2831
+ newPassword: string;
2832
+ };
2778
2833
  UpdatePipelineStageBody: {
2779
2834
  label?: string;
2780
2835
  hidden?: boolean;
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-COlkrizX.mjs';
1
+ import { S as Schemas } from './_spec-BJah6GIZ.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-COlkrizX.js';
1
+ import { S as Schemas } from './_spec-BJah6GIZ.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-COlkrizX.mjs';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-C1Mxty1n.mjs';
1
+ import { S as Schemas } from './_spec-BJah6GIZ.mjs';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-C27qlt6o.mjs';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-COlkrizX.js';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-DOF3QXdq.js';
1
+ import { S as Schemas } from './_spec-BJah6GIZ.js';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-Ay-V6Q6y.js';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -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-D51C3gB5.js';
2
- import { P as PublicJob } from './jobs-DOF3QXdq.js';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-KDx9U0nw.js';
2
+ import { P as PublicJob } from './jobs-Ay-V6Q6y.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-JgFR-2UW.mjs';
2
- import { P as PublicJob } from './jobs-C1Mxty1n.mjs';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-CpR7o9bL.mjs';
2
+ import { P as PublicJob } from './jobs-C27qlt6o.mjs';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any