@sonordev/site-kit 3.3.1 → 3.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 (257) hide show
  1. package/README.md +2 -2
  2. package/agent-manifest.json +13 -1
  3. package/dist/AnalyticsProvider-35EDQA5V.js +31 -0
  4. package/dist/{AnalyticsProvider-PLGTU56K.js.map → AnalyticsProvider-35EDQA5V.js.map} +1 -1
  5. package/dist/AnalyticsProvider-V5CWTWWO.mjs +10 -0
  6. package/dist/{AnalyticsProvider-3MZ3O5OB.mjs.map → AnalyticsProvider-V5CWTWWO.mjs.map} +1 -1
  7. package/dist/ChatWidget-2OK6DD66.js +19 -0
  8. package/dist/{ChatWidget-FQARJMGU.js.map → ChatWidget-2OK6DD66.js.map} +1 -1
  9. package/dist/ChatWidget-WNT6VNJK.mjs +10 -0
  10. package/dist/{ChatWidget-7JHVRNVE.mjs.map → ChatWidget-WNT6VNJK.mjs.map} +1 -1
  11. package/dist/EngageWidget-7RZIC426.js +18 -0
  12. package/dist/{EngageWidget-DQ62NQPU.js.map → EngageWidget-7RZIC426.js.map} +1 -1
  13. package/dist/EngageWidget-GWME22IP.mjs +9 -0
  14. package/dist/{EngageWidget-VXQOZOYA.mjs.map → EngageWidget-GWME22IP.mjs.map} +1 -1
  15. package/dist/{SignalCore-3SG3LFQL.js → SignalCore-DK4HQBPY.js} +62 -43
  16. package/dist/SignalCore-DK4HQBPY.js.map +1 -0
  17. package/dist/{SignalCore-BKG66B4C.mjs → SignalCore-TW4YA3BW.mjs} +56 -37
  18. package/dist/SignalCore-TW4YA3BW.mjs.map +1 -0
  19. package/dist/SitemapSync-7PXQMF5A.mjs +8 -0
  20. package/dist/{SitemapSync-IO2VOR23.mjs.map → SitemapSync-7PXQMF5A.mjs.map} +1 -1
  21. package/dist/SitemapSync-O3J2DPV7.js +17 -0
  22. package/dist/{SitemapSync-DWX7I6MX.js.map → SitemapSync-O3J2DPV7.js.map} +1 -1
  23. package/dist/analytics/index.js +14 -12
  24. package/dist/analytics/index.mjs +7 -5
  25. package/dist/blog/index.d.mts +3 -3
  26. package/dist/blog/index.d.ts +3 -3
  27. package/dist/blog/index.js +11 -15
  28. package/dist/blog/index.js.map +1 -1
  29. package/dist/blog/index.mjs +2 -2
  30. package/dist/blog/index.mjs.map +1 -1
  31. package/dist/blog/server-ui.d.mts +1 -1
  32. package/dist/blog/server-ui.d.ts +1 -1
  33. package/dist/blog/server-ui.js +198 -9
  34. package/dist/blog/server-ui.js.map +1 -1
  35. package/dist/blog/server-ui.mjs +198 -2
  36. package/dist/blog/server-ui.mjs.map +1 -1
  37. package/dist/blog/server.d.mts +27 -8
  38. package/dist/blog/server.d.ts +27 -8
  39. package/dist/blog/server.js +45 -43
  40. package/dist/blog/server.mjs +3 -1
  41. package/dist/{chunk-QW3T6WH2.mjs → chunk-2NA5CAK5.mjs} +3 -3
  42. package/dist/{chunk-QW3T6WH2.mjs.map → chunk-2NA5CAK5.mjs.map} +1 -1
  43. package/dist/{chunk-WN5A3KSY.mjs → chunk-34IUDOBC.mjs} +2 -2
  44. package/dist/{chunk-WN5A3KSY.mjs.map → chunk-34IUDOBC.mjs.map} +1 -1
  45. package/dist/{chunk-3WRE7ZDC.js → chunk-3KEZ2YHQ.js} +8 -8
  46. package/dist/{chunk-3WRE7ZDC.js.map → chunk-3KEZ2YHQ.js.map} +1 -1
  47. package/dist/{chunk-NQ3K4NWX.mjs → chunk-5WQHWBCW.mjs} +11 -30
  48. package/dist/chunk-5WQHWBCW.mjs.map +1 -0
  49. package/dist/chunk-6EDVCUAG.mjs +29 -0
  50. package/dist/chunk-6EDVCUAG.mjs.map +1 -0
  51. package/dist/{chunk-ZFF3BKNE.mjs → chunk-6JVDIW5L.mjs} +4 -4
  52. package/dist/{chunk-ZFF3BKNE.mjs.map → chunk-6JVDIW5L.mjs.map} +1 -1
  53. package/dist/{chunk-7TX5BKVA.js → chunk-6T4NVCAT.js} +2 -2
  54. package/dist/{chunk-7TX5BKVA.js.map → chunk-6T4NVCAT.js.map} +1 -1
  55. package/dist/{chunk-OC64AHKN.mjs → chunk-7FZWMAI2.mjs} +3 -3
  56. package/dist/{chunk-OC64AHKN.mjs.map → chunk-7FZWMAI2.mjs.map} +1 -1
  57. package/dist/{chunk-EE6SFAZP.mjs → chunk-AX4AROLH.mjs} +5 -14
  58. package/dist/chunk-AX4AROLH.mjs.map +1 -0
  59. package/dist/chunk-BNJH2RFU.mjs +139 -0
  60. package/dist/chunk-BNJH2RFU.mjs.map +1 -0
  61. package/dist/{chunk-WZHWWOUC.js → chunk-BX6FFL2Y.js} +6 -16
  62. package/dist/chunk-BX6FFL2Y.js.map +1 -0
  63. package/dist/chunk-CGCYZJYX.mjs +41 -0
  64. package/dist/chunk-CGCYZJYX.mjs.map +1 -0
  65. package/dist/{chunk-PIV54R2O.js → chunk-CTPE3G5W.js} +5 -5
  66. package/dist/{chunk-PIV54R2O.js.map → chunk-CTPE3G5W.js.map} +1 -1
  67. package/dist/chunk-CXDIWBIQ.js +78 -0
  68. package/dist/chunk-CXDIWBIQ.js.map +1 -0
  69. package/dist/chunk-DWVF7SEK.mjs +35 -0
  70. package/dist/chunk-DWVF7SEK.mjs.map +1 -0
  71. package/dist/{chunk-C4JAMON3.js → chunk-EH7QQU6P.js} +15 -15
  72. package/dist/{chunk-C4JAMON3.js.map → chunk-EH7QQU6P.js.map} +1 -1
  73. package/dist/chunk-EU2UGO25.js +52 -0
  74. package/dist/chunk-EU2UGO25.js.map +1 -0
  75. package/dist/{chunk-X4OPM3SK.mjs → chunk-GU5OTUQS.mjs} +5 -14
  76. package/dist/chunk-GU5OTUQS.mjs.map +1 -0
  77. package/dist/{chunk-SH4VZDVX.mjs → chunk-GUXB3QH7.mjs} +38 -67
  78. package/dist/chunk-GUXB3QH7.mjs.map +1 -0
  79. package/dist/{chunk-JD6LV6JZ.mjs → chunk-HRJ65XKY.mjs} +3 -3
  80. package/dist/{chunk-JD6LV6JZ.mjs.map → chunk-HRJ65XKY.mjs.map} +1 -1
  81. package/dist/chunk-IBMOX3YE.mjs +48 -0
  82. package/dist/chunk-IBMOX3YE.mjs.map +1 -0
  83. package/dist/{chunk-TXEOLHMC.js → chunk-IMDSDDRU.js} +4 -4
  84. package/dist/{chunk-TXEOLHMC.js.map → chunk-IMDSDDRU.js.map} +1 -1
  85. package/dist/{chunk-25YPXQBA.mjs → chunk-INGAARGC.mjs} +8 -25
  86. package/dist/chunk-INGAARGC.mjs.map +1 -0
  87. package/dist/{chunk-3AG6O3IA.mjs → chunk-LZSHZVBE.mjs} +49 -5
  88. package/dist/chunk-LZSHZVBE.mjs.map +1 -0
  89. package/dist/chunk-MJDYY6S3.mjs +76 -0
  90. package/dist/chunk-MJDYY6S3.mjs.map +1 -0
  91. package/dist/{chunk-BMKZHXWQ.js → chunk-MMON6EVI.js} +3 -194
  92. package/dist/chunk-MMON6EVI.js.map +1 -0
  93. package/dist/chunk-NB4MK2Q5.js +18 -0
  94. package/dist/chunk-NB4MK2Q5.js.map +1 -0
  95. package/dist/{chunk-DIXWP4BO.mjs → chunk-NBI5AV6U.mjs} +3 -3
  96. package/dist/{chunk-DIXWP4BO.mjs.map → chunk-NBI5AV6U.mjs.map} +1 -1
  97. package/dist/chunk-NI7OY4FW.mjs +16 -0
  98. package/dist/chunk-NI7OY4FW.mjs.map +1 -0
  99. package/dist/chunk-NME3SQCB.js +8 -0
  100. package/dist/{chunk-3X2YPJU5.js.map → chunk-NME3SQCB.js.map} +1 -1
  101. package/dist/{chunk-4JMXBIUC.js → chunk-PE2A3ON5.js} +16 -35
  102. package/dist/chunk-PE2A3ON5.js.map +1 -0
  103. package/dist/{chunk-BOWR5QEV.js → chunk-PWIBFSXK.js} +14 -14
  104. package/dist/{chunk-BOWR5QEV.js.map → chunk-PWIBFSXK.js.map} +1 -1
  105. package/dist/{chunk-4ROFY6PM.js → chunk-Q2SPOBHU.js} +61 -17
  106. package/dist/chunk-Q2SPOBHU.js.map +1 -0
  107. package/dist/chunk-QGPYFC6G.mjs +6 -0
  108. package/dist/{chunk-K6YGF2KJ.mjs.map → chunk-QGPYFC6G.mjs.map} +1 -1
  109. package/dist/{chunk-FSYXHIAI.js → chunk-SQGDDITI.js} +14 -14
  110. package/dist/{chunk-FSYXHIAI.js.map → chunk-SQGDDITI.js.map} +1 -1
  111. package/dist/{chunk-S2N3NSC7.mjs → chunk-STTSIODQ.mjs} +5 -5
  112. package/dist/{chunk-S2N3NSC7.mjs.map → chunk-STTSIODQ.mjs.map} +1 -1
  113. package/dist/{chunk-QRIGY6EM.js → chunk-T3RPPS25.js} +7 -7
  114. package/dist/{chunk-QRIGY6EM.js.map → chunk-T3RPPS25.js.map} +1 -1
  115. package/dist/{chunk-DNW7FTJD.js → chunk-TBMFLLRV.js} +9 -9
  116. package/dist/{chunk-DNW7FTJD.js.map → chunk-TBMFLLRV.js.map} +1 -1
  117. package/dist/{chunk-YFYMOQAX.js → chunk-TJS6FPR7.js} +14 -31
  118. package/dist/chunk-TJS6FPR7.js.map +1 -0
  119. package/dist/chunk-TPL2IHFI.js +43 -0
  120. package/dist/chunk-TPL2IHFI.js.map +1 -0
  121. package/dist/chunk-TRTT4PND.js +38 -0
  122. package/dist/chunk-TRTT4PND.js.map +1 -0
  123. package/dist/{chunk-QFWBAGBT.mjs → chunk-UFOOVODL.mjs} +3 -3
  124. package/dist/{chunk-QFWBAGBT.mjs.map → chunk-UFOOVODL.mjs.map} +1 -1
  125. package/dist/chunk-UXEB6UAR.js +147 -0
  126. package/dist/chunk-UXEB6UAR.js.map +1 -0
  127. package/dist/{chunk-MLD3EGM2.mjs → chunk-V37Z65NF.mjs} +3 -3
  128. package/dist/{chunk-MLD3EGM2.mjs.map → chunk-V37Z65NF.mjs.map} +1 -1
  129. package/dist/chunk-VJMPIRSD.js +31 -0
  130. package/dist/chunk-VJMPIRSD.js.map +1 -0
  131. package/dist/chunk-VX3WK77I.mjs +126 -0
  132. package/dist/chunk-VX3WK77I.mjs.map +1 -0
  133. package/dist/{chunk-AB2VYIYU.mjs → chunk-WTR7QJ32.mjs} +4 -194
  134. package/dist/chunk-WTR7QJ32.mjs.map +1 -0
  135. package/dist/{chunk-IB4FRJDV.js → chunk-XAWB2HFQ.js} +37 -67
  136. package/dist/chunk-XAWB2HFQ.js.map +1 -0
  137. package/dist/{chunk-3BNFUMLL.js → chunk-XB57AM6T.js} +5 -14
  138. package/dist/chunk-XB57AM6T.js.map +1 -0
  139. package/dist/chunk-XY4NJJEX.js +129 -0
  140. package/dist/chunk-XY4NJJEX.js.map +1 -0
  141. package/dist/{chunk-FMQHK6MM.js → chunk-Y4U3OCKH.js} +3 -3
  142. package/dist/{chunk-FMQHK6MM.js.map → chunk-Y4U3OCKH.js.map} +1 -1
  143. package/dist/{chunk-ZYIONE7A.mjs → chunk-YKPAFEJ4.mjs} +4 -4
  144. package/dist/{chunk-ZYIONE7A.mjs.map → chunk-YKPAFEJ4.mjs.map} +1 -1
  145. package/dist/{chunk-7OROUYZH.mjs → chunk-YSDJ7HI3.mjs} +4 -4
  146. package/dist/{chunk-7OROUYZH.mjs.map → chunk-YSDJ7HI3.mjs.map} +1 -1
  147. package/dist/{chunk-PCDAVHVX.js → chunk-ZY3G7JGT.js} +8 -8
  148. package/dist/{chunk-PCDAVHVX.js.map → chunk-ZY3G7JGT.js.map} +1 -1
  149. package/dist/cli/index.js +2 -2
  150. package/dist/cli/index.mjs +1 -1
  151. package/dist/client/index.d.mts +15 -1
  152. package/dist/client/index.d.ts +15 -1
  153. package/dist/client/index.js +21 -6
  154. package/dist/client/index.js.map +1 -1
  155. package/dist/client/index.mjs +19 -1
  156. package/dist/client/index.mjs.map +1 -1
  157. package/dist/commerce/index.js +53 -51
  158. package/dist/commerce/index.mjs +8 -6
  159. package/dist/engage/index.js +11 -9
  160. package/dist/engage/index.js.map +1 -1
  161. package/dist/engage/index.mjs +8 -6
  162. package/dist/engage/index.mjs.map +1 -1
  163. package/dist/fleet/index.js +8 -7
  164. package/dist/fleet/index.mjs +4 -3
  165. package/dist/forms/index.js +14 -12
  166. package/dist/forms/index.js.map +1 -1
  167. package/dist/forms/index.mjs +6 -4
  168. package/dist/forms/index.mjs.map +1 -1
  169. package/dist/images/index.js +11 -10
  170. package/dist/images/index.mjs +4 -3
  171. package/dist/index.d.mts +2 -1
  172. package/dist/index.d.ts +2 -1
  173. package/dist/index.js +75 -64
  174. package/dist/index.js.map +1 -1
  175. package/dist/index.mjs +13 -10
  176. package/dist/index.mjs.map +1 -1
  177. package/dist/landing/index.d.mts +21 -0
  178. package/dist/landing/index.d.ts +21 -0
  179. package/dist/landing/index.js +21 -0
  180. package/dist/landing/index.js.map +1 -0
  181. package/dist/landing/index.mjs +4 -0
  182. package/dist/landing/index.mjs.map +1 -0
  183. package/dist/layout/client.js +11 -8
  184. package/dist/layout/client.mjs +10 -7
  185. package/dist/layout/index.js +13 -54
  186. package/dist/layout/index.js.map +1 -1
  187. package/dist/layout/index.mjs +11 -52
  188. package/dist/layout/index.mjs.map +1 -1
  189. package/dist/llms/index.js +12 -12
  190. package/dist/llms/index.mjs +2 -2
  191. package/dist/maps/index.js +5 -4
  192. package/dist/maps/index.js.map +1 -1
  193. package/dist/maps/index.mjs +3 -2
  194. package/dist/maps/index.mjs.map +1 -1
  195. package/dist/metadata-D_GiY8LJ.d.mts +36 -0
  196. package/dist/metadata-D_GiY8LJ.d.ts +36 -0
  197. package/dist/middleware/index.js +2 -8
  198. package/dist/middleware/index.js.map +1 -1
  199. package/dist/middleware/index.mjs +2 -8
  200. package/dist/middleware/index.mjs.map +1 -1
  201. package/dist/seo/client.js +5 -4
  202. package/dist/seo/client.mjs +4 -3
  203. package/dist/seo/index.js +5 -4
  204. package/dist/seo/index.js.map +1 -1
  205. package/dist/seo/index.mjs +4 -3
  206. package/dist/seo/index.mjs.map +1 -1
  207. package/dist/seo-pages/contract.js +6 -5
  208. package/dist/seo-pages/contract.js.map +1 -1
  209. package/dist/seo-pages/contract.mjs +2 -1
  210. package/dist/seo-pages/contract.mjs.map +1 -1
  211. package/dist/server/index.d.mts +34 -1
  212. package/dist/server/index.d.ts +34 -1
  213. package/dist/server/index.js +6 -0
  214. package/dist/server/index.mjs +2 -0
  215. package/dist/signal/index.js +11 -11
  216. package/dist/signal/index.mjs +2 -2
  217. package/dist/sitemap/index.js +2 -2
  218. package/dist/sitemap/index.mjs +1 -1
  219. package/dist/sites/contract.d.mts +36 -12
  220. package/dist/sites/contract.d.ts +36 -12
  221. package/dist/sites/contract.js +12 -11
  222. package/dist/sites/contract.mjs +2 -1
  223. package/dist/sync/index.js +16 -15
  224. package/dist/sync/index.mjs +4 -3
  225. package/dist/{types-DYOumpUT.d.mts → types-8IcjVMDa.d.mts} +1 -1
  226. package/dist/{types-DYOumpUT.d.ts → types-8IcjVMDa.d.ts} +1 -1
  227. package/package.json +11 -1
  228. package/dist/AnalyticsProvider-3MZ3O5OB.mjs +0 -8
  229. package/dist/AnalyticsProvider-PLGTU56K.js +0 -29
  230. package/dist/ChatWidget-7JHVRNVE.mjs +0 -8
  231. package/dist/ChatWidget-FQARJMGU.js +0 -17
  232. package/dist/EngageWidget-DQ62NQPU.js +0 -16
  233. package/dist/EngageWidget-VXQOZOYA.mjs +0 -7
  234. package/dist/SignalCore-3SG3LFQL.js.map +0 -1
  235. package/dist/SignalCore-BKG66B4C.mjs.map +0 -1
  236. package/dist/SitemapSync-DWX7I6MX.js +0 -16
  237. package/dist/SitemapSync-IO2VOR23.mjs +0 -7
  238. package/dist/chunk-25YPXQBA.mjs.map +0 -1
  239. package/dist/chunk-3AG6O3IA.mjs.map +0 -1
  240. package/dist/chunk-3BNFUMLL.js.map +0 -1
  241. package/dist/chunk-3X2YPJU5.js +0 -8
  242. package/dist/chunk-4JMXBIUC.js.map +0 -1
  243. package/dist/chunk-4ROFY6PM.js.map +0 -1
  244. package/dist/chunk-AB2VYIYU.mjs.map +0 -1
  245. package/dist/chunk-BMKZHXWQ.js.map +0 -1
  246. package/dist/chunk-EE6SFAZP.mjs.map +0 -1
  247. package/dist/chunk-GUU3AEFM.mjs +0 -259
  248. package/dist/chunk-GUU3AEFM.mjs.map +0 -1
  249. package/dist/chunk-IB4FRJDV.js.map +0 -1
  250. package/dist/chunk-K6YGF2KJ.mjs +0 -6
  251. package/dist/chunk-KPKZBIAQ.js +0 -264
  252. package/dist/chunk-KPKZBIAQ.js.map +0 -1
  253. package/dist/chunk-NQ3K4NWX.mjs.map +0 -1
  254. package/dist/chunk-SH4VZDVX.mjs.map +0 -1
  255. package/dist/chunk-WZHWWOUC.js.map +0 -1
  256. package/dist/chunk-X4OPM3SK.mjs.map +0 -1
  257. package/dist/chunk-YFYMOQAX.js.map +0 -1
@@ -1,22 +1,25 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunk4JMXBIUC_js = require('../chunk-4JMXBIUC.js');
5
- require('../chunk-QRIGY6EM.js');
4
+ var chunkPE2A3ON5_js = require('../chunk-PE2A3ON5.js');
5
+ require('../chunk-TRTT4PND.js');
6
+ require('../chunk-T3RPPS25.js');
6
7
  require('../chunk-HGNSJXWT.js');
7
8
  require('../chunk-Q2NBD54V.js');
8
- require('../chunk-WZHWWOUC.js');
9
- require('../chunk-FMQHK6MM.js');
10
- require('../chunk-3BNFUMLL.js');
11
- require('../chunk-KPKZBIAQ.js');
12
- require('../chunk-3X2YPJU5.js');
9
+ require('../chunk-NB4MK2Q5.js');
10
+ require('../chunk-Y4U3OCKH.js');
11
+ require('../chunk-XB57AM6T.js');
12
+ require('../chunk-VJMPIRSD.js');
13
+ require('../chunk-XY4NJJEX.js');
14
+ require('../chunk-UXEB6UAR.js');
15
+ require('../chunk-NME3SQCB.js');
13
16
  require('../chunk-ZSMWDLMK.js');
14
17
 
15
18
 
16
19
 
17
20
  Object.defineProperty(exports, "SiteKitClientProviders", {
18
21
  enumerable: true,
19
- get: function () { return chunk4JMXBIUC_js.SiteKitClientProviders; }
22
+ get: function () { return chunkPE2A3ON5_js.SiteKitClientProviders; }
20
23
  });
21
24
  //# sourceMappingURL=client.js.map
22
25
  //# sourceMappingURL=client.js.map
@@ -1,13 +1,16 @@
1
1
  'use client';
2
- export { SiteKitClientProviders } from '../chunk-NQ3K4NWX.mjs';
3
- import '../chunk-ZFF3BKNE.mjs';
2
+ export { SiteKitClientProviders } from '../chunk-5WQHWBCW.mjs';
3
+ import '../chunk-DWVF7SEK.mjs';
4
+ import '../chunk-6JVDIW5L.mjs';
4
5
  import '../chunk-ZVBLXXNJ.mjs';
5
6
  import '../chunk-ZPLN537Q.mjs';
6
- import '../chunk-X4OPM3SK.mjs';
7
- import '../chunk-QFWBAGBT.mjs';
8
- import '../chunk-EE6SFAZP.mjs';
9
- import '../chunk-GUU3AEFM.mjs';
10
- import '../chunk-K6YGF2KJ.mjs';
7
+ import '../chunk-NI7OY4FW.mjs';
8
+ import '../chunk-UFOOVODL.mjs';
9
+ import '../chunk-AX4AROLH.mjs';
10
+ import '../chunk-6EDVCUAG.mjs';
11
+ import '../chunk-VX3WK77I.mjs';
12
+ import '../chunk-BNJH2RFU.mjs';
13
+ import '../chunk-QGPYFC6G.mjs';
11
14
  import '../chunk-4XPGGLVP.mjs';
12
15
  //# sourceMappingURL=client.mjs.map
13
16
  //# sourceMappingURL=client.mjs.map
@@ -1,65 +1,24 @@
1
1
  'use strict';
2
2
 
3
- var chunk4JMXBIUC_js = require('../chunk-4JMXBIUC.js');
4
- require('../chunk-QRIGY6EM.js');
3
+ var chunkPE2A3ON5_js = require('../chunk-PE2A3ON5.js');
4
+ require('../chunk-TRTT4PND.js');
5
+ require('../chunk-T3RPPS25.js');
5
6
  require('../chunk-HGNSJXWT.js');
6
7
  require('../chunk-Q2NBD54V.js');
7
- require('../chunk-WZHWWOUC.js');
8
+ require('../chunk-NB4MK2Q5.js');
8
9
  var chunkGCPPXUAI_js = require('../chunk-GCPPXUAI.js');
9
- require('../chunk-FMQHK6MM.js');
10
+ require('../chunk-Y4U3OCKH.js');
11
+ var chunkCXDIWBIQ_js = require('../chunk-CXDIWBIQ.js');
10
12
  var chunkDV2LJYFD_js = require('../chunk-DV2LJYFD.js');
11
13
  var chunkQPIKPWAZ_js = require('../chunk-QPIKPWAZ.js');
12
- require('../chunk-3BNFUMLL.js');
13
- require('../chunk-KPKZBIAQ.js');
14
- var chunk3X2YPJU5_js = require('../chunk-3X2YPJU5.js');
14
+ require('../chunk-XB57AM6T.js');
15
+ require('../chunk-VJMPIRSD.js');
16
+ require('../chunk-XY4NJJEX.js');
17
+ require('../chunk-UXEB6UAR.js');
18
+ require('../chunk-NME3SQCB.js');
15
19
  require('../chunk-ZSMWDLMK.js');
16
- require('server-only');
17
20
  var jsxRuntime = require('react/jsx-runtime');
18
21
 
19
- var MINT_PATH = "/api/public/site-token";
20
- var MINT_TIMEOUT_MS = 4e3;
21
- var SITE_TOKEN_PREFIX = "st1.";
22
- var cache = /* @__PURE__ */ new Map();
23
- async function resolveClientCredential(rawKey, apiUrl) {
24
- if (!rawKey) return "";
25
- if (rawKey.startsWith(SITE_TOKEN_PREFIX)) return rawKey;
26
- const now = Date.now();
27
- const cached = cache.get(rawKey);
28
- if (cached && cached.expiresAt > now) return cached.credential;
29
- const base = (apiUrl || "https://api.sonor.io").replace(/\/+$/, "");
30
- try {
31
- const res = await fetch(`${base}${MINT_PATH}`, {
32
- method: "POST",
33
- headers: {
34
- "content-type": "application/json",
35
- "x-api-key": rawKey,
36
- "x-sitekit-version": chunk3X2YPJU5_js.SITE_KIT_VERSION
37
- },
38
- cache: "no-store",
39
- signal: typeof AbortSignal !== "undefined" && AbortSignal.timeout ? AbortSignal.timeout(MINT_TIMEOUT_MS) : void 0
40
- });
41
- if (res.ok) {
42
- const data = await res.json().catch(() => null);
43
- const token = data?.token;
44
- const expiresIn = typeof data?.expiresIn === "number" ? data.expiresIn : 3600;
45
- if (typeof token === "string" && token.startsWith(SITE_TOKEN_PREFIX)) {
46
- cache.set(rawKey, {
47
- credential: token,
48
- expiresAt: now + Math.min(expiresIn * 1e3 / 2, 30 * 6e4)
49
- });
50
- return token;
51
- }
52
- } else if (res.status !== 404) {
53
- console.warn(
54
- `[SiteKitLayout] Token mint returned ${res.status}; injecting raw key for this render.`
55
- );
56
- }
57
- } catch {
58
- console.warn("[SiteKitLayout] Token mint unavailable; injecting raw key for this render.");
59
- }
60
- cache.set(rawKey, { credential: rawKey, expiresAt: now + 6e4 });
61
- return rawKey;
62
- }
63
22
  async function SiteKitLayout({
64
23
  children,
65
24
  apiKey,
@@ -84,14 +43,14 @@ async function SiteKitLayout({
84
43
  );
85
44
  }
86
45
  const apiOrigin = chunkQPIKPWAZ_js.resolveApiOrigin(resolvedApiUrl);
87
- const clientCredential = await resolveClientCredential(resolvedApiKey, resolvedApiUrl);
46
+ const clientCredential = await chunkCXDIWBIQ_js.resolveClientCredential(resolvedApiKey, resolvedApiUrl);
88
47
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
89
48
  /* @__PURE__ */ jsxRuntime.jsx("link", { rel: "preconnect", href: apiOrigin, crossOrigin: "anonymous" }),
90
49
  /* @__PURE__ */ jsxRuntime.jsx("link", { rel: "dns-prefetch", href: apiOrigin }),
91
50
  favicon && /* @__PURE__ */ jsxRuntime.jsx(chunkGCPPXUAI_js.ManagedFavicon, { apiKey: resolvedApiKey, apiUrl: resolvedApiUrl }),
92
51
  managedScripts && /* @__PURE__ */ jsxRuntime.jsx(chunkDV2LJYFD_js.ManagedScripts, { position: "head" }),
93
52
  /* @__PURE__ */ jsxRuntime.jsxs(
94
- chunk4JMXBIUC_js.SiteKitClientProviders,
53
+ chunkPE2A3ON5_js.SiteKitClientProviders,
95
54
  {
96
55
  apiKey: clientCredential,
97
56
  apiUrl: resolvedApiUrl,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/mint-site-token.ts","../../src/layout/SiteKitLayout.tsx"],"names":["SITE_KIT_VERSION","resolveApiOrigin","jsxs","Fragment","jsx","ManagedFavicon","ManagedScripts","SiteKitClientProviders"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/server — Client-token minting (server-only)\n *\n * SiteKitLayout holds the raw `SONOR_API_KEY` server-side but must NOT ship it to\n * the browser. This mints a short-lived, project-scoped token (server-to-server,\n * authenticated with the raw key, no browser Origin so it passes domain-binding)\n * and returns THAT for the layout to inject instead.\n *\n * `import 'server-only'` makes importing this into a client bundle a hard build\n * error — the raw key stays on the server.\n *\n * Resilience: if minting is unavailable (older API without the endpoint, token\n * auth not configured, transient outage) it returns the RAW KEY, so a build never\n * breaks. Domain-binding is log-only by default, so the raw key still works —\n * worst case is exactly pre-3.2 behavior. Memoized per raw key for the process,\n * so an entire `next build` mints ~once and every static page reuses one seed\n * (the client refreshes on the far side as needed).\n */\nimport 'server-only'\nimport { SITE_KIT_VERSION } from '../shared/version'\n\nconst MINT_PATH = '/api/public/site-token'\nconst MINT_TIMEOUT_MS = 4_000\nconst SITE_TOKEN_PREFIX = 'st1.'\n\ninterface CacheEntry {\n credential: string\n expiresAt: number\n}\nconst cache = new Map<string, CacheEntry>()\n\nexport async function resolveClientCredential(\n rawKey: string,\n apiUrl: string,\n): Promise<string> {\n if (!rawKey) return ''\n // Env should hold a raw key; if it already looks like a token, pass it through.\n if (rawKey.startsWith(SITE_TOKEN_PREFIX)) return rawKey\n\n const now = Date.now()\n const cached = cache.get(rawKey)\n if (cached && cached.expiresAt > now) return cached.credential\n\n const base = (apiUrl || 'https://api.sonor.io').replace(/\\/+$/, '')\n try {\n const res = await fetch(`${base}${MINT_PATH}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': rawKey,\n 'x-sitekit-version': SITE_KIT_VERSION,\n },\n cache: 'no-store',\n signal:\n typeof AbortSignal !== 'undefined' && AbortSignal.timeout\n ? AbortSignal.timeout(MINT_TIMEOUT_MS)\n : undefined,\n })\n\n if (res.ok) {\n const data: any = await res.json().catch(() => null)\n const token = data?.token\n const expiresIn = typeof data?.expiresIn === 'number' ? data.expiresIn : 3600\n if (typeof token === 'string' && token.startsWith(SITE_TOKEN_PREFIX)) {\n cache.set(rawKey, {\n credential: token,\n expiresAt: now + Math.min((expiresIn * 1000) / 2, 30 * 60_000),\n })\n return token\n }\n } else if (res.status !== 404) {\n // 404 = older API without the endpoint (expected during rollout). Anything\n // else is worth a server-side note. Never logs the key value.\n console.warn(\n `[SiteKitLayout] Token mint returned ${res.status}; injecting raw key for this render.`,\n )\n }\n } catch {\n console.warn('[SiteKitLayout] Token mint unavailable; injecting raw key for this render.')\n }\n\n // Fallback: the raw key (pre-3.2 behavior). Short cache so a transient outage\n // retries soon rather than pinning the raw key for the whole build.\n cache.set(rawKey, { credential: rawKey, expiresAt: now + 60_000 })\n return rawKey\n}\n","/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { resolveApiOrigin } from '../server/server-fetch'\nimport { resolveClientCredential } from '../server/mint-site-token'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /** SitemapSync client component. Default: true */\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports this site's kit version + active modules to Sonor\n * once per session so the platform can track version drift. Default: true.\n * Deferred like Analytics; never in the hydration path.\n */\n fleet?: boolean\n /**\n * Defer client modules (Analytics, Engage, SitemapSync) until window load +\n * idle or the first user interaction, keeping their JS and mount work out of\n * the critical hydration path. Default: true. Pass false to restore legacy\n * eager mounting. SignalBridge is never deferred.\n */\n defer?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n /**\n * When true, append a screen-reader-only link to `/llms.txt` after main content.\n * Default false — prefer `buildAiDiscoveryHeaders()` for discovery.\n */\n showLlmsTxtFooterLink?: boolean\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n fleet = true,\n defer = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n showLlmsTxtFooterLink = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY.',\n )\n }\n\n const apiOrigin = resolveApiOrigin(resolvedApiUrl)\n\n // Mint a short-lived client token so the raw key never reaches the browser.\n // Falls back to the raw key if minting is unavailable (older API / transient\n // outage) — the build never breaks. The client refreshes the token as needed.\n const clientCredential = await resolveClientCredential(resolvedApiKey, resolvedApiUrl)\n\n return (\n <>\n <link rel=\"preconnect\" href={apiOrigin} crossOrigin=\"anonymous\" />\n <link rel=\"dns-prefetch\" href={apiOrigin} />\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n\n {/* Client-side providers island — receives the minted token (or raw-key\n fallback), never the raw key when minting succeeds. */}\n <SiteKitClientProviders\n apiKey={clientCredential}\n apiUrl={resolvedApiUrl}\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n fleet={fleet}\n defer={defer}\n debug={debug}\n >\n {children}\n {showLlmsTxtFooterLink ? (\n <footer className=\"sr-only\" aria-hidden=\"true\">\n <a href=\"/llms.txt\">llms.txt</a>\n </footer>\n ) : null}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/layout/SiteKitLayout.tsx"],"names":["resolveApiOrigin","resolveClientCredential","jsxs","Fragment","jsx","ManagedFavicon","ManagedScripts","SiteKitClientProviders"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAkGA,eAAsB,aAAA,CAAc;AAAA,EAClC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,MAAA,GAAS,IAAA;AAAA,EACT,MAAA,GAAS,KAAA;AAAA,EACT,WAAA,GAAc,IAAA;AAAA,EACd,KAAA,GAAQ,IAAA;AAAA,EACR,KAAA,GAAQ,IAAA;AAAA,EACR,OAAA,GAAU,IAAA;AAAA,EACV,cAAA,GAAiB,IAAA;AAAA,EACjB,KAAA,GAAQ,KAAA;AAAA,EACR,qBAAA,GAAwB;AAC1B,CAAA,EAAuB;AAErB,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,EAAA;AACF,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,sBAAA;AAEF,EAAA,IAAI,CAAC,kBAAkB,KAAA,EAAO;AAC5B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAYA,kCAAiB,cAAc,CAAA;AAKjD,EAAA,MAAM,gBAAA,GAAmB,MAAMC,wCAAA,CAAwB,cAAA,EAAgB,cAAc,CAAA;AAErF,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,UAAK,GAAA,EAAI,YAAA,EAAa,IAAA,EAAM,SAAA,EAAW,aAAY,WAAA,EAAY,CAAA;AAAA,oBAChEA,cAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAI,cAAA,EAAe,MAAM,SAAA,EAAW,CAAA;AAAA,IAEzC,2BAAWA,cAAA,CAACC,+BAAA,EAAA,EAAe,MAAA,EAAQ,cAAA,EAAgB,QAAQ,cAAA,EAAgB,CAAA;AAAA,IAC3E,cAAA,oBAAkBD,cAAA,CAACE,+BAAA,EAAA,EAAe,QAAA,EAAS,MAAA,EAAO,CAAA;AAAA,oBAInDJ,eAAA;AAAA,MAACK,uCAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,gBAAA;AAAA,QACR,MAAA,EAAQ,cAAA;AAAA,QACR,SAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UACA,qBAAA,mBACCH,cAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU,aAAA,EAAY,MAAA,EACtC,QAAA,kBAAAA,cAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,WAAA,EAAY,QAAA,EAAA,UAAA,EAAQ,GAC9B,CAAA,GACE;AAAA;AAAA;AAAA,KACN;AAAA,IAGC,cAAA,oBAAkBA,cAAA,CAACE,+BAAA,EAAA,EAAe,QAAA,EAAS,UAAA,EAAW;AAAA,GAAA,EACzD,CAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { resolveApiOrigin } from '../server/server-fetch'\nimport { resolveClientCredential } from '../server/mint-site-token'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /** SitemapSync client component. Default: true */\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports this site's kit version + active modules to Sonor\n * once per session so the platform can track version drift. Default: true.\n * Deferred like Analytics; never in the hydration path.\n */\n fleet?: boolean\n /**\n * Defer client modules (Analytics, Engage, SitemapSync) until window load +\n * idle or the first user interaction, keeping their JS and mount work out of\n * the critical hydration path. Default: true. Pass false to restore legacy\n * eager mounting. SignalBridge is never deferred.\n */\n defer?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n /**\n * When true, append a screen-reader-only link to `/llms.txt` after main content.\n * Default false — prefer `buildAiDiscoveryHeaders()` for discovery.\n */\n showLlmsTxtFooterLink?: boolean\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n fleet = true,\n defer = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n showLlmsTxtFooterLink = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY.',\n )\n }\n\n const apiOrigin = resolveApiOrigin(resolvedApiUrl)\n\n // Mint a short-lived client token so the raw key never reaches the browser.\n // Falls back to the raw key if minting is unavailable (older API / transient\n // outage) — the build never breaks. The client refreshes the token as needed.\n const clientCredential = await resolveClientCredential(resolvedApiKey, resolvedApiUrl)\n\n return (\n <>\n <link rel=\"preconnect\" href={apiOrigin} crossOrigin=\"anonymous\" />\n <link rel=\"dns-prefetch\" href={apiOrigin} />\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n\n {/* Client-side providers island — receives the minted token (or raw-key\n fallback), never the raw key when minting succeeds. */}\n <SiteKitClientProviders\n apiKey={clientCredential}\n apiUrl={resolvedApiUrl}\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n fleet={fleet}\n defer={defer}\n debug={debug}\n >\n {children}\n {showLlmsTxtFooterLink ? (\n <footer className=\"sr-only\" aria-hidden=\"true\">\n <a href=\"/llms.txt\">llms.txt</a>\n </footer>\n ) : null}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
@@ -1,63 +1,22 @@
1
- import { SiteKitClientProviders } from '../chunk-NQ3K4NWX.mjs';
2
- import '../chunk-ZFF3BKNE.mjs';
1
+ import { SiteKitClientProviders } from '../chunk-5WQHWBCW.mjs';
2
+ import '../chunk-DWVF7SEK.mjs';
3
+ import '../chunk-6JVDIW5L.mjs';
3
4
  import '../chunk-ZVBLXXNJ.mjs';
4
5
  import '../chunk-ZPLN537Q.mjs';
5
- import '../chunk-X4OPM3SK.mjs';
6
+ import '../chunk-NI7OY4FW.mjs';
6
7
  import { ManagedFavicon } from '../chunk-CU6OGBKK.mjs';
7
- import '../chunk-QFWBAGBT.mjs';
8
+ import '../chunk-UFOOVODL.mjs';
9
+ import { resolveClientCredential } from '../chunk-MJDYY6S3.mjs';
8
10
  import { ManagedScripts } from '../chunk-6PJTLBRR.mjs';
9
11
  import { resolveApiOrigin } from '../chunk-UDBUK5ZJ.mjs';
10
- import '../chunk-EE6SFAZP.mjs';
11
- import '../chunk-GUU3AEFM.mjs';
12
- import { SITE_KIT_VERSION } from '../chunk-K6YGF2KJ.mjs';
12
+ import '../chunk-AX4AROLH.mjs';
13
+ import '../chunk-6EDVCUAG.mjs';
14
+ import '../chunk-VX3WK77I.mjs';
15
+ import '../chunk-BNJH2RFU.mjs';
16
+ import '../chunk-QGPYFC6G.mjs';
13
17
  import '../chunk-4XPGGLVP.mjs';
14
- import 'server-only';
15
18
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
16
19
 
17
- var MINT_PATH = "/api/public/site-token";
18
- var MINT_TIMEOUT_MS = 4e3;
19
- var SITE_TOKEN_PREFIX = "st1.";
20
- var cache = /* @__PURE__ */ new Map();
21
- async function resolveClientCredential(rawKey, apiUrl) {
22
- if (!rawKey) return "";
23
- if (rawKey.startsWith(SITE_TOKEN_PREFIX)) return rawKey;
24
- const now = Date.now();
25
- const cached = cache.get(rawKey);
26
- if (cached && cached.expiresAt > now) return cached.credential;
27
- const base = (apiUrl || "https://api.sonor.io").replace(/\/+$/, "");
28
- try {
29
- const res = await fetch(`${base}${MINT_PATH}`, {
30
- method: "POST",
31
- headers: {
32
- "content-type": "application/json",
33
- "x-api-key": rawKey,
34
- "x-sitekit-version": SITE_KIT_VERSION
35
- },
36
- cache: "no-store",
37
- signal: typeof AbortSignal !== "undefined" && AbortSignal.timeout ? AbortSignal.timeout(MINT_TIMEOUT_MS) : void 0
38
- });
39
- if (res.ok) {
40
- const data = await res.json().catch(() => null);
41
- const token = data?.token;
42
- const expiresIn = typeof data?.expiresIn === "number" ? data.expiresIn : 3600;
43
- if (typeof token === "string" && token.startsWith(SITE_TOKEN_PREFIX)) {
44
- cache.set(rawKey, {
45
- credential: token,
46
- expiresAt: now + Math.min(expiresIn * 1e3 / 2, 30 * 6e4)
47
- });
48
- return token;
49
- }
50
- } else if (res.status !== 404) {
51
- console.warn(
52
- `[SiteKitLayout] Token mint returned ${res.status}; injecting raw key for this render.`
53
- );
54
- }
55
- } catch {
56
- console.warn("[SiteKitLayout] Token mint unavailable; injecting raw key for this render.");
57
- }
58
- cache.set(rawKey, { credential: rawKey, expiresAt: now + 6e4 });
59
- return rawKey;
60
- }
61
20
  async function SiteKitLayout({
62
21
  children,
63
22
  apiKey,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/mint-site-token.ts","../../src/layout/SiteKitLayout.tsx"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/server — Client-token minting (server-only)\n *\n * SiteKitLayout holds the raw `SONOR_API_KEY` server-side but must NOT ship it to\n * the browser. This mints a short-lived, project-scoped token (server-to-server,\n * authenticated with the raw key, no browser Origin so it passes domain-binding)\n * and returns THAT for the layout to inject instead.\n *\n * `import 'server-only'` makes importing this into a client bundle a hard build\n * error — the raw key stays on the server.\n *\n * Resilience: if minting is unavailable (older API without the endpoint, token\n * auth not configured, transient outage) it returns the RAW KEY, so a build never\n * breaks. Domain-binding is log-only by default, so the raw key still works —\n * worst case is exactly pre-3.2 behavior. Memoized per raw key for the process,\n * so an entire `next build` mints ~once and every static page reuses one seed\n * (the client refreshes on the far side as needed).\n */\nimport 'server-only'\nimport { SITE_KIT_VERSION } from '../shared/version'\n\nconst MINT_PATH = '/api/public/site-token'\nconst MINT_TIMEOUT_MS = 4_000\nconst SITE_TOKEN_PREFIX = 'st1.'\n\ninterface CacheEntry {\n credential: string\n expiresAt: number\n}\nconst cache = new Map<string, CacheEntry>()\n\nexport async function resolveClientCredential(\n rawKey: string,\n apiUrl: string,\n): Promise<string> {\n if (!rawKey) return ''\n // Env should hold a raw key; if it already looks like a token, pass it through.\n if (rawKey.startsWith(SITE_TOKEN_PREFIX)) return rawKey\n\n const now = Date.now()\n const cached = cache.get(rawKey)\n if (cached && cached.expiresAt > now) return cached.credential\n\n const base = (apiUrl || 'https://api.sonor.io').replace(/\\/+$/, '')\n try {\n const res = await fetch(`${base}${MINT_PATH}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': rawKey,\n 'x-sitekit-version': SITE_KIT_VERSION,\n },\n cache: 'no-store',\n signal:\n typeof AbortSignal !== 'undefined' && AbortSignal.timeout\n ? AbortSignal.timeout(MINT_TIMEOUT_MS)\n : undefined,\n })\n\n if (res.ok) {\n const data: any = await res.json().catch(() => null)\n const token = data?.token\n const expiresIn = typeof data?.expiresIn === 'number' ? data.expiresIn : 3600\n if (typeof token === 'string' && token.startsWith(SITE_TOKEN_PREFIX)) {\n cache.set(rawKey, {\n credential: token,\n expiresAt: now + Math.min((expiresIn * 1000) / 2, 30 * 60_000),\n })\n return token\n }\n } else if (res.status !== 404) {\n // 404 = older API without the endpoint (expected during rollout). Anything\n // else is worth a server-side note. Never logs the key value.\n console.warn(\n `[SiteKitLayout] Token mint returned ${res.status}; injecting raw key for this render.`,\n )\n }\n } catch {\n console.warn('[SiteKitLayout] Token mint unavailable; injecting raw key for this render.')\n }\n\n // Fallback: the raw key (pre-3.2 behavior). Short cache so a transient outage\n // retries soon rather than pinning the raw key for the whole build.\n cache.set(rawKey, { credential: rawKey, expiresAt: now + 60_000 })\n return rawKey\n}\n","/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { resolveApiOrigin } from '../server/server-fetch'\nimport { resolveClientCredential } from '../server/mint-site-token'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /** SitemapSync client component. Default: true */\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports this site's kit version + active modules to Sonor\n * once per session so the platform can track version drift. Default: true.\n * Deferred like Analytics; never in the hydration path.\n */\n fleet?: boolean\n /**\n * Defer client modules (Analytics, Engage, SitemapSync) until window load +\n * idle or the first user interaction, keeping their JS and mount work out of\n * the critical hydration path. Default: true. Pass false to restore legacy\n * eager mounting. SignalBridge is never deferred.\n */\n defer?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n /**\n * When true, append a screen-reader-only link to `/llms.txt` after main content.\n * Default false — prefer `buildAiDiscoveryHeaders()` for discovery.\n */\n showLlmsTxtFooterLink?: boolean\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n fleet = true,\n defer = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n showLlmsTxtFooterLink = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY.',\n )\n }\n\n const apiOrigin = resolveApiOrigin(resolvedApiUrl)\n\n // Mint a short-lived client token so the raw key never reaches the browser.\n // Falls back to the raw key if minting is unavailable (older API / transient\n // outage) — the build never breaks. The client refreshes the token as needed.\n const clientCredential = await resolveClientCredential(resolvedApiKey, resolvedApiUrl)\n\n return (\n <>\n <link rel=\"preconnect\" href={apiOrigin} crossOrigin=\"anonymous\" />\n <link rel=\"dns-prefetch\" href={apiOrigin} />\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n\n {/* Client-side providers island — receives the minted token (or raw-key\n fallback), never the raw key when minting succeeds. */}\n <SiteKitClientProviders\n apiKey={clientCredential}\n apiUrl={resolvedApiUrl}\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n fleet={fleet}\n defer={defer}\n debug={debug}\n >\n {children}\n {showLlmsTxtFooterLink ? (\n <footer className=\"sr-only\" aria-hidden=\"true\">\n <a href=\"/llms.txt\">llms.txt</a>\n </footer>\n ) : null}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/layout/SiteKitLayout.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAkGA,eAAsB,aAAA,CAAc;AAAA,EAClC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,MAAA,GAAS,IAAA;AAAA,EACT,MAAA,GAAS,KAAA;AAAA,EACT,WAAA,GAAc,IAAA;AAAA,EACd,KAAA,GAAQ,IAAA;AAAA,EACR,KAAA,GAAQ,IAAA;AAAA,EACR,OAAA,GAAU,IAAA;AAAA,EACV,cAAA,GAAiB,IAAA;AAAA,EACjB,KAAA,GAAQ,KAAA;AAAA,EACR,qBAAA,GAAwB;AAC1B,CAAA,EAAuB;AAErB,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,EAAA;AACF,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,sBAAA;AAEF,EAAA,IAAI,CAAC,kBAAkB,KAAA,EAAO;AAC5B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,iBAAiB,cAAc,CAAA;AAKjD,EAAA,MAAM,gBAAA,GAAmB,MAAM,uBAAA,CAAwB,cAAA,EAAgB,cAAc,CAAA;AAErF,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAK,GAAA,EAAI,YAAA,EAAa,IAAA,EAAM,SAAA,EAAW,aAAY,WAAA,EAAY,CAAA;AAAA,oBAChE,GAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAI,cAAA,EAAe,MAAM,SAAA,EAAW,CAAA;AAAA,IAEzC,2BAAW,GAAA,CAAC,cAAA,EAAA,EAAe,MAAA,EAAQ,cAAA,EAAgB,QAAQ,cAAA,EAAgB,CAAA;AAAA,IAC3E,cAAA,oBAAkB,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAS,MAAA,EAAO,CAAA;AAAA,oBAInD,IAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,gBAAA;AAAA,QACR,MAAA,EAAQ,cAAA;AAAA,QACR,SAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UACA,qBAAA,mBACC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU,aAAA,EAAY,MAAA,EACtC,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,WAAA,EAAY,QAAA,EAAA,UAAA,EAAQ,GAC9B,CAAA,GACE;AAAA;AAAA;AAAA,KACN;AAAA,IAGC,cAAA,oBAAkB,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAS,UAAA,EAAW;AAAA,GAAA,EACzD,CAAA;AAEJ","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { resolveApiOrigin } from '../server/server-fetch'\nimport { resolveClientCredential } from '../server/mint-site-token'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /** SitemapSync client component. Default: true */\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports this site's kit version + active modules to Sonor\n * once per session so the platform can track version drift. Default: true.\n * Deferred like Analytics; never in the hydration path.\n */\n fleet?: boolean\n /**\n * Defer client modules (Analytics, Engage, SitemapSync) until window load +\n * idle or the first user interaction, keeping their JS and mount work out of\n * the critical hydration path. Default: true. Pass false to restore legacy\n * eager mounting. SignalBridge is never deferred.\n */\n defer?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n /**\n * When true, append a screen-reader-only link to `/llms.txt` after main content.\n * Default false — prefer `buildAiDiscoveryHeaders()` for discovery.\n */\n showLlmsTxtFooterLink?: boolean\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n fleet = true,\n defer = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n showLlmsTxtFooterLink = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY.',\n )\n }\n\n const apiOrigin = resolveApiOrigin(resolvedApiUrl)\n\n // Mint a short-lived client token so the raw key never reaches the browser.\n // Falls back to the raw key if minting is unavailable (older API / transient\n // outage) — the build never breaks. The client refreshes the token as needed.\n const clientCredential = await resolveClientCredential(resolvedApiKey, resolvedApiUrl)\n\n return (\n <>\n <link rel=\"preconnect\" href={apiOrigin} crossOrigin=\"anonymous\" />\n <link rel=\"dns-prefetch\" href={apiOrigin} />\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n\n {/* Client-side providers island — receives the minted token (or raw-key\n fallback), never the raw key when minting succeeds. */}\n <SiteKitClientProviders\n apiKey={clientCredential}\n apiUrl={resolvedApiUrl}\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n fleet={fleet}\n defer={defer}\n debug={debug}\n >\n {children}\n {showLlmsTxtFooterLink ? (\n <footer className=\"sr-only\" aria-hidden=\"true\">\n <a href=\"/llms.txt\">llms.txt</a>\n </footer>\n ) : null}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunk5B4FABFK_js = require('../chunk-5B4FABFK.js');
4
- var chunk7TX5BKVA_js = require('../chunk-7TX5BKVA.js');
4
+ var chunk6T4NVCAT_js = require('../chunk-6T4NVCAT.js');
5
5
  var chunkATG4FJY6_js = require('../chunk-ATG4FJY6.js');
6
6
  var chunkJ7QI3GDX_js = require('../chunk-J7QI3GDX.js');
7
7
  require('../chunk-ZSMWDLMK.js');
@@ -37,7 +37,7 @@ function createLLMsTxtHandler(options = {}) {
37
37
  });
38
38
  }
39
39
  }
40
- const { markdown, metadata } = await chunk7TX5BKVA_js.generateLLMsTxt(generateOptions);
40
+ const { markdown, metadata } = await chunk6T4NVCAT_js.generateLLMsTxt(generateOptions);
41
41
  return new Response(markdown, {
42
42
  status: 200,
43
43
  headers: llmsResponseHeaders(markdown, {
@@ -71,7 +71,7 @@ function createLLMsFullTxtHandler(options = {}) {
71
71
  });
72
72
  }
73
73
  }
74
- const { markdown, metadata } = await chunk7TX5BKVA_js.generateLLMsFullTxt(generateOptions);
74
+ const { markdown, metadata } = await chunk6T4NVCAT_js.generateLLMsFullTxt(generateOptions);
75
75
  return new Response(markdown, {
76
76
  status: 200,
77
77
  headers: llmsResponseHeaders(markdown, {
@@ -586,39 +586,39 @@ Object.defineProperty(exports, "buildAiDiscoveryHeaders", {
586
586
  });
587
587
  Object.defineProperty(exports, "generateLLMsFullTxt", {
588
588
  enumerable: true,
589
- get: function () { return chunk7TX5BKVA_js.generateLLMsFullTxt; }
589
+ get: function () { return chunk6T4NVCAT_js.generateLLMsFullTxt; }
590
590
  });
591
591
  Object.defineProperty(exports, "generateLLMsTxt", {
592
592
  enumerable: true,
593
- get: function () { return chunk7TX5BKVA_js.generateLLMsTxt; }
593
+ get: function () { return chunk6T4NVCAT_js.generateLLMsTxt; }
594
594
  });
595
595
  Object.defineProperty(exports, "getBusinessInfo", {
596
596
  enumerable: true,
597
- get: function () { return chunk7TX5BKVA_js.getBusinessInfo; }
597
+ get: function () { return chunk6T4NVCAT_js.getBusinessInfo; }
598
598
  });
599
599
  Object.defineProperty(exports, "getFAQItems", {
600
600
  enumerable: true,
601
- get: function () { return chunk7TX5BKVA_js.getFAQItems; }
601
+ get: function () { return chunk6T4NVCAT_js.getFAQItems; }
602
602
  });
603
603
  Object.defineProperty(exports, "getLLMsData", {
604
604
  enumerable: true,
605
- get: function () { return chunk7TX5BKVA_js.getLLMsData; }
605
+ get: function () { return chunk6T4NVCAT_js.getLLMsData; }
606
606
  });
607
607
  Object.defineProperty(exports, "getOptimizedLLMsTxt", {
608
608
  enumerable: true,
609
- get: function () { return chunk7TX5BKVA_js.getOptimizedLLMsTxt; }
609
+ get: function () { return chunk6T4NVCAT_js.getOptimizedLLMsTxt; }
610
610
  });
611
611
  Object.defineProperty(exports, "getPageSummaries", {
612
612
  enumerable: true,
613
- get: function () { return chunk7TX5BKVA_js.getPageSummaries; }
613
+ get: function () { return chunk6T4NVCAT_js.getPageSummaries; }
614
614
  });
615
615
  Object.defineProperty(exports, "getServices", {
616
616
  enumerable: true,
617
- get: function () { return chunk7TX5BKVA_js.getServices; }
617
+ get: function () { return chunk6T4NVCAT_js.getServices; }
618
618
  });
619
619
  Object.defineProperty(exports, "writeLLMsTxtToPublic", {
620
620
  enumerable: true,
621
- get: function () { return chunk7TX5BKVA_js.writeLLMsTxtToPublic; }
621
+ get: function () { return chunk6T4NVCAT_js.writeLLMsTxtToPublic; }
622
622
  });
623
623
  Object.defineProperty(exports, "LLMS_DISCLAIMER_MAX_LENGTH", {
624
624
  enumerable: true,
@@ -1,6 +1,6 @@
1
1
  export { buildAiDiscoveryHeaders } from '../chunk-H4OBGC43.mjs';
2
- import { generateLLMsTxt, generateLLMsFullTxt } from '../chunk-WN5A3KSY.mjs';
3
- export { generateLLMsFullTxt, generateLLMsTxt, getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices, writeLLMsTxtToPublic } from '../chunk-WN5A3KSY.mjs';
2
+ import { generateLLMsTxt, generateLLMsFullTxt } from '../chunk-34IUDOBC.mjs';
3
+ export { generateLLMsFullTxt, generateLLMsTxt, getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices, writeLLMsTxtToPublic } from '../chunk-34IUDOBC.mjs';
4
4
  export { LLMS_DISCLAIMER_MAX_LENGTH, LLMS_PUBLIC_SUMMARY_MAX_LENGTH, LLM_GEO_CONTRACT_VERSION, MANAGED_LLM_SCHEMA_KNOWN_KEYS, pickManagedLlmSchemaForJsonLd, sanitizeLlmsDisclaimerLine, sanitizeLlmsPublicSummary, sanitizePrimaryLanguageTag } from '../chunk-H23ZT2I2.mjs';
5
5
  import { safeJsonLd } from '../chunk-662YHKWW.mjs';
6
6
  import '../chunk-4XPGGLVP.mjs';
@@ -1,8 +1,9 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkKPKZBIAQ_js = require('../chunk-KPKZBIAQ.js');
5
- require('../chunk-3X2YPJU5.js');
4
+ var chunkXY4NJJEX_js = require('../chunk-XY4NJJEX.js');
5
+ require('../chunk-UXEB6UAR.js');
6
+ require('../chunk-NME3SQCB.js');
6
7
  require('../chunk-ZSMWDLMK.js');
7
8
  var react = require('react');
8
9
  var reactGoogleMaps = require('@vis.gl/react-google-maps');
@@ -139,7 +140,7 @@ async function fetchMapsConfig() {
139
140
  const { apiUrl, apiKey } = getApiConfig();
140
141
  if (apiKey) {
141
142
  try {
142
- const res = await chunkKPKZBIAQ_js.sonorFetch(
143
+ const res = await chunkXY4NJJEX_js.sonorFetch(
143
144
  `${apiUrl}/api/public/maps/config`,
144
145
  { headers: { "Content-Type": "application/json" } },
145
146
  { apiKey }
@@ -179,7 +180,7 @@ async function fetchNearbyPlaces(params) {
179
180
  });
180
181
  if (params.radius) searchParams.set("radius", String(params.radius));
181
182
  if (params.limit) searchParams.set("limit", String(params.limit));
182
- const res = await chunkKPKZBIAQ_js.sonorFetch(
183
+ const res = await chunkXY4NJJEX_js.sonorFetch(
183
184
  `${apiUrl}/api/public/maps/nearby-places?${searchParams}`,
184
185
  { headers: { "Content-Type": "application/json" } },
185
186
  { apiKey }