@sonordev/site-kit 8.5.0 → 8.5.2

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 (97) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +4 -2
  3. package/agent-manifest.json +1 -1
  4. package/dist/{AnalyticsProvider-3HIPZXXN.js → AnalyticsProvider-HSJMHYBA.js} +6 -6
  5. package/dist/{ArticleViewTracker-3W5K63XV.js → ArticleViewTracker-XEA6ZY67.js} +7 -7
  6. package/dist/{BlocksPopup-VC5RQNUH.js → BlocksPopup-DUTOENMQ.js} +4 -4
  7. package/dist/{ChatWidget-ADJIZSDI.js → ChatWidget-PMVQTSEU.js} +6 -6
  8. package/dist/{FileField-JE2DVD3L.js → FileField-F7BG4XAZ.js} +3 -3
  9. package/dist/{FormSpotlight-KC62XBWL.js → FormSpotlight-RTPJPLQ3.js} +1 -1
  10. package/dist/{FormStage-XZD7EJBR.js → FormStage-UANGD66Z.js} +1 -1
  11. package/dist/{ManagedForm-TAFIWJ2B.js → ManagedForm-4AACRHEY.js} +7 -7
  12. package/dist/{ManagedNewsletterForm-5EHG2KP5.js → ManagedNewsletterForm-RWKFWZ72.js} +9 -9
  13. package/dist/{SignalCore-MXMF76SO.js → SignalCore-XULLPKPX.js} +5 -5
  14. package/dist/{SiteChat-KU3ML77D.js → SiteChat-P4CRBRJZ.js} +1 -1
  15. package/dist/{SiteDesignReporter-PUX3K532.js → SiteDesignReporter-QDVP4WMK.js} +5 -5
  16. package/dist/{SitePopups-IQ7FOHYF.js → SitePopups-US6VQN7X.js} +6 -6
  17. package/dist/{SitemapSync-JELTXYVM.js → SitemapSync-5FBRDGHG.js} +4 -4
  18. package/dist/_client/booking-widget.js +7 -5
  19. package/dist/affiliates/index.js +3 -3
  20. package/dist/analytics/index.js +6 -6
  21. package/dist/articles/index.js +1 -1
  22. package/dist/articles/server-ui.js +3 -3
  23. package/dist/articles/server.js +2 -2
  24. package/dist/chat/index.js +7 -7
  25. package/dist/{chunk-62AGFUP7.js → chunk-24NM64IV.js} +3 -3
  26. package/dist/{chunk-UAEAI7RS.js → chunk-27LYZVPP.js} +1 -1
  27. package/dist/{chunk-KBWRFZFP.js → chunk-2QFIYYMP.js} +1 -1
  28. package/dist/{chunk-TIP7B2IK.js → chunk-3PT6SO65.js} +3 -3
  29. package/dist/{chunk-VLDFUSTX.js → chunk-5BRHTBPO.js} +8 -2
  30. package/dist/{chunk-RA3N2VKJ.js → chunk-7HRYSLY2.js} +2 -2
  31. package/dist/{chunk-APTUCAXU.js → chunk-A7RZQI6H.js} +1 -1
  32. package/dist/{chunk-2UQ7AVYN.js → chunk-ANVHRT35.js} +1 -1
  33. package/dist/{chunk-2TPHS7KZ.js → chunk-CFSIGEUW.js} +1 -1
  34. package/dist/{chunk-XZ7I5E3I.js → chunk-DLTLXYOV.js} +1 -1
  35. package/dist/{chunk-AM7O5C4L.js → chunk-EQHGPB3J.js} +1 -1
  36. package/dist/{chunk-JL3JG4AH.js → chunk-FVXCQC7W.js} +1 -1
  37. package/dist/{chunk-D6K32TQM.js → chunk-GDQKDL3E.js} +2 -2
  38. package/dist/{chunk-BXKBRV6F.js → chunk-GLLFIE2R.js} +1 -1
  39. package/dist/{chunk-RVMN4QB7.js → chunk-GTVOB5RN.js} +1 -1
  40. package/dist/{chunk-2KTN6HBF.js → chunk-HNYECNCU.js} +2 -2
  41. package/dist/{chunk-NAU56CSZ.js → chunk-I4LMZNBN.js} +1 -1
  42. package/dist/{chunk-LKWLWD2L.js → chunk-ITQND6IB.js} +2 -2
  43. package/dist/{chunk-FBAHUETP.js → chunk-IXA7ZB6U.js} +1 -1
  44. package/dist/{chunk-PO2TRJPY.js → chunk-MTDVV5P3.js} +14 -7
  45. package/dist/{chunk-EVM4UCDI.js → chunk-N4ZCNYWF.js} +1 -1
  46. package/dist/{chunk-G5USOD3Z.js → chunk-OEA7U4HJ.js} +1 -1
  47. package/dist/{chunk-ZS4XW2PJ.js → chunk-OFQ3BU52.js} +1 -1
  48. package/dist/{chunk-H64ZZ76J.js → chunk-Q4Y3WIHE.js} +1 -1
  49. package/dist/{chunk-2VVC2HHY.js → chunk-T6U6J3QK.js} +1 -1
  50. package/dist/{chunk-53XFJAJI.js → chunk-UGZ3B5AK.js} +9 -9
  51. package/dist/{chunk-XVCUCZIF.js → chunk-YW3LNSBM.js} +1 -1
  52. package/dist/{chunk-7XSAO3B2.js → chunk-ZDUTXHM6.js} +2 -2
  53. package/dist/{chunk-2BZC7QMO.js → chunk-ZSU7KTIE.js} +1 -1
  54. package/dist/client/index.js +6 -6
  55. package/dist/config/index.d.ts +3 -1
  56. package/dist/config/index.js +1 -1
  57. package/dist/fleet/index.js +4 -4
  58. package/dist/forms/index.js +9 -9
  59. package/dist/forms/server.js +2 -2
  60. package/dist/images/index.js +4 -4
  61. package/dist/index.js +1 -1
  62. package/dist/layout/AiDiscoveryLinks.d.ts +4 -0
  63. package/dist/layout/SiteKitLayout.d.ts +5 -2
  64. package/dist/layout/client.js +9 -9
  65. package/dist/layout/index.d.ts +1 -0
  66. package/dist/layout/index.js +18 -12
  67. package/dist/llms/discovery-headers.d.ts +10 -2
  68. package/dist/llms/index.js +5 -5
  69. package/dist/maps/index.js +3 -3
  70. package/dist/mcp/sonor.js +8 -6
  71. package/dist/proxy/index.d.ts +3 -0
  72. package/dist/proxy/index.js +1 -1
  73. package/dist/revalidate/index.js +2 -2
  74. package/dist/runtime/index.js +3 -3
  75. package/dist/seo/client.js +4 -4
  76. package/dist/seo/index.js +4 -4
  77. package/dist/seo/llms.js +5 -5
  78. package/dist/seo/register-sitemap-cli.js +1 -1
  79. package/dist/seo/sitemap.js +2 -2
  80. package/dist/server/index.js +2 -2
  81. package/dist/shared/version.d.ts +1 -1
  82. package/dist/signal/index.js +2 -2
  83. package/dist/sitemap/index.js +2 -2
  84. package/dist/sync/api.d.ts +3 -0
  85. package/dist/sync/index.js +7 -5
  86. package/dist/website/images.js +4 -4
  87. package/dist/website/index.js +5 -5
  88. package/dist/website/popups.js +6 -6
  89. package/dist/{writeLLMsTxt-CH4GGLQ3.js → writeLLMsTxt-BAK5XMRR.js} +1 -1
  90. package/package.json +1 -1
  91. package/src/layout/README.md +33 -1
  92. package/src/llms/README.md +32 -53
  93. package/src/mcp/README.md +4 -3
  94. package/src/proxy/README.md +10 -3
  95. package/src/sync/README.md +8 -0
  96. package/dist/{chunk-ZKADJNR2.js → chunk-IPQKQEWI.js} +1 -1
  97. /package/dist/{chunk-E2TI6JFT.js → chunk-URZTBPZO.js} +0 -0
@@ -6,7 +6,7 @@ import { DEFAULT_HONEYPOT_FIELD } from './chunk-NJCTQH2P.js';
6
6
  import React, { useRef, useEffect, useState, useMemo, useCallback } from 'react';
7
7
  import { jsx, jsxs } from 'react/jsx-runtime';
8
8
 
9
- var loadInteractiveForm = () => import('./ManagedForm-TAFIWJ2B.js').then((m) => m.ManagedForm);
9
+ var loadInteractiveForm = () => import('./ManagedForm-4AACRHEY.js').then((m) => m.ManagedForm);
10
10
  var REPLAY_WAIT_MS = 8e3;
11
11
  function FormEnhancer({
12
12
  formId,
@@ -1,5 +1,5 @@
1
1
  import { secretsMatch, readCappedBody } from './chunk-XTRZGXB2.js';
2
- import { SITE_KIT_VERSION } from './chunk-2TPHS7KZ.js';
2
+ import { SITE_KIT_VERSION } from './chunk-CFSIGEUW.js';
3
3
 
4
4
  // src/llms/revalidate.ts
5
5
  function createLlmsRevalidateHandler(secret, options) {
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import { registerAnalyticsDispatcher } from './chunk-LCDVPAMR.js';
3
- import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-ZKADJNR2.js';
3
+ import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-IPQKQEWI.js';
4
4
  import { onPageLeave } from './chunk-L2V5PUFN.js';
5
5
  import { resolveAnalyticsTarget } from './chunk-DLM4FFNH.js';
6
- import { sonorFetch, sonorBeacon } from './chunk-D6K32TQM.js';
6
+ import { sonorFetch, sonorBeacon } from './chunk-GDQKDL3E.js';
7
7
  import { createContext, useRef, useEffect, useState, useMemo, useCallback, useContext } from 'react';
8
8
  import { usePathname } from 'next/navigation';
9
9
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { detectTimezone, releaseSlotHold, fetchBookingTypeDetails, fetchBookingTypes, fetchAvailability, createSlotHold, createBooking, formatDuration, formatDate, formatTime, prepareMeeting } from './chunk-VLDFUSTX.js';
2
+ import { detectTimezone, releaseSlotHold, fetchBookingTypeDetails, fetchBookingTypes, fetchAvailability, createSlotHold, createBooking, formatDuration, formatDate, formatTime, prepareMeeting } from './chunk-5BRHTBPO.js';
3
3
  import { readPublishedApiConfig, DEFAULT_SONOR_API_URL } from './chunk-W7OPEMGJ.js';
4
4
  import { useState, useRef, useMemo, useCallback, useEffect, useId } from 'react';
5
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -2,9 +2,9 @@
2
2
  import { VISUAL_VIEWPORT_GAP_PROPERTY } from './chunk-6T6CQVNL.js';
3
3
  import { GlassStyles } from './chunk-JE4A5S4F.js';
4
4
  import { DEFAULT_WIDGET_Z_INDEX } from './chunk-27FISYK4.js';
5
- import { useForm } from './chunk-UAEAI7RS.js';
5
+ import { useForm } from './chunk-27LYZVPP.js';
6
6
  import { parseColor, relativeLuminance, DARK_LUMINANCE, contrastRatio } from './chunk-S22FSH7C.js';
7
- import { sonorFetch } from './chunk-D6K32TQM.js';
7
+ import { sonorFetch } from './chunk-GDQKDL3E.js';
8
8
  import { readPublishedApiConfig } from './chunk-W7OPEMGJ.js';
9
9
  import { useState, useEffect, useRef, useLayoutEffect, useCallback, Fragment as Fragment$1 } from 'react';
10
10
  import { lexer } from 'marked';
@@ -1,4 +1,4 @@
1
- import { writeLLMsTxtToPublic } from './chunk-E2TI6JFT.js';
1
+ import { writeLLMsTxtToPublic } from './chunk-URZTBPZO.js';
2
2
  import { getSiteConfig } from './chunk-Z22QVHT4.js';
3
3
  import { buildFetch } from './chunk-UAYAJPEP.js';
4
4
  import { findAppDirForDiscovery } from './chunk-ZEGVKVD5.js';
@@ -1,26 +1,33 @@
1
1
  // src/llms/discovery-headers.ts
2
- var TYPE_MARKDOWN = '; type="text/markdown"';
3
2
  function safeHreflang(tag) {
4
3
  if (!/^[\w-]+$/.test(tag)) return null;
5
4
  return tag;
6
5
  }
7
- function buildAiDiscoveryHeaders(options) {
6
+ function aiDiscoveryLinks(options) {
8
7
  const base = options.siteUrl.replace(/\/$/, "");
9
8
  const path = options.llmsPath || "/llms.txt";
10
9
  const resolvedPath = path.startsWith("/") ? path : `/${path}`;
11
10
  const llmsUrl = `${base}${resolvedPath}`;
12
- const type = options.includeTypeParameter === false ? "" : TYPE_MARKDOWN;
13
- const segments = [`<${llmsUrl}>; rel="describedby"${type}`];
11
+ const type = options.includeTypeParameter === false ? void 0 : "text/markdown";
12
+ const links = [
13
+ { href: llmsUrl, rel: "describedby", type }
14
+ ];
14
15
  for (const alt of options.languageAlternates ?? []) {
15
16
  const hl = safeHreflang(alt.hreflang);
16
17
  if (!hl || !alt.href) continue;
17
- segments.push(`<${alt.href}>; rel="alternate"; hreflang="${hl}"${type}`);
18
+ links.push({ href: alt.href, rel: "alternate", hrefLang: hl, type });
18
19
  }
19
20
  if (options.mcpServerCard) {
20
21
  const card = typeof options.mcpServerCard === "string" ? options.mcpServerCard : "/.well-known/mcp-server-card";
21
22
  const cardUrl = /^https?:\/\//.test(card) ? card : `${base}${card.startsWith("/") ? card : `/${card}`}`;
22
- segments.push(`<${cardUrl}>; rel="service-desc"; type="application/json"`);
23
+ links.push({ href: cardUrl, rel: "service-desc", type: "application/json" });
23
24
  }
25
+ return links;
26
+ }
27
+ function buildAiDiscoveryHeaders(options) {
28
+ const segments = aiDiscoveryLinks(options).map(
29
+ ({ href, rel, type, hrefLang }) => `<${href}>; rel="${rel}"${hrefLang ? `; hreflang="${hrefLang}"` : ""}${type ? `; type="${type}"` : ""}`
30
+ );
24
31
  return {
25
32
  Link: segments.join(", ")
26
33
  };
@@ -37,4 +44,4 @@ function wantsLlmsDiscoveryLink(req) {
37
44
  return /text\/html|application\/xhtml\+xml|\*\/\*/i.test(accept);
38
45
  }
39
46
 
40
- export { buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink };
47
+ export { aiDiscoveryLinks, buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink };
@@ -1,4 +1,4 @@
1
- import { publishSiteCredential } from './chunk-JL3JG4AH.js';
1
+ import { publishSiteCredential } from './chunk-FVXCQC7W.js';
2
2
 
3
3
  // src/client/SiteKitCredential.tsx
4
4
  function SiteKitCredential({
@@ -1,4 +1,4 @@
1
- import { SITE_KIT_VERSION } from './chunk-2TPHS7KZ.js';
1
+ import { SITE_KIT_VERSION } from './chunk-CFSIGEUW.js';
2
2
 
3
3
  // src/shared/siteToken.ts
4
4
  var SITE_TOKEN_PREFIX = "st1.";
@@ -1,4 +1,4 @@
1
- import { generateLLMsTxt, generateLLMsFullTxt, appendAgentAccessSection } from './chunk-E2TI6JFT.js';
1
+ import { generateLLMsTxt, generateLLMsFullTxt, appendAgentAccessSection } from './chunk-URZTBPZO.js';
2
2
  import { createHash } from 'crypto';
3
3
  import { existsSync, readFileSync } from 'fs';
4
4
  import { join } from 'path';
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { sonorFetch } from './chunk-D6K32TQM.js';
2
+ import { sonorFetch } from './chunk-GDQKDL3E.js';
3
3
  import { useState, useCallback, useEffect } from 'react';
4
4
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
5
5
 
@@ -1,7 +1,7 @@
1
1
  import { trackedFreshFetch } from './chunk-UAYAJPEP.js';
2
2
  import { isNextControlFlow } from './chunk-C7TLGL3R.js';
3
3
  import { monotonicMs } from './chunk-MH2DSGC6.js';
4
- import { SITE_KIT_VERSION } from './chunk-2TPHS7KZ.js';
4
+ import { SITE_KIT_VERSION } from './chunk-CFSIGEUW.js';
5
5
  import 'server-only';
6
6
 
7
7
  var MINT_PATH = "/api/public/site-token";
@@ -1,12 +1,12 @@
1
1
  'use client';
2
2
  import { SITE_EDIT_PARAM } from './chunk-6G43IRWR.js';
3
- import { publishSiteCredential } from './chunk-JL3JG4AH.js';
4
- import { FleetHeartbeat } from './chunk-7XSAO3B2.js';
3
+ import { publishSiteCredential } from './chunk-FVXCQC7W.js';
4
+ import { FleetHeartbeat } from './chunk-ZDUTXHM6.js';
5
5
  import { useDeferredActivation } from './chunk-YC7ELZS3.js';
6
6
  import { resolveSiteHost } from './chunk-FESKKJAS.js';
7
- import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-ZKADJNR2.js';
7
+ import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-IPQKQEWI.js';
8
8
  import { announceFrameReady, isPrivatePreview, isCrossOriginFrame } from './chunk-DLM4FFNH.js';
9
- import { SignalBridge } from './chunk-XVCUCZIF.js';
9
+ import { SignalBridge } from './chunk-YW3LNSBM.js';
10
10
  import React, { useState, useRef, useCallback, useEffect, Suspense } from 'react';
11
11
  import dynamic from 'next/dynamic';
12
12
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
@@ -33,23 +33,23 @@ function startEditBridge() {
33
33
  };
34
34
  }
35
35
  var LazyAnalyticsProvider = dynamic(
36
- () => import('./AnalyticsProvider-3HIPZXXN.js').then((m) => ({ default: m.AnalyticsProvider })),
36
+ () => import('./AnalyticsProvider-HSJMHYBA.js').then((m) => ({ default: m.AnalyticsProvider })),
37
37
  { ssr: false }
38
38
  );
39
39
  var LazySiteChat = dynamic(
40
- () => import('./SiteChat-KU3ML77D.js').then((m) => ({ default: m.SiteChat })),
40
+ () => import('./SiteChat-P4CRBRJZ.js').then((m) => ({ default: m.SiteChat })),
41
41
  { ssr: false }
42
42
  );
43
43
  var LazySitePopups = dynamic(
44
- () => import('./SitePopups-IQ7FOHYF.js').then((m) => ({ default: m.SitePopups })),
44
+ () => import('./SitePopups-US6VQN7X.js').then((m) => ({ default: m.SitePopups })),
45
45
  { ssr: false }
46
46
  );
47
47
  var LazySiteDesignReporter = dynamic(
48
- () => import('./SiteDesignReporter-PUX3K532.js').then((m) => ({ default: m.SiteDesignReporter })),
48
+ () => import('./SiteDesignReporter-QDVP4WMK.js').then((m) => ({ default: m.SiteDesignReporter })),
49
49
  { ssr: false }
50
50
  );
51
51
  var LazySitemapSync = dynamic(
52
- () => import('./SitemapSync-JELTXYVM.js').then((m) => ({ default: m.SitemapSync })),
52
+ () => import('./SitemapSync-5FBRDGHG.js').then((m) => ({ default: m.SitemapSync })),
53
53
  { ssr: false }
54
54
  );
55
55
  function SiteKitClientProviders({
@@ -54,7 +54,7 @@ function useSignal() {
54
54
  return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
55
55
  }
56
56
  var LazySignalCore = dynamic(
57
- () => import('./SignalCore-MXMF76SO.js').then((m) => ({ default: m.SignalCore })),
57
+ () => import('./SignalCore-XULLPKPX.js').then((m) => ({ default: m.SignalCore })),
58
58
  { ssr: false }
59
59
  );
60
60
  function SignalBridge({
@@ -2,8 +2,8 @@
2
2
  import { sanitizeFleetVersion, buildFleetHeartbeatPayload } from './chunk-ZTZQPYP6.js';
3
3
  import { useDeferredActivation } from './chunk-YC7ELZS3.js';
4
4
  import { resolveAnalyticsTarget } from './chunk-DLM4FFNH.js';
5
- import { sonorFetch } from './chunk-D6K32TQM.js';
6
- import { SITE_KIT_VERSION } from './chunk-2TPHS7KZ.js';
5
+ import { sonorFetch } from './chunk-GDQKDL3E.js';
6
+ import { SITE_KIT_VERSION } from './chunk-CFSIGEUW.js';
7
7
  import { useRef, useEffect } from 'react';
8
8
 
9
9
  // src/fleet/heartbeat.ts
@@ -1,4 +1,4 @@
1
- import { FormEnhancer } from './chunk-BXKBRV6F.js';
1
+ import { FormEnhancer } from './chunk-GLLFIE2R.js';
2
2
  import { StaticForm } from './chunk-LNSF6BJC.js';
3
3
  import { serverApiFetch } from './chunk-C7TLGL3R.js';
4
4
  import { jsx } from 'react/jsx-runtime';
@@ -1,14 +1,14 @@
1
1
  'use client';
2
- export { SiteKitCredential } from '../chunk-EVM4UCDI.js';
3
- import '../chunk-JL3JG4AH.js';
2
+ export { SiteKitCredential } from '../chunk-N4ZCNYWF.js';
3
+ import '../chunk-FVXCQC7W.js';
4
4
  export { VISUAL_VIEWPORT_GAP_PROPERTY, VisualViewportGap, useVisualViewportGap } from '../chunk-6T6CQVNL.js';
5
5
  export { useDeferredActivation } from '../chunk-YC7ELZS3.js';
6
6
  import '../chunk-FESKKJAS.js';
7
7
  import '../chunk-A4CC4ZG3.js';
8
8
  export { trackConversion, trackEvent } from '../chunk-LCDVPAMR.js';
9
- export { getOrCreateSessionId, getOrCreateVisitorId, useSiteKitIdentity } from '../chunk-ZKADJNR2.js';
10
- import '../chunk-5TM3WPCI.js';
9
+ export { getOrCreateSessionId, getOrCreateVisitorId, useSiteKitIdentity } from '../chunk-IPQKQEWI.js';
11
10
  import '../chunk-GJWI74ZZ.js';
12
- import '../chunk-G5USOD3Z.js';
13
- import '../chunk-2TPHS7KZ.js';
11
+ import '../chunk-5TM3WPCI.js';
12
+ import '../chunk-OEA7U4HJ.js';
13
+ import '../chunk-CFSIGEUW.js';
14
14
  import '../chunk-PKBMQBKP.js';
@@ -20,7 +20,7 @@
20
20
  * })
21
21
  * ```
22
22
  *
23
- * @example GEO — `Link: rel="describedby"` for `/llms.txt` on every page:
23
+ * @example Legacy HTTP discovery (prefer SiteKitLayout HTML discovery to preserve preloads):
24
24
  * ```ts
25
25
  * export default withSiteKitConfig({
26
26
  * llmsTxtDiscoveryLink: true,
@@ -43,6 +43,8 @@ export interface SiteKitNextConfig {
43
43
  /** Any raw next.config overrides — deep merged last */
44
44
  nextConfig?: NextConfig;
45
45
  /**
46
+ * @deprecated Prefer SiteKitLayout's llmsDiscovery. Config Link headers can
47
+ * replace framework preload headers on some hosts. Existing behavior is retained.
46
48
  * When true, append `Link: rel="describedby"` for `/llms.txt` on all routes (machine discovery).
47
49
  * Uses `NEXT_PUBLIC_SITE_URL`, then `SITE_BASE_URL`, then `VERCEL_URL` (https) when no explicit `siteUrl`.
48
50
  * If you also set `nextConfig.headers`, that replaces this helper’s `headers()` — merge the `Link` value manually or call `buildAiDiscoveryHeaders`.
@@ -1,5 +1,5 @@
1
1
  import { buildSecurityHeaders } from '../chunk-3QI26673.js';
2
- import { buildAiDiscoveryHeaders } from '../chunk-PO2TRJPY.js';
2
+ import { buildAiDiscoveryHeaders } from '../chunk-MTDVV5P3.js';
3
3
  import '../chunk-PKBMQBKP.js';
4
4
 
5
5
  // src/config/index.ts
@@ -1,11 +1,11 @@
1
1
  'use client';
2
- export { FLEET_HEARTBEAT_PATH, FleetHeartbeat, detectNextVersion, sendFleetHeartbeat } from '../chunk-7XSAO3B2.js';
2
+ export { FLEET_HEARTBEAT_PATH, FleetHeartbeat, detectNextVersion, sendFleetHeartbeat } from '../chunk-ZDUTXHM6.js';
3
3
  export { FLEET_CONTRACT_VERSION, FLEET_MODULES, FLEET_MODULES_MAX, FLEET_SITE_MAX_LENGTH, FLEET_VERSION_MAX_LENGTH, FLEET_VERSION_PATTERN, buildFleetHeartbeatPayload, isFleetModule, normalizeFleetModules, normalizeFleetSite, sanitizeFleetVersion } from '../chunk-ZTZQPYP6.js';
4
4
  import '../chunk-YC7ELZS3.js';
5
5
  import '../chunk-DLM4FFNH.js';
6
6
  import '../chunk-EKBEOXTH.js';
7
- import '../chunk-D6K32TQM.js';
8
- import '../chunk-G5USOD3Z.js';
7
+ import '../chunk-GDQKDL3E.js';
8
+ import '../chunk-OEA7U4HJ.js';
9
9
  import '../chunk-W7OPEMGJ.js';
10
- import '../chunk-2TPHS7KZ.js';
10
+ import '../chunk-CFSIGEUW.js';
11
11
  import '../chunk-PKBMQBKP.js';
@@ -1,13 +1,13 @@
1
1
  'use client';
2
- export { configureFormsApi, defineForm, field, formsApi, initializeForms } from '../chunk-KBWRFZFP.js';
3
- export { FormClient, ManagedForm } from '../chunk-TIP7B2IK.js';
4
- import '../chunk-XZ7I5E3I.js';
2
+ export { configureFormsApi, defineForm, field, formsApi, initializeForms } from '../chunk-2QFIYYMP.js';
3
+ export { FormClient, ManagedForm } from '../chunk-3PT6SO65.js';
4
+ import '../chunk-DLTLXYOV.js';
5
5
  export { DatePicker } from '../chunk-SOD2F6C2.js';
6
6
  export { FormCelebration } from '../chunk-YGGDU6C3.js';
7
- export { useForm, useFormTracking } from '../chunk-UAEAI7RS.js';
7
+ export { useForm, useFormTracking } from '../chunk-27LYZVPP.js';
8
8
  import '../chunk-Q6E4OPGG.js';
9
9
  import '../chunk-5ROTTMBL.js';
10
- export { FormEnhancer } from '../chunk-BXKBRV6F.js';
10
+ export { FormEnhancer } from '../chunk-GLLFIE2R.js';
11
11
  import '../chunk-C2FZBUSS.js';
12
12
  import '../chunk-YC7ELZS3.js';
13
13
  import '../chunk-DXO6SBMD.js';
@@ -16,10 +16,10 @@ export { DEFAULT_FORM_SUCCESS_MESSAGE } from '../chunk-5SQK3D53.js';
16
16
  import '../chunk-HW7B43E5.js';
17
17
  import '../chunk-NJCTQH2P.js';
18
18
  import '../chunk-L2V5PUFN.js';
19
- import '../chunk-5TM3WPCI.js';
20
19
  import '../chunk-GJWI74ZZ.js';
21
- import '../chunk-D6K32TQM.js';
22
- import '../chunk-G5USOD3Z.js';
20
+ import '../chunk-5TM3WPCI.js';
21
+ import '../chunk-GDQKDL3E.js';
22
+ import '../chunk-OEA7U4HJ.js';
23
23
  import '../chunk-W7OPEMGJ.js';
24
- import '../chunk-2TPHS7KZ.js';
24
+ import '../chunk-CFSIGEUW.js';
25
25
  import '../chunk-PKBMQBKP.js';
@@ -1,5 +1,5 @@
1
- export { ServerForm, getFormConfig } from '../chunk-2BZC7QMO.js';
2
- import '../chunk-BXKBRV6F.js';
1
+ export { ServerForm, getFormConfig } from '../chunk-ZSU7KTIE.js';
2
+ import '../chunk-GLLFIE2R.js';
3
3
  import '../chunk-C2FZBUSS.js';
4
4
  import '../chunk-YC7ELZS3.js';
5
5
  export { StaticForm } from '../chunk-LNSF6BJC.js';
@@ -1,6 +1,6 @@
1
- export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-H64ZZ76J.js';
1
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-Q4Y3WIHE.js';
2
2
  export { ManagedFavicon, getManagedFaviconUrl } from '../chunk-GW7GSBO7.js';
3
- import '../chunk-D6K32TQM.js';
4
- import '../chunk-G5USOD3Z.js';
5
- import '../chunk-2TPHS7KZ.js';
3
+ import '../chunk-GDQKDL3E.js';
4
+ import '../chunk-OEA7U4HJ.js';
5
+ import '../chunk-CFSIGEUW.js';
6
6
  import '../chunk-PKBMQBKP.js';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { SITE_KIT_VERSION } from './chunk-2TPHS7KZ.js';
1
+ export { SITE_KIT_VERSION } from './chunk-CFSIGEUW.js';
2
2
  import './chunk-PKBMQBKP.js';
@@ -0,0 +1,4 @@
1
+ import * as React from 'react';
2
+ import { type AiDiscoveryHeadersOptions } from '../llms/discovery-headers';
3
+ /** Static public-resource links, hoisted into head by React; no request reads or client code. */
4
+ export declare function AiDiscoveryLinks(options: AiDiscoveryHeadersOptions): React.JSX.Element;
@@ -43,6 +43,7 @@
43
43
  * ```
44
44
  */
45
45
  import * as React from 'react';
46
+ import type { AiDiscoveryHeadersOptions } from '../llms/discovery-headers';
46
47
  import type { AnalyticsConfig, ChatLayoutConfig, DesignConfig, EngageConfig, SignalConfig } from './types';
47
48
  export interface SiteKitLayoutProps {
48
49
  children: React.ReactNode;
@@ -113,9 +114,11 @@ export interface SiteKitLayoutProps {
113
114
  managedScripts?: boolean;
114
115
  /** Debug mode — logs to console. Default: false */
115
116
  debug?: boolean;
117
+ /** Static HTML discovery of configured public resources. Default false; preserves Next's preload headers. */
118
+ llmsDiscovery?: AiDiscoveryHeadersOptions | false;
116
119
  /**
117
120
  * When true, append a screen-reader-only link to `/llms.txt` after main content.
118
- * Default false — prefer `buildAiDiscoveryHeaders()` for discovery.
121
+ * Default false — prefer `llmsDiscovery` for machine-facing discovery.
119
122
  */
120
123
  showLlmsTxtFooterLink?: boolean;
121
124
  /**
@@ -129,4 +132,4 @@ export interface SiteKitLayoutProps {
129
132
  exclude?: string[];
130
133
  };
131
134
  }
132
- export declare function SiteKitLayout({ children, apiKey, apiUrl, projectId, analytics, engage, chat, popups, signal, sitemapSync, fleet, design, defer, favicon, managedScripts, debug, showLlmsTxtFooterLink, speculation, }: SiteKitLayoutProps): Promise<React.JSX.Element>;
135
+ export declare function SiteKitLayout({ children, llmsDiscovery, apiKey, apiUrl, projectId, analytics, engage, chat, popups, signal, sitemapSync, fleet, design, defer, favicon, managedScripts, debug, showLlmsTxtFooterLink, speculation, }: SiteKitLayoutProps): Promise<React.JSX.Element>;
@@ -1,20 +1,20 @@
1
1
  'use client';
2
- export { SiteKitClientProviders } from '../chunk-53XFJAJI.js';
2
+ export { SiteKitClientProviders } from '../chunk-UGZ3B5AK.js';
3
3
  import '../chunk-6G43IRWR.js';
4
- import '../chunk-JL3JG4AH.js';
5
- import '../chunk-7XSAO3B2.js';
4
+ import '../chunk-FVXCQC7W.js';
5
+ import '../chunk-ZDUTXHM6.js';
6
6
  import '../chunk-ZTZQPYP6.js';
7
7
  import '../chunk-YC7ELZS3.js';
8
8
  import '../chunk-FESKKJAS.js';
9
9
  import '../chunk-A4CC4ZG3.js';
10
- import '../chunk-ZKADJNR2.js';
11
- import '../chunk-5TM3WPCI.js';
10
+ import '../chunk-IPQKQEWI.js';
12
11
  import '../chunk-GJWI74ZZ.js';
12
+ import '../chunk-5TM3WPCI.js';
13
13
  import '../chunk-DLM4FFNH.js';
14
14
  import '../chunk-EKBEOXTH.js';
15
- import '../chunk-D6K32TQM.js';
16
- import '../chunk-G5USOD3Z.js';
15
+ import '../chunk-GDQKDL3E.js';
16
+ import '../chunk-OEA7U4HJ.js';
17
17
  import '../chunk-W7OPEMGJ.js';
18
- import '../chunk-2TPHS7KZ.js';
19
- import '../chunk-XVCUCZIF.js';
18
+ import '../chunk-CFSIGEUW.js';
19
+ import '../chunk-YW3LNSBM.js';
20
20
  import '../chunk-PKBMQBKP.js';
@@ -5,3 +5,4 @@ export { SiteKitLayout } from './SiteKitLayout';
5
5
  export type { SiteKitLayoutProps } from './SiteKitLayout';
6
6
  export type { AnalyticsConfig, EngageConfig, SignalConfig } from './types';
7
7
  export { SpeculationRules } from './SpeculationRules';
8
+ export { AiDiscoveryLinks } from './AiDiscoveryLinks';
@@ -1,29 +1,30 @@
1
- import { SiteKitClientProviders } from '../chunk-53XFJAJI.js';
1
+ import { SiteKitClientProviders } from '../chunk-UGZ3B5AK.js';
2
2
  import '../chunk-6G43IRWR.js';
3
- import '../chunk-JL3JG4AH.js';
4
- import '../chunk-7XSAO3B2.js';
3
+ import '../chunk-FVXCQC7W.js';
4
+ import '../chunk-ZDUTXHM6.js';
5
5
  import '../chunk-ZTZQPYP6.js';
6
+ import { aiDiscoveryLinks } from '../chunk-MTDVV5P3.js';
6
7
  import { ManagedFavicon } from '../chunk-GW7GSBO7.js';
7
8
  import '../chunk-YC7ELZS3.js';
8
- import { resolveClientCredential } from '../chunk-2VVC2HHY.js';
9
+ import { resolveClientCredential } from '../chunk-T6U6J3QK.js';
9
10
  import '../chunk-UAYAJPEP.js';
10
11
  import { ManagedScripts } from '../chunk-MVLMXC44.js';
11
12
  import { resolveApiOrigin } from '../chunk-C7TLGL3R.js';
12
13
  import '../chunk-MH2DSGC6.js';
13
14
  import '../chunk-FESKKJAS.js';
14
15
  import '../chunk-A4CC4ZG3.js';
15
- import '../chunk-ZKADJNR2.js';
16
- import '../chunk-5TM3WPCI.js';
16
+ import '../chunk-IPQKQEWI.js';
17
17
  import '../chunk-GJWI74ZZ.js';
18
+ import '../chunk-5TM3WPCI.js';
18
19
  import '../chunk-DLM4FFNH.js';
19
20
  import '../chunk-EKBEOXTH.js';
20
- import '../chunk-D6K32TQM.js';
21
- import '../chunk-G5USOD3Z.js';
21
+ import '../chunk-GDQKDL3E.js';
22
+ import '../chunk-OEA7U4HJ.js';
22
23
  import '../chunk-W7OPEMGJ.js';
23
- import '../chunk-2TPHS7KZ.js';
24
- import '../chunk-XVCUCZIF.js';
24
+ import '../chunk-CFSIGEUW.js';
25
+ import '../chunk-YW3LNSBM.js';
25
26
  import '../chunk-PKBMQBKP.js';
26
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
27
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
27
28
 
28
29
  function SpeculationRules({ mode = "prerender", exclude = [] }) {
29
30
  const rules = {
@@ -50,8 +51,12 @@ function SpeculationRules({ mode = "prerender", exclude = [] }) {
50
51
  }
51
52
  );
52
53
  }
54
+ function AiDiscoveryLinks(options) {
55
+ return /* @__PURE__ */ jsx(Fragment, { children: aiDiscoveryLinks(options).map((link, index) => /* @__PURE__ */ jsx("link", { ...link }, index)) });
56
+ }
53
57
  async function SiteKitLayout({
54
58
  children,
59
+ llmsDiscovery = false,
55
60
  apiKey,
56
61
  apiUrl,
57
62
  projectId,
@@ -82,6 +87,7 @@ async function SiteKitLayout({
82
87
  return /* @__PURE__ */ jsxs(Fragment, { children: [
83
88
  /* @__PURE__ */ jsx("link", { rel: "preconnect", href: apiOrigin, crossOrigin: "anonymous" }),
84
89
  /* @__PURE__ */ jsx("link", { rel: "dns-prefetch", href: apiOrigin }),
90
+ llmsDiscovery && /* @__PURE__ */ jsx(AiDiscoveryLinks, { ...llmsDiscovery }),
85
91
  favicon && /* @__PURE__ */ jsx(ManagedFavicon, { apiKey: resolvedApiKey, apiUrl: resolvedApiUrl }),
86
92
  managedScripts && /* @__PURE__ */ jsx(ManagedScripts, { position: "head" }),
87
93
  speculation && /* @__PURE__ */ jsx(SpeculationRules, { ...typeof speculation === "object" ? speculation : {} }),
@@ -111,4 +117,4 @@ async function SiteKitLayout({
111
117
  ] });
112
118
  }
113
119
 
114
- export { SiteKitLayout, SpeculationRules };
120
+ export { AiDiscoveryLinks, SiteKitLayout, SpeculationRules };
@@ -27,9 +27,17 @@ export interface AiDiscoveryHeadersOptions {
27
27
  */
28
28
  mcpServerCard?: boolean | string;
29
29
  }
30
+ /** Shared descriptors for HTML and HTTP discovery. Internal to the renderers. */
31
+ export declare function aiDiscoveryLinks(options: AiDiscoveryHeadersOptions): {
32
+ href: string;
33
+ rel: string;
34
+ type?: string;
35
+ hrefLang?: string;
36
+ }[];
30
37
  /**
31
- * Returns header map suitable for Next.js `headers()` merge.
32
- * Prefer this over visible footer links for machine-facing discovery.
38
+ * HTTP discovery for hosts where the final response's Link values can be merged.
39
+ * In Next.js layouts prefer AiDiscoveryLinks: proxy/config response headers can
40
+ * replace the framework's font and stylesheet preload headers on some hosts.
33
41
  */
34
42
  export declare function buildAiDiscoveryHeaders(options: AiDiscoveryHeadersOptions): Record<string, string>;
35
43
  export interface DiscoveryRequest {
@@ -1,10 +1,10 @@
1
- export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-ZS4XW2PJ.js';
2
- export { buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink } from '../chunk-PO2TRJPY.js';
1
+ export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-OFQ3BU52.js';
2
+ export { buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink } from '../chunk-MTDVV5P3.js';
3
3
  export { AI_RETRIEVAL_CRAWLERS, AI_TRAINING_CRAWLERS, buildAiCrawlerRules, createRobotsTxtHandler } from '../chunk-QLTDFUJ7.js';
4
- export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-RVMN4QB7.js';
4
+ export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-GTVOB5RN.js';
5
5
  export { AEOBlock, AEOCitedContent, AEOClaim, AEOComparison, AEODefinition, AEOEntity, AEOProvenanceList, AEOStep, AEOSteps, AEOSummary, DEFAULT_SPEAKABLE_SELECTORS, SpeakableSchema, createSpeakableSchema, getSpeakableSelectorsForPage } from '../chunk-PSAG45YF.js';
6
6
  import '../chunk-XTRZGXB2.js';
7
- export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-E2TI6JFT.js';
7
+ export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-URZTBPZO.js';
8
8
  export { getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices } from '../chunk-XA7Q2VQA.js';
9
9
  import '../chunk-5D7ZISUP.js';
10
10
  import '../chunk-4K735O3J.js';
@@ -16,5 +16,5 @@ import '../chunk-YVKRYQRG.js';
16
16
  import '../chunk-FESKKJAS.js';
17
17
  import '../chunk-A4CC4ZG3.js';
18
18
  import '../chunk-W7OPEMGJ.js';
19
- import '../chunk-2TPHS7KZ.js';
19
+ import '../chunk-CFSIGEUW.js';
20
20
  import '../chunk-PKBMQBKP.js';
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import { monotonicMs } from '../chunk-MH2DSGC6.js';
3
- import { sonorFetch } from '../chunk-D6K32TQM.js';
4
- import '../chunk-G5USOD3Z.js';
3
+ import { sonorFetch } from '../chunk-GDQKDL3E.js';
4
+ import '../chunk-OEA7U4HJ.js';
5
5
  import { getClientApiConfig } from '../chunk-W7OPEMGJ.js';
6
- import '../chunk-2TPHS7KZ.js';
6
+ import '../chunk-CFSIGEUW.js';
7
7
  import '../chunk-PKBMQBKP.js';
8
8
  import { useState, useCallback, useEffect } from 'react';
9
9
  import { APIProvider, Map as Map$1, AdvancedMarker, Pin, InfoWindow } from '@vis.gl/react-google-maps';
package/dist/mcp/sonor.js CHANGED
@@ -1,9 +1,10 @@
1
1
  import { fetchReviews, fetchReviewStats } from '../chunk-BSQP6PRA.js';
2
2
  import { toolErrorResult } from '../chunk-FYAB6CXS.js';
3
- import { fetchBookingTypes, fetchAvailability } from '../chunk-VLDFUSTX.js';
3
+ import { fetchBookingTypes, fetchAvailability } from '../chunk-5BRHTBPO.js';
4
4
  import { getLLMsData, getServices, getFAQItems, getPageSummaries } from '../chunk-XA7Q2VQA.js';
5
- import { getFormConfig } from '../chunk-2BZC7QMO.js';
6
- import '../chunk-BXKBRV6F.js';
5
+ import '../chunk-5ROTTMBL.js';
6
+ import { getFormConfig } from '../chunk-ZSU7KTIE.js';
7
+ import '../chunk-GLLFIE2R.js';
7
8
  import '../chunk-C2FZBUSS.js';
8
9
  import '../chunk-YC7ELZS3.js';
9
10
  import '../chunk-LNSF6BJC.js';
@@ -20,10 +21,11 @@ import { resolveServerApiConfig } from '../chunk-C7TLGL3R.js';
20
21
  import '../chunk-MH2DSGC6.js';
21
22
  import { resolveSiteHost } from '../chunk-FESKKJAS.js';
22
23
  import '../chunk-A4CC4ZG3.js';
23
- import '../chunk-D6K32TQM.js';
24
- import '../chunk-G5USOD3Z.js';
24
+ import '../chunk-5TM3WPCI.js';
25
+ import '../chunk-GDQKDL3E.js';
26
+ import '../chunk-OEA7U4HJ.js';
25
27
  import '../chunk-W7OPEMGJ.js';
26
- import { SITE_KIT_VERSION } from '../chunk-2TPHS7KZ.js';
28
+ import { SITE_KIT_VERSION } from '../chunk-CFSIGEUW.js';
27
29
  import '../chunk-PKBMQBKP.js';
28
30
  import 'server-only';
29
31
  import { after } from 'next/server.js';
@@ -87,6 +87,9 @@ export interface SiteKitProxyConfig {
87
87
  /** Enable security headers. Default: true */
88
88
  securityHeaders?: boolean | SecurityHeadersConfig;
89
89
  /**
90
+ * @deprecated Prefer SiteKitLayout's llmsDiscovery or AiDiscoveryLinks from
91
+ * @sonordev/site-kit/layout. Proxy Link headers can replace Next's resource
92
+ * preload headers on some hosts. Existing HTTP behavior remains supported.
90
93
  * Opt-in: inject `Link: <...>; rel="describedby"` header on HTML responses
91
94
  * pointing to /llms.txt for AI crawler discovery (RFC 8288).
92
95
  * Preferred over visible footer links.
@@ -1,6 +1,6 @@
1
1
  import { buildSecurityHeaders } from '../chunk-3QI26673.js';
2
2
  export { DEFAULT_FRAME_ANCESTORS } from '../chunk-3QI26673.js';
3
- import { buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink } from '../chunk-PO2TRJPY.js';
3
+ import { buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink } from '../chunk-MTDVV5P3.js';
4
4
  import { handleManagedRedirects } from '../chunk-HXJ54KAM.js';
5
5
  import '../chunk-Z22QVHT4.js';
6
6
  import '../chunk-MJP63SSS.js';
@@ -1,7 +1,7 @@
1
- import { createSeoRevalidationHandler } from '../chunk-RVMN4QB7.js';
1
+ import { createSeoRevalidationHandler } from '../chunk-GTVOB5RN.js';
2
2
  import '../chunk-XTRZGXB2.js';
3
3
  export { SITE_CACHE_TAGS, SITE_REVALIDATE_PATH, isSiteRevalidatePong } from '../chunk-6KU7STM3.js';
4
- import '../chunk-2TPHS7KZ.js';
4
+ import '../chunk-CFSIGEUW.js';
5
5
  import '../chunk-PKBMQBKP.js';
6
6
 
7
7
  // src/revalidate/index.ts