@cavuno/board 4.60.0 → 4.62.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 (68) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/{_spec-DtsIUScQ.d.mts → _spec-BCwCDDX2.d.mts} +81 -0
  3. package/dist/{_spec-DtsIUScQ.d.ts → _spec-BCwCDDX2.d.ts} +81 -0
  4. package/dist/bin.mjs +12 -5
  5. package/dist/{blog-VKligt-6.d.ts → blog-BQ869KiE.d.ts} +1 -1
  6. package/dist/{blog-BKnmvibN.d.mts → blog-C0wl_hx8.d.mts} +1 -1
  7. package/dist/{board-CWx0nu39.d.mts → board-D2ImSfzo.d.mts} +2 -2
  8. package/dist/{board-QuwKsDOt.d.ts → board-D5x6dfUk.d.ts} +2 -2
  9. package/dist/{breadcrumbs-8k7a572J.d.ts → breadcrumbs-CkIH_iCI.d.ts} +2 -2
  10. package/dist/{breadcrumbs-BEnF2UAW.d.mts → breadcrumbs-DqkhouJc.d.mts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/{chunk-R3QB3WM6.mjs → chunk-4KMZZR3A.mjs} +1 -1
  13. package/dist/{chunk-M4CX64RC.mjs → chunk-GRQRZRLO.mjs} +8 -1
  14. package/dist/{chunk-LO7D3AIX.mjs → chunk-HHMY3W7T.mjs} +7 -4
  15. package/dist/{chunk-MSY7ERBY.mjs → chunk-RAE63XH5.mjs} +3 -1
  16. package/dist/doctor.js +12 -5
  17. package/dist/doctor.mjs +12 -5
  18. package/dist/filters.d.mts +2 -2
  19. package/dist/filters.d.ts +2 -2
  20. package/dist/format.d.mts +4 -4
  21. package/dist/format.d.ts +4 -4
  22. package/dist/format.js +3 -1
  23. package/dist/format.mjs +2 -2
  24. package/dist/go.js +3 -1
  25. package/dist/go.mjs +1 -1
  26. package/dist/index.d.mts +191 -14
  27. package/dist/index.d.ts +191 -14
  28. package/dist/index.js +169 -3
  29. package/dist/index.mjs +162 -3
  30. package/dist/{jobs-D-vpMQ6a.d.mts → jobs-B86GBnD5.d.mts} +1 -1
  31. package/dist/{jobs-wc4h0pSV.d.ts → jobs-Bjb0KdER.d.ts} +1 -1
  32. package/dist/paths.d.mts +2 -0
  33. package/dist/paths.d.ts +2 -0
  34. package/dist/paths.js +3 -1
  35. package/dist/paths.mjs +1 -1
  36. package/dist/{roles-B_d0igKI.d.mts → roles-D745cT5b.d.mts} +3 -1
  37. package/dist/{roles-B_d0igKI.d.ts → roles-D745cT5b.d.ts} +3 -1
  38. package/dist/route-contract.d.mts +2 -2
  39. package/dist/route-contract.d.ts +2 -2
  40. package/dist/route-contract.js +9 -4
  41. package/dist/route-contract.mjs +2 -2
  42. package/dist/{search-Cgel3YbJ.d.ts → search-CQHlSXMC.d.ts} +1 -1
  43. package/dist/{search-B4fsEVF8.d.mts → search-PLWHFWyZ.d.mts} +1 -1
  44. package/dist/{seo-BGyEzgAX.d.ts → seo-C8JYKw0_.d.ts} +1 -1
  45. package/dist/{seo-BgMmH3QS.d.mts → seo-cXaJTDHD.d.mts} +1 -1
  46. package/dist/seo-files.d.mts +2 -2
  47. package/dist/seo-files.d.ts +2 -2
  48. package/dist/seo.d.mts +6 -6
  49. package/dist/seo.d.ts +6 -6
  50. package/dist/seo.js +3 -1
  51. package/dist/seo.mjs +2 -2
  52. package/dist/server.d.mts +6 -6
  53. package/dist/server.d.ts +6 -6
  54. package/dist/server.mjs +1 -1
  55. package/dist/sitemap.d.mts +6 -6
  56. package/dist/sitemap.d.ts +6 -6
  57. package/dist/sitemap.js +3 -1
  58. package/dist/sitemap.mjs +2 -2
  59. package/dist/suggest.d.mts +2 -2
  60. package/dist/suggest.d.ts +2 -2
  61. package/dist/well-known.d.mts +1 -1
  62. package/dist/well-known.d.ts +1 -1
  63. package/dist/well-known.js +9 -4
  64. package/dist/well-known.mjs +2 -2
  65. package/package.json +1 -1
  66. package/skills/cavuno-board-job-alerts/SKILL.md +31 -0
  67. package/skills/cavuno-board-products/SKILL.md +27 -1
  68. package/skills/manifest.json +2 -2
package/dist/index.mjs CHANGED
@@ -25,7 +25,7 @@ import {
25
25
  isSsoRequired,
26
26
  isUnauthorized,
27
27
  isValidationError
28
- } from "./chunk-M4CX64RC.mjs";
28
+ } from "./chunk-GRQRZRLO.mjs";
29
29
 
30
30
  // src/query.ts
31
31
  function toSearchParams(query) {
@@ -46,7 +46,7 @@ function toSearchParams(query) {
46
46
  }
47
47
 
48
48
  // src/version.ts
49
- var SDK_VERSION = "4.60.0";
49
+ var SDK_VERSION = "4.62.0";
50
50
 
51
51
  // src/client.ts
52
52
  function isRawBody(body) {
@@ -414,6 +414,22 @@ function authNamespace(client, board = "") {
414
414
  body
415
415
  });
416
416
  },
417
+ /**
418
+ * Confirm a profile item's email-domain check with the token from the
419
+ * emailed link. No session required: the single-use token is the
420
+ * authorization. Returns the item, now verified. Any rejected token is a
421
+ * 401 `BoardApiError`; start the check again to recover.
422
+ *
423
+ * @example
424
+ * const item = await board.auth.verifyItemEmail({ token });
425
+ */
426
+ verifyItemEmail(body, options) {
427
+ return client.fetch("/auth/verify-item-email", {
428
+ ...options,
429
+ method: "POST",
430
+ body
431
+ });
432
+ },
417
433
  /**
418
434
  * Verify the signed-in board user's email with the 6-digit code from the
419
435
  * verification email (requires the bearer). Resolves void (204); an
@@ -945,7 +961,11 @@ function jobAlertsNamespace(client) {
945
961
  query
946
962
  });
947
963
  },
948
- /** Deactivate a subscription via the HMAC manage token. */
964
+ /**
965
+ * Deactivate a subscription via the HMAC manage token. Spread
966
+ * `parseJobAlertUnsubscribeParams(url)` into the input to record which
967
+ * digest the subscriber unsubscribed from.
968
+ */
949
969
  unsubscribe(input, options) {
950
970
  return client.fetch("/job-alerts/unsubscribe", {
951
971
  ...options,
@@ -953,6 +973,19 @@ function jobAlertsNamespace(client) {
953
973
  body: input
954
974
  });
955
975
  },
976
+ /**
977
+ * Record a visitor opening a job from a digest email. Call it once on a
978
+ * job page load whose URL carries the digest params
979
+ * (`parseJobAlertClickParams(url)` returns them). Resolves with a uniform
980
+ * `accepted` receipt; the click is recorded after the response.
981
+ */
982
+ recordClick(input, options) {
983
+ return client.fetch("/job-alerts/clicks", {
984
+ ...options,
985
+ method: "POST",
986
+ body: input
987
+ });
988
+ },
956
989
  /** Re-activate a previously unsubscribed subscription via the manage token. */
957
990
  resubscribe(input, options) {
958
991
  return client.fetch("/job-alerts/resubscribe", {
@@ -1440,6 +1473,42 @@ function meNamespace(client) {
1440
1473
  body
1441
1474
  });
1442
1475
  },
1476
+ /**
1477
+ * Start an email-domain check of one item on my profile: a 6-digit code
1478
+ * and a link go to an address at the item's domain (for example a work
1479
+ * email at a current employer's website domain). Confirm with
1480
+ * `confirmEmailDomainVerification` or `board.auth.verifyItemEmail`.
1481
+ * `sent` is false when an email for the item went out under a minute
1482
+ * ago and nothing new was sent.
1483
+ *
1484
+ * @example
1485
+ * const check = await board.me.profile.submitEmailDomainVerification({
1486
+ * itemKey: 'experience:abc123',
1487
+ * email: 'me@acme.com',
1488
+ * });
1489
+ */
1490
+ submitEmailDomainVerification(body, options) {
1491
+ return client.fetch(
1492
+ "/me/profile/verifications/email-domain",
1493
+ { ...options, method: "POST", body }
1494
+ );
1495
+ },
1496
+ /**
1497
+ * Confirm an email-domain check with the 6-digit code from the email.
1498
+ * Returns the item, now verified; the emailed link stops working.
1499
+ *
1500
+ * @example
1501
+ * await board.me.profile.confirmEmailDomainVerification({
1502
+ * itemKey: 'experience:abc123',
1503
+ * code: '123456',
1504
+ * });
1505
+ */
1506
+ confirmEmailDomainVerification(body, options) {
1507
+ return client.fetch(
1508
+ "/me/profile/verifications/email-domain/confirm",
1509
+ { ...options, method: "POST", body }
1510
+ );
1511
+ },
1443
1512
  /**
1444
1513
  * Check whether a handle is available for me on this board (my own
1445
1514
  * current handle counts as available). Advisory — `update` re-checks.
@@ -4031,6 +4100,55 @@ function taxonomyNamespace(client) {
4031
4100
  };
4032
4101
  }
4033
4102
 
4103
+ // src/namespaces/tip-jar.ts
4104
+ function tipJarNamespace(client) {
4105
+ return {
4106
+ /**
4107
+ * The board's tip page. A `tip_jar_not_found` error (404) means the
4108
+ * board has no tip jar or it is archived: hide the page and its links.
4109
+ *
4110
+ * @example
4111
+ * const jar = await board.tipJar.get();
4112
+ * jar.suggestedCents; // [300, 500, 1000]
4113
+ */
4114
+ get(options) {
4115
+ return client.fetch("/tip-jar", options);
4116
+ },
4117
+ /**
4118
+ * Start a tip: returns an embedded Stripe Checkout mount kit (it expires
4119
+ * after 30 minutes). Signed in, the visitor's email is filled in on
4120
+ * Stripe's form. `amountCents` is at least `minimumCents`; send a `note`
4121
+ * only when `allowNote` is true.
4122
+ *
4123
+ * @example
4124
+ * const kit = await board.tipJar.checkout({ amountCents: 500 });
4125
+ * // mount Stripe's embedded checkout with kit.clientSecret
4126
+ */
4127
+ checkout(body, options) {
4128
+ return client.fetch("/tip-jar/checkout", {
4129
+ ...options,
4130
+ method: "POST",
4131
+ body
4132
+ });
4133
+ },
4134
+ /**
4135
+ * After Stripe returns the tipper (`session_id` on the return URL):
4136
+ * `processing` while a delayed payment clears, then `paid`, with the
4137
+ * amount, the masked receipt email and the thank-you message.
4138
+ *
4139
+ * @example
4140
+ * const s = await board.tipJar.getCheckout(sessionId);
4141
+ * if (s.status === 'paid') showThanks(s.thankYouMessage);
4142
+ */
4143
+ getCheckout(sessionId, options) {
4144
+ return client.fetch(
4145
+ `/tip-jar/checkout/${encodeURIComponent(sessionId)}`,
4146
+ options
4147
+ );
4148
+ }
4149
+ };
4150
+ }
4151
+
4034
4152
  // src/messaging-derive.ts
4035
4153
  function isOwnMessage(message, counterpartyId) {
4036
4154
  return message.authorBoardUserId !== counterpartyId;
@@ -4081,6 +4199,44 @@ function resolveApplyAction(state) {
4081
4199
  return action.kind === "sign-in" ? { kind: "sign-in" } : action;
4082
4200
  }
4083
4201
 
4202
+ // src/job-alert-links.ts
4203
+ var ID = /^[0-9A-Za-z]{16,64}$/;
4204
+ var EMAIL_ID = /^[0-9a-f]{16}$/;
4205
+ var MATCHER_VERSION = /^[a-z0-9-]{1,64}$/;
4206
+ var POSITION = /^[1-9][0-9]{0,2}$/;
4207
+ var MAX_POSITION = 100;
4208
+ function searchParamsOf(url) {
4209
+ if (url instanceof URLSearchParams) return url;
4210
+ if (url instanceof URL) return url.searchParams;
4211
+ if (url.startsWith("?") || !url.includes("/") && url.includes("=")) {
4212
+ return new URLSearchParams(url);
4213
+ }
4214
+ try {
4215
+ return new URL(url, "https://board.invalid").searchParams;
4216
+ } catch {
4217
+ return new URLSearchParams();
4218
+ }
4219
+ }
4220
+ function parseJobAlertClickParams(url) {
4221
+ const params = searchParamsOf(url);
4222
+ const alertId = params.get("ja_alert") ?? "";
4223
+ const emailId = params.get("ja_email") ?? "";
4224
+ const positionRaw = params.get("ja_pos") ?? "";
4225
+ const matcherVersion = params.get("ja_mv") ?? "";
4226
+ const position = POSITION.test(positionRaw) ? Number(positionRaw) : NaN;
4227
+ if (!ID.test(alertId) || !EMAIL_ID.test(emailId) || !MATCHER_VERSION.test(matcherVersion) || !(position >= 1 && position <= MAX_POSITION)) {
4228
+ return null;
4229
+ }
4230
+ return { alertId, emailId, position, matcherVersion };
4231
+ }
4232
+ function parseJobAlertUnsubscribeParams(url) {
4233
+ const params = searchParamsOf(url);
4234
+ const alertId = params.get("ja_alert") ?? "";
4235
+ const emailId = params.get("ja_email") ?? "";
4236
+ if (!ID.test(alertId) || !EMAIL_ID.test(emailId)) return null;
4237
+ return { alertId, emailId };
4238
+ }
4239
+
4084
4240
  // src/index.ts
4085
4241
  function createBoardClient(options) {
4086
4242
  const client = new BoardClient({
@@ -4144,6 +4300,7 @@ function createBoardClient(options) {
4144
4300
  paywall: paywallNamespace(client),
4145
4301
  products: productsNamespace(client),
4146
4302
  purchases: purchasesNamespace(client),
4303
+ tipJar: tipJarNamespace(client),
4147
4304
  sitemap: sitemapNamespace(client)
4148
4305
  };
4149
4306
  }
@@ -4176,6 +4333,8 @@ export {
4176
4333
  isValidationError,
4177
4334
  lastOwnMessageId,
4178
4335
  paginate,
4336
+ parseJobAlertClickParams,
4337
+ parseJobAlertUnsubscribeParams,
4179
4338
  parseOAuthCompletion,
4180
4339
  resolveApplyAction,
4181
4340
  resolveApplyDecision,
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DtsIUScQ.mjs';
1
+ import { S as Schemas } from './_spec-BCwCDDX2.mjs';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DtsIUScQ.js';
1
+ import { S as Schemas } from './_spec-BCwCDDX2.js';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
package/dist/paths.d.mts CHANGED
@@ -186,6 +186,8 @@ declare const BOARD_PATHS: {
186
186
  readonly products: "/products";
187
187
  /** A signed-in board user's purchased products. */
188
188
  readonly mePurchases: "/me/purchases";
189
+ /** The tip page: visitors tip the board through its tip jar. */
190
+ readonly tip: "/tip";
189
191
  };
190
192
  /**
191
193
  * Email `/go` indirection paths. Pure builders so
package/dist/paths.d.ts CHANGED
@@ -186,6 +186,8 @@ declare const BOARD_PATHS: {
186
186
  readonly products: "/products";
187
187
  /** A signed-in board user's purchased products. */
188
188
  readonly mePurchases: "/me/purchases";
189
+ /** The tip page: visitors tip the board through its tip jar. */
190
+ readonly tip: "/tip";
189
191
  };
190
192
  /**
191
193
  * Email `/go` indirection paths. Pure builders so
package/dist/paths.js CHANGED
@@ -171,7 +171,9 @@ var BOARD_PATHS = {
171
171
  /** The digital product catalogue. */
172
172
  products: "/products",
173
173
  /** A signed-in board user's purchased products. */
174
- mePurchases: "/me/purchases"
174
+ mePurchases: "/me/purchases",
175
+ /** The tip page: visitors tip the board through its tip jar. */
176
+ tip: "/tip"
175
177
  };
176
178
  function goJobPath(jobId) {
177
179
  return `/go/job/${jobId}`;
package/dist/paths.mjs CHANGED
@@ -25,7 +25,7 @@ import {
25
25
  suggestionPath,
26
26
  talentLocationPath,
27
27
  talentProfilePath
28
- } from "./chunk-MSY7ERBY.mjs";
28
+ } from "./chunk-RAE63XH5.mjs";
29
29
  export {
30
30
  BOARD_PATHS,
31
31
  blogAuthorPath,
@@ -67,7 +67,9 @@ type RouteRole = 'jobDetail' | 'jobsCategory' | 'jobsSkill' | 'jobsLocation' | '
67
67
  /** A digital product's page. */
68
68
  | 'product'
69
69
  /** A purchase's download page (emails link here). */
70
- | 'purchase' | 'home' | 'jobs' | 'companies' | 'salaries' | 'salaryCompanies' | 'salaryTitles' | 'salarySkills' | 'salaryLocations' | 'blog' | 'about' | 'privacyPolicy' | 'termsOfService' | 'cookiePolicy' | 'impressum' | 'talent' | 'employers' | 'alertsManage' | 'alertsConfirm' | 'products' | 'mePurchases';
70
+ | 'purchase' | 'home' | 'jobs' | 'companies' | 'salaries' | 'salaryCompanies' | 'salaryTitles' | 'salarySkills' | 'salaryLocations' | 'blog' | 'about' | 'privacyPolicy' | 'termsOfService' | 'cookiePolicy' | 'impressum' | 'talent' | 'employers' | 'alertsManage' | 'alertsConfirm' | 'products' | 'mePurchases'
71
+ /** The tip page (the board's tip jar); optional, never required. */
72
+ | 'tip';
71
73
  /**
72
74
  * Exact param-name set per role, derived from each helper's signature.
73
75
  * Empty arrays = static / zero-param roles (never inferred by signature).
@@ -67,7 +67,9 @@ type RouteRole = 'jobDetail' | 'jobsCategory' | 'jobsSkill' | 'jobsLocation' | '
67
67
  /** A digital product's page. */
68
68
  | 'product'
69
69
  /** A purchase's download page (emails link here). */
70
- | 'purchase' | 'home' | 'jobs' | 'companies' | 'salaries' | 'salaryCompanies' | 'salaryTitles' | 'salarySkills' | 'salaryLocations' | 'blog' | 'about' | 'privacyPolicy' | 'termsOfService' | 'cookiePolicy' | 'impressum' | 'talent' | 'employers' | 'alertsManage' | 'alertsConfirm' | 'products' | 'mePurchases';
70
+ | 'purchase' | 'home' | 'jobs' | 'companies' | 'salaries' | 'salaryCompanies' | 'salaryTitles' | 'salarySkills' | 'salaryLocations' | 'blog' | 'about' | 'privacyPolicy' | 'termsOfService' | 'cookiePolicy' | 'impressum' | 'talent' | 'employers' | 'alertsManage' | 'alertsConfirm' | 'products' | 'mePurchases'
71
+ /** The tip page (the board's tip jar); optional, never required. */
72
+ | 'tip';
71
73
  /**
72
74
  * Exact param-name set per role, derived from each helper's signature.
73
75
  * Empty arrays = static / zero-param roles (never inferred by signature).
@@ -1,5 +1,5 @@
1
- import { R as RouteEntry, a as RouteRole, C as ClassifyResult, b as CompileResult, V as ValidateManifestError, c as ValidateManifestResult, M as ManifestV1 } from './roles-B_d0igKI.mjs';
2
- export { A as ALL_ROLES, d as Ambiguity, e as CANONICAL_MANIFEST, f as REQUIRED_ROLES, g as ROLE_PARAM_REGISTRY, i as isRouteRole } from './roles-B_d0igKI.mjs';
1
+ import { R as RouteEntry, a as RouteRole, C as ClassifyResult, b as CompileResult, V as ValidateManifestError, c as ValidateManifestResult, M as ManifestV1 } from './roles-D745cT5b.mjs';
2
+ export { A as ALL_ROLES, d as Ambiguity, e as CANONICAL_MANIFEST, f as REQUIRED_ROLES, g as ROLE_PARAM_REGISTRY, i as isRouteRole } from './roles-D745cT5b.mjs';
3
3
 
4
4
  /**
5
5
  * Classify routes into role assignments. Markers (keyed by `sourcePath`)
@@ -1,5 +1,5 @@
1
- import { R as RouteEntry, a as RouteRole, C as ClassifyResult, b as CompileResult, V as ValidateManifestError, c as ValidateManifestResult, M as ManifestV1 } from './roles-B_d0igKI.js';
2
- export { A as ALL_ROLES, d as Ambiguity, e as CANONICAL_MANIFEST, f as REQUIRED_ROLES, g as ROLE_PARAM_REGISTRY, i as isRouteRole } from './roles-B_d0igKI.js';
1
+ import { R as RouteEntry, a as RouteRole, C as ClassifyResult, b as CompileResult, V as ValidateManifestError, c as ValidateManifestResult, M as ManifestV1 } from './roles-D745cT5b.js';
2
+ export { A as ALL_ROLES, d as Ambiguity, e as CANONICAL_MANIFEST, f as REQUIRED_ROLES, g as ROLE_PARAM_REGISTRY, i as isRouteRole } from './roles-D745cT5b.js';
3
3
 
4
4
  /**
5
5
  * Classify routes into role assignments. Markers (keyed by `sourcePath`)
@@ -137,7 +137,9 @@ var BOARD_PATHS = {
137
137
  /** The digital product catalogue. */
138
138
  products: "/products",
139
139
  /** A signed-in board user's purchased products. */
140
- mePurchases: "/me/purchases"
140
+ mePurchases: "/me/purchases",
141
+ /** The tip page: visitors tip the board through its tip jar. */
142
+ tip: "/tip"
141
143
  };
142
144
 
143
145
  // src/route-contract/roles.ts
@@ -177,7 +179,8 @@ var ROLE_PARAM_REGISTRY = {
177
179
  alertsManage: [],
178
180
  alertsConfirm: [],
179
181
  products: [],
180
- mePurchases: []
182
+ mePurchases: [],
183
+ tip: []
181
184
  };
182
185
  var REQUIRED_ROLES = [
183
186
  "jobDetail",
@@ -229,7 +232,8 @@ var CANONICAL_MANIFEST = {
229
232
  alertsManage: "/alerts/manage",
230
233
  alertsConfirm: "/alerts/confirm",
231
234
  products: BOARD_PATHS.products,
232
- mePurchases: BOARD_PATHS.mePurchases
235
+ mePurchases: BOARD_PATHS.mePurchases,
236
+ tip: BOARD_PATHS.tip
233
237
  }
234
238
  };
235
239
 
@@ -1155,7 +1159,8 @@ var ROLE_INDEX_PATHS = {
1155
1159
  product: BOARD_PATHS.products,
1156
1160
  purchase: BOARD_PATHS.home,
1157
1161
  products: BOARD_PATHS.products,
1158
- mePurchases: BOARD_PATHS.home
1162
+ mePurchases: BOARD_PATHS.home,
1163
+ tip: BOARD_PATHS.home
1159
1164
  };
1160
1165
  function splitSegments(path) {
1161
1166
  const withoutLeading = path.startsWith("/") ? path.slice(1) : path;
@@ -26,8 +26,8 @@ import {
26
26
  parseTanStackRoutes,
27
27
  sameParamSet,
28
28
  validateManifest
29
- } from "./chunk-LO7D3AIX.mjs";
30
- import "./chunk-MSY7ERBY.mjs";
29
+ } from "./chunk-HHMY3W7T.mjs";
30
+ import "./chunk-RAE63XH5.mjs";
31
31
  export {
32
32
  ALL_ROLES,
33
33
  CANONICAL_MANIFEST,
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DtsIUScQ.js';
1
+ import { S as Schemas } from './_spec-BCwCDDX2.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DtsIUScQ.mjs';
1
+ import { S as Schemas } from './_spec-BCwCDDX2.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DtsIUScQ.js';
1
+ import { S as Schemas } from './_spec-BCwCDDX2.js';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DtsIUScQ.mjs';
1
+ import { S as Schemas } from './_spec-BCwCDDX2.mjs';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-BgMmH3QS.mjs';
2
- import './_spec-DtsIUScQ.mjs';
1
+ import { B as BoardSeo } from './seo-cXaJTDHD.mjs';
2
+ import './_spec-BCwCDDX2.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-BGyEzgAX.js';
2
- import './_spec-DtsIUScQ.js';
1
+ import { B as BoardSeo } from './seo-C8JYKw0_.js';
2
+ import './_spec-BCwCDDX2.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
package/dist/seo.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BKnmvibN.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-BEnF2UAW.mjs';
3
- export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-BEnF2UAW.mjs';
4
- import './_spec-DtsIUScQ.mjs';
5
- import './board-CWx0nu39.mjs';
6
- import './jobs-D-vpMQ6a.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-C0wl_hx8.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-DqkhouJc.mjs';
3
+ export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-DqkhouJc.mjs';
4
+ import './_spec-BCwCDDX2.mjs';
5
+ import './board-D2ImSfzo.mjs';
6
+ import './jobs-B86GBnD5.mjs';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/seo.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-VKligt-6.js';
2
- import { e as JsonLdObject } from './breadcrumbs-8k7a572J.js';
3
- export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-8k7a572J.js';
4
- import './_spec-DtsIUScQ.js';
5
- import './board-QuwKsDOt.js';
6
- import './jobs-wc4h0pSV.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BQ869KiE.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-CkIH_iCI.js';
3
+ export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-CkIH_iCI.js';
4
+ import './_spec-BCwCDDX2.js';
5
+ import './board-D5x6dfUk.js';
6
+ import './jobs-Bjb0KdER.js';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/seo.js CHANGED
@@ -211,7 +211,9 @@ var BOARD_PATHS = {
211
211
  /** The digital product catalogue. */
212
212
  products: "/products",
213
213
  /** A signed-in board user's purchased products. */
214
- mePurchases: "/me/purchases"
214
+ mePurchases: "/me/purchases",
215
+ /** The tip page: visitors tip the board through its tip jar. */
216
+ tip: "/tip"
215
217
  };
216
218
  function boardUrl(origin, path) {
217
219
  return `${origin.replace(/\/+$/, "")}${path}`;
package/dist/seo.mjs CHANGED
@@ -17,11 +17,11 @@ import {
17
17
  skillSalaryJsonLd,
18
18
  sortBySeniority,
19
19
  titleSalaryJsonLd
20
- } from "./chunk-R3QB3WM6.mjs";
20
+ } from "./chunk-4KMZZR3A.mjs";
21
21
  import {
22
22
  boardUrl,
23
23
  jobDetailPath
24
- } from "./chunk-MSY7ERBY.mjs";
24
+ } from "./chunk-RAE63XH5.mjs";
25
25
 
26
26
  // src/seo/blog.ts
27
27
  function createBlogArticleJsonLd({
package/dist/server.d.mts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-DtsIUScQ.mjs';
3
- import './search-B4fsEVF8.mjs';
4
- import './jobs-D-vpMQ6a.mjs';
5
- import './board-CWx0nu39.mjs';
6
- import './seo-BgMmH3QS.mjs';
7
- import './blog-BKnmvibN.mjs';
2
+ import './_spec-BCwCDDX2.mjs';
3
+ import './search-PLWHFWyZ.mjs';
4
+ import './jobs-B86GBnD5.mjs';
5
+ import './board-D2ImSfzo.mjs';
6
+ import './seo-cXaJTDHD.mjs';
7
+ import './blog-C0wl_hx8.mjs';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-DtsIUScQ.js';
3
- import './search-Cgel3YbJ.js';
4
- import './jobs-wc4h0pSV.js';
5
- import './board-QuwKsDOt.js';
6
- import './seo-BGyEzgAX.js';
7
- import './blog-VKligt-6.js';
2
+ import './_spec-BCwCDDX2.js';
3
+ import './search-CQHlSXMC.js';
4
+ import './jobs-Bjb0KdER.js';
5
+ import './board-D5x6dfUk.js';
6
+ import './seo-C8JYKw0_.js';
7
+ import './blog-BQ869KiE.js';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.mjs CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-Z4ALWIGS.mjs";
5
5
  import {
6
6
  isUnauthorized
7
- } from "./chunk-M4CX64RC.mjs";
7
+ } from "./chunk-GRQRZRLO.mjs";
8
8
 
9
9
  // src/server/cookie.ts
10
10
  var COOKIE_ATTRIBUTES = "Path=/; HttpOnly; Secure; SameSite=Lax";
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-DtsIUScQ.mjs';
3
- import './search-B4fsEVF8.mjs';
4
- import './jobs-D-vpMQ6a.mjs';
5
- import './board-CWx0nu39.mjs';
6
- import './seo-BgMmH3QS.mjs';
7
- import './blog-BKnmvibN.mjs';
2
+ import './_spec-BCwCDDX2.mjs';
3
+ import './search-PLWHFWyZ.mjs';
4
+ import './jobs-B86GBnD5.mjs';
5
+ import './board-D2ImSfzo.mjs';
6
+ import './seo-cXaJTDHD.mjs';
7
+ import './blog-C0wl_hx8.mjs';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-DtsIUScQ.js';
3
- import './search-Cgel3YbJ.js';
4
- import './jobs-wc4h0pSV.js';
5
- import './board-QuwKsDOt.js';
6
- import './seo-BGyEzgAX.js';
7
- import './blog-VKligt-6.js';
2
+ import './_spec-BCwCDDX2.js';
3
+ import './search-CQHlSXMC.js';
4
+ import './jobs-Bjb0KdER.js';
5
+ import './board-D5x6dfUk.js';
6
+ import './seo-C8JYKw0_.js';
7
+ import './blog-BQ869KiE.js';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.js CHANGED
@@ -252,7 +252,9 @@ var BOARD_PATHS = {
252
252
  /** The digital product catalogue. */
253
253
  products: "/products",
254
254
  /** A signed-in board user's purchased products. */
255
- mePurchases: "/me/purchases"
255
+ mePurchases: "/me/purchases",
256
+ /** The tip page: visitors tip the board through its tip jar. */
257
+ tip: "/tip"
256
258
  };
257
259
 
258
260
  // src/sitemap/walker.ts
package/dist/sitemap.mjs CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-DLSO6XXY.mjs";
4
4
  import {
5
5
  isNotFound
6
- } from "./chunk-M4CX64RC.mjs";
6
+ } from "./chunk-GRQRZRLO.mjs";
7
7
  import {
8
8
  BOARD_PATHS,
9
9
  blogAuthorPath,
@@ -19,7 +19,7 @@ import {
19
19
  salaryLocationPath,
20
20
  salarySkillPath,
21
21
  salaryTitlePath
22
- } from "./chunk-MSY7ERBY.mjs";
22
+ } from "./chunk-RAE63XH5.mjs";
23
23
 
24
24
  // src/sitemap/xml.ts
25
25
  var SITEMAP_BUCKETS = [
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-B4fsEVF8.mjs';
2
- import './_spec-DtsIUScQ.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-PLWHFWyZ.mjs';
2
+ import './_spec-BCwCDDX2.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
package/dist/suggest.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-Cgel3YbJ.js';
2
- import './_spec-DtsIUScQ.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-CQHlSXMC.js';
2
+ import './_spec-BCwCDDX2.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
@@ -1,4 +1,4 @@
1
- import { R as RouteEntry, a as RouteRole } from './roles-B_d0igKI.mjs';
1
+ import { R as RouteEntry, a as RouteRole } from './roles-D745cT5b.mjs';
2
2
 
3
3
  /**
4
4
  * Runtime well-known endpoint — Request → Response serving ManifestV1
@@ -1,4 +1,4 @@
1
- import { R as RouteEntry, a as RouteRole } from './roles-B_d0igKI.js';
1
+ import { R as RouteEntry, a as RouteRole } from './roles-D745cT5b.js';
2
2
 
3
3
  /**
4
4
  * Runtime well-known endpoint — Request → Response serving ManifestV1